rtc: Introduce prune_hv_pred_modes_using_src_sad sf
For rtc speed <= 8, currently DC, H and V intra modes are
evaluated in inter frames for block sizes < 32x32. This CL
introduces a speed feature 'prune_hv_pred_modes_using_src_sad'
to conditionally prune H and V modes based on color sensitivity,
SB level sad,frame source sad and block boosted information from
segment id. Currently, this sf impacts speed 8 alone.
For real-time encoding,
Instruction Count BD-Rate Loss(%)
cpu Testset Reduction(%) avg.psnr ovr.psnr ssim
8 rtc 2.020 0.1052 0.0911 0.0426
8 rtc_derf 2.790 0.1722 0.2383 0.1797
No changes to rtc_screen testset.
STATS_CHANGED for --rt, speed=8
Change-Id: Ied0fd6cef23bf654e288f3a58f422dae58c3b05c
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 04796bd..98dc8f6 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2734,6 +2734,36 @@
assert(use_last_ref_frame || use_golden_ref_frame || use_alt_ref_frame);
}
+// Checks whether Intra mode needs to be pruned based on
+// 'intra_y_mode_bsize_mask_nrd' and 'prune_hv_pred_modes_using_blksad'
+// speed features.
+static INLINE bool is_prune_intra_mode(AV1_COMP *cpi, int mode_index,
+ int force_intra_check, BLOCK_SIZE bsize,
+ uint8_t segment_id,
+ SOURCE_SAD source_sad_nonrd,
+ uint8_t color_sensitivity[2]) {
+ const PREDICTION_MODE this_mode = intra_mode_list[mode_index];
+ if (mode_index > 2 || force_intra_check == 0) {
+ if (!((1 << this_mode) & cpi->sf.rt_sf.intra_y_mode_bsize_mask_nrd[bsize]))
+ return true;
+
+ if (this_mode == DC_PRED) return false;
+
+ if (!cpi->sf.rt_sf.prune_hv_pred_modes_using_src_sad) return false;
+
+ const bool has_color_sensitivity =
+ color_sensitivity[0] && color_sensitivity[1];
+ if (has_color_sensitivity &&
+ (cpi->rc.frame_source_sad > 1.1 * cpi->rc.avg_source_sad ||
+ cyclic_refresh_segment_id_boosted(segment_id) ||
+ source_sad_nonrd > kMedSad))
+ return false;
+
+ return true;
+ }
+ return false;
+}
+
/*!\brief Estimates best intra mode for inter mode search
*
* \ingroup nonrd_mode_search
@@ -2893,11 +2923,10 @@
const THR_MODES mode_index = mode_idx[INTRA_FRAME][mode_offset(this_mode)];
const int64_t mode_rd_thresh = rd_threshes[mode_index];
- if (i > 2 || force_intra_check == 0) {
- if (!((1 << this_mode) &
- cpi->sf.rt_sf.intra_y_mode_bsize_mask_nrd[bsize]))
- continue;
- }
+ if (is_prune_intra_mode(cpi, i, force_intra_check, bsize, segment_id,
+ x->content_state_sb.source_sad_nonrd,
+ x->color_sensitivity))
+ continue;
if (is_screen_content && cpi->sf.rt_sf.source_metrics_sb_nonrd) {
// For spatially flat blocks with zero motion only check
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8366c49..d2562bc 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1451,6 +1451,7 @@
sf->rt_sf.nonrd_check_partition_merge_mode = 3;
sf->rt_sf.nonrd_prune_ref_frame_search = 1;
sf->rt_sf.use_nonrd_filter_search = 0;
+ sf->rt_sf.prune_hv_pred_modes_using_src_sad = false;
}
if (speed >= 9) {
sf->rt_sf.prune_idtx_nonrd = 1;
@@ -1763,6 +1764,7 @@
sf->rt_sf.partition_direct_merging = 1;
sf->rt_sf.prune_compoundmode_with_singlemode_var = false;
sf->mv_sf.use_bsize_dependent_search_method = 2;
+ sf->rt_sf.prune_hv_pred_modes_using_src_sad = true;
}
if (speed >= 9) {
sf->rt_sf.sse_early_term_inter_search = EARLY_TERM_IDX_3;
@@ -2087,6 +2089,7 @@
rt_sf->fullpel_search_step_param = 0;
for (int i = 0; i < BLOCK_SIZES; ++i)
rt_sf->intra_y_mode_bsize_mask_nrd[i] = INTRA_ALL;
+ rt_sf->prune_hv_pred_modes_using_src_sad = false;
rt_sf->nonrd_aggressive_skip = 0;
rt_sf->skip_cdef_sb = 0;
rt_sf->force_large_partition_blocks_intra = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 707f8609..00c21e5 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1485,9 +1485,20 @@
int fullpel_search_step_param;
// Bit mask to enable or disable intra modes for each prediction block size
- // separately, for nonrd pickmode.
+ // separately, for nonrd_pickmode. Currently, the sf is not respected when
+ // 'force_intra_check' is true in 'estimate_intra_mode()' function. Also, H
+ // and V pred modes allowed through this sf can be further pruned when
+ //'prune_hv_pred_modes_using_src_sad' sf is true.
int intra_y_mode_bsize_mask_nrd[BLOCK_SIZES];
+ // Prune H and V intra predition modes evalution in inter frame.
+ // The sf does not have any impact.
+ // i. when frame_source_sad is 1.1 times greater than avg_source_sad
+ // ii. when cyclic_refresh_segment_id_boosted is enabled
+ // iii. when SB level source sad is greater than kMedSad
+ // iv. when color sensitivity is non zero for both the chroma channels
+ bool prune_hv_pred_modes_using_src_sad;
+
// Skips mode checks more aggressively in nonRD mode
int nonrd_aggressive_skip;