diff --git a/vp10/encoder/rdopt.c b/vp10/encoder/rdopt.c index b060878d0b54615f35e9bbd5b4b4546105dd613e..31583a9d63ddab44aa1b11fd72fcb7cd6fc88d1b 100644 --- a/vp10/encoder/rdopt.c +++ b/vp10/encoder/rdopt.c @@ -1722,141 +1722,140 @@ static int rd_pick_palette_intra_sby( uint8_t *best_palette_color_map, TX_SIZE *best_tx, TX_TYPE *best_tx_type, PREDICTION_MODE *mode_selected, int64_t *best_rd) { int rate_overhead = 0; - if (cpi->common.allow_screen_content_tools) { - MACROBLOCKD *const xd = &x->e_mbd; - MODE_INFO *const mic = xd->mi[0]; - const int rows = 4 * num_4x4_blocks_high_lookup[bsize]; - const int cols = 4 * num_4x4_blocks_wide_lookup[bsize]; - int this_rate, this_rate_tokenonly, s, colors, n; - int64_t this_distortion, this_rd; - const int src_stride = x->plane[0].src.stride; - const uint8_t *const src = x->plane[0].src.buf; + MACROBLOCKD *const xd = &x->e_mbd; + MODE_INFO *const mic = xd->mi[0]; + const int rows = 4 * num_4x4_blocks_high_lookup[bsize]; + const int cols = 4 * num_4x4_blocks_wide_lookup[bsize]; + int this_rate, this_rate_tokenonly, s, colors, n; + int64_t this_distortion, this_rd; + const int src_stride = x->plane[0].src.stride; + const uint8_t *const src = x->plane[0].src.buf; + + assert(cpi->common.allow_screen_content_tools); #if CONFIG_VP9_HIGHBITDEPTH - if (cpi->common.use_highbitdepth) - colors = vp10_count_colors_highbd(src, src_stride, rows, cols, - cpi->common.bit_depth); - else + if (cpi->common.use_highbitdepth) + colors = vp10_count_colors_highbd(src, src_stride, rows, cols, + cpi->common.bit_depth); + else #endif // CONFIG_VP9_HIGHBITDEPTH - colors = vp10_count_colors(src, src_stride, rows, cols); - palette_mode_info->palette_size[0] = 0; + colors = vp10_count_colors(src, src_stride, rows, cols); + palette_mode_info->palette_size[0] = 0; #if CONFIG_EXT_INTRA - mic->mbmi.ext_intra_mode_info.use_ext_intra_mode[0] = 0; + mic->mbmi.ext_intra_mode_info.use_ext_intra_mode[0] = 0; #endif // CONFIG_EXT_INTRA - if (colors > 1 && colors <= 64) { - int r, c, i, j, k; - const int max_itr = 50; - int color_ctx, color_idx = 0; - int color_order[PALETTE_MAX_SIZE]; - float *const data = x->palette_buffer->kmeans_data_buf; - float centroids[PALETTE_MAX_SIZE]; - uint8_t *const color_map = xd->plane[0].color_index_map; - float lb, ub, val; - MB_MODE_INFO *const mbmi = &mic->mbmi; - PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info; + if (colors > 1 && colors <= 64) { + int r, c, i, j, k; + const int max_itr = 50; + int color_ctx, color_idx = 0; + int color_order[PALETTE_MAX_SIZE]; + float *const data = x->palette_buffer->kmeans_data_buf; + float centroids[PALETTE_MAX_SIZE]; + uint8_t *const color_map = xd->plane[0].color_index_map; + float lb, ub, val; + MB_MODE_INFO *const mbmi = &mic->mbmi; + PALETTE_MODE_INFO *const pmi = &mbmi->palette_mode_info; #if CONFIG_VP9_HIGHBITDEPTH - uint16_t *src16 = CONVERT_TO_SHORTPTR(src); - if (cpi->common.use_highbitdepth) - lb = ub = src16[0]; - else + uint16_t *src16 = CONVERT_TO_SHORTPTR(src); + if (cpi->common.use_highbitdepth) + lb = ub = src16[0]; + else #endif // CONFIG_VP9_HIGHBITDEPTH - lb = ub = src[0]; + lb = ub = src[0]; #if CONFIG_VP9_HIGHBITDEPTH - if (cpi->common.use_highbitdepth) { - for (r = 0; r < rows; ++r) { - for (c = 0; c < cols; ++c) { - val = src16[r * src_stride + c]; - data[r * cols + c] = val; - if (val < lb) - lb = val; - else if (val > ub) - ub = val; - } + if (cpi->common.use_highbitdepth) { + for (r = 0; r < rows; ++r) { + for (c = 0; c < cols; ++c) { + val = src16[r * src_stride + c]; + data[r * cols + c] = val; + if (val < lb) + lb = val; + else if (val > ub) + ub = val; } - } else { + } + } else { #endif // CONFIG_VP9_HIGHBITDEPTH - for (r = 0; r < rows; ++r) { - for (c = 0; c < cols; ++c) { - val = src[r * src_stride + c]; - data[r * cols + c] = val; - if (val < lb) - lb = val; - else if (val > ub) - ub = val; - } + for (r = 0; r < rows; ++r) { + for (c = 0; c < cols; ++c) { + val = src[r * src_stride + c]; + data[r * cols + c] = val; + if (val < lb) + lb = val; + else if (val > ub) + ub = val; } -#if CONFIG_VP9_HIGHBITDEPTH } +#if CONFIG_VP9_HIGHBITDEPTH + } #endif // CONFIG_VP9_HIGHBITDEPTH - mbmi->mode = DC_PRED; + mbmi->mode = DC_PRED; #if CONFIG_EXT_INTRA - mbmi->ext_intra_mode_info.use_ext_intra_mode[0] = 0; + mbmi->ext_intra_mode_info.use_ext_intra_mode[0] = 0; #endif // CONFIG_EXT_INTRA - if (rows * cols > PALETTE_MAX_BLOCK_SIZE) return 0; + if (rows * cols > PALETTE_MAX_BLOCK_SIZE) return 0; - for (n = colors > PALETTE_MAX_SIZE ? PALETTE_MAX_SIZE : colors; n >= 2; - --n) { - for (i = 0; i < n; ++i) - centroids[i] = lb + (2 * i + 1) * (ub - lb) / n / 2; - vp10_k_means(data, centroids, color_map, rows * cols, n, 1, max_itr); - k = vp10_remove_duplicates(centroids, n); + for (n = colors > PALETTE_MAX_SIZE ? PALETTE_MAX_SIZE : colors; n >= 2; + --n) { + for (i = 0; i < n; ++i) + centroids[i] = lb + (2 * i + 1) * (ub - lb) / n / 2; + vp10_k_means(data, centroids, color_map, rows * cols, n, 1, max_itr); + k = vp10_remove_duplicates(centroids, n); #if CONFIG_VP9_HIGHBITDEPTH - if (cpi->common.use_highbitdepth) - for (i = 0; i < k; ++i) - pmi->palette_colors[i] = - clip_pixel_highbd((int)centroids[i], cpi->common.bit_depth); - else + if (cpi->common.use_highbitdepth) + for (i = 0; i < k; ++i) + pmi->palette_colors[i] = + clip_pixel_highbd((int)centroids[i], cpi->common.bit_depth); + else #endif // CONFIG_VP9_HIGHBITDEPTH - for (i = 0; i < k; ++i) - pmi->palette_colors[i] = clip_pixel((int)centroids[i]); - pmi->palette_size[0] = k; + for (i = 0; i < k; ++i) + pmi->palette_colors[i] = clip_pixel((int)centroids[i]); + pmi->palette_size[0] = k; - vp10_calc_indices(data, centroids, color_map, rows * cols, k, 1); + vp10_calc_indices(data, centroids, color_map, rows * cols, k, 1); - super_block_yrd(cpi, x, &this_rate_tokenonly, &this_distortion, &s, - NULL, bsize, *best_rd); - if (this_rate_tokenonly == INT_MAX) continue; - - this_rate = - this_rate_tokenonly + dc_mode_cost + - cpi->common.bit_depth * k * vp10_cost_bit(128, 0) + - cpi->palette_y_size_cost[bsize - BLOCK_8X8][k - 2] + - write_uniform_cost(k, color_map[0]) + - vp10_cost_bit( - vp10_default_palette_y_mode_prob[bsize - - BLOCK_8X8][palette_ctx], - 1); - for (i = 0; i < rows; ++i) { - for (j = (i == 0 ? 1 : 0); j < cols; ++j) { - color_ctx = vp10_get_palette_color_context(color_map, cols, i, j, k, - color_order); - for (r = 0; r < k; ++r) - if (color_map[i * cols + j] == color_order[r]) { - color_idx = r; - break; - } - assert(color_idx >= 0 && color_idx < k); - this_rate += cpi->palette_y_color_cost[k - 2][color_ctx][color_idx]; - } - } - this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); + super_block_yrd(cpi, x, &this_rate_tokenonly, &this_distortion, &s, NULL, + bsize, *best_rd); + if (this_rate_tokenonly == INT_MAX) continue; - if (this_rd < *best_rd) { - *best_rd = this_rd; - *palette_mode_info = *pmi; - memcpy(best_palette_color_map, color_map, - rows * cols * sizeof(color_map[0])); - *mode_selected = DC_PRED; - *best_tx = mbmi->tx_size; - *best_tx_type = mbmi->tx_type; - rate_overhead = this_rate - this_rate_tokenonly; + this_rate = + this_rate_tokenonly + dc_mode_cost + + cpi->common.bit_depth * k * vp10_cost_bit(128, 0) + + cpi->palette_y_size_cost[bsize - BLOCK_8X8][k - 2] + + write_uniform_cost(k, color_map[0]) + + vp10_cost_bit( + vp10_default_palette_y_mode_prob[bsize - BLOCK_8X8][palette_ctx], + 1); + for (i = 0; i < rows; ++i) { + for (j = (i == 0 ? 1 : 0); j < cols; ++j) { + color_ctx = vp10_get_palette_color_context(color_map, cols, i, j, k, + color_order); + for (r = 0; r < k; ++r) + if (color_map[i * cols + j] == color_order[r]) { + color_idx = r; + break; + } + assert(color_idx >= 0 && color_idx < k); + this_rate += cpi->palette_y_color_cost[k - 2][color_ctx][color_idx]; } } + this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); + + if (this_rd < *best_rd) { + *best_rd = this_rd; + *palette_mode_info = *pmi; + memcpy(best_palette_color_map, color_map, + rows * cols * sizeof(color_map[0])); + *mode_selected = DC_PRED; + *best_tx = mbmi->tx_size; + *best_tx_type = mbmi->tx_type; + rate_overhead = this_rate - this_rate_tokenonly; + } } } return rate_overhead;