Add a command line option to pass in partition info path
Allow reading and writing partition information using the path
passed in by the command line.
Change-Id: I0c50912eb7720ca297c491983d2f979511dc2e2a
diff --git a/aom/aomcx.h b/aom/aomcx.h
index cb37f59..6937a67 100644
--- a/aom/aomcx.h
+++ b/aom/aomcx.h
@@ -1337,6 +1337,11 @@
*/
AV1E_SET_DV_COST_UPD_FREQ = 142,
+ /*!\brief Codec control to set the path for partition stats read and write.
+ * const char * parameter.
+ */
+ AV1E_SET_PARTITION_INFO_PATH = 143,
+
// Any new encoder control IDs should be added above.
// Maximum allowed encoder control ID is 229.
// No encoder control ID should be added below.
@@ -1873,6 +1878,9 @@
AOM_CTRL_USE_TYPE(AV1E_SET_DV_COST_UPD_FREQ, unsigned int)
#define AOM_CTRL_AV1E_SET_DV_COST_UPD_FREQ
+AOM_CTRL_USE_TYPE(AV1E_SET_PARTITION_INFO_PATH, const char *)
+#define AOM_CTRL_AV1E_SET_PARTITION_INFO_PATH
+
/*!\endcond */
/*! @} - end defgroup aom_encoder */
#ifdef __cplusplus
diff --git a/apps/aomenc.c b/apps/aomenc.c
index 1968fce..27439f40 100644
--- a/apps/aomenc.c
+++ b/apps/aomenc.c
@@ -228,6 +228,7 @@
AV1E_SET_VMAF_MODEL_PATH,
#endif
AV1E_SET_DV_COST_UPD_FREQ,
+ AV1E_SET_PARTITION_INFO_PATH,
0 };
const arg_def_t *main_args[] = { &g_av1_codec_arg_defs.help,
@@ -424,6 +425,7 @@
&g_av1_codec_arg_defs.vmaf_model_path,
#endif
&g_av1_codec_arg_defs.dv_cost_upd_freq,
+ &g_av1_codec_arg_defs.partition_info_path,
NULL,
};
@@ -507,6 +509,7 @@
#if CONFIG_TUNE_VMAF
const char *vmaf_model_path;
#endif
+ const char *partition_info_path;
aom_color_range_t color_range;
};
@@ -1075,6 +1078,9 @@
} else if (arg_match(&arg, &g_av1_codec_arg_defs.vmaf_model_path, argi)) {
config->vmaf_model_path = arg.val;
#endif
+ } else if (arg_match(&arg, &g_av1_codec_arg_defs.partition_info_path,
+ argi)) {
+ config->partition_info_path = arg.val;
} else if (arg_match(&arg, &g_av1_codec_arg_defs.use_fixed_qp_offsets,
argi)) {
config->cfg.use_fixed_qp_offsets = arg_parse_uint(&arg);
@@ -1441,6 +1447,11 @@
stream->config.vmaf_model_path);
}
#endif
+ if (stream->config.partition_info_path) {
+ AOM_CODEC_CONTROL_TYPECHECKED(&stream->encoder,
+ AV1E_SET_PARTITION_INFO_PATH,
+ stream->config.partition_info_path);
+ }
if (stream->config.film_grain_filename) {
AOM_CODEC_CONTROL_TYPECHECKED(&stream->encoder, AV1E_SET_FILM_GRAIN_TABLE,
diff --git a/av1/arg_defs.c b/av1/arg_defs.c
index 75cd54c..48d8314 100644
--- a/av1/arg_defs.c
+++ b/av1/arg_defs.c
@@ -474,6 +474,8 @@
.vmaf_model_path =
ARG_DEF(NULL, "vmaf-model-path", 1, "Path to the VMAF model file"),
#endif
+ .partition_info_path = ARG_DEF(NULL, "partition-info-path", 1,
+ "Partition information read and write path"),
.film_grain_test = ARG_DEF(
NULL, "film-grain-test", 1,
"Film grain test vectors (0: none (default), 1: test-1 2: test-2, "
diff --git a/av1/arg_defs.h b/av1/arg_defs.h
index 03392da..6a8d0d4 100644
--- a/av1/arg_defs.h
+++ b/av1/arg_defs.h
@@ -180,6 +180,7 @@
#if CONFIG_TUNE_VMAF
arg_def_t vmaf_model_path;
#endif
+ arg_def_t partition_info_path;
arg_def_t film_grain_test;
arg_def_t film_grain_table;
#if CONFIG_DENOISE
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 11c9249..4c49485 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -51,6 +51,7 @@
unsigned int gf_max_pyr_height;
aom_tune_metric tuning;
const char *vmaf_model_path;
+ const char *partition_info_path;
unsigned int cq_level; // constrained quality level
unsigned int rc_max_intra_bitrate_pct;
unsigned int rc_max_inter_bitrate_pct;
@@ -192,6 +193,7 @@
5, // gf_max_pyr_height
AOM_TUNE_PSNR, // tuning
"/usr/local/share/model/vmaf_v0.6.1.json", // VMAF model path
+ ".", // partition info path
10, // cq_level
0, // rc_max_intra_bitrate_pct
0, // rc_max_inter_bitrate_pct
@@ -322,6 +324,7 @@
5, // gf_max_pyr_height
AOM_TUNE_PSNR, // tuning
"/usr/local/share/model/vmaf_v0.6.1.json", // VMAF model path
+ ".", // partition info path
10, // cq_level
0, // rc_max_intra_bitrate_pct
0, // rc_max_inter_bitrate_pct
@@ -1285,6 +1288,8 @@
sizeof(oxcf->target_seq_level_idx));
oxcf->tier_mask = extra_cfg->tier_mask;
+ oxcf->partition_info_path = extra_cfg->partition_info_path;
+
return AOM_CODEC_OK;
}
@@ -2027,6 +2032,13 @@
return update_extra_cfg(ctx, &extra_cfg);
}
+static aom_codec_err_t ctrl_set_partition_info_path(aom_codec_alg_priv_t *ctx,
+ va_list args) {
+ struct av1_extracfg extra_cfg = ctx->extra_cfg;
+ extra_cfg.partition_info_path = CAST(AV1E_SET_PARTITION_INFO_PATH, args);
+ return update_extra_cfg(ctx, &extra_cfg);
+}
+
static aom_codec_err_t ctrl_set_film_grain_test_vector(
aom_codec_alg_priv_t *ctx, va_list args) {
struct av1_extracfg extra_cfg = ctx->extra_cfg;
@@ -3152,8 +3164,11 @@
extra_cfg.vmaf_model_path = value;
}
#endif
- else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cq_level, argv,
- err_string)) {
+ else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.partition_info_path,
+ argv, err_string)) {
+ extra_cfg.partition_info_path = value;
+ } else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.cq_level, argv,
+ err_string)) {
extra_cfg.cq_level = arg_parse_uint_helper(&arg, err_string);
} else if (arg_match_helper(&arg, &g_av1_codec_arg_defs.max_intra_rate_pct,
argv, err_string)) {
@@ -3578,6 +3593,7 @@
{ AV1E_SET_SUPERBLOCK_SIZE, ctrl_set_superblock_size },
{ AV1E_SET_SINGLE_TILE_DECODING, ctrl_set_single_tile_decoding },
{ AV1E_SET_VMAF_MODEL_PATH, ctrl_set_vmaf_model_path },
+ { AV1E_SET_PARTITION_INFO_PATH, ctrl_set_partition_info_path },
{ AV1E_SET_FILM_GRAIN_TEST_VECTOR, ctrl_set_film_grain_test_vector },
{ AV1E_SET_FILM_GRAIN_TABLE, ctrl_set_film_grain_table },
{ AV1E_SET_DENOISE_NOISE_LEVEL, ctrl_set_denoise_noise_level },
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 9caf078..2ba997c 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -946,6 +946,10 @@
// format.
bool save_as_annexb;
+ // The path for partition stats reading and writing, used in the experiment
+ // CONFIG_PARTITION_SEARCH_ORDER.
+ const char *partition_info_path;
+
/*!\endcond */
} AV1EncoderConfig;
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index 50562b2..3cb5d49 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -3609,8 +3609,9 @@
const int mi_col) {
(void)mi_row;
(void)mi_col;
- char filename[128];
- snprintf(filename, sizeof(filename), "partition_tree_sb%d_c%d",
+ const char *path = cpi->oxcf.partition_info_path;
+ char filename[256];
+ snprintf(filename, sizeof(filename), "%s/partition_tree_sb%d_c%d", path,
cpi->sb_counter, 0);
++cpi->sb_counter;
FILE *pfile = fopen(filename, "w");
@@ -3673,9 +3674,10 @@
const int mi_col) {
(void)mi_row;
(void)mi_col;
- char filename[128];
- snprintf(filename, sizeof(filename), "verify_partition_tree_sb%d_c%d",
- cpi->sb_counter, config_id);
+ const char *path = cpi->oxcf.partition_info_path;
+ char filename[256];
+ snprintf(filename, sizeof(filename), "%s/verify_partition_tree_sb%d_c%d",
+ path, cpi->sb_counter, config_id);
FILE *pfile = fopen(filename, "w");
fprintf(pfile, "%d", bsize);
@@ -3733,8 +3735,9 @@
static int read_partition_tree(AV1_COMP *const cpi, PC_TREE *const pc_tree,
const int config_id) {
- char filename[128];
- snprintf(filename, sizeof(filename), "partition_tree_sb%d_c%d",
+ const char *path = cpi->oxcf.partition_info_path;
+ char filename[256];
+ snprintf(filename, sizeof(filename), "%s/partition_tree_sb%d_c%d", path,
cpi->sb_counter, config_id);
FILE *pfile = fopen(filename, "r");
if (pfile == NULL) {