rtc: Adjust tune_thresh_based_on_qindex_window conservatively
Fixed visual artifacts in desktopqvga clip using source_sad in
prefer_larger_partition_blocks sf. The speed, BD-Rate impact:
---------------------------------------------------------
|cpu| Test set |Instr. Count| BD-Rate Drop (%) |
| | |Reduction(%)|avg. psnr |ovr. psnr| ssim |
---------------------------------------------------------
| 8 | rtc-derf | -1.248 | -0.2538 | -0.2606 | -0.2099|
---------------------------------------------------------
The worst and best case quality impact is:
---------------------------------------------------------
| Clip | BD Rate Drop (%) |
| |(-ve: Gain, +ve Loss) |
| ----------------------------|
| |avg.PSNR |ovr.PSNR| SSIM |
|---------------------------------------------------------|
|Best | jimred_320_240 | -2.17 | -2.10 | -1.96 |
| | desktop1_320_180 | -0.83 | -1.08 | -2.80 |
|---------------------------------------------------------|
|Worst | street180p | 0.51 | 0.57 | 0.46 |
| | apprtc_pixel3_320_240 | -0.08 | 0.25 | 0.95 |
---------------------------------------------------------
Other speeds and resolutions are not impacted.
STATS_CHANGED
Change-Id: Icc43160deafc823a0bc6f6fbea47c35f37d8ce9c
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index bfbf417..221e9d6 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1258,6 +1258,7 @@
sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
sf->rt_sf.check_only_zero_zeromv_on_large_blocks = true;
}
+ if (speed == 8) sf->rt_sf.prefer_large_partition_blocks = 2;
if (speed >= 8) {
sf->rt_sf.use_nonrd_filter_search = 0;
sf->rt_sf.tx_size_level_based_on_qstep = 1;
@@ -1294,6 +1295,7 @@
sf->rt_sf.short_circuit_low_temp_var = 0;
sf->rt_sf.use_nonrd_altref_frame = 1;
}
+ if (speed == 8) sf->rt_sf.prefer_large_partition_blocks = 3;
if (speed >= 8) sf->rt_sf.tx_size_level_based_on_qstep = 2;
if (speed >= 9) {
sf->rt_sf.gf_length_lvl = 1;
@@ -1323,7 +1325,6 @@
}
}
if (!is_720p_or_larger) {
- if (speed == 8) sf->rt_sf.prefer_large_partition_blocks = 2;
if (speed >= 9) {
sf->rt_sf.force_large_partition_blocks_intra = 1;
}
@@ -1680,7 +1681,7 @@
sf->rt_sf.sse_early_term_inter_search = EARLY_TERM_IDX_3;
sf->rt_sf.screen_content_cdef_filter_qindex_thresh = 20;
sf->rt_sf.estimate_motion_for_var_based_partition = 0;
- sf->rt_sf.prefer_large_partition_blocks = 3;
+ sf->rt_sf.prefer_large_partition_blocks = 4;
sf->rt_sf.skip_intra_pred = 2;
sf->rt_sf.var_part_split_threshold_shift = 9;
for (int i = 0; i < BLOCK_SIZES; ++i)
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 3c53b53..19b190a4 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1457,7 +1457,7 @@
int check_scene_detection;
// For nonrd mode: Prefer larger partition blks in variance based partitioning
- // 0: disabled, 1-2: increasing aggressiveness
+ // 0: disabled, 1-4: increasing aggressiveness
int prefer_large_partition_blocks;
// uses results of temporal noise estimate
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index 75533bd..c5e2edd 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -429,7 +429,7 @@
}
static AOM_INLINE void tune_thresh_based_on_qindex_window(
- int qindex, int th, int64_t thresholds[]) {
+ int qindex, int th, int source_sad, int ag_idx, int64_t thresholds[]) {
const int win = 45;
double weight;
@@ -443,8 +443,9 @@
(int)((1 - weight) * (thresholds[1] << 1) + weight * thresholds[1]);
thresholds[2] =
(int)((1 - weight) * (thresholds[2] << 1) + weight * thresholds[2]);
+ const int fac = (!ag_idx && source_sad != kLowSad) ? 1 : 2;
thresholds[3] =
- (int)((1 - weight) * (thresholds[3] << 2) + weight * thresholds[3]);
+ (int)((1 - weight) * (thresholds[3] << fac) + weight * thresholds[3]);
}
static AOM_INLINE void set_vbp_thresholds(AV1_COMP *cpi, int64_t thresholds[],
@@ -568,7 +569,7 @@
thresholds[2] = (5 * threshold_base) >> 1;
}
// Tune thresholds less or more aggressively to prefer larger partitions
- if (cpi->sf.rt_sf.prefer_large_partition_blocks >= 3) {
+ if (cpi->sf.rt_sf.prefer_large_partition_blocks >= 4) {
double weight;
const int win = 20;
if (current_qindex < QINDEX_LARGE_BLOCK_THR - win)
@@ -618,8 +619,9 @@
thresholds[3] = INT32_MAX;
}
} else if (cpi->sf.rt_sf.prefer_large_partition_blocks >= 2) {
- tune_thresh_based_on_qindex_window(current_qindex, QINDEX_LARGE_BLOCK_THR,
- thresholds);
+ tune_thresh_based_on_qindex_window(
+ current_qindex, QINDEX_LARGE_BLOCK_THR, source_sad_nonrd,
+ cpi->sf.rt_sf.prefer_large_partition_blocks - 2, thresholds);
} else if (cpi->sf.rt_sf.prefer_large_partition_blocks >= 1) {
thresholds[3] <<= 2;
thresholds[1] <<= (source_sad_nonrd == kLowSad) ? 1 : 0;