[FFmpeg-cvslog] yadif: redesign first and last 2 lines handling.

Michael Niedermayer git at videolan.org
Fri Aug 10 00:17:23 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Aug 10 00:06:31 2012 +0200| [2f7e8dcf45f11df94f47acbe6825cc93514ea59b] | committer: Michael Niedermayer

yadif: redesign first and last 2 lines handling.

The previous code dependent on the input buffer matching the
buffer that has been provided by yadifs get_buffer.
The API does in now way gurantee this though its often true.
This fixes some out of array reads.
The regression test checksums change due to "out of picture" values
being initialized differently.
There should be no visual difference in the filters output

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

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

 libavfilter/vf_yadif.c            |   28 ++++++++++++++++++++++-
 libavfilter/yadif.h               |    2 ++
 tests/ref/fate/filter-yadif-mode0 |   26 +++++++++++-----------
 tests/ref/fate/filter-yadif-mode1 |   44 ++++++++++++++++++-------------------
 4 files changed, 64 insertions(+), 36 deletions(-)

diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
index 215c764..a79df7f 100644
--- a/libavfilter/vf_yadif.c
+++ b/libavfilter/vf_yadif.c
@@ -112,6 +112,7 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
         int w = dstpic->video->w;
         int h = dstpic->video->h;
         int refs = yadif->cur->linesize[i];
+        int absrefs = FFABS(refs);
         int df = (yadif->csp->comp[i].depth_minus1 + 8) / 8;
 
         if (i == 1 || i == 2) {
@@ -120,6 +121,12 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
             h >>= yadif->csp->log2_chroma_h;
         }
 
+        if(yadif->temp_line_size < absrefs) {
+            av_free(yadif->temp_line);
+            yadif->temp_line = av_mallocz(2*64 + 5*absrefs);
+            yadif->temp_line_size = absrefs;
+        }
+
         for (y = 0; y < h; y++) {
             if ((y ^ parity) & 1) {
                 uint8_t *prev = &yadif->prev->data[i][y*refs];
@@ -127,7 +134,25 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
                 uint8_t *next = &yadif->next->data[i][y*refs];
                 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);
+                int     prefs = y+1<h ? refs : -refs;
+                int     mrefs =     y ?-refs :  refs;
+
+                if(y<=1 || y+2>=h) {
+                    int j;
+                    uint8_t *tmp = yadif->temp_line + 64 + 2*absrefs;
+                    if(mode<2)
+                        memcpy(tmp+2*mrefs, cur+2*mrefs, w*df);
+                    memcpy(tmp+mrefs, cur+mrefs, w*df);
+                    memcpy(tmp      , cur      , w*df);
+                    if(prefs != mrefs) {
+                        memcpy(tmp+prefs, cur+prefs, w*df);
+                        if(mode<2)
+                            memcpy(tmp+2*prefs, cur+2*prefs, w*df);
+                    }
+                    cur = tmp;
+                }
+
+                yadif->filter_line(dst, prev, cur, next, w, prefs, mrefs, parity ^ tff, mode);
             } else {
                 memcpy(&dstpic->data[i][y*dstpic->linesize[i]],
                        &yadif->cur->data[i][y*refs], w*df);
@@ -343,6 +368,7 @@ static av_cold void uninit(AVFilterContext *ctx)
     if (yadif->prev) avfilter_unref_bufferp(&yadif->prev);
     if (yadif->cur ) avfilter_unref_bufferp(&yadif->cur );
     if (yadif->next) avfilter_unref_bufferp(&yadif->next);
+    av_freep(&yadif->temp_line); yadif->temp_line_size = 0;
 }
 
 static int query_formats(AVFilterContext *ctx)
diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h
index 4d3d818..45bb1dc 100644
--- a/libavfilter/yadif.h
+++ b/libavfilter/yadif.h
@@ -56,6 +56,8 @@ typedef struct {
 
     const AVPixFmtDescriptor *csp;
     int eof;
+    uint8_t *temp_line;
+    int temp_line_size;
 } YADIFContext;
 
 void ff_yadif_init_x86(YADIFContext *yadif);
