rtc: Fine tune sf skip_intra_pred_if_tx_skip
For better speed quality trade-off, this CL adds a new
conservative level as level 1 in skip_intra_pred_if_tx_skip
speed feature and the existing level is mapped to level 2.
This change improves the quality of speed 7 and also enables
the sf for speed 8 at level 1 for speed 9 at level 1 and 2
for rtc_derf and rtc respectively.
Instruction Count BD-Rate Loss(%)
cpu-used Reduction(%) avg.psnr ovr.psnr ssim
7 -0.196 -0.1054 -0.0741 -0.0906
8 1.630 -0.0716 -0.0821 -0.0462
9 0.847 0.1216 0.0893 0.2570
STATS_CHANGED for rt speed 7, 8 and 9
Change-Id: I5eb9276809a483af5e42ead991f77a1f763f39d7
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 9cabd1b..f2babe6 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -1961,9 +1961,11 @@
perform_intra_pred = 0;
}
- if (cpi->sf.rt_sf.skip_intra_pred_if_tx_skip && best_rdc->skip_txfm &&
- best_pickmode->best_mode_initial_skip_flag) {
- perform_intra_pred = 0;
+ if (best_rdc->skip_txfm && best_pickmode->best_mode_initial_skip_flag) {
+ if (cpi->sf.rt_sf.skip_intra_pred == 1 && best_pickmode->best_mode != NEWMV)
+ perform_intra_pred = 0;
+ else if (cpi->sf.rt_sf.skip_intra_pred == 2)
+ perform_intra_pred = 0;
}
if (!(best_rdc->rdcost == INT64_MAX ||
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 5c9f1b2..38d0a36 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1228,6 +1228,7 @@
if (speed >= 9) {
sf->rt_sf.use_comp_ref_nonrd = 0;
sf->rt_sf.nonrd_agressive_skip = 1;
+ sf->rt_sf.skip_intra_pred = 1;
// TODO(kyslov) Re-enable when AV1 models are trained
#if 0
#if CONFIG_RT_ML_PARTITIONING
@@ -1238,6 +1239,9 @@
#endif
#endif
}
+ if (speed >= 10) {
+ sf->rt_sf.skip_intra_pred = 2;
+ }
} else {
sf->rt_sf.prune_intra_mode_based_on_mv_range = 2;
sf->intra_sf.skip_filter_intra_in_inter_frames = 1;
@@ -1528,7 +1532,7 @@
sf->rt_sf.use_nonrd_pick_mode = 1;
sf->rt_sf.nonrd_check_partition_merge_mode = 1;
sf->rt_sf.nonrd_check_partition_split = 0;
- sf->rt_sf.skip_intra_pred_if_tx_skip = 1;
+ sf->rt_sf.skip_intra_pred = 1;
sf->rt_sf.source_metrics_sb_nonrd = 1;
// For SVC: use better mv search on base temporal layers, and only
// on base spatial layer if highest resolution is above 640x360.
@@ -1563,7 +1567,6 @@
sf->rt_sf.nonrd_prune_ref_frame_search = 2;
sf->rt_sf.nonrd_check_partition_merge_mode = 0;
sf->rt_sf.nonrd_check_partition_split = 0;
- sf->rt_sf.skip_intra_pred_if_tx_skip = 0;
sf->rt_sf.var_part_split_threshold_shift = 8;
sf->interp_sf.cb_pred_filter_search = 1;
}
@@ -1571,12 +1574,12 @@
sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->rt_sf.estimate_motion_for_var_based_partition = 0;
sf->rt_sf.force_large_partition_blocks = 1;
+ sf->rt_sf.skip_intra_pred = 2;
sf->rt_sf.var_part_split_threshold_shift = 9;
for (int i = 0; i < BLOCK_SIZES; ++i)
sf->rt_sf.intra_y_mode_bsize_mask_nrd[i] = INTRA_DC;
}
if (speed >= 10) {
- sf->rt_sf.skip_intra_pred_if_tx_skip = 1;
sf->rt_sf.nonrd_agressive_skip = 1;
sf->rt_sf.nonrd_prune_ref_frame_search = 3;
sf->rt_sf.var_part_split_threshold_shift = 10;
@@ -1854,7 +1857,7 @@
static AOM_INLINE void init_rt_sf(REAL_TIME_SPEED_FEATURES *rt_sf) {
rt_sf->check_intra_pred_nonrd = 0;
- rt_sf->skip_intra_pred_if_tx_skip = 0;
+ rt_sf->skip_intra_pred = 0;
rt_sf->estimate_motion_for_var_based_partition = 0;
rt_sf->nonrd_check_partition_merge_mode = 0;
rt_sf->nonrd_check_partition_split = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index e10b91e..9b0c5f5 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1275,8 +1275,12 @@
// check intra prediction for non-RD mode.
int check_intra_pred_nonrd;
- // skip checking intra prediction if TX is skipped
- int skip_intra_pred_if_tx_skip;
+ // Skip checking intra prediction.
+ // 0 - don't skip
+ // 1 - skip if TX is skipped and best mode is not NEWMV
+ // 2 - skip if TX is skipped
+ // Skipping aggressiveness increases from level 1 to 2.
+ int skip_intra_pred;
// Perform coarse ME before calculating variance in variance-based partition
int estimate_motion_for_var_based_partition;