Make av1_cost_coeffs() inline Change-Id: I5821e35d7cda96c20e22ab02bc2dfe8639025fde
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 38d94ff..c42d249 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -1575,160 +1575,6 @@ return error; } -#if !CONFIG_LV_MAP -static int cost_coeffs(const AV1_COMMON *const cm, MACROBLOCK *x, int plane, - int block, TX_SIZE tx_size, const SCAN_ORDER *scan_order, - const ENTROPY_CONTEXT *a, const ENTROPY_CONTEXT *l, - int use_fast_coef_costing) { - MACROBLOCKD *const xd = &x->e_mbd; - MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; - const struct macroblock_plane *p = &x->plane[plane]; - const struct macroblockd_plane *pd = &xd->plane[plane]; - const PLANE_TYPE type = pd->plane_type; - const uint16_t *band_count = &band_count_table[tx_size][1]; - const int eob = p->eobs[block]; - const tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); - const TX_SIZE tx_size_ctx = get_txsize_entropy_ctx(tx_size); - uint8_t token_cache[MAX_TX_SQUARE]; - int pt = combine_entropy_contexts(*a, *l); - int c, cost; - const int16_t *scan = scan_order->scan; - const int16_t *nb = scan_order->neighbors; - const int ref = is_inter_block(mbmi); - int(*head_token_costs)[COEFF_CONTEXTS][TAIL_TOKENS] = - x->token_head_costs[tx_size_ctx][type][ref]; - int(*tail_token_costs)[COEFF_CONTEXTS][TAIL_TOKENS] = - x->token_tail_costs[tx_size_ctx][type][ref]; - const int seg_eob = av1_get_tx_eob(&cm->seg, mbmi->segment_id, tx_size); - int8_t eob_val; - const int cat6_bits = av1_get_cat6_extrabits_size(tx_size, xd->bd); - (void)cm; - - if (eob == 0) { - // block zero - cost = (*head_token_costs)[pt][0]; - } else { - if (use_fast_coef_costing) { - int band_left = *band_count++; - - // dc token - int v = qcoeff[0]; - int16_t prev_t; - cost = av1_get_token_cost(v, &prev_t, cat6_bits); - eob_val = (eob == 1) ? EARLY_EOB : NO_EOB; - cost += av1_get_coeff_token_cost( - prev_t, eob_val, 1, (*head_token_costs)[pt], (*tail_token_costs)[pt]); - - token_cache[0] = av1_pt_energy_class[prev_t]; - ++head_token_costs; - ++tail_token_costs; - - // ac tokens - for (c = 1; c < eob; c++) { - const int rc = scan[c]; - int16_t t; - - v = qcoeff[rc]; - cost += av1_get_token_cost(v, &t, cat6_bits); - eob_val = - (c + 1 == eob) ? (c + 1 == seg_eob ? LAST_EOB : EARLY_EOB) : NO_EOB; - cost += av1_get_coeff_token_cost(t, eob_val, 0, - (*head_token_costs)[!prev_t], - (*tail_token_costs)[!prev_t]); - prev_t = t; - if (!--band_left) { - band_left = *band_count++; - ++head_token_costs; - ++tail_token_costs; - } - } - } else { // !use_fast_coef_costing - int band_left = *band_count++; - - // dc token - int v = qcoeff[0]; - int16_t tok; - cost = av1_get_token_cost(v, &tok, cat6_bits); - eob_val = (eob == 1) ? EARLY_EOB : NO_EOB; - cost += av1_get_coeff_token_cost(tok, eob_val, 1, (*head_token_costs)[pt], - (*tail_token_costs)[pt]); - - token_cache[0] = av1_pt_energy_class[tok]; - ++head_token_costs; - ++tail_token_costs; - - // ac tokens - for (c = 1; c < eob; c++) { - const int rc = scan[c]; - - v = qcoeff[rc]; - cost += av1_get_token_cost(v, &tok, cat6_bits); - pt = get_coef_context(nb, token_cache, c); - eob_val = - (c + 1 == eob) ? (c + 1 == seg_eob ? LAST_EOB : EARLY_EOB) : NO_EOB; - cost += av1_get_coeff_token_cost( - tok, eob_val, 0, (*head_token_costs)[pt], (*tail_token_costs)[pt]); - token_cache[rc] = av1_pt_energy_class[tok]; - if (!--band_left) { - band_left = *band_count++; - ++head_token_costs; - ++tail_token_costs; - } - } - } - } - - return cost; -} -#endif // !CONFIG_LV_MAP - -int av1_cost_coeffs(const AV1_COMP *const cpi, MACROBLOCK *x, int plane, - int blk_row, int blk_col, int block, TX_SIZE tx_size, - const SCAN_ORDER *scan_order, const ENTROPY_CONTEXT *a, - const ENTROPY_CONTEXT *l, int use_fast_coef_costing) { -#if TXCOEFF_COST_TIMER - struct aom_usec_timer timer; - aom_usec_timer_start(&timer); -#endif - const AV1_COMMON *const cm = &cpi->common; -#if !CONFIG_LV_MAP - (void)blk_row; - (void)blk_col; - int cost = cost_coeffs(cm, x, plane, block, tx_size, scan_order, a, l, - use_fast_coef_costing); -#else // !CONFIG_LV_MAP - (void)scan_order; - (void)use_fast_coef_costing; - const MACROBLOCKD *xd = &x->e_mbd; - const MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; - const struct macroblockd_plane *pd = &xd->plane[plane]; - const BLOCK_SIZE bsize = mbmi->sb_type; - const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); - TXB_CTX txb_ctx; - get_txb_ctx(plane_bsize, tx_size, plane, a, l, &txb_ctx); - const int eob = x->plane[plane].eobs[block]; - int cost; - if (eob) { - cost = av1_cost_coeffs_txb(cm, x, plane, blk_row, blk_col, block, tx_size, - &txb_ctx); - } else { - const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size); - const PLANE_TYPE plane_type = get_plane_type(plane); - const LV_MAP_COEFF_COST *const coeff_costs = - &x->coeff_costs[txs_ctx][plane_type]; - cost = coeff_costs->txb_skip_cost[txb_ctx.txb_skip_ctx][1]; - } -#endif // !CONFIG_LV_MAP -#if TXCOEFF_COST_TIMER - AV1_COMMON *tmp_cm = (AV1_COMMON *)&cpi->common; - aom_usec_timer_mark(&timer); - const int64_t elapsed_time = aom_usec_timer_elapsed(&timer); - tmp_cm->txcoeff_cost_timer += elapsed_time; - ++tmp_cm->txcoeff_cost_count; -#endif - return cost; -} - // Get transform block visible dimensions cropped to the MI units. static void get_txb_dimensions(const MACROBLOCKD *xd, int plane, BLOCK_SIZE plane_bsize, int blk_row, int blk_col,
diff --git a/av1/encoder/rdopt.h b/av1/encoder/rdopt.h index 69a9025..438a55b 100644 --- a/av1/encoder/rdopt.h +++ b/av1/encoder/rdopt.h
@@ -13,9 +13,16 @@ #define AV1_ENCODER_RDOPT_H_ #include "av1/common/blockd.h" +#if CONFIG_LV_MAP +#include "av1/common/txb_common.h" +#endif #include "av1/encoder/block.h" #include "av1/encoder/context_tree.h" +#include "av1/encoder/encoder.h" +#if CONFIG_LV_MAP +#include "av1/encoder/encodetxb.h" +#endif #ifdef __cplusplus extern "C" { @@ -29,7 +36,6 @@ #endif struct TileInfo; -struct AV1_COMP; struct macroblock; struct RD_STATS; @@ -81,10 +87,164 @@ int bsh, int visible_w, int visible_h, int qindex); #endif -int av1_cost_coeffs(const struct AV1_COMP *const cpi, MACROBLOCK *x, int plane, - int blk_row, int blk_col, int block, TX_SIZE tx_size, - const SCAN_ORDER *scan_order, const ENTROPY_CONTEXT *a, - const ENTROPY_CONTEXT *l, int use_fast_coef_costing); +#if !CONFIG_LV_MAP +static INLINE int cost_coeffs(const AV1_COMMON *const cm, MACROBLOCK *x, + int plane, int block, TX_SIZE tx_size, + const SCAN_ORDER *scan_order, + const ENTROPY_CONTEXT *a, + const ENTROPY_CONTEXT *l, + int use_fast_coef_costing) { + MACROBLOCKD *const xd = &x->e_mbd; + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; + const struct macroblock_plane *p = &x->plane[plane]; + const struct macroblockd_plane *pd = &xd->plane[plane]; + const PLANE_TYPE type = pd->plane_type; + const uint16_t *band_count = &band_count_table[tx_size][1]; + const int eob = p->eobs[block]; + const tran_low_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); + const TX_SIZE tx_size_ctx = get_txsize_entropy_ctx(tx_size); + uint8_t token_cache[MAX_TX_SQUARE]; + int pt = combine_entropy_contexts(*a, *l); + int c, cost; + const int16_t *scan = scan_order->scan; + const int16_t *nb = scan_order->neighbors; + const int ref = is_inter_block(mbmi); + int(*head_token_costs)[COEFF_CONTEXTS][TAIL_TOKENS] = + x->token_head_costs[tx_size_ctx][type][ref]; + int(*tail_token_costs)[COEFF_CONTEXTS][TAIL_TOKENS] = + x->token_tail_costs[tx_size_ctx][type][ref]; + const int seg_eob = av1_get_tx_eob(&cm->seg, mbmi->segment_id, tx_size); + int8_t eob_val; + const int cat6_bits = av1_get_cat6_extrabits_size(tx_size, xd->bd); + (void)cm; + + if (eob == 0) { + // block zero + cost = (*head_token_costs)[pt][0]; + } else { + if (use_fast_coef_costing) { + int band_left = *band_count++; + + // dc token + int v = qcoeff[0]; + int16_t prev_t; + cost = av1_get_token_cost(v, &prev_t, cat6_bits); + eob_val = (eob == 1) ? EARLY_EOB : NO_EOB; + cost += av1_get_coeff_token_cost( + prev_t, eob_val, 1, (*head_token_costs)[pt], (*tail_token_costs)[pt]); + + token_cache[0] = av1_pt_energy_class[prev_t]; + ++head_token_costs; + ++tail_token_costs; + + // ac tokens + for (c = 1; c < eob; c++) { + const int rc = scan[c]; + int16_t t; + + v = qcoeff[rc]; + cost += av1_get_token_cost(v, &t, cat6_bits); + eob_val = + (c + 1 == eob) ? (c + 1 == seg_eob ? LAST_EOB : EARLY_EOB) : NO_EOB; + cost += av1_get_coeff_token_cost(t, eob_val, 0, + (*head_token_costs)[!prev_t], + (*tail_token_costs)[!prev_t]); + prev_t = t; + if (!--band_left) { + band_left = *band_count++; + ++head_token_costs; + ++tail_token_costs; + } + } + } else { // !use_fast_coef_costing + int band_left = *band_count++; + + // dc token + int v = qcoeff[0]; + int16_t tok; + cost = av1_get_token_cost(v, &tok, cat6_bits); + eob_val = (eob == 1) ? EARLY_EOB : NO_EOB; + cost += av1_get_coeff_token_cost(tok, eob_val, 1, (*head_token_costs)[pt], + (*tail_token_costs)[pt]); + + token_cache[0] = av1_pt_energy_class[tok]; + ++head_token_costs; + ++tail_token_costs; + + // ac tokens + for (c = 1; c < eob; c++) { + const int rc = scan[c]; + + v = qcoeff[rc]; + cost += av1_get_token_cost(v, &tok, cat6_bits); + pt = get_coef_context(nb, token_cache, c); + eob_val = + (c + 1 == eob) ? (c + 1 == seg_eob ? LAST_EOB : EARLY_EOB) : NO_EOB; + cost += av1_get_coeff_token_cost( + tok, eob_val, 0, (*head_token_costs)[pt], (*tail_token_costs)[pt]); + token_cache[rc] = av1_pt_energy_class[tok]; + if (!--band_left) { + band_left = *band_count++; + ++head_token_costs; + ++tail_token_costs; + } + } + } + } + + return cost; +} +#endif // !CONFIG_LV_MAP + +static INLINE int av1_cost_coeffs(const struct AV1_COMP *const cpi, + MACROBLOCK *x, int plane, int blk_row, + int blk_col, int block, TX_SIZE tx_size, + const SCAN_ORDER *scan_order, + const ENTROPY_CONTEXT *a, + const ENTROPY_CONTEXT *l, + int use_fast_coef_costing) { +#if TXCOEFF_COST_TIMER + struct aom_usec_timer timer; + aom_usec_timer_start(&timer); +#endif + const AV1_COMMON *const cm = &cpi->common; +#if !CONFIG_LV_MAP + (void)blk_row; + (void)blk_col; + int cost = cost_coeffs(cm, x, plane, block, tx_size, scan_order, a, l, + use_fast_coef_costing); +#else // !CONFIG_LV_MAP + (void)scan_order; + (void)use_fast_coef_costing; + const MACROBLOCKD *xd = &x->e_mbd; + const MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; + const struct macroblockd_plane *pd = &xd->plane[plane]; + const BLOCK_SIZE bsize = mbmi->sb_type; + const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); + TXB_CTX txb_ctx; + get_txb_ctx(plane_bsize, tx_size, plane, a, l, &txb_ctx); + const int eob = x->plane[plane].eobs[block]; + int cost; + if (eob) { + cost = av1_cost_coeffs_txb(cm, x, plane, blk_row, blk_col, block, tx_size, + &txb_ctx); + } else { + const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size); + const PLANE_TYPE plane_type = get_plane_type(plane); + const LV_MAP_COEFF_COST *const coeff_costs = + &x->coeff_costs[txs_ctx][plane_type]; + cost = coeff_costs->txb_skip_cost[txb_ctx.txb_skip_ctx][1]; + } +#endif // !CONFIG_LV_MAP +#if TXCOEFF_COST_TIMER + AV1_COMMON *tmp_cm = (AV1_COMMON *)&cpi->common; + aom_usec_timer_mark(&timer); + const int64_t elapsed_time = aom_usec_timer_elapsed(&timer); + tmp_cm->txcoeff_cost_timer += elapsed_time; + ++tmp_cm->txcoeff_cost_count; +#endif + return cost; +} void av1_rd_pick_intra_mode_sb(const struct AV1_COMP *cpi, struct macroblock *x, struct RD_STATS *rd_cost, BLOCK_SIZE bsize,