Add support of separte delta Qs for chroma channels Change-Id: Iae7c054def0c0d5b5af52263f0c4d2e1e346282d
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index e43f520..1e3245a 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -325,6 +325,10 @@ int v_dc_delta_q; int u_ac_delta_q; int v_ac_delta_q; + +#if CONFIG_EXT_QM + int separate_uv_delta_q; +#endif // The dequantizers below are true dequntizers used only in the // dequantization process. They have the same coefficient // shift/scale as TX.
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 2b27499..08db2ad 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -1242,10 +1242,19 @@ struct aom_read_bit_buffer *rb) { cm->base_qindex = aom_rb_read_literal(rb, QINDEX_BITS); cm->y_dc_delta_q = read_delta_q(rb); + int diff_uv_delta = 0; +#if CONFIG_EXT_QM + if (cm->separate_uv_delta_q) diff_uv_delta = aom_rb_read_bit(rb); +#endif cm->u_dc_delta_q = read_delta_q(rb); cm->u_ac_delta_q = read_delta_q(rb); - cm->v_dc_delta_q = cm->u_dc_delta_q; - cm->v_ac_delta_q = cm->u_ac_delta_q; + if (diff_uv_delta) { + cm->v_dc_delta_q = read_delta_q(rb); + cm->v_ac_delta_q = read_delta_q(rb); + } else { + cm->v_dc_delta_q = cm->u_dc_delta_q; + cm->v_ac_delta_q = cm->u_ac_delta_q; + } cm->dequant_bit_depth = cm->bit_depth; #if CONFIG_AOM_QM cm->using_qmatrix = aom_rb_read_bit(rb); @@ -2423,6 +2432,9 @@ "4:4:4 color not supported in profile 0 or 2"); } } +#if CONFIG_EXT_QM + cm->separate_uv_delta_q = aom_rb_read_bit(rb); +#endif } #if CONFIG_REFERENCE_BUFFER || CONFIG_OBU
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 3b83d0c..d914fc3 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -2661,10 +2661,19 @@ struct aom_write_bit_buffer *wb) { aom_wb_write_literal(wb, cm->base_qindex, QINDEX_BITS); write_delta_q(wb, cm->y_dc_delta_q); - assert(cm->u_dc_delta_q == cm->v_dc_delta_q); + int diff_uv_delta = (cm->u_dc_delta_q != cm->v_dc_delta_q) || + (cm->u_ac_delta_q != cm->v_ac_delta_q); +#if CONFIG_EXT_QM + if (cm->separate_uv_delta_q) aom_wb_write_bit(wb, diff_uv_delta); +#else + assert(!diff_uv_delta); +#endif write_delta_q(wb, cm->u_dc_delta_q); - assert(cm->u_ac_delta_q == cm->v_ac_delta_q); write_delta_q(wb, cm->u_ac_delta_q); + if (diff_uv_delta) { + write_delta_q(wb, cm->v_dc_delta_q); + write_delta_q(wb, cm->v_ac_delta_q); + } #if CONFIG_AOM_QM aom_wb_write_bit(wb, cm->using_qmatrix); if (cm->using_qmatrix) { @@ -3497,6 +3506,9 @@ assert(cm->profile == PROFILE_1 || cm->profile == PROFILE_3); aom_wb_write_bit(wb, 0); // unused } +#if CONFIG_EXT_QM + aom_wb_write_bit(wb, cm->separate_uv_delta_q); +#endif } #if CONFIG_REFERENCE_BUFFER || CONFIG_OBU