Commit bb172c89e7 for aom
commit bb172c89e7c129c0e1ede17056fe5b590deb0074
Author: Marco Paniconi <marpan@google.com>
Date: Wed Jul 8 18:20:32 2026 -0700
rtc-screen: Prune intraBC search for nonrd pickmode
Only test intraBC if palette was selected.
Affects mainly speed 10 and 11, where
sf->rt_sf.prune_palette_search_nonrd > 0.
For rtc_screen set, with --enable-intrabc=1 and
--kf-max/min-dist=1 (all intra):
speedup ~13-15% for speeds 10 and 11, with overall
~neutral bdrate change.
Change-Id: I3d70e2245831bdd55a418c332a14f86bcdea5bc3
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 657d372837..e952ee8ddd 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -1762,6 +1762,7 @@ void av1_nonrd_pick_intra_mode(AV1_COMP *cpi, MACROBLOCK *x, RD_STATS *rd_cost,
mi->mv[0].as_int = mi->mv[1].as_int = INVALID_MV;
bool allow_skip_nondc = true;
+ bool palette_selected = false;
// Change the limit of this loop to add other intra prediction
// mode tests.
for (int mode_index = 0; mode_index < RTC_INTRA_MODES; ++mode_index) {
@@ -1853,6 +1854,7 @@ void av1_nonrd_pick_intra_mode(AV1_COMP *cpi, MACROBLOCK *x, RD_STATS *rd_cost,
&this_rdc, best_rdc.rdcost);
// Update best mode data.
if (this_rdc.rdcost < best_rdc.rdcost) {
+ palette_selected = true;
best_mode = DC_PRED;
mi->mv[0].as_int = INVALID_MV;
mi->mv[1].as_int = INVALID_MV;
@@ -1866,8 +1868,10 @@ void av1_nonrd_pick_intra_mode(AV1_COMP *cpi, MACROBLOCK *x, RD_STATS *rd_cost,
}
}
- bool try_intrabc = cpi->sf.rt_sf.rt_use_intrabc && av1_allow_intrabc(cm) &&
- bsize <= BLOCK_16X16;
+ bool try_intrabc =
+ cpi->sf.rt_sf.rt_use_intrabc && av1_allow_intrabc(cm) &&
+ bsize <= BLOCK_16X16 &&
+ (!cpi->sf.rt_sf.rt_prune_intrabc_nonrd || palette_selected);
if (try_intrabc) {
int_mv best_dv;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index c2db5c295f..d9add56561 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1766,6 +1766,7 @@ static void set_rt_speed_feature_framesize_dependent(const AV1_COMP *const cpi,
// Screen settings.
if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) {
sf->rt_sf.rt_use_intrabc = 1;
+ sf->rt_sf.rt_prune_intrabc_nonrd = 1;
sf->mv_sf.intrabc_search_level = 1;
sf->mv_sf.hash_max_8x8_intrabc_blocks = 1;
sf->mv_sf.prune_intrabc_candidate_block_hash_search = 1;
@@ -2629,6 +2630,7 @@ static inline void init_rt_sf(REAL_TIME_SPEED_FEATURES *rt_sf) {
rt_sf->increase_color_thresh_palette = false;
rt_sf->selective_cdf_update = 0;
rt_sf->rt_use_intrabc = 0;
+ rt_sf->rt_prune_intrabc_nonrd = 0;
rt_sf->force_only_last_ref = 0;
rt_sf->higher_thresh_scene_detection = 1;
rt_sf->skip_newmv_flat_blocks_screen = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 1d5161ba61..d1667ea64a 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1854,6 +1854,8 @@ typedef struct REAL_TIME_SPEED_FEATURES {
int selective_cdf_update;
// Use IntraBC for realtime mode.
int rt_use_intrabc;
+ // Prune IntraBC for nonrd pickmode.
+ int rt_prune_intrabc_nonrd;
// Force only single reference (LAST) for prediction.
int force_only_last_ref;