[FFmpeg-cvslog] yadif: Flush filter on eof.

Robert Nagy git at videolan.org
Wed May 16 02:30:34 CEST 2012


ffmpeg | branch: master | Robert Nagy <ronag89 at gmail.com> | Mon May 14 14:25:25 2012 +0200| [394a0267abd6a292932f858949449b5cd6f8efda] | committer: Anton Khirnov

yadif: Flush filter on eof.

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=394a0267abd6a292932f858949449b5cd6f8efda
---

 libavfilter/vf_yadif.c |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
index fac0e5b..1cecdd9 100644
--- a/libavfilter/vf_yadif.c
+++ b/libavfilter/vf_yadif.c
@@ -61,6 +61,7 @@ typedef struct {
                         int w, int prefs, int mrefs, int parity, int mode);
 
     const AVPixFmtDescriptor *csp;
+    int eof;
 } YADIFContext;
 
 #define CHECK(j)\
@@ -304,8 +305,21 @@ static int request_frame(AVFilterLink *link)
     do {
         int ret;
 
-        if ((ret = avfilter_request_frame(link->src->inputs[0])))
+        if (yadif->eof)
+            return AVERROR_EOF;
+
+        ret  = avfilter_request_frame(link->src->inputs[0]);
+
+        if (ret == AVERROR_EOF && yadif->next) {
+            AVFilterBufferRef *next = avfilter_ref_buffer(yadif->next, AV_PERM_READ);
+            next->pts = yadif->next->pts * 2 - yadif->cur->pts;
+
+            start_frame(link->src->inputs[0], next);
+            end_frame(link->src->inputs[0]);
+            yadif->eof = 1;
+        } else if (ret < 0) {
             return ret;
+        }
     } while (!yadif->cur);
 
     return 0;



More information about the ffmpeg-cvslog mailing list