Refactor rd_pick_intra_sbuv_mode()
Change-Id: Id86b48ad34059668beb9464200dd9e03fc1b8a48
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 12e9468..1659258 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -4357,11 +4357,13 @@
#endif // CONFIG_VAR_TX
#if CONFIG_PALETTE
-static void rd_pick_palette_intra_sbuv(
- const AV1_COMP *const cpi, MACROBLOCK *x, int dc_mode_cost,
- PALETTE_MODE_INFO *palette_mode_info, uint8_t *best_palette_color_map,
- PREDICTION_MODE *mode_selected, int64_t *best_rd, int *rate,
- int *rate_tokenonly, int64_t *distortion, int *skippable) {
+static void rd_pick_palette_intra_sbuv(const AV1_COMP *const cpi, MACROBLOCK *x,
+ int dc_mode_cost,
+ uint8_t *best_palette_color_map,
+ MB_MODE_INFO *const best_mbmi,
+ int64_t *best_rd, int *rate,
+ int *rate_tokenonly, int64_t *distortion,
+ int *skippable) {
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
@@ -4379,6 +4381,7 @@
&plane_block_height, &rows, &cols);
if (rows * cols > PALETTE_MAX_BLOCK_SIZE) return;
+ mbmi->uv_mode = DC_PRED;
#if CONFIG_FILTER_INTRA
mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
#endif // CONFIG_FILTER_INTRA
@@ -4425,10 +4428,6 @@
}
#endif // CONFIG_AOM_HIGHBITDEPTH
- mbmi->uv_mode = DC_PRED;
-#if CONFIG_FILTER_INTRA
- mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
-#endif // CONFIG_FILTER_INTRA
for (r = 0; r < rows; ++r) {
for (c = 0; c < cols; ++c) {
#if CONFIG_AOM_HIGHBITDEPTH
@@ -4504,11 +4503,10 @@
this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, tokenonly_rd_stats.dist);
if (this_rd < *best_rd) {
*best_rd = this_rd;
- *palette_mode_info = *pmi;
+ *best_mbmi = *mbmi;
memcpy(best_palette_color_map, color_map,
plane_block_width * plane_block_height *
sizeof(best_palette_color_map[0]));
- *mode_selected = DC_PRED;
*rate = this_rate;
*distortion = tokenonly_rd_stats.dist;
*rate_tokenonly = tokenonly_rd_stats.rate;
@@ -4516,10 +4514,7 @@
}
}
}
- if (palette_mode_info->palette_size[1] > 0) {
- memcpy(pmi->palette_colors + PALETTE_MAX_SIZE,
- palette_mode_info->palette_colors + PALETTE_MAX_SIZE,
- 2 * PALETTE_MAX_SIZE * sizeof(palette_mode_info->palette_colors[0]));
+ if (best_mbmi->palette_mode_info.palette_size[1] > 0) {
memcpy(color_map, best_palette_color_map,
rows * cols * sizeof(best_palette_color_map[0]));
}
@@ -4672,75 +4667,66 @@
BLOCK_SIZE bsize, TX_SIZE max_tx_size) {
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
+ MB_MODE_INFO best_mbmi = *mbmi;
PREDICTION_MODE mode;
- PREDICTION_MODE mode_selected = DC_PRED;
int64_t best_rd = INT64_MAX, this_rd;
int this_rate;
RD_STATS tokenonly_rd_stats;
#if CONFIG_PVQ
od_rollback_buffer buf;
-
od_encode_checkpoint(&x->daala_enc, &buf);
#endif
#if CONFIG_PALETTE
- PALETTE_MODE_INFO palette_mode_info;
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
uint8_t *best_palette_color_map = NULL;
#endif // CONFIG_PALETTE
-#if CONFIG_EXT_INTRA
- int is_directional_mode, rate_overhead, best_angle_delta = 0;
-#endif // CONFIG_EXT_INTRA
-#if CONFIG_FILTER_INTRA
- FILTER_INTRA_MODE_INFO filter_intra_mode_info;
- filter_intra_mode_info.use_filter_intra_mode[1] = 0;
+#if CONFIG_FILTER_INTRA
mbmi->filter_intra_mode_info.use_filter_intra_mode[1] = 0;
#endif // CONFIG_FILTER_INTRA
#if CONFIG_PALETTE
- palette_mode_info.palette_size[1] = 0;
pmi->palette_size[1] = 0;
#endif // CONFIG_PALETTE
for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
+#if CONFIG_EXT_INTRA
+ const int is_directional_mode =
+ av1_is_directional_mode(mode, mbmi->sb_type);
+#endif // CONFIG_EXT_INTRA
if (!(cpi->sf.intra_uv_mode_mask[txsize_sqr_up_map[max_tx_size]] &
(1 << mode)))
continue;
mbmi->uv_mode = mode;
#if CONFIG_EXT_INTRA
- is_directional_mode = av1_is_directional_mode(mode, mbmi->sb_type);
- rate_overhead = cpi->intra_uv_mode_cost[mbmi->mode][mode] +
- write_uniform_cost(2 * MAX_ANGLE_DELTA_UV + 1, 0);
mbmi->angle_delta[1] = 0;
if (is_directional_mode) {
+ const int rate_overhead =
+ cpi->intra_uv_mode_cost[mbmi->mode][mode] +
+ write_uniform_cost(2 * MAX_ANGLE_DELTA_UV + 1, 0);
if (!rd_pick_intra_angle_sbuv(cpi, x, bsize, rate_overhead, best_rd,
&this_rate, &tokenonly_rd_stats))
continue;
} else {
+#endif // CONFIG_EXT_INTRA
if (!super_block_uvrd(cpi, x, &tokenonly_rd_stats, bsize, best_rd)) {
#if CONFIG_PVQ
od_encode_rollback(&x->daala_enc, &buf);
#endif
continue;
}
+#if CONFIG_EXT_INTRA
}
+#endif // CONFIG_EXT_INTRA
this_rate =
tokenonly_rd_stats.rate + cpi->intra_uv_mode_cost[mbmi->mode][mode];
+
+#if CONFIG_EXT_INTRA
if (is_directional_mode) {
this_rate +=
write_uniform_cost(2 * MAX_ANGLE_DELTA_UV + 1,
MAX_ANGLE_DELTA_UV + mbmi->angle_delta[1]);
}
-#else // CONFIG_EXT_INTRA
- if (!super_block_uvrd(cpi, x, &tokenonly_rd_stats, bsize, best_rd)) {
-#if CONFIG_PVQ
- od_encode_rollback(&x->daala_enc, &buf);
-#endif
- continue;
- }
- this_rate =
- tokenonly_rd_stats.rate + cpi->intra_uv_mode_cost[mbmi->mode][mode];
#endif // CONFIG_EXT_INTRA
-
#if CONFIG_FILTER_INTRA
if (mbmi->sb_type >= BLOCK_8X8 && mode == DC_PRED)
this_rate += av1_cost_bit(cpi->common.fc->filter_intra_probs[1], 0);
@@ -4769,10 +4755,7 @@
#endif
if (this_rd < best_rd) {
- mode_selected = mode;
-#if CONFIG_EXT_INTRA
- best_angle_delta = mbmi->angle_delta[1];
-#endif // CONFIG_EXT_INTRA
+ best_mbmi = *mbmi;
best_rd = this_rd;
*rate = this_rate;
*rate_tokenonly = tokenonly_rd_stats.rate;
@@ -4784,41 +4767,22 @@
#if CONFIG_PALETTE
if (cpi->common.allow_screen_content_tools && mbmi->sb_type >= BLOCK_8X8) {
best_palette_color_map = x->palette_buffer->best_palette_color_map;
- rd_pick_palette_intra_sbuv(
- cpi, x, cpi->intra_uv_mode_cost[mbmi->mode][DC_PRED],
- &palette_mode_info, best_palette_color_map, &mode_selected, &best_rd,
- rate, rate_tokenonly, distortion, skippable);
+ rd_pick_palette_intra_sbuv(cpi, x,
+ cpi->intra_uv_mode_cost[mbmi->mode][DC_PRED],
+ best_palette_color_map, &best_mbmi, &best_rd,
+ rate, rate_tokenonly, distortion, skippable);
}
#endif // CONFIG_PALETTE
#if CONFIG_FILTER_INTRA
if (mbmi->sb_type >= BLOCK_8X8) {
if (rd_pick_filter_intra_sbuv(cpi, x, rate, rate_tokenonly, distortion,
- skippable, bsize, &best_rd)) {
- mode_selected = mbmi->uv_mode;
- filter_intra_mode_info = mbmi->filter_intra_mode_info;
- }
- }
-
- mbmi->filter_intra_mode_info.use_filter_intra_mode[1] =
- filter_intra_mode_info.use_filter_intra_mode[1];
- if (filter_intra_mode_info.use_filter_intra_mode[1]) {
- mbmi->filter_intra_mode_info.filter_intra_mode[1] =
- filter_intra_mode_info.filter_intra_mode[1];
-#if CONFIG_PALETTE
- palette_mode_info.palette_size[1] = 0;
-#endif // CONFIG_PALETTE
+ skippable, bsize, &best_rd))
+ best_mbmi = *mbmi;
}
#endif // CONFIG_FILTER_INTRA
-#if CONFIG_EXT_INTRA
- mbmi->angle_delta[1] = best_angle_delta;
-#endif // CONFIG_EXT_INTRA
- mbmi->uv_mode = mode_selected;
-#if CONFIG_PALETTE
- pmi->palette_size[1] = palette_mode_info.palette_size[1];
-#endif // CONFIG_PALETTE
-
+ *mbmi = best_mbmi;
// Make sure we actually chose a mode
assert(best_rd < INT64_MAX);
return best_rd;