Fix VMAF quality regression in tune=vmaf modes
by assigning the correct qindex to rc->active_best_quality.
Before this CL:
tune=vmaf_without_preprocessing
VMAF VMAF_NEG
midres -3.121 -2.795
hdres -3.059 -2.925
lowres_bd10 -3.316 -2.966
midres_bd10 -2.405 -2.211
After this CL:
VMAF VMAF_NEG
midres -4.268 -3.988
hdres -4.073 -3.982
lowres_bd10 -4.194 -3.949
midres_bd10 -3.123 -2.974
Change-Id: I9bc0df3e87a50dc94342736ea92c0732469a07c6
(cherry picked from commit 14a0294b28a3e373e487324e63859c4f4c180bf6)
diff --git a/aom_dsp/vmaf.h b/aom_dsp/vmaf.h
index 02e59ed..246e9b6 100644
--- a/aom_dsp/vmaf.h
+++ b/aom_dsp/vmaf.h
@@ -34,6 +34,9 @@
// Stores the filter strength of the last frame.
double last_frame_unsharp_amount;
+ // Stores the origial qindex before scaling.
+ int original_qindex;
+
#if CONFIG_USE_VMAF_RC
// VMAF model used in VMAF caculations.
VmafModel *vmaf_model;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 2154fa9..47b54c5 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1089,6 +1089,7 @@
aom_calloc(num_rows * num_cols,
sizeof(*cpi->vmaf_info.rdmult_scaling_factors)));
cpi->vmaf_info.last_frame_unsharp_amount = 0.0;
+ cpi->vmaf_info.original_qindex = -1;
}
#endif
@@ -2397,16 +2398,12 @@
if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING ||
oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
- av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel,
- av1_get_vmaf_base_qindex(cpi, q),
- q_cfg->enable_chroma_deltaq);
- } else {
-#endif
- av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
- q_cfg->enable_chroma_deltaq);
-#if CONFIG_TUNE_VMAF
+ cpi->vmaf_info.original_qindex = q;
+ q = av1_get_vmaf_base_qindex(cpi, q);
}
#endif
+ av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
+ q_cfg->enable_chroma_deltaq);
av1_set_speed_features_qindex_dependent(cpi, oxcf->speed);
if (q_cfg->deltaq_mode != NO_DELTA_Q)
@@ -2502,6 +2499,13 @@
rc->projected_frame_size = (int)(*size) << 3;
}
+#if CONFIG_TUNE_VMAF
+ if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING ||
+ oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
+ oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
+ q = cpi->vmaf_info.original_qindex;
+ }
+#endif
if (allow_recode) {
// Update q and decide whether to do a recode loop
recode_loop_update_q(cpi, &loop, &q, &q_low, &q_high, top_index,
diff --git a/av1/encoder/encoder_utils.c b/av1/encoder/encoder_utils.c
index bd78409..32999a7 100644
--- a/av1/encoder/encoder_utils.c
+++ b/av1/encoder/encoder_utils.c
@@ -975,22 +975,9 @@
// content tools, with a high q and fixed partition.
for (int pass = 0; pass < 2; ++pass) {
set_encoding_params_for_screen_content(cpi, pass);
-#if CONFIG_TUNE_VMAF
- if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING ||
- oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
- oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
- av1_set_quantizer(
- cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel,
- av1_get_vmaf_base_qindex(cpi, q_for_screen_content_quick_run),
- q_cfg->enable_chroma_deltaq);
- } else {
-#endif
- av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel,
- q_for_screen_content_quick_run,
- q_cfg->enable_chroma_deltaq);
-#if CONFIG_TUNE_VMAF
- }
-#endif
+ av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel,
+ q_for_screen_content_quick_run,
+ q_cfg->enable_chroma_deltaq);
av1_set_speed_features_qindex_dependent(cpi, oxcf->speed);
if (q_cfg->deltaq_mode != NO_DELTA_Q)
av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 206deea..a279b8d 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -3143,6 +3143,15 @@
int i;
for (i = pyramid_level; i <= MAX_ARF_LAYERS; ++i) {
rc->active_best_quality[i] = cpi->common.quant_params.base_qindex;
+#if CONFIG_TUNE_VMAF
+ if (cpi->vmaf_info.original_qindex != -1 &&
+ (cpi->oxcf.tune_cfg.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING ||
+ cpi->oxcf.tune_cfg.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
+ cpi->oxcf.tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN)) {
+ rc->active_best_quality[i] = cpi->vmaf_info.original_qindex;
+ }
+#endif
+
// if (pyramid_level >= 2) {
// rc->active_best_quality[pyramid_level] =
// AOMMAX(rc->active_best_quality[pyramid_level],