[FFmpeg-devel] Flushing yadif
Robert Nagy
ronag89 at gmail.com
Wed May 2 13:13:29 CEST 2012
Updated:
>From 853df5acd3a1f563853b8a9c877373df48dec866 Mon Sep 17 00:00:00 2001
>From: Robert Nagy <ronag89 at gmail.com>
>Date: Wed, 2 May 2012 10:03:22 +0200
>Subject: [PATCH] yadif: Add flushing of last frame.
>
>---
> libavfilter/vf_yadif.c | 24 ++++++++++++++++++------
> 1 files changed, 18 insertions(+), 6 deletions(-)
>
>diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
>index d8e2ad6..2c2bc60 100644
>--- a/libavfilter/vf_yadif.c
>+++ b/libavfilter/vf_yadif.c
>@@ -155,7 +155,7 @@ static void filter(AVFilterContext *ctx,
AVFilterBufferRef *dstpic,
> if ((y ^ parity) & 1) {
> uint8_t *prev = &yadif->prev->data[i][y*refs];
> uint8_t *cur = &yadif->cur ->data[i][y*refs];
>- uint8_t *next = &yadif->next->data[i][y*refs];
>+ uint8_t *next = yadif->next ?
&yadif->next->data[i][y*refs] : cur; // Should optimally only use last
field of "cur".
> uint8_t *dst = &dstpic->data[i][y*dstpic->linesize[i]];
> int mode = y==1 || y+2==h ? 2 : yadif->mode;
> yadif->filter_line(dst, prev, cur, next, w, y+1<h ? refs
: -refs, y ? -refs : refs, parity ^ tff, mode);
>@@ -216,9 +216,9 @@ 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 &&
>+ if ((!yadif->next || yadif->next->pts != AV_NOPTS_VALUE) &&
> yadif->cur->pts != AV_NOPTS_VALUE) {
>- uint64_t next_pts = yadif->next->pts;
>+ uint64_t next_pts = yadif->next ? yadif->next->pts :
yadif->cur->pts * 2 - yadif->prev->pts ;
> uint64_t cur_pts = yadif->cur->pts;
> uint64_t prev_pts = yadif->prev->pts;
>
>@@ -307,10 +307,22 @@ static int request_frame(AVFilterLink *link)
> }
>
> do {
>- int ret;
>-
>- if ((ret = avfilter_request_frame(link->src->inputs[0])))
>+ if(!yadif->next && yadif->cur) { // If there is no next then it
is EOF.
>+ // Allow the filter to restart.
>+ avfilter_unref_bufferp(yadif->prev);
>+ avfilter_unref_bufferp(yadif->cur );
>+ return AVERRROR_EOF;
>+ }
>+
>+ int ret = avfilter_request_frame(link->src->inputs[0]);
>+
>+ if(ret == AVERRROR_EOF) {
>+ start_frame(link->src->inputs[0], NULL);
>+ end_frame(link->src->inputs[0]);
>+ }
>+ else if(ret < 0) {
> return ret;
>+ }
> } while (!yadif->cur);
>
> return 0;
>--
>1.7.6.msysgit.0
More information about the ffmpeg-devel
mailing list