shithub: libvpx

Download patch

ref: d8afecef715277a59841607dde01e8af79f7c7f2
parent: a10a268e58ffd4366f6dbddd5f26600d688714c9
author: Yaowu Xu <yaowu@google.com>
date: Thu Nov 3 12:05:29 EDT 2011

Added context reset when 2nd order coefficients are cleared

As discovered in path 10 of Change Ia12acd2f, reset 2nd order coeffs
without reset of above and left coding context may have introduced
problem that causes encoder/decoder mismatching. This commit added
update to coding context when the 2nd coefficients are cleared.

In addition, this commit also introduced early breakout in the checks
to speed up when coefficients are too significant to be cleared.

Change-Id: I85322a432b11e8af85001525d1e9dc218f9a0bd6

--- a/vp8/encoder/encodemb.c
+++ b/vp8/encoder/encodemb.c
@@ -606,18 +606,24 @@
     *a = *l = (d->eob != !type);
 }
 
-static void check_reset_2nd_coeffs(MACROBLOCKD *x)
+static void check_reset_2nd_coeffs(MACROBLOCKD *x, int type,
+                                   ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
 {
     int sum=0;
     int i;
     BLOCKD *bd = &x->block[24];
-    int eob_pos = (bd->eob<16)? vp8_default_zig_zag1d[bd->eob]:16;
 
+    if(bd->dequant[0]>=35 && bd->dequant[1]>=35)
+        return;
+
     for(i=0;i<bd->eob;i++)
     {
         int coef = bd->dqcoeff[vp8_default_zig_zag1d[i]];
         sum+= (coef>=0)?coef:-coef;
+        if(sum>=35)
+            return;
     }
+
     /**************************************************************************
     our inverse hadamard transform effectively is weighted sum of all 16 inputs
     with weight either 1 or -1. It has a last stage scaling of (sum+3)>>3. And
@@ -628,12 +634,18 @@
     **************************************************************************/
     if(sum < 35)
     {
-        vpx_memset(bd->qcoeff,0,eob_pos*2);
-        vpx_memset(bd->dqcoeff,0,eob_pos*2);
+        for(i=0;i<bd->eob;i++)
+        {
+            int rc = vp8_default_zig_zag1d[i];
+            bd->qcoeff[rc]=0;
+            bd->dqcoeff[rc]=0;
+        }
         bd->eob = 0;
+        *a = *l = (bd->eob != !type);
     }
 }
-static void check_reset_8x8_2nd_coeffs(MACROBLOCKD *x)
+static void check_reset_8x8_2nd_coeffs(MACROBLOCKD *x, int type,
+                                   ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
 {
     int sum=0;
     int i;
@@ -668,6 +680,7 @@
         bd->qcoeff[8] = 0;
         bd->dqcoeff[8] = 0;
         bd->eob = 0;
+        *a = *l = (bd->eob != !type);
     }
 }
 
@@ -709,7 +722,8 @@
         b=24;
         optimize_b(x, b, PLANE_TYPE_Y2,
             ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
-        check_reset_2nd_coeffs(&x->e_mbd);
+        check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
+            ta + vp8_block2above[b], tl + vp8_block2left[b]);
     }
 }
 
@@ -752,7 +766,8 @@
         b=24;
         optimize_b(x, b, PLANE_TYPE_Y2,
             ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd);
-        check_reset_2nd_coeffs(&x->e_mbd);
+        check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
+            ta + vp8_block2above[b], tl + vp8_block2left[b]);
     }
 }
 
@@ -1110,7 +1125,9 @@
 
     }
     //8x8 always have 2nd roder haar block
-    check_reset_8x8_2nd_coeffs(&x->e_mbd);
+    check_reset_8x8_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
+            ta + vp8_block2above[24], tl + vp8_block2left[24]);
+
 }
 
 void vp8_optimize_mby_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)
@@ -1176,7 +1193,8 @@
     }
 
     //8x8 always have 2nd roder haar block
-    check_reset_8x8_2nd_coeffs(&x->e_mbd);
+    check_reset_8x8_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2,
+            ta + vp8_block2above[24], tl + vp8_block2left[24]);
 }
 
 void vp8_optimize_mbuv_8x8(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd)