Fixed decoder mismatch issue
authorJingning Han <jingning@google.com>
Thu, 16 Aug 2012 20:25:49 +0000 (13:25 -0700)
committerJingning Han <jingning@google.com>
Thu, 16 Aug 2012 21:24:32 +0000 (14:24 -0700)
Resolved the decoder mismatch issue due to quantization parameter
threshold for hybrid transform coding. The macroblock dequantizer
initialization is moved to be performed before coefficient
detokenization, since the (de)tokenization is now dependent on the
macroblock level quantization parameter.

Change-Id: I443da4992ebb70ae4114750b2f1363c0c628580e

vp8/decoder/decodframe.c

index 6ff9148..0ac2365 100644 (file)
@@ -211,10 +211,14 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
   int tx_type;
 
 #if CONFIG_HYBRIDTRANSFORM
-  int QIndex = xd->q_index;
-  int active_ht = (QIndex < ACTIVE_HT);
+  int QIndex;
+  int active_ht;
 #endif
 
+  // re-initialize macroblock dequantizer before detokenization
+  if (xd->segmentation_enabled)
+    mb_init_dequantizer(pbi, xd);
+
   if (pbi->common.frame_type == KEY_FRAME) {
 #if CONFIG_TX16X16
     if (xd->mode_info_context->mbmi.mode <= TM_PRED ||
@@ -326,11 +330,14 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd,
   }
 #endif
 
-  if (xd->segmentation_enabled)
-    mb_init_dequantizer(pbi, xd);
+  // moved to be performed before detokenization
+//  if (xd->segmentation_enabled)
+//    mb_init_dequantizer(pbi, xd);
 
 #if CONFIG_HYBRIDTRANSFORM
   // parse transform types for intra 4x4 mode
+  QIndex = xd->q_index;
+  active_ht = (QIndex < ACTIVE_HT);
   if (mode == B_PRED) {
     for (i = 0; i < 16; i++) {
       BLOCKD *b = &xd->block[i];