mirror of https://git.ffmpeg.org/ffmpeg.git
avconv_opt: Allow printing private options
Add an allowed parameter to -h and --help avconv option to print private options from a codec, format, or filter, named with the provided input value. In case multiple classes are found (eg. mov demuxer and mov muxer, or h264 decoder and h264 demuxer) print all options from all classes. It is possible to select the type of class to print by adding it before the name (eg. demuxer:mov and muxer:mov, or decoder:h264and demuxer:h264). Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
This commit is contained in:
parent
e3d4784eb3
commit
7bb1c1bfd2
60
avconv_opt.c
60
avconv_opt.c
|
@ -2100,6 +2100,63 @@ static int opt_filter_complex_script(void *optctx, const char *opt, const char *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search a class from a codec, format, or filter, named 'opt', in order
|
||||||
|
* to extract its private options. If the class type is specified, only
|
||||||
|
* the associated options are printed, otherwise all the ones matching
|
||||||
|
* the input name are shown. */
|
||||||
|
static int show_help_specific(const char *opt)
|
||||||
|
{
|
||||||
|
AVCodec *codec = NULL;
|
||||||
|
AVFilter *filter = NULL;
|
||||||
|
AVInputFormat *iformat = NULL;
|
||||||
|
AVOutputFormat *oformat = NULL;
|
||||||
|
int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM |
|
||||||
|
AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM;
|
||||||
|
|
||||||
|
char *kind = av_get_token(&opt, ":");
|
||||||
|
if (!kind)
|
||||||
|
return 0;
|
||||||
|
if (*opt)
|
||||||
|
opt = &opt[1]; // skip ':'
|
||||||
|
|
||||||
|
show_usage();
|
||||||
|
|
||||||
|
if (!strcmp(kind, "decoder") &&
|
||||||
|
(codec = avcodec_find_decoder_by_name(opt)) && codec->priv_class)
|
||||||
|
show_help_children(codec->priv_class, flags);
|
||||||
|
else if (!strcmp(kind, "encoder") &&
|
||||||
|
(codec = avcodec_find_encoder_by_name(opt)) && codec->priv_class)
|
||||||
|
show_help_children(codec->priv_class, flags);
|
||||||
|
else if (!strcmp(kind, "demuxer") &&
|
||||||
|
(iformat = av_find_input_format(opt)) && iformat->priv_class)
|
||||||
|
show_help_children(iformat->priv_class, flags);
|
||||||
|
else if (!strcmp(kind, "muxer") &&
|
||||||
|
(oformat = av_guess_format(opt, NULL, NULL)) && oformat->priv_class)
|
||||||
|
show_help_children(oformat->priv_class, flags);
|
||||||
|
else if (!strcmp(kind, "filter") &&
|
||||||
|
(filter = avfilter_get_by_name(opt)) && filter->priv_class)
|
||||||
|
show_help_children(filter->priv_class, flags);
|
||||||
|
else if (!opt)
|
||||||
|
av_log(NULL, AV_LOG_ERROR,
|
||||||
|
"Unknown class '%s', only 'decoder', 'encoder', 'demuxer', "
|
||||||
|
"'muxer', or 'filter' are valid specifiers.\n", kind);
|
||||||
|
else {
|
||||||
|
if ((codec = avcodec_find_decoder_by_name(kind)) && codec->priv_class)
|
||||||
|
show_help_children(codec->priv_class, flags);
|
||||||
|
if ((codec = avcodec_find_encoder_by_name(kind)) && codec->priv_class)
|
||||||
|
show_help_children(codec->priv_class, flags);
|
||||||
|
if ((iformat = av_find_input_format(kind)) && iformat->priv_class)
|
||||||
|
show_help_children(iformat->priv_class, flags);
|
||||||
|
if ((oformat = av_guess_format(kind, NULL, NULL)) && oformat->priv_class)
|
||||||
|
show_help_children(oformat->priv_class, flags);
|
||||||
|
if ((filter = avfilter_get_by_name(kind)) && filter->priv_class)
|
||||||
|
show_help_children(filter->priv_class, flags);
|
||||||
|
}
|
||||||
|
av_freep(&kind);
|
||||||
|
|
||||||
|
return codec || iformat || oformat || filter;
|
||||||
|
}
|
||||||
|
|
||||||
void show_help_default(const char *opt, const char *arg)
|
void show_help_default(const char *opt, const char *arg)
|
||||||
{
|
{
|
||||||
/* per-file options have at least one of those set */
|
/* per-file options have at least one of those set */
|
||||||
|
@ -2111,6 +2168,8 @@ void show_help_default(const char *opt, const char *arg)
|
||||||
show_advanced = 1;
|
show_advanced = 1;
|
||||||
else if (!strcmp(opt, "full"))
|
else if (!strcmp(opt, "full"))
|
||||||
show_advanced = show_avoptions = 1;
|
show_advanced = show_avoptions = 1;
|
||||||
|
else if (show_help_specific(opt))
|
||||||
|
return;
|
||||||
else
|
else
|
||||||
av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
|
av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
|
||||||
}
|
}
|
||||||
|
@ -2121,6 +2180,7 @@ void show_help_default(const char *opt, const char *arg)
|
||||||
" -h -- print basic options\n"
|
" -h -- print basic options\n"
|
||||||
" -h long -- print more options\n"
|
" -h long -- print more options\n"
|
||||||
" -h full -- print all options (including all format and codec specific options, very long)\n"
|
" -h full -- print all options (including all format and codec specific options, very long)\n"
|
||||||
|
" -h [type:]name -- print private options from a codec, format or filter named 'name' (set 'type' to print options from a single class)\n"
|
||||||
" See man %s for detailed description of the options.\n"
|
" See man %s for detailed description of the options.\n"
|
||||||
"\n", program_name);
|
"\n", program_name);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue