Consolidate code about chroma transform RD search
Merge chroma transform RD search logic for intra and inter into a single
function.
Overal compression performance changes are roughly neutral. For chroma
psnr, there is a 0.4~0.9% coding gain.
STATS_CHANGED
BUG=aomedia:2279
Change-Id: I6c9a5abc92e971c4fd9219b386ee439004f32fee
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 5307335..383454c 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -190,12 +190,6 @@
FTXS_USE_TRANSFORM_DOMAIN = 1 << 2
} UENUM1BYTE(FAST_TX_SEARCH_MODE);
-static int inter_block_uvrd(const AV1_COMP *cpi, MACROBLOCK *x,
- RD_STATS *rd_stats, BLOCK_SIZE bsize,
- int64_t non_skip_ref_best_rd,
- int64_t skip_ref_best_rd,
- FAST_TX_SEARCH_MODE ftxs_mode);
-
struct rdcost_block_args {
const AV1_COMP *cpi;
MACROBLOCK *x;
@@ -5967,134 +5961,6 @@
*out_dist_sum = dist_sum;
}
-#define FAVOR_CHROMA_SKIP 1
-static void tx_block_uvrd(const AV1_COMP *cpi, MACROBLOCK *x, int blk_row,
- int blk_col, int plane, int block, TX_SIZE tx_size,
- BLOCK_SIZE plane_bsize, ENTROPY_CONTEXT *above_ctx,
- ENTROPY_CONTEXT *left_ctx, RD_STATS *rd_stats,
- FAST_TX_SEARCH_MODE ftxs_mode) {
- assert(plane > 0);
- assert(tx_size < TX_SIZES_ALL);
- MACROBLOCKD *const xd = &x->e_mbd;
- MB_MODE_INFO *const mbmi = xd->mi[0];
- const int max_blocks_high = max_block_high(xd, plane_bsize, plane);
- const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane);
- if (blk_row >= max_blocks_high || blk_col >= max_blocks_wide) return;
-
- ENTROPY_CONTEXT *ta = above_ctx + blk_col;
- ENTROPY_CONTEXT *tl = left_ctx + blk_row;
- TXB_CTX txb_ctx;
- get_txb_ctx(plane_bsize, tx_size, plane, ta, tl, &txb_ctx);
- const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size);
- const int zero_blk_rate = x->coeff_costs[txs_ctx][PLANE_TYPE_UV]
- .txb_skip_cost[txb_ctx.txb_skip_ctx][1];
- tx_block_rd_b(cpi, x, tx_size, blk_row, blk_col, plane, block, plane_bsize,
- &txb_ctx, rd_stats, ftxs_mode, INT64_MAX, NULL);
-
- const int mi_width = block_size_wide[plane_bsize] >> tx_size_wide_log2[0];
- const int blk_idx = blk_row * mi_width + blk_col;
- const int64_t rdmult = x->rdmult * plane_rd_mult[1][PLANE_TYPE_UV] /
- plane_rd_mult[1][PLANE_TYPE_Y];
- av1_set_txb_context(x, plane, block, tx_size, ta, tl);
- if ((RDCOST(rdmult, rd_stats->rate, rd_stats->dist) >=
- RDCOST(rdmult, zero_blk_rate, rd_stats->sse) ||
- rd_stats->skip == 1) &&
- !xd->lossless[mbmi->segment_id]) {
- rd_stats->rate = zero_blk_rate;
- rd_stats->dist = rd_stats->sse;
- rd_stats->skip = 1;
-#if FAVOR_CHROMA_SKIP
- x->plane[plane].eobs[block] = 0;
- x->plane[plane].txb_entropy_ctx[block] = 0;
- set_blk_skip(x, plane, blk_idx, 1);
-#else
- set_blk_skip(x, plane, blk_idx, 0);
-#endif
- } else {
- set_blk_skip(x, plane, blk_idx, 0);
- }
-}
-
-// Return value 0: early termination triggered, no valid rd cost available;
-// 1: rd cost values are valid.
-static int inter_block_uvrd(const AV1_COMP *cpi, MACROBLOCK *x,
- RD_STATS *rd_stats, BLOCK_SIZE bsize,
- int64_t non_skip_ref_best_rd,
- int64_t skip_ref_best_rd,
- FAST_TX_SEARCH_MODE ftxs_mode) {
- MACROBLOCKD *const xd = &x->e_mbd;
- MB_MODE_INFO *const mbmi = xd->mi[0];
- int plane;
- int is_cost_valid = 1;
- int64_t this_rd = 0;
- int64_t skip_rd = 0;
-
- if ((non_skip_ref_best_rd < 0) && (skip_ref_best_rd < 0)) is_cost_valid = 0;
-
- av1_init_rd_stats(rd_stats);
-
- if (x->skip_chroma_rd) {
- if (!is_cost_valid) av1_invalid_rd_stats(rd_stats);
-
- return is_cost_valid;
- }
-
- const BLOCK_SIZE bsizec = scale_chroma_bsize(
- bsize, xd->plane[1].subsampling_x, xd->plane[1].subsampling_y);
-
- if (is_inter_block(mbmi) && is_cost_valid) {
- for (plane = 1; plane < MAX_MB_PLANE; ++plane)
- av1_subtract_plane(x, bsizec, plane);
- }
-
- if (is_cost_valid) {
- for (plane = 1; plane < MAX_MB_PLANE; ++plane) {
- const struct macroblockd_plane *const pd = &xd->plane[plane];
- const BLOCK_SIZE plane_bsize =
- get_plane_block_size(bsizec, pd->subsampling_x, pd->subsampling_y);
- const int mi_width = block_size_wide[plane_bsize] >> tx_size_wide_log2[0];
- const int mi_height =
- block_size_high[plane_bsize] >> tx_size_high_log2[0];
- const TX_SIZE max_tx_size = get_vartx_max_txsize(xd, plane_bsize, plane);
- const int bh = tx_size_high_unit[max_tx_size];
- const int bw = tx_size_wide_unit[max_tx_size];
- int idx, idy;
- int block = 0;
- const int step = bh * bw;
- ENTROPY_CONTEXT ta[MAX_MIB_SIZE];
- ENTROPY_CONTEXT tl[MAX_MIB_SIZE];
- av1_get_entropy_contexts(bsizec, pd, ta, tl);
-
- for (idy = 0; idy < mi_height; idy += bh) {
- for (idx = 0; idx < mi_width; idx += bw) {
- RD_STATS pn_rd_stats;
- av1_init_rd_stats(&pn_rd_stats);
- tx_block_uvrd(cpi, x, idy, idx, plane, block, max_tx_size,
- plane_bsize, ta, tl, &pn_rd_stats, ftxs_mode);
- if (pn_rd_stats.rate == INT_MAX) {
- av1_invalid_rd_stats(rd_stats);
- return 0;
- }
- av1_merge_rd_stats(rd_stats, &pn_rd_stats);
- this_rd = RDCOST(x->rdmult, rd_stats->rate, rd_stats->dist);
- skip_rd = RDCOST(x->rdmult, 0, rd_stats->sse);
- if ((this_rd > non_skip_ref_best_rd) &&
- (skip_rd > skip_ref_best_rd)) {
- av1_invalid_rd_stats(rd_stats);
- return 0;
- }
- block += step;
- }
- }
- }
- } else {
- // reset cost value
- av1_invalid_rd_stats(rd_stats);
- }
-
- return is_cost_valid;
-}
-
static void rd_pick_palette_intra_sbuv(const AV1_COMP *const cpi, MACROBLOCK *x,
int dc_mode_cost,
uint8_t *best_palette_color_map,
@@ -8695,9 +8561,8 @@
av1_init_rd_stats(rd_stats_uv);
const int num_planes = av1_num_planes(cm);
if (num_planes > 1) {
- const int is_cost_valid_uv = inter_block_uvrd(
- cpi, x, rd_stats_uv, bsize, ref_best_rd - non_skip_rdcosty,
- ref_best_rd - skip_rdcosty, FTXS_NONE);
+ const int is_cost_valid_uv =
+ super_block_uvrd(cpi, x, rd_stats_uv, bsize, ref_best_rd);
if (!is_cost_valid_uv) {
mbmi->ref_frame[1] = ref_frame_1;
return 0;
@@ -10613,19 +10478,14 @@
for (int i = 0; i < xd->n4_h * xd->n4_w; ++i)
set_blk_skip(x, 0, i, rd_stats_y.skip);
}
- if (num_planes > 1) {
- inter_block_uvrd(cpi, x, &rd_stats_uv, bsize, INT64_MAX, INT64_MAX,
- FTXS_NONE);
- } else {
- av1_init_rd_stats(&rd_stats_uv);
- }
} else {
super_block_yrd(cpi, x, &rd_stats_y, bsize, INT64_MAX);
- if (num_planes > 1) {
- super_block_uvrd(cpi, x, &rd_stats_uv, bsize, INT64_MAX);
- } else {
- av1_init_rd_stats(&rd_stats_uv);
- }
+ }
+
+ if (num_planes > 1) {
+ super_block_uvrd(cpi, x, &rd_stats_uv, bsize, INT64_MAX);
+ } else {
+ av1_init_rd_stats(&rd_stats_uv);
}
if (RDCOST(x->rdmult,