This reverts commit 4f49ca7bbc75a9db4cdf93f27f95a668c751f160. This patch series 
will implement this capability for avdevice/dshow, enabling configuration 
discovery of DirectShow devices through the API, which is important for my use 
case. It enables making proper GUIs presenting users with options, instead of 
asking them to discover a dshow devices capabilities through the list_options 
option with an ffmpeg tool, and listing what they want to configure in text 
boxes.

Signed-off-by: Diederick Niehorster <dcni...@gmail.com>
---
 libavdevice/avdevice.c | 71 ++++++++++++++++++++++++++++++++++++++----
 libavdevice/avdevice.h |  5 ---
 libavformat/avformat.h | 21 +++++++++++++
 libavformat/version.h  |  2 +-
 4 files changed, 87 insertions(+), 12 deletions(-)

diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c
index e339cebf2d..695b9143af 100644
--- a/libavdevice/avdevice.c
+++ b/libavdevice/avdevice.c
@@ -27,11 +27,39 @@
 #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
+#define V AV_OPT_FLAG_VIDEO_PARAM
+#define OFFSET(x) offsetof(AVDeviceCapabilitiesQuery, x)
+
 const AVOption av_device_capabilities[] = {
+    { "codec", "codec", OFFSET(codec), AV_OPT_TYPE_INT,
+        {.i64 = AV_CODEC_ID_NONE}, AV_CODEC_ID_NONE, INT_MAX, E|D|A|V },
+    { "sample_format", "sample format", OFFSET(sample_format), 
AV_OPT_TYPE_SAMPLE_FMT,
+        {.i64 = AV_SAMPLE_FMT_NONE}, AV_SAMPLE_FMT_NONE, INT_MAX, E|D|A },
+    { "sample_rate", "sample rate", OFFSET(sample_rate), AV_OPT_TYPE_INT,
+        {.i64 = -1}, -1, INT_MAX, E|D|A },
+    { "channels", "channels", OFFSET(channels), AV_OPT_TYPE_INT,
+        {.i64 = -1}, -1, INT_MAX, E|D|A },
+    { "channel_layout", "channel layout", OFFSET(channel_layout), 
AV_OPT_TYPE_CHANNEL_LAYOUT,
+        {.i64 = -1}, -1, INT_MAX, E|D|A },
+    { "pixel_format", "pixel format", OFFSET(pixel_format), 
AV_OPT_TYPE_PIXEL_FMT,
+        {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, INT_MAX, E|D|V },
+    { "window_size", "window size", OFFSET(window_width), 
AV_OPT_TYPE_IMAGE_SIZE,
+        {.str = NULL}, -1, INT_MAX, E|D|V },
+    { "frame_size", "frame size", OFFSET(frame_width), AV_OPT_TYPE_IMAGE_SIZE,
+        {.str = NULL}, -1, INT_MAX, E|D|V },
+    { "fps", "fps", OFFSET(fps), AV_OPT_TYPE_RATIONAL,
+        {.dbl = -1}, -1, INT_MAX, E|D|V },
     { NULL }
 };
-#endif
+
+#undef E
+#undef D
+#undef A
+#undef V
+#undef OFFSET
 
 unsigned avdevice_version(void)
 {
@@ -68,18 +96,49 @@ 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)
 {
-    return AVERROR(ENOSYS);
+    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;
 }
 
 void avdevice_capabilities_free(AVDeviceCapabilitiesQuery **caps, 
AVFormatContext *s)
 {
-    return;
+    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);
 }
-#endif
 
 int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list)
 {
diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h
index 4fbdf6aabc..7c5e77df00 100644
--- a/libavdevice/avdevice.h
+++ b/libavdevice/avdevice.h
@@ -331,7 +331,6 @@ 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).
@@ -427,7 +426,6 @@ 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[];
 
 /**
@@ -447,7 +445,6 @@ 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);
 
@@ -457,9 +454,7 @@ 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/libavformat/avformat.h b/libavformat/avformat.h
index adbdd712a7..6fd09f52cb 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -578,6 +578,16 @@ typedef struct AVOutputFormat {
      * @see avdevice_list_devices() for more details.
      */
     int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList 
*device_list);
+    /**
+     * Initialize device capabilities submodule.
+     * @see avdevice_capabilities_create() for more details.
+     */
+    int (*create_device_capabilities)(struct AVFormatContext *s, struct 
AVDeviceCapabilitiesQuery *caps);
+    /**
+     * Free device capabilities submodule.
+     * @see avdevice_capabilities_free() for more details.
+     */
+    int (*free_device_capabilities)(struct AVFormatContext *s, struct 
AVDeviceCapabilitiesQuery *caps);
     enum AVCodecID data_codec; /**< default data codec */
     /**
      * Initialize format. May allocate data here, and set any AVFormatContext 
or
@@ -749,6 +759,17 @@ typedef struct AVInputFormat {
      */
     int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList 
*device_list);
 
+    /**
+     * Initialize device capabilities submodule.
+     * @see avdevice_capabilities_create() for more details.
+     */
+    int (*create_device_capabilities)(struct AVFormatContext *s, struct 
AVDeviceCapabilitiesQuery *caps);
+
+    /**
+     * Free device capabilities submodule.
+     * @see avdevice_capabilities_free() for more details.
+     */
+    int (*free_device_capabilities)(struct AVFormatContext *s, struct 
AVDeviceCapabilitiesQuery *caps);
 } AVInputFormat;
 /**
  * @}
diff --git a/libavformat/version.h b/libavformat/version.h
index 7f02e18f24..6519bba101 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
 // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
 // Also please add any ticket numbers that you believe might be affected here
 #define LIBAVFORMAT_VERSION_MAJOR  59
-#define LIBAVFORMAT_VERSION_MINOR   3
+#define LIBAVFORMAT_VERSION_MINOR   4
 #define LIBAVFORMAT_VERSION_MICRO 100
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
-- 
2.28.0.windows.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".

Reply via email to