[FFmpeg-devel] [PATCH] avdevice/avdevice: Deprecate AVDevice Capabilities API

dcnieho at gmail.com dcnieho at gmail.com
Wed Jun 2 13:21:22 EEST 2021


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



More information about the ffmpeg-devel mailing list