Merge functions for TX block writing
Consolidate av1_write_coeffs_txb() and write_coeffs_txb_wrap().
Change-Id: I01297f4223e1f698a11ff5cd33b45d7042ff0c58
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;
}
}