[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