diff options
author | Robert Nagy <ronag89@gmail.com> | 2012-05-12 21:40:41 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-05-14 23:36:10 +0400 |
commit | 7dd56d411e1e5afbf0c0d42b40256a59e1d2f217 (patch) | |
tree | 2484b252d3b7313d0d76e2a6a462e28435765e37 /libavfilter/vf_yadif.c | |
parent | 7c6d2406655ae44dd97e95253a2f2d5b27a1c449 (diff) |
yadif: Improve pts accuracy.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavfilter/vf_yadif.c')
-rw-r--r-- | libavfilter/vf_yadif.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c index 790dda5a0b..fac0e5b5f3 100644 --- a/libavfilter/vf_yadif.c +++ b/libavfilter/vf_yadif.c @@ -218,11 +218,11 @@ static void return_frame(AVFilterContext *ctx, int is_second) filter(ctx, yadif->out, tff ^ !is_second, tff); if (is_second) { - if (yadif->next->pts != AV_NOPTS_VALUE && - yadif->cur->pts != AV_NOPTS_VALUE) { - yadif->out->pts = - (yadif->next->pts&yadif->cur->pts) + - ((yadif->next->pts^yadif->cur->pts)>>1); + int64_t cur_pts = yadif->cur->pts; + int64_t next_pts = yadif->next->pts; + + if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) { + yadif->out->pts = cur_pts + next_pts; } else { yadif->out->pts = AV_NOPTS_VALUE; } @@ -255,6 +255,8 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) yadif->out = avfilter_ref_buffer(yadif->cur, AV_PERM_READ); avfilter_unref_buffer(yadif->prev); yadif->prev = NULL; + if (yadif->out->pts != AV_NOPTS_VALUE) + yadif->out->pts *= 2; avfilter_start_frame(ctx->outputs[0], yadif->out); return; } @@ -267,6 +269,8 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) avfilter_copy_buffer_ref_props(yadif->out, yadif->cur); yadif->out->video->interlaced = 0; + if (yadif->out->pts != AV_NOPTS_VALUE) + yadif->out->pts *= 2; avfilter_start_frame(ctx->outputs[0], yadif->out); } @@ -400,6 +404,16 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { } +static int config_props(AVFilterLink *link) +{ + link->time_base.num = link->src->inputs[0]->time_base.num; + link->time_base.den = link->src->inputs[0]->time_base.den * 2; + link->w = link->src->inputs[0]->w; + link->h = link->src->inputs[0]->h; + + return 0; +} + AVFilter avfilter_vf_yadif = { .name = "yadif", .description = NULL_IF_CONFIG_SMALL("Deinterlace the input image"), @@ -420,6 +434,7 @@ AVFilter avfilter_vf_yadif = { .outputs = (AVFilterPad[]) {{ .name = "default", .type = AVMEDIA_TYPE_VIDEO, .poll_frame = poll_frame, - .request_frame = request_frame, }, + .request_frame = request_frame, + .config_props = config_props, }, { .name = NULL}}, }; |