Remove pointer from MB_MODE_INFO_EXT MB_MODE_INFO_EXT contains pointer to tcoeff,eobs, txb_skip_ctx and dc_sign_ctx which can be calculated on the fly Observed memory footprint reduction with no impact on encoder performance. stream cpu-used encoder BasketballDrill_832x480 1 ~1.42% parkrun_720p50 3 ~1.32% Change-Id: I47b4a9773bb62995b93be4a503975d16b2af0607
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 0aad41e..d42e110 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -369,10 +369,18 @@ blk_col)]; if (tx_size == plane_tx_size || plane) { - tran_low_t *tcoeff = BLOCK_OFFSET(x->mbmi_ext->tcoeff[plane], block); - const uint16_t eob = x->mbmi_ext->eobs[plane][block]; - TXB_CTX txb_ctx = { x->mbmi_ext->txb_skip_ctx[plane][block], - x->mbmi_ext->dc_sign_ctx[plane][block] }; + const int txb_offset = + x->mbmi_ext->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN); + tran_low_t *tcoeff_txb = + x->mbmi_ext->cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset; + uint16_t *eob_txb = x->mbmi_ext->cb_coef_buff->eobs[plane] + txb_offset; + uint8_t *txb_skip_ctx_txb = + x->mbmi_ext->cb_coef_buff->txb_skip_ctx[plane] + txb_offset; + int *dc_sign_ctx_txb = + x->mbmi_ext->cb_coef_buff->dc_sign_ctx[plane] + txb_offset; + tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block); + const uint16_t eob = eob_txb[block]; + TXB_CTX txb_ctx = { txb_skip_ctx_txb[block], dc_sign_ctx_txb[block] }; av1_write_coeffs_txb(cm, xd, w, blk_row, blk_col, plane, tx_size, tcoeff, eob, &txb_ctx); #if CONFIG_RD_DEBUG
diff --git a/av1/encoder/block.h b/av1/encoder/block.h index 331c4a0..96b0991d 100644 --- a/av1/encoder/block.h +++ b/av1/encoder/block.h
@@ -75,12 +75,10 @@ typedef struct { // TODO(angiebird): Reduce the buffer size according to sb_type - tran_low_t *tcoeff[MAX_MB_PLANE]; - uint16_t *eobs[MAX_MB_PLANE]; - uint8_t *txb_skip_ctx[MAX_MB_PLANE]; - int *dc_sign_ctx[MAX_MB_PLANE]; + CB_COEFF_BUFFER *cb_coef_buff; CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE]; int_mv global_mvs[REF_FRAMES]; + int cb_offset; int16_t mode_context[MODE_CTX_REF_FRAMES]; uint8_t ref_mv_count[MODE_CTX_REF_FRAMES]; } MB_MODE_INFO_EXT;
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 2fe5552..37f4bb9 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c
@@ -76,21 +76,12 @@ void av1_set_coeff_buffer(const AV1_COMP *const cpi, MACROBLOCK *const x, int mi_row, int mi_col) { const AV1_COMMON *const cm = &cpi->common; - const int num_planes = av1_num_planes(cm); int mib_size_log2 = cm->seq_params.mib_size_log2; int stride = (cm->mi_cols >> mib_size_log2) + 1; int offset = (mi_row >> mib_size_log2) * stride + (mi_col >> mib_size_log2); - CB_COEFF_BUFFER *coeff_buf = &cpi->coeff_buffer_base[offset]; - const int txb_offset = x->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN); + x->mbmi_ext->cb_coef_buff = &cpi->coeff_buffer_base[offset]; + x->mbmi_ext->cb_offset = x->cb_offset; assert(x->cb_offset < (1 << num_pels_log2_lookup[cm->seq_params.sb_size])); - for (int plane = 0; plane < num_planes; ++plane) { - x->mbmi_ext->tcoeff[plane] = coeff_buf->tcoeff[plane] + x->cb_offset; - x->mbmi_ext->eobs[plane] = coeff_buf->eobs[plane] + txb_offset; - x->mbmi_ext->txb_skip_ctx[plane] = - coeff_buf->txb_skip_ctx[plane] + txb_offset; - x->mbmi_ext->dc_sign_ctx[plane] = - coeff_buf->dc_sign_ctx[plane] + txb_offset; - } } static void write_golomb(aom_writer *w, int level) { @@ -647,10 +638,18 @@ aom_writer *w, int plane, int block, int blk_row, int blk_col, TX_SIZE tx_size) { MACROBLOCKD *xd = &x->e_mbd; - tran_low_t *tcoeff = BLOCK_OFFSET(x->mbmi_ext->tcoeff[plane], block); - uint16_t eob = x->mbmi_ext->eobs[plane][block]; - TXB_CTX txb_ctx = { x->mbmi_ext->txb_skip_ctx[plane][block], - x->mbmi_ext->dc_sign_ctx[plane][block] }; + const int txb_offset = + x->mbmi_ext->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN); + tran_low_t *tcoeff_txb = + x->mbmi_ext->cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset; + uint16_t *eob_txb = x->mbmi_ext->cb_coef_buff->eobs[plane] + txb_offset; + uint8_t *txb_skip_ctx_txb = + x->mbmi_ext->cb_coef_buff->txb_skip_ctx[plane] + txb_offset; + int *dc_sign_ctx_txb = + x->mbmi_ext->cb_coef_buff->dc_sign_ctx[plane] + txb_offset; + tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block); + uint16_t eob = eob_txb[block]; + TXB_CTX txb_ctx = { txb_skip_ctx_txb[block], dc_sign_ctx_txb[block] }; av1_write_coeffs_txb(cm, xd, w, blk_row, blk_col, plane, tx_size, tcoeff, eob, &txb_ctx); } @@ -2009,15 +2008,22 @@ 2); } - x->mbmi_ext->txb_skip_ctx[plane][block] = txb_ctx.txb_skip_ctx; - x->mbmi_ext->eobs[plane][block] = eob; + const int txb_offset = + x->mbmi_ext->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN); + uint16_t *eob_txb = x->mbmi_ext->cb_coef_buff->eobs[plane] + txb_offset; + uint8_t *txb_skip_ctx_txb = + x->mbmi_ext->cb_coef_buff->txb_skip_ctx[plane] + txb_offset; + txb_skip_ctx_txb[block] = txb_ctx.txb_skip_ctx; + eob_txb[block] = eob; if (eob == 0) { av1_set_contexts(xd, pd, plane, plane_bsize, tx_size, 0, blk_col, blk_row); return; } - tran_low_t *tcoeff = BLOCK_OFFSET(x->mbmi_ext->tcoeff[plane], block); + tran_low_t *tcoeff_txb = + x->mbmi_ext->cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset; + tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block); const int segment_id = mbmi->segment_id; const int seg_eob = av1_get_tx_eob(&cpi->common.seg, segment_id, tx_size); const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); @@ -2110,7 +2116,9 @@ #endif // CONFIG_ENTROPY_STATS if (allow_update_cdf) update_cdf(ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], dc_sign, 2); - x->mbmi_ext->dc_sign_ctx[plane][block] = dc_sign_ctx; + int *dc_sign_ctx_txb = + x->mbmi_ext->cb_coef_buff->dc_sign_ctx[plane] + txb_offset; + dc_sign_ctx_txb[block] = dc_sign_ctx; } const int cul_level = av1_get_txb_entropy_context(tcoeff, scan_order, eob);