Skip to content

Commit

Permalink
cmdutils: extend -h to allow printing codec details.
Browse files Browse the repository at this point in the history
elenril committed Aug 19, 2012

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
1 parent 7c50121 commit a3ad68d
Showing 9 changed files with 172 additions and 32 deletions.
14 changes: 0 additions & 14 deletions avconv_filter.c
Original file line number Diff line number Diff line change
@@ -59,29 +59,15 @@ static char *choose_ ## var ## s(OutputStream *ost) \
return NULL; \
}

#define GET_PIX_FMT_NAME(pix_fmt)\
const char *name = av_get_pix_fmt_name(pix_fmt);

DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
GET_PIX_FMT_NAME, ":")

#define GET_SAMPLE_FMT_NAME(sample_fmt)\
const char *name = av_get_sample_fmt_name(sample_fmt)

DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")

#define GET_SAMPLE_RATE_NAME(rate)\
char name[16];\
snprintf(name, sizeof(name), "%d", rate);

DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
GET_SAMPLE_RATE_NAME, ",")

#define GET_CH_LAYOUT_NAME(ch_layout)\
char name[16];\
snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);

DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
GET_CH_LAYOUT_NAME, ",")

5 changes: 2 additions & 3 deletions avconv_opt.c
Original file line number Diff line number Diff line change
@@ -1789,10 +1789,10 @@ static int opt_filter_complex(const char *opt, const char *arg)
return 0;
}

static int show_help(const char *opt, const char *arg)
void show_help_default(const char *opt, const char *arg)
{
int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
av_log_set_callback(log_callback_help);

show_usage();
show_help_options(options, "Main options:",
0, OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE);
@@ -1812,7 +1812,6 @@ static int show_help(const char *opt, const char *arg)
show_help_children(avcodec_get_class(), flags);
show_help_children(avformat_get_class(), flags);
show_help_children(sws_get_class(), flags);
return 0;
}

void show_usage(void)
6 changes: 1 addition & 5 deletions avplay.c
Original file line number Diff line number Diff line change
@@ -224,8 +224,6 @@ typedef struct VideoState {
int refresh;
} VideoState;

static int show_help(const char *opt, const char *arg);

/* options specified by the user */
static AVInputFormat *file_iformat;
static const char *input_filename;
@@ -2922,7 +2920,7 @@ static void show_usage(void)
printf("\n");
}

static int show_help(const char *opt, const char *arg)
void show_help_default(const char *opt, const char *arg)
{
av_log_set_callback(log_callback_help);
show_usage();
@@ -2947,8 +2945,6 @@ static int show_help(const char *opt, const char *arg)
"down/up seek backward/forward 1 minute\n"
"mouse click seek to percentage in file corresponding to fraction of width\n"
);

return 0;
}

static void opt_input_file(void *optctx, const char *filename)
3 changes: 1 addition & 2 deletions avprobe.c
Original file line number Diff line number Diff line change
@@ -868,14 +868,13 @@ static void opt_input_file(void *optctx, const char *arg)
input_filename = arg;
}

static int show_help(const char *opt, const char *arg)
void show_help_default(const char *opt, const char *arg)
{
av_log_set_callback(log_callback_help);
show_usage();
show_help_options(options, "Main options:", 0, 0);
printf("\n");
show_help_children(avformat_get_class(), AV_OPT_FLAG_DECODING_PARAM);
return 0;
}

static void opt_pretty(void)
2 changes: 1 addition & 1 deletion avserver.c
Original file line number Diff line number Diff line change
@@ -4629,7 +4629,7 @@ static void opt_debug(void)
logfilename[0] = '-';
}

static void show_help(void)
void show_help_default(const char *opt, const char *arg)
{
printf("usage: avserver [options]\n"
"Hyper fast multi format Audio/Video streaming server\n");
120 changes: 119 additions & 1 deletion cmdutils.c
Original file line number Diff line number Diff line change
@@ -132,7 +132,7 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
first = 0;
}
av_strlcpy(buf, po->name, sizeof(buf));
if (po->flags & HAS_ARG) {
if (po->argname) {
av_strlcat(buf, " ", sizeof(buf));
av_strlcat(buf, po->argname, sizeof(buf));
}
@@ -642,6 +642,65 @@ int show_formats(const char *opt, const char *arg)
return 0;
}

#define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \
if (codec->field) { \
const type *p = c->field; \
\
printf(" Supported " list_name ":"); \
while (*p != term) { \
get_name(*p); \
printf(" %s", name); \
p++; \
} \
printf("\n"); \
} \

static void print_codec(const AVCodec *c)
{
int encoder = av_codec_is_encoder(c);

printf("%s %s [%s]:\n", encoder ? "Encoder" : "Decoder", c->name,
c->long_name ? c->long_name : "");

if (c->type == AVMEDIA_TYPE_VIDEO) {
printf(" Threading capabilities: ");
switch (c->capabilities & (CODEC_CAP_FRAME_THREADS |
CODEC_CAP_SLICE_THREADS)) {
case CODEC_CAP_FRAME_THREADS |
CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
case CODEC_CAP_FRAME_THREADS: printf("frame"); break;
case CODEC_CAP_SLICE_THREADS: printf("slice"); break;
default: printf("no"); break;
}
printf("\n");
}

if (c->supported_framerates) {
const AVRational *fps = c->supported_framerates;

printf(" Supported framerates:");
while (fps->num) {
printf(" %d/%d", fps->num, fps->den);
fps++;
}
printf("\n");
}
PRINT_CODEC_SUPPORTED(c, pix_fmts, enum PixelFormat, "pixel formats",
PIX_FMT_NONE, GET_PIX_FMT_NAME);
PRINT_CODEC_SUPPORTED(c, supported_samplerates, int, "sample rates", 0,
GET_SAMPLE_RATE_NAME);
PRINT_CODEC_SUPPORTED(c, sample_fmts, enum AVSampleFormat, "sample formats",
AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME);
PRINT_CODEC_SUPPORTED(c, channel_layouts, uint64_t, "channel layouts",
0, GET_CH_LAYOUT_DESC);

if (c->priv_class) {
show_help_children(c->priv_class,
AV_OPT_FLAG_ENCODING_PARAM |
AV_OPT_FLAG_DECODING_PARAM);
}
}

