diff options
author | Moonchild <moonchild@palemoon.org> | 2021-03-03 18:48:48 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2021-03-04 00:03:46 +0000 |
commit | 44d2b4a86e3d862eb1b68db3d9a29b9dbf3da746 (patch) | |
tree | 9d9cc4d21c93ae3e1a88ab5c160c3be5f6af0ca9 /media/libaom/src/av1/encoder/av1_quantize.c | |
parent | 353943d1a48086a39ff5f4365b22f8f058d5f66e (diff) | |
download | aura-central-44d2b4a86e3d862eb1b68db3d9a29b9dbf3da746.tar.gz |
Issue mcp-graveyard/UXP%1737 - Import libaom 2.0.2 source
Diffstat (limited to 'media/libaom/src/av1/encoder/av1_quantize.c')
-rw-r--r-- | media/libaom/src/av1/encoder/av1_quantize.c | 451 |
1 files changed, 251 insertions, 200 deletions
diff --git a/media/libaom/src/av1/encoder/av1_quantize.c b/media/libaom/src/av1/encoder/av1_quantize.c index a0a926005..569784a2a 100644 --- a/media/libaom/src/av1/encoder/av1_quantize.c +++ b/media/libaom/src/av1/encoder/av1_quantize.c @@ -41,47 +41,37 @@ static void quantize_fp_helper_c( const int16_t *scan, const int16_t *iscan, const qm_val_t *qm_ptr, const qm_val_t *iqm_ptr, int log_scale) { int i, eob = -1; + const int rounding[2] = { ROUND_POWER_OF_TWO(round_ptr[0], log_scale), + ROUND_POWER_OF_TWO(round_ptr[1], log_scale) }; // TODO(jingning) Decide the need of these arguments after the // quantization process is completed. (void)zbin_ptr; (void)quant_shift_ptr; + (void)iscan; memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr)); memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr)); if (qm_ptr == NULL && iqm_ptr == NULL) { - const int rounding0 = ROUND_POWER_OF_TWO(round_ptr[0], log_scale); - { // rc == 0 - const int coeff = coeff_ptr[0]; - const int coeff_sign = (coeff >> 31); - int64_t abs_coeff = (coeff ^ coeff_sign) - coeff_sign; - if ((abs_coeff << (1 + log_scale)) >= (int32_t)(dequant_ptr[0])) { - abs_coeff = clamp64(abs_coeff + rounding0, INT16_MIN, INT16_MAX); - const int tmp32 = (int)((abs_coeff * quant_ptr[0]) >> (16 - log_scale)); - if (tmp32) { - qcoeff_ptr[0] = (tmp32 ^ coeff_sign) - coeff_sign; - const tran_low_t abs_dqcoeff = (tmp32 * dequant_ptr[0]) >> log_scale; - dqcoeff_ptr[0] = (abs_dqcoeff ^ coeff_sign) - coeff_sign; - eob = 0; - } - } - } - const int rounding1 = ROUND_POWER_OF_TWO(round_ptr[1], log_scale); - const int32_t thresh1 = (int32_t)(dequant_ptr[1]); - for (i = 1; i < n_coeffs; i++) { - const int coeff = coeff_ptr[i]; - const int coeff_sign = (coeff >> 31); + for (i = 0; i < n_coeffs; i++) { + const int rc = scan[i]; + const int32_t thresh = (int32_t)(dequant_ptr[rc != 0]); + const int coeff = coeff_ptr[rc]; + const int coeff_sign = AOMSIGN(coeff); int64_t abs_coeff = (coeff ^ coeff_sign) - coeff_sign; - if ((abs_coeff << (1 + log_scale)) >= thresh1) { - abs_coeff = clamp64(abs_coeff + rounding1, INT16_MIN, INT16_MAX); - const int tmp32 = (int)((abs_coeff * quant_ptr[1]) >> (16 - log_scale)); + int tmp32 = 0; + if ((abs_coeff << (1 + log_scale)) >= thresh) { + abs_coeff = + clamp64(abs_coeff + rounding[rc != 0], INT16_MIN, INT16_MAX); + tmp32 = (int)((abs_coeff * quant_ptr[rc != 0]) >> (16 - log_scale)); if (tmp32) { - qcoeff_ptr[i] = (tmp32 ^ coeff_sign) - coeff_sign; - const tran_low_t abs_dqcoeff = (tmp32 * dequant_ptr[1]) >> log_scale; - dqcoeff_ptr[i] = (abs_dqcoeff ^ coeff_sign) - coeff_sign; - eob = AOMMAX(iscan[i], eob); + qcoeff_ptr[rc] = (tmp32 ^ coeff_sign) - coeff_sign; + const tran_low_t abs_dqcoeff = + (tmp32 * dequant_ptr[rc != 0]) >> log_scale; + dqcoeff_ptr[rc] = (abs_dqcoeff ^ coeff_sign) - coeff_sign; } } + if (tmp32) eob = i; } } else { // Quantization pass: All coefficients with index >= zero_flag are @@ -94,12 +84,12 @@ static void quantize_fp_helper_c( const int dequant = (dequant_ptr[rc != 0] * iwt + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS; - const int coeff_sign = (coeff >> 31); + const int coeff_sign = AOMSIGN(coeff); int64_t abs_coeff = (coeff ^ coeff_sign) - coeff_sign; int tmp32 = 0; if (abs_coeff * wt >= (dequant_ptr[rc != 0] << (AOM_QM_BITS - (1 + log_scale)))) { - abs_coeff += ROUND_POWER_OF_TWO(round_ptr[rc != 0], log_scale); + abs_coeff += rounding[rc != 0]; abs_coeff = clamp64(abs_coeff, INT16_MIN, INT16_MAX); tmp32 = (int)((abs_coeff * wt * quant_ptr[rc != 0]) >> (16 - log_scale + AOM_QM_BITS)); @@ -114,6 +104,7 @@ static void quantize_fp_helper_c( *eob_ptr = eob + 1; } +#if CONFIG_AV1_HIGHBITDEPTH static void highbd_quantize_fp_helper_c( const tran_low_t *coeff_ptr, intptr_t count, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, @@ -141,7 +132,7 @@ static void highbd_quantize_fp_helper_c( const int dequant = (dequant_ptr[rc != 0] * iwt + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS; - const int coeff_sign = (coeff >> 31); + const int coeff_sign = AOMSIGN(coeff); const int64_t abs_coeff = (coeff ^ coeff_sign) - coeff_sign; int abs_qcoeff = 0; if (abs_coeff * wt >= @@ -168,7 +159,7 @@ static void highbd_quantize_fp_helper_c( const int rc = scan[i]; const int coeff = coeff_ptr[rc]; const int rc01 = (rc != 0); - const int coeff_sign = (coeff >> 31); + const int coeff_sign = AOMSIGN(coeff); const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; const int log_scaled_round = log_scaled_round_arr[rc01]; if ((abs_coeff << (1 + log_scale)) >= dequant_ptr[rc01]) { @@ -188,6 +179,7 @@ static void highbd_quantize_fp_helper_c( } *eob_ptr = eob + 1; } +#endif // CONFIG_AV1_HIGHBITDEPTH void av1_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, const int16_t *zbin_ptr, const int16_t *round_ptr, @@ -200,6 +192,35 @@ void av1_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, eob_ptr, scan, iscan, NULL, NULL, 0); } +void av1_quantize_lp_c(const int16_t *coeff_ptr, intptr_t n_coeffs, + const int16_t *round_ptr, const int16_t *quant_ptr, + int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr, + const int16_t *dequant_ptr, uint16_t *eob_ptr, + const int16_t *scan) { + int eob = -1; + + memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr)); + memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr)); + + // Quantization pass: All coefficients with index >= zero_flag are + // skippable. Note: zero_flag can be zero. + for (int i = 0; i < n_coeffs; i++) { + const int rc = scan[i]; + const int coeff = coeff_ptr[rc]; + const int coeff_sign = AOMSIGN(coeff); + const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; + + int tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX); + tmp = (tmp * quant_ptr[rc != 0]) >> 16; + + qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign; + dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0]; + + if (tmp) eob = i; + } + *eob_ptr = eob + 1; +} + void av1_quantize_fp_32x32_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, @@ -238,19 +259,10 @@ void av1_quantize_fp_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs, } else { switch (qparam->log_scale) { case 0: - if (n_coeffs < 16) { - // TODO(jingning): Need SIMD implementation for smaller block size - // quantization. - quantize_fp_helper_c( - coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, - p->quant_fp_QTX, p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, - p->dequant_QTX, eob_ptr, sc->scan, sc->iscan, NULL, NULL, 0); - } else { - av1_quantize_fp(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, - p->quant_fp_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan); - } + av1_quantize_fp(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, + p->quant_fp_QTX, p->quant_shift_QTX, qcoeff_ptr, + dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, + sc->iscan); break; case 1: av1_quantize_fp_32x32(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, @@ -275,32 +287,65 @@ void av1_quantize_b_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs, const SCAN_ORDER *sc, const QUANT_PARAM *qparam) { const qm_val_t *qm_ptr = qparam->qmatrix; const qm_val_t *iqm_ptr = qparam->iqmatrix; - if (qm_ptr != NULL && iqm_ptr != NULL) { - quantize_b_helper_c(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, - p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + if (qparam->use_quant_b_adapt) { + // TODO(sarahparker) These quantize_b optimizations need SIMD + // implementations + if (qm_ptr != NULL && iqm_ptr != NULL) { + aom_quantize_b_adaptive_helper_c( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, + sc->scan, sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + } else { + switch (qparam->log_scale) { + case 0: + aom_quantize_b_adaptive(coeff_ptr, n_coeffs, p->zbin_QTX, + p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, + p->dequant_QTX, eob_ptr, sc->scan, sc->iscan); + break; + case 1: + aom_quantize_b_32x32_adaptive( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + case 2: + aom_quantize_b_64x64_adaptive( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + default: assert(0); + } + } } else { - switch (qparam->log_scale) { - case 0: - aom_quantize_b(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, - p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan); - break; - case 1: - aom_quantize_b_32x32(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, - p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan); - break; - case 2: - aom_quantize_b_64x64(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, - p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan); - break; - default: assert(0); + if (qm_ptr != NULL && iqm_ptr != NULL) { + aom_quantize_b_helper_c(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, + p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, + dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, + sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + } else { + switch (qparam->log_scale) { + case 0: + aom_quantize_b(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, + p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, + dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, + sc->iscan); + break; + case 1: + aom_quantize_b_32x32(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, + p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, + dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, + sc->iscan); + break; + case 2: + aom_quantize_b_64x64(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, + p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, + dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, + sc->iscan); + break; + default: assert(0); + } } } } @@ -313,7 +358,7 @@ static void quantize_dc(const tran_low_t *coeff_ptr, int n_coeffs, const qm_val_t *iqm_ptr, const int log_scale) { const int rc = 0; const int coeff = coeff_ptr[rc]; - const int coeff_sign = (coeff >> 31); + const int coeff_sign = AOMSIGN(coeff); const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; int64_t tmp; int eob = -1; @@ -353,6 +398,7 @@ void av1_quantize_dc_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs, eob_ptr, qm_ptr, iqm_ptr, qparam->log_scale); } +#if CONFIG_AV1_HIGHBITDEPTH void av1_highbd_quantize_fp_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs, const MACROBLOCK_PLANE *p, tran_low_t *qcoeff_ptr, @@ -367,15 +413,6 @@ void av1_highbd_quantize_fp_facade(const tran_low_t *coeff_ptr, p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); } else { - if (n_coeffs < 16) { - // TODO(jingning): Need SIMD implementation for smaller block size - // quantization. - av1_highbd_quantize_fp_c( - coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, p->quant_fp_QTX, - p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, - sc->scan, sc->iscan, qparam->log_scale); - return; - } av1_highbd_quantize_fp(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_fp_QTX, p->quant_fp_QTX, p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, @@ -391,41 +428,63 @@ void av1_highbd_quantize_b_facade(const tran_low_t *coeff_ptr, const QUANT_PARAM *qparam) { const qm_val_t *qm_ptr = qparam->qmatrix; const qm_val_t *iqm_ptr = qparam->iqmatrix; - if (qm_ptr != NULL && iqm_ptr != NULL) { - highbd_quantize_b_helper_c(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, - p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, - dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, - sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + if (qparam->use_quant_b_adapt) { + if (qm_ptr != NULL && iqm_ptr != NULL) { + aom_highbd_quantize_b_adaptive_helper_c( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, + sc->scan, sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + } else { + switch (qparam->log_scale) { + case 0: + aom_highbd_quantize_b_adaptive( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + case 1: + aom_highbd_quantize_b_32x32_adaptive( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + case 2: + aom_highbd_quantize_b_64x64_adaptive( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + default: assert(0); + } + } } else { - switch (qparam->log_scale) { - case 0: - if (LIKELY(n_coeffs >= 8)) { + if (qm_ptr != NULL && iqm_ptr != NULL) { + aom_highbd_quantize_b_helper_c( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, + sc->scan, sc->iscan, qm_ptr, iqm_ptr, qparam->log_scale); + } else { + switch (qparam->log_scale) { + case 0: aom_highbd_quantize_b(coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, eob_ptr, sc->scan, sc->iscan); - } else { - // TODO(luoyi): Need SIMD (e.g. sse2) for smaller block size - // quantization - aom_highbd_quantize_b_c(coeff_ptr, n_coeffs, p->zbin_QTX, - p->round_QTX, p->quant_QTX, - p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, - p->dequant_QTX, eob_ptr, sc->scan, sc->iscan); - } - break; - case 1: - aom_highbd_quantize_b_32x32( - coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, - p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, - eob_ptr, sc->scan, sc->iscan); - break; - case 2: - aom_highbd_quantize_b_64x64( - coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, - p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, - eob_ptr, sc->scan, sc->iscan); - break; - default: assert(0); + break; + case 1: + aom_highbd_quantize_b_32x32( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + case 2: + aom_highbd_quantize_b_64x64( + coeff_ptr, n_coeffs, p->zbin_QTX, p->round_QTX, p->quant_QTX, + p->quant_shift_QTX, qcoeff_ptr, dqcoeff_ptr, p->dequant_QTX, + eob_ptr, sc->scan, sc->iscan); + break; + default: assert(0); + } } } } @@ -444,7 +503,7 @@ static INLINE void highbd_quantize_dc( const qm_val_t wt = qm_ptr != NULL ? qm_ptr[0] : (1 << AOM_QM_BITS); const qm_val_t iwt = iqm_ptr != NULL ? iqm_ptr[0] : (1 << AOM_QM_BITS); const int coeff = coeff_ptr[0]; - const int coeff_sign = (coeff >> 31); + const int coeff_sign = AOMSIGN(coeff); const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; const int64_t tmp = abs_coeff + ROUND_POWER_OF_TWO(round_ptr[0], log_scale); const int64_t tmpw = tmp * wt; @@ -492,6 +551,7 @@ void av1_highbd_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t count, dequant_ptr, eob_ptr, scan, iscan, NULL, NULL, log_scale); } +#endif // CONFIG_AV1_HIGHBITDEPTH static void invert_quant(int16_t *quant, int16_t *shift, int d) { uint32_t t; @@ -504,7 +564,7 @@ static void invert_quant(int16_t *quant, int16_t *shift, int d) { } static int get_qzbin_factor(int q, aom_bit_depth_t bit_depth) { - const int quant = av1_dc_quant_Q3(q, 0, bit_depth); + const int quant = av1_dc_quant_QTX(q, 0, bit_depth); switch (bit_depth) { case AOM_BITS_8: return q == 0 ? 64 : (quant < 148 ? 84 : 80); case AOM_BITS_10: return q == 0 ? 64 : (quant < 592 ? 84 : 80); @@ -519,7 +579,7 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, int u_dc_delta_q, int u_ac_delta_q, int v_dc_delta_q, int v_ac_delta_q, QUANTS *const quants, Dequants *const deq) { - int i, q, quant_Q3, quant_QTX; + int i, q, quant_QTX; for (q = 0; q < QINDEX_RANGE; q++) { const int qzbin_factor = get_qzbin_factor(q, bit_depth); @@ -527,9 +587,6 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, for (i = 0; i < 2; ++i) { int qrounding_factor_fp = 64; - // y quantizer setup with original coeff shift of Q3 - quant_Q3 = i == 0 ? av1_dc_quant_Q3(q, y_dc_delta_q, bit_depth) - : av1_ac_quant_Q3(q, 0, bit_depth); // y quantizer with TX scale quant_QTX = i == 0 ? av1_dc_quant_QTX(q, y_dc_delta_q, bit_depth) : av1_ac_quant_QTX(q, 0, bit_depth); @@ -540,11 +597,7 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->y_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant_QTX, 7); quants->y_round[q][i] = (qrounding_factor * quant_QTX) >> 7; deq->y_dequant_QTX[q][i] = quant_QTX; - deq->y_dequant_Q3[q][i] = quant_Q3; - // u quantizer setup with original coeff shift of Q3 - quant_Q3 = i == 0 ? av1_dc_quant_Q3(q, u_dc_delta_q, bit_depth) - : av1_ac_quant_Q3(q, u_ac_delta_q, bit_depth); // u quantizer with TX scale quant_QTX = i == 0 ? av1_dc_quant_QTX(q, u_dc_delta_q, bit_depth) : av1_ac_quant_QTX(q, u_ac_delta_q, bit_depth); @@ -555,11 +608,7 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->u_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant_QTX, 7); quants->u_round[q][i] = (qrounding_factor * quant_QTX) >> 7; deq->u_dequant_QTX[q][i] = quant_QTX; - deq->u_dequant_Q3[q][i] = quant_Q3; - // v quantizer setup with original coeff shift of Q3 - quant_Q3 = i == 0 ? av1_dc_quant_Q3(q, v_dc_delta_q, bit_depth) - : av1_ac_quant_Q3(q, v_ac_delta_q, bit_depth); // v quantizer with TX scale quant_QTX = i == 0 ? av1_dc_quant_QTX(q, v_dc_delta_q, bit_depth) : av1_ac_quant_QTX(q, v_ac_delta_q, bit_depth); @@ -570,7 +619,6 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->v_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant_QTX, 7); quants->v_round[q][i] = (qrounding_factor * quant_QTX) >> 7; deq->v_dequant_QTX[q][i] = quant_QTX; - deq->v_dequant_Q3[q][i] = quant_Q3; } for (i = 2; i < 8; i++) { // 8: SIMD width @@ -581,7 +629,6 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->y_zbin[q][i] = quants->y_zbin[q][1]; quants->y_round[q][i] = quants->y_round[q][1]; deq->y_dequant_QTX[q][i] = deq->y_dequant_QTX[q][1]; - deq->y_dequant_Q3[q][i] = deq->y_dequant_Q3[q][1]; quants->u_quant[q][i] = quants->u_quant[q][1]; quants->u_quant_fp[q][i] = quants->u_quant_fp[q][1]; @@ -590,7 +637,6 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->u_zbin[q][i] = quants->u_zbin[q][1]; quants->u_round[q][i] = quants->u_round[q][1]; deq->u_dequant_QTX[q][i] = deq->u_dequant_QTX[q][1]; - deq->u_dequant_Q3[q][i] = deq->u_dequant_Q3[q][1]; quants->v_quant[q][i] = quants->u_quant[q][1]; quants->v_quant_fp[q][i] = quants->v_quant_fp[q][1]; quants->v_round_fp[q][i] = quants->v_round_fp[q][1]; @@ -598,88 +644,88 @@ void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, quants->v_zbin[q][i] = quants->v_zbin[q][1]; quants->v_round[q][i] = quants->v_round[q][1]; deq->v_dequant_QTX[q][i] = deq->v_dequant_QTX[q][1]; - deq->v_dequant_Q3[q][i] = deq->v_dequant_Q3[q][1]; } } } -void av1_init_quantizer(AV1_COMP *cpi) { - AV1_COMMON *const cm = &cpi->common; - QUANTS *const quants = &cpi->quants; - Dequants *const dequants = &cpi->dequants; - av1_build_quantizer(cm->seq_params.bit_depth, cm->y_dc_delta_q, - cm->u_dc_delta_q, cm->u_ac_delta_q, cm->v_dc_delta_q, - cm->v_ac_delta_q, quants, dequants); +void av1_init_quantizer(EncQuantDequantParams *const enc_quant_dequant_params, + const CommonQuantParams *quant_params, + aom_bit_depth_t bit_depth) { + QUANTS *const quants = &enc_quant_dequant_params->quants; + Dequants *const dequants = &enc_quant_dequant_params->dequants; + av1_build_quantizer(bit_depth, quant_params->y_dc_delta_q, + quant_params->u_dc_delta_q, quant_params->u_ac_delta_q, + quant_params->v_dc_delta_q, quant_params->v_ac_delta_q, + quants, dequants); } void av1_init_plane_quantizers(const AV1_COMP *cpi, MACROBLOCK *x, int segment_id) { const AV1_COMMON *const cm = &cpi->common; + const CommonQuantParams *const quant_params = &cm->quant_params; MACROBLOCKD *const xd = &x->e_mbd; - const QUANTS *const quants = &cpi->quants; - - int current_qindex = AOMMAX( - 0, AOMMIN(QINDEX_RANGE - 1, cpi->oxcf.deltaq_mode != NO_DELTA_Q - ? cm->base_qindex + xd->delta_qindex - : cm->base_qindex)); + const QUANTS *const quants = &cpi->enc_quant_dequant_params.quants; + const Dequants *const dequants = &cpi->enc_quant_dequant_params.dequants; + + const int current_qindex = + AOMMAX(0, AOMMIN(QINDEX_RANGE - 1, + cm->delta_q_info.delta_q_present_flag + ? quant_params->base_qindex + xd->delta_qindex + : quant_params->base_qindex)); const int qindex = av1_get_qindex(&cm->seg, segment_id, current_qindex); - const int rdmult = av1_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q); - int qmlevel = (xd->lossless[segment_id] || cm->using_qmatrix == 0) - ? NUM_QM_LEVELS - 1 - : cm->qm_y; + const int rdmult = + av1_compute_rd_mult(cpi, qindex + quant_params->y_dc_delta_q); + const int use_qmatrix = av1_use_qmatrix(quant_params, xd, segment_id); // Y + const int qmlevel_y = + use_qmatrix ? quant_params->qmatrix_level_y : NUM_QM_LEVELS - 1; x->plane[0].quant_QTX = quants->y_quant[qindex]; x->plane[0].quant_fp_QTX = quants->y_quant_fp[qindex]; x->plane[0].round_fp_QTX = quants->y_round_fp[qindex]; x->plane[0].quant_shift_QTX = quants->y_quant_shift[qindex]; x->plane[0].zbin_QTX = quants->y_zbin[qindex]; x->plane[0].round_QTX = quants->y_round[qindex]; - x->plane[0].dequant_QTX = cpi->dequants.y_dequant_QTX[qindex]; - memcpy(&xd->plane[0].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel][0], - sizeof(cm->gqmatrix[qmlevel][0])); - memcpy(&xd->plane[0].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel][0], - sizeof(cm->giqmatrix[qmlevel][0])); - xd->plane[0].dequant_Q3 = cpi->dequants.y_dequant_Q3[qindex]; + x->plane[0].dequant_QTX = dequants->y_dequant_QTX[qindex]; + memcpy(&xd->plane[0].seg_qmatrix[segment_id], + quant_params->gqmatrix[qmlevel_y][0], + sizeof(quant_params->gqmatrix[qmlevel_y][0])); + memcpy(&xd->plane[0].seg_iqmatrix[segment_id], + quant_params->giqmatrix[qmlevel_y][0], + sizeof(quant_params->giqmatrix[qmlevel_y][0])); // U - qmlevel = (xd->lossless[segment_id] || cm->using_qmatrix == 0) - ? NUM_QM_LEVELS - 1 - : cm->qm_u; - { - x->plane[1].quant_QTX = quants->u_quant[qindex]; - x->plane[1].quant_fp_QTX = quants->u_quant_fp[qindex]; - x->plane[1].round_fp_QTX = quants->u_round_fp[qindex]; - x->plane[1].quant_shift_QTX = quants->u_quant_shift[qindex]; - x->plane[1].zbin_QTX = quants->u_zbin[qindex]; - x->plane[1].round_QTX = quants->u_round[qindex]; - x->plane[1].dequant_QTX = cpi->dequants.u_dequant_QTX[qindex]; - memcpy(&xd->plane[1].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel][1], - sizeof(cm->gqmatrix[qmlevel][1])); - memcpy(&xd->plane[1].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel][1], - sizeof(cm->giqmatrix[qmlevel][1])); - x->plane[1].dequant_QTX = cpi->dequants.u_dequant_QTX[qindex]; - xd->plane[1].dequant_Q3 = cpi->dequants.u_dequant_Q3[qindex]; - } + const int qmlevel_u = + use_qmatrix ? quant_params->qmatrix_level_u : NUM_QM_LEVELS - 1; + x->plane[1].quant_QTX = quants->u_quant[qindex]; + x->plane[1].quant_fp_QTX = quants->u_quant_fp[qindex]; + x->plane[1].round_fp_QTX = quants->u_round_fp[qindex]; + x->plane[1].quant_shift_QTX = quants->u_quant_shift[qindex]; + x->plane[1].zbin_QTX = quants->u_zbin[qindex]; + x->plane[1].round_QTX = quants->u_round[qindex]; + x->plane[1].dequant_QTX = dequants->u_dequant_QTX[qindex]; + memcpy(&xd->plane[1].seg_qmatrix[segment_id], + quant_params->gqmatrix[qmlevel_u][1], + sizeof(quant_params->gqmatrix[qmlevel_u][1])); + memcpy(&xd->plane[1].seg_iqmatrix[segment_id], + quant_params->giqmatrix[qmlevel_u][1], + sizeof(quant_params->giqmatrix[qmlevel_u][1])); // V - qmlevel = (xd->lossless[segment_id] || cm->using_qmatrix == 0) - ? NUM_QM_LEVELS - 1 - : cm->qm_v; - { - x->plane[2].quant_QTX = quants->v_quant[qindex]; - x->plane[2].quant_fp_QTX = quants->v_quant_fp[qindex]; - x->plane[2].round_fp_QTX = quants->v_round_fp[qindex]; - x->plane[2].quant_shift_QTX = quants->v_quant_shift[qindex]; - x->plane[2].zbin_QTX = quants->v_zbin[qindex]; - x->plane[2].round_QTX = quants->v_round[qindex]; - x->plane[2].dequant_QTX = cpi->dequants.v_dequant_QTX[qindex]; - memcpy(&xd->plane[2].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel][2], - sizeof(cm->gqmatrix[qmlevel][2])); - memcpy(&xd->plane[2].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel][2], - sizeof(cm->giqmatrix[qmlevel][2])); - x->plane[2].dequant_QTX = cpi->dequants.v_dequant_QTX[qindex]; - xd->plane[2].dequant_Q3 = cpi->dequants.v_dequant_Q3[qindex]; - } + const int qmlevel_v = + use_qmatrix ? quant_params->qmatrix_level_v : NUM_QM_LEVELS - 1; + x->plane[2].quant_QTX = quants->v_quant[qindex]; + x->plane[2].quant_fp_QTX = quants->v_quant_fp[qindex]; + x->plane[2].round_fp_QTX = quants->v_round_fp[qindex]; + x->plane[2].quant_shift_QTX = quants->v_quant_shift[qindex]; + x->plane[2].zbin_QTX = quants->v_zbin[qindex]; + x->plane[2].round_QTX = quants->v_round[qindex]; + x->plane[2].dequant_QTX = dequants->v_dequant_QTX[qindex]; + memcpy(&xd->plane[2].seg_qmatrix[segment_id], + quant_params->gqmatrix[qmlevel_v][2], + sizeof(quant_params->gqmatrix[qmlevel_v][2])); + memcpy(&xd->plane[2].seg_iqmatrix[segment_id], + quant_params->giqmatrix[qmlevel_v][2], + sizeof(quant_params->giqmatrix[qmlevel_v][2])); x->skip_block = segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP); x->qindex = qindex; @@ -694,24 +740,29 @@ void av1_frame_init_quantizer(AV1_COMP *cpi) { av1_init_plane_quantizers(cpi, x, xd->mi[0]->segment_id); } -void av1_set_quantizer(AV1_COMMON *cm, int q) { +void av1_set_quantizer(AV1_COMMON *const cm, int min_qmlevel, int max_qmlevel, + int q) { // quantizer has to be reinitialized with av1_init_quantizer() if any // delta_q changes. - cm->base_qindex = AOMMAX(cm->delta_q_present_flag, q); - cm->y_dc_delta_q = 0; - cm->u_dc_delta_q = 0; - cm->u_ac_delta_q = 0; - cm->v_dc_delta_q = 0; - cm->v_ac_delta_q = 0; - cm->qm_y = aom_get_qmlevel(cm->base_qindex, cm->min_qmlevel, cm->max_qmlevel); - cm->qm_u = aom_get_qmlevel(cm->base_qindex + cm->u_ac_delta_q, - cm->min_qmlevel, cm->max_qmlevel); + CommonQuantParams *quant_params = &cm->quant_params; + quant_params->base_qindex = AOMMAX(cm->delta_q_info.delta_q_present_flag, q); + quant_params->y_dc_delta_q = 0; + quant_params->u_dc_delta_q = 0; + quant_params->u_ac_delta_q = 0; + quant_params->v_dc_delta_q = 0; + quant_params->v_ac_delta_q = 0; + quant_params->qmatrix_level_y = + aom_get_qmlevel(quant_params->base_qindex, min_qmlevel, max_qmlevel); + quant_params->qmatrix_level_u = + aom_get_qmlevel(quant_params->base_qindex + quant_params->u_ac_delta_q, + min_qmlevel, max_qmlevel); if (!cm->seq_params.separate_uv_delta_q) - cm->qm_v = cm->qm_u; + quant_params->qmatrix_level_v = quant_params->qmatrix_level_u; else - cm->qm_v = aom_get_qmlevel(cm->base_qindex + cm->v_ac_delta_q, - cm->min_qmlevel, cm->max_qmlevel); + quant_params->qmatrix_level_v = + aom_get_qmlevel(quant_params->base_qindex + quant_params->v_ac_delta_q, + min_qmlevel, max_qmlevel); } // Table that converts 0-63 Q-range values passed in outside to the Qindex |