Merge functions for TX block writing
Consolidate av1_write_coeffs_txb() and write_coeffs_txb_wrap().
Change-Id: I01297f4223e1f698a11ff5cd33b45d7042ff0c58
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index afcfdc2..45afc53 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -370,20 +370,7 @@
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_frame->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN);
- const tran_low_t *tcoeff_txb =
- cb_coef_buff->tcoeff[plane] + x->mbmi_ext_frame->cb_offset;
- const uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
- const tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block);
- const uint16_t eob = eob_txb[block];
- const uint8_t *entropy_ctx = cb_coef_buff->entropy_ctx[plane] + txb_offset;
- const TXB_CTX txb_ctx = { entropy_ctx[block] & TXB_SKIP_CTX_MASK,
- (entropy_ctx[block] >> DC_SIGN_CTX_SHIFT) &
- DC_SIGN_CTX_MASK };
- av1_write_coeffs_txb(cm, xd, w, blk_row, blk_col, plane, tx_size, tcoeff,
- eob, &txb_ctx);
+ av1_write_coeffs_txb(cm, x, w, blk_row, blk_col, plane, block, tx_size);
#if CONFIG_RD_DEBUG
TOKEN_STATS tmp_token_stats;
init_token_stats(&tmp_token_stats);
@@ -807,24 +794,16 @@
}
void av1_write_tx_type(const AV1_COMMON *const cm, const MACROBLOCKD *xd,
- int blk_row, int blk_col, int plane, TX_SIZE tx_size,
- aom_writer *w) {
+ TX_TYPE tx_type, TX_SIZE tx_size, aom_writer *w) {
MB_MODE_INFO *mbmi = xd->mi[0];
const int is_inter = is_inter_block(mbmi);
- FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
-
- // Only y plane's tx_type is transmitted
- if (plane > 0) return;
- PLANE_TYPE plane_type = get_plane_type(plane);
- TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, blk_row, blk_col, tx_size,
- cm->reduced_tx_set_used);
-
- const TX_SIZE square_tx_size = txsize_sqr_map[tx_size];
if (get_ext_tx_types(tx_size, is_inter, cm->reduced_tx_set_used) > 1 &&
((!cm->seg.enabled && cm->base_qindex > 0) ||
(cm->seg.enabled && xd->qindex[mbmi->segment_id] > 0)) &&
!mbmi->skip &&
!segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
+ FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
+ const TX_SIZE square_tx_size = txsize_sqr_map[tx_size];
const TxSetType tx_set_type =
av1_get_ext_tx_set_type(tx_size, is_inter, cm->reduced_tx_set_used);
const int eset = get_ext_tx_set(tx_size, is_inter, cm->reduced_tx_set_used);
diff --git a/av1/encoder/bitstream.h b/av1/encoder/bitstream.h
index 82c7336..b3b5c12 100644
--- a/av1/encoder/bitstream.h
+++ b/av1/encoder/bitstream.h
@@ -37,8 +37,7 @@
int *const largest_tile_id);
void av1_write_tx_type(const AV1_COMMON *const cm, const MACROBLOCKD *xd,
- int blk_row, int blk_col, int plane, TX_SIZE tx_size,
- aom_writer *w);
+ TX_TYPE tx_type, TX_SIZE tx_size, aom_writer *w);
#ifdef __cplusplus
} // extern "C"
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index 44c61f2..e877a81 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -502,36 +502,34 @@
}
}
-void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
+void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *const x,
aom_writer *w, int blk_row, int blk_col, int plane,
- TX_SIZE tx_size, const tran_low_t *tcoeff,
- uint16_t eob, const TXB_CTX *txb_ctx) {
+ int block, 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_frame->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN);
+ const uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
+ const uint16_t eob = eob_txb[block];
+ const uint8_t *entropy_ctx = cb_coef_buff->entropy_ctx[plane] + txb_offset;
+ const int txb_skip_ctx = entropy_ctx[block] & TXB_SKIP_CTX_MASK;
const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size);
FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
- aom_write_symbol(w, eob == 0,
- ec_ctx->txb_skip_cdf[txs_ctx][txb_ctx->txb_skip_ctx], 2);
+ aom_write_symbol(w, eob == 0, ec_ctx->txb_skip_cdf[txs_ctx][txb_skip_ctx], 2);
if (eob == 0) return;
+
const PLANE_TYPE plane_type = get_plane_type(plane);
const TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, blk_row, blk_col,
tx_size, cm->reduced_tx_set_used);
- const TX_CLASS tx_class = tx_type_to_class[tx_type];
- const SCAN_ORDER *const scan_order = get_scan(tx_size, tx_type);
- const int16_t *const scan = scan_order->scan;
- int c;
- const int bwl = get_txb_bwl(tx_size);
- const int width = get_txb_wide(tx_size);
- const int height = get_txb_high(tx_size);
-
- uint8_t levels_buf[TX_PAD_2D];
- uint8_t *const levels = set_levels(levels_buf, width);
- DECLARE_ALIGNED(16, int8_t, coeff_contexts[MAX_TX_SQUARE]);
- av1_txb_init_levels(tcoeff, width, height, levels);
-
- av1_write_tx_type(cm, xd, blk_row, blk_col, plane, tx_size, w);
+ // Only y plane's tx_type is transmitted
+ if (plane == 0) {
+ av1_write_tx_type(cm, xd, tx_type, tx_size, w);
+ }
int eob_extra;
const int eob_pt = get_eob_pos_token(eob, &eob_extra);
const int eob_multi_size = txsize_log2_minus4[tx_size];
+ const TX_CLASS tx_class = tx_type_to_class[tx_type];
const int eob_multi_ctx = (tx_class == TX_CLASS_2D) ? 0 : 1;
switch (eob_multi_size) {
case 0:
@@ -578,9 +576,21 @@
}
}
+ const int width = get_txb_wide(tx_size);
+ const int height = get_txb_high(tx_size);
+ uint8_t levels_buf[TX_PAD_2D];
+ uint8_t *const levels = set_levels(levels_buf, width);
+ const tran_low_t *tcoeff_txb =
+ cb_coef_buff->tcoeff[plane] + x->mbmi_ext_frame->cb_offset;
+ const tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block);
+ av1_txb_init_levels(tcoeff, width, height, levels);
+ const SCAN_ORDER *const scan_order = get_scan(tx_size, tx_type);
+ const int16_t *const scan = scan_order->scan;
+ DECLARE_ALIGNED(16, int8_t, coeff_contexts[MAX_TX_SQUARE]);
av1_get_nz_map_contexts(levels, scan, eob, tx_size, tx_class, coeff_contexts);
- for (c = eob - 1; c >= 0; --c) {
+ const int bwl = get_txb_bwl(tx_size);
+ for (int c = eob - 1; c >= 0; --c) {
const int pos = scan[c];
const int coeff_ctx = coeff_contexts[pos];
const tran_low_t v = tcoeff[pos];
@@ -611,14 +621,16 @@
// Loop to code all signs in the transform block,
// starting with the sign of DC (if applicable)
- for (c = 0; c < eob; ++c) {
+ for (int c = 0; c < eob; ++c) {
const tran_low_t v = tcoeff[scan[c]];
const tran_low_t level = abs(v);
const int sign = (v < 0) ? 1 : 0;
if (level) {
if (c == 0) {
- aom_write_symbol(
- w, sign, ec_ctx->dc_sign_cdf[plane_type][txb_ctx->dc_sign_ctx], 2);
+ const int dc_sign_ctx =
+ (entropy_ctx[block] >> DC_SIGN_CTX_SHIFT) & DC_SIGN_CTX_MASK;
+ aom_write_symbol(w, sign, ec_ctx->dc_sign_cdf[plane_type][dc_sign_ctx],
+ 2);
} else {
aom_write_bit(w, sign);
}
@@ -634,26 +646,6 @@
aom_writer *w;
} ENCODE_TXB_ARGS;
-static void write_coeffs_txb_wrap(const AV1_COMMON *cm, MACROBLOCK *x,
- 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_frame->cb_offset / (TX_SIZE_W_MIN * TX_SIZE_H_MIN);
- const tran_low_t *tcoeff_txb =
- cb_coef_buff->tcoeff[plane] + x->mbmi_ext_frame->cb_offset;
- const uint16_t *eob_txb = cb_coef_buff->eobs[plane] + txb_offset;
- const tran_low_t *tcoeff = BLOCK_OFFSET(tcoeff_txb, block);
- const uint16_t eob = eob_txb[block];
- const uint8_t *entropy_ctx = cb_coef_buff->entropy_ctx[plane] + txb_offset;
- const TXB_CTX txb_ctx = { entropy_ctx[block] & TXB_SKIP_CTX_MASK,
- (entropy_ctx[block] >> DC_SIGN_CTX_SHIFT) &
- DC_SIGN_CTX_MASK };
- av1_write_coeffs_txb(cm, xd, w, blk_row, blk_col, plane, tx_size, tcoeff, eob,
- &txb_ctx);
-}
-
void av1_write_coeffs_mb(const AV1_COMMON *const cm, MACROBLOCK *x, int mi_row,
int mi_col, aom_writer *w, BLOCK_SIZE bsize) {
MACROBLOCKD *xd = &x->e_mbd;
@@ -690,8 +682,8 @@
blk_row += stepr) {
for (int blk_col = col >> pd->subsampling_x; blk_col < unit_width;
blk_col += stepc) {
- write_coeffs_txb_wrap(cm, x, w, plane, block[plane], blk_row,
- blk_col, tx_size);
+ av1_write_coeffs_txb(cm, x, w, blk_row, blk_col, plane,
+ block[plane], tx_size);
block[plane] += step;
}
}
diff --git a/av1/encoder/encodetxb.h b/av1/encoder/encodetxb.h
index b96148a..3ad7e82 100644
--- a/av1/encoder/encodetxb.h
+++ b/av1/encoder/encodetxb.h
@@ -55,10 +55,9 @@
int av1_cost_coeffs_txb(const AV1_COMMON *const cm, const MACROBLOCK *x,
const int plane, const int block, const TX_SIZE tx_size,
const TX_TYPE tx_type, const TXB_CTX *const txb_ctx);
-void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
+void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *const x,
aom_writer *w, int blk_row, int blk_col, int plane,
- TX_SIZE tx_size, const tran_low_t *tcoeff,
- uint16_t eob, const TXB_CTX *txb_ctx);
+ int block, TX_SIZE tx_size);
void av1_write_coeffs_mb(const AV1_COMMON *const cm, MACROBLOCK *x, int mi_row,
int mi_col, aom_writer *w, BLOCK_SIZE bsize);
int av1_get_txb_entropy_context(const tran_low_t *qcoeff,