aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-05-07 10:02:59 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-05-07 10:02:59 +0000
commitefdc74ef198e9e73e63818f20417e4582b9b6a18 (patch)
treea2ed3b8a3eb9912c555da9a04f424768a4fcd74b
parent46847a336e7e71559c8f3917bf8512c90635598b (diff)
downloadffmpeg-efdc74ef198e9e73e63818f20417e4582b9b6a18.tar.gz
Try to keep track of interlaced and top field first.
Originally committed as revision 23044 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavfilter/avfilter.c2
-rw-r--r--libavfilter/avfilter.h3
-rw-r--r--libavfilter/defaults.c2
-rw-r--r--libavfilter/vf_scale.c3
-rw-r--r--libavfilter/vsrc_buffer.c4
5 files changed, 14 insertions, 0 deletions
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);