Add command line support for dv_cost_upd_freq
The current default value is COST_UPD_SB. But in REALTIME build, this is
set to COST_UPD_OFF.
Change-Id: I42ffa3c34d2be1027191a32f36c05e280c4e605d
diff --git a/aom/aomcx.h b/aom/aomcx.h
index 8b9a398..3291f33 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -1327,6 +1327,16 @@
*/
AV1E_SET_ENABLE_DIAGONAL_INTRA = 141,
+ /*!\brief Control to set frequency of the cost updates for intrabc motion
+ * vectors, unsigned int parameter
+ *
+ * - 0 = update at SB level (default)
+ * - 1 = update at SB row level in tile
+ * - 2 = update at tile level
+ * - 3 = turn off
+ */
+ AV1E_SET_DV_COST_UPD_FREQ = 142,
+
// Any new encoder control IDs should be added above.
// Maximum allowed encoder control ID is 229.
// No encoder control ID should be added below.
@@ -1862,6 +1872,9 @@
AOM_CTRL_USE_TYPE(AV1E_SET_ENABLE_DNL_DENOISING, int)
#define AOM_CTRL_AV1E_SET_ENABLE_DNL_DENOISING
+AOM_CTRL_USE_TYPE(AV1E_SET_DV_COST_UPD_FREQ, unsigned int)
+#define AOM_CTRL_AV1E_SET_DV_COST_UPD_FREQ
+
/*!\endcond */
/*! @} - end defgroup aom_encoder */
#ifdef __cplusplus
diff --git a/apps/aomenc.c b/apps/aomenc.c
index d56594a..1968fce 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -227,6 +227,7 @@
#if CONFIG_TUNE_VMAF
AV1E_SET_VMAF_MODEL_PATH,
#endif
+ AV1E_SET_DV_COST_UPD_FREQ,
0 };
const arg_def_t *main_args[] = { &g_av1_codec_arg_defs.help,
@@ -422,6 +423,7 @@
#if CONFIG_TUNE_VMAF
&g_av1_codec_arg_defs.vmaf_model_path,
#endif
+ &g_av1_codec_arg_defs.dv_cost_upd_freq,
NULL,
};
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
index e79f9b2..75cd54c 100644
--- a/av1/arg_defs.c
+++ b/av1/arg_defs.c
@@ -448,13 +448,16 @@
"Use Default-transform only for INTRA modes"),
.quant_b_adapt = ARG_DEF(NULL, "quant-b-adapt", 1, "Use adaptive quantize_b"),
.coeff_cost_upd_freq = ARG_DEF(NULL, "coeff-cost-upd-freq", 1,
- "Update freq for coeff costs"
+ "Update freq for coeff costs. "
"0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
.mode_cost_upd_freq = ARG_DEF(NULL, "mode-cost-upd-freq", 1,
- "Update freq for mode costs"
+ "Update freq for mode costs. "
"0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
.mv_cost_upd_freq = ARG_DEF(NULL, "mv-cost-upd-freq", 1,
- "Update freq for mv costs"
+ "Update freq for mv costs. "
+ "0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
+ .dv_cost_upd_freq = ARG_DEF(NULL, "dv-cost-upd-freq", 1,
+ "Update freq for dv costs. "
"0: SB, 1: SB Row per Tile, 2: Tile, 3: Off"),
.num_tg = ARG_DEF(NULL, "num-tile-groups", 1,
"Maximum number of tile groups, default is 1"),
@@ -605,6 +608,6 @@
.vbr_corpus_complexity_lap = ARG_DEF(
NULL, "vbr-corpus-complexity-lap", 1,
"Set average corpus complexity per mb for single pass VBR using lap. "
- "(0..10000), default is 0")
+ "(0..10000), default is 0"),
#endif // CONFIG_AV1_ENCODER
};
diff --git a/av1/arg_defs.h b/av1/arg_defs.h
index f86e915..03392da 100644
--- a/av1/arg_defs.h
+++ b/av1/arg_defs.h
@@ -173,6 +173,7 @@
arg_def_t coeff_cost_upd_freq;
arg_def_t mode_cost_upd_freq;
arg_def_t mv_cost_upd_freq;
+ arg_def_t dv_cost_upd_freq;
arg_def_t num_tg;
arg_def_t mtu_size;
arg_def_t timing_info;
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 4917854..f0c4e1d 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -154,6 +154,7 @@
COST_UPDATE_TYPE coeff_cost_upd_freq;
COST_UPDATE_TYPE mode_cost_upd_freq;
COST_UPDATE_TYPE mv_cost_upd_freq;
+ COST_UPDATE_TYPE dv_cost_upd_freq;
unsigned int ext_tile_debug;
unsigned int sb_multipass_unit_test;
};
@@ -296,6 +297,7 @@
COST_UPD_OFF, // coeff_cost_upd_freq
COST_UPD_OFF, // mode_cost_upd_freq
COST_UPD_OFF, // mv_cost_upd_freq
+ COST_UPD_OFF, // dv_cost_upd_freq
0, // ext_tile_debug
0, // sb_multipass_unit_test
};
@@ -425,6 +427,7 @@
COST_UPD_SB, // coeff_cost_upd_freq
COST_UPD_SB, // mode_cost_upd_freq
COST_UPD_SB, // mv_cost_upd_freq
+ COST_UPD_SB, // dv_cost_upd_freq
0, // ext_tile_debug
0, // sb_multipass_unit_test
};
@@ -710,6 +713,7 @@
RANGE_CHECK(extra_cfg, coeff_cost_upd_freq, 0, 3);
RANGE_CHECK(extra_cfg, mode_cost_upd_freq, 0, 3);
RANGE_CHECK(extra_cfg, mv_cost_upd_freq, 0, 3);
+ RANGE_CHECK(extra_cfg, dv_cost_upd_freq, 0, 3);
RANGE_CHECK(extra_cfg, min_partition_size, 4, 128);
RANGE_CHECK(extra_cfg, max_partition_size, 4, 128);
@@ -1054,8 +1058,7 @@
oxcf->cost_upd_freq.coeff = (COST_UPDATE_TYPE)extra_cfg->coeff_cost_upd_freq;
oxcf->cost_upd_freq.mode = (COST_UPDATE_TYPE)extra_cfg->mode_cost_upd_freq;
oxcf->cost_upd_freq.mv = (COST_UPDATE_TYPE)extra_cfg->mv_cost_upd_freq;
- // TODO(chiyotsai@google.com): Add command line support in a separate cl.
- oxcf->cost_upd_freq.dv = COST_UPD_SB;
+ oxcf->cost_upd_freq.dv = (COST_UPDATE_TYPE)extra_cfg->dv_cost_upd_freq;
// Set frame resize mode configuration.
resize_cfg->resize_mode = (RESIZE_MODE)cfg->rc_resize_mode;
@@ -1995,6 +1998,13 @@
return update_extra_cfg(ctx, &extra_cfg);
}
+static aom_codec_err_t ctrl_set_dv_cost_upd_freq(aom_codec_alg_priv_t *ctx,
+ va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.dv_cost_upd_freq = CAST(AV1E_SET_DV_COST_UPD_FREQ, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
static aom_codec_err_t ctrl_set_vmaf_model_path(aom_codec_alg_priv_t *ctx,
va_list args) {
struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -3345,6 +3355,9 @@
} else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.mv_cost_upd_freq,
argv, err_string)) {
extra_cfg.mv_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
+ } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.dv_cost_upd_freq,
+ argv, err_string)) {
+ extra_cfg.dv_cost_upd_freq = arg_parse_uint_helper(&arg, err_string);
}
#if CONFIG_DENOISE
else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.denoise_noise_level,
@@ -3531,6 +3544,7 @@
{ AV1E_SET_SVC_REF_FRAME_CONFIG, ctrl_set_svc_ref_frame_config },
{ AV1E_SET_VBR_CORPUS_COMPLEXITY_LAP, ctrl_set_vbr_corpus_complexity_lap },
{ AV1E_ENABLE_SB_MULTIPASS_UNIT_TEST, ctrl_enable_sb_multipass_unit_test },
+ { AV1E_SET_DV_COST_UPD_FREQ, ctrl_set_dv_cost_upd_freq },
// Getters
{ AOME_GET_LAST_QUANTIZER, ctrl_get_quantizer },
diff --git a/examples/svc_encoder_rtc.c b/examples/svc_encoder_rtc.c
index e6af859..eed4679 100644
--- a/examples/svc_encoder_rtc.c
+++ b/examples/svc_encoder_rtc.c
@@ -1247,6 +1247,7 @@
aom_codec_control(&codec, AV1E_SET_COEFF_COST_UPD_FREQ, 3);
aom_codec_control(&codec, AV1E_SET_MODE_COST_UPD_FREQ, 3);
aom_codec_control(&codec, AV1E_SET_MV_COST_UPD_FREQ, 3);
+ aom_codec_control(&codec, AV1E_SET_DV_COST_UPD_FREQ, 3);
aom_codec_control(&codec, AV1E_SET_CDF_UPDATE_MODE, 1);
aom_codec_control(&codec, AV1E_SET_TILE_COLUMNS,
cfg.g_threads ? get_msb(cfg.g_threads) : 0);
diff --git a/test/datarate_test.h b/test/datarate_test.h
index 0396034..1b0d515 100644
--- a/test/datarate_test.h
+++ b/test/datarate_test.h
@@ -63,6 +63,7 @@
encoder->Control(AV1E_SET_COEFF_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MODE_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MV_COST_UPD_FREQ, 2);
+ encoder->Control(AV1E_SET_DV_COST_UPD_FREQ, 2);
}
}
diff --git a/test/ethread_test.cc b/test/ethread_test.cc
index 06aad42..6d8255c 100644
--- a/test/ethread_test.cc
+++ b/test/ethread_test.cc
@@ -266,6 +266,7 @@
encoder->Control(AV1E_SET_COEFF_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MODE_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MV_COST_UPD_FREQ, 3);
+ encoder->Control(AV1E_SET_DV_COST_UPD_FREQ, 3);
} else {
encoder->Control(AOME_SET_CQ_LEVEL, kCqLevel);
}
diff --git a/test/rt_end_to_end_test.cc b/test/rt_end_to_end_test.cc
index e8a1a40..8590f80 100644
--- a/test/rt_end_to_end_test.cc
+++ b/test/rt_end_to_end_test.cc
@@ -125,6 +125,7 @@
encoder->Control(AV1E_SET_COEFF_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MODE_COST_UPD_FREQ, 2);
encoder->Control(AV1E_SET_MV_COST_UPD_FREQ, 2);
+ encoder->Control(AV1E_SET_DV_COST_UPD_FREQ, 2);
}
}