diff --git a/tests/ref/fate/filter-yadif-mode0 b/tests/ref/fate/filter-yadif-mode0
index 0ed47a4..7014333 100644
--- a/tests/ref/fate/filter-yadif-mode0
+++ b/tests/ref/fate/filter-yadif-mode0
@@ -2,31 +2,31 @@
 0,          9,          9,        1,   622080, 0x4440caef
 0,         10,         10,        1,   622080, 0xce67e69d
 0,         11,         11,        1,   622080, 0x1dbdc653
-0,         12,         12,        1,   622080, 0x82c591d1
+0,         12,         12,        1,   622080, 0x55c791d0
 0,         13,         13,        1,   622080, 0x8193740b
-0,         14,         14,        1,   622080, 0xcb219711
-0,         15,         15,        1,   622080, 0x1870783b
+0,         14,         14,        1,   622080, 0x7125970f
+0,         15,         15,        1,   622080, 0xeb63783a
 0,         16,         16,        1,   622080, 0x7080590b
-0,         17,         17,        1,   622080, 0x6df4175d
-0,         18,         18,        1,   622080, 0x6b530e95
+0,         17,         17,        1,   622080, 0x13f8175b
+0,         18,         18,        1,   622080, 0x3e550e94
 0,         19,         19,        1,   622080, 0x7f9d66f7
-0,         20,         20,        1,   622080, 0x338cda81
-0,         21,         21,        1,   622080, 0xb13797f8
-0,         22,         22,        1,   622080, 0xb51e7ca4
+0,         20,         20,        1,   622080, 0x068eda80
+0,         21,         21,        1,   622080, 0x843997f7
+0,         22,         22,        1,   622080, 0x88207ca3
 0,         23,         23,        1,   622080, 0x353eed75
 0,         24,         24,        1,   622080, 0xf93e92b0
 0,         25,         25,        1,   622080, 0xd0811094
 0,         26,         26,        1,   622080, 0xb04a3141
 0,         27,         27,        1,   622080, 0x4ab84909
-0,         28,         28,        1,   622080, 0xa0fcb8fb
-0,         29,         29,        1,   622080, 0x9003aebb
+0,         28,         28,        1,   622080, 0x4700b8f9
+0,         29,         29,        1,   622080, 0x6305aeba
 0,         30,         30,        1,   622080, 0x153faa3e
 0,         31,         31,        1,   622080, 0xae724063
-0,         32,         32,        1,   622080, 0xeb4de77a
+0,         32,         32,        1,   622080, 0xbe4fe779
 0,         33,         33,        1,   622080, 0x209ed8c7
 0,         34,         34,        1,   622080, 0xe2bbac96
 0,         35,         35,        1,   622080, 0xe945441e
-0,         36,         36,        1,   622080, 0x8f8cbd5f
-0,         37,         37,        1,   622080, 0xbc3cf717
+0,         36,         36,        1,   622080, 0x3590bd5d
+0,         37,         37,        1,   622080, 0x8f3ef716
 0,         38,         38,        1,   622080, 0x0109f125
 0,         39,         39,        1,   622080, 0x230c373f
diff --git a/tests/ref/fate/filter-yadif-mode1 b/tests/ref/fate/filter-yadif-mode1
index 87bd18c..87c8d97 100644
--- a/tests/ref/fate/filter-yadif-mode1
+++ b/tests/ref/fate/filter-yadif-mode1
@@ -5,27 +5,27 @@
 0,         21,         21,        1,   622080, 0x9a57891f
 0,         22,         22,        1,   622080, 0x1dbdc653
 0,         23,         23,        1,   622080, 0xc171c0c5
-0,         24,         24,        1,   622080, 0x82c591d1
+0,         24,         24,        1,   622080, 0x55c791d0
 0,         25,         25,        1,   622080, 0x20db9890
 0,         26,         26,        1,   622080, 0x8193740b
 0,         27,         27,        1,   622080, 0xdb181d52
-0,         28,         28,        1,   622080, 0xcb219711
+0,         28,         28,        1,   622080, 0x7125970f
 0,         29,         29,        1,   622080, 0xc2b913d1
-0,         30,         30,        1,   622080, 0x1870783b
+0,         30,         30,        1,   622080, 0xeb63783a
 0,         31,         31,        1,   622080, 0xf1d9c5fb
 0,         32,         32,        1,   622080, 0x7080590b
