From efdc74ef198e9e73e63818f20417e4582b9b6a18 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 7 May 2010 10:02:59 +0000 Subject: [PATCH] Try to keep track of interlaced and top field first. Originally committed as revision 23044 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavfilter/avfilter.c | 2 ++ libavfilter/avfilter.h | 3 +++ libavfilter/defaults.c | 2 ++ libavfilter/vf_scale.c | 3 +++ libavfilter/vsrc_buffer.c | 4 ++++ 5 files changed, 14 insertions(+) diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 3ed59d7cc2..38ca3b1e91 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -266,6 +266,8 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref) link->cur_pic->pts = link->srcpic->pts; link->cur_pic->pos = link->srcpic->pos; link->cur_pic->pixel_aspect = link->srcpic->pixel_aspect; + link->cur_pic->interlaced = link->srcpic->interlaced; + link->cur_pic->top_field_first = link->srcpic->top_field_first; } else link->cur_pic = picref; diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index 214b8d481a..3566ed61c3 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -115,6 +115,9 @@ typedef struct AVFilterPicRef #define AV_PERM_PRESERVE 0x04 ///< nobody else can overwrite the buffer #define AV_PERM_REUSE 0x08 ///< can output the buffer multiple times, with the same contents each time #define AV_PERM_REUSE2 0x10 ///< can output the buffer multiple times, modified each time + + int interlaced; ///< is frame interlaced + int top_field_first; } AVFilterPicRef; /** diff --git a/libavfilter/defaults.c b/libavfilter/defaults.c index afa0f669b9..f348d4f2b8 100644 --- a/libavfilter/defaults.c +++ b/libavfilter/defaults.c @@ -76,6 +76,8 @@ void avfilter_default_start_frame(AVFilterLink *link, AVFilterPicRef *picref) out->outpic->pts = picref->pts; out->outpic->pos = picref->pos; out->outpic->pixel_aspect = picref->pixel_aspect; + out->outpic->interlaced = picref->interlaced; + out->outpic->top_field_first = picref->top_field_first; avfilter_start_frame(out, avfilter_ref_pic(out->outpic, ~0)); } } diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 7a0994fe97..e65057cfd7 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -150,6 +150,9 @@ static void start_frame(AVFilterLink *link, AVFilterPicRef *picref) outpicref = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); outpicref->pts = picref->pts; outpicref->pos = picref->pos; + outpicref->interlaced = picref->interlaced; + outpicref->top_field_first = picref->top_field_first; + outlink->outpic = outpicref; av_reduce(&outpicref->pixel_aspect.num, &outpicref->pixel_aspect.den, diff --git a/libavfilter/vsrc_buffer.c b/libavfilter/vsrc_buffer.c index 74da712fc4..17e56eeb79 100644 --- a/libavfilter/vsrc_buffer.c +++ b/libavfilter/vsrc_buffer.c @@ -46,6 +46,8 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, memcpy(c->frame.data , frame->data , sizeof(frame->data)); memcpy(c->frame.linesize, frame->linesize, sizeof(frame->linesize)); + c->frame.interlaced_frame= frame->interlaced_frame; + c->frame.top_field_first = frame->top_field_first; c->pts = pts; c->pixel_aspect = pixel_aspect; c->has_frame = 1; @@ -106,6 +108,8 @@ static int request_frame(AVFilterLink *link) picref->pts = c->pts; picref->pixel_aspect = c->pixel_aspect; + picref->interlaced = c->frame.interlaced_frame; + picref->top_field_first = c->frame.top_field_first; avfilter_start_frame(link, avfilter_ref_pic(picref, ~0)); avfilter_draw_slice(link, 0, link->h, 1); avfilter_end_frame(link);