shithub: libvpx

Download patch

ref: f82d601f94a2fef69a0a12790c5fcdf49bbbdf2c
parent: fe38082f4436b35f32b10a1bec06eded3c529428
parent: d8afecef715277a59841607dde01e8af79f7c7f2
author: Yaowu Xu <yaowu@google.com>
date: Fri Nov 4 12:25:15 EDT 2011

Merge "Added context reset when 2nd order coefficients are cleared" into experimental

--- 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)