Fix enc/dec mismatch with b_context_pred experiment enabled.
authorRonald S. Bultje <rbultje@google.com>
Wed, 21 Nov 2012 20:39:55 +0000 (12:39 -0800)
committerRonald S. Bultje <rbultje@google.com>
Wed, 21 Nov 2012 20:39:55 +0000 (12:39 -0800)
Change-Id: I1272ae3f0fdfb7ed8eb364ef0c6dd1818d3179d7

vp9/decoder/decodframe.c
vp9/decoder/detokenize.c
vp9/decoder/detokenize.h

index e7d5667..4682107 100644 (file)
@@ -395,7 +395,7 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
       eobtotal = vp9_decode_mb_tokens_16x16(pbi, xd, bc);
     } else if (tx_size == TX_8X8) {
       eobtotal = vp9_decode_mb_tokens_8x8(pbi, xd, bc);
-    } else {
+    } else if (mode != B_PRED) {
       eobtotal = vp9_decode_mb_tokens_4x4(pbi, xd, bc);
     }
   }
@@ -491,6 +491,8 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
       xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
           vp9_find_bpred_context(b);
 #endif
+      if (!xd->mode_info_context->mbmi.mb_skip_coeff)
+        eobtotal += vp9_decode_coefs_4x4(pbi, xd, bc, PLANE_TYPE_Y_WITH_DC, i);
 #if CONFIG_COMP_INTRA_PRED
       b_mode2 = xd->mode_info_context->bmi[i].as_mode.second;
 
@@ -513,6 +515,8 @@ static void decode_macroblock(VP9D_COMP *pbi, MACROBLOCKD *xd,
                                *(b->base_dst) + b->dst, 16, b->dst_stride);
       }
     }
+    if (!xd->mode_info_context->mbmi.mb_skip_coeff)
+      vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
   } else if (mode == SPLITMV) {
     if (tx_size == TX_8X8) {
       vp9_dequant_idct_add_y_block_8x8(xd->qcoeff, xd->block[0].dequant,
index 16e85a0..1194aa8 100644 (file)
@@ -389,9 +389,9 @@ int vp9_decode_mb_tokens_8x8(VP9D_COMP* const pbi,
   return eobtotal;
 }
 
-static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
-                            BOOL_DECODER* const bc,
-                            PLANE_TYPE type, int i) {
+int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+                         BOOL_DECODER* const bc,
+                         PLANE_TYPE type, int i) {
   ENTROPY_CONTEXT *const A = (ENTROPY_CONTEXT *)xd->above_context;
   ENTROPY_CONTEXT *const L = (ENTROPY_CONTEXT *)xd->left_context;
   ENTROPY_CONTEXT *const a = A + vp9_block2above[i];
@@ -424,6 +424,17 @@ static int decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
   return c;
 }
 
+int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx,
+                                MACROBLOCKD* const xd,
+                                BOOL_DECODER* const bc) {
+  int eobtotal = 0, i;
+
+  for (i = 16; i < 24; i++)
+    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
+
+  return eobtotal;
+}
+
 int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
                              MACROBLOCKD* const xd,
                              BOOL_DECODER* const bc) {
@@ -433,17 +444,15 @@ int vp9_decode_mb_tokens_4x4(VP9D_COMP* const dx,
   if (xd->mode_info_context->mbmi.mode != B_PRED &&
       xd->mode_info_context->mbmi.mode != I8X8_PRED &&
       xd->mode_info_context->mbmi.mode != SPLITMV) {
-    eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
+    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_Y2, 24) - 16;
     type = PLANE_TYPE_Y_NO_DC;
   } else {
     type = PLANE_TYPE_Y_WITH_DC;
   }
 
   for (i = 0; i < 16; ++i) {
-    eobtotal += decode_coefs_4x4(dx, xd, bc, type, i);
+    eobtotal += vp9_decode_coefs_4x4(dx, xd, bc, type, i);
   }
-  do {
-    eobtotal += decode_coefs_4x4(dx, xd, bc, PLANE_TYPE_UV, i);
-  } while (++i < 24);
-  return eobtotal;
+
+  return eobtotal + vp9_decode_mb_tokens_4x4_uv(dx, xd, bc);
 }
index 5a7d354..a8f78f4 100644 (file)
 
 void vp9_reset_mb_tokens_context(MACROBLOCKD* const);
 
+int vp9_decode_coefs_4x4(VP9D_COMP *dx, MACROBLOCKD *xd,
+                         BOOL_DECODER* const bc,
+                         PLANE_TYPE type, int i);
+
 int vp9_decode_mb_tokens_4x4(VP9D_COMP* const, MACROBLOCKD* const,
                              BOOL_DECODER* const);
 
+int vp9_decode_mb_tokens_4x4_uv(VP9D_COMP* const dx, MACROBLOCKD* const xd,
+                                BOOL_DECODER* const bc);
+
 int vp9_decode_mb_tokens_8x8(VP9D_COMP* const, MACROBLOCKD* const,
                              BOOL_DECODER* const);