AOM_QM: fix av1_optimize_b. BUG=aomedia:79 Merge of nextgenv2 caused av1_optimize_b not to take account of different inverse quantization when quant matrices are on. Change-Id: I1b8da2e110ce201183be777663222e3d73c9f17b
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index 8735a74..c3d7252 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c
@@ -95,6 +95,7 @@ get_scan(cm, tx_size, tx_type, is_inter_block(&xd->mi[0]->mbmi)); const int16_t *const scan = scan_order->scan; const int16_t *const nb = scan_order->neighbors; + int dqv; #if CONFIG_AOM_QM int seg_id = xd->mi[0]->mbmi.segment_id; const qm_val_t *iqmatrix = pd->seg_iqmatrix[seg_id][!ref][tx_size]; @@ -155,10 +156,14 @@ int base_bits, dx; int64_t d2; const int rc = scan[i]; + int x = qcoeff[rc]; #if CONFIG_AOM_QM int iwt = iqmatrix[rc]; + dqv = dequant_ptr[rc != 0]; + dqv = ((iwt * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS; +#else + dqv = dequant_ptr[rc != 0]; #endif - int x = qcoeff[rc]; next_shortcut = shortcut; /* Only add a trellis state for non-zero coefficients. */ @@ -210,10 +215,10 @@ shortcut = 0; } else { #if CONFIG_NEW_QUANT - shortcut = ((av1_dequant_abscoeff_nuq(abs(x), dequant_ptr[rc != 0], + shortcut = ((av1_dequant_abscoeff_nuq(abs(x), dqv, dequant_val[band_translate[i]]) > (abs(coeff[rc]) << shift)) && - (av1_dequant_abscoeff_nuq(abs(x) - 1, dequant_ptr[rc != 0], + (av1_dequant_abscoeff_nuq(abs(x) - 1, dqv, dequant_val[band_translate[i]]) < (abs(coeff[rc]) << shift))); #else // CONFIG_NEW_QUANT @@ -291,8 +296,7 @@ } #if CONFIG_NEW_QUANT - dx = av1_dequant_coeff_nuq(x, dequant_ptr[rc != 0], - dequant_val[band_translate[i]]) - + dx = av1_dequant_coeff_nuq(x, dqv, dequant_val[band_translate[i]]) - (coeff[rc] << shift); #if CONFIG_AOM_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { @@ -302,12 +306,12 @@ #else // CONFIG_NEW_QUANT #if CONFIG_AOM_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { - dx -= ((dequant_ptr[rc != 0] >> (xd->bd - 8)) + sz) ^ sz; + dx -= ((dqv >> (xd->bd - 8)) + sz) ^ sz; } else { - dx -= (dequant_ptr[rc != 0] + sz) ^ sz; + dx -= (dqv + sz) ^ sz; } #else - dx -= (dequant_ptr[rc != 0] + sz) ^ sz; + dx -= (dqv + sz) ^ sz; #endif // CONFIG_AOM_HIGHBITDEPTH #endif // CONFIG_NEW_QUANT d2 = (int64_t)dx * dx; @@ -321,17 +325,22 @@ if (x) { #if CONFIG_NEW_QUANT tokens[i][1].dqc = av1_dequant_abscoeff_nuq( - abs(x), dequant_ptr[rc != 0], dequant_val[band_translate[i]]); + abs(x), dqv, dequant_val[band_translate[i]]); tokens[i][1].dqc = shift ? ROUND_POWER_OF_TWO(tokens[i][1].dqc, shift) : tokens[i][1].dqc; if (sz) tokens[i][1].dqc = -tokens[i][1].dqc; #else - tran_low_t offset = dq_step[rc != 0]; // 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 (shift & x) offset += (dequant_ptr[rc != 0] & 0x01); + +#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;