shithub: libvpx

Download patch

ref: 0b792cf97f13e0630cafdee3c31a839667afe644
parent: fca6c82b29b0f19457807dfe42a65cdc23fa660f
parent: 9831f20594cd48862352f8a3f5384a5b9e122f21
author: John Koleszar <jkoleszar@google.com>
date: Tue Jun 11 08:29:03 EDT 2013

Merge "Disallow wide loopfilter on some chroma borders" into experimental

--- a/vp9/common/vp9_loopfilter.c
+++ b/vp9/common/vp9_loopfilter.c
@@ -299,6 +299,7 @@
       const TX_SIZE tx_size = plane ? get_uv_tx_size(&mi[c].mbmi)
                                     : mi[c].mbmi.txfm_size;
       const int skip_border_4x4_c = ss_x && mi_col + c == cm->mi_cols - 1;
+      const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1;
 
       // Filter level can vary per MI
       if (!build_lfi(cm, &mi[c].mbmi,
@@ -307,15 +308,31 @@
 
       // Build masks based on the transform size of each block
       if (tx_size == TX_32X32) {
-        if (!skip_this_c && ((c >> ss_x) & 3) == 0)
-          mask_16x16_c |= 1 << (c >> ss_x);
-        if (!skip_this_r && ((r >> ss_y) & 3) == 0)
-          mask_16x16[r] |= 1 << (c >> ss_x);
+        if (!skip_this_c && ((c >> ss_x) & 3) == 0) {
+          if (!skip_border_4x4_c)
+            mask_16x16_c |= 1 << (c >> ss_x);
+          else
+            mask_8x8_c |= 1 << (c >> ss_x);
+        }
+        if (!skip_this_r && ((r >> ss_y) & 3) == 0) {
+          if (!skip_border_4x4_r)
+            mask_16x16[r] |= 1 << (c >> ss_x);
+          else
+            mask_8x8[r] |= 1 << (c >> ss_x);
+        }
       } else if (tx_size == TX_16X16) {
-        if (!skip_this_c && ((c >> ss_x) & 1) == 0)
-          mask_16x16_c |= 1 << (c >> ss_x);
-        if (!skip_this_r && ((r >> ss_y) & 1) == 0)
-          mask_16x16[r] |= 1 << (c >> ss_x);
+        if (!skip_this_c && ((c >> ss_x) & 1) == 0) {
+          if (!skip_border_4x4_c)
+            mask_16x16_c |= 1 << (c >> ss_x);
+          else
+            mask_8x8_c |= 1 << (c >> ss_x);
+        }
+        if (!skip_this_r && ((r >> ss_y) & 1) == 0) {
+          if (!skip_border_4x4_r)
+            mask_16x16[r] |= 1 << (c >> ss_x);
+          else
+            mask_8x8[r] |= 1 << (c >> ss_x);
+        }
       } else {
         // force 8x8 filtering on 32x32 boundaries
         if (!skip_this_c) {