Rename tune=ssimulacra2 to tune=iq
We want tune=ssimulacra2 to mean a mode that maximizes the SSIMULACRA 2
metric. The current tune=ssimulacra2 mode increases image quality by
using the SSIMULACRA 2 metric as a guidance and validating with
subjective visual quality checks. Rename it tune=iq, which stands for
image quality or intra quality.
Bug: b:390668380
Change-Id: I6f1943395ffc186e9cc773e96d0d69c80d857641
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 2534349..6bd8f50 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -1668,9 +1668,9 @@
* Changes the encoder to tune for certain types of input material.
*
* \note
- * AOM_TUNE_SSIMULACRA2 is restricted to all intra mode (AOM_USAGE_ALL_INTRA).
- * Setting the tuning option to AOM_TUNE_SSIMULACRA2 causes the following
- * options to be set (expressed as command-line options):
+ * AOM_TUNE_IQ is restricted to all intra mode (AOM_USAGE_ALL_INTRA). Setting
+ * the tuning option to AOM_TUNE_IQ causes the following options to be set
+ * (expressed as command-line options):
* * --enable-qm=1
* * --qm-min=2
* * --qm-max=10
@@ -1690,14 +1690,13 @@
AOM_TUNE_VMAF_NEG_MAX_GAIN = 7,
AOM_TUNE_BUTTERAUGLI = 8,
AOM_TUNE_VMAF_SALIENCY_MAP = 9,
-/*!\brief Allows detection of the presence of AOM_TUNE_SSIMULACRA2 at compile
- * time.
- */
-#define AOM_HAVE_TUNE_SSIMULACRA2 1
- /* Increases image quality and consistency, guided by the SSIMULACRA2 metric
- * and subjective quality checks. Shares the rdmult code with AOM_TUNE_SSIM.
+/*!\brief Allows detection of the presence of AOM_TUNE_IQ at compile time. */
+#define AOM_HAVE_TUNE_IQ 1
+ /* Image quality (or intra quality). Increases image quality and consistency,
+ * guided by the SSIMULACRA 2 metric and subjective quality checks. Shares
+ * the rdmult code with AOM_TUNE_SSIM.
*/
- AOM_TUNE_SSIMULACRA2 = 10,
+ AOM_TUNE_IQ = 10,
} aom_tune_metric;
/*!\brief Distortion metric to use for RD optimization.
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
index 6fdfc79..114c773 100644
--- a/av1/arg_defs.c
+++ b/av1/arg_defs.c
@@ -48,7 +48,7 @@
{ "vmaf_neg", AOM_TUNE_VMAF_NEG_MAX_GAIN },
{ "butteraugli", AOM_TUNE_BUTTERAUGLI },
{ "vmaf_saliency_map", AOM_TUNE_VMAF_SALIENCY_MAP },
- { "ssimulacra2", AOM_TUNE_SSIMULACRA2 },
+ { "iq", AOM_TUNE_IQ },
{ NULL, 0 }
};
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 971dd7b..47ce04b 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -850,7 +850,7 @@
}
#endif
- RANGE_CHECK(extra_cfg, tuning, AOM_TUNE_PSNR, AOM_TUNE_SSIMULACRA2);
+ RANGE_CHECK(extra_cfg, tuning, AOM_TUNE_PSNR, AOM_TUNE_IQ);
RANGE_CHECK(extra_cfg, dist_metric, AOM_DIST_METRIC_PSNR,
AOM_DIST_METRIC_QM_PSNR);
@@ -1786,22 +1786,22 @@
static aom_codec_err_t handle_tuning(aom_codec_alg_priv_t *ctx,
struct av1_extracfg *extra_cfg) {
- if (extra_cfg->tuning == AOM_TUNE_SSIMULACRA2) {
+ if (extra_cfg->tuning == AOM_TUNE_IQ) {
if (ctx->cfg.g_usage != AOM_USAGE_ALL_INTRA) return AOM_CODEC_INCAPABLE;
// Enable QMs as they've been found to be beneficial for images, when used
// with alternative QM formulas:
// - aom_get_qmlevel_allintra()
- // - aom_get_qmlevel_luma_ssimulacra2()
- // - aom_get_qmlevel_444_chroma_ssimulacra2()
+ // - aom_get_qmlevel_luma_iq()
+ // - aom_get_qmlevel_444_chroma_iq()
extra_cfg->enable_qm = 1;
- extra_cfg->qm_min = QM_FIRST_SSIMULACRA2;
- extra_cfg->qm_max = QM_LAST_SSIMULACRA2;
+ extra_cfg->qm_min = QM_FIRST_IQ;
+ extra_cfg->qm_max = QM_LAST_IQ;
// We can turn on loop filter sharpness, as frames do not have to serve as
// references to others.
extra_cfg->sharpness = 7;
// Using the QM-PSNR metric was found to be beneficial for images (over the
// default PSNR metric), as it correlates better with subjective image
- // quality consistency and better SSIMULACRA2 scores.
+ // quality consistency and better SSIMULACRA 2 scores.
extra_cfg->dist_metric = AOM_DIST_METRIC_QM_PSNR;
// CDEF_ALL has been found to blur images at medium and high quality
// qindexes, so let's use a version that adapts CDEF strength on frame
diff --git a/av1/common/quant_common.h b/av1/common/quant_common.h
index b21412f..129c5c2 100644
--- a/av1/common/quant_common.h
+++ b/av1/common/quant_common.h
@@ -38,8 +38,8 @@
#define DEFAULT_QM_LAST 9
#define DEFAULT_QM_FIRST_ALLINTRA 4
#define DEFAULT_QM_LAST_ALLINTRA 10
-#define QM_FIRST_SSIMULACRA2 2
-#define QM_LAST_SSIMULACRA2 10
+#define QM_FIRST_IQ 2
+#define QM_LAST_IQ 10
#define LOSSLESS_Q_STEP 4 // this should equal to dc/ac_qlookup_QTX[0]
struct AV1Common;
@@ -96,7 +96,7 @@
return clamp(qm_level, first, last);
}
-// Luma QM levels tuned for SSIMULACRA 2 tune
+// Luma QM levels tuned for image quality (IQ)
// This formula was empirically derived by encoding Daala's subset1 validation
// testset for each QP/QM tuple, and building a convex hull that maximizes
// SSIMULACRA 2 scores, and a final subjective visual quality pass as a quick
@@ -108,8 +108,7 @@
// both set below or above this range.
// For more information on quantization matrices, please refer to
// https://arxiv.org/pdf/2008.06091, section F.
-static inline int aom_get_qmlevel_luma_ssimulacra2(int qindex, int first,
- int last) {
+static inline int aom_get_qmlevel_luma_iq(int qindex, int first, int last) {
int qm_level = 0;
if (qindex <= 40) {
@@ -135,7 +134,7 @@
return clamp(qm_level, first, last);
}
-// Chroma QM levels for 4:4:4 subsampling tuned for SSIMULACRA 2 tune
+// Chroma QM levels for 4:4:4 subsampling tuned for image quality (IQ)
// This formula was empirically derived by encoding Daala's subset1 validation
// testset for each QP/QM tuple, and building a convex hull that maximizes
// SSIMULACRA 2 scores, and a final subjective visual quality pass as a quick
@@ -147,8 +146,8 @@
// both set below or above this range.
// For more information on quantization matrices, please refer to
// https://arxiv.org/pdf/2008.06091, section F.
-static inline int aom_get_qmlevel_444_chroma_ssimulacra2(int qindex, int first,
- int last) {
+static inline int aom_get_qmlevel_444_chroma_iq(int qindex, int first,
+ int last) {
int chroma_qm_level = 0;
if (qindex <= 12) {
diff --git a/av1/encoder/allintra_vis.c b/av1/encoder/allintra_vis.c
index e9a493b..b9398e4 100644
--- a/av1/encoder/allintra_vis.c
+++ b/av1/encoder/allintra_vis.c
@@ -1105,7 +1105,7 @@
// Determine the SB's delta_q boost by computing an (unscaled) delta_q from
// the base and target q values, then scale that delta_q according to the
// frame's base qindex.
- // The scaling coefficients were chosen empirically to maximize SSIMULACRA2
+ // The scaling coefficients were chosen empirically to maximize SSIMULACRA 2
// scores, 10th percentile scores, and subjective quality. Boosts become
// smaller (for a given variance) the lower the base qindex.
int boost = (int)round((base_qindex + 544.0) * (base_qindex - target_qindex) /
diff --git a/av1/encoder/av1_quantize.c b/av1/encoder/av1_quantize.c
index 3ddedce..323bc2f 100644
--- a/av1/encoder/av1_quantize.c
+++ b/av1/encoder/av1_quantize.c
@@ -873,7 +873,7 @@
quant_params->y_dc_delta_q = 0;
if (enable_chroma_deltaq) {
- if (is_allintra && tuning == AOM_TUNE_SSIMULACRA2) {
+ if (is_allintra && tuning == AOM_TUNE_IQ) {
int chroma_dc_delta_q = 0;
int chroma_ac_delta_q = 0;
@@ -968,9 +968,9 @@
int (*get_chroma_qmlevel)(int, int, int);
if (is_allintra) {
- if (tuning == AOM_TUNE_SSIMULACRA2) {
- // Use luma QM formula specifically tailored for tune SSIMULACRA 2
- get_luma_qmlevel = aom_get_qmlevel_luma_ssimulacra2;
+ if (tuning == AOM_TUNE_IQ) {
+ // Use luma QM formula specifically tailored for tune IQ
+ get_luma_qmlevel = aom_get_qmlevel_luma_iq;
if (cm->seq_params->subsampling_x == 0 &&
cm->seq_params->subsampling_y == 0) {
@@ -978,7 +978,7 @@
// compared to 4:2:0 (2x on each dimension). This means the encoder
// should use lower chroma QM levels that more closely match the scaling
// of an equivalent 4:2:0 chroma QM.
- get_chroma_qmlevel = aom_get_qmlevel_444_chroma_ssimulacra2;
+ get_chroma_qmlevel = aom_get_qmlevel_444_chroma_iq;
} else {
// For all other chroma subsampling modes, use the all intra QM formula
get_chroma_qmlevel = aom_get_qmlevel_allintra;
diff --git a/av1/encoder/encodeframe_utils.c b/av1/encoder/encodeframe_utils.c
index d66cb93..d339bed 100644
--- a/av1/encoder/encodeframe_utils.c
+++ b/av1/encoder/encodeframe_utils.c
@@ -46,7 +46,7 @@
// to 4.8323^1024 and exceed DBL_MAX, resulting in data overflow.
assert(bsize_base >= BLOCK_8X8);
assert(cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIM ||
- cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIMULACRA2);
+ cpi->oxcf.tune_cfg.tuning == AOM_TUNE_IQ);
for (row = mi_row / num_mi_w;
row < num_rows && row < mi_row / num_mi_w + num_brows; ++row) {
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 44c92e5..31d8853 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3774,7 +3774,7 @@
}
if (oxcf->tune_cfg.tuning == AOM_TUNE_SSIM ||
- oxcf->tune_cfg.tuning == AOM_TUNE_SSIMULACRA2) {
+ oxcf->tune_cfg.tuning == AOM_TUNE_IQ) {
av1_set_mb_ssim_rdmult_scaling(cpi);
}
#if CONFIG_SALIENCY_MAP
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index 27fd1eb..53c14fc 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -616,7 +616,7 @@
#endif // !CONFIG_REALTIME_ONLY
if (cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIM ||
- cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIMULACRA2) {
+ cpi->oxcf.tune_cfg.tuning == AOM_TUNE_IQ) {
av1_set_ssim_rdmult(cpi, &x->errorperbit, bsize, mi_row, mi_col,
&x->rdmult);
}
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 2c26688..b3eef0b 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -400,7 +400,7 @@
rdmult = (int64_t)((double)rdmult * def_rd_q_mult);
}
- if (tuning == AOM_TUNE_SSIMULACRA2) {
+ if (tuning == AOM_TUNE_IQ) {
// Further multiply rdmult (by up to 200/128 = 1.5625) to improve image
// quality. The most noticeable effect is a mild bias towards choosing
// larger transform sizes (e.g. one 16x16 transform instead of 4 8x8
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index a70f0c9..103c8e0 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1376,9 +1376,9 @@
const int base_qindex =
cpi->use_ducky_encode ? gf_group->q_val[frame_idx] : pframe_qindex;
// The TPL model is only meant to be run in inter mode, so ensure that we are
- // not running in all intra mode, which implies we are not tuning for
- // SSIMULACRA 2.
- assert(cpi->oxcf.tune_cfg.tuning != AOM_TUNE_SSIMULACRA2 &&
+ // not running in all intra mode, which implies we are not tuning for image
+ // quality (IQ).
+ assert(cpi->oxcf.tune_cfg.tuning != AOM_TUNE_IQ &&
cpi->oxcf.mode != ALLINTRA);
// Get rd multiplier set up.
rdmult = av1_compute_rd_mult(
diff --git a/av1/encoder/txb_rdopt.c b/av1/encoder/txb_rdopt.c
index 9c77012..95a0289 100644
--- a/av1/encoder/txb_rdopt.c
+++ b/av1/encoder/txb_rdopt.c
@@ -336,13 +336,13 @@
const LV_MAP_EOB_COST *txb_eob_costs =
&coeff_costs->eob_costs[eob_multi_size][plane_type];
- // For the SSIMULACRA 2 tune, increase rshift from 2 to 4.
+ // For the IQ tune, increase rshift from 2 to 4.
// This biases trellis quantization towards keeping more coefficients, and
- // together with the SSIMULACRA2 rdmult adjustment in
+ // together with the IQ rdmult adjustment in
// av1_compute_rd_mult_based_on_qindex(), this helps preserve image
// features (like repeating patterns and camera noise/film grain), which
// improves SSIMULACRA 2 scores.
- const int rshift = cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIMULACRA2 ? 4 : 2;
+ const int rshift = cpi->oxcf.tune_cfg.tuning == AOM_TUNE_IQ ? 4 : 2;
const int64_t rdmult = ROUND_POWER_OF_TWO(
(int64_t)x->rdmult *
diff --git a/test/encode_api_test.cc b/test/encode_api_test.cc
index 8d6803d..5f053b3 100644
--- a/test/encode_api_test.cc
+++ b/test/encode_api_test.cc
@@ -109,7 +109,7 @@
EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc));
}
-TEST(EncodeAPI, TuneSsimulacra2NotAllIntra) {
+TEST(EncodeAPI, TuneIqNotAllIntra) {
aom_codec_iface_t *iface = aom_codec_av1_cx();
aom_codec_enc_cfg_t cfg;
ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_REALTIME),
@@ -118,7 +118,7 @@
aom_codec_ctx_t enc;
ASSERT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK);
- ASSERT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_SSIMULACRA2),
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_IQ),
AOM_CODEC_INCAPABLE);
ASSERT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK);
@@ -986,7 +986,7 @@
ASSERT_EQ(aom_codec_destroy(&enc), AOM_CODEC_OK);
}
-TEST(EncodeAPI, AllIntraAndTuneSsimulacra2) {
+TEST(EncodeAPI, AllIntraAndTuneIq) {
aom_codec_iface_t *iface = aom_codec_av1_cx();
aom_codec_enc_cfg_t cfg;
ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_ALL_INTRA),
@@ -995,7 +995,7 @@
aom_codec_ctx_t enc;
ASSERT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK);
- ASSERT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_SSIMULACRA2),
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_TUNING, AOM_TUNE_IQ),
AOM_CODEC_OK);
aom_image_t *image = CreateGrayImage(AOM_IMG_FMT_I420, cfg.g_w, cfg.g_h);