Update get_coeff_cost()
Move get_nz_map_ctx() out of get_coeff_cost(), so that the coeff_ctx
won't be recalculated in get_dist_cost_stats().
Change-Id: I511d66e3e1a768c77314b290dc6bb90a123ca541
diff --git a/av1/encoder/encodetxb.c b/av1/encoder/encodetxb.c
index c22294f..6ea782a 100644
--- a/av1/encoder/encodetxb.c
+++ b/av1/encoder/encodetxb.c
@@ -200,14 +200,15 @@
const int is_eob,
#endif
const TxbInfo *const txb_info,
- const LV_MAP_COEFF_COST *const txb_costs);
+ const LV_MAP_COEFF_COST *const txb_costs,
+ const int coeff_ctx);
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 *const txb_costs,
- TxbInfo *const txb_info) {
+ const 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];
@@ -220,11 +221,16 @@
const tran_low_t dqc = qcoeff_to_dqcoeff(qc, dqv, txb_info->shift);
const int64_t dqc_dist = get_coeff_dist(tqc, dqc, txb_info->shift);
+ const int coeff_ctx = get_nz_map_ctx(levels, coeff_idx, txb_info->bwl,
+#if CONFIG_LV_MAP_MULTI
+ txb_info->height, scan_idx, is_eob,
+#endif
+ txb_info->tx_size, txb_info->tx_type);
const int qc_cost = get_coeff_cost(qc, scan_idx,
#if CONFIG_LV_MAP_MULTI
is_eob,
#endif
- txb_info, txb_costs);
+ txb_info, txb_costs, coeff_ctx);
// distortion difference when coefficient is quantized to 0
const tran_low_t dqc0 = qcoeff_to_dqcoeff(0, dqv, txb_info->shift);
@@ -245,7 +251,7 @@
#if CONFIG_LV_MAP_MULTI
is_eob,
#endif
- txb_info, txb_costs);
+ txb_info, txb_costs, coeff_ctx);
stats->dist_low = low_dqc_dist - stats->dist0;
stats->rate_low = low_qc_cost;
stats->rd_low = RDCOST(txb_info->rdmult, stats->rate_low, stats->dist_low);
@@ -255,15 +261,19 @@
if ((stats->rd_low < stats->rd) && (stats->low_qc == 0)) {
stats->nz_rate = low_qc_cost;
} else {
+ const int coeff_ctx_temp =
+ get_nz_map_ctx(levels, coeff_idx, txb_info->bwl,
+#if CONFIG_LV_MAP_MULTI
+ txb_info->height, scan_idx, 1,
+#endif
+ txb_info->tx_size, txb_info->tx_type);
const int qc_eob_cost =
get_coeff_cost((stats->rd_low < stats->rd) ? stats->low_qc : qc,
- scan_idx, 1, txb_info, txb_costs);
+ scan_idx, 1, txb_info, txb_costs, coeff_ctx_temp);
stats->nz_rate =
((stats->rd_low < stats->rd) ? low_qc_cost : qc_cost) - qc_eob_cost;
}
#else
- const int coeff_ctx = get_nz_map_ctx(levels, coeff_idx, txb_info->bwl,
- txb_info->tx_size, txb_info->tx_type);
const int is_nz = (stats->rd_low < stats->rd && stats->low_qc == 0) ? 0 : 1;
stats->nz_rate = txb_costs->nz_map_cost[coeff_ctx][is_nz];
#endif
@@ -1439,7 +1449,8 @@
const int is_eob,
#endif
const TxbInfo *const txb_info,
- const LV_MAP_COEFF_COST *const txb_costs) {
+ const LV_MAP_COEFF_COST *const txb_costs,
+ const int coeff_ctx) {
const TXB_CTX *txb_ctx = txb_info->txb_ctx;
const int is_nz = (qc != 0);
const tran_low_t abs_qc = abs(qc);
@@ -1448,9 +1459,6 @@
const int pos = scan[scan_idx];
#if CONFIG_LV_MAP_MULTI
- const int coeff_ctx =
- get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl, txb_info->height,
- scan_idx, is_eob, txb_info->tx_size, txb_info->tx_type);
#if USE_BASE_EOB_ALPHABET
if (is_eob) {
cost +=
@@ -1464,8 +1472,6 @@
cost += txb_costs->base_cost[coeff_ctx][AOMMIN(abs_qc, 3)];
#endif
#else
- const int coeff_ctx = get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl,
- txb_info->tx_size, txb_info->tx_type);
if (scan_idx < txb_info->eob - 1) {
cost += txb_costs->nz_map_cost[coeff_ctx][is_nz];
}
@@ -1533,11 +1539,17 @@
if (nb_scan_idx < txb_info->eob && nb_row >= 0 && nb_col >= 0 &&
nb_row < txb_info->height && nb_col < txb_info->width) {
const tran_low_t nb_coeff = txb_info->qcoeff[nb_coeff_idx];
+ const int coeff_ctx =
+ get_nz_map_ctx(txb_info->levels, nb_coeff_idx, txb_info->bwl,
+#if CONFIG_LV_MAP_MULTI
+ txb_info->height, nb_scan_idx, is_eob,
+#endif
+ txb_info->tx_size, txb_info->tx_type);
const int cost = get_coeff_cost(nb_coeff, nb_scan_idx,
#if CONFIG_LV_MAP_MULTI
is_eob,
#endif
- txb_info, txb_costs);
+ txb_info, txb_costs, coeff_ctx);
if (cost_map)
cost_map[nb_row - row + COST_MAP_OFFSET]
[nb_col - col + COST_MAP_OFFSET] -= cost;
@@ -1554,11 +1566,17 @@
if (nb_scan_idx < txb_info->eob && nb_row >= 0 && nb_col >= 0 &&
nb_row < txb_info->height && nb_col < txb_info->width) {
const tran_low_t nb_coeff = txb_info->qcoeff[nb_coeff_idx];
+ const int coeff_ctx =
+ get_nz_map_ctx(txb_info->levels, nb_coeff_idx, txb_info->bwl,
+#if CONFIG_LV_MAP_MULTI
+ txb_info->height, nb_scan_idx, is_eob,
+#endif
+ txb_info->tx_size, txb_info->tx_type);
const int cost = get_coeff_cost(nb_coeff, nb_scan_idx,
#if CONFIG_LV_MAP_MULTI
is_eob,
#endif
- txb_info, txb_costs);
+ txb_info, txb_costs, coeff_ctx);
if (cost_map)
cost_map[nb_row - row + COST_MAP_OFFSET]
[nb_col - col + COST_MAP_OFFSET] += cost;
@@ -1602,12 +1620,19 @@
}
cost = txb_costs->txb_skip_cost[txb_skip_ctx][0];
for (int c = 0; c < txb_info->eob; ++c) {
- const tran_low_t qc = txb_info->qcoeff[scan[c]];
+ const int pos = scan[c];
+ const tran_low_t qc = txb_info->qcoeff[pos];
+ const int coeff_ctx =
+ get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl,
+#if CONFIG_LV_MAP_MULTI
+ txb_info->height, c, c == txb_info->eob - 1,
+#endif
+ txb_info->tx_size, txb_info->tx_type);
const int coeff_cost = get_coeff_cost(qc, c,
#if CONFIG_LV_MAP_MULTI
c == txb_info->eob - 1,
#endif
- txb_info, txb_costs);
+ txb_info, txb_costs, coeff_ctx);
cost += coeff_cost;
}
return cost;