Clean up some rd_threshold related codes
This CL contains the following changes:
- macroize the constatn multiplifers used by rd_thresholds
- correct the initial value of rd->thresh_mult to 0
- replace unnecessary addition with asignment
- make the initial value of thresh_mult independent of speed feature as
no significant quality change is observed.
- symmetrize the bsizes when updating rd_thresh by going 2 levels above
and below
Overall, the speed remainsneutral, while BDRate decreased by about 0.02%.
STATS_CHANGED
Change-Id: I0606f5f1b4430922223d802fc82ae3221f06ad7c
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index fc9b4f6..34894e0 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4255,15 +4255,6 @@
}
#endif
-static INLINE void reset_thresh_freq_fact(MACROBLOCK *const x) {
- int i, j;
- for (i = 0; i < BLOCK_SIZES_ALL; ++i) {
- for (j = 0; j < MAX_MODES; ++j) {
- x->thresh_freq_fact[i][j] = 32;
- }
- }
-}
-
static AOM_INLINE void encode_nonrd_sb(AV1_COMP *cpi, ThreadData *td,
TileDataEnc *tile_data,
PC_TREE *const pc_root, TOKENEXTRA **tp,
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index ca06f85..d5a1b42 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -1100,242 +1100,231 @@
}
void av1_set_rd_speed_thresholds(AV1_COMP *cpi) {
- int i;
RD_OPT *const rd = &cpi->rd;
- SPEED_FEATURES *const sf = &cpi->sf;
// Set baseline threshold values.
- for (i = 0; i < MAX_MODES; ++i) rd->thresh_mult[i] = cpi->oxcf.mode == 0;
+ av1_zero(rd->thresh_mult);
- if (sf->inter_sf.adaptive_rd_thresh) {
- rd->thresh_mult[THR_NEARESTMV] = 300;
- rd->thresh_mult[THR_NEARESTL2] = 300;
- rd->thresh_mult[THR_NEARESTL3] = 300;
- rd->thresh_mult[THR_NEARESTB] = 300;
- rd->thresh_mult[THR_NEARESTA2] = 300;
- rd->thresh_mult[THR_NEARESTA] = 300;
- rd->thresh_mult[THR_NEARESTG] = 300;
- } else {
- rd->thresh_mult[THR_NEARESTMV] = 0;
- rd->thresh_mult[THR_NEARESTL2] = 0;
- rd->thresh_mult[THR_NEARESTL3] = 100;
- rd->thresh_mult[THR_NEARESTB] = 0;
- rd->thresh_mult[THR_NEARESTA2] = 0;
- rd->thresh_mult[THR_NEARESTA] = 0;
- rd->thresh_mult[THR_NEARESTG] = 0;
- }
+ rd->thresh_mult[THR_NEARESTMV] = 300;
+ rd->thresh_mult[THR_NEARESTL2] = 300;
+ rd->thresh_mult[THR_NEARESTL3] = 300;
+ rd->thresh_mult[THR_NEARESTB] = 300;
+ rd->thresh_mult[THR_NEARESTA2] = 300;
+ rd->thresh_mult[THR_NEARESTA] = 300;
+ rd->thresh_mult[THR_NEARESTG] = 300;
- rd->thresh_mult[THR_NEWMV] += 1000;
- rd->thresh_mult[THR_NEWL2] += 1000;
- rd->thresh_mult[THR_NEWL3] += 1000;
- rd->thresh_mult[THR_NEWB] += 1000;
+ rd->thresh_mult[THR_NEWMV] = 1000;
+ rd->thresh_mult[THR_NEWL2] = 1000;
+ rd->thresh_mult[THR_NEWL3] = 1000;
+ rd->thresh_mult[THR_NEWB] = 1000;
rd->thresh_mult[THR_NEWA2] = 1100;
- rd->thresh_mult[THR_NEWA] += 1000;
- rd->thresh_mult[THR_NEWG] += 1000;
+ rd->thresh_mult[THR_NEWA] = 1000;
+ rd->thresh_mult[THR_NEWG] = 1000;
- rd->thresh_mult[THR_NEARMV] += 1000;
- rd->thresh_mult[THR_NEARL2] += 1000;
- rd->thresh_mult[THR_NEARL3] += 1000;
- rd->thresh_mult[THR_NEARB] += 1000;
+ rd->thresh_mult[THR_NEARMV] = 1000;
+ rd->thresh_mult[THR_NEARL2] = 1000;
+ rd->thresh_mult[THR_NEARL3] = 1000;
+ rd->thresh_mult[THR_NEARB] = 1000;
rd->thresh_mult[THR_NEARA2] = 1000;
- rd->thresh_mult[THR_NEARA] += 1000;
- rd->thresh_mult[THR_NEARG] += 1000;
+ rd->thresh_mult[THR_NEARA] = 1000;
+ rd->thresh_mult[THR_NEARG] = 1000;
- rd->thresh_mult[THR_GLOBALMV] += 2200;
- rd->thresh_mult[THR_GLOBALL2] += 2000;
- rd->thresh_mult[THR_GLOBALL3] += 2000;
- rd->thresh_mult[THR_GLOBALB] += 2400;
+ rd->thresh_mult[THR_GLOBALMV] = 2200;
+ rd->thresh_mult[THR_GLOBALL2] = 2000;
+ rd->thresh_mult[THR_GLOBALL3] = 2000;
+ rd->thresh_mult[THR_GLOBALB] = 2400;
rd->thresh_mult[THR_GLOBALA2] = 2000;
- rd->thresh_mult[THR_GLOBALG] += 2000;
- rd->thresh_mult[THR_GLOBALA] += 2400;
+ rd->thresh_mult[THR_GLOBALG] = 2000;
+ rd->thresh_mult[THR_GLOBALA] = 2400;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA] += 1100;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A] += 800;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA] += 900;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLB] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2B] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3B] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTGB] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA2] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A2] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A2] += 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA2] += 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA] = 1100;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A] = 800;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA] = 900;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLB] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2B] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3B] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTGB] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLA2] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL2A2] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTL3A2] = 1000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTGA2] = 1000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL2] += 2000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL3] += 2000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTLG] += 2000;
- rd->thresh_mult[THR_COMP_NEAREST_NEARESTBA] += 2000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL2] = 2000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLL3] = 2000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTLG] = 2000;
+ rd->thresh_mult[THR_COMP_NEAREST_NEARESTBA] = 2000;
- rd->thresh_mult[THR_COMP_NEAR_NEARLA] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLA] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLA] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWLA] += 1530;
- rd->thresh_mult[THR_COMP_NEW_NEARLA] += 1870;
- rd->thresh_mult[THR_COMP_NEW_NEWLA] += 2400;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA] += 2750;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLA] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLA] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLA] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLA] = 1530;
+ rd->thresh_mult[THR_COMP_NEW_NEARLA] = 1870;
+ rd->thresh_mult[THR_COMP_NEW_NEWLA] = 2400;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA] = 2750;
- rd->thresh_mult[THR_COMP_NEAR_NEARL2A] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL2A] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL2A] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL2A] += 1870;
- rd->thresh_mult[THR_COMP_NEW_NEARL2A] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL2A] += 1800;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL2A] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL2A] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL2A] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL2A] = 1870;
+ rd->thresh_mult[THR_COMP_NEW_NEARL2A] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL2A] = 1800;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARL3A] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL3A] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL3A] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL3A] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARL3A] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL3A] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A] += 3000;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL3A] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL3A] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL3A] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL3A] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARL3A] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL3A] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A] = 3000;
- rd->thresh_mult[THR_COMP_NEAR_NEARGA] += 1320;
- rd->thresh_mult[THR_COMP_NEAREST_NEWGA] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTGA] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWGA] += 2040;
- rd->thresh_mult[THR_COMP_NEW_NEARGA] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWGA] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA] += 2250;
+ rd->thresh_mult[THR_COMP_NEAR_NEARGA] = 1320;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWGA] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTGA] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWGA] = 2040;
+ rd->thresh_mult[THR_COMP_NEW_NEARGA] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWGA] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA] = 2250;
- rd->thresh_mult[THR_COMP_NEAR_NEARLB] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLB] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLB] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWLB] += 1360;
- rd->thresh_mult[THR_COMP_NEW_NEARLB] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWLB] += 2400;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLB] += 2250;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLB] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLB] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLB] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLB] = 1360;
+ rd->thresh_mult[THR_COMP_NEW_NEARLB] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWLB] = 2400;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLB] = 2250;
- rd->thresh_mult[THR_COMP_NEAR_NEARL2B] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL2B] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL2B] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL2B] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARL2B] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL2B] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2B] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL2B] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL2B] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL2B] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL2B] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARL2B] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL2B] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2B] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARL3B] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL3B] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL3B] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL3B] += 1870;
- rd->thresh_mult[THR_COMP_NEW_NEARL3B] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL3B] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3B] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL3B] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL3B] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL3B] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL3B] = 1870;
+ rd->thresh_mult[THR_COMP_NEW_NEARL3B] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL3B] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3B] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARGB] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWGB] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTGB] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWGB] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARGB] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWGB] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGB] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARGB] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWGB] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTGB] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWGB] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARGB] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWGB] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGB] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARLA2] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLA2] += 1800;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLA2] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWLA2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARLA2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWLA2] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA2] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLA2] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLA2] = 1800;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLA2] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLA2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARLA2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWLA2] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLA2] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARL2A2] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL2A2] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL2A2] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL2A2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARL2A2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL2A2] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A2] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL2A2] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL2A2] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL2A2] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL2A2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARL2A2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL2A2] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL2A2] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARL3A2] += 1440;
- rd->thresh_mult[THR_COMP_NEAREST_NEWL3A2] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTL3A2] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWL3A2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARL3A2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWL3A2] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A2] += 2500;
+ rd->thresh_mult[THR_COMP_NEAR_NEARL3A2] = 1440;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWL3A2] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTL3A2] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWL3A2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARL3A2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWL3A2] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALL3A2] = 2500;
- rd->thresh_mult[THR_COMP_NEAR_NEARGA2] += 1200;
- rd->thresh_mult[THR_COMP_NEAREST_NEWGA2] += 1500;
- rd->thresh_mult[THR_COMP_NEW_NEARESTGA2] += 1500;
- rd->thresh_mult[THR_COMP_NEAR_NEWGA2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEARGA2] += 1700;
- rd->thresh_mult[THR_COMP_NEW_NEWGA2] += 2000;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA2] += 2750;
+ rd->thresh_mult[THR_COMP_NEAR_NEARGA2] = 1200;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWGA2] = 1500;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTGA2] = 1500;
+ rd->thresh_mult[THR_COMP_NEAR_NEWGA2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEARGA2] = 1700;
+ rd->thresh_mult[THR_COMP_NEW_NEWGA2] = 2000;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALGA2] = 2750;
- rd->thresh_mult[THR_COMP_NEAR_NEARLL2] += 1600;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLL2] += 2000;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLL2] += 2000;
- rd->thresh_mult[THR_COMP_NEAR_NEWLL2] += 2640;
- rd->thresh_mult[THR_COMP_NEW_NEARLL2] += 2200;
- rd->thresh_mult[THR_COMP_NEW_NEWLL2] += 2400;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL2] += 3200;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLL2] = 1600;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLL2] = 2000;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLL2] = 2000;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLL2] = 2640;
+ rd->thresh_mult[THR_COMP_NEW_NEARLL2] = 2200;
+ rd->thresh_mult[THR_COMP_NEW_NEWLL2] = 2400;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL2] = 3200;
- rd->thresh_mult[THR_COMP_NEAR_NEARLL3] += 1600;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLL3] += 2000;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLL3] += 1800;
- rd->thresh_mult[THR_COMP_NEAR_NEWLL3] += 2200;
- rd->thresh_mult[THR_COMP_NEW_NEARLL3] += 2200;
- rd->thresh_mult[THR_COMP_NEW_NEWLL3] += 2400;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL3] += 3200;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLL3] = 1600;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLL3] = 2000;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLL3] = 1800;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLL3] = 2200;
+ rd->thresh_mult[THR_COMP_NEW_NEARLL3] = 2200;
+ rd->thresh_mult[THR_COMP_NEW_NEWLL3] = 2400;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLL3] = 3200;
- rd->thresh_mult[THR_COMP_NEAR_NEARLG] += 1760;
- rd->thresh_mult[THR_COMP_NEAREST_NEWLG] += 2400;
- rd->thresh_mult[THR_COMP_NEW_NEARESTLG] += 2000;
- rd->thresh_mult[THR_COMP_NEAR_NEWLG] += 1760;
- rd->thresh_mult[THR_COMP_NEW_NEARLG] += 2640;
- rd->thresh_mult[THR_COMP_NEW_NEWLG] += 2400;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLG] += 3200;
+ rd->thresh_mult[THR_COMP_NEAR_NEARLG] = 1760;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWLG] = 2400;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTLG] = 2000;
+ rd->thresh_mult[THR_COMP_NEAR_NEWLG] = 1760;
+ rd->thresh_mult[THR_COMP_NEW_NEARLG] = 2640;
+ rd->thresh_mult[THR_COMP_NEW_NEWLG] = 2400;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALLG] = 3200;
- rd->thresh_mult[THR_COMP_NEAR_NEARBA] += 1600;
- rd->thresh_mult[THR_COMP_NEAREST_NEWBA] += 2000;
- rd->thresh_mult[THR_COMP_NEW_NEARESTBA] += 2000;
- rd->thresh_mult[THR_COMP_NEAR_NEWBA] += 2200;
- rd->thresh_mult[THR_COMP_NEW_NEARBA] += 1980;
- rd->thresh_mult[THR_COMP_NEW_NEWBA] += 2640;
- rd->thresh_mult[THR_COMP_GLOBAL_GLOBALBA] += 3200;
+ rd->thresh_mult[THR_COMP_NEAR_NEARBA] = 1600;
+ rd->thresh_mult[THR_COMP_NEAREST_NEWBA] = 2000;
+ rd->thresh_mult[THR_COMP_NEW_NEARESTBA] = 2000;
+ rd->thresh_mult[THR_COMP_NEAR_NEWBA] = 2200;
+ rd->thresh_mult[THR_COMP_NEW_NEARBA] = 1980;
+ rd->thresh_mult[THR_COMP_NEW_NEWBA] = 2640;
+ rd->thresh_mult[THR_COMP_GLOBAL_GLOBALBA] = 3200;
- rd->thresh_mult[THR_DC] += 1000;
- rd->thresh_mult[THR_PAETH] += 1000;
- rd->thresh_mult[THR_SMOOTH] += 2200;
- rd->thresh_mult[THR_SMOOTH_V] += 2000;
- rd->thresh_mult[THR_SMOOTH_H] += 2000;
- rd->thresh_mult[THR_H_PRED] += 2000;
- rd->thresh_mult[THR_V_PRED] += 1800;
- rd->thresh_mult[THR_D135_PRED] += 2500;
- rd->thresh_mult[THR_D203_PRED] += 2000;
- rd->thresh_mult[THR_D157_PRED] += 2500;
- rd->thresh_mult[THR_D67_PRED] += 2000;
- rd->thresh_mult[THR_D113_PRED] += 2500;
- rd->thresh_mult[THR_D45_PRED] += 2500;
+ rd->thresh_mult[THR_DC] = 1000;
+ rd->thresh_mult[THR_PAETH] = 1000;
+ rd->thresh_mult[THR_SMOOTH] = 2200;
+ rd->thresh_mult[THR_SMOOTH_V] = 2000;
+ rd->thresh_mult[THR_SMOOTH_H] = 2000;
+ rd->thresh_mult[THR_H_PRED] = 2000;
+ rd->thresh_mult[THR_V_PRED] = 1800;
+ rd->thresh_mult[THR_D135_PRED] = 2500;
+ rd->thresh_mult[THR_D203_PRED] = 2000;
+ rd->thresh_mult[THR_D157_PRED] = 2500;
+ rd->thresh_mult[THR_D67_PRED] = 2000;
+ rd->thresh_mult[THR_D113_PRED] = 2500;
+ rd->thresh_mult[THR_D45_PRED] = 2500;
}
void av1_update_rd_thresh_fact(const AV1_COMMON *const cm,
- int (*factor_buf)[MAX_MODES], int rd_thresh,
- int bsize, int best_mode_index) {
- if (rd_thresh > 0) {
- const int top_mode = MAX_MODES;
- int mode;
- BLOCK_SIZE min_size;
- BLOCK_SIZE max_size;
- if (bsize <= cm->seq_params.sb_size) {
- min_size = AOMMAX(bsize - 1, BLOCK_4X4);
- max_size = AOMMIN(bsize + 2, (int)cm->seq_params.sb_size);
- } else {
- // This part handles block sizes with 1:4 and 4:1 aspect ratios
- // TODO(any): Experiment with threshold update for parent/child blocks
- min_size = bsize;
- max_size = bsize;
- }
- for (mode = 0; mode < top_mode; ++mode) {
- BLOCK_SIZE bs;
- for (bs = min_size; bs <= max_size; ++bs) {
- int *const fact = &factor_buf[bs][mode];
- if (mode == best_mode_index) {
- *fact -= (*fact >> 4);
- } else {
- *fact = AOMMIN(*fact + RD_THRESH_INC, rd_thresh * RD_THRESH_MAX_FACT);
- }
+ int (*factor_buf)[MAX_MODES],
+ int use_adaptive_rd_thresh, BLOCK_SIZE bsize,
+ THR_MODES best_mode_index) {
+ assert(use_adaptive_rd_thresh > 0);
+ const THR_MODES top_mode = MAX_MODES;
+ const int max_rd_thresh_factor = use_adaptive_rd_thresh * RD_THRESH_MAX_FACT;
+
+ const int bsize_is_1_to_4 = bsize > cm->seq_params.sb_size;
+ BLOCK_SIZE min_size, max_size;
+ if (bsize_is_1_to_4) {
+ // This part handles block sizes with 1:4 and 4:1 aspect ratios
+ // TODO(any): Experiment with threshold update for parent/child blocks
+ min_size = bsize;
+ max_size = bsize;
+ } else {
+ min_size = AOMMAX(bsize - 2, BLOCK_4X4);
+ max_size = AOMMIN(bsize + 2, (int)cm->seq_params.sb_size);
+ }
+
+ for (THR_MODES mode = 0; mode < top_mode; ++mode) {
+ for (BLOCK_SIZE bs = min_size; bs <= max_size; ++bs) {
+ int *const fact = &factor_buf[bs][mode];
+ if (mode == best_mode_index) {
+ *fact -= (*fact >> RD_THRESH_LOG_DEC_FACTOR);
+ } else {
+ *fact = AOMMIN(*fact + RD_THRESH_INC, max_rd_thresh_factor);
}
}
}
diff --git a/av1/encoder/rd.h b/av1/encoder/rd.h
index 637cef2..e1d5bd9 100644
--- a/av1/encoder/rd.h
+++ b/av1/encoder/rd.h
@@ -44,8 +44,13 @@
#define MV_COST_WEIGHT 108
#define MV_COST_WEIGHT_SUB 120
-#define RD_THRESH_MAX_FACT 64
-#define RD_THRESH_INC 1
+// The fractional part of rd_thresh factor is stored with 5 bits. The maximum
+// factor that we allow is two, which is stored as 2 ** (5+1) = 64
+#define RD_THRESH_FAC_FRAC_BITS (5)
+#define RD_THRESH_FAC_FRAC_VAL (1 << (RD_THRESH_FAC_FRAC_BITS))
+#define RD_THRESH_MAX_FACT ((RD_THRESH_FAC_FRAC_VAL) << 1)
+#define RD_THRESH_LOG_DEC_FACTOR (4)
+#define RD_THRESH_INC (1)
// Factor to weigh the rate for switchable interp filters.
#define SWITCHABLE_INTERP_RATE_FACTOR 1
@@ -243,8 +248,16 @@
void av1_set_rd_speed_thresholds(struct AV1_COMP *cpi);
void av1_update_rd_thresh_fact(const AV1_COMMON *const cm,
- int (*fact)[MAX_MODES], int rd_thresh, int bsize,
- int best_mode_index);
+ int (*fact)[MAX_MODES], int rd_thresh,
+ BLOCK_SIZE bsize, THR_MODES best_mode_index);
+
+static INLINE void reset_thresh_freq_fact(MACROBLOCK *const x) {
+ for (int i = 0; i < BLOCK_SIZES_ALL; ++i) {
+ for (int j = 0; j < MAX_MODES; ++j) {
+ x->thresh_freq_fact[i][j] = RD_THRESH_FAC_FRAC_VAL;
+ }
+ }
+}
static INLINE int rd_less_than_thresh(int64_t best_rd, int thresh,
int thresh_fact) {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 9ef22d8..b5f31dd 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -12127,7 +12127,8 @@
const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize];
for (int i = LAST_NEW_MV_INDEX + 1; i < MAX_MODES; ++i)
search_state->mode_threshold[i] =
- ((int64_t)rd_threshes[i] * x->thresh_freq_fact[bsize][i]) >> 5;
+ ((int64_t)rd_threshes[i] * x->thresh_freq_fact[bsize][i]) >>
+ RD_THRESH_FAC_FRAC_BITS;
search_state->best_intra_mode = DC_PRED;
search_state->best_intra_rd = INT64_MAX;
@@ -13535,7 +13536,7 @@
search_state.best_mbmode.interp_filters.as_filters.x_filter) ||
!is_inter_block(&search_state.best_mbmode));
- if (!cpi->rc.is_src_frame_alt_ref) {
+ if (!cpi->rc.is_src_frame_alt_ref && cpi->sf.inter_sf.adaptive_rd_thresh) {
av1_update_rd_thresh_fact(cm, x->thresh_freq_fact,
sf->inter_sf.adaptive_rd_thresh, bsize,
search_state.best_mode_index);
@@ -13699,9 +13700,11 @@
assert((cm->interp_filter == SWITCHABLE) ||
(cm->interp_filter == mbmi->interp_filters.as_filters.y_filter));
- av1_update_rd_thresh_fact(cm, x->thresh_freq_fact,
- cpi->sf.inter_sf.adaptive_rd_thresh, bsize,
- THR_GLOBALMV);
+ if (cpi->sf.inter_sf.adaptive_rd_thresh) {
+ av1_update_rd_thresh_fact(cm, x->thresh_freq_fact,
+ cpi->sf.inter_sf.adaptive_rd_thresh, bsize,
+ THR_GLOBALMV);
+ }
av1_zero(best_pred_diff);