| @@ -43,6 +43,7 @@ easier to use. The changes are: | |||||
| - XMV demuxer | - XMV demuxer | ||||
| - Windows Media Image decoder | - Windows Media Image decoder | ||||
| - LATM muxer | - LATM muxer | ||||
| - showinfo filter | |||||
| version 0.7: | version 0.7: | ||||
| @@ -1210,6 +1210,65 @@ settb=2*intb | |||||
| settb=AVTB | settb=AVTB | ||||
| @end example | @end example | ||||
| @section showinfo | |||||
| Show a line containing various information for each input video frame. | |||||
| The input video is not modified. | |||||
| The shown line contains a sequence of key/value pairs of the form | |||||
| @var{key}:@var{value}. | |||||
| A description of each shown parameter follows: | |||||
| @table @option | |||||
| @item n | |||||
| sequential number of the input frame, starting from 0 | |||||
| @item pts | |||||
| Presentation TimeStamp of the input frame, expressed as a number of | |||||
| time base units. The time base unit depends on the filter input pad. | |||||
| @item pts_time | |||||
| Presentation TimeStamp of the input frame, expressed as a number of | |||||
| seconds | |||||
| @item pos | |||||
| position of the frame in the input stream, -1 if this information in | |||||
| unavailable and/or meanigless (for example in case of synthetic video) | |||||
| @item fmt | |||||
| pixel format name | |||||
| @item sar | |||||
| sample aspect ratio of the input frame, expressed in the form | |||||
| @var{num}/@var{den} | |||||
| @item s | |||||
| size of the input frame, expressed in the form | |||||
| @var{width}x@var{height} | |||||
| @item i | |||||
| interlaced mode ("P" for "progressive", "T" for top field first, "B" | |||||
| for bottom field first) | |||||
| @item iskey | |||||
| 1 if the frame is a key frame, 0 otherwise | |||||
| @item type | |||||
| picture type of the input frame ("I" for an I-frame, "P" for a | |||||
| P-frame, "B" for a B-frame, "?" for unknown type). | |||||
| Check also the documentation of the @code{AVPictureType} enum and of | |||||
| the @code{av_get_picture_type_char} function defined in | |||||
| @file{libavutil/avutil.h}. | |||||
| @item checksum | |||||
| Adler-32 checksum of all the planes of the input frame | |||||
| @item plane_checksum | |||||
| Adler-32 checksum of each plane of the input frame, expressed in the form | |||||
| "[@var{c0} @var{c1} @var{c2} @var{c3}]" | |||||
| @end table | |||||
| @section slicify | @section slicify | ||||
| Pass the images of input video on to next video filter as multiple | Pass the images of input video on to next video filter as multiple | ||||
| @@ -44,6 +44,7 @@ OBJS-$(CONFIG_SETDAR_FILTER) += vf_aspect.o | |||||
| OBJS-$(CONFIG_SETPTS_FILTER) += vf_setpts.o | OBJS-$(CONFIG_SETPTS_FILTER) += vf_setpts.o | ||||
| OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o | OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o | ||||
| OBJS-$(CONFIG_SETTB_FILTER) += vf_settb.o | OBJS-$(CONFIG_SETTB_FILTER) += vf_settb.o | ||||
| OBJS-$(CONFIG_SHOWINFO_FILTER) += vf_showinfo.o | |||||
| OBJS-$(CONFIG_SLICIFY_FILTER) += vf_slicify.o | OBJS-$(CONFIG_SLICIFY_FILTER) += vf_slicify.o | ||||
| OBJS-$(CONFIG_TRANSPOSE_FILTER) += vf_transpose.o | OBJS-$(CONFIG_TRANSPOSE_FILTER) += vf_transpose.o | ||||
| OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o | OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o | ||||
| @@ -65,6 +65,7 @@ void avfilter_register_all(void) | |||||
| REGISTER_FILTER (SETPTS, setpts, vf); | REGISTER_FILTER (SETPTS, setpts, vf); | ||||
| REGISTER_FILTER (SETSAR, setsar, vf); | REGISTER_FILTER (SETSAR, setsar, vf); | ||||
| REGISTER_FILTER (SETTB, settb, vf); | REGISTER_FILTER (SETTB, settb, vf); | ||||
| REGISTER_FILTER (SHOWINFO, showinfo, vf); | |||||
| REGISTER_FILTER (SLICIFY, slicify, vf); | REGISTER_FILTER (SLICIFY, slicify, vf); | ||||
| REGISTER_FILTER (TRANSPOSE, transpose, vf); | REGISTER_FILTER (TRANSPOSE, transpose, vf); | ||||
| REGISTER_FILTER (UNSHARP, unsharp, vf); | REGISTER_FILTER (UNSHARP, unsharp, vf); | ||||
| @@ -29,7 +29,7 @@ | |||||
| #include "libavutil/rational.h" | #include "libavutil/rational.h" | ||||
| #define LIBAVFILTER_VERSION_MAJOR 2 | #define LIBAVFILTER_VERSION_MAJOR 2 | ||||
| #define LIBAVFILTER_VERSION_MINOR 4 | |||||
| #define LIBAVFILTER_VERSION_MINOR 5 | |||||
| #define LIBAVFILTER_VERSION_MICRO 0 | #define LIBAVFILTER_VERSION_MICRO 0 | ||||
| #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ | ||||
| @@ -0,0 +1,98 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Stefano Sabatini | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * Libav is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| /** | |||||
| * @file | |||||
| * filter for showing textual video frame information | |||||
| */ | |||||
| #include "libavutil/adler32.h" | |||||
| #include "libavutil/imgutils.h" | |||||
| #include "libavutil/pixdesc.h" | |||||
| #include "avfilter.h" | |||||
| typedef struct { | |||||
| unsigned int frame; | |||||
| } ShowInfoContext; | |||||
| static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) | |||||
| { | |||||
| ShowInfoContext *showinfo = ctx->priv; | |||||
| showinfo->frame = 0; | |||||
| return 0; | |||||
| } | |||||
| static void end_frame(AVFilterLink *inlink) | |||||
| { | |||||
| AVFilterContext *ctx = inlink->dst; | |||||
| ShowInfoContext *showinfo = ctx->priv; | |||||
| AVFilterBufferRef *picref = inlink->cur_buf; | |||||
| uint32_t plane_checksum[4] = {0}, checksum = 0; | |||||
| int i, plane, vsub = av_pix_fmt_descriptors[inlink->format].log2_chroma_h; | |||||
| for (plane = 0; picref->data[plane] && plane < 4; plane++) { | |||||
| size_t linesize = av_image_get_linesize(picref->format, picref->video->w, plane); | |||||
| uint8_t *data = picref->data[plane]; | |||||
| int h = plane == 1 || plane == 2 ? inlink->h >> vsub : inlink->h; | |||||
| for (i = 0; i < h; i++) { | |||||
| plane_checksum[plane] = av_adler32_update(plane_checksum[plane], data, linesize); | |||||
| checksum = av_adler32_update(checksum, data, linesize); | |||||
| data += picref->linesize[plane]; | |||||
| } | |||||
| } | |||||
| av_log(ctx, AV_LOG_INFO, | |||||
| "n:%d pts:%"PRId64" pts_time:%f pos:%"PRId64" " | |||||
| "fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c " | |||||
| "checksum:%u plane_checksum:[%u %u %u %u]\n", | |||||
| showinfo->frame, | |||||
| picref->pts, picref->pts * av_q2d(inlink->time_base), picref->pos, | |||||
| av_pix_fmt_descriptors[picref->format].name, | |||||
| picref->video->pixel_aspect.num, picref->video->pixel_aspect.den, | |||||
| picref->video->w, picref->video->h, | |||||
| !picref->video->interlaced ? 'P' : /* Progressive */ | |||||
| picref->video->top_field_first ? 'T' : 'B', /* Top / Bottom */ | |||||
| picref->video->key_frame, | |||||
| av_get_picture_type_char(picref->video->pict_type), | |||||
| checksum, plane_checksum[0], plane_checksum[1], plane_checksum[2], plane_checksum[3]); | |||||
| showinfo->frame++; | |||||
| avfilter_end_frame(inlink->dst->outputs[0]); | |||||
| } | |||||
| AVFilter avfilter_vf_showinfo = { | |||||
| .name = "showinfo", | |||||
| .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."), | |||||
| .priv_size = sizeof(ShowInfoContext), | |||||
| .init = init, | |||||
| .inputs = (AVFilterPad[]) {{ .name = "default", | |||||
| .type = AVMEDIA_TYPE_VIDEO, | |||||
| .get_video_buffer = avfilter_null_get_video_buffer, | |||||
| .start_frame = avfilter_null_start_frame, | |||||
| .end_frame = end_frame, | |||||
| .min_perms = AV_PERM_READ, }, | |||||
| { .name = NULL}}, | |||||
| .outputs = (AVFilterPad[]) {{ .name = "default", | |||||
| .type = AVMEDIA_TYPE_VIDEO }, | |||||
| { .name = NULL}}, | |||||
| }; | |||||