static char get_media_type_char(enum AVMediaType type)
{
switch (type) {
@@ -842,6 +901,65 @@ int show_sample_fmts(const char *opt, const char *arg)
return 0;
}

static void show_help_codec(const char *name, int encoder)
{
const AVCodecDescriptor *desc;
const AVCodec *codec;

if (!name) {
av_log(NULL, AV_LOG_ERROR, "No codec name specified.\n");
return;
}

codec = encoder ? avcodec_find_encoder_by_name(name) :
avcodec_find_decoder_by_name(name);

if (codec)
print_codec(codec);
else if ((desc = avcodec_descriptor_get_by_name(name))) {
int printed = 0;

while ((codec = next_codec_for_id(desc->id, codec, encoder))) {
printed = 1;
print_codec(codec);
}

if (!printed) {
av_log(NULL, AV_LOG_ERROR, "Codec '%s' is known to Libav, "
"but no %s for it are available. Libav might need to be "
"recompiled with additional external libraries.\n",
name, encoder ? "encoders" : "decoders");
}
} else {
av_log(NULL, AV_LOG_ERROR, "Codec '%s' is not recognized by Libav.\n",
name);
}
}

int show_help(const char *opt, const char *arg)
{
char *topic, *par;
av_log_set_callback(log_callback_help);

topic = av_strdup(arg ? arg : "");
par = strchr(topic, '=');
if (par)
*par++ = 0;

if (!*topic) {
show_help_default(topic, par);
} else if (!strcmp(topic, "decoder")) {
show_help_codec(par, 0);
} else if (!strcmp(topic, "encoder")) {
show_help_codec(par, 1);
} else {
show_help_default(topic, par);
}

av_freep(&topic);
return 0;
}

int read_yesno(void)
{
int c = getchar();
30 changes: 30 additions & 0 deletions cmdutils.h
Original file line number Diff line number Diff line change
@@ -170,6 +170,17 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
*/
void show_help_children(const AVClass *class, int flags);

/**
* Per-avtool specific help handler. Implemented in each
* avtool, called by show_help().
*/
void show_help_default(const char *opt, const char *arg);

/**
* Generic -h handler common to all avtools.
*/
int show_help(const char *opt, const char *arg);

/**
* Parse the command line arguments.
*
@@ -446,4 +457,23 @@ void filter_release_buffer(AVFilterBuffer *fb);
* buffers have been released.
*/
void free_buffer_pool(FrameBuffer **pool);

#define GET_PIX_FMT_NAME(pix_fmt)\
const char *name = av_get_pix_fmt_name(pix_fmt);

#define GET_SAMPLE_FMT_NAME(sample_fmt)\
const char *name = av_get_sample_fmt_name(sample_fmt)

#define GET_SAMPLE_RATE_NAME(rate)\
char name[16];\
snprintf(name, sizeof(name), "%d", rate);

#define GET_CH_LAYOUT_NAME(ch_layout)\
char name[16];\
snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);

#define GET_CH_LAYOUT_DESC(ch_layout)\
char name[128];\
av_get_channel_layout_string(name, sizeof(name), 0, ch_layout);

#endif /* LIBAV_CMDUTILS_H */
8 changes: 4 additions & 4 deletions cmdutils_common_opts.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{ "L" , OPT_EXIT, {.func_arg = show_license}, "show license" },
{ "h" , OPT_EXIT, {.func_arg = show_help}, "show help" },
{ "?" , OPT_EXIT, {.func_arg = show_help}, "show help" },
{ "help" , OPT_EXIT, {.func_arg = show_help}, "show help" },
{ "-help" , OPT_EXIT, {.func_arg = show_help}, "show help" },
{ "h" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" },
{ "?" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" },
{ "help" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" },
{ "-help" , OPT_EXIT, {.func_arg = show_help}, "show help", "topic" },
{ "version" , OPT_EXIT, {.func_arg = show_version}, "show version" },
{ "formats" , OPT_EXIT, {.func_arg = show_formats }, "show available formats" },
{ "codecs" , OPT_EXIT, {.func_arg = show_codecs }, "show available codecs" },
16 changes: 14 additions & 2 deletions doc/avtools-common-opts.texi
Original file line number Diff line number Diff line change
@@ -51,8 +51,20 @@ These options are shared amongst the av* tools.
@item -L
Show license.

@item -h, -?, -help, --help
Show help.
@item -h, -?, -help, --help [@var{arg}]
Show help. An optional parameter may be specified to print help about a specific
item.

Possible values of @var{arg} are:
@table @option
@item decoder=@var{decoder_name}
Print detailed information about the decoder named @var{decoder_name}. Use the
@option{-decoders} option to get a list of all decoders.

@item encoder=@var{encoder_name}
Print detailed information about the encoder named @var{encoder_name}. Use the
@option{-encoders} option to get a list of all encoders.
@end table

@item -version
Show version.

0 comments on commit a3ad68d

Please sign in to comment.