Introduce av1_get_qmatrix() and iqmatrix() funcs This is to refactor some duplicated code. BUG=aomedia:2610 Change-Id: I8ea9fe20149dd26cdfbed379c2c65b80e1dbbde1
diff --git a/av1/common/enums.h b/av1/common/enums.h index 8b3d00d..0c09a1b 100644 --- a/av1/common/enums.h +++ b/av1/common/enums.h
@@ -291,8 +291,6 @@ EXT_TX_SET_TYPES } UENUM1BYTE(TxSetType); -#define IS_2D_TRANSFORM(tx_type) (tx_type < IDTX) - #define EXT_TX_SIZES 4 // number of sizes that use extended transforms #define EXT_TX_SETS_INTER 4 // Sets of transform selections for INTER #define EXT_TX_SETS_INTRA 3 // Sets of transform selections for INTRA
diff --git a/av1/common/quant_common.c b/av1/common/quant_common.c index 804eb6a..9b967fe 100644 --- a/av1/common/quant_common.c +++ b/av1/common/quant_common.c
@@ -244,6 +244,36 @@ return quant_params->gqmatrix[qmlevel][plane][tx_size]; } +// Returns true if the tx_type corresponds to non-identity transform in both +// horizontal and vertical directions. +static INLINE bool is_2d_transform(TX_TYPE tx_type) { return (tx_type < IDTX); } + +const qm_val_t *av1_get_iqmatrix(const CommonQuantParams *const quant_params, + const MACROBLOCKD *const xd, int plane, + TX_SIZE tx_size, TX_TYPE tx_type) { + const struct macroblockd_plane *const pd = &xd->plane[plane]; + const MB_MODE_INFO *const mbmi = xd->mi[0]; + const int seg_id = mbmi->segment_id; + const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); + // Use a flat matrix (i.e. no weighting) for 1D and Identity transforms + return is_2d_transform(tx_type) + ? pd->seg_iqmatrix[seg_id][qm_tx_size] + : quant_params->giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; +} + +const qm_val_t *av1_get_qmatrix(const CommonQuantParams *const quant_params, + const MACROBLOCKD *const xd, int plane, + TX_SIZE tx_size, TX_TYPE tx_type) { + const struct macroblockd_plane *const pd = &xd->plane[plane]; + const MB_MODE_INFO *const mbmi = xd->mi[0]; + const int seg_id = mbmi->segment_id; + const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); + // Use a flat matrix (i.e. no weighting) for 1D and Identity transforms + return is_2d_transform(tx_type) + ? pd->seg_qmatrix[seg_id][qm_tx_size] + : quant_params->gqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; +} + #define QM_TOTAL_SIZE 3344 // We only use wt_matrix_ref[q] and iwt_matrix_ref[q] // for q = 0, ..., NUM_QM_LEVELS - 2.
diff --git a/av1/common/quant_common.h b/av1/common/quant_common.h index 8dc0419..fb27326 100644 --- a/av1/common/quant_common.h +++ b/av1/common/quant_common.h
@@ -60,11 +60,22 @@ // Initialize all global quant/dequant matrices. void av1_qm_init(struct CommonQuantParams *quant_params, int num_planes); +// Get global dequant matrix. const qm_val_t *av1_iqmatrix(const struct CommonQuantParams *quant_params, int qmlevel, int plane, TX_SIZE tx_size); +// Get global quant matrix. const qm_val_t *av1_qmatrix(const struct CommonQuantParams *quant_params, int qmlevel, int plane, TX_SIZE tx_size); +// Get either local / global dequant matrix as appropriate. +const qm_val_t *av1_get_iqmatrix(const struct CommonQuantParams *quant_params, + const struct macroblockd *xd, int plane, + TX_SIZE tx_size, TX_TYPE tx_type); +// Get either local / global quant matrix as appropriate. +const qm_val_t *av1_get_qmatrix(const struct CommonQuantParams *quant_params, + const struct macroblockd *xd, int plane, + TX_SIZE tx_size, TX_TYPE tx_type); + #ifdef __cplusplus } // extern "C" #endif
diff --git a/av1/decoder/decodetxb.c b/av1/decoder/decodetxb.c index aa08022..24c6031 100644 --- a/av1/decoder/decodetxb.c +++ b/av1/decoder/decodetxb.c
@@ -161,11 +161,8 @@ av1_get_tx_type(xd, plane_type, blk_row, blk_col, tx_size, cm->features.reduced_tx_set_used); const TX_CLASS tx_class = tx_type_to_class[tx_type]; - const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); const qm_val_t *iqmatrix = - IS_2D_TRANSFORM(tx_type) - ? pd->seg_iqmatrix[mbmi->segment_id][qm_tx_size] - : cm->quant_params.giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; + av1_get_iqmatrix(&cm->quant_params, xd, plane, tx_size, tx_type); const SCAN_ORDER *const scan_order = get_scan(tx_size, tx_type); const int16_t *const scan = scan_order->scan; int eob_extra = 0;
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index 95b4e03..e3915bf 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c
@@ -339,24 +339,11 @@ qparam->iqmatrix = NULL; } void av1_setup_qmatrix(const CommonQuantParams *quant_params, - const MACROBLOCK *x, int plane, TX_SIZE tx_size, + const MACROBLOCKD *const xd, int plane, TX_SIZE tx_size, TX_TYPE tx_type, QUANT_PARAM *qparam) { - const MACROBLOCKD *const xd = &x->e_mbd; - const struct macroblockd_plane *const pd = &xd->plane[plane]; - const MB_MODE_INFO *const mbmi = xd->mi[0]; - const int seg_id = mbmi->segment_id; - const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); - // Use a flat matrix (i.e. no weighting) for 1D and Identity transforms - const qm_val_t *qmatrix = - IS_2D_TRANSFORM(tx_type) - ? pd->seg_qmatrix[seg_id][qm_tx_size] - : quant_params->gqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; - const qm_val_t *iqmatrix = - IS_2D_TRANSFORM(tx_type) - ? pd->seg_iqmatrix[seg_id][qm_tx_size] - : quant_params->giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; - qparam->qmatrix = qmatrix; - qparam->iqmatrix = iqmatrix; + qparam->qmatrix = av1_get_qmatrix(quant_params, xd, plane, tx_size, tx_type); + qparam->iqmatrix = + av1_get_iqmatrix(quant_params, xd, plane, tx_size, tx_type); } static void encode_block(int plane, int block, int blk_row, int blk_col, @@ -398,7 +385,7 @@ av1_setup_xform(cm, x, tx_size, tx_type, &txfm_param); av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->use_quant_b_adapt, &quant_param); - av1_setup_qmatrix(&cm->quant_params, x, plane, tx_size, tx_type, + av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, tx_type, &quant_param); av1_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, &txfm_param, &quant_param); @@ -589,7 +576,7 @@ av1_setup_xform(cm, x, tx_size, DCT_DCT, &txfm_param); av1_setup_quant(tx_size, 0, AV1_XFORM_QUANT_B, cpi->use_quant_b_adapt, &quant_param); - av1_setup_qmatrix(&cm->quant_params, x, plane, tx_size, DCT_DCT, + av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, DCT_DCT, &quant_param); av1_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, &txfm_param, @@ -731,7 +718,7 @@ av1_setup_xform(cm, x, tx_size, tx_type, &txfm_param); av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->use_quant_b_adapt, &quant_param); - av1_setup_qmatrix(&cm->quant_params, x, plane, tx_size, tx_type, + av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, tx_type, &quant_param); av1_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, &txfm_param,
diff --git a/av1/encoder/encodemb.h b/av1/encoder/encodemb.h index e05f4ce..a337c83 100644 --- a/av1/encoder/encodemb.h +++ b/av1/encoder/encodemb.h
@@ -69,7 +69,7 @@ void av1_setup_quant(TX_SIZE tx_size, int use_optimize_b, int xform_quant_idx, int use_quant_b_adapt, QUANT_PARAM *qparam); void av1_setup_qmatrix(const CommonQuantParams *quant_params, - const MACROBLOCK *x, int plane, TX_SIZE tx_size, + const MACROBLOCKD *xd, int plane, TX_SIZE tx_size, TX_TYPE tx_type, QUANT_PARAM *qparam); void av1_xform_quant(MACROBLOCK *x, int plane, int block, int blk_row,
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 697192e..046d66e 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c
@@ -1750,12 +1750,8 @@ const int shift = av1_get_tx_scale(tx_size); int eob = p->eobs[block]; const int16_t *dequant = p->dequant_QTX; - const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); const qm_val_t *iqmatrix = - IS_2D_TRANSFORM(tx_type) - ? pd->seg_iqmatrix[xd->mi[0]->segment_id][qm_tx_size] - : cpi->common.quant_params - .giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; + av1_get_iqmatrix(&cpi->common.quant_params, xd, plane, tx_size, tx_type); const int block_offset = BLOCK_OFFSET(block); tran_low_t *qcoeff = p->qcoeff + block_offset; tran_low_t *dqcoeff = pd->dqcoeff + block_offset; @@ -1948,11 +1944,8 @@ 2; uint8_t levels_buf[TX_PAD_2D]; uint8_t *const levels = set_levels(levels_buf, width); - const TX_SIZE qm_tx_size = av1_get_adjusted_tx_size(tx_size); const qm_val_t *iqmatrix = - IS_2D_TRANSFORM(tx_type) - ? pd->seg_iqmatrix[mbmi->segment_id][qm_tx_size] - : cm->quant_params.giqmatrix[NUM_QM_LEVELS - 1][0][qm_tx_size]; + av1_get_iqmatrix(&cpi->common.quant_params, xd, plane, tx_size, tx_type); assert(width == (1 << bwl)); const int tx_type_cost = get_tx_type_cost(x, xd, plane, tx_size, tx_type, reduced_tx_set_used);
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c index 48cc47b..3129b3a 100644 --- a/av1/encoder/tx_search.c +++ b/av1/encoder/tx_search.c
@@ -1102,7 +1102,7 @@ : AV1_XFORM_QUANT_FP) : AV1_XFORM_QUANT_FP, cpi->use_quant_b_adapt, &quant_param_intra); - av1_setup_qmatrix(&cm->quant_params, x, plane, tx_size, best_tx_type, + av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, best_tx_type, &quant_param_intra); av1_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, &txfm_param_intra, &quant_param_intra); @@ -2208,7 +2208,7 @@ if (!(allowed_tx_mask & (1 << tx_type))) continue; txfm_param.tx_type = tx_type; if (av1_use_qmatrix(&cm->quant_params, xd, mbmi->segment_id)) { - av1_setup_qmatrix(&cm->quant_params, x, plane, tx_size, tx_type, + av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, tx_type, &quant_param); } if (plane == 0) xd->tx_type_map[tx_type_map_idx] = tx_type;