Update encoder txb code This is a preparation of following get_nz_map_ctx() refactoring. Change-Id: I60d71863f39d8f271c44abee5855fd4d89b544b1
diff --git a/av1/common/txb_common.h b/av1/common/txb_common.h index 0f20b46..ae5eeea 100644 --- a/av1/common/txb_common.h +++ b/av1/common/txb_common.h
@@ -549,25 +549,6 @@ return get_nz_map_ctx_from_stats(stats, coeff_idx, bwl, height, tx_class); } -static INLINE int get_eob_ctx(const int coeff_idx, // raster order - const TX_SIZE txs_ctx, const TX_TYPE tx_type) { - (void)tx_type; - - if (txs_ctx == TX_4X4) return av1_coeff_band_4x4[coeff_idx]; - if (txs_ctx == TX_8X8) return av1_coeff_band_8x8[coeff_idx]; - if (txs_ctx == TX_16X16) return av1_coeff_band_16x16[coeff_idx]; - if (txs_ctx == TX_32X32) return av1_coeff_band_32x32[coeff_idx]; - -#if CONFIG_TX64X64 - // Since TX64X64 use 32x32 coeff buffer, so it share the same coeff_band with - // TX32X32 - if (txs_ctx == TX_64X64) return av1_coeff_band_32x32[coeff_idx]; -#endif // CONFIG_TX64X64 - - assert(0 && "Invalid value of txs_ctx"); - return 0; -} - static INLINE void set_dc_sign(int *cul_level, tran_low_t v) { if (v < 0) *cul_level |= 1 << COEFF_CONTEXT_BITS;
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c index 760433b..c78c291 100644 --- a/av1/encoder/encodetxb.c +++ b/av1/encoder/encodetxb.c
@@ -203,13 +203,13 @@ const TxbInfo *const txb_info, const LV_MAP_COEFF_COST *const txb_costs); -static void get_dist_cost_stats(LevelDownStats *stats, int scan_idx, +static void get_dist_cost_stats(LevelDownStats *const stats, const int scan_idx, #if CONFIG_LV_MAP_MULTI const int is_eob, #endif - const LV_MAP_COEFF_COST *txb_costs, - TxbInfo *txb_info) { - const int16_t *scan = txb_info->scan_order->scan; + const LV_MAP_COEFF_COST *const txb_costs, + TxbInfo *const txb_info) { + const int16_t *const scan = txb_info->scan_order->scan; const int coeff_idx = scan[scan_idx]; const tran_low_t qc = txb_info->qcoeff[coeff_idx]; const uint8_t *const levels = txb_info->levels; @@ -324,7 +324,7 @@ const TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, blk_row, blk_col, block, tx_size); const SCAN_ORDER *const scan_order = get_scan(cm, tx_size, tx_type, mbmi); - const int16_t *scan = scan_order->scan; + const int16_t *const scan = scan_order->scan; const int seg_eob = av1_get_max_eob(tx_size); int c; const int bwl = get_txb_bwl(tx_size); @@ -383,11 +383,12 @@ int coeff_ctx = 0; for (int i = 0; i < eob; ++i) { c = eob - 1 - i; + const int pos = scan[c]; #if CONFIG_LV_MAP_MULTI coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, c == eob - 1, tx_type); - tran_low_t v = tcoeff[scan[c]]; + const tran_low_t v = tcoeff[pos]; #if USE_BASE_EOB_ALPHABET if (c == eob - 1) { aom_write_symbol( @@ -407,8 +408,8 @@ #endif #else coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type); - tran_low_t v = tcoeff[scan[c]]; - int is_nz = (v != 0); + const tran_low_t v = tcoeff[pos]; + const int is_nz = (v != 0); if (c < eob - 1) { aom_write_bin(w, is_nz, @@ -431,10 +432,10 @@ #else for (int i = 1; i < eob; ++i) { c = eob - 1 - i; - int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type); - - tran_low_t v = tcoeff[scan[c]]; - int is_nz = (v != 0); + const int pos = scan[c]; + const int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type); + const tran_low_t v = tcoeff[pos]; + const int is_nz = (v != 0); aom_write_bin(w, is_nz, ec_ctx->nz_map_cdf[txs_ctx][plane_type][coeff_ctx], 2); @@ -443,12 +444,13 @@ for (int i = 0; i < NUM_BASE_LEVELS; ++i) { av1_get_base_level_counts(levels, i, width, height, level_counts); for (c = eob - 1; c >= 0; --c) { - const tran_low_t level = abs(tcoeff[scan[c]]); + const int pos = scan[c]; + const tran_low_t level = abs(tcoeff[pos]); int ctx; if (level <= i) continue; - ctx = get_base_ctx(levels, scan[c], bwl, i, level_counts[scan[c]]); + ctx = get_base_ctx(levels, pos, bwl, i, level_counts[pos]); if (level == i + 1) { aom_write_bin(w, 1, ec_ctx->coeff_base_cdf[txs_ctx][plane_type][i][ctx], @@ -488,7 +490,8 @@ av1_get_br_level_counts(levels, width, height, level_counts); #endif for (c = update_eob; c >= 0; --c) { - const tran_low_t level = abs(tcoeff[scan[c]]); + const int pos = scan[c]; + const tran_low_t level = abs(tcoeff[pos]); int idx; int ctx; @@ -496,18 +499,18 @@ // level is above 1. #if !CONFIG_LV_MAP_MULTI - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]); #endif - int base_range = level - 1 - NUM_BASE_LEVELS; + const int base_range = level - 1 - NUM_BASE_LEVELS; #if CONFIG_LV_MAP_MULTI #if USE_CAUSAL_BR_CTX - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos], tx_type); #else - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]); #endif for (idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) { - int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1); + const int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1); aom_write_symbol( w, k, ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_16X16)][plane_type][ctx], @@ -550,8 +553,8 @@ if (br_set_idx < BASE_RANGE_SETS) continue; #endif // use 0-th order Golomb code to handle the residual level. - write_golomb( - w, abs(tcoeff[scan[c]]) - COEFF_BASE_RANGE - 1 - NUM_BASE_LEVELS); + write_golomb(w, + abs(tcoeff[pos]) - COEFF_BASE_RANGE - 1 - NUM_BASE_LEVELS); } } @@ -675,7 +678,7 @@ const int height = get_txb_high(tx_size); const SCAN_ORDER *const scan_order = get_scan(cm, tx_size, tx_type, mbmi); - const int16_t *scan = scan_order->scan; + const int16_t *const scan = scan_order->scan; uint8_t levels_buf[TX_PAD_2D]; uint8_t *const levels = set_levels(levels_buf, width); DECLARE_ALIGNED(16, uint8_t, level_counts[MAX_TX_SQUARE]); @@ -706,9 +709,10 @@ int coeff_ctx = 0; #endif for (c = eob - 1; c >= 0; --c) { - tran_low_t v = qcoeff[scan[c]]; - int is_nz = (v != 0); - int level = abs(v); + const int pos = scan[c]; + const tran_low_t v = qcoeff[pos]; + const int is_nz = (v != 0); + const int level = abs(v); #if CONFIG_LV_MAP_MULTI coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, c == eob - 1, tx_type); @@ -760,7 +764,7 @@ if (is_k == 0) break; } #else - get_base_ctx_set(levels, scan[c], bwl, ctx_ls); + get_base_ctx_set(levels, pos, bwl, ctx_ls); int i; for (i = 0; i < NUM_BASE_LEVELS; ++i) { @@ -777,11 +781,11 @@ if (level > NUM_BASE_LEVELS) { int ctx; #if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos], tx_type); #else - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]); #endif - int base_range = level - 1 - NUM_BASE_LEVELS; + const int base_range = level - 1 - NUM_BASE_LEVELS; if (base_range < COEFF_BASE_RANGE) { cost += coeff_costs->lps_cost[ctx][base_range]; } else { @@ -850,7 +854,7 @@ void gen_txb_cache(TxbCache *txb_cache, TxbInfo *txb_info) { // gen_nz_count_arr - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const scan = txb_info->scan_order->scan; const int bwl = txb_info->bwl; const int height = txb_info->height; const tran_low_t *const qcoeff = txb_info->qcoeff; @@ -1078,7 +1082,7 @@ const tran_low_t nb_coeff = txb_info->qcoeff[nb_coeff_idx]; const tran_low_t abs_nb_coeff = abs(nb_coeff); if (abs_nb_coeff != 1) return 0; - const int16_t *iscan = txb_info->scan_order->iscan; + const int16_t *const iscan = txb_info->scan_order->iscan; const int scan_idx = iscan[coeff_idx]; if (scan_idx == txb_info->seg_eob) return 0; const int nb_scan_idx = iscan[nb_coeff_idx]; @@ -1218,7 +1222,7 @@ if (qc == 0) return 0; int accu_cost_diff = 0; - const int16_t *iscan = txb_info->scan_order->iscan; + const int16_t *const iscan = txb_info->scan_order->iscan; const int eob = txb_info->eob; const int scan_idx = iscan[coeff_idx]; if (scan_idx < eob) { @@ -1381,6 +1385,23 @@ txb_info->seg_eob = av1_get_max_eob(txb_info->tx_size); } +static INLINE int get_eob_ctx(const int coeff_idx, // raster order + const TX_SIZE txs_ctx) { + if (txs_ctx == TX_4X4) return av1_coeff_band_4x4[coeff_idx]; + if (txs_ctx == TX_8X8) return av1_coeff_band_8x8[coeff_idx]; + if (txs_ctx == TX_16X16) return av1_coeff_band_16x16[coeff_idx]; + if (txs_ctx == TX_32X32) return av1_coeff_band_32x32[coeff_idx]; + +#if CONFIG_TX64X64 + // Since TX64X64 use 32x32 coeff buffer, so it share the same coeff_band with + // TX32X32 + if (txs_ctx == TX_64X64) return av1_coeff_band_32x32[coeff_idx]; +#endif // CONFIG_TX64X64 + + assert(0 && "Invalid value of txs_ctx"); + return 0; +} + // TODO(angiebird): add static to this function once it's called int try_change_eob(int *new_eob, int coeff_idx, const TxbCache *txb_cache, const LV_MAP_COEFF_COST *txb_costs, TxbInfo *txb_info, @@ -1392,8 +1413,8 @@ *new_eob = -1; return 0; } - const int16_t *iscan = txb_info->scan_order->iscan; - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const iscan = txb_info->scan_order->iscan; + const int16_t *const scan = txb_info->scan_order->scan; const int scan_idx = iscan[coeff_idx]; *new_eob = 0; int cost_diff = 0; @@ -1424,8 +1445,7 @@ if (*new_eob > 0) { // Note that get_eob_ctx does NOT actually account for qcoeff, so we don't // need to lower down the qcoeff here - const int eob_ctx = - get_eob_ctx(scan[*new_eob - 1], txb_info->txs_ctx, txb_info->tx_type); + const int eob_ctx = get_eob_ctx(scan[*new_eob - 1], txb_info->txs_ctx); cost_diff -= txb_costs->eob_cost[eob_ctx][0]; cost_diff += txb_costs->eob_cost[eob_ctx][1]; } else { @@ -1448,7 +1468,7 @@ const int row = coeff_idx >> txb_info->bwl; const int col = coeff_idx - (row << txb_info->bwl); const int eob = txb_info->eob; - const int16_t *iscan = txb_info->scan_order->iscan; + const int16_t *const iscan = txb_info->scan_order->iscan; for (int i = 0; i < SIG_REF_OFFSET_NUM; ++i) { const int nb_row = row - sig_ref_offset[i][0]; const int nb_col = col - sig_ref_offset[i][1]; @@ -1566,7 +1586,8 @@ const int is_nz = (qc != 0); const tran_low_t abs_qc = abs(qc); int cost = 0; - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const scan = txb_info->scan_order->scan; + const int pos = scan[scan_idx]; #if CONFIG_LV_MAP_MULTI int coeff_ctx = @@ -1615,7 +1636,7 @@ } #else int ctx_ls[NUM_BASE_LEVELS] = { 0 }; - get_base_ctx_set(txb_info->levels, scan[scan_idx], txb_info->bwl, ctx_ls); + get_base_ctx_set(txb_info->levels, pos, txb_info->bwl, ctx_ls); int i; for (i = 0; i < NUM_BASE_LEVELS; ++i) { @@ -1625,20 +1646,19 @@ #endif #endif if (abs_qc > NUM_BASE_LEVELS) { - const int row = scan[scan_idx] >> txb_info->bwl; - const int col = scan[scan_idx] - (row << txb_info->bwl); + const int row = pos >> txb_info->bwl; + const int col = pos - (row << txb_info->bwl); #if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX (void)col; const int count = 0; - const int ctx = get_br_ctx(txb_info->levels, scan[scan_idx], - txb_info->bwl, count, txb_info->tx_type); + const int ctx = get_br_ctx(txb_info->levels, pos, txb_info->bwl, count, + txb_info->tx_type); #else const int count = get_level_count( txb_info->levels, (1 << txb_info->bwl) + TX_PAD_HOR, row, col, NUM_BASE_LEVELS, br_ref_offset, BR_CONTEXT_POSITION_NUM); - const int ctx = - get_br_ctx(txb_info->levels, scan[scan_idx], txb_info->bwl, count); + const int ctx = get_br_ctx(txb_info->levels, pos, txb_info->bwl, count); #endif cost += get_br_cost(abs_qc, ctx, txb_costs->lps_cost[ctx]); cost += get_golomb_cost(abs_qc); @@ -1737,8 +1757,8 @@ // TODO(angiebird): make this static once it's called int get_txb_cost(TxbInfo *txb_info, const LV_MAP_COEFF_COST *txb_costs) { int cost = 0; - int txb_skip_ctx = txb_info->txb_ctx->txb_skip_ctx; - const int16_t *scan = txb_info->scan_order->scan; + const int txb_skip_ctx = txb_info->txb_ctx->txb_skip_ctx; + const int16_t *const scan = txb_info->scan_order->scan; if (txb_info->eob == 0) { cost = txb_costs->txb_skip_cost[txb_skip_ctx][1]; return cost; @@ -1760,8 +1780,8 @@ #if TEST_OPTIMIZE_TXB void test_try_change_eob(TxbInfo *txb_info, const LV_MAP_COEFF_COST *txb_costs, TxbCache *txb_cache) { - int eob = txb_info->eob; - const int16_t *scan = txb_info->scan_order->scan; + const int eob = txb_info->eob; + const int16_t *const scan = txb_info->scan_order->scan; if (eob > 0) { int last_si = eob - 1; int last_ci = scan[last_si]; @@ -1792,7 +1812,7 @@ const TxbCache *txb_cache, const LV_MAP_COEFF_COST *txb_costs, TxbInfo *txb_info, int fast_mode) { - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const scan = txb_info->scan_order->scan; const int coeff_idx = scan[scan_idx]; const tran_low_t qc = txb_info->qcoeff[coeff_idx]; stats->new_eob = -1; @@ -1875,12 +1895,13 @@ txb_info->levels = tmp_levels; } - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const scan = txb_info->scan_order->scan; // forward optimize the nz_map` const int init_eob = txb_info->eob; const int seg_eob = txb_info->seg_eob; - int eob_cost = get_eob_cost(init_eob, seg_eob, txb_costs, txb_info->tx_type); + const int eob_cost = + get_eob_cost(init_eob, seg_eob, txb_costs, txb_info->tx_type); // backward optimize the level-k map int64_t accu_rate = eob_cost; @@ -2028,7 +2049,7 @@ txb_info->levels = tmp_levels; } - const int16_t *scan = txb_info->scan_order->scan; + const int16_t *const scan = txb_info->scan_order->scan; // forward optimize the nz_map const int cur_eob = txb_info->eob; @@ -2155,7 +2176,7 @@ } int av1_get_txb_entropy_context(const tran_low_t *qcoeff, const SCAN_ORDER *scan_order, int eob) { - const int16_t *scan = scan_order->scan; + const int16_t *const scan = scan_order->scan; int cul_level = 0; int c; @@ -2214,7 +2235,7 @@ const TX_TYPE tx_type = av1_get_tx_type(plane_type, xd, blk_row, blk_col, block, tx_size); const SCAN_ORDER *const scan_order = get_scan(cm, tx_size, tx_type, mbmi); - const int16_t *scan = scan_order->scan; + const int16_t *const scan = scan_order->scan; const int seg_eob = av1_get_tx_eob(&cpi->common.seg, segment_id, tx_size); int c; TXB_CTX txb_ctx; @@ -2263,8 +2284,9 @@ update_eob = eob - 1; #endif for (c = eob - 1; c >= 0; --c) { - tran_low_t v = qcoeff[scan[c]]; - int is_nz = (v != 0); + const int pos = scan[c]; + const tran_low_t v = qcoeff[pos]; + const int is_nz = (v != 0); #if CONFIG_LV_MAP_MULTI (void)is_nz; @@ -2338,12 +2360,13 @@ for (int i = 0; i < NUM_BASE_LEVELS; ++i) { av1_get_base_level_counts(levels, i, width, height, level_counts); for (c = eob - 1; c >= 0; --c) { - const tran_low_t level = abs(tcoeff[scan[c]]); + const int pos = scan[c]; + const tran_low_t level = abs(tcoeff[pos]); int ctx; if (level <= i) continue; - ctx = get_base_ctx(levels, scan[c], bwl, i, level_counts[scan[c]]); + ctx = get_base_ctx(levels, pos, bwl, i, level_counts[pos]); if (level == i + 1) { ++td->counts->coeff_base[txsize_ctx][plane_type][i][ctx][1]; @@ -2361,9 +2384,9 @@ } #endif - c = 0; // Update the context needed to code the DC sign (if applicable) - const int sign = (tcoeff[scan[c]] < 0) ? 1 : 0; - if (tcoeff[scan[c]] != 0) { + // Update the context needed to code the DC sign (if applicable) + const int sign = (tcoeff[0] < 0) ? 1 : 0; + if (tcoeff[0] != 0) { int dc_sign_ctx = txb_ctx.dc_sign_ctx; ++td->counts->dc_sign[plane_type][dc_sign_ctx][sign]; @@ -2379,7 +2402,8 @@ av1_get_br_level_counts(levels, width, height, level_counts); #endif for (c = update_eob; c >= 0; --c) { - const tran_low_t level = abs(tcoeff[scan[c]]); + const int pos = scan[c]; + const tran_low_t level = abs(tcoeff[pos]); int idx; int ctx; @@ -2387,18 +2411,18 @@ // level is above 1. #if !CONFIG_LV_MAP_MULTI - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]); #endif - int base_range = level - 1 - NUM_BASE_LEVELS; + const int base_range = level - 1 - NUM_BASE_LEVELS; #if CONFIG_LV_MAP_MULTI #if USE_CAUSAL_BR_CTX - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos], tx_type); #else - ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]); + ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]); #endif for (idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) { - int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1); + const int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1); // printf("br_update: %d %d %2d : %2d %d\n", txsize_ctx, plane, ctx, // base_range, k); update_cdf( @@ -2413,9 +2437,9 @@ if (k < BR_CDF_SIZE - 1) break; } #else - int br_set_idx = base_range < COEFF_BASE_RANGE - ? coeff_to_br_index[base_range] - : BASE_RANGE_SETS; + const int br_set_idx = base_range < COEFF_BASE_RANGE + ? coeff_to_br_index[base_range] + : BASE_RANGE_SETS; for (idx = 0; idx < BASE_RANGE_SETS; ++idx) { if (idx == br_set_idx) {