I (new contributor) have been making a push to get avdevice/dshow to where it is great to use programmatically (see recent patches, more coming). One thing on my list is to be able to through the API query the capabilities of my device, as right now I'd have to ask users to run a command like ffmpeg -list_options true -f dshow -i video="Camera" to get that info and manually enter it into my program, let alone that I am unable to make a nicer GUI. I see that this capability has just been deprecated. Instead of waiting for a new avdevice interface that may or may not come (I personally like that they are just formats like anything else, super easy to use), would it be possible to undeprecate when I provide an implementation of create_device_capabilities for the dshow avdevice?
Thanks! -----Original Message----- From: andreas.rheinhardt at gmail.com (Andreas Rheinhardt) <andreas.rheinhardt at gmail.com (Andreas Rheinhardt)> Sent: 24 January 2021 21:16 Subject: [FFmpeg-devel] [PATCH] avdevice/avdevice: Deprecate AVDevice Capabilities API It has been added in 6db42a2b6b22e6f1928fafcf3faa67ed78201004, yet since then none of the necessary create/free_device_capabilities functions has been implemented, making this API completely useless. Because of this one can already simplify avdevice_capabilities_free/create and can already remove the function pointers at the next major bump. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com> --- doc/APIchanges | 4 ++++ libavdevice/avdevice.c | 41 ++++++----------------------------------- libavdevice/avdevice.h | 5 +++++ libavdevice/version.h | 7 +++++-- libavformat/avformat.h | 4 ++++ 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index bbf56a5385..8eeb6ba70f 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2017-10-21 API changes, most recent first: +2021-01-24 - xxxxxxxxxx - lavd 58.12.100 - avdevice.h + Deprecated avdevice_capabilities_create() and + Add avdevice_capabilities_free(). They + 2021-01-11 - xxxxxxxxxx - lavc 58.116.100 - avcodec.h Add FF_PROFILE_VVC_MAIN_10 and FF_PROFILE_VVC_MAIN_10_444. diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index ec84d3b990..fbcf4a4ab2 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -27,6 +27,7 @@ #include "libavutil/ffversion.h" const char av_device_ffversion[] = "FFmpeg version " FFMPEG_VERSION; +#if FF_API_DEVICE_CAPABILITIES #define E AV_OPT_FLAG_ENCODING_PARAM #define D AV_OPT_FLAG_DECODING_PARAM #define A AV_OPT_FLAG_AUDIO_PARAM @@ -60,6 +61,7 @@ const AVOption av_device_capabilities[] = { #undef A #undef V #undef OFFSET +#endif unsigned avdevice_version(void) { @@ -94,49 +96,18 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToA return s->control_message_cb(s, type, data, data_size); } +#if FF_API_DEVICE_CAPABILITIES int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options) { - int ret; - av_assert0(s && caps); - av_assert0(s->iformat || s->oformat); - if ((s->oformat && !s->oformat->create_device_capabilities) || - (s->iformat && !s->iformat->create_device_capabilities)) - return AVERROR(ENOSYS); - *caps = av_mallocz(sizeof(**caps)); - if (!(*caps)) - return AVERROR(ENOMEM); - (*caps)->device_context = s; - if (((ret = av_opt_set_dict(s->priv_data, device_options)) < 0)) - goto fail; - if (s->iformat) { - if ((ret = s->iformat->create_device_capabilities(s, *caps)) < 0) - goto fail; - } else { - if ((ret = s->oformat->create_device_capabilities(s, *caps)) < 0) - goto fail; - } - av_opt_set_defaults(*caps); - return 0; - fail: - av_freep(caps); - return ret; + return AVERROR(ENOSYS); } void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s) { - if (!s || !caps || !(*caps)) - return; - av_assert0(s->iformat || s->oformat); - if (s->iformat) { - if (s->iformat->free_device_capabilities) - s->iformat->free_device_capabilities(s, *caps); - } else { - if (s->oformat->free_device_capabilities) - s->oformat->free_device_capabilities(s, *caps); - } - av_freep(caps); + return; } +#endif int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) { diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index ee9462480e..85a4dcc6df 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -321,6 +321,7 @@ int avdevice_dev_to_app_control_message(struct AVFormatContext *s, enum AVDevToAppMessageType type, void *data, size_t data_size); +#if FF_API_DEVICE_CAPABILITIES /** * Following API allows user to probe device capabilities (supported codecs, * pixel formats, sample formats, resolutions, channel counts, etc). @@ -416,6 +417,7 @@ typedef struct AVDeviceCapabilitiesQuery { /** * AVOption table used by devices to implement device capabilities API. Should not be used by a user. */ +attribute_deprecated extern const AVOption av_device_capabilities[]; /** @@ -435,6 +437,7 @@ extern const AVOption av_device_capabilities[]; * * @return >= 0 on success, negative otherwise. */ +attribute_deprecated int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s, AVDictionary **device_options); @@ -444,7 +447,9 @@ int avdevice_capabilities_create(AVDeviceCapabilitiesQuery **caps, AVFormatConte * @param caps Device capabilities data to be freed. * @param s Context of the device. */ +attribute_deprecated void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, AVFormatContext *s); +#endif /** * Structure describes basic parameters of the device. diff --git a/libavdevice/version.h b/libavdevice/version.h index 7022fdbf2a..f5aaa168af 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 58 -#define LIBAVDEVICE_VERSION_MINOR 11 -#define LIBAVDEVICE_VERSION_MICRO 103 +#define LIBAVDEVICE_VERSION_MINOR 12 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ @@ -46,5 +46,8 @@ * dropped at a future version bump. The defines themselves are not part of * the public API and may change, break or disappear at any time. */ +#ifndef FF_API_DEVICE_CAPABILITIES +#define FF_API_DEVICE_CAPABILITIES (LIBAVDEVICE_VERSION_MAJOR < 60) +#endif #endif /* AVDEVICE_VERSION_H */ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 523cf34d55..41482328f6 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -590,6 +590,7 @@ typedef struct AVOutputFormat { * @see avdevice_list_devices() for more details. */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); +#if LIBAVFORMAT_VERSION_MAJOR < 59 /** * Initialize device capabilities submodule. * @see avdevice_capabilities_create() for more details. @@ -600,6 +601,7 @@ typedef struct AVOutputFormat { * @see avdevice_capabilities_free() for more details. */ int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +#endif enum AVCodecID data_codec; /**< default data codec */ /** * Initialize format. May allocate data here, and set any AVFormatContext or @@ -769,6 +771,7 @@ typedef struct AVInputFormat { */ int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list); +#if LIBAVFORMAT_VERSION_MAJOR < 59 /** * Initialize device capabilities submodule. * @see avdevice_capabilities_create() for more details. @@ -780,6 +783,7 @@ typedef struct AVInputFormat { * @see avdevice_capabilities_free() for more details. */ int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps); +#endif } AVInputFormat; /** * @} -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".