Make palette work correctly with chroma sub8x8 blocks.
The problem was that some functions were using scale_chroma_bsize()
function to turn sub-8x8 'bsize' to 8x8 'bsize', and then the modified
'bsize' was being passed to rd_pick_intra_sbuv_mode() for example.
In such cases, we cannot rely on the 'bsize' value passed to the
function; instead, we need to look at the original mbmi->sb_type
directly.
Also:
- Added created a common function can_use_palette() to refactor this
logic into one place.
- Added more asserts to easily catch such coding errors in future.
BUG=aomedia:688
Change-Id: I2e9f20c8c5fbc4b3ff41b703a91a02758c3c632f
diff --git a/av1/decoder/detokenize.c b/av1/decoder/detokenize.c
index 3aefc9f..89d9ef3 100644
--- a/av1/decoder/detokenize.c
+++ b/av1/decoder/detokenize.c
@@ -231,6 +231,7 @@
plane ? xd->tile_ctx->palette_uv_color_index_cdf
: xd->tile_ctx->palette_y_color_index_cdf;
int plane_block_width, plane_block_height, rows, cols;
+ assert(mbmi->sb_type >= BLOCK_8X8);
av1_get_block_dimensions(mbmi->sb_type, plane, xd, &plane_block_width,
&plane_block_height, &rows, &cols);
assert(plane == 0 || plane == 1);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 6736787..ba45253 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -3107,6 +3107,7 @@
MODE_INFO *const mic = xd->mi[0];
MB_MODE_INFO *const mbmi = &mic->mbmi;
assert(!is_inter_block(mbmi));
+ assert(bsize >= BLOCK_8X8);
int this_rate, colors, n;
const int src_stride = x->plane[0].src.stride;
const uint8_t *const src = x->plane[0].src.buf;
@@ -4269,6 +4270,15 @@
#endif // CONFIG_HIGHBITDEPTH
#endif // CONFIG_EXT_INTRA
+#if CONFIG_PALETTE
+// Returns true if palette can be used for this block.
+static int can_use_palette(const AV1_COMP *const cpi,
+ const MB_MODE_INFO *const mbmi) {
+ return cpi->common.allow_screen_content_tools && mbmi->sb_type >= BLOCK_8X8 &&
+ mbmi->sb_type <= BLOCK_LARGEST;
+}
+#endif // CONFIG_PALETTE
+
// This function is used only for intra_only frames
static int64_t rd_pick_intra_sby_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
int *rate, int *rate_tokenonly,
@@ -4303,8 +4313,7 @@
? x->palette_buffer->best_palette_color_map
: NULL;
int palette_y_mode_ctx = 0;
- const int try_palette = cpi->common.allow_screen_content_tools &&
- bsize >= BLOCK_8X8 && bsize <= BLOCK_LARGEST;
+ const int try_palette = can_use_palette(cpi, mbmi);
#endif // CONFIG_PALETTE
const MODE_INFO *above_mi = xd->above_mi;
const MODE_INFO *left_mi = xd->left_mi;
@@ -5520,6 +5529,7 @@
assert(!is_inter_block(mbmi));
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
const BLOCK_SIZE bsize = mbmi->sb_type;
+ assert(bsize >= BLOCK_8X8);
int this_rate;
int64_t this_rd;
int colors_u, colors_v, colors;
@@ -6038,8 +6048,7 @@
#endif // CONFIG_PVQ
#if CONFIG_PALETTE
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
- const int try_palette = cpi->common.allow_screen_content_tools &&
- bsize >= BLOCK_8X8 && bsize <= BLOCK_LARGEST;
+ const int try_palette = can_use_palette(cpi, mbmi);
#endif // CONFIG_PALETTE
for (int mode_idx = 0; mode_idx < UV_INTRA_MODES; ++mode_idx) {
@@ -10065,6 +10074,7 @@
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
const BLOCK_SIZE bsize = mbmi->sb_type;
+ assert(bsize >= BLOCK_8X8);
int src_stride = x->plane[1].src.stride;
const uint8_t *const src_u = x->plane[1].src.buf;
const uint8_t *const src_v = x->plane[2].src.buf;
@@ -10134,8 +10144,7 @@
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
#if CONFIG_PALETTE
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
- const int try_palette = cpi->common.allow_screen_content_tools &&
- bsize >= BLOCK_8X8 && bsize <= BLOCK_LARGEST;
+ const int try_palette = can_use_palette(cpi, mbmi);
#endif // CONFIG_PALETTE
int rate2 = 0, rate_y = INT_MAX, skippable = 0, rate_uv, rate_dummy, i;
int dc_mode_index;
@@ -10305,8 +10314,7 @@
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
#if CONFIG_PALETTE
- const int try_palette =
- cpi->common.allow_screen_content_tools && bsize >= BLOCK_8X8;
+ const int try_palette = can_use_palette(cpi, mbmi);
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
#endif // CONFIG_PALETTE
MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
@@ -12278,7 +12286,8 @@
best_mode_skippable);
#if CONFIG_PALETTE
- if (cm->allow_screen_content_tools && pmi->palette_size[1] > 0) {
+ if (pmi->palette_size[1] > 0) {
+ assert(try_palette);
restore_uv_color_map(cpi, x);
}
#endif // CONFIG_PALETTE