NEW_MULTISYMBOL: adapt palette mode coding.
Use adaptive CDFs for coding the palette mode.
Change-Id: Iadbccfea4f4a38f3037814a609adf3f3ae2c835d
diff --git a/av1/common/entropy.c b/av1/common/entropy.c
index d977941..988699b 100644
--- a/av1/common/entropy.c
+++ b/av1/common/entropy.c
@@ -2284,6 +2284,10 @@
#if CONFIG_MRC_TX
AVERAGE_TILE_CDFS(mrc_mask_intra_cdf)
#endif // CONFIG_MRC_TX
+#if CONFIG_NEW_MULTISYMBOL
+ AVERAGE_TILE_CDFS(palette_y_mode_cdf)
+ AVERAGE_TILE_CDFS(palette_uv_size_cdf)
+#endif
}
void av1_average_tile_inter_cdfs(AV1_COMMON *cm, FRAME_CONTEXT *fc,
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c
index 33a7a27..cc04228 100644
--- a/av1/common/entropymode.c
+++ b/av1/common/entropymode.c
@@ -1644,6 +1644,61 @@
253, 229
};
+#if CONFIG_NEW_MULTISYMBOL
+const aom_cdf_prob
+ default_palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS]
+ [CDF_SIZE(2)] = {
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+#if CONFIG_EXT_PARTITION
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+ { { AOM_ICDF(128 * 240), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 180), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 100), AOM_ICDF(32768), 0 } },
+#endif // CONFIG_EXT_PARTITION
+ };
+
+const aom_cdf_prob
+ default_palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)] = {
+ { AOM_ICDF(128 * 253), AOM_ICDF(32768), 0 },
+ { AOM_ICDF(128 * 229), AOM_ICDF(32768), 0 }
+ };
+
+#endif
+
const aom_cdf_prob default_palette_y_color_index_cdf
[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS][CDF_SIZE(PALETTE_COLORS)] = {
{
@@ -4920,6 +4975,8 @@
#endif // CONFIG_EXT_COMP_REFS
av1_copy(fc->comp_ref_prob, default_comp_ref_p);
#if CONFIG_NEW_MULTISYMBOL
+ av1_copy(fc->palette_y_mode_cdf, default_palette_y_mode_cdf);
+ av1_copy(fc->palette_uv_mode_cdf, default_palette_uv_mode_cdf);
av1_copy(fc->comp_ref_cdf, default_comp_ref_cdf);
#endif
#if CONFIG_LV_MAP
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h
index 45d5496..3029e94 100644
--- a/av1/common/entropymode.h
+++ b/av1/common/entropymode.h
@@ -261,6 +261,9 @@
[CDF_SIZE(PALETTE_COLORS)];
#endif // CONFIG_MRC_TX
#if CONFIG_NEW_MULTISYMBOL
+ aom_cdf_prob palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS]
+ [CDF_SIZE(2)];
+ aom_cdf_prob palette_uv_mode_cdf[PALETTE_UV_MODE_CONTEXTS][CDF_SIZE(2)];
aom_cdf_prob comp_inter_cdf[COMP_INTER_CONTEXTS][CDF_SIZE(2)];
aom_cdf_prob single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1][CDF_SIZE(2)];
#endif
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 4fea6d0..368d1ff 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -789,6 +789,7 @@
assert(bsize >= BLOCK_8X8 && bsize <= BLOCK_LARGEST);
const int block_palette_idx = bsize - BLOCK_8X8;
+ int modev;
if (mbmi->mode == DC_PRED) {
int palette_y_mode_ctx = 0;
@@ -800,9 +801,18 @@
palette_y_mode_ctx +=
(left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
}
- if (aom_read(r, av1_default_palette_y_mode_prob[block_palette_idx]
- [palette_y_mode_ctx],
- ACCT_STR)) {
+#if CONFIG_NEW_MULTISYMBOL
+ modev = aom_read_symbol(
+ r,
+ xd->tile_ctx->palette_y_mode_cdf[block_palette_idx][palette_y_mode_ctx],
+ 2, ACCT_STR);
+#else
+ modev = aom_read(
+ r,
+ av1_default_palette_y_mode_prob[block_palette_idx][palette_y_mode_ctx],
+ ACCT_STR);
+#endif
+ if (modev) {
pmi->palette_size[0] =
aom_read_symbol(r,
xd->tile_ctx->palette_y_size_cdf[block_palette_idx],
@@ -816,11 +826,16 @@
#endif // CONFIG_PALETTE_DELTA_ENCODING
}
}
-
if (mbmi->uv_mode == UV_DC_PRED) {
const int palette_uv_mode_ctx = (pmi->palette_size[0] > 0);
- if (aom_read(r, av1_default_palette_uv_mode_prob[palette_uv_mode_ctx],
- ACCT_STR)) {
+#if CONFIG_NEW_MULTISYMBOL
+ modev = aom_read_symbol(
+ r, xd->tile_ctx->palette_uv_mode_cdf[palette_uv_mode_ctx], 2, ACCT_STR);
+#else
+ modev = aom_read(r, av1_default_palette_uv_mode_prob[palette_uv_mode_ctx],
+ ACCT_STR);
+#endif
+ if (modev) {
pmi->palette_size[1] =
aom_read_symbol(r,
xd->tile_ctx->palette_uv_size_cdf[block_palette_idx],
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index df02e9f..efefdb3 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -1502,9 +1502,16 @@
palette_y_mode_ctx +=
(left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
}
+#if CONFIG_NEW_MULTISYMBOL
+ aom_write_symbol(
+ w, n > 0,
+ xd->tile_ctx->palette_y_mode_cdf[block_palette_idx][palette_y_mode_ctx],
+ 2);
+#else
aom_write(
w, n > 0,
av1_default_palette_y_mode_prob[block_palette_idx][palette_y_mode_ctx]);
+#endif
if (n > 0) {
aom_write_symbol(w, n - PALETTE_MIN_SIZE,
xd->tile_ctx->palette_y_size_cdf[block_palette_idx],
@@ -1523,7 +1530,12 @@
if (mbmi->uv_mode == UV_DC_PRED) {
const int n = pmi->palette_size[1];
const int palette_uv_mode_ctx = (pmi->palette_size[0] > 0);
+#if CONFIG_NEW_MULTISYMBOL
+ aom_write_symbol(w, n > 0,
+ xd->tile_ctx->palette_uv_mode_cdf[palette_uv_mode_ctx], 2);
+#else
aom_write(w, n > 0, av1_default_palette_uv_mode_prob[palette_uv_mode_ctx]);
+#endif
if (n > 0) {
aom_write_symbol(w, n - PALETTE_MIN_SIZE,
xd->tile_ctx->palette_uv_size_cdf[block_palette_idx],