From 8518da23f59d8f5a52f7c1c919f584a119484d0f Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Tue, 27 May 2014 23:04:52 +0200 Subject: [PATCH] ffmpeg: add -devices param FFmpeg mix devices and file formats when -formats option is used. This commit adds a -devices param to list devices only. Signed-off-by: Lukasz Marek Signed-off-by: Michael Niedermayer --- cmdutils.c | 35 ++++++++++++++++++++++++++++++++--- cmdutils.h | 9 ++++++++- cmdutils_common_opts.h | 1 + doc/indevs.texi | 4 ++-- doc/outdevs.texi | 4 ++-- 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/cmdutils.c b/cmdutils.c index 1147bc338e..63d64320eb 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -1193,16 +1193,29 @@ int show_license(void *optctx, const char *opt, const char *arg) return 0; } -int show_formats(void *optctx, const char *opt, const char *arg) +static int is_device(const AVClass *avclass) +{ + if (!avclass) + return 0; + return avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT || + avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT || + avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT || + avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT || + avclass->category == AV_CLASS_CATEGORY_DEVICE_OUTPUT || + avclass->category == AV_CLASS_CATEGORY_DEVICE_INPUT; +} + +static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only) { AVInputFormat *ifmt = NULL; AVOutputFormat *ofmt = NULL; const char *last_name; + int is_dev; - printf("File formats:\n" + printf("%s\n" " D. = Demuxing supported\n" " .E = Muxing supported\n" - " --\n"); + " --\n", device_only ? "Devices:" : "File formats:"); last_name = "000"; for (;;) { int decode = 0; @@ -1211,6 +1224,9 @@ int show_formats(void *optctx, const char *opt, const char *arg) const char *long_name = NULL; while ((ofmt = av_oformat_next(ofmt))) { + is_dev = is_device(ofmt->priv_class); + if (!is_dev && device_only) + continue; if ((name == NULL || strcmp(ofmt->name, name) < 0) && strcmp(ofmt->name, last_name) > 0) { name = ofmt->name; @@ -1219,6 +1235,9 @@ int show_formats(void *optctx, const char *opt, const char *arg) } } while ((ifmt = av_iformat_next(ifmt))) { + is_dev = is_device(ifmt->priv_class); + if (!is_dev && device_only) + continue; if ((name == NULL || strcmp(ifmt->name, name) < 0) && strcmp(ifmt->name, last_name) > 0) { name = ifmt->name; @@ -1241,6 +1260,16 @@ int show_formats(void *optctx, const char *opt, const char *arg) return 0; } +int show_formats(void *optctx, const char *opt, const char *arg) +{ + return show_formats_devices(optctx, opt, arg, 0); +} + +int show_devices(void *optctx, const char *opt, const char *arg) +{ + return show_formats_devices(optctx, opt, arg, 1); +} + #define PRINT_CODEC_SUPPORTED(codec, field, type, list_name, term, get_name) \ if (codec->field) { \ const type *p = codec->field; \ diff --git a/cmdutils.h b/cmdutils.h index c4a16aac73..76d11a598c 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -431,11 +431,18 @@ int show_license(void *optctx, const char *opt, const char *arg); /** * Print a listing containing all the formats supported by the - * program. + * program (including devices). * This option processing function does not utilize the arguments. */ int show_formats(void *optctx, const char *opt, const char *arg); +/** + * Print a listing containing all the devices supported by the + * program. + * This option processing function does not utilize the arguments. + */ +int show_devices(void *optctx, const char *opt, const char *arg); + /** * Print a listing containing all the codecs supported by the * program. diff --git a/cmdutils_common_opts.h b/cmdutils_common_opts.h index 190dba674f..49b5180e37 100644 --- a/cmdutils_common_opts.h +++ b/cmdutils_common_opts.h @@ -6,6 +6,7 @@ { "version" , OPT_EXIT, {.func_arg = show_version}, "show version" }, { "buildconf" , OPT_EXIT, {.func_arg = show_buildconf}, "show build configuration" }, { "formats" , OPT_EXIT, {.func_arg = show_formats }, "show available formats" }, + { "devices" , OPT_EXIT, {.func_arg = show_devices }, "show available devices" }, { "codecs" , OPT_EXIT, {.func_arg = show_codecs }, "show available codecs" }, { "decoders" , OPT_EXIT, {.func_arg = show_decoders }, "show available decoders" }, { "encoders" , OPT_EXIT, {.func_arg = show_encoders }, "show available encoders" }, diff --git a/doc/indevs.texi b/doc/indevs.texi index 7b94155380..4ea82a4ba8 100644 --- a/doc/indevs.texi +++ b/doc/indevs.texi @@ -13,8 +13,8 @@ You can disable all the input devices using the configure option option "--enable-indev=@var{INDEV}", or you can disable a particular input device using the option "--disable-indev=@var{INDEV}". -The option "-formats" of the ff* tools will display the list of -supported input devices (amongst the demuxers). +The option "-devices" of the ff* tools will display the list of +supported input devices. A description of the currently available input devices follows. diff --git a/doc/outdevs.texi b/doc/outdevs.texi index 488a1ad362..e68653fd7a 100644 --- a/doc/outdevs.texi +++ b/doc/outdevs.texi @@ -13,8 +13,8 @@ You can disable all the output devices using the configure option option "--enable-outdev=@var{OUTDEV}", or you can disable a particular input device using the option "--disable-outdev=@var{OUTDEV}". -The option "-formats" of the ff* tools will display the list of -enabled output devices (amongst the muxers). +The option "-devices" of the ff* tools will display the list of +enabled output devices. A description of the currently available output devices follows.