Add intra_mode_info_cost_uv()
A function to calculate chroma prediction mode info. rate cost for
intra blocks.
Change-Id: Ia71c492284675568db609dfa9ed3b5901f021027
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index ff6795c..572cea8 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2502,11 +2502,9 @@
#if CONFIG_FILTER_INTRA
const int use_filter_intra = mbmi->filter_intra_mode_info.use_filter_intra;
#endif // CONFIG_FILTER_INTRA
-#if CONFIG_INTRABC
- const int use_intrabc = mbmi->use_intrabc;
-#endif // CONFIG_INTRABC
// Can only activate one mode.
#if CONFIG_INTRABC
+ const int use_intrabc = mbmi->use_intrabc;
assert(((mbmi->mode != DC_PRED) + use_palette + use_intrabc +
use_filter_intra) <= 1);
#else
@@ -2565,6 +2563,56 @@
return total_rate;
}
+// Return the rate cost for chroma prediction mode info. of intra blocks.
+static int intra_mode_info_cost_uv(const AV1_COMP *cpi, const MACROBLOCK *x,
+ const MB_MODE_INFO *mbmi, BLOCK_SIZE bsize,
+ int mode_cost) {
+ int total_rate = mode_cost;
+ const int use_palette = mbmi->palette_mode_info.palette_size[1] > 0;
+ const UV_PREDICTION_MODE mode = mbmi->uv_mode;
+// Can only activate one mode.
+#if CONFIG_INTRABC
+ assert(((mode != UV_DC_PRED) + use_palette + mbmi->use_intrabc) <= 1);
+#else
+ assert((mode != UV_DC_PRED) + use_palette <= 1);
+#endif // CONFIG_INTRABC
+ const int try_palette =
+ av1_allow_palette(cpi->common.allow_screen_content_tools, mbmi->sb_type);
+ if (try_palette && mode == UV_DC_PRED) {
+ const PALETTE_MODE_INFO *pmi = &mbmi->palette_mode_info;
+ total_rate +=
+ x->palette_uv_mode_cost[pmi->palette_size[0] > 0][use_palette];
+ if (use_palette) {
+ const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
+ const int plt_size = pmi->palette_size[1];
+ const MACROBLOCKD *xd = &x->e_mbd;
+ const uint8_t *const color_map = xd->plane[1].color_index_map;
+ int palette_mode_cost =
+ x->palette_uv_size_cost[bsize_ctx][plt_size - PALETTE_MIN_SIZE] +
+ write_uniform_cost(plt_size, color_map[0]);
+ uint16_t color_cache[2 * PALETTE_MAX_SIZE];
+ const int n_cache = av1_get_palette_cache(xd, 1, color_cache);
+ palette_mode_cost += av1_palette_color_cost_uv(pmi, color_cache, n_cache,
+ cpi->common.bit_depth);
+ palette_mode_cost +=
+ av1_cost_color_map(x, 1, bsize, mbmi->tx_size, PALETTE_MAP);
+ total_rate += palette_mode_cost;
+ }
+ }
+ if (av1_is_directional_mode(get_uv_mode(mode), mbmi->sb_type)) {
+ if (av1_use_angle_delta(bsize)) {
+#if CONFIG_EXT_INTRA_MOD
+ total_rate += x->angle_delta_cost[mode - V_PRED]
+ [mbmi->angle_delta[1] + MAX_ANGLE_DELTA];
+#else
+ total_rate += write_uniform_cost(2 * MAX_ANGLE_DELTA + 1,
+ MAX_ANGLE_DELTA + mbmi->angle_delta[1]);
+#endif // CONFIG_EXT_INTRA_MOD
+ }
+ }
+ return total_rate;
+}
+
static int conditional_skipintra(PREDICTION_MODE mode,
PREDICTION_MODE best_intra_mode) {
if (mode == D117_PRED && best_intra_mode != V_PRED &&
@@ -5029,14 +5077,8 @@
super_block_uvrd(cpi, x, &tokenonly_rd_stats, bsize, *best_rd);
if (tokenonly_rd_stats.rate == INT_MAX) continue;
- const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
- this_rate = tokenonly_rd_stats.rate + dc_mode_cost +
- x->palette_uv_size_cost[bsize_ctx][n - PALETTE_MIN_SIZE] +
- write_uniform_cost(n, color_map[0]) +
- x->palette_uv_mode_cost[pmi->palette_size[0] > 0][1];
- this_rate += av1_palette_color_cost_uv(pmi, color_cache, n_cache,
- cpi->common.bit_depth);
- this_rate += av1_cost_color_map(x, 1, bsize, mbmi->tx_size, PALETTE_MAP);
+ this_rate = tokenonly_rd_stats.rate +
+ intra_mode_info_cost_uv(cpi, x, mbmi, bsize, dc_mode_cost);
this_rd = RDCOST(x->rdmult, this_rate, tokenonly_rd_stats.dist);
if (this_rd < *best_rd) {
*best_rd = this_rd;
@@ -5072,11 +5114,8 @@
if (!super_block_uvrd(cpi, x, &tokenonly_rd_stats, bsize, best_rd_in))
return INT64_MAX;
- this_rate = tokenonly_rd_stats.rate + rate_overhead;
-#if CONFIG_EXT_INTRA_MOD
- this_rate += x->angle_delta_cost[mbmi->uv_mode - V_PRED]
- [mbmi->angle_delta[1] + MAX_ANGLE_DELTA];
-#endif // CONFIG_EXT_INTRA_MOD
+ this_rate = tokenonly_rd_stats.rate +
+ intra_mode_info_cost_uv(cpi, x, mbmi, bsize, rate_overhead);
this_rd = RDCOST(x->rdmult, this_rate, tokenonly_rd_stats.dist);
if (this_rd < *best_rd) {
*best_rd = this_rd;
@@ -5279,9 +5318,6 @@
assert(!is_inter_block(mbmi));
MB_MODE_INFO best_mbmi = *mbmi;
int64_t best_rd = INT64_MAX, this_rd;
- PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
- const int try_palette =
- av1_allow_palette(cpi->common.allow_screen_content_tools, mbmi->sb_type);
for (int mode_idx = 0; mode_idx < UV_INTRA_MODES; ++mode_idx) {
int this_rate;
@@ -5325,35 +5361,24 @@
continue;
}
}
- this_rate = tokenonly_rd_stats.rate +
+ const int mode_cost =
#if CONFIG_CFL
- x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode][mode] +
- cfl_alpha_rate;
+ x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode][mode] +
+ cfl_alpha_rate;
#else
- x->intra_uv_mode_cost[mbmi->mode][mode];
+ x->intra_uv_mode_cost[mbmi->mode][mode];
#endif
-
+ this_rate = tokenonly_rd_stats.rate +
+ intra_mode_info_cost_uv(cpi, x, mbmi, bsize, mode_cost);
#if CONFIG_CFL
if (mode == UV_CFL_PRED) {
assert(is_cfl_allowed(mbmi));
#if CONFIG_DEBUG
- if (!xd->lossless[mbmi->segment_id]) assert(xd->cfl.rate == this_rate);
+ if (!xd->lossless[mbmi->segment_id])
+ assert(xd->cfl.rate == tokenonly_rd_stats.rate + mode_cost);
#endif // CONFIG_DEBUG
}
#endif
- if (is_directional_mode && av1_use_angle_delta(mbmi->sb_type)) {
-#if CONFIG_EXT_INTRA_MOD
- this_rate += x->angle_delta_cost[mode - V_PRED]
- [mbmi->angle_delta[1] + MAX_ANGLE_DELTA];
-#else
- this_rate += write_uniform_cost(2 * MAX_ANGLE_DELTA + 1,
- MAX_ANGLE_DELTA + mbmi->angle_delta[1]);
-#endif // CONFIG_EXT_INTRA_MOD
- }
-
- if (try_palette && mode == UV_DC_PRED)
- this_rate += x->palette_uv_mode_cost[pmi->palette_size[0] > 0][0];
-
this_rd = RDCOST(x->rdmult, this_rate, tokenonly_rd_stats.dist);
if (this_rd < best_rd) {
@@ -5366,6 +5391,8 @@
}
}
+ const int try_palette =
+ av1_allow_palette(cpi->common.allow_screen_content_tools, mbmi->sb_type);
if (try_palette) {
uint8_t *best_palette_color_map = x->palette_buffer->best_palette_color_map;
rd_pick_palette_intra_sbuv(
@@ -9701,23 +9728,15 @@
rate_y -= tx_size_cost(cm, x, bsize, mbmi->tx_size);
}
if (!x->skip_chroma_rd) {
- rate2 += rate_uv +
+ const int uv_mode_cost =
#if CONFIG_CFL
- x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode]
- [mbmi->uv_mode];
+ x->intra_uv_mode_cost[is_cfl_allowed(mbmi)][mbmi->mode]
+ [mbmi->uv_mode];
#else
- x->intra_uv_mode_cost[mbmi->mode][mbmi->uv_mode];
+ x->intra_uv_mode_cost[mbmi->mode][mbmi->uv_mode];
#endif
- }
- if (av1_is_directional_mode(get_uv_mode(mbmi->uv_mode), bsize) &&
- av1_use_angle_delta(bsize)) {
-#if CONFIG_EXT_INTRA_MOD
- rate2 += x->angle_delta_cost[mbmi->uv_mode - V_PRED]
- [mbmi->angle_delta[1] + MAX_ANGLE_DELTA];
-#else
- rate2 += write_uniform_cost(2 * MAX_ANGLE_DELTA + 1,
- MAX_ANGLE_DELTA + mbmi->angle_delta[1]);
-#endif // CONFIG_EXT_INTRA_MOD
+ rate2 += rate_uv +
+ intra_mode_info_cost_uv(cpi, x, mbmi, bsize, uv_mode_cost);
}
if (mbmi->mode != DC_PRED && mbmi->mode != PAETH_PRED)
rate2 += intra_cost_penalty;