AOM_QM: use SIMD for flat matrices and re-enable tests.
When AOM_QM is enabled, by default quantization matrices are
flat unless enabled with --enable-qm=1. Re-use existing SIMD
functions when a flat matrix is used, so that there is no
speed deficit when AOM_QM is enabled.
SIMD for the non-flat case is TBC.
Change-Id: I1bb8da70d3dd5858dac15099610ddf61662e3d0d
diff --git a/av1/common/quant_common.c b/av1/common/quant_common.c
index 5210ba8..2c07941 100644
--- a/av1/common/quant_common.c
+++ b/av1/common/quant_common.c
@@ -368,12 +368,17 @@
current = 0;
for (t = 0; t < TX_SIZES_ALL; ++t) {
size = tx_size_2d[t];
- cm->gqmatrix[q][c][f][t] = &wt_matrix_ref[AOMMIN(
- NUM_QM_LEVELS - 1, f == 0 ? q + DEFAULT_QM_INTER_OFFSET : q)][c]
- [current];
- cm->giqmatrix[q][c][f][t] = &iwt_matrix_ref[AOMMIN(
- NUM_QM_LEVELS - 1, f == 0 ? q + DEFAULT_QM_INTER_OFFSET : q)][c]
+ if (q == NUM_QM_LEVELS - 1) {
+ cm->gqmatrix[q][c][f][t] = NULL;
+ cm->giqmatrix[q][c][f][t] = NULL;
+ } else {
+ cm->gqmatrix[q][c][f][t] = &wt_matrix_ref[AOMMIN(
+ NUM_QM_LEVELS - 1, f == 0 ? q + DEFAULT_QM_INTER_OFFSET : q)][c]
[current];
+ cm->giqmatrix[q][c][f][t] = &iwt_matrix_ref[AOMMIN(
+ NUM_QM_LEVELS - 1, f == 0 ? q + DEFAULT_QM_INTER_OFFSET : q)][c]
+ [current];
+ }
current += size;
}
}
diff --git a/av1/decoder/detokenize.c b/av1/decoder/detokenize.c
index 461494d..3aefc9f 100644
--- a/av1/decoder/detokenize.c
+++ b/av1/decoder/detokenize.c
@@ -195,7 +195,7 @@
#else
#if CONFIG_AOM_QM
// Apply quant matrix only for 2D transforms
- if (IS_2D_TRANSFORM(tx_type))
+ if (IS_2D_TRANSFORM(tx_type) && iqmatrix != NULL)
dqv = ((iqmatrix[scan[c]] * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >>
AOM_QM_BITS;
#endif
diff --git a/av1/encoder/av1_quantize.c b/av1/encoder/av1_quantize.c
index b44e06f..0265f1f 100644
--- a/av1/encoder/av1_quantize.c
+++ b/av1/encoder/av1_quantize.c
@@ -577,7 +577,7 @@
#if CONFIG_AOM_QM
const qm_val_t *qm_ptr = qparam->qmatrix;
const qm_val_t *iqm_ptr = qparam->iqmatrix;
- if (1 /*qm_ptr != NULL || iqm_ptr != NULL*/) {
+ if (qm_ptr != NULL && iqm_ptr != NULL) {
quantize_fp_helper_c(coeff_ptr, n_coeffs, skip_block, p->zbin, p->round_fp,
p->quant_fp, p->quant_shift, qcoeff_ptr, dqcoeff_ptr,
pd->dequant, eob_ptr, sc->scan, sc->iscan, qm_ptr,
@@ -630,7 +630,7 @@
#if CONFIG_AOM_QM
const qm_val_t *qm_ptr = qparam->qmatrix;
const qm_val_t *iqm_ptr = qparam->iqmatrix;
- if (1 /*qm_ptr != NULL && iqm_ptr != NULL*/) {
+ if (qm_ptr != NULL && iqm_ptr != NULL) {
quantize_b_helper_c(coeff_ptr, n_coeffs, skip_block, p->zbin, p->round,
p->quant, p->quant_shift, qcoeff_ptr, dqcoeff_ptr,
pd->dequant, eob_ptr, sc->scan, sc->iscan, qm_ptr,
@@ -845,7 +845,7 @@
#if CONFIG_AOM_QM
const qm_val_t *qm_ptr = qparam->qmatrix;
const qm_val_t *iqm_ptr = qparam->iqmatrix;
- if (1 /*qm_ptr != NULL && iqm_ptr != NULL*/) {
+ if (qm_ptr != NULL && iqm_ptr != NULL) {
highbd_quantize_fp_helper_c(
coeff_ptr, n_coeffs, skip_block, p->zbin, p->round_fp, p->quant_fp,
p->quant_shift, qcoeff_ptr, dqcoeff_ptr, pd->dequant, eob_ptr, sc->scan,
@@ -884,7 +884,7 @@
#if CONFIG_AOM_QM
const qm_val_t *qm_ptr = qparam->qmatrix;
const qm_val_t *iqm_ptr = qparam->iqmatrix;
- if (1 /*qm_ptr != NULL && iqm_ptr != NULL*/) {
+ if (qm_ptr != NULL && iqm_ptr != NULL) {
highbd_quantize_b_helper_c(coeff_ptr, n_coeffs, skip_block, p->zbin,
p->round, p->quant, p->quant_shift, qcoeff_ptr,
dqcoeff_ptr, pd->dequant, eob_ptr, sc->scan,
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index f2bb213..efb4763 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -214,9 +214,12 @@
const int x_a = x - 2 * sz - 1;
int dqv;
#if CONFIG_AOM_QM
- int iwt = iqmatrix[rc];
+ int iwt;
dqv = dequant_ptr[rc != 0];
- dqv = ((iwt * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS;
+ if (iqmatrix != NULL) {
+ iwt = iqmatrix[rc];
+ dqv = ((iwt * (int)dqv) + (1 << (AOM_QM_BITS - 1))) >> AOM_QM_BITS;
+ }
#else
dqv = dequant_ptr[rc != 0];
#endif
diff --git a/test/av1_quantize_test.cc b/test/av1_quantize_test.cc
index 239b041..85a5577 100644
--- a/test/av1_quantize_test.cc
+++ b/test/av1_quantize_test.cc
@@ -195,7 +195,6 @@
TEST_P(AV1QuantizeTest, EobVerify) { RunEobTest(); }
#if HAVE_SSE4_1
-#if !CONFIG_AOM_QM
const QuantizeFuncParams qfps[4] = {
QuantizeFuncParams(av1_highbd_quantize_fp_sse4_1, &av1_highbd_quantize_fp_c,
16),
@@ -208,6 +207,5 @@
};
INSTANTIATE_TEST_CASE_P(SSE4_1, AV1QuantizeTest, ::testing::ValuesIn(qfps));
-#endif // !CONFIG_AOM_QM
#endif // HAVE_SSE4_1
} // namespace
diff --git a/test/test.mk b/test/test.mk
index 4132e4f..7292575 100644
--- a/test/test.mk
+++ b/test/test.mk
@@ -163,11 +163,9 @@
#LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_quantize_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += subtract_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += arf_freq_test.cc
-ifneq ($(CONFIG_AOM_QM), yes)
ifneq ($(CONFIG_NEW_QUANT), yes)
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += quantize_func_test.cc
endif
-endif
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += block_error_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_inv_txfm_test.cc