-0,         33,         33,        1,   622080, 0x669c5775
-0,         34,         34,        1,   622080, 0x6df4175d
+0,         33,         33,        1,   622080, 0xeda55774
+0,         34,         34,        1,   622080, 0x13f8175b
 0,         35,         35,        1,   622080, 0x01921a16
-0,         36,         36,        1,   622080, 0x6b530e95
+0,         36,         36,        1,   622080, 0x3e550e94
 0,         37,         37,        1,   622080, 0xd5047bc9
 0,         38,         38,        1,   622080, 0x7f9d66f7
-0,         39,         39,        1,   622080, 0xa8b006eb
-0,         40,         40,        1,   622080, 0x338cda81
+0,         39,         39,        1,   622080, 0x2fc806ea
+0,         40,         40,        1,   622080, 0x068eda80
 0,         41,         41,        1,   622080, 0xf0e125a7
-0,         42,         42,        1,   622080, 0xb13797f8
+0,         42,         42,        1,   622080, 0x843997f7
 0,         43,         43,        1,   622080, 0x4afe2976
-0,         44,         44,        1,   622080, 0xb51e7ca4
+0,         44,         44,        1,   622080, 0x88207ca3
 0,         45,         45,        1,   622080, 0x637fcbfe
 0,         46,         46,        1,   622080, 0x353eed75
 0,         47,         47,        1,   622080, 0xd9a8f5ac
@@ -34,30 +34,30 @@
 0,         50,         50,        1,   622080, 0xd0811094
 0,         51,         51,        1,   622080, 0x3039906f
 0,         52,         52,        1,   622080, 0xb04a3141
-0,         53,         53,        1,   622080, 0x52872cf9
+0,         53,         53,        1,   622080, 0xe62d2cfa
 0,         54,         54,        1,   622080, 0x4ab84909
 0,         55,         55,        1,   622080, 0x82de12ee
-0,         56,         56,        1,   622080, 0xa0fcb8fb
+0,         56,         56,        1,   622080, 0x4700b8f9
 0,         57,         57,        1,   622080, 0x7e849cc9
-0,         58,         58,        1,   622080, 0x9003aebb
-0,         59,         59,        1,   622080, 0xffe6f770
+0,         58,         58,        1,   622080, 0x6305aeba
+0,         59,         59,        1,   622080, 0x939bf771
 0,         60,         60,        1,   622080, 0x153faa3e
 0,         61,         61,        1,   622080, 0xb67f3233
 0,         62,         62,        1,   622080, 0xae724063
-0,         63,         63,        1,   622080, 0x15fe44b4
-0,         64,         64,        1,   622080, 0xeb4de77a
+0,         63,         63,        1,   622080, 0xed2b44b3
+0,         64,         64,        1,   622080, 0xbe4fe779
 0,         65,         65,        1,   622080, 0x380f8563
 0,         66,         66,        1,   622080, 0x209ed8c7
 0,         67,         67,        1,   622080, 0xb964d70f
 0,         68,         68,        1,   622080, 0xe2bbac96
 0,         69,         69,        1,   622080, 0x4f60f7f4
 0,         70,         70,        1,   622080, 0xe945441e
-0,         71,         71,        1,   622080, 0xd0afb742
-0,         72,         72,        1,   622080, 0x8f8cbd5f
+0,         71,         71,        1,   622080, 0xded0b740
+0,         72,         72,        1,   622080, 0x3590bd5d
 0,         73,         73,        1,   622080, 0xb9a15294
-0,         74,         74,        1,   622080, 0xbc3cf717
-0,         75,         75,        1,   622080, 0xb70b01a9
+0,         74,         74,        1,   622080, 0x8f3ef716
+0,         75,         75,        1,   622080, 0x3e2301a8
 0,         76,         76,        1,   622080, 0x0109f125
-0,         77,         77,        1,   622080, 0xcb3a371f
+0,         77,         77,        1,   622080, 0x5252371e
 0,         78,         78,        1,   622080, 0x230c373f
-0,         79,         79,        1,   622080, 0x82dfb1f2
+0,         79,         79,        1,   622080, 0x5a1ab1f1



More information about the ffmpeg-cvslog mailing list