From 19b3a25048d956622ebcc26b722a0a5c5155553f Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sat, 22 Feb 2014 23:32:45 +0100 Subject: [PATCH 1/3] lavu/log: add device categories Signed-off-by: Lukasz Marek --- libavutil/log.c | 12 ++++++++++++ libavutil/log.h | 6 ++++++ libavutil/version.h | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libavutil/log.c b/libavutil/log.c index 38ce1e8fc8..a0bb5e468b 100644 --- a/libavutil/log.c +++ b/libavutil/log.c @@ -71,6 +71,12 @@ static const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = { [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 9, [16+AV_CLASS_CATEGORY_SWSCALER ] = 7, [16+AV_CLASS_CATEGORY_SWRESAMPLER ] = 7, + [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 13, + [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ] = 5, + [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 13, + [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ] = 5, + [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT ] = 13, + [16+AV_CLASS_CATEGORY_DEVICE_INPUT ] = 5, }; static int16_t background, attr_orig; @@ -96,6 +102,12 @@ static const uint32_t color[16 + AV_CLASS_CATEGORY_NB] = { [16+AV_CLASS_CATEGORY_BITSTREAM_FILTER] = 192 << 8 | 0x14, [16+AV_CLASS_CATEGORY_SWSCALER ] = 153 << 8 | 0x14, [16+AV_CLASS_CATEGORY_SWRESAMPLER ] = 147 << 8 | 0x14, + [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ] = 213 << 8 | 0x15, + [16+AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ] = 207 << 8 | 0x05, + [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ] = 213 << 8 | 0x15, + [16+AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ] = 207 << 8 | 0x05, + [16+AV_CLASS_CATEGORY_DEVICE_OUTPUT ] = 213 << 8 | 0x15, + [16+AV_CLASS_CATEGORY_DEVICE_INPUT ] = 207 << 8 | 0x05, }; #endif diff --git a/libavutil/log.h b/libavutil/log.h index 5fb476f948..f16e38221b 100644 --- a/libavutil/log.h +++ b/libavutil/log.h @@ -37,6 +37,12 @@ typedef enum { AV_CLASS_CATEGORY_BITSTREAM_FILTER, AV_CLASS_CATEGORY_SWSCALER, AV_CLASS_CATEGORY_SWRESAMPLER, + AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40, + AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT, AV_CLASS_CATEGORY_NB, ///< not part of ABI/API }AVClassCategory; diff --git a/libavutil/version.h b/libavutil/version.h index 7f093cd583..fc959ebd74 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -57,7 +57,7 @@ #define LIBAVUTIL_VERSION_MAJOR 52 #define LIBAVUTIL_VERSION_MINOR 66 -#define LIBAVUTIL_VERSION_MICRO 100 +#define LIBAVUTIL_VERSION_MICRO 101 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ From f607767d93b7c277585332f85f9d75ad85221979 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sat, 22 Feb 2014 23:32:51 +0100 Subject: [PATCH 2/3] lavd: add categories to device implementations Signed-off-by: Lukasz Marek --- libavdevice/alsa-audio-dec.c | 1 + libavdevice/alsa-audio-enc.c | 8 ++++++++ libavdevice/bktr.c | 1 + libavdevice/caca.c | 1 + libavdevice/decklink_enc_c.c | 1 + libavdevice/dshow.c | 1 + libavdevice/dv1394.c | 1 + libavdevice/fbdev_dec.c | 1 + libavdevice/fbdev_enc.c | 1 + libavdevice/iec61883.c | 1 + libavdevice/jack_audio.c | 1 + libavdevice/lavfi.c | 1 + libavdevice/libcdio.c | 1 + libavdevice/libdc1394.c | 1 + libavdevice/openal-dec.c | 3 ++- libavdevice/opengl_enc.c | 1 + libavdevice/oss_audio.c | 9 +++++++++ libavdevice/pulse_audio_dec.c | 1 + libavdevice/pulse_audio_enc.c | 1 + libavdevice/sdl.c | 1 + libavdevice/sndio_dec.c | 1 + libavdevice/sndio_enc.c | 8 ++++++++ libavdevice/v4l.c | 1 + libavdevice/v4l2.c | 1 + libavdevice/v4l2enc.c | 8 ++++++++ libavdevice/vfwcap.c | 1 + libavdevice/x11grab.c | 1 + libavdevice/xv.c | 1 + 28 files changed, 58 insertions(+), 1 deletion(-) diff --git a/libavdevice/alsa-audio-dec.c b/libavdevice/alsa-audio-dec.c index 03154b0b7c..2cdf356b92 100644 --- a/libavdevice/alsa-audio-dec.c +++ b/libavdevice/alsa-audio-dec.c @@ -143,6 +143,7 @@ static const AVClass alsa_demuxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_alsa_demuxer = { diff --git a/libavdevice/alsa-audio-enc.c b/libavdevice/alsa-audio-enc.c index bf56fc46d7..e42cc8f518 100644 --- a/libavdevice/alsa-audio-enc.c +++ b/libavdevice/alsa-audio-enc.c @@ -142,6 +142,13 @@ audio_get_output_timestamp(AVFormatContext *s1, int stream, *dts = s->timestamp - delay; } +static const AVClass alsa_muxer_class = { + .class_name = "ALSA muxer", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, +}; + AVOutputFormat ff_alsa_muxer = { .name = "alsa", .long_name = NULL_IF_CONFIG_SMALL("ALSA audio output"), @@ -154,4 +161,5 @@ AVOutputFormat ff_alsa_muxer = { .write_uncoded_frame = audio_write_frame, .get_output_timestamp = audio_get_output_timestamp, .flags = AVFMT_NOFILE, + .priv_class = &alsa_muxer_class, }; diff --git a/libavdevice/bktr.c b/libavdevice/bktr.c index 4e25aa6ad8..50dcc7d214 100644 --- a/libavdevice/bktr.c +++ b/libavdevice/bktr.c @@ -334,6 +334,7 @@ static const AVClass bktr_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_bktr_demuxer = { diff --git a/libavdevice/caca.c b/libavdevice/caca.c index 0a7470120f..a118064787 100644 --- a/libavdevice/caca.c +++ b/libavdevice/caca.c @@ -224,6 +224,7 @@ static const AVClass caca_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_caca_muxer = { diff --git a/libavdevice/decklink_enc_c.c b/libavdevice/decklink_enc_c.c index b98e0b4fa4..7c1804376a 100644 --- a/libavdevice/decklink_enc_c.c +++ b/libavdevice/decklink_enc_c.c @@ -38,6 +38,7 @@ static const AVClass decklink_muxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_decklink_muxer = { diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c index 5293d263ac..950e313ed8 100644 --- a/libavdevice/dshow.c +++ b/libavdevice/dshow.c @@ -1081,6 +1081,7 @@ static const AVClass dshow_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_dshow_demuxer = { diff --git a/libavdevice/dv1394.c b/libavdevice/dv1394.c index 0af5ea53c7..c8241e33f2 100644 --- a/libavdevice/dv1394.c +++ b/libavdevice/dv1394.c @@ -224,6 +224,7 @@ static const AVClass dv1394_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_dv1394_demuxer = { diff --git a/libavdevice/fbdev_dec.c b/libavdevice/fbdev_dec.c index 14ebab35c9..01bc7c6826 100644 --- a/libavdevice/fbdev_dec.c +++ b/libavdevice/fbdev_dec.c @@ -217,6 +217,7 @@ static const AVClass fbdev_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_fbdev_demuxer = { diff --git a/libavdevice/fbdev_enc.c b/libavdevice/fbdev_enc.c index 8291b59759..0fd1c666b9 100644 --- a/libavdevice/fbdev_enc.c +++ b/libavdevice/fbdev_enc.c @@ -196,6 +196,7 @@ static const AVClass fbdev_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_fbdev_muxer = { diff --git a/libavdevice/iec61883.c b/libavdevice/iec61883.c index a63566e9d4..92b9dc2ad7 100644 --- a/libavdevice/iec61883.c +++ b/libavdevice/iec61883.c @@ -483,6 +483,7 @@ static const AVClass iec61883_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_iec61883_demuxer = { diff --git a/libavdevice/jack_audio.c b/libavdevice/jack_audio.c index 5ba6731682..67f7ac74c9 100644 --- a/libavdevice/jack_audio.c +++ b/libavdevice/jack_audio.c @@ -333,6 +333,7 @@ static const AVClass jack_indev_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_jack_demuxer = { diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c index a177ad0271..1ea7ea7717 100644 --- a/libavdevice/lavfi.c +++ b/libavdevice/lavfi.c @@ -425,6 +425,7 @@ static const AVClass lavfi_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_INPUT, }; AVInputFormat ff_lavfi_demuxer = { diff --git a/libavdevice/libcdio.c b/libavdevice/libcdio.c index 91052cc40c..16a4b26956 100644 --- a/libavdevice/libcdio.c +++ b/libavdevice/libcdio.c @@ -177,6 +177,7 @@ static const AVClass libcdio_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_libcdio_demuxer = { diff --git a/libavdevice/libdc1394.c b/libavdevice/libdc1394.c index 80cb1bee11..e9bd4c98f2 100644 --- a/libavdevice/libdc1394.c +++ b/libavdevice/libdc1394.c @@ -112,6 +112,7 @@ static const AVClass libdc1394_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; diff --git a/libavdevice/openal-dec.c b/libavdevice/openal-dec.c index 93633ff7d2..4c4ba28c22 100644 --- a/libavdevice/openal-dec.c +++ b/libavdevice/openal-dec.c @@ -236,7 +236,8 @@ static const AVClass class = { .class_name = "openal", .item_name = av_default_item_name, .option = options, - .version = LIBAVUTIL_VERSION_INT + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_openal_demuxer = { diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c index 1b993906f8..6be03981dd 100644 --- a/libavdevice/opengl_enc.c +++ b/libavdevice/opengl_enc.c @@ -1272,6 +1272,7 @@ static const AVClass opengl_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_opengl_muxer = { diff --git a/libavdevice/oss_audio.c b/libavdevice/oss_audio.c index 916908c425..71bf63689a 100644 --- a/libavdevice/oss_audio.c +++ b/libavdevice/oss_audio.c @@ -296,6 +296,7 @@ static const AVClass oss_demuxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_oss_demuxer = { @@ -311,6 +312,13 @@ AVInputFormat ff_oss_demuxer = { #endif #if CONFIG_OSS_OUTDEV +static const AVClass oss_muxer_class = { + .class_name = "OSS muxer", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, +}; + AVOutputFormat ff_oss_muxer = { .name = "oss", .long_name = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"), @@ -324,5 +332,6 @@ AVOutputFormat ff_oss_muxer = { .write_packet = audio_write_packet, .write_trailer = audio_write_trailer, .flags = AVFMT_NOFILE, + .priv_class = &oss_muxer_class, }; #endif diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c index 3b5cebb7f6..49d6f7e7c7 100644 --- a/libavdevice/pulse_audio_dec.c +++ b/libavdevice/pulse_audio_dec.c @@ -166,6 +166,7 @@ static const AVClass pulse_demuxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_pulse_demuxer = { diff --git a/libavdevice/pulse_audio_enc.c b/libavdevice/pulse_audio_enc.c index e047299391..4fb64ed471 100644 --- a/libavdevice/pulse_audio_enc.c +++ b/libavdevice/pulse_audio_enc.c @@ -167,6 +167,7 @@ static const AVClass pulse_muxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, }; AVOutputFormat ff_pulse_muxer = { diff --git a/libavdevice/sdl.c b/libavdevice/sdl.c index bef50417e7..b98aae5eeb 100644 --- a/libavdevice/sdl.c +++ b/libavdevice/sdl.c @@ -358,6 +358,7 @@ static const AVClass sdl_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_sdl_muxer = { diff --git a/libavdevice/sndio_dec.c b/libavdevice/sndio_dec.c index 806f47867e..37c6983429 100644 --- a/libavdevice/sndio_dec.c +++ b/libavdevice/sndio_dec.c @@ -104,6 +104,7 @@ static const AVClass sndio_demuxer_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; AVInputFormat ff_sndio_demuxer = { diff --git a/libavdevice/sndio_enc.c b/libavdevice/sndio_enc.c index 84d070e89c..205cf2411d 100644 --- a/libavdevice/sndio_enc.c +++ b/libavdevice/sndio_enc.c @@ -76,6 +76,13 @@ static int audio_write_trailer(AVFormatContext *s1) return 0; } +static const AVClass sndio_muxer_class = { + .class_name = "sndio outdev", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, +}; + AVOutputFormat ff_sndio_muxer = { .name = "sndio", .long_name = NULL_IF_CONFIG_SMALL("sndio audio playback"), @@ -89,4 +96,5 @@ AVOutputFormat ff_sndio_muxer = { .write_packet = audio_write_packet, .write_trailer = audio_write_trailer, .flags = AVFMT_NOFILE, + .priv_class = &sndio_muxer_class, }; diff --git a/libavdevice/v4l.c b/libavdevice/v4l.c index bf2c9e372c..d33f7142a0 100644 --- a/libavdevice/v4l.c +++ b/libavdevice/v4l.c @@ -348,6 +348,7 @@ static const AVClass v4l_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_v4l_demuxer = { diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 96a272c192..c671e3ac73 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -1023,6 +1023,7 @@ static const AVClass v4l2_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; AVInputFormat ff_v4l2_demuxer = { diff --git a/libavdevice/v4l2enc.c b/libavdevice/v4l2enc.c index 21f0ef6983..efe08b589e 100644 --- a/libavdevice/v4l2enc.c +++ b/libavdevice/v4l2enc.c @@ -97,6 +97,13 @@ static int write_trailer(AVFormatContext *s1) return 0; } +static const AVClass v4l2_class = { + .class_name = "V4L2 outdev", + .item_name = av_default_item_name, + .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, +}; + AVOutputFormat ff_v4l2_muxer = { .name = "v4l2", .long_name = NULL_IF_CONFIG_SMALL("Video4Linux2 output device"), @@ -107,4 +114,5 @@ AVOutputFormat ff_v4l2_muxer = { .write_packet = write_packet, .write_trailer = write_trailer, .flags = AVFMT_NOFILE, + .priv_class = &v4l2_class, }; diff --git a/libavdevice/vfwcap.c b/libavdevice/vfwcap.c index 014f18c27e..e5d959350a 100644 --- a/libavdevice/vfwcap.c +++ b/libavdevice/vfwcap.c @@ -469,6 +469,7 @@ static const AVClass vfw_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT }; AVInputFormat ff_vfwcap_demuxer = { diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c index 0e7b6ae5ee..d38c55d1c3 100644 --- a/libavdevice/x11grab.c +++ b/libavdevice/x11grab.c @@ -633,6 +633,7 @@ static const AVClass x11_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, }; /** x11 grabber device demuxer declaration */ diff --git a/libavdevice/xv.c b/libavdevice/xv.c index 89d6575f6c..ab08e3e0f7 100644 --- a/libavdevice/xv.c +++ b/libavdevice/xv.c @@ -255,6 +255,7 @@ static const AVClass xv_class = { .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, + .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, }; AVOutputFormat ff_xv_muxer = { From 06fed44051d0258127f55afa4dd07dfbff021327 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sat, 22 Feb 2014 23:32:55 +0100 Subject: [PATCH 3/3] lavd/avdevice: add device iterators Signed-off-by: Lukasz Marek --- doc/APIchanges | 6 ++++++ libavdevice/avdevice.c | 46 ++++++++++++++++++++++++++++++++++++++++++ libavdevice/avdevice.h | 36 +++++++++++++++++++++++++++++++++ libavdevice/version.h | 2 +- 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index e52b4489d3..b06d9770bd 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,12 @@ libavutil: 2012-10-22 API changes, most recent first: +2014-xx-xx - xxxxxx - lavd 55.11.100 - avdevice.h + Add av_input_audio_device_next(). + Add av_input_video_device_next(). + Add av_output_audio_device_next(). + Add av_output_video_device_next(). + 2014-xx-xx - xxxxxxx - lavu 53.05.0 - frame.h Add av_frame_copy() for copying the frame data. diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index 9e2b7d52da..8964b96f36 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -37,6 +37,52 @@ const char * avdevice_license(void) return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; } +static void *av_device_next(void *prev, int output, + AVClassCategory c1, AVClassCategory c2) +{ + const AVClass *pc; + AVClassCategory category = AV_CLASS_CATEGORY_NA; + do { + if (output) { + if (!(prev = av_oformat_next(prev))) + break; + pc = ((AVOutputFormat *)prev)->priv_class; + } else { + if (!(prev = av_iformat_next(prev))) + break; + pc = ((AVInputFormat *)prev)->priv_class; + } + if (!pc) + continue; + category = pc->category; + } while (category != c1 && category != c2); + return prev; +} + +AVInputFormat *av_input_audio_device_next(AVInputFormat *d) +{ + return av_device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT); +} + +AVInputFormat *av_input_video_device_next(AVInputFormat *d) +{ + return av_device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, + AV_CLASS_CATEGORY_DEVICE_INPUT); +} + +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d) +{ + return av_device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT); +} + +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d) +{ + return av_device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, + AV_CLASS_CATEGORY_DEVICE_OUTPUT); +} + int avdevice_app_to_dev_control_message(struct AVFormatContext *s, enum AVAppToDevMessageType type, void *data, size_t data_size) { diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 28344ca161..8b78067133 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -66,6 +66,42 @@ const char *avdevice_license(void); */ void avdevice_register_all(void); +/** + * Audio input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_audio_device_next(AVInputFormat *d); + +/** + * Video input devices iterator. + * + * If d is NULL, returns the first registered input audio/video device, + * if d is non-NULL, returns the next registered input audio/video device after d + * or NULL if d is the last one. + */ +AVInputFormat *av_input_video_device_next(AVInputFormat *d); + +/** + * Audio output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); + +/** + * Video output devices iterator. + * + * If d is NULL, returns the first registered output audio/video device, + * if d is non-NULL, returns the next registered output audio/video device after d + * or NULL if d is the last one. + */ +AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); + typedef struct AVDeviceRect { int x; /**< x coordinate of top left corner */ int y; /**< y coordinate of top left corner */ diff --git a/libavdevice/version.h b/libavdevice/version.h index 85b3b37662..15096ab6cc 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 55 -#define LIBAVDEVICE_VERSION_MINOR 10 +#define LIBAVDEVICE_VERSION_MINOR 11 #define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \