X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvf_showinfo.c;h=04b436d4b0561a333a551ca46c60294471268df5;hb=77cc958f60f73963be4281d6e82ef81707e40c26;hp=dbb67e91a2f62a904ae70290882f6ddda29f3a0f;hpb=9d0bfc5052fa73ac8df89ec9992d77b07840fdf0;p=ffmpeg diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c index dbb67e91a2f..04b436d4b05 100644 --- a/libavfilter/vf_showinfo.c +++ b/libavfilter/vf_showinfo.c @@ -24,6 +24,7 @@ #include "libavutil/adler32.h" #include "libavutil/imgutils.h" +#include "libavutil/internal.h" #include "libavutil/pixdesc.h" #include "avfilter.h" #include "internal.h" @@ -33,68 +34,70 @@ 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) +static int filter_frame(AVFilterLink *inlink, AVFrame *frame) { AVFilterContext *ctx = inlink->dst; ShowInfoContext *showinfo = ctx->priv; - AVFilterBufferRef *picref = inlink->cur_buf; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); uint32_t plane_checksum[4] = {0}, checksum = 0; - int i, plane, vsub = av_pix_fmt_descriptors[inlink->format].log2_chroma_h; + int i, plane, vsub = desc->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]; + for (plane = 0; frame->data[plane] && plane < 4; plane++) { + size_t linesize = av_image_get_linesize(frame->format, frame->width, plane); + uint8_t *data = frame->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]; + data += frame->linesize[plane]; } } av_log(ctx, AV_LOG_INFO, - "n:%d pts:%"PRId64" pts_time:%f pos:%"PRId64" " + "n:%d pts:%"PRId64" pts_time:%f " "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), + frame->pts, frame->pts * av_q2d(inlink->time_base), + desc->name, + frame->sample_aspect_ratio.num, frame->sample_aspect_ratio.den, + frame->width, frame->height, + !frame->interlaced_frame ? 'P' : /* Progressive */ + frame->top_field_first ? 'T' : 'B', /* Top / Bottom */ + frame->key_frame, + av_get_picture_type_char(frame->pict_type), checksum, plane_checksum[0], plane_checksum[1], plane_checksum[2], plane_checksum[3]); showinfo->frame++; - ff_end_frame(inlink->dst->outputs[0]); + return ff_filter_frame(inlink->dst->outputs[0], frame); } +static const AVFilterPad avfilter_vf_showinfo_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .get_video_buffer = ff_null_get_video_buffer, + .filter_frame = filter_frame, + }, + { NULL } +}; + +static const AVFilterPad avfilter_vf_showinfo_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO + }, + { NULL } +}; + 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 = ff_null_get_video_buffer, - .start_frame = ff_null_start_frame, - .end_frame = end_frame, - .min_perms = AV_PERM_READ, }, - { .name = NULL}}, + .inputs = avfilter_vf_showinfo_inputs, - .outputs = (AVFilterPad[]) {{ .name = "default", - .type = AVMEDIA_TYPE_VIDEO }, - { .name = NULL}}, + .outputs = avfilter_vf_showinfo_outputs, };