Fix encode/decode mismatches for supertx + delta-q This fixes the following mismatch bugs: * At the bitstream level, the decoder would not read the delta_qindex information for supertx blocks, but the encoder always sent it, leading to the encoder and decoder becoming misaligned. The delta_qindex information is still required for supertx blocks, so change the decoder to read it. * In addition, the quantizer was not properly adjusted for supertx blocks at the decoder. We copy the quantizer setup code from non-supertx blocks. Since this does not change the encoder, it should not have any quality impact. Change-Id: I9a0f79c3aa66f2a5a353821e2a6f3b526636e7b4
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 3345ba3..5477df7 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -2151,6 +2151,25 @@ set_segment_id_supertx(cm, mi_row, mi_col, bsize); +#if CONFIG_DELTA_Q + if (cm->delta_q_present_flag) { + for (i = 0; i < MAX_SEGMENTS; i++) { + xd->plane[0].seg_dequant[i][0] = + av1_dc_quant(xd->current_qindex, cm->y_dc_delta_q, cm->bit_depth); + xd->plane[0].seg_dequant[i][1] = + av1_ac_quant(xd->current_qindex, 0, cm->bit_depth); + xd->plane[1].seg_dequant[i][0] = + av1_dc_quant(xd->current_qindex, cm->uv_dc_delta_q, cm->bit_depth); + xd->plane[1].seg_dequant[i][1] = + av1_ac_quant(xd->current_qindex, cm->uv_ac_delta_q, cm->bit_depth); + xd->plane[2].seg_dequant[i][0] = + av1_dc_quant(xd->current_qindex, cm->uv_dc_delta_q, cm->bit_depth); + xd->plane[2].seg_dequant[i][1] = + av1_ac_quant(xd->current_qindex, cm->uv_ac_delta_q, cm->bit_depth); + } + } +#endif + xd->mi = cm->mi_grid_visible + offset; xd->mi[0] = cm->mi + offset; set_mi_row_col(xd, tile, mi_row, mi_size_high[bsize], mi_col,
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 15cdb58..4f16940 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -1987,17 +1987,22 @@ mbmi->mv[1].as_int = 0; mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r); #if CONFIG_SUPERTX - if (!supertx_enabled) { + if (!supertx_enabled) #endif // CONFIG_SUPERTX mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); + #if CONFIG_DELTA_Q - if (cm->delta_q_present_flag) { - xd->current_qindex = - xd->prev_qindex + - read_delta_qindex(cm, xd, r, mbmi, mi_col, mi_row) * cm->delta_q_res; - xd->prev_qindex = xd->current_qindex; - } + if (cm->delta_q_present_flag) { + xd->current_qindex = + xd->prev_qindex + + read_delta_qindex(cm, xd, r, mbmi, mi_col, mi_row) * cm->delta_q_res; + xd->prev_qindex = xd->current_qindex; + } #endif + +#if CONFIG_SUPERTX + if (!supertx_enabled) { +#endif // CONFIG_SUPERTX inter_block = read_is_inter_block(cm, xd, mbmi->segment_id, r); #if CONFIG_VAR_TX