Remove CB_COEFF_BUFFER from MB_MODE_INFO_EXT
This helps reduce encoder memory consumption.
Change-Id: Ie1aacd0688b3f1a878feb08cb99bfd508f239229
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 1db2822..a68d53a 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -367,16 +367,16 @@
blk_col)];
if (tx_size == plane_tx_size || plane) {
+ const CB_COEFF_BUFFER *cb_coef_buff = x->cb_coef_buff;
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 tran_low_t *tcoeff_txb =
+ cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset;
+ const uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
+ const uint8_t *txb_skip_ctx_txb =
+ cb_coef_buff->txb_skip_ctx[plane] + txb_offset;
+ const int *dc_sign_ctx_txb = cb_coef_buff->dc_sign_ctx[plane] + txb_offset;
+ const 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,
@@ -1712,6 +1712,7 @@
for (mi_col = mi_col_start; mi_col < mi_col_end;
mi_col += cm->seq_params.mib_size) {
+ cpi->td.mb.cb_coef_buff = av1_get_cb_coeff_buffer(cpi, mi_row, mi_col);
write_modes_sb(cpi, tile, w, &tok, tok_end, mi_row, mi_col,
cm->seq_params.sb_size);
}
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index f1148ee..266f702 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -75,7 +75,6 @@
typedef struct {
// TODO(angiebird): Reduce the buffer size according to sb_type
- CB_COEFF_BUFFER *cb_coef_buff;
CANDIDATE_MV ref_mv_stack[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
uint16_t weight[MODE_CTX_REF_FRAMES][MAX_REF_MV_STACK_SIZE];
int_mv global_mvs[REF_FRAMES];
@@ -434,6 +433,8 @@
// [Saved stat index]
COMP_RD_STATS comp_rd_stats[MAX_COMP_RD_STATS];
int comp_rd_stats_idx;
+
+ CB_COEFF_BUFFER *cb_coef_buff;
};
static INLINE int is_rect_tx_allowed_bsize(BLOCK_SIZE bsize) {
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index bdf8db6..8de19cc 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -1489,7 +1489,11 @@
x->rdmult = x->cb_rdmult;
}
- if (!dry_run) av1_set_coeff_buffer(cpi, x, mi_row, mi_col);
+ if (!dry_run) {
+ x->mbmi_ext->cb_offset = x->cb_offset;
+ assert(x->cb_offset <
+ (1 << num_pels_log2_lookup[cpi->common.seq_params.sb_size]));
+ }
encode_superblock(cpi, tile_data, td, tp, dry_run, mi_row, mi_col, bsize,
rate);
@@ -4263,6 +4267,8 @@
if (cm->delta_q_info.delta_q_present_flag)
setup_delta_q(cpi, x, tile_info, mi_row, mi_col, num_planes);
+ td->mb.cb_coef_buff = av1_get_cb_coeff_buffer(cpi, mi_row, mi_col);
+
int dummy_rate;
int64_t dummy_dist;
RD_STATS dummy_rdc;
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index ee30e63..a64e4b0 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -73,17 +73,6 @@
void av1_free_txb_buf(AV1_COMP *cpi) { aom_free(cpi->coeff_buffer_base); }
-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;
- 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);
- 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]));
-}
-
static void write_golomb(aom_writer *w, int level) {
int x = level + 1;
int i = x;
@@ -638,17 +627,17 @@
aom_writer *w, int plane, int block,
int blk_row, int blk_col, TX_SIZE tx_size) {
MACROBLOCKD *xd = &x->e_mbd;
+ const CB_COEFF_BUFFER *cb_coef_buff = x->cb_coef_buff;
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];
+ const tran_low_t *tcoeff_txb =
+ cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset;
+ const uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
+ const uint8_t *txb_skip_ctx_txb =
+ cb_coef_buff->txb_skip_ctx[plane] + txb_offset;
+ const int *dc_sign_ctx_txb = cb_coef_buff->dc_sign_ctx[plane] + txb_offset;
+ const 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);
@@ -2008,11 +1997,11 @@
2);
}
+ CB_COEFF_BUFFER *cb_coef_buff = x->cb_coef_buff;
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;
+ uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
+ uint8_t *txb_skip_ctx_txb = cb_coef_buff->txb_skip_ctx[plane] + txb_offset;
txb_skip_ctx_txb[block] = txb_ctx.txb_skip_ctx;
eob_txb[block] = eob;
@@ -2021,8 +2010,7 @@
return;
}
- tran_low_t *tcoeff_txb =
- x->mbmi_ext->cb_coef_buff->tcoeff[plane] + x->mbmi_ext->cb_offset;
+ tran_low_t *tcoeff_txb = 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);
@@ -2116,8 +2104,7 @@
#endif // CONFIG_ENTROPY_STATS
if (allow_update_cdf)
update_cdf(ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx], dc_sign, 2);
- int *dc_sign_ctx_txb =
- x->mbmi_ext->cb_coef_buff->dc_sign_ctx[plane] + txb_offset;
+ int *dc_sign_ctx_txb = cb_coef_buff->dc_sign_ctx[plane] + txb_offset;
dc_sign_ctx_txb[block] = dc_sign_ctx;
}
@@ -2155,3 +2142,13 @@
assert(0);
}
}
+
+CB_COEFF_BUFFER *av1_get_cb_coeff_buffer(const struct AV1_COMP *cpi, int mi_row,
+ int mi_col) {
+ const AV1_COMMON *const cm = &cpi->common;
+ const int mib_size_log2 = cm->seq_params.mib_size_log2;
+ const int stride = (cm->mi_cols >> mib_size_log2) + 1;
+ const int offset =
+ (mi_row >> mib_size_log2) * stride + (mi_col >> mib_size_log2);
+ return cpi->coeff_buffer_base + offset;
+}
diff --git a/av1/encoder/encodetxb.h b/av1/encoder/encodetxb.h
index 0682590..12c78c8 100644
--- a/av1/encoder/encodetxb.h
+++ b/av1/encoder/encodetxb.h
@@ -71,15 +71,15 @@
int blk_col, BLOCK_SIZE plane_bsize,
TX_SIZE tx_size, void *arg);
-void av1_set_coeff_buffer(const AV1_COMP *const cpi, MACROBLOCK *const x,
- int mi_row, int mi_col);
-
void hbt_destroy();
int av1_optimize_txb_new(const struct AV1_COMP *cpi, MACROBLOCK *x, int plane,
int block, TX_SIZE tx_size, TX_TYPE tx_type,
const TXB_CTX *const txb_ctx, int *rate_cost,
int sharpness, int fast_mode);
+CB_COEFF_BUFFER *av1_get_cb_coeff_buffer(const struct AV1_COMP *cpi, int mi_row,
+ int mi_col);
+
// These numbers are empirically obtained.
static const int plane_rd_mult[REF_TYPES][PLANE_TYPES] = {
{ 17, 13 },