Add some comments for select_tx_size_and_type()
Also removes an outdated TODO and some unnecessary code.
BUG=aomedia:2617
Change-Id: If8485b23256379142990605c04e6572facaba775
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c
index 6967248..d0cfcd4 100644
--- a/av1/encoder/tx_search.c
+++ b/av1/encoder/tx_search.c
@@ -3087,6 +3087,10 @@
return is_cost_valid;
}
+// Search for the best transform size and type for current inter-predicted
+// luma block. The obtained transform selection will be saved in xd->mi[0],
+// the corresponding RD stats will be saved in rd_stats. The returned value is
+// the corresponding RD cost.
static int64_t select_tx_size_and_type(const AV1_COMP *cpi, MACROBLOCK *x,
RD_STATS *rd_stats, BLOCK_SIZE bsize,
int64_t ref_best_rd,
@@ -3094,28 +3098,18 @@
MACROBLOCKD *const xd = &x->e_mbd;
assert(is_inter_block(xd->mi[0]));
assert(bsize < BLOCK_SIZES_ALL);
-
- // TODO(debargha): enable this as a speed feature where the
- // select_inter_block_yrd() function above will use a simplified search
- // such as not using full optimize, but the inter_block_yrd() function
- // will use more complex search given that the transform partitions have
- // already been decided.
-
const int fast_tx_search = x->tx_size_search_method > USE_FULL_RD;
int64_t rd_thresh = ref_best_rd;
if (fast_tx_search && rd_thresh < INT64_MAX) {
if (INT64_MAX - rd_thresh > (rd_thresh >> 3)) rd_thresh += (rd_thresh >> 3);
}
assert(rd_thresh > 0);
-
const FAST_TX_SEARCH_MODE ftxs_mode =
fast_tx_search ? FTXS_DCT_AND_1D_DCT_ONLY : FTXS_NONE;
const struct macroblockd_plane *const pd = &xd->plane[0];
- const BLOCK_SIZE plane_bsize =
- get_plane_block_size(bsize, pd->subsampling_x, pd->subsampling_y);
- assert(plane_bsize < BLOCK_SIZES_ALL);
- const int mi_width = mi_size_wide[plane_bsize];
- const int mi_height = mi_size_high[plane_bsize];
+ assert(bsize < BLOCK_SIZES_ALL);
+ const int mi_width = mi_size_wide[bsize];
+ const int mi_height = mi_size_high[bsize];
ENTROPY_CONTEXT ctxa[MAX_MIB_SIZE];
ENTROPY_CONTEXT ctxl[MAX_MIB_SIZE];
TXFM_CONTEXT tx_above[MAX_MIB_SIZE];
@@ -3123,52 +3117,49 @@
av1_get_entropy_contexts(bsize, pd, ctxa, ctxl);
memcpy(tx_above, xd->above_txfm_context, sizeof(TXFM_CONTEXT) * mi_width);
memcpy(tx_left, xd->left_txfm_context, sizeof(TXFM_CONTEXT) * mi_height);
-
- const int skip_ctx = av1_get_skip_context(xd);
- const int s0 = x->skip_cost[skip_ctx][0];
- const int s1 = x->skip_cost[skip_ctx][1];
const int init_depth = get_search_init_depth(mi_width, mi_height, 1, &cpi->sf,
x->tx_size_search_method);
- const TX_SIZE max_tx_size = max_txsize_rect_lookup[plane_bsize];
+ const TX_SIZE max_tx_size = max_txsize_rect_lookup[bsize];
const int bh = tx_size_high_unit[max_tx_size];
const int bw = tx_size_wide_unit[max_tx_size];
const int step = bw * bh;
- int64_t skip_rd = RDCOST(x->rdmult, s1, 0);
- int64_t this_rd = RDCOST(x->rdmult, s0, 0);
+ const int skip_ctx = av1_get_skip_context(xd);
+ const int no_skip_flag_cost = x->skip_cost[skip_ctx][0];
+ const int skip_flag_cost = x->skip_cost[skip_ctx][1];
+ int64_t skip_rd = RDCOST(x->rdmult, skip_flag_cost, 0);
+ int64_t no_skip_rd = RDCOST(x->rdmult, no_skip_flag_cost, 0);
int block = 0;
av1_init_rd_stats(rd_stats);
for (int idy = 0; idy < mi_height; idy += bh) {
for (int idx = 0; idx < mi_width; idx += bw) {
const int64_t best_rd_sofar =
- (rd_thresh == INT64_MAX) ? INT64_MAX
- : (rd_thresh - (AOMMIN(skip_rd, this_rd)));
+ (rd_thresh == INT64_MAX)
+ ? INT64_MAX
+ : (rd_thresh - (AOMMIN(skip_rd, no_skip_rd)));
int is_cost_valid = 1;
RD_STATS pn_rd_stats;
- select_tx_block(cpi, x, idy, idx, block, max_tx_size, init_depth,
- plane_bsize, ctxa, ctxl, tx_above, tx_left, &pn_rd_stats,
- INT64_MAX, best_rd_sofar, &is_cost_valid, ftxs_mode,
- rd_info_tree);
+ // Search for the best transform block size and type for the sub-block.
+ select_tx_block(cpi, x, idy, idx, block, max_tx_size, init_depth, bsize,
+ ctxa, ctxl, tx_above, tx_left, &pn_rd_stats, INT64_MAX,
+ best_rd_sofar, &is_cost_valid, ftxs_mode, rd_info_tree);
if (!is_cost_valid || pn_rd_stats.rate == INT_MAX) {
av1_invalid_rd_stats(rd_stats);
return INT64_MAX;
}
av1_merge_rd_stats(rd_stats, &pn_rd_stats);
- skip_rd = RDCOST(x->rdmult, s1, rd_stats->sse);
- this_rd = RDCOST(x->rdmult, rd_stats->rate + s0, rd_stats->dist);
+ skip_rd = RDCOST(x->rdmult, skip_flag_cost, rd_stats->sse);
+ no_skip_rd =
+ RDCOST(x->rdmult, rd_stats->rate + no_skip_flag_cost, rd_stats->dist);
block += step;
if (rd_info_tree != NULL) rd_info_tree += 1;
}
}
- if (skip_rd <= this_rd) {
- rd_stats->skip = 1;
- } else {
- rd_stats->skip = 0;
- }
-
if (rd_stats->rate == INT_MAX) return INT64_MAX;
+ rd_stats->skip = (skip_rd <= no_skip_rd);
+
// If fast_tx_search is true, only DCT and 1D DCT were tested in
// select_inter_block_yrd() above. Do a better search for tx type with
// tx sizes already decided.
@@ -3177,16 +3168,19 @@
return INT64_MAX;
}
- int64_t rd;
+ int64_t final_rd;
if (rd_stats->skip) {
- rd = RDCOST(x->rdmult, s1, rd_stats->sse);
+ final_rd = RDCOST(x->rdmult, skip_flag_cost, rd_stats->sse);
} else {
- rd = RDCOST(x->rdmult, rd_stats->rate + s0, rd_stats->dist);
- if (!xd->lossless[xd->mi[0]->segment_id])
- rd = AOMMIN(rd, RDCOST(x->rdmult, s1, rd_stats->sse));
+ final_rd =
+ RDCOST(x->rdmult, rd_stats->rate + no_skip_flag_cost, rd_stats->dist);
+ if (!xd->lossless[xd->mi[0]->segment_id]) {
+ final_rd =
+ AOMMIN(final_rd, RDCOST(x->rdmult, skip_flag_cost, rd_stats->sse));
+ }
}
- return rd;
+ return final_rd;
}
// Return 1 to terminate transform search early. The decision is made based on