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
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 9bdab9d..8284b96 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1040,6 +1040,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
@@ -2404,16 +2405,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)
@@ -2509,6 +2506,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 4dade09..159e37f 100644
--- a/av1/encoder/encoder_utils.c
+++ b/av1/encoder/encoder_utils.c
@@ -968,22 +968,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 a504d48..12d0b41 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -3045,6 +3045,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],