Fix bug in av1_optimize_b when tx64x64 is enabled In both versions of av1_optimize_b, the code to calculate the dequantized coefficient from a modified quantized coefficient was not compatible with tx64x64. Specifically, the new dequantized coefficient was calculated as an offset applied to the original coefficient. This had a fixup block for 32x32 transforms, but not for 64x64 transforms. For simplicity, instead of extending the fixup block, we now recalculate the dequantized coefficient directly. BUG=aomedia:537 Change-Id: I86c1c8820f324ad3f6afd6a720ff59f754384a19
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index 15012a9..b4d19ff 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c
@@ -175,8 +175,6 @@ #if CONFIG_NEW_QUANT int dq = get_dq_profile_from_ctx(mb->qindex, ctx, ref, plane_type); const dequant_val_type_nuq *dequant_val = pd->dequant_val_nuq[dq]; -#elif !CONFIG_AOM_QM - const int dq_step[2] = { dequant_ptr[0] >> shift, dequant_ptr[1] >> shift }; #endif // CONFIG_NEW_QUANT int sz = 0; const int64_t rddiv = mb->rddiv; @@ -388,22 +386,10 @@ dqc_a = shift ? ROUND_POWER_OF_TWO(dqc_a, shift) : dqc_a; if (sz) dqc_a = -dqc_a; #else -// The 32x32 transform coefficient uses half quantization step size. -// Account for the rounding difference in the dequantized coefficeint -// value when the quantization index is dropped from an even number -// to an odd number. - -#if CONFIG_AOM_QM - tran_low_t offset = dqv >> shift; -#else - tran_low_t offset = dq_step[rc != 0]; -#endif - if (shift & x_a) offset += (dqv & 0x01); - - if (sz == 0) - dqc_a = dqcoeff[rc] - offset; + if (x_a < 0) + dqc_a = -((-x_a * dqv) >> shift); else - dqc_a = dqcoeff[rc] + offset; + dqc_a = (x_a * dqv) >> shift; #endif // CONFIG_NEW_QUANT } else { dqc_a = 0; @@ -513,8 +499,6 @@ #if CONFIG_NEW_QUANT int dq = get_dq_profile_from_ctx(mb->qindex, ctx, ref, plane_type); const dequant_val_type_nuq *dequant_val = pd->dequant_val_nuq[dq]; -#elif !CONFIG_AOM_QM - const int dq_step[2] = { dequant_ptr[0] >> shift, dequant_ptr[1] >> shift }; #endif // CONFIG_NEW_QUANT int next = eob, sz = 0; const int64_t rdmult = (mb->rdmult * plane_rd_mult[ref][plane_type]) >> 1; @@ -749,22 +733,10 @@ : tokens[i][1].dqc; if (sz) tokens[i][1].dqc = -tokens[i][1].dqc; #else -// The 32x32 transform coefficient uses half quantization step size. -// Account for the rounding difference in the dequantized coefficeint -// value when the quantization index is dropped from an even number -// to an odd number. - -#if CONFIG_AOM_QM - tran_low_t offset = dqv >> shift; -#else - tran_low_t offset = dq_step[rc != 0]; -#endif - if (shift & x) offset += (dqv & 0x01); - - if (sz == 0) - tokens[i][1].dqc = dqcoeff[rc] - offset; + if (x < 0) + tokens[i][1].dqc = -((-x * dqv) >> shift); else - tokens[i][1].dqc = dqcoeff[rc] + offset; + tokens[i][1].dqc = (x * dqv) >> shift; #endif // CONFIG_NEW_QUANT } else { tokens[i][1].dqc = 0;