Introduce av1_use_qmatrix() function.
This is to refactor some common code.
BUG=aomedia:2610
Change-Id: Ida5c60d52b791bd08a78811df23fa812c38da0dc
diff --git a/av1/common/quant_common.c b/av1/common/quant_common.c
index 475da1b..327948c 100644
--- a/av1/common/quant_common.c
+++ b/av1/common/quant_common.c
@@ -225,6 +225,12 @@
}
}
+bool av1_use_qmatrix(const AV1_COMMON *cm, const MACROBLOCKD *const xd,
+ int segment_id) {
+ // True if we are using Q matrix and this is not a lossless segment.
+ return cm->using_qmatrix && !xd->lossless[segment_id];
+}
+
const qm_val_t *av1_iqmatrix(AV1_COMMON *cm, int qmlevel, int plane,
TX_SIZE tx_size) {
assert(cm->giqmatrix[qmlevel][plane][tx_size] != NULL ||
diff --git a/av1/common/quant_common.h b/av1/common/quant_common.h
index 050dd26..7556669 100644
--- a/av1/common/quant_common.h
+++ b/av1/common/quant_common.h
@@ -12,6 +12,7 @@
#ifndef AOM_AV1_COMMON_QUANT_COMMON_H_
#define AOM_AV1_COMMON_QUANT_COMMON_H_
+#include <stdbool.h>
#include "aom/aom_codec.h"
#include "av1/common/seg_common.h"
#include "av1/common/enums.h"
@@ -37,12 +38,18 @@
#define DEFAULT_QM_LAST 9
struct AV1Common;
+struct macroblockd;
int16_t av1_dc_quant_QTX(int qindex, int delta, aom_bit_depth_t bit_depth);
int16_t av1_ac_quant_QTX(int qindex, int delta, aom_bit_depth_t bit_depth);
int av1_get_qindex(const struct segmentation *seg, int segment_id,
int base_qindex);
+
+// Returns true if we should use quantization matrix.
+bool av1_use_qmatrix(const struct AV1Common *cm,
+ const struct macroblockd *const xd, int segment_id);
+
// Reduce the large number of quantizers to a smaller number of levels for which
// different matrices may be defined
static INLINE int aom_get_qmlevel(int qindex, int first, int last) {
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 1edc98e..75f88be 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2079,7 +2079,6 @@
static AOM_INLINE void setup_segmentation_dequant(AV1_COMMON *const cm,
MACROBLOCKD *const xd) {
const int bit_depth = cm->seq_params.bit_depth;
- const int using_qm = cm->using_qmatrix;
// When segmentation is disabled, only the first value is used. The
// remaining are don't cares.
const int max_segments = cm->seg.enabled ? MAX_SEGMENTS : 1;
@@ -2096,20 +2095,20 @@
av1_dc_quant_QTX(qindex, cm->v_dc_delta_q, bit_depth);
cm->v_dequant_QTX[i][1] =
av1_ac_quant_QTX(qindex, cm->v_ac_delta_q, bit_depth);
- const int lossless = xd->lossless[i];
+ const int use_qmatrix = av1_use_qmatrix(cm, xd, i);
// NB: depends on base index so there is only 1 set per frame
// No quant weighting when lossless or signalled not using QM
- int qmlevel = (lossless || using_qm == 0) ? NUM_QM_LEVELS - 1 : cm->qm_y;
+ const int qmlevel_y = use_qmatrix ? cm->qm_y : NUM_QM_LEVELS - 1;
for (int j = 0; j < TX_SIZES_ALL; ++j) {
- cm->y_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel, AOM_PLANE_Y, j);
+ cm->y_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel_y, AOM_PLANE_Y, j);
}
- qmlevel = (lossless || using_qm == 0) ? NUM_QM_LEVELS - 1 : cm->qm_u;
+ const int qmlevel_u = use_qmatrix ? cm->qm_u : NUM_QM_LEVELS - 1;
for (int j = 0; j < TX_SIZES_ALL; ++j) {
- cm->u_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel, AOM_PLANE_U, j);
+ cm->u_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel_u, AOM_PLANE_U, j);
}
- qmlevel = (lossless || using_qm == 0) ? NUM_QM_LEVELS - 1 : cm->qm_v;
+ const int qmlevel_v = use_qmatrix ? cm->qm_v : NUM_QM_LEVELS - 1;
for (int j = 0; j < TX_SIZES_ALL; ++j) {
- cm->v_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel, AOM_PLANE_V, j);
+ cm->v_iqmatrix[i][j] = av1_iqmatrix(cm, qmlevel_v, AOM_PLANE_V, j);
}
}
}
diff --git a/av1/encoder/av1_quantize.c b/av1/encoder/av1_quantize.c
index 9f19b6c..bf649d2 100644
--- a/av1/encoder/av1_quantize.c
+++ b/av1/encoder/av1_quantize.c
@@ -663,17 +663,16 @@
MACROBLOCKD *const xd = &x->e_mbd;
const QUANTS *const quants = &cpi->quants;
- int current_qindex = AOMMAX(
+ const int current_qindex = AOMMAX(
0, AOMMIN(QINDEX_RANGE - 1, cm->delta_q_info.delta_q_present_flag
? cm->base_qindex + xd->delta_qindex
: cm->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 use_qmatrix = av1_use_qmatrix(cm, xd, segment_id);
// Y
+ const int qmlevel_y = use_qmatrix ? cm->qm_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];
@@ -681,45 +680,37 @@
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]));
+ memcpy(&xd->plane[0].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel_y][0],
+ sizeof(cm->gqmatrix[qmlevel_y][0]));
+ memcpy(&xd->plane[0].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel_y][0],
+ sizeof(cm->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]));
- }
+ const int qmlevel_u = use_qmatrix ? cm->qm_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 = cpi->dequants.u_dequant_QTX[qindex];
+ memcpy(&xd->plane[1].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel_u][1],
+ sizeof(cm->gqmatrix[qmlevel_u][1]));
+ memcpy(&xd->plane[1].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel_u][1],
+ sizeof(cm->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]));
- }
+ const int qmlevel_v = use_qmatrix ? cm->qm_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 = cpi->dequants.v_dequant_QTX[qindex];
+ memcpy(&xd->plane[2].seg_qmatrix[segment_id], cm->gqmatrix[qmlevel_v][2],
+ sizeof(cm->gqmatrix[qmlevel_v][2]));
+ memcpy(&xd->plane[2].seg_iqmatrix[segment_id], cm->giqmatrix[qmlevel_v][2],
+ sizeof(cm->giqmatrix[qmlevel_v][2]));
x->skip_block = segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP);
x->qindex = qindex;
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c
index 21560a8..f65509d9 100644
--- a/av1/encoder/tx_search.c
+++ b/av1/encoder/tx_search.c
@@ -2202,13 +2202,12 @@
: AV1_XFORM_QUANT_FP)
: AV1_XFORM_QUANT_FP,
cpi->use_quant_b_adapt, &quant_param);
- int use_qm = !(xd->lossless[mbmi->segment_id] || cm->using_qmatrix == 0);
for (int idx = 0; idx < TX_TYPES; ++idx) {
const TX_TYPE tx_type = (TX_TYPE)txk_map[idx];
if (!(allowed_tx_mask & (1 << tx_type))) continue;
txfm_param.tx_type = tx_type;
- if (use_qm) {
+ if (av1_use_qmatrix(cm, xd, mbmi->segment_id)) {
av1_setup_qmatrix(cm, x, plane, tx_size, tx_type, &quant_param);
}
if (plane == 0) xd->tx_type_map[tx_type_map_idx] = tx_type;