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

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Tue Feb 9 10:04:23 EET 2021


Andreas Rheinhardt:
> 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;
>  /**
>   * @}
> 
Can I get an update on how to proceed with this patch?

- Andreas

PS: I could already remove all the av_device_capabilities options
(except the sentinel) at the next major bump, couldn't I?


More information about the ffmpeg-devel mailing list