rtc: Extend prune_winner_mode_eval_level to preset 6
This patch extends pruning level of prune_winner_mode_eval_level
speed feature based on transform skip and quantizer. The newly
added levels are extended to speed 6.
Instruction Count BD-Rate Loss(%)
cpu-used Reduction(%) avg.psnr ovr.psnr ssim
6 4.604 0.2178 0.2309 0.2252
Details of worst case drops:
cpu Clip BD-Rate Loss (%)
(avg. PSNR)
6 three_scene_cut_180p 1.733
6 mmstionaryvga 1.216
6 kirlandvga 1.176
STATS_CHANGED
Change-Id: Id64ad8a6baed8f7e3259cae5978371ada831d4ba
diff --git a/av1/encoder/rdopt_utils.h b/av1/encoder/rdopt_utils.h
index 917ee37..ece3da7 100644
--- a/av1/encoder/rdopt_utils.h
+++ b/av1/encoder/rdopt_utils.h
@@ -400,14 +400,33 @@
static INLINE int bypass_winner_mode_processing(const MACROBLOCK *const x,
const SPEED_FEATURES *sf,
int use_txfm_skip,
- int actual_txfm_skip) {
+ int actual_txfm_skip,
+ PREDICTION_MODE best_mode) {
+ const int prune_winner_mode_eval_level =
+ sf->winner_mode_sf.prune_winner_mode_eval_level;
+
// Disable winner mode processing for blocks with low source variance.
// The aggressiveness of this pruning logic reduces as qindex increases.
// The threshold decreases linearly from 64 as qindex varies from 0 to 255.
- if (sf->winner_mode_sf.prune_winner_mode_eval_level == 1) {
+ if (prune_winner_mode_eval_level == 1) {
const unsigned int src_var_thresh = 64 - 48 * x->qindex / (MAXQ + 1);
if (x->source_variance < src_var_thresh) return 1;
- } else if (sf->winner_mode_sf.prune_winner_mode_eval_level >= 2) {
+ } else if (prune_winner_mode_eval_level == 2) {
+ // Skip winner mode processing of blocks for which transform turns out to be
+ // skip due to nature of eob alone except NEWMV mode.
+ if (!have_newmv_in_inter_mode(best_mode) && actual_txfm_skip) return 1;
+ } else if (prune_winner_mode_eval_level == 3) {
+ // Skip winner mode processing of blocks for which transform turns out to be
+ // skip except NEWMV mode and considered based on the quantizer.
+ // At high quantizers: Take conservative approach by considering transform
+ // skip based on eob alone.
+ // At low quantizers: Consider transform skip based on eob nature or RD cost
+ // evaluation.
+ const int is_txfm_skip =
+ x->qindex > 127 ? actual_txfm_skip : actual_txfm_skip || use_txfm_skip;
+
+ if (!have_newmv_in_inter_mode(best_mode) && is_txfm_skip) return 1;
+ } else if (prune_winner_mode_eval_level >= 4) {
// Do not skip winner mode evaluation at low quantizers if normal mode's
// transform search was too aggressive.
if (sf->rd_sf.perform_coeff_opt >= 5 && x->qindex <= 70) return 0;
@@ -426,7 +445,8 @@
const SPEED_FEATURES *sf = &cpi->sf;
const PREDICTION_MODE best_mode = mbmi->mode;
- if (bypass_winner_mode_processing(x, sf, mbmi->skip_txfm, actual_txfm_skip))
+ if (bypass_winner_mode_processing(x, sf, mbmi->skip_txfm, actual_txfm_skip,
+ best_mode))
return 0;
// TODO(any): Move block independent condition checks to frame level
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8f6138c..7fb6961 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1071,7 +1071,7 @@
: gf_group->update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE
? 1
: 2;
- sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 2;
+ sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 4;
// For screen content, "prune_sgr_based_on_wiener = 2" cause large quality
// loss.
@@ -1226,6 +1226,8 @@
if (!is_360p_or_larger) {
sf->rt_sf.prune_intra_mode_based_on_mv_range = 1;
sf->rt_sf.prune_inter_modes_wrt_gf_arf_based_on_sad = 1;
+ if (speed >= 6)
+ sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 2;
if (speed >= 7) sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
if (speed >= 8) {
sf->rt_sf.use_nonrd_filter_search = 0;
@@ -1533,6 +1535,8 @@
sf->rt_sf.var_part_split_threshold_shift = 7;
if (!frame_is_intra_only(&cpi->common))
sf->rt_sf.var_part_based_on_qidx = 2;
+
+ sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 3;
}
if (speed >= 7) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index d429cfd..ba84f30 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1252,11 +1252,17 @@
// tx_search_best_inter_candidates.
int winner_mode_ifs;
- // Controls the disabling of winner mode processing. The method considered for
- // disabling, depends on the sf level value and it is described as below.
+ // Controls the disabling of winner mode processing. Speed feature levels
+ // are ordered in increasing aggressiveness of pruning. The method considered
+ // for disabling, depends on the sf level value and it is described as below.
// 0: Do not disable
// 1: Disable for blocks with low source variance.
- // 2: Disable for blocks which turn out to be transform skip during MODE_EVAL
+ // 2: Disable for blocks which turn out to be transform skip (skipped based on
+ // eob) during MODE_EVAL stage except NEWMV mode.
+ // 3: Disable for blocks which turn out to be transform skip during MODE_EVAL
+ // stage except NEWMV mode. For high quantizers, prune conservatively based on
+ // transform skip (skipped based on eob) except for NEWMV mode.
+ // 4: Disable for blocks which turn out to be transform skip during MODE_EVAL
// stage.
int prune_winner_mode_eval_level;
} WINNER_MODE_SPEED_FEATURES;