[FFmpeg-devel] [PATCH] Fix detelecine filter for patterns like 3444 or 33333334.

Benjamin Steffes benjaminst123 at gmail.com
Mon Mar 14 13:44:24 CET 2016


Signed-off-by: Benjamin Steffes <benjaminst123 at gmail.com>
---
 libavfilter/vf_detelecine.c | 40 +++++++++++++++++++---------------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/libavfilter/vf_detelecine.c b/libavfilter/vf_detelecine.c
index 6fd9aad..f5ae350 100644
--- a/libavfilter/vf_detelecine.c
+++ b/libavfilter/vf_detelecine.c
@@ -195,21 +195,15 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
         s->nskip_fields -= 2;
         return 0;
     } else if (s->nskip_fields >= 1) {
-        if (s->occupied) {
-            s->occupied = 0;
-            s->nskip_fields--;
-        }
-        else {
-            for (i = 0; i < s->nb_planes; i++) {
-                av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
-                                    inpicref->data[i], inpicref->linesize[i],
-                                    s->stride[i],
-                                    s->planeheight[i]);
-            }
-            s->occupied = 1;
-            s->nskip_fields--;
-            return 0;
+        for (i = 0; i < s->nb_planes; i++) {
+            av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
+                                inpicref->data[i], inpicref->linesize[i],
+                                s->stride[i],
+                                s->planeheight[i]);
         }
+        s->occupied = 1;
+        s->nskip_fields--;
+        return 0;
     }
 
     if (s->nskip_fields == 0) {
@@ -243,15 +237,19 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref)
                                     s->stride[i],
                                     (s->planeheight[i] - !s->first_field + 1) / 2);
             }
-            len -= 2;
-            for (i = 0; i < s->nb_planes; i++) {
-                av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
-                                    inpicref->data[i], inpicref->linesize[i],
-                                    s->stride[i],
-                                    s->planeheight[i]);
+
+            s->occupied = 0;
+            if (len <= 2) {
+                for (i = 0; i < s->nb_planes; i++) {
+                    av_image_copy_plane(s->temp->data[i], s->temp->linesize[i],
+                                        inpicref->data[i], inpicref->linesize[i],
+                                        s->stride[i],
+                                        s->planeheight[i]);
+                }
+                s->occupied = 1;
             }
-            s->occupied = 1;
             out = 1;
+            len = (len >= 3) ? len - 3 : 0;
         } else {
             if (len >= 2) {
                 // output THIS image as-is
-- 
2.5.0



More information about the ffmpeg-devel mailing list