Enable tune=butteraugli in all-intra mode
Implement Butteraugli rdmult scaling in encode_without_recode().
Tune=butteraugli BD-rate changes:
Baseline tune=psnr, all-intra mode, speed 6
PSNR SSIM BUTTERAUGLI
hdrplus (full range) 3.0% -1.6% -17.4%
Change-Id: Ica7573a6534f708defbbc75a4a546a017c35ec15
(cherry picked from commit 91cc2d40443b620b3ce1194e6ca6fb370fe1fb3f)
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 5c6333a..ed1ab8e 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2314,6 +2314,12 @@
printf("\n Encoding a frame:");
#endif
+#if CONFIG_TUNE_BUTTERAUGLI
+ if (cpi->oxcf.tune_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
+ av1_setup_butteraugli_rdmult(cpi);
+ }
+#endif
+
aom_clear_system_state();
cpi->source = av1_scale_if_required(cm, unscaled, &cpi->scaled_source,
@@ -2687,7 +2693,7 @@
#if CONFIG_TUNE_BUTTERAUGLI
if (loop_count == 0 && oxcf->tune_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
loop = 1;
- av1_restore_butteraugli_source(cpi);
+ av1_setup_butteraugli_rdmult_and_restore_source(cpi, 0.4);
}
#endif
diff --git a/av1/encoder/tune_butteraugli.c b/av1/encoder/tune_butteraugli.c
index b5691f9..c43cdeb 100644
--- a/av1/encoder/tune_butteraugli.c
+++ b/av1/encoder/tune_butteraugli.c
@@ -15,14 +15,17 @@
#include "aom_dsp/butteraugli.h"
#include "aom_ports/system_state.h"
-#include "av1/encoder/rdopt.h"
+#include "av1/encoder/encodeframe.h"
+#include "av1/encoder/encoder_utils.h"
#include "av1/encoder/extend.h"
+#include "av1/encoder/var_based_part.h"
static const int resize_factor = 2;
static void set_mb_butteraugli_rdmult_scaling(AV1_COMP *cpi,
const YV12_BUFFER_CONFIG *source,
- const YV12_BUFFER_CONFIG *recon) {
+ const YV12_BUFFER_CONFIG *recon,
+ const double K) {
AV1_COMMON *const cm = &cpi->common;
SequenceHeader *const seq_params = &cm->seq_params;
const CommonModeInfoParams *const mi_params = &cm->mi_params;
@@ -93,9 +96,6 @@
dbutteraugli = powf(dbutteraugli, 1.0f / 12.0f);
dmse = dmse / px_count;
- // 'K' is used to balance the rate-distortion distribution between PSNR
- // and Butteraugli.
- const double K = 0.4;
const float eps = 0.01f;
double weight;
if (dbutteraugli < eps || dmse < eps) {
@@ -233,7 +233,7 @@
aom_clear_system_state();
}
-void av1_restore_butteraugli_source(AV1_COMP *cpi) {
+void av1_setup_butteraugli_rdmult_and_restore_source(AV1_COMP *cpi, double K) {
aom_clear_system_state();
av1_copy_and_extend_frame(&cpi->butteraugli_info.source, cpi->source);
AV1_COMMON *const cm = &cpi->common;
@@ -252,8 +252,67 @@
height / resize_factor);
set_mb_butteraugli_rdmult_scaling(cpi, &cpi->butteraugli_info.resized_source,
- &resized_recon);
+ &resized_recon, K);
cpi->butteraugli_info.recon_set = true;
aom_free_frame_buffer(&resized_recon);
aom_clear_system_state();
}
+
+void av1_setup_butteraugli_rdmult(AV1_COMP *cpi) {
+ AV1_COMMON *const cm = &cpi->common;
+ const AV1EncoderConfig *const oxcf = &cpi->oxcf;
+ const QuantizationCfg *const q_cfg = &oxcf->q_cfg;
+ const int q_index = 96;
+ aom_clear_system_state();
+
+ // Setup necessary params for encoding, including frame source, etc.
+ if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);
+ av1_set_frame_size(cpi, cm->superres_upscaled_width,
+ cm->superres_upscaled_height);
+
+ cpi->source =
+ av1_scale_if_required(cm, cpi->unscaled_source, &cpi->scaled_source,
+ cm->features.interp_filter, 0, false, false);
+ if (cpi->unscaled_last_source != NULL) {
+ cpi->last_source = av1_scale_if_required(
+ cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
+ cm->features.interp_filter, 0, false, false);
+ }
+
+ av1_setup_butteraugli_source(cpi);
+ av1_setup_frame(cpi);
+
+ if (cm->seg.enabled) {
+ if (!cm->seg.update_data && cm->prev_frame) {
+ segfeatures_copy(&cm->seg, &cm->prev_frame->seg);
+ cm->seg.enabled = cm->prev_frame->seg.enabled;
+ } else {
+ av1_calculate_segdata(&cm->seg);
+ }
+ } else {
+ memset(&cm->seg, 0, sizeof(cm->seg));
+ }
+ segfeatures_copy(&cm->cur_frame->seg, &cm->seg);
+ cm->cur_frame->seg.enabled = cm->seg.enabled;
+
+ const PARTITION_SEARCH_TYPE partition_search_type =
+ cpi->sf.part_sf.partition_search_type;
+ const BLOCK_SIZE fixed_partition_size = cpi->sf.part_sf.fixed_partition_size;
+ // Enable a quicker pass by uncommenting the following lines:
+ // cpi->sf.part_sf.partition_search_type = FIXED_PARTITION;
+ // cpi->sf.part_sf.fixed_partition_size = BLOCK_32X32;
+
+ av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q_index,
+ q_cfg->enable_chroma_deltaq);
+ av1_set_speed_features_qindex_dependent(cpi, oxcf->speed);
+ if (q_cfg->deltaq_mode != NO_DELTA_Q || q_cfg->enable_chroma_deltaq)
+ av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
+ cm->seq_params.bit_depth);
+
+ av1_set_variance_partition_thresholds(cpi, q_index, 0);
+ av1_encode_frame(cpi);
+
+ av1_setup_butteraugli_rdmult_and_restore_source(cpi, 0.3);
+ cpi->sf.part_sf.partition_search_type = partition_search_type;
+ cpi->sf.part_sf.fixed_partition_size = fixed_partition_size;
+}
diff --git a/av1/encoder/tune_butteraugli.h b/av1/encoder/tune_butteraugli.h
index a4af31c..7b7b0b6 100644
--- a/av1/encoder/tune_butteraugli.h
+++ b/av1/encoder/tune_butteraugli.h
@@ -38,6 +38,10 @@
void av1_setup_butteraugli_source(AV1_COMP *cpi);
-void av1_restore_butteraugli_source(AV1_COMP *cpi);
+// 'K' is used to balance the rate-distortion distribution between PSNR
+// and Butteraugli.
+void av1_setup_butteraugli_rdmult_and_restore_source(AV1_COMP *cpi, double K);
+
+void av1_setup_butteraugli_rdmult(AV1_COMP *cpi);
#endif // AOM_AV1_ENCODER_TUNE_BUTTERAUGLI_H_