Revert "Prune the evaluation of inter transform split" This reverts commit 76fe151b233dbc889dfd882a7d765de0d5dcc543. Reason for revert: This causes `AV1/AVxEncoderThreadTestLarge.EncoderResultTest/44` to fail. Bug: 496503793 Change-Id: Ie4e9dcd9158aca5617aa93b462f8ee290b5aad5c
diff --git a/av1/encoder/block.h b/av1/encoder/block.h index bd35215..f36f8cc 100644 --- a/av1/encoder/block.h +++ b/av1/encoder/block.h
@@ -43,9 +43,6 @@ /*! Maximum value taken by transform type probabilities */ #define MAX_TX_TYPE_PROB 1024 -/*! Maximum value of inter transform RD records. */ -#define TOP_INTER_TX_NO_SPLIT_COUNT 4 - //! Compute color sensitivity index for given plane #define COLOR_SENS_IDX(plane) ((plane) - 1) @@ -1415,10 +1412,6 @@ */ int palette_pixels; - /*! \brief Keep records of top no-split RD Costs of transform size search. */ - int64_t top_inter_tx_no_split_rd[MAX_TX_BLOCKS_IN_MAX_SB] - [TOP_INTER_TX_NO_SPLIT_COUNT]; - /*!\brief Pointer to the structure which stores the statistics used by * sb-level multi-pass encoding. */
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index b331cf3..dd9d72d 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -5925,18 +5925,6 @@ } } -// Initialize the table that stores best RD Costs of transform no-split. -static inline void init_top_tx_no_split_rd_for_inter_modes( - MACROBLOCK *x, int prune_inter_tx_split_rd_eval_lvl) { - if (!prune_inter_tx_split_rd_eval_lvl) return; - - for (int i = 0; i < MAX_TX_BLOCKS_IN_MAX_SB; i++) { - for (int j = 0; j < TOP_INTER_TX_NO_SPLIT_COUNT; j++) { - x->top_inter_tx_no_split_rd[i][j] = INT64_MAX; - } - } -} - #if !CONFIG_REALTIME_ONLY // Prepare inter_cost and intra_cost from TPL stats, which are used as ML // features in intra mode pruning. @@ -6108,10 +6096,6 @@ INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES, INTERINTRA_MODES }; - - init_top_tx_no_split_rd_for_inter_modes( - x, sf->tx_sf.prune_inter_tx_split_rd_eval_lvl); - HandleInterModeArgs args = { { NULL }, { MAX_SB_SIZE, MAX_SB_SIZE, MAX_SB_SIZE }, { NULL },
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index ebc452c..b7bbb36 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -1190,7 +1190,6 @@ sf->tx_sf.tx_type_search.ml_tx_split_thresh = 4000; sf->tx_sf.tx_type_search.prune_2d_txfm_mode = TX_TYPE_PRUNE_2; sf->tx_sf.tx_type_search.skip_tx_search = 1; - sf->tx_sf.prune_inter_tx_split_rd_eval_lvl = 1; sf->rd_sf.perform_coeff_opt = boosted ? 2 : 3; sf->rd_sf.tx_domain_dist_level = boosted ? 1 : 2; @@ -1257,8 +1256,6 @@ // TODO(any): Re-evaluate this feature set to 1 in speed 2. sf->tpl_sf.allow_compound_pred = 0; sf->tpl_sf.prune_ref_frames_in_tpl = 1; - - sf->tx_sf.prune_inter_tx_split_rd_eval_lvl = 2; } if (speed >= 3) { @@ -2444,7 +2441,6 @@ tx_sf->prune_tx_size_level = 0; tx_sf->prune_intra_tx_depths_using_nn = false; tx_sf->use_rd_based_breakout_for_intra_tx_search = false; - tx_sf->prune_inter_tx_split_rd_eval_lvl = 0; } static inline void init_rd_sf(RD_CALC_SPEED_FEATURES *rd_sf,
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index c3c3a18..8e89031 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -1464,12 +1464,6 @@ // for speed 3, 4, 5, 6, 7 and 8 on a typical image dataset with coding // performance change less than 0.004%. bool use_rd_based_breakout_for_intra_tx_search; - - // Prune RD evaluation of transform split using RD Costs of transform no-split - // of inter modes that are evaluated so far. - // Values are 0 (not used), 1 - 2 with progressively increasing - // aggressiveness, i.e., decreasing number of top candidates - int prune_inter_tx_split_rd_eval_lvl; } TX_SPEED_FEATURES; typedef struct RD_CALC_SPEED_FEATURES {
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c index 2058147..1829a25 100644 --- a/av1/encoder/tx_search.c +++ b/av1/encoder/tx_search.c
@@ -79,10 +79,6 @@ 12, 12, 23, 23, 32, 32, 8, 8, 16, 16, 23, 23 }; -// look-up table for number of top no-split RD Costs that should be considered -// based on prune_inter_tx_split_rd_eval_lvl speed feature. -static const int num_inter_tx_no_split_cand[2] = { 4, 3 }; - static inline uint32_t get_block_residue_hash(MACROBLOCK *x, BLOCK_SIZE bsize) { const int rows = block_size_high[bsize]; const int cols = block_size_wide[bsize]; @@ -304,60 +300,6 @@ mb_rd_info->rd_stats = *rd_stats; } -// Store the RD Cost of transform no-split. -static inline void push_inter_block_tx_no_split_rd( - MACROBLOCK *x, const MB_MODE_INFO *mbmi, int64_t tmp_rd, int blk_idx, - int prune_inter_tx_split_rd_eval_lvl) { - assert(blk_idx < MAX_TX_BLOCKS_IN_MAX_SB); - if (!prune_inter_tx_split_rd_eval_lvl) return; - - if (blk_idx == -1 || tmp_rd == INT64_MAX) return; - - // Do not store for skip and intraBC modes - if (mbmi->skip_mode != 0 || is_intrabc_block(mbmi)) return; - - int num_top_cand = - num_inter_tx_no_split_cand[prune_inter_tx_split_rd_eval_lvl - 1]; - assert(num_top_cand <= TOP_INTER_TX_NO_SPLIT_COUNT); - - // Insert the RD Cost in sorted order - for (int i = 0; i < num_top_cand; i++) { - if (tmp_rd < x->top_inter_tx_no_split_rd[blk_idx][i]) { - for (int j = num_top_cand - 1; j > i; j--) { - x->top_inter_tx_no_split_rd[blk_idx][j] = - x->top_inter_tx_no_split_rd[blk_idx][j - 1]; - } - x->top_inter_tx_no_split_rd[blk_idx][i] = tmp_rd; - break; - } - } -} - -// Prune the evaluation of transform split. -static inline bool prune_tx_split_eval_using_no_split_rd( - const MACROBLOCK *x, const MB_MODE_INFO *mbmi, int64_t tmp_rd, int blk_idx, - int prune_inter_tx_split_rd_eval_lvl) { - if (!prune_inter_tx_split_rd_eval_lvl) return false; - - if (blk_idx == -1 || tmp_rd == INT64_MAX) return false; - - // Do not prune for skip and intraBC modes - if (mbmi->skip_mode != 0 || is_intrabc_block(mbmi)) return false; - - int num_top_cand = - num_inter_tx_no_split_cand[prune_inter_tx_split_rd_eval_lvl - 1]; - assert(num_top_cand <= TOP_INTER_TX_NO_SPLIT_COUNT); - - // Do not prune if there is no valid top RD Cost for comparison - if (x->top_inter_tx_no_split_rd[blk_idx][num_top_cand - 1] == INT64_MAX) - return false; - - if (tmp_rd > x->top_inter_tx_no_split_rd[blk_idx][num_top_cand - 1]) - return true; - - return false; -} - static int get_search_init_depth(int mi_width, int mi_height, int is_inter, const SPEED_FEATURES *sf, int tx_size_search_method) { @@ -385,7 +327,7 @@ TX_SIZE tx_size, int depth, BLOCK_SIZE plane_bsize, ENTROPY_CONTEXT *ta, ENTROPY_CONTEXT *tl, TXFM_CONTEXT *tx_above, TXFM_CONTEXT *tx_left, RD_STATS *rd_stats, int64_t prev_level_rd, int64_t ref_best_rd, - int *is_cost_valid, FAST_TX_SEARCH_MODE ftxs_mode, int blk_idx); + int *is_cost_valid, FAST_TX_SEARCH_MODE ftxs_mode); // NOTE: CONFIG_COLLECT_RD_STATS has 3 possible values // 0: Do not collect any RD stats @@ -2485,7 +2427,7 @@ select_tx_block(cpi, x, offsetr, offsetc, block, sub_txs, depth + 1, plane_bsize, ta, tl, tx_above, tx_left, &this_rd_stats, no_split_rd / nblks, ref_best_rd - split_rd_stats->rdcost, - &this_cost_valid, ftxs_mode, -1); + &this_cost_valid, ftxs_mode); if (!this_cost_valid) { split_rd_stats->rdcost = INT64_MAX; return; @@ -2600,7 +2542,7 @@ TX_SIZE tx_size, int depth, BLOCK_SIZE plane_bsize, ENTROPY_CONTEXT *ta, ENTROPY_CONTEXT *tl, TXFM_CONTEXT *tx_above, TXFM_CONTEXT *tx_left, RD_STATS *rd_stats, int64_t prev_level_rd, int64_t ref_best_rd, - int *is_cost_valid, FAST_TX_SEARCH_MODE ftxs_mode, int blk_idx) { + int *is_cost_valid, FAST_TX_SEARCH_MODE ftxs_mode) { assert(tx_size < TX_SIZES_ALL); av1_init_rd_stats(rd_stats); if (ref_best_rd < 0) { @@ -2641,10 +2583,6 @@ plane_bsize, ta, tl, ctx, rd_stats, ref_best_rd, ftxs_mode, &no_split); - push_inter_block_tx_no_split_rd( - x, mbmi, no_split.rd, blk_idx, - cpi->sf.tx_sf.prune_inter_tx_split_rd_eval_lvl); - // Speed features for early termination. const int search_level = cpi->sf.tx_sf.adaptive_txb_search_level; if (search_level) { @@ -2659,11 +2597,6 @@ if (cpi->sf.tx_sf.txb_split_cap) { if (p->eobs[block] == 0) try_split = 0; } - if (prune_tx_split_eval_using_no_split_rd( - x, mbmi, no_split.rd, blk_idx, - cpi->sf.tx_sf.prune_inter_tx_split_rd_eval_lvl)) { - try_split = 0; - } } // ML based speed feature to skip searching for split transform blocks. @@ -3469,7 +3402,6 @@ int64_t skip_txfm_rd = RDCOST(x->rdmult, skip_txfm_cost, 0); int64_t no_skip_txfm_rd = RDCOST(x->rdmult, no_skip_txfm_cost, 0); int block = 0; - int blk_idx = 0; av1_init_rd_stats(rd_stats); for (int idy = 0; idy < max_block_high(xd, bsize, 0); idy += bh) { @@ -3483,8 +3415,7 @@ // 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, blk_idx); - blk_idx++; + best_rd_sofar, &is_cost_valid, ftxs_mode); if (!is_cost_valid || pn_rd_stats.rate == INT_MAX) { av1_invalid_rd_stats(rd_stats); return INT64_MAX;