Merge "Refactor 4:4:4 palette selection." into nextgen

This commit is contained in:
Alex Converse 2015-04-28 19:07:40 +00:00 committed by Gerrit Code Review
commit cb437f800f

View File

@ -5341,6 +5341,266 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
return 0; // The rate-distortion cost will be re-calculated by caller.
}
#if CONFIG_PALETTE
static void rd_pick_palette_444(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost,
BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
int64_t best_rd) {
VP9_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &x->e_mbd;
int rate_y, rate_uv, rate_y_tokenonly, rate_uv_tokenonly, y_skip, uv_skip;
int64_t dist_y, dist_uv;
uint8_t *src_y = x->plane[0].src.buf;
uint8_t *src_u = x->plane[1].src.buf;
uint8_t *src_v = x->plane[2].src.buf;
uint8_t palette_color_map_copy[4096];
int rows = 4 * num_4x4_blocks_high_lookup[bsize];
int cols = 4 * num_4x4_blocks_wide_lookup[bsize];
int src_stride_y = x->plane[0].src.stride;
int src_stride_uv = x->plane[1].src.stride;
int colors = vp9_count_colors(src_y, src_stride_y, rows, cols);
if (colors >= 2 && colors <= 64 && cm->allow_palette_mode) {
uint8_t best_palette[PALETTE_MAX_SIZE * 3];
uint8_t best_index[PALETTE_MAX_SIZE], best_literal[PALETTE_MAX_SIZE];
int8_t palette_color_delta[PALETTE_MAX_SIZE];
int64_t local_tx_cache[TX_MODES], sse;
int m1, m2, n, best_bits, best_n = 0;
int r, c, i, j, max_itr = 200;
int palette_size_cost[PALETTE_SIZES];
int best_m1 = 0, best_m2 = 0, palette_delta_bitdepth = 0;
int color_ctx = 0, color_idx = 0;
int color_order[PALETTE_MAX_SIZE];
double centroids[3 * PALETTE_MAX_SIZE];
double lb = src_y[0], ub = src_y[0];
MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
MB_MODE_INFO mbmi_copy;
RD_COST palette_rd, palette_best_rd;
uint8_t *color_map;
#if CONFIG_TX_SKIP
int q_idx = vp9_get_qindex(&cpi->common.seg, mbmi->segment_id,
cpi->common.base_qindex);
int try_tx_skip = q_idx <= TX_SKIP_Q_THRESH_INTRA;
int this_rate_tokenonly_s, s_s;
int tx_skipped = 0, tx_skipped_uv = 0;
int64_t this_distortion_s;
#endif // CONFIG_TX_SKIP
palette_best_rd.rate = INT_MAX;
palette_best_rd.dist = INT64_MAX;
palette_best_rd.rdcost = INT64_MAX;
mbmi_copy = *mbmi;
if (mbmi->palette_enabled[0])
vpx_memcpy(palette_color_map_copy, xd->plane[0].color_index_map,
rows * cols * sizeof(xd->plane[0].color_index_map[0]));
vpx_memset(x->kmeans_data_buffer, 0,
sizeof(x->kmeans_data_buffer[0]) * 3 * 4096);
vpx_memset(xd->palette_map_buffer, 0,
sizeof(xd->palette_map_buffer[0]) * 4096);
vpx_memset(centroids, 0, sizeof(centroids[0]) * 3 * PALETTE_MAX_SIZE);
vp9_cost_tokens(palette_size_cost,
cpi->common.fc.palette_size_prob[bsize - BLOCK_8X8],
vp9_palette_size_tree);
for (i = 0; i < 2; i++) mbmi->palette_enabled[i] = 1;
#if CONFIG_FILTERINTRA
mbmi->filterbit = 0;
mbmi->uv_filterbit = 0;
#endif // CONFIG_FILTERINTRA
for (r = 0; r < rows; r++) {
for (c = 0; c < cols; c++) {
x->kmeans_data_buffer[(r * cols + c) * 3] = src_y[r * src_stride_y + c];
x->kmeans_data_buffer[(r * cols + c) * 3 + 1] =
src_u[r * src_stride_uv + c];
x->kmeans_data_buffer[(r * cols + c) * 3 + 2] =
src_v[r * src_stride_uv + c];
}
}
for (n = colors > PALETTE_MAX_SIZE ? PALETTE_MAX_SIZE : colors; n >= 2;
n--) {
for (i = 0; i < n; i++) {
centroids[i * 3] = lb + (2 * i + 1) * (ub - lb) / n / 2;
centroids[i * 3 + 1] = 128;
centroids[i * 3 + 2] = 128;
}
r = vp9_k_means(x->kmeans_data_buffer, centroids,
x->kmeans_indices_buffer, rows * cols, n, 3, max_itr);
for (i = 0; i < 3; i++) {
for (j = 0; j < n; j++)
mbmi->palette_colors[i * PALETTE_MAX_SIZE + j] =
clip_pixel(round(centroids[j * 3 + i]));
}
for (r = 0; r < rows; r++)
for (c = 0; c < cols; c++)
xd->plane[0].color_index_map[r * cols + c] =
x->kmeans_indices_buffer[r * cols + c];
m1 = 0;
m2 = n;
best_bits = 0;
vpx_memcpy(mbmi->palette_literal_colors, mbmi->palette_colors,
m2 * sizeof(mbmi->palette_literal_colors[0]));
#if CONFIG_TX_SKIP
mbmi->tx_skip[0] = 0;
mbmi->tx_skip[1] = 0;
#endif // CONFIG_TX_SKIP
super_block_yrd(cpi, x, &rate_y_tokenonly, &dist_y, &y_skip, &sse, bsize,
local_tx_cache, best_rd);
#if CONFIG_TX_SKIP
if (try_tx_skip) {
if (rate_y_tokenonly != INT_MAX)
rate_y_tokenonly += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 0);
mbmi->tx_skip[0] = 1;
super_block_yrd(cpi, x, &this_rate_tokenonly_s, &this_distortion_s,
&s_s, NULL, bsize, local_tx_cache, best_rd);
if (this_rate_tokenonly_s != INT_MAX)
this_rate_tokenonly_s +=
vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 1);
if ((this_rate_tokenonly_s != INT_MAX && rate_y_tokenonly == INT_MAX) ||
(RDCOST(x->rdmult, x->rddiv, rate_y_tokenonly, dist_y) >
RDCOST(x->rdmult, x->rddiv, this_rate_tokenonly_s,
this_distortion_s))) {
mbmi->tx_skip[0] = 1;
} else {
mbmi->tx_skip[0] = 0;
}
} else {
mbmi->tx_skip[0] = 0;
}
super_block_yrd(cpi, x, &rate_y_tokenonly, &dist_y, &y_skip, &sse, bsize,
local_tx_cache, best_rd);
#endif // CONFIG_TX_SKIP
if (rate_y_tokenonly == INT_MAX) continue;
super_block_uvrd(cpi, x, &rate_uv_tokenonly, &dist_uv, &uv_skip, &sse,
bsize, best_rd);
#if CONFIG_TX_SKIP
if (try_tx_skip) {
if (rate_uv_tokenonly != INT_MAX)
rate_uv_tokenonly +=
vp9_cost_bit(cpi->common.fc.uv_tx_skip_prob[mbmi->tx_skip[0]], 0);
mbmi->tx_skip[1] = 1;
super_block_uvrd(cpi, x, &this_rate_tokenonly_s, &this_distortion_s,
&s_s, &sse, bsize, best_rd);
if (this_rate_tokenonly_s != INT_MAX)
this_rate_tokenonly_s +=
vp9_cost_bit(cpi->common.fc.uv_tx_skip_prob[mbmi->tx_skip[0]], 1);
if ((this_rate_tokenonly_s != INT_MAX &&
rate_uv_tokenonly == INT_MAX) ||
(RDCOST(x->rdmult, x->rddiv, rate_uv_tokenonly, dist_uv) >
RDCOST(x->rdmult, x->rddiv, this_rate_tokenonly_s,
this_distortion_s))) {
mbmi->tx_skip[1] = 1;
} else {
mbmi->tx_skip[1] = 0;
}
} else {
mbmi->tx_skip[1] = 0;
}
super_block_uvrd(cpi, x, &rate_uv_tokenonly, &dist_uv, &uv_skip, &sse,
bsize, best_rd);
#endif // CONFIG_TX_SKIP
if (rate_uv_tokenonly == INT_MAX) continue;
rate_y = rate_y_tokenonly +
(1 + PALETTE_DELTA_BIT + n * m2) * vp9_cost_bit(128, 0) +
palette_size_cost[n - 2];
color_map = xd->plane[0].color_index_map;
rate_y += vp9_ceil_log2(n) * vp9_cost_bit(128, 0);
for (i = 0; i < rows; i++) {
for (j = (i == 0 ? 1 : 0); j < cols; j++) {
color_ctx = vp9_get_palette_color_context(color_map, cols, i, j, n,
color_order);
for (r = 0; r < n; r++)
if (color_map[i * cols + j] == color_order[r]) {
color_idx = r;
break;
}
rate_y += cpi->palette_color_costs[n - 2][color_ctx][color_idx];
}
}
rate_uv = rate_uv_tokenonly + (1 + 8 * 2 * n) * vp9_cost_bit(128, 0);
#if CONFIG_TX_SKIP
rate_y +=
vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], mbmi->tx_skip[0]);
rate_uv += vp9_cost_bit(cpi->common.fc.uv_tx_skip_prob[mbmi->tx_skip[0]],
mbmi->tx_skip[1]);
#endif // CONFIG_TX_SKIP
if (y_skip && uv_skip) {
palette_rd.rate = rate_y + rate_uv - rate_y_tokenonly -
rate_uv_tokenonly +
vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
palette_rd.dist = dist_y + dist_uv;
} else {
palette_rd.rate =
rate_y + rate_uv + vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
palette_rd.dist = dist_y + dist_uv;
}
palette_rd.rdcost =
RDCOST(x->rdmult, x->rddiv, palette_rd.rate, palette_rd.dist);
if (palette_rd.rdcost < palette_best_rd.rdcost) {
palette_best_rd = palette_rd;
best_n = n;
best_m1 = m1;
best_m2 = m2;
palette_delta_bitdepth = best_bits;
#if CONFIG_TX_SKIP
tx_skipped = mbmi->tx_skip[0];
tx_skipped_uv = mbmi->tx_skip[1];
#endif // CONFIG_TX_SKIP
vpx_memcpy(best_palette, mbmi->palette_colors,
PALETTE_MAX_SIZE * 3 * sizeof(best_palette[0]));
vpx_memcpy(best_index, mbmi->palette_indexed_colors,
best_m1 * sizeof(best_index[0]));
vpx_memcpy(palette_color_delta, mbmi->palette_color_delta,
best_m1 * sizeof(palette_color_delta[0]));
vpx_memcpy(best_literal, mbmi->palette_literal_colors,
best_m2 * sizeof(best_literal[0]));
}
}
if (palette_best_rd.rdcost < rd_cost->rdcost) {
*rd_cost = palette_best_rd;
mbmi->mode = DC_PRED;
mbmi->uv_mode = DC_PRED;
for (i = 0; i < 2; i++) mbmi->palette_enabled[i] = 1;
mbmi->palette_size[0] = best_n;
mbmi->palette_size[1] = best_n;
mbmi->palette_indexed_size = best_m1;
mbmi->palette_literal_size = best_m2;
mbmi->palette_delta_bitdepth = palette_delta_bitdepth;
vpx_memcpy(mbmi->palette_colors, best_palette,
PALETTE_MAX_SIZE * 3 * sizeof(best_palette[0]));
vpx_memcpy(mbmi->palette_indexed_colors, best_index,
best_m1 * sizeof(best_index[0]));
vpx_memcpy(mbmi->palette_color_delta, palette_color_delta,
best_m1 * sizeof(palette_color_delta[0]));
vpx_memcpy(mbmi->palette_literal_colors, best_literal,
best_m2 * sizeof(best_literal[0]));
#if CONFIG_FILTERINTRA
mbmi->filterbit = 0;
mbmi->uv_filterbit = 0;
#endif // CONFIG_FILTERINTRA
#if CONFIG_TX_SKIP
mbmi->tx_skip[0] = tx_skipped;
mbmi->tx_skip[1] = tx_skipped_uv;
#endif // CONFIG_TX_SKIP
} else {
*mbmi = mbmi_copy;
if (mbmi->palette_enabled[0]) {
vpx_memcpy(xd->plane[0].color_index_map, palette_color_map_copy,
rows * cols * sizeof(xd->plane[0].color_index_map[0]));
}
}
ctx->mic = *xd->mi[0].src_mi;
}
}
#endif // CONFIG_PALETTE
void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
#if CONFIG_INTRABC
int mi_row, int mi_col,
@ -5406,264 +5666,7 @@ void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
#if CONFIG_PALETTE
if (bsize >= BLOCK_8X8 && !pd[1].subsampling_x && !pd[1].subsampling_y) {
uint8_t *src_y = x->plane[0].src.buf;
uint8_t *src_u = x->plane[1].src.buf;
uint8_t *src_v = x->plane[2].src.buf;
uint8_t palette_color_map_copy[4096];
int rows = 4 * num_4x4_blocks_high_lookup[bsize];
int cols = 4 * num_4x4_blocks_wide_lookup[bsize];
int src_stride_y = x->plane[0].src.stride;
int src_stride_uv = x->plane[1].src.stride;
int colors = vp9_count_colors(src_y, src_stride_y, rows, cols);
if (colors >= 2 && colors <= 64 && cm->allow_palette_mode) {
uint8_t best_palette[PALETTE_MAX_SIZE * 3];
uint8_t best_index[PALETTE_MAX_SIZE], best_literal[PALETTE_MAX_SIZE];
int8_t palette_color_delta[PALETTE_MAX_SIZE];
int64_t local_tx_cache[TX_MODES], sse;
int m1, m2, n, best_bits, best_n = 0;
int r, c, i, j, max_itr = 200;
int palette_size_cost[PALETTE_SIZES];
int best_m1 = 0, best_m2 = 0, palette_delta_bitdepth = 0;
int color_ctx = 0, color_idx = 0;
int color_order[PALETTE_MAX_SIZE];
double centroids[3 * PALETTE_MAX_SIZE];
double lb = src_y[0], ub = src_y[0];
MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
MB_MODE_INFO mbmi_copy;
RD_COST palette_rd, palette_best_rd;
uint8_t *color_map;
#if CONFIG_TX_SKIP
int q_idx = vp9_get_qindex(&cpi->common.seg, mbmi->segment_id,
cpi->common.base_qindex);
int try_tx_skip = q_idx <= TX_SKIP_Q_THRESH_INTRA;
int this_rate_tokenonly_s, s_s;
int tx_skipped = 0, tx_skipped_uv = 0;
int64_t this_distortion_s;
#endif // CONFIG_TX_SKIP
palette_best_rd.rate = INT_MAX;
palette_best_rd.dist = INT64_MAX;
palette_best_rd.rdcost = INT64_MAX;
mbmi_copy = *mbmi;
if (mbmi->palette_enabled[0])
vpx_memcpy(palette_color_map_copy, xd->plane[0].color_index_map,
rows * cols * sizeof(xd->plane[0].color_index_map[0]));
vpx_memset(x->kmeans_data_buffer, 0,
sizeof(x->kmeans_data_buffer[0]) * 3 * 4096);
vpx_memset(xd->palette_map_buffer, 0,
sizeof(xd->palette_map_buffer[0]) * 4096);
vpx_memset(centroids, 0, sizeof(centroids[0]) * 3 * PALETTE_MAX_SIZE);
vp9_cost_tokens(palette_size_cost,
cpi->common.fc.palette_size_prob[bsize - BLOCK_8X8],
vp9_palette_size_tree);
for (i = 0; i < 2; i++)
mbmi->palette_enabled[i] = 1;
#if CONFIG_FILTERINTRA
mbmi->filterbit = 0;
mbmi->uv_filterbit = 0;
#endif // CONFIG_FILTERINTRA
for (r = 0; r < rows; r++) {
for (c = 0; c < cols; c++) {
x->kmeans_data_buffer[(r * cols + c) * 3] =
src_y[r * src_stride_y + c];
x->kmeans_data_buffer[(r * cols + c) * 3 + 1] =
src_u[r * src_stride_uv + c];
x->kmeans_data_buffer[(r * cols + c) * 3 + 2] =
src_v[r * src_stride_uv + c];
}
}
for (n = colors > PALETTE_MAX_SIZE ? PALETTE_MAX_SIZE : colors;
n >= 2; n--) {
for (i = 0; i < n; i++) {
centroids[i * 3] = lb + (2 * i + 1) * (ub - lb) / n / 2;
centroids[i * 3 + 1] = 128;
centroids[i * 3 + 2] = 128;
}
r = vp9_k_means(x->kmeans_data_buffer, centroids,
x->kmeans_indices_buffer, rows * cols, n, 3, max_itr);
for (i = 0; i < 3; i++) {
for (j = 0; j < n; j++)
mbmi->palette_colors[i * PALETTE_MAX_SIZE + j] =
clip_pixel(round(centroids[j * 3 + i]));
}
for (r = 0; r < rows; r++)
for (c = 0; c < cols; c++)
xd->plane[0].color_index_map[r * cols + c] =
x->kmeans_indices_buffer[r * cols + c];
m1 = 0;
m2 = n;
best_bits = 0;
vpx_memcpy(mbmi->palette_literal_colors, mbmi->palette_colors,
m2 * sizeof(mbmi->palette_literal_colors[0]));
#if CONFIG_TX_SKIP
mbmi->tx_skip[0] = 0;
mbmi->tx_skip[1] = 0;
#endif // CONFIG_TX_SKIP
super_block_yrd(cpi, x, &rate_y_tokenonly, &dist_y, &y_skip,
&sse, bsize, local_tx_cache, best_rd);
#if CONFIG_TX_SKIP
if (try_tx_skip) {
if (rate_y_tokenonly != INT_MAX)
rate_y_tokenonly +=
vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 0);
mbmi->tx_skip[0] = 1;
super_block_yrd(cpi, x, &this_rate_tokenonly_s, &this_distortion_s,
&s_s, NULL, bsize, local_tx_cache, best_rd);
if (this_rate_tokenonly_s != INT_MAX)
this_rate_tokenonly_s +=
vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0], 1);
if ((this_rate_tokenonly_s != INT_MAX &&
rate_y_tokenonly == INT_MAX) ||
(RDCOST(x->rdmult, x->rddiv, rate_y_tokenonly, dist_y)
> RDCOST(x->rdmult, x->rddiv, this_rate_tokenonly_s,
this_distortion_s))) {
mbmi->tx_skip[0] = 1;
} else {
mbmi->tx_skip[0] = 0;
}
} else {
mbmi->tx_skip[0] = 0;
}
super_block_yrd(cpi, x, &rate_y_tokenonly, &dist_y, &y_skip,
&sse, bsize, local_tx_cache, best_rd);
#endif // CONFIG_TX_SKIP
if (rate_y_tokenonly == INT_MAX)
continue;
super_block_uvrd(cpi, x, &rate_uv_tokenonly, &dist_uv, &uv_skip, &sse,
bsize, best_rd);
#if CONFIG_TX_SKIP
if (try_tx_skip) {
if (rate_uv_tokenonly != INT_MAX)
rate_uv_tokenonly +=
vp9_cost_bit(cpi->common.fc.
uv_tx_skip_prob[mbmi->tx_skip[0]], 0);
mbmi->tx_skip[1] = 1;
super_block_uvrd(cpi, x, &this_rate_tokenonly_s, &this_distortion_s,
&s_s, &sse, bsize, best_rd);
if (this_rate_tokenonly_s != INT_MAX)
this_rate_tokenonly_s +=
vp9_cost_bit(cpi->common.fc.
uv_tx_skip_prob[mbmi->tx_skip[0]], 1);
if ((this_rate_tokenonly_s != INT_MAX &&
rate_uv_tokenonly == INT_MAX) ||
(RDCOST(x->rdmult, x->rddiv, rate_uv_tokenonly, dist_uv)
> RDCOST(x->rdmult, x->rddiv, this_rate_tokenonly_s,
this_distortion_s))) {
mbmi->tx_skip[1] = 1;
} else {
mbmi->tx_skip[1] = 0;
}
} else {
mbmi->tx_skip[1] = 0;
}
super_block_uvrd(cpi, x, &rate_uv_tokenonly, &dist_uv, &uv_skip, &sse,
bsize, best_rd);
#endif // CONFIG_TX_SKIP
if (rate_uv_tokenonly == INT_MAX)
continue;
rate_y = rate_y_tokenonly +
(1 + PALETTE_DELTA_BIT + n * m2) * vp9_cost_bit(128, 0) +
palette_size_cost[n - 2];
color_map = xd->plane[0].color_index_map;
rate_y += vp9_ceil_log2(n) * vp9_cost_bit(128, 0);
for (i = 0; i < rows; i++) {
for (j = (i == 0 ? 1 : 0); j < cols; j++) {
color_ctx = vp9_get_palette_color_context(color_map, cols, i, j, n,
color_order);
for (r = 0; r < n; r++)
if (color_map[i * cols + j] == color_order[r]) {
color_idx = r;
break;
}
rate_y += cpi->palette_color_costs[n - 2][color_ctx][color_idx];
}
}
rate_uv = rate_uv_tokenonly +
(1 + 8 * 2 * n) * vp9_cost_bit(128, 0);
#if CONFIG_TX_SKIP
rate_y += vp9_cost_bit(cpi->common.fc.y_tx_skip_prob[0],
mbmi->tx_skip[0]);
rate_uv +=
vp9_cost_bit(cpi->common.fc.uv_tx_skip_prob[mbmi->tx_skip[0]],
mbmi->tx_skip[1]);
#endif // CONFIG_TX_SKIP
if (y_skip && uv_skip) {
palette_rd.rate = rate_y + rate_uv - rate_y_tokenonly -
rate_uv_tokenonly + vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
palette_rd.dist = dist_y + dist_uv;
} else {
palette_rd.rate = rate_y + rate_uv +
vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
palette_rd.dist = dist_y + dist_uv;
}
palette_rd.rdcost =
RDCOST(x->rdmult, x->rddiv, palette_rd.rate, palette_rd.dist);
if (palette_rd.rdcost < palette_best_rd.rdcost) {
palette_best_rd = palette_rd;
best_n = n;
best_m1 = m1;
best_m2 = m2;
palette_delta_bitdepth = best_bits;
#if CONFIG_TX_SKIP
tx_skipped = mbmi->tx_skip[0];
tx_skipped_uv = mbmi->tx_skip[1];
#endif // CONFIG_TX_SKIP
vpx_memcpy(best_palette, mbmi->palette_colors,
PALETTE_MAX_SIZE * 3 * sizeof(best_palette[0]));
vpx_memcpy(best_index, mbmi->palette_indexed_colors,
best_m1 * sizeof(best_index[0]));
vpx_memcpy(palette_color_delta, mbmi->palette_color_delta,
best_m1 * sizeof(palette_color_delta[0]));
vpx_memcpy(best_literal, mbmi->palette_literal_colors,
best_m2 * sizeof(best_literal[0]));
}
}
if (palette_best_rd.rdcost < rd_cost->rdcost) {
*rd_cost = palette_best_rd;
mbmi->mode = DC_PRED;
mbmi->uv_mode = DC_PRED;
for (i = 0; i < 2; i++)
mbmi->palette_enabled[i] = 1;
mbmi->palette_size[0] = best_n;
mbmi->palette_size[1] = best_n;
mbmi->palette_indexed_size = best_m1;
mbmi->palette_literal_size = best_m2;
mbmi->palette_delta_bitdepth = palette_delta_bitdepth;
vpx_memcpy(mbmi->palette_colors, best_palette,
PALETTE_MAX_SIZE * 3 * sizeof(best_palette[0]));
vpx_memcpy(mbmi->palette_indexed_colors, best_index,
best_m1 * sizeof(best_index[0]));
vpx_memcpy(mbmi->palette_color_delta, palette_color_delta,
best_m1 * sizeof(palette_color_delta[0]));
vpx_memcpy(mbmi->palette_literal_colors, best_literal,
best_m2 * sizeof(best_literal[0]));
#if CONFIG_FILTERINTRA
mbmi->filterbit = 0;
mbmi->uv_filterbit = 0;
#endif // CONFIG_FILTERINTRA
#if CONFIG_TX_SKIP
mbmi->tx_skip[0] = tx_skipped;
mbmi->tx_skip[1] = tx_skipped_uv;
#endif // CONFIG_TX_SKIP
} else {
*mbmi = mbmi_copy;
if (mbmi->palette_enabled[0]) {
vpx_memcpy(xd->plane[0].color_index_map, palette_color_map_copy,
rows * cols * sizeof(xd->plane[0].color_index_map[0]));
}
}
ctx->mic = *xd->mi[0].src_mi;
}
rd_pick_palette_444(cpi, x, rd_cost, bsize, ctx, best_rd);
}
#endif // CONFIG_PALETTE