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,