in libvmaf/tools/cli_parse.c [403:545]
void cli_parse(const int argc, char *const *const argv,
CLISettings *const settings)
{
memset(settings, 0, sizeof(*settings));
int o;
while ((o = getopt_long(argc, argv, short_opts, long_opts, NULL)) >= 0) {
switch (o) {
case 'r':
settings->path_ref = optarg;
break;
case 'd':
settings->path_dist = optarg;
break;
case 'w':
settings->width = parse_unsigned(optarg, 'w', argv[0]);
settings->use_yuv = true;
break;
case 'h':
settings->height = parse_unsigned(optarg, 'h', argv[0]);
settings->use_yuv = true;
break;
case 'p':
settings->pix_fmt = parse_pix_fmt(optarg, 'p', argv[0]);
settings->use_yuv = true;
break;
case 'b':
settings->bitdepth = parse_bitdepth(optarg, 'b', argv[0]);
settings->use_yuv = true;
break;
case 'o':
settings->output_path = optarg;
break;
case ARG_OUTPUT_XML:
settings->output_fmt = VMAF_OUTPUT_FORMAT_XML;
break;
case ARG_OUTPUT_JSON:
settings->output_fmt = VMAF_OUTPUT_FORMAT_JSON;
break;
case ARG_OUTPUT_CSV:
settings->output_fmt = VMAF_OUTPUT_FORMAT_CSV;
break;
case ARG_OUTPUT_SUB:
settings->output_fmt = VMAF_OUTPUT_FORMAT_SUB;
break;
case 'm':
if (settings->model_cnt == CLI_SETTINGS_STATIC_ARRAY_LEN) {
usage(argv[0], "A maximum of %d models are supported\n",
CLI_SETTINGS_STATIC_ARRAY_LEN);
}
settings->model_config[settings->model_cnt++] =
parse_model_config(optarg, argv[0]);
break;
case ARG_FEATURE:
if (settings->feature_cnt == CLI_SETTINGS_STATIC_ARRAY_LEN) {
usage(argv[0], "A maximum of %d features is supported\n",
CLI_SETTINGS_STATIC_ARRAY_LEN);
}
settings->feature_cfg[settings->feature_cnt++] =
parse_feature_config(optarg, argv[0]);
break;
case ARG_THREADS:
settings->thread_cnt = parse_unsigned(optarg, 't', argv[0]);
break;
case ARG_SUBSAMPLE:
settings->subsample = parse_unsigned(optarg, 's', argv[0]);
break;
case ARG_CPUMASK:
settings->cpumask = parse_unsigned(optarg, 'c', argv[0]);
break;
case ARG_GPUMASK:
settings->gpumask = parse_unsigned(optarg, ARG_GPUMASK, argv[0]);
break;
case ARG_AOM_CTC:
parse_aom_ctc(settings, optarg, argv[0]);
break;
case ARG_NFLX_CTC:
parse_nflx_ctc(settings, optarg, argv[0]);
break;
case ARG_FRAME_CNT:
settings->frame_cnt =
parse_unsigned(optarg, ARG_FRAME_CNT, argv[0]);
break;
case ARG_FRAME_SKIP_REF:
settings->frame_skip_ref = parse_unsigned(optarg, ARG_FRAME_SKIP_REF, argv[0]);
break;
case ARG_FRAME_SKIP_DIST:
settings->frame_skip_dist = parse_unsigned(optarg, ARG_FRAME_SKIP_DIST, argv[0]);
break;
case 'n':
settings->no_prediction = true;
break;
case 'q':
settings->quiet = true;
break;
case 'v':
fprintf(stderr, "%s\n", vmaf_version());
exit(0);
default:
break;
}
}
if (!settings->output_fmt)
settings->output_fmt = VMAF_OUTPUT_FORMAT_XML;
if (!settings->path_ref)
usage(argv[0], "Reference .y4m or .yuv (-r/--reference) is required");
if (!settings->path_dist)
usage(argv[0], "Distorted .y4m or .yuv (-d/--distorted) is required");
if (settings->use_yuv && !(settings->width && settings->height &&
settings->pix_fmt && settings->bitdepth))
{
usage(argv[0], "The following options are required for .yuv input:\n"
" --width/-w\n"
" --height/-h\n"
" --pixel_format/-p\n"
" --bitdepth/-b\n");
}
if (settings->model_cnt == 0 && !settings->no_prediction) {
#if VMAF_BUILT_IN_MODELS
CLIModelConfig cfg = {
.version = "vmaf_v0.6.1",
};
settings->model_config[settings->model_cnt++] = cfg;
#else
usage(argv[0], "At least one model (-m/--model) is required "
"unless no prediction (-n/--no_prediction) is set");
#endif
}
for (unsigned i = 0; i < settings->model_cnt; i++) {
for (unsigned j = 0; j < settings->model_cnt; j++) {
if (i == j) continue;
if (!strcmp(settings->model_config[i].cfg.name,
settings->model_config[j].cfg.name))
{
usage(argv[0], "Each model should be uniquely named. "
"Set using `--model` via the `name=...` param.");
}
}
}
}