Commit c1f411bc authored by Hui Su's avatar Hui Su

Palette: modify the context slightly

Use the number of pixels in a block as context, rather than the bsize
itself. The rectangular blocks therefore share the same context, e.g.
BLOCK_8X16 and BLOCK_16X8.

The number of contexts is reduced from 10 to 7.
Almost no coding performance changes.

Change-Id: Ib3241194580c2b93ad0e953957cdc9188393d055
parent 47468d2f
......@@ -1139,37 +1139,31 @@ static const aom_cdf_prob default_single_ref_cdf[REF_CONTEXTS][SINGLE_REFS - 1]
// TODO(huisu): tune these cdfs
const aom_cdf_prob
default_palette_y_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(PALETTE_SIZES)] = {
default_palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)] = {
{ AOM_CDF7(12288, 19408, 24627, 26662, 28499, 30667) },
{ AOM_CDF7(2815, 4570, 9416, 10875, 13782, 19863) },
{ AOM_CDF7(3839, 5986, 11949, 13413, 16286, 21823) },
{ AOM_CDF7(12032, 14948, 22187, 23138, 24756, 27635) },
{ AOM_CDF7(14847, 20167, 25433, 26751, 28278, 30119) },
{ AOM_CDF7(14336, 20240, 24840, 26079, 27908, 30034) },
{ AOM_CDF7(18816, 25574, 29030, 29877, 30656, 31506) },
{ AOM_CDF7(23039, 27333, 30220, 30708, 31070, 31826) },
{ AOM_CDF7(13696, 18911, 23620, 25371, 29821, 31617) },
{ AOM_CDF7(12543, 20838, 27455, 28762, 29763, 31546) },
};
const aom_cdf_prob default_palette_uv_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(
PALETTE_SIZES)] = {
{ AOM_CDF7(20480, 29888, 32453, 32715, 32751, 32766) },
{ AOM_CDF7(11135, 23641, 31056, 31998, 32496, 32668) },
{ AOM_CDF7(9216, 23108, 30806, 31871, 32414, 32637) },
{ AOM_CDF7(9984, 21999, 29192, 30645, 31640, 32402) },
{ AOM_CDF7(7552, 16614, 24880, 27283, 29254, 31203) },
{ AOM_CDF7(9600, 20279, 27548, 29261, 30494, 31631) },
{ AOM_CDF7(11391, 18656, 23727, 26058, 27788, 30278) },
{ AOM_CDF7(8576, 13585, 17632, 20884, 23948, 27152) },
{ AOM_CDF7(15360, 24200, 26978, 30846, 31409, 32545) },
{ AOM_CDF7(9216, 14276, 19043, 22689, 25799, 28712) },
};
const aom_cdf_prob
default_palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)] = {
{ AOM_CDF7(20480, 29888, 32453, 32715, 32751, 32766) },
{ AOM_CDF7(11135, 23641, 31056, 31998, 32496, 32668) },
{ AOM_CDF7(9984, 21999, 29192, 30645, 31640, 32402) },
{ AOM_CDF7(7552, 16614, 24880, 27283, 29254, 31203) },
{ AOM_CDF7(11391, 18656, 23727, 26058, 27788, 30278) },
{ AOM_CDF7(8576, 13585, 17632, 20884, 23948, 27152) },
{ AOM_CDF7(9216, 14276, 19043, 22689, 25799, 28712) },
};
// When palette mode is enabled, following probability tables indicate the
// probabilities to code the "is_palette" bit (i.e. the bit that indicates
// if this block uses palette mode or DC_PRED mode).
const aom_cdf_prob default_palette_y_mode_cdf[PALETTE_BLOCK_SIZES]
const aom_cdf_prob default_palette_y_mode_cdf[PALATTE_BSIZE_CTXS]
[PALETTE_Y_MODE_CONTEXTS]
[CDF_SIZE(2)] = {
{ { AOM_CDF2(128 * 240) },
......@@ -1193,15 +1187,6 @@ const aom_cdf_prob default_palette_y_mode_cdf[PALETTE_BLOCK_SIZES]
{ { AOM_CDF2(128 * 240) },
{ AOM_CDF2(128 * 180) },
{ AOM_CDF2(128 * 100) } },
{ { AOM_CDF2(128 * 240) },
{ AOM_CDF2(128 * 180) },
{ AOM_CDF2(128 * 100) } },
{ { AOM_CDF2(128 * 240) },
{ AOM_CDF2(128 * 180) },
{ AOM_CDF2(128 * 100) } },
{ { AOM_CDF2(128 * 240) },
{ AOM_CDF2(128 * 180) },
{ AOM_CDF2(128 * 100) } },
};
const aom_cdf_prob
......
......@@ -148,16 +148,15 @@ typedef struct frame_contexts {
#endif // CONFIG_EXT_WARPED_MOTION
aom_cdf_prob obmc_cdf[BLOCK_SIZES_ALL][CDF_SIZE(2)];
aom_prob comp_inter_prob[COMP_INTER_CONTEXTS];
aom_cdf_prob palette_y_size_cdf[PALETTE_BLOCK_SIZES][CDF_SIZE(PALETTE_SIZES)];
aom_cdf_prob palette_uv_size_cdf[PALETTE_BLOCK_SIZES]
[CDF_SIZE(PALETTE_SIZES)];
aom_cdf_prob palette_y_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
aom_cdf_prob palette_uv_size_cdf[PALATTE_BSIZE_CTXS][CDF_SIZE(PALETTE_SIZES)];
aom_cdf_prob palette_y_color_index_cdf[PALETTE_SIZES]
[PALETTE_COLOR_INDEX_CONTEXTS]
[CDF_SIZE(PALETTE_COLORS)];
aom_cdf_prob palette_uv_color_index_cdf[PALETTE_SIZES]
[PALETTE_COLOR_INDEX_CONTEXTS]
[CDF_SIZE(PALETTE_COLORS)];
aom_cdf_prob palette_y_mode_cdf[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS]
aom_cdf_prob palette_y_mode_cdf[PALATTE_BSIZE_CTXS][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)];
......
......@@ -70,15 +70,19 @@ extern "C" {
#endif
#define MIN_PALETTE_BSIZE BLOCK_8X8
#define MAX_PALETTE_BSIZE BLOCK_64X64
#define MAX_PALETTE_SQUARE (64 * 64)
// Maximum number of colors in a palette.
#define PALETTE_MAX_SIZE 8
// Minimum number of colors in a palette.
#define PALETTE_MIN_SIZE 2
// Palette mode is available for block sizes between MIN_PALETTE_BSIZE and
// MAX_PALETTE_BSIZE.
#define PALETTE_BLOCK_SIZES (MAX_PALETTE_BSIZE - MIN_PALETTE_BSIZE + 1)
// Map the number of pixels in a block size to a context
// 64(BLOCK_8X8) -> 0
// 128(BLOCK_16X8, BLOCK_16X8) -> 1
// 256(BLOCK_16X16) -> 2
// ...
// 4096(BLOCK_64X64) -> 6
#define PALATTE_BSIZE_CTXS 7
#if CONFIG_FRAME_MARKER
#define FRAME_OFFSET_BITS 5
......
......@@ -184,6 +184,10 @@ int av1_get_pred_context_switchable_interp(const MACROBLOCKD *xd);
int av1_get_palette_cache(const MACROBLOCKD *const xd, int plane,
uint16_t *cache);
static INLINE int av1_get_palette_bsize_ctx(BLOCK_SIZE bsize) {
return num_pels_log2_lookup[bsize] - num_pels_log2_lookup[MIN_PALETTE_BSIZE];
}
int av1_get_intra_inter_context(const MACROBLOCKD *xd);
int av1_get_reference_mode_context(const AV1_COMMON *cm, const MACROBLOCKD *xd);
......
......@@ -822,7 +822,7 @@ static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
const BLOCK_SIZE bsize = mbmi->sb_type;
assert(av1_allow_palette(cm->allow_screen_content_tools, bsize));
PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
const int block_palette_idx = bsize - BLOCK_8X8;
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
if (mbmi->mode == DC_PRED) {
int palette_y_mode_ctx = 0;
......@@ -835,13 +835,11 @@ static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
(left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
}
const int modev = aom_read_symbol(
r,
xd->tile_ctx->palette_y_mode_cdf[block_palette_idx][palette_y_mode_ctx],
2, ACCT_STR);
r, xd->tile_ctx->palette_y_mode_cdf[bsize_ctx][palette_y_mode_ctx], 2,
ACCT_STR);
if (modev) {
pmi->palette_size[0] =
aom_read_symbol(r,
xd->tile_ctx->palette_y_size_cdf[block_palette_idx],
aom_read_symbol(r, xd->tile_ctx->palette_y_size_cdf[bsize_ctx],
PALETTE_SIZES, ACCT_STR) +
2;
read_palette_colors_y(xd, cm->bit_depth, pmi, r);
......@@ -853,8 +851,7 @@ static void read_palette_mode_info(AV1_COMMON *const cm, MACROBLOCKD *const xd,
r, xd->tile_ctx->palette_uv_mode_cdf[palette_uv_mode_ctx], 2, ACCT_STR);
if (modev) {
pmi->palette_size[1] =
aom_read_symbol(r,
xd->tile_ctx->palette_uv_size_cdf[block_palette_idx],
aom_read_symbol(r, xd->tile_ctx->palette_uv_size_cdf[bsize_ctx],
PALETTE_SIZES, ACCT_STR) +
2;
read_palette_colors_uv(xd, cm->bit_depth, pmi, r);
......
......@@ -1023,7 +1023,7 @@ static void write_palette_mode_info(const AV1_COMMON *cm, const MACROBLOCKD *xd,
const BLOCK_SIZE bsize = mbmi->sb_type;
assert(av1_allow_palette(cm->allow_screen_content_tools, bsize));
const PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
const int block_palette_idx = bsize - BLOCK_8X8;
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
if (mbmi->mode == DC_PRED) {
const int n = pmi->palette_size[0];
......@@ -1038,11 +1038,10 @@ static void write_palette_mode_info(const AV1_COMMON *cm, const MACROBLOCKD *xd,
}
aom_write_symbol(
w, n > 0,
xd->tile_ctx->palette_y_mode_cdf[block_palette_idx][palette_y_mode_ctx],
2);
xd->tile_ctx->palette_y_mode_cdf[bsize_ctx][palette_y_mode_ctx], 2);
if (n > 0) {
aom_write_symbol(w, n - PALETTE_MIN_SIZE,
xd->tile_ctx->palette_y_size_cdf[block_palette_idx],
xd->tile_ctx->palette_y_size_cdf[bsize_ctx],
PALETTE_SIZES);
write_palette_colors_y(xd, pmi, cm->bit_depth, w);
}
......@@ -1060,7 +1059,7 @@ static void write_palette_mode_info(const AV1_COMMON *cm, const MACROBLOCKD *xd,
xd->tile_ctx->palette_uv_mode_cdf[palette_uv_mode_ctx], 2);
if (n > 0) {
aom_write_symbol(w, n - PALETTE_MIN_SIZE,
xd->tile_ctx->palette_uv_size_cdf[block_palette_idx],
xd->tile_ctx->palette_uv_size_cdf[bsize_ctx],
PALETTE_SIZES);
write_palette_colors_uv(xd, pmi, cm->bit_depth, w);
}
......
......@@ -305,13 +305,13 @@ struct macroblock {
#else
int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES];
#endif // CONFIG_EXT_PARTITION_TYPES
int palette_y_size_cost[PALETTE_BLOCK_SIZES][PALETTE_SIZES];
int palette_uv_size_cost[PALETTE_BLOCK_SIZES][PALETTE_SIZES];
int palette_y_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
int palette_uv_size_cost[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
int palette_y_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
[PALETTE_COLORS];
int palette_uv_color_cost[PALETTE_SIZES][PALETTE_COLOR_INDEX_CONTEXTS]
[PALETTE_COLORS];
int palette_y_mode_cost[PALETTE_BLOCK_SIZES][PALETTE_Y_MODE_CONTEXTS][2];
int palette_y_mode_cost[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2];
int palette_uv_mode_cost[PALETTE_UV_MODE_CONTEXTS][2];
#if CONFIG_CFL
// The rate associated with each alpha codeword
......
......@@ -4220,7 +4220,7 @@ static void update_palette_cdf(MACROBLOCKD *xd, const MODE_INFO *mi) {
const PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info;
assert(bsize >= BLOCK_8X8 && bsize <= BLOCK_LARGEST);
const int block_palette_idx = bsize - BLOCK_8X8;
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
if (mbmi->mode == DC_PRED) {
const int n = pmi->palette_size[0];
......@@ -4233,8 +4233,7 @@ static void update_palette_cdf(MACROBLOCKD *xd, const MODE_INFO *mi) {
palette_y_mode_ctx +=
(left_mi->mbmi.palette_mode_info.palette_size[0] > 0);
}
update_cdf(fc->palette_y_mode_cdf[block_palette_idx][palette_y_mode_ctx],
n > 0, 2);
update_cdf(fc->palette_y_mode_cdf[bsize_ctx][palette_y_mode_ctx], n > 0, 2);
}
if (mbmi->uv_mode == UV_DC_PRED) {
......
......@@ -130,7 +130,7 @@ void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x,
av1_cost_tokens_from_cdf(x->switchable_interp_costs[i],
fc->switchable_interp_cdf[i], NULL);
for (i = 0; i < PALETTE_BLOCK_SIZES; ++i) {
for (i = 0; i < PALATTE_BSIZE_CTXS; ++i) {
av1_cost_tokens_from_cdf(x->palette_y_size_cost[i],
fc->palette_y_size_cdf[i], NULL);
av1_cost_tokens_from_cdf(x->palette_uv_size_cost[i],
......
......@@ -2855,11 +2855,11 @@ static void palette_rd_y(const AV1_COMP *const cpi, MACROBLOCK *x,
&cols);
av1_calc_indices(data, centroids, color_map, rows * cols, k, 1);
extend_palette_color_map(color_map, cols, rows, block_width, block_height);
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
int palette_mode_cost =
dc_mode_cost +
x->palette_y_size_cost[bsize - BLOCK_8X8][k - PALETTE_MIN_SIZE] +
dc_mode_cost + x->palette_y_size_cost[bsize_ctx][k - PALETTE_MIN_SIZE] +
write_uniform_cost(k, color_map[0]) +
x->palette_y_mode_cost[bsize - BLOCK_8X8][palette_ctx][1];
x->palette_y_mode_cost[bsize_ctx][palette_ctx][1];
palette_mode_cost += av1_palette_color_cost_y(pmi, color_cache, n_cache,
cpi->common.bit_depth);
palette_mode_cost +=
......@@ -3491,8 +3491,8 @@ static int64_t rd_pick_intra_sby_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
tx_size_cost(&cpi->common, x, bsize, mbmi->tx_size);
}
if (try_palette && mbmi->mode == DC_PRED) {
this_rate +=
x->palette_y_mode_cost[bsize - BLOCK_8X8][palette_y_mode_ctx][0];
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
this_rate += x->palette_y_mode_cost[bsize_ctx][palette_y_mode_ctx][0];
}
#if CONFIG_FILTER_INTRA
if (mbmi->mode == DC_PRED && av1_filter_intra_allowed_txsize(mbmi->tx_size))
......@@ -5251,11 +5251,11 @@ static void rd_pick_palette_intra_sbuv(const AV1_COMP *const cpi, MACROBLOCK *x,
super_block_uvrd(cpi, x, &tokenonly_rd_stats, bsize, *best_rd);
if (tokenonly_rd_stats.rate == INT_MAX) continue;
this_rate =
tokenonly_rd_stats.rate + dc_mode_cost +
x->palette_uv_size_cost[bsize - BLOCK_8X8][n - PALETTE_MIN_SIZE] +
write_uniform_cost(n, color_map[0]) +
x->palette_uv_mode_cost[pmi->palette_size[0] > 0][1];
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);
......@@ -9888,7 +9888,8 @@ void av1_rd_pick_inter_mode_sb(const AV1_COMP *cpi, TileDataEnc *tile_data,
rate2 += rate_uv + x->intra_uv_mode_cost[mbmi->mode][mbmi->uv_mode];
if (try_palette && mbmi->mode == DC_PRED) {
rate2 += x->palette_y_mode_cost[bsize - BLOCK_8X8][palette_ctx][0];
const int bsize_ctx = av1_get_palette_bsize_ctx(bsize);
rate2 += x->palette_y_mode_cost[bsize_ctx][palette_ctx][0];
}
if (!xd->lossless[mbmi->segment_id] && block_signals_txsize(bsize)) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment