summaryrefslogtreecommitdiff
path: root/media/libaom/src/av1/encoder/av1_quantize.c
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2021-03-03 18:48:48 +0000
committerMoonchild <moonchild@palemoon.org>2021-03-04 00:03:46 +0000
commit44d2b4a86e3d862eb1b68db3d9a29b9dbf3da746 (patch)
tree9d9cc4d21c93ae3e1a88ab5c160c3be5f6af0ca9 /media/libaom/src/av1/encoder/av1_quantize.c
parent353943d1a48086a39ff5f4365b22f8f058d5f66e (diff)
downloadaura-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.c451
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