[FFmpeg-devel] [PATCH 2/2] avfilter/vf_yadif: try a more complex spatial predictor

Michael Niedermayer michaelni at gmx.at
Sat Sep 21 02:37:26 CEST 2013


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavfilter/vf_yadif.c |  108 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 103 insertions(+), 5 deletions(-)

diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
index fca1579..b815d7a 100644
--- a/libavfilter/vf_yadif.c
+++ b/libavfilter/vf_yadif.c
@@ -45,7 +45,73 @@ typedef struct ThreadData {
             spatial_score= score;\
             spatial_pred= (cur[mrefs  +(j)] + cur[prefs  -(j)])>>1;\
 
-/* The is_not_edge argument here controls when the code will enter a branch
+#define CHECK2(j)\
+    {   int score = FFABS(cur[mrefs - 1 + (j)] - cur[prefs - 1 - (j)])\
+                  + FFABS(cur[mrefs  +(j)] - cur[prefs  -(j)])\
+                  + FFABS(cur[mrefs + 1 + (j)] - cur[prefs + 1 - (j)]);\
+        if (FFABS(j) > 0)\
+            score +=  FFABS(cur[mrefs - 2 + (j)] - cur[prefs - 2 - (j)])\
+                    + FFABS(cur[mrefs + 2 + (j)] - cur[prefs + 2 - (j)]);\
+        if (FFABS(j) > 1)\
+            score +=  FFABS(cur[mrefs - 3 + (j)] - cur[prefs - 3 - (j)])\
+                    + FFABS(cur[mrefs + 3 + (j)] - cur[prefs + 3 - (j)]);\
+        if (FFABS(j) > 2)\
+            score +=  FFABS(cur[mrefs - 4 + (j)] - cur[prefs - 4 - (j)])\
+                    + FFABS(cur[mrefs + 4 + (j)] - cur[prefs + 4 - (j)]);\
+        if (FFABS(j) > 3)\
+            score +=  FFABS(cur[mrefs - 5 + (j)] - cur[prefs - 5 - (j)])\
+                    + FFABS(cur[mrefs + 5 + (j)] - cur[prefs + 5 - (j)]);\
+        \
+        if (score < spatial_score) {\
+            spatial_score= score;\
+            spatial_pred= (cur[mrefs  +(j)] + cur[prefs  -(j)])>>1;\
+
+#define SQR(a) ((a)*(a))
+
+#define CHECK3(j)\
+    {   int score = SQR(cur[mrefs - 1 + (j)] - cur[prefs - 1 - (j)])\
+                  + SQR(cur[mrefs     + (j)] - cur[prefs  -(j)])\
+                  + SQR(cur[mrefs + 1 + (j)] - cur[prefs + 1 - (j)])\
+                  + SQR(cur[3*mrefs - 1 + (j)] - cur[mrefs - 1 - (j)])\
+                  + SQR(cur[3*mrefs     + (j)] - cur[mrefs     - (j)])\
+                  + SQR(cur[3*mrefs + 1 + (j)] - cur[mrefs + 1 - (j)])\
+                  + SQR(cur[prefs - 1 + (j)] - cur[3*prefs - 1 - (j)])\
+                  + SQR(cur[prefs     + (j)] - cur[3*prefs     - (j)])\
+                  + SQR(cur[prefs + 1 + (j)] - cur[3*prefs + 1 - (j)]);\
+        if (FFABS(j) > 0)\
+            score +=  SQR(cur[mrefs - 2 + (j)] - cur[prefs - 2 - (j)])\
+                    + SQR(cur[mrefs + 2 + (j)] - cur[prefs + 2 - (j)])\
+                    + SQR(cur[3*mrefs - 2 + (j)] - cur[mrefs - 2 - (j)])\
+                    + SQR(cur[3*mrefs + 2 + (j)] - cur[mrefs + 2 - (j)])\
+                    + SQR(cur[prefs - 2 + (j)] - cur[3*prefs - 2 - (j)])\
+                    + SQR(cur[prefs + 2 + (j)] - cur[3*prefs + 2 - (j)]);\
+        if (FFABS(j) > 1)\
+            score +=  SQR(cur[mrefs - 3 + (j)] - cur[prefs - 3 - (j)])\
+                    + SQR(cur[mrefs + 3 + (j)] - cur[prefs + 3 - (j)])\
+                    + SQR(cur[3*mrefs - 3 + (j)] - cur[mrefs - 3 - (j)])\
+                    + SQR(cur[3*mrefs + 3 + (j)] - cur[mrefs + 3 - (j)])\
+                    + SQR(cur[prefs - 3 + (j)] - cur[3*prefs - 3 - (j)])\
+                    + SQR(cur[prefs + 3 + (j)] - cur[3*prefs + 3 - (j)]);\
+        if (FFABS(j) > 2)\
+            score +=  SQR(cur[mrefs - 4 + (j)] - cur[prefs - 4 - (j)])\
+                    + SQR(cur[mrefs + 4 + (j)] - cur[prefs + 4 - (j)])\
+                    + SQR(cur[3*mrefs - 4 + (j)] - cur[mrefs - 4 - (j)])\
+                    + SQR(cur[3*mrefs + 4 + (j)] - cur[mrefs + 4 - (j)])\
+                    + SQR(cur[prefs - 4 + (j)] - cur[3*prefs - 4 - (j)])\
+                    + SQR(cur[prefs + 4 + (j)] - cur[3*prefs + 4 - (j)]);\
+        if (FFABS(j) > 3)\
+            score +=  SQR(cur[mrefs - 5 + (j)] - cur[prefs - 5 - (j)])\
+                    + SQR(cur[mrefs + 5 + (j)] - cur[prefs + 5 - (j)])\
+                    + SQR(cur[3*mrefs - 5 + (j)] - cur[mrefs - 5 - (j)])\
+                    + SQR(cur[3*mrefs + 5 + (j)] - cur[mrefs + 5 - (j)])\
+                    + SQR(cur[prefs - 5 + (j)] - cur[3*prefs - 5 - (j)])\
+                    + SQR(cur[prefs + 5 + (j)] - cur[3*prefs + 5 - (j)]);\
+        score = score * 256 / (9 + 6*FFABS(j));\
+        if (score < spatial_score) {\
+            spatial_score= score;\
+            spatial_pred= (cur[mrefs  +(j)] + cur[prefs  -(j)])>>1;\
+
+            /* The is_not_edge argument here controls when the code will enter a branch
  * which reads up to and including x-3 and x+3. */
 
 #define FILTER(start, end, is_not_edge) \
@@ -60,10 +126,42 @@ typedef struct ThreadData {
         int spatial_pred = (c+e) >> 1; \
  \
         if (is_not_edge) {\
-            int spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \
-                              + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \
-            CHECK(-1) CHECK(-2) }} }} \
-            CHECK( 1) CHECK( 2) }} }} \
+            int spatial_score = INT_MAX;\
+            int z_score       = SQR(cur[3*mrefs - 2] - cur[3*mrefs + 1])\
+                              + SQR(cur[  mrefs - 2] - cur[  mrefs + 1]) \
+                              + SQR(cur[  prefs - 2] - cur[  prefs + 1]) \
+                              + SQR(cur[3*prefs - 2] - cur[3*prefs + 1]) \
+                              + SQR(cur[3*mrefs - 1] - cur[3*mrefs + 2])\
+                              + SQR(cur[  mrefs - 1] - cur[  mrefs + 2]) \
+                              + SQR(cur[  prefs - 1] - cur[  prefs + 2]) \
+                              + SQR(cur[3*prefs - 1] - cur[3*prefs + 2]) \
+                              + SQR(cur[3*mrefs - 3] - cur[3*mrefs])\
+                              + SQR(cur[  mrefs - 3] - cur[  mrefs]) \
+                              + SQR(cur[  prefs - 3] - cur[  prefs]) \
+                              + SQR(cur[3*prefs - 3] - cur[3*prefs]) \
+                              + SQR(cur[3*mrefs] - cur[3*mrefs + 3])\
+                              + SQR(cur[  mrefs] - cur[  mrefs + 3]) \
+                              + SQR(cur[  prefs] - cur[  prefs + 3]) \
+                              + SQR(cur[3*prefs] - cur[3*prefs + 3]) \
+                              + SQR(cur[3*mrefs - 4] - cur[3*mrefs - 1])\
+                              + SQR(cur[  mrefs - 4] - cur[  mrefs - 1]) \
+                              + SQR(cur[  prefs - 4] - cur[  prefs - 1]) \
+                              + SQR(cur[3*prefs - 4] - cur[3*prefs - 1]) \
+                              + SQR(cur[3*mrefs + 1] - cur[3*mrefs + 4])\
+                              + SQR(cur[  mrefs + 1] - cur[  mrefs + 4]) \
+                              + SQR(cur[  prefs + 1] - cur[  prefs + 4]) \
+                              + SQR(cur[3*prefs + 1] - cur[3*prefs + 4]); \
+            CHECK3(0) }}\
+            CHECK3(-1) CHECK3(-2) }} }} \
+            CHECK3( 1) CHECK3( 2) }} }} \
+            if (z_score * 256 / 8 < spatial_score) { \
+            CHECK3(2) }} \
+            CHECK3(-2) }} \
+            CHECK3(3) }} \
+            CHECK3(-3) }} \
+            CHECK3(4) }} \
+            CHECK3(-4) }} \
+            }\
         }\
  \
         if (!(mode&2)) { \
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list