[FFmpeg-devel] avcodec: add metadata to identify wrappers and hardware decoders

Submitted by wm4 on Dec. 14, 2017, 3:02 p.m.

Details

Message ID 20171214150259.3897-1-nfxjfg@googlemail.com
State New
Headers show

Commit Message

wm4 Dec. 14, 2017, 3:02 p.m.
Explicitly identify decoder/encoder wrappers with a common name. This
saves API users from guessing by the name suffix. For example, they
don't have to guess that "h264_qsv" is the h264 QSV implementation, and
instead they can just check the AVCodec .codec and .wrapper_name fields.

Explicitly mark AVCodec entries that are hardware decoders or most
likely hardware decoders with new AV_CODEC_CAPs. The purpose is allowing
API users listing hardware decoders in a more generic way. The proposed
AVCodecHWConfig does not provide this information fully, because it's
concerned with decoder configuration, not information about the fact
whether the hardware is used or not.

AV_CODEC_CAP_HYBRID exists specifically for QSV, which can have software
implementations in case the hardware is not capable.

Based on a patch by Philip Langdale <philipl@overt.org>.
---
 doc/APIchanges                      |  4 ++++
 libavcodec/audiotoolboxdec.c        |  1 +
 libavcodec/audiotoolboxenc.c        |  1 +
 libavcodec/avcodec.h                | 26 ++++++++++++++++++++++++++
 libavcodec/cuviddec.c               |  3 ++-
 libavcodec/libcelt_dec.c            |  1 +
 libavcodec/libfdk-aacdec.c          |  1 +
 libavcodec/libfdk-aacenc.c          |  1 +
 libavcodec/libgsmdec.c              |  2 ++
 libavcodec/libgsmenc.c              |  2 ++
 libavcodec/libilbc.c                |  1 +
 libavcodec/libkvazaar.c             |  2 ++
 libavcodec/libmp3lame.c             |  1 +
 libavcodec/libopencore-amr.c        |  1 +
 libavcodec/libopenh264dec.c         |  1 +
 libavcodec/libopenh264enc.c         |  1 +
 libavcodec/libopenjpegdec.c         |  1 +
 libavcodec/libopenjpegenc.c         |  1 +
 libavcodec/libopusdec.c             |  1 +
 libavcodec/libopusenc.c             |  1 +
 libavcodec/librsvgdec.c             |  1 +
 libavcodec/libshine.c               |  1 +
 libavcodec/libspeexdec.c            |  1 +
 libavcodec/libspeexenc.c            |  1 +
 libavcodec/libtheoraenc.c           |  1 +
 libavcodec/libtwolame.c             |  1 +
 libavcodec/libvo-amrwbenc.c         |  1 +
 libavcodec/libvorbisenc.c           |  1 +
 libavcodec/libvpxdec.c              |  2 ++
 libavcodec/libvpxenc.c              |  2 ++
 libavcodec/libwavpackenc.c          |  1 +
 libavcodec/libwebpenc.c             |  1 +
 libavcodec/libwebpenc_animencoder.c |  1 +
 libavcodec/libx264.c                |  3 +++
 libavcodec/libx265.c                |  1 +
 libavcodec/libxavs.c                |  1 +
 libavcodec/libxvid.c                |  1 +
 libavcodec/libzvbi-teletextdec.c    |  1 +
 libavcodec/mediacodecdec.c          | 18 ++++++++++++------
 libavcodec/mmaldec.c                |  3 ++-
 libavcodec/nvenc_h264.c             |  9 ++++++---
 libavcodec/nvenc_hevc.c             |  6 ++++--
 libavcodec/qsvdec_h2645.c           |  6 ++++--
 libavcodec/qsvdec_other.c           |  9 ++++++---
 libavcodec/qsvenc_h264.c            |  3 ++-
 libavcodec/qsvenc_hevc.c            |  3 ++-
 libavcodec/qsvenc_jpeg.c            |  3 ++-
 libavcodec/qsvenc_mpeg2.c           |  3 ++-
 libavcodec/v4l2_m2m_dec.c           |  2 ++
 libavcodec/v4l2_m2m_enc.c           |  2 ++
 libavcodec/vaapi_encode_h264.c      |  3 ++-
 libavcodec/vaapi_encode_h265.c      |  3 ++-
 libavcodec/vaapi_encode_mjpeg.c     |  2 ++
 libavcodec/vaapi_encode_mpeg2.c     |  3 ++-
 libavcodec/vaapi_encode_vp8.c       |  3 ++-
 libavcodec/vaapi_encode_vp9.c       |  3 ++-
 libavcodec/version.h                |  4 ++--
 libavcodec/videotoolboxenc.c        |  3 ++-
 58 files changed, 136 insertions(+), 30 deletions(-)

Comments

Aman Gupta Dec. 14, 2017, 4:01 p.m.
On Thu, Dec 14, 2017 at 7:10 AM wm4 <nfxjfg@googlemail.com> wrote:

> Explicitly identify decoder/encoder wrappers with a common name. This
> saves API users from guessing by the name suffix. For example, they
> don't have to guess that "h264_qsv" is the h264 QSV implementation, and
> instead they can just check the AVCodec .codec and .wrapper_name fields.
>
> Explicitly mark AVCodec entries that are hardware decoders or most
> likely hardware decoders with new AV_CODEC_CAPs. The purpose is allowing
> API users listing hardware decoders in a more generic way. The proposed
> AVCodecHWConfig does not provide this information fully, because it's
> concerned with decoder configuration, not information about the fact
> whether the hardware is used or not.
>
> AV_CODEC_CAP_HYBRID exists specifically for QSV, which can have software
> implementations in case the hardware is not capable.
>
> Based on a patch by Philip Langdale <philipl@overt.org>.
> ---
>  doc/APIchanges                      |  4 ++++
>  libavcodec/audiotoolboxdec.c        |  1 +
>  libavcodec/audiotoolboxenc.c        |  1 +
>  libavcodec/avcodec.h                | 26 ++++++++++++++++++++++++++
>  libavcodec/cuviddec.c               |  3 ++-
>  libavcodec/libcelt_dec.c            |  1 +
>  libavcodec/libfdk-aacdec.c          |  1 +
>  libavcodec/libfdk-aacenc.c          |  1 +
>  libavcodec/libgsmdec.c              |  2 ++
>  libavcodec/libgsmenc.c              |  2 ++
>  libavcodec/libilbc.c                |  1 +
>  libavcodec/libkvazaar.c             |  2 ++
>  libavcodec/libmp3lame.c             |  1 +
>  libavcodec/libopencore-amr.c        |  1 +
>  libavcodec/libopenh264dec.c         |  1 +
>  libavcodec/libopenh264enc.c         |  1 +
>  libavcodec/libopenjpegdec.c         |  1 +
>  libavcodec/libopenjpegenc.c         |  1 +
>  libavcodec/libopusdec.c             |  1 +
>  libavcodec/libopusenc.c             |  1 +
>  libavcodec/librsvgdec.c             |  1 +
>  libavcodec/libshine.c               |  1 +
>  libavcodec/libspeexdec.c            |  1 +
>  libavcodec/libspeexenc.c            |  1 +
>  libavcodec/libtheoraenc.c           |  1 +
>  libavcodec/libtwolame.c             |  1 +
>  libavcodec/libvo-amrwbenc.c         |  1 +
>  libavcodec/libvorbisenc.c           |  1 +
>  libavcodec/libvpxdec.c              |  2 ++
>  libavcodec/libvpxenc.c              |  2 ++
>  libavcodec/libwavpackenc.c          |  1 +
>  libavcodec/libwebpenc.c             |  1 +
>  libavcodec/libwebpenc_animencoder.c |  1 +
>  libavcodec/libx264.c                |  3 +++
>  libavcodec/libx265.c                |  1 +
>  libavcodec/libxavs.c                |  1 +
>  libavcodec/libxvid.c                |  1 +
>  libavcodec/libzvbi-teletextdec.c    |  1 +
>  libavcodec/mediacodecdec.c          | 18 ++++++++++++------
>  libavcodec/mmaldec.c                |  3 ++-
>  libavcodec/nvenc_h264.c             |  9 ++++++---
>  libavcodec/nvenc_hevc.c             |  6 ++++--
>  libavcodec/qsvdec_h2645.c           |  6 ++++--
>  libavcodec/qsvdec_other.c           |  9 ++++++---
>  libavcodec/qsvenc_h264.c            |  3 ++-
>  libavcodec/qsvenc_hevc.c            |  3 ++-
>  libavcodec/qsvenc_jpeg.c            |  3 ++-
>  libavcodec/qsvenc_mpeg2.c           |  3 ++-
>  libavcodec/v4l2_m2m_dec.c           |  2 ++
>  libavcodec/v4l2_m2m_enc.c           |  2 ++
>  libavcodec/vaapi_encode_h264.c      |  3 ++-
>  libavcodec/vaapi_encode_h265.c      |  3 ++-
>  libavcodec/vaapi_encode_mjpeg.c     |  2 ++
>  libavcodec/vaapi_encode_mpeg2.c     |  3 ++-
>  libavcodec/vaapi_encode_vp8.c       |  3 ++-
>  libavcodec/vaapi_encode_vp9.c       |  3 ++-
>  libavcodec/version.h                |  4 ++--
>  libavcodec/videotoolboxenc.c        |  3 ++-
>  58 files changed, 136 insertions(+), 30 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 4af69c64bd..b4451ab193 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,10 @@ libavutil:     2017-10-21
>
>  API changes, most recent first:
>
> +2017-xx-xx - xxxxxxc - lavc 58.7.100 - avcodec.h
> +  Add AV_CODEC_CAP_HARDWARE, AV_CODEC_CAP_HYBRID, and
> AVCodec.wrapper_name,
> +  and mark all AVCodecs accordingly.
> +
>  2017-xx-xx - xxxxxxx - lavu 56.4.100 / 56.7.0 - stereo3d.h
>    Add view field to AVStereo3D structure and AVStereo3DView enum.
>
> diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
> index 3711665bbd..5c0a9de8f6 100644
> --- a/libavcodec/audiotoolboxdec.c
> +++ b/libavcodec/audiotoolboxdec.c
> @@ -597,6 +597,7 @@ static av_cold int ffat_close_decoder(AVCodecContext
> *avctx)
>          .bsfs           = bsf_name, \
>          .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, \
>          .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
> FF_CODEC_CAP_INIT_CLEANUP, \
> +        .wrapper_name   = "at", \
>      };
>
>  FFAT_DEC(aac,          AV_CODEC_ID_AAC, "aac_adtstoasc")
> diff --git a/libavcodec/audiotoolboxenc.c b/libavcodec/audiotoolboxenc.c
> index c47fbd1b2d..71885d1530 100644
> --- a/libavcodec/audiotoolboxenc.c
> +++ b/libavcodec/audiotoolboxenc.c
> @@ -619,6 +619,7 @@ static const AVOption options[] = {
>          }, \
>          .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, \
>          .profiles       = PROFILES, \
> +        .wrapper_name   = "at", \
>      };
>
>  static const uint64_t aac_at_channel_layouts[] = {
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 5db6a81320..7ea53b82f6 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -1045,6 +1045,20 @@ typedef struct RcOverride{
>   */
>  #define AV_CODEC_CAP_LOSSLESS         0x80000000
>
> +/**
> + * Codec is backed by a hardware implementation. Typically used to
> + * identify a non-hwaccel hardware decoder. For information about
> hwaccels, use
> + * avcodec_get_hw_config() instead.
> + */
> +#define AV_CODEC_CAP_HARDWARE            (1 << 17)
> +
> +/**
> + * Codec is potentially backed by a hardware implementation, but not
> + * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the
> + * implementation provides some sort of internal fallback.
> + */
> +#define AV_CODEC_CAP_HYBRID              (1 << 18)
> +
>  /**
>   * Pan Scan area.
>   * This specifies the area which should be displayed.
> @@ -3377,6 +3391,18 @@ typedef struct AVCodec {
>      const AVClass *priv_class;              ///< AVClass for the private
> context
>      const AVProfile *profiles;              ///< array of recognized
> profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
>
> +    /**
> +     * Group name of the codec implementation.
> +     * This is a short symbolic name of the wrapper backing this codec. A
> +     * wrapper uses some kind of external implementation for the codec,
> such
> +     * as an external library, or a codec implementation provided by the
> OS or
> +     * the hardware.
> +     * If this field is NULL, this is a builtin, libavcodec native
> decoder.
> +     * If non-NULL, this will be the suffix in AVCodec.name in most cases
> +     * (usually AVCodec.name will be of the form
> "<codec_name>_<wrapper_name>").
> +     */
> +    const char *wrapper_name;
> +
>      /*****************************************************************
>       * No fields below this line are part of the public API. They
>       * may not be used outside of libavcodec and can be changed and
> diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
> index 96d56f406a..c23033c7e3 100644
> --- a/libavcodec/cuviddec.c
> +++ b/libavcodec/cuviddec.c
> @@ -1127,13 +1127,14 @@ static const AVCodecHWConfigInternal
> *cuvid_hw_configs[] = {
>          .decode         = cuvid_decode_frame, \
>          .receive_frame  = cuvid_output_frame, \
>          .flush          = cuvid_flush, \
> -        .capabilities   = AV_CODEC_CAP_DELAY |
> AV_CODEC_CAP_AVOID_PROBING, \
> +        .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING
> | AV_CODEC_CAP_HARDWARE, \
>          .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
>                                                          AV_PIX_FMT_NV12, \
>                                                          AV_PIX_FMT_P010, \
>                                                          AV_PIX_FMT_P016, \
>                                                          AV_PIX_FMT_NONE
> }, \
>          .hw_configs     = cuvid_hw_configs, \
> +        .wrapper_name   = "cuvid", \
>      };
>
>  #if CONFIG_HEVC_CUVID_DECODER
> diff --git a/libavcodec/libcelt_dec.c b/libavcodec/libcelt_dec.c
> index 878e4cc673..75b438b285 100644
> --- a/libavcodec/libcelt_dec.c
> +++ b/libavcodec/libcelt_dec.c
> @@ -137,4 +137,5 @@ AVCodec ff_libcelt_decoder = {
>      .close          = libcelt_dec_close,
>      .decode         = libcelt_dec_decode,
>      .capabilities   = AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libcelt",
>  };
> diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
> index a0110da62b..677b11088b 100644
> --- a/libavcodec/libfdk-aacdec.c
> +++ b/libavcodec/libfdk-aacdec.c
> @@ -385,4 +385,5 @@ AVCodec ff_libfdk_aac_decoder = {
>      .priv_class     = &fdk_aac_dec_class,
>      .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
>                        FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "libfdk",
>  };
> diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c
> index ca0f4bf722..d47137b227 100644
> --- a/libavcodec/libfdk-aacenc.c
> +++ b/libavcodec/libfdk-aacenc.c
> @@ -428,4 +428,5 @@ AVCodec ff_libfdk_aac_encoder = {
>      .profiles              = profiles,
>      .supported_samplerates = aac_sample_rates,
>      .channel_layouts       = aac_channel_layout,
> +    .wrapper_name          = "libfdk",
>  };
> diff --git a/libavcodec/libgsmdec.c b/libavcodec/libgsmdec.c
> index a503215f67..89e1de0fed 100644
> --- a/libavcodec/libgsmdec.c
> +++ b/libavcodec/libgsmdec.c
> @@ -135,6 +135,7 @@ AVCodec ff_libgsm_decoder = {
>      .decode         = libgsm_decode_frame,
>      .flush          = libgsm_flush,
>      .capabilities   = AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libgsm",
>  };
>  #endif
>  #if CONFIG_LIBGSM_MS_DECODER
> @@ -149,5 +150,6 @@ AVCodec ff_libgsm_ms_decoder = {
>      .decode         = libgsm_decode_frame,
>      .flush          = libgsm_flush,
>      .capabilities   = AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libgsm",
>  };
>  #endif
> diff --git a/libavcodec/libgsmenc.c b/libavcodec/libgsmenc.c
> index e25db95181..c9e7ba056e 100644
> --- a/libavcodec/libgsmenc.c
> +++ b/libavcodec/libgsmenc.c
> @@ -126,6 +126,7 @@ AVCodec ff_libgsm_encoder = {
>      .close          = libgsm_encode_close,
>      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
>                                                       AV_SAMPLE_FMT_NONE },
> +    .wrapper_name   = "libgsm",
>  };
>  #endif
>  #if CONFIG_LIBGSM_MS_ENCODER
> @@ -139,5 +140,6 @@ AVCodec ff_libgsm_ms_encoder = {
>      .close          = libgsm_encode_close,
>      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
>                                                       AV_SAMPLE_FMT_NONE },
> +    .wrapper_name   = "libgsm",
>  };
>  #endif
> diff --git a/libavcodec/libilbc.c b/libavcodec/libilbc.c
> index c4c054fa5d..9a56cc8785 100644
> --- a/libavcodec/libilbc.c
> +++ b/libavcodec/libilbc.c
> @@ -193,4 +193,5 @@ AVCodec ff_libilbc_encoder = {
>                                                       AV_SAMPLE_FMT_NONE },
>      .defaults       = ilbc_encode_defaults,
>      .priv_class     = &ilbc_enc_class,
> +    .wrapper_name   = "libbilbc",
>  };
> diff --git a/libavcodec/libkvazaar.c b/libavcodec/libkvazaar.c
> index 25e7b32f5f..41a1bbb45e 100644
> --- a/libavcodec/libkvazaar.c
> +++ b/libavcodec/libkvazaar.c
> @@ -305,4 +305,6 @@ AVCodec ff_libkvazaar_encoder = {
>      .close            = libkvazaar_close,
>
>      .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
> FF_CODEC_CAP_INIT_CLEANUP,
> +
> +    .wrapper_name     = "libkvazaar",
>  };
> diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
> index 5e26743f29..ecdd2e334c 100644
> --- a/libavcodec/libmp3lame.c
> +++ b/libavcodec/libmp3lame.c
> @@ -349,4 +349,5 @@ AVCodec ff_libmp3lame_encoder = {
>                                                    0 },
>      .priv_class            = &libmp3lame_class,
>      .defaults              = libmp3lame_defaults,
> +    .wrapper_name          = "libmp3lame",
>  };
> diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c
> index d509804315..516f625720 100644
> --- a/libavcodec/libopencore-amr.c
> +++ b/libavcodec/libopencore-amr.c
> @@ -378,6 +378,7 @@ AVCodec ff_libopencore_amrwb_decoder = {
>      .close          = amr_wb_decode_close,
>      .decode         = amr_wb_decode_frame,
>      .capabilities   = AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libopencore_amrwb",
>  };
>
>  #endif /* CONFIG_LIBOPENCORE_AMRWB_DECODER */
> diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c
> index d12e715117..b7ed85d175 100644
> --- a/libavcodec/libopenh264dec.c
> +++ b/libavcodec/libopenh264dec.c
> @@ -147,4 +147,5 @@ AVCodec ff_libopenh264_decoder = {
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS |
> FF_CODEC_CAP_INIT_THREADSAFE |
>                        FF_CODEC_CAP_INIT_CLEANUP,
>      .bsfs           = "h264_mp4toannexb",
> +    .wrapper_name   = "libopenh264",
>  };
> diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
> index 1152d0036f..fdadb101f5 100644
> --- a/libavcodec/libopenh264enc.c
> +++ b/libavcodec/libopenh264enc.c
> @@ -301,4 +301,5 @@ AVCodec ff_libopenh264_encoder = {
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P,
>                                                      AV_PIX_FMT_NONE },
>      .priv_class     = &class,
> +    .wrapper_name   = "libopenh264",
>  };
> diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c
> index daf0a1c565..5e66cd99cc 100644
> --- a/libavcodec/libopenjpegdec.c
> +++ b/libavcodec/libopenjpegdec.c
> @@ -512,4 +512,5 @@ AVCodec ff_libopenjpeg_decoder = {
>      .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
>      .max_lowres     = 31,
>      .priv_class     = &openjpeg_class,
> +    .wrapper_name   = "libopenjpeg",
>  };
> diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
> index 59fe52d64a..7c7d0aa6b2 100644
> --- a/libavcodec/libopenjpegenc.c
> +++ b/libavcodec/libopenjpegenc.c
> @@ -778,4 +778,5 @@ AVCodec ff_libopenjpeg_encoder = {
>          AV_PIX_FMT_NONE
>      },
>      .priv_class     = &openjpeg_class,
> +    .wrapper_name   = "libopenjpeg",
>  };
> diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
> index 9b1e002ceb..4f7f4755c2 100644
> --- a/libavcodec/libopusdec.c
> +++ b/libavcodec/libopusdec.c
> @@ -223,4 +223,5 @@ AVCodec ff_libopus_decoder = {
>      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT,
>                                                       AV_SAMPLE_FMT_S16,
>                                                       AV_SAMPLE_FMT_NONE },
> +    .wrapper_name   = "libopus",
>  };
> diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
> index 3d88c296d3..b449497d15 100644
> --- a/libavcodec/libopusenc.c
> +++ b/libavcodec/libopusenc.c
> @@ -566,4 +566,5 @@ AVCodec ff_libopus_encoder = {
>      .supported_samplerates = libopus_sample_rates,
>      .priv_class      = &libopus_class,
>      .defaults        = libopus_defaults,
> +    .wrapper_name    = "libopus",
>  };
> diff --git a/libavcodec/librsvgdec.c b/libavcodec/librsvgdec.c
> index 77c771003c..e57070f8e4 100644
> --- a/libavcodec/librsvgdec.c
> +++ b/libavcodec/librsvgdec.c
> @@ -124,4 +124,5 @@ AVCodec ff_librsvg_decoder = {
>      .decode         = librsvg_decode_frame,
>      .priv_data_size = sizeof(LibRSVGContext),
>      .capabilities   = AV_CODEC_CAP_LOSSLESS | AV_CODEC_CAP_DR1,
> +    .wrapper_name    = "librsvg",
>  };
> diff --git a/libavcodec/libshine.c b/libavcodec/libshine.c
> index f4cf5981bc..7056fcd2e3 100644
> --- a/libavcodec/libshine.c
> +++ b/libavcodec/libshine.c
> @@ -146,4 +146,5 @@ AVCodec ff_libshine_encoder = {
>      .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
>                                                    AV_CH_LAYOUT_STEREO,
>                                                    0 },
> +    .wrapper_name          = "libshine",
>  };
> diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c
> index 044883af73..d67c68c7f9 100644
> --- a/libavcodec/libspeexdec.c
> +++ b/libavcodec/libspeexdec.c
> @@ -200,4 +200,5 @@ AVCodec ff_libspeex_decoder = {
>      .decode         = libspeex_decode_frame,
>      .flush          = libspeex_decode_flush,
>      .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DELAY |
> AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libspeex",
>  };
> diff --git a/libavcodec/libspeexenc.c b/libavcodec/libspeexenc.c
> index 5264899fd7..6a37dbc76c 100644
> --- a/libavcodec/libspeexenc.c
> +++ b/libavcodec/libspeexenc.c
> @@ -365,4 +365,5 @@ AVCodec ff_libspeex_encoder = {
>      .supported_samplerates = (const int[]){ 8000, 16000, 32000, 0 },
>      .priv_class     = &speex_class,
>      .defaults       = defaults,
> +    .wrapper_name   = "libspeex",
>  };
> diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c
> index d4c39283a6..16966ed433 100644
> --- a/libavcodec/libtheoraenc.c
> +++ b/libavcodec/libtheoraenc.c
> @@ -385,4 +385,5 @@ AVCodec ff_libtheora_encoder = {
>      .pix_fmts       = (const enum AVPixelFormat[]){
>          AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
> AV_PIX_FMT_NONE
>      },
> +    .wrapper_name   = "libtheora",
>  };
> diff --git a/libavcodec/libtwolame.c b/libavcodec/libtwolame.c
> index 12d71e7acb..030f88868f 100644
> --- a/libavcodec/libtwolame.c
> +++ b/libavcodec/libtwolame.c
> @@ -226,4 +226,5 @@ AVCodec ff_libtwolame_encoder = {
>          AV_CH_LAYOUT_STEREO,
>          0 },
>      .supported_samplerates = twolame_samplerates,
> +    .wrapper_name   = "libtwolame",
>  };
> diff --git a/libavcodec/libvo-amrwbenc.c b/libavcodec/libvo-amrwbenc.c
> index f756940879..77d0ccef15 100644
> --- a/libavcodec/libvo-amrwbenc.c
> +++ b/libavcodec/libvo-amrwbenc.c
> @@ -152,4 +152,5 @@ AVCodec ff_libvo_amrwbenc_encoder = {
>      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
>                                                       AV_SAMPLE_FMT_NONE },
>      .priv_class     = &amrwb_class,
> +    .wrapper_name   = "libvo_amrwbenc",
>  };
> diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c
> index 3ca5b55e8e..f78f872fe2 100644
> --- a/libavcodec/libvorbisenc.c
> +++ b/libavcodec/libvorbisenc.c
> @@ -377,4 +377,5 @@ AVCodec ff_libvorbis_encoder = {
>                                                        AV_SAMPLE_FMT_NONE
> },
>      .priv_class     = &vorbis_class,
>      .defaults       = defaults,
> +    .wrapper_name   = "libvorbis",
>  };
> diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
> index 2ae29d202a..04f27d3396 100644
> --- a/libavcodec/libvpxdec.c
> +++ b/libavcodec/libvpxdec.c
> @@ -289,6 +289,7 @@ AVCodec ff_libvpx_vp8_decoder = {
>      .close          = vpx_free,
>      .decode         = vpx_decode,
>      .capabilities   = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
> +    .wrapper_name   = "libvpx",
>  };
>  #endif /* CONFIG_LIBVPX_VP8_DECODER */
>
> @@ -310,5 +311,6 @@ AVCodec ff_libvpx_vp9_decoder = {
>      .capabilities   = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
>      .init_static_data = ff_vp9_init_static,
>      .profiles       = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
> +    .wrapper_name   = "libvpx",
>  };
>  #endif /* CONFIG_LIBVPX_VP9_DECODER */
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index 9861e9d5ae..d0bd1e997a 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -1199,6 +1199,7 @@ AVCodec ff_libvpx_vp8_encoder = {
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P,
> AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE },
>      .priv_class     = &class_vp8,
>      .defaults       = defaults,
> +    .wrapper_name   = "libvpx",
>  };
>  #endif /* CONFIG_LIBVPX_VP8_ENCODER */
>
> @@ -1229,5 +1230,6 @@ AVCodec ff_libvpx_vp9_encoder = {
>      .priv_class     = &class_vp9,
>      .defaults       = defaults,
>      .init_static_data = ff_vp9_init_static,
> +    .wrapper_name   = "libvpx",
>  };
>  #endif /* CONFIG_LIBVPX_VP9_ENCODER */
> diff --git a/libavcodec/libwavpackenc.c b/libavcodec/libwavpackenc.c
> index 6d5708985a..e84b074893 100644
> --- a/libavcodec/libwavpackenc.c
> +++ b/libavcodec/libwavpackenc.c
> @@ -191,4 +191,5 @@ AVCodec ff_libwavpack_encoder = {
>      .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME,
>      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32,
>                                                       AV_SAMPLE_FMT_NONE },
> +    .wrapper_name   = "libwavpack",
>  };
> diff --git a/libavcodec/libwebpenc.c b/libavcodec/libwebpenc.c
> index 0bcf628e58..48f45b6320 100644
> --- a/libavcodec/libwebpenc.c
> +++ b/libavcodec/libwebpenc.c
> @@ -109,4 +109,5 @@ AVCodec ff_libwebp_encoder = {
>      },
>      .priv_class     = &class,
>      .defaults       = libwebp_defaults,
> +    .wrapper_name   = "libwebp",
>  };
> diff --git a/libavcodec/libwebpenc_animencoder.c
> b/libavcodec/libwebpenc_animencoder.c
> index 91bf64ca8b..7f35a0b939 100644
> --- a/libavcodec/libwebpenc_animencoder.c
> +++ b/libavcodec/libwebpenc_animencoder.c
> @@ -148,4 +148,5 @@ AVCodec ff_libwebp_anim_encoder = {
>      },
>      .priv_class     = &class,
>      .defaults       = libwebp_defaults,
> +    .wrapper_name   = "libwebp",
>  };
> diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
> index 9c67c91f33..e2455e18de 100644
> --- a/libavcodec/libx264.c
> +++ b/libavcodec/libx264.c
> @@ -1026,6 +1026,7 @@ AVCodec ff_libx264_encoder = {
>      .init_static_data = X264_init_static,
>      .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
>                          FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name     = "libx264",
>  };
>  #endif
>
> @@ -1050,6 +1051,7 @@ AVCodec ff_libx264rgb_encoder = {
>      .priv_class     = &rgbclass,
>      .defaults       = x264_defaults,
>      .pix_fmts       = pix_fmts_8bit_rgb,
> +    .wrapper_name   = "libx264",
>  };
>  #endif
>
> @@ -1076,5 +1078,6 @@ AVCodec ff_libx262_encoder = {
>      .pix_fmts         = pix_fmts_8bit,
>      .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
>                          FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name     = "libx264",
>  };
>  #endif
> diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
> index 25ccb02fcb..52ad2312a3 100644
> --- a/libavcodec/libx265.c
> +++ b/libavcodec/libx265.c
> @@ -442,4 +442,5 @@ AVCodec ff_libx265_encoder = {
>      .priv_class       = &class,
>      .defaults         = x265_defaults,
>      .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
> +    .wrapper_name     = "libx265",
>  };
> diff --git a/libavcodec/libxavs.c b/libavcodec/libxavs.c
> index 865b5f62ef..801a05dbb5 100644
> --- a/libavcodec/libxavs.c
> +++ b/libavcodec/libxavs.c
> @@ -478,4 +478,5 @@ AVCodec ff_libxavs_encoder = {
>      .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
> AV_PIX_FMT_NONE },
>      .priv_class     = &xavs_class,
>      .defaults       = xavs_defaults,
> +    .wrapper_name   = "libxavs",
>  };
> diff --git a/libavcodec/libxvid.c b/libavcodec/libxvid.c
> index 5c05fa6d87..cdaae2094e 100644
> --- a/libavcodec/libxvid.c
> +++ b/libavcodec/libxvid.c
> @@ -934,4 +934,5 @@ AVCodec ff_libxvid_encoder = {
>      .priv_class     = &xvid_class,
>      .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
>                        FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "libxvid",
>  };
> diff --git a/libavcodec/libzvbi-teletextdec.c
> b/libavcodec/libzvbi-teletextdec.c
> index 687b6af129..30d0593430 100644
> --- a/libavcodec/libzvbi-teletextdec.c
> +++ b/libavcodec/libzvbi-teletextdec.c
> @@ -573,4 +573,5 @@ AVCodec ff_libzvbi_teletext_decoder = {
>      .capabilities = AV_CODEC_CAP_DELAY,
>      .flush     = teletext_flush,
>      .priv_class= &teletext_class,
> +    .wrapper_name = "libzvbi",
>  };
> diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
> index 39f5cbc045..1b5ae4ad59 100644
> --- a/libavcodec/mediacodecdec.c
> +++ b/libavcodec/mediacodecdec.c
> @@ -539,10 +539,11 @@ AVCodec ff_h264_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .bsfs           = "h264_mp4toannexb",
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
>
> @@ -557,10 +558,11 @@ AVCodec ff_hevc_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .bsfs           = "hevc_mp4toannexb",
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
>
> @@ -575,9 +577,10 @@ AVCodec ff_mpeg2_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
>
> @@ -592,9 +595,10 @@ AVCodec ff_mpeg4_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
>
> @@ -609,9 +613,10 @@ AVCodec ff_vp8_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
>
> @@ -626,8 +631,9 @@ AVCodec ff_vp9_mediacodec_decoder = {
>      .decode         = mediacodec_decode_frame,
>      .flush          = mediacodec_decode_flush,
>      .close          = mediacodec_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING |
> AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
>      .hw_configs     = mediacodec_hw_configs,
> +    .wrapper_name   = "mediacodec",
>  };
>  #endif
> diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
> index b3f0cca4b5..647a22ef7c 100644
> --- a/libavcodec/mmaldec.c
> +++ b/libavcodec/mmaldec.c
> @@ -840,12 +840,13 @@ static const AVOption options[]={
>          .decode         = ffmmal_decode, \
>          .flush          = ffmmal_flush, \
>          .priv_class     = &ffmmal_##NAME##_dec_class, \
> -        .capabilities   = AV_CODEC_CAP_DELAY, \
> +        .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \
>          .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS, \
>          .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL,
> \
>
> AV_PIX_FMT_YUV420P, \
>
> AV_PIX_FMT_NONE}, \
>          .hw_configs     = mmal_hw_configs, \
> +        .wrapper_name   = "mmal", \
>      };
>
>  FFMMAL_DEC(h264, AV_CODEC_ID_H264)
> diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
> index c3b4bac749..bc7bbcddeb 100644
> --- a/libavcodec/nvenc_h264.c
> +++ b/libavcodec/nvenc_h264.c
> @@ -171,9 +171,10 @@ AVCodec ff_nvenc_encoder = {
>      .priv_data_size = sizeof(NvencContext),
>      .priv_class     = &nvenc_class,
>      .defaults       = defaults,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
>      .pix_fmts       = ff_nvenc_pix_fmts,
> +    .wrapper_name   = "nvenc",
>  };
>  #endif
>
> @@ -199,9 +200,10 @@ AVCodec ff_nvenc_h264_encoder = {
>      .priv_data_size = sizeof(NvencContext),
>      .priv_class     = &nvenc_h264_class,
>      .defaults       = defaults,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
>      .pix_fmts       = ff_nvenc_pix_fmts,
> +    .wrapper_name   = "nvenc",
>  };
>  #endif
>
> @@ -227,7 +229,8 @@ AVCodec ff_h264_nvenc_encoder = {
>      .priv_data_size = sizeof(NvencContext),
>      .priv_class     = &h264_nvenc_class,
>      .defaults       = defaults,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
>      .pix_fmts       = ff_nvenc_pix_fmts,
> +    .wrapper_name   = "nvenc",
>  };
> diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
> index 89e8c3e53a..0df7eab8cd 100644
> --- a/libavcodec/nvenc_hevc.c
> +++ b/libavcodec/nvenc_hevc.c
> @@ -161,8 +161,9 @@ AVCodec ff_nvenc_hevc_encoder = {
>      .priv_class     = &nvenc_hevc_class,
>      .defaults       = defaults,
>      .pix_fmts       = ff_nvenc_pix_fmts,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "nvenc",
>  };
>
>  #endif
> @@ -188,6 +189,7 @@ AVCodec ff_hevc_nvenc_encoder = {
>      .priv_class     = &hevc_nvenc_class,
>      .defaults       = defaults,
>      .pix_fmts       = ff_nvenc_pix_fmts,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "nvenc",
>  };
> diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c
> index 6b4fc5e36e..5e0067335e 100644
> --- a/libavcodec/qsvdec_h2645.c
> +++ b/libavcodec/qsvdec_h2645.c
> @@ -211,7 +211,7 @@ AVCodec ff_hevc_qsv_decoder = {
>      .decode         = qsv_decode_frame,
>      .flush          = qsv_decode_flush,
>      .close          = qsv_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
>      .priv_class     = &hevc_class,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_P010,
> @@ -219,6 +219,7 @@ AVCodec ff_hevc_qsv_decoder = {
>                                                      AV_PIX_FMT_NONE },
>      .hw_configs     = ff_qsv_hw_configs,
>      .bsfs           = "hevc_mp4toannexb",
> +    .wrapper_name   = "qsv",
>  };
>  #endif
>
> @@ -245,7 +246,7 @@ AVCodec ff_h264_qsv_decoder = {
>      .decode         = qsv_decode_frame,
>      .flush          = qsv_decode_flush,
>      .close          = qsv_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
>      .priv_class     = &class,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_P010,
> @@ -253,5 +254,6 @@ AVCodec ff_h264_qsv_decoder = {
>                                                      AV_PIX_FMT_NONE },
>      .hw_configs     = ff_qsv_hw_configs,
>      .bsfs           = "h264_mp4toannexb",
> +    .wrapper_name   = "qsv",
>  };
>  #endif
> diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c
> index f7691f95bf..416e4c8164 100644
> --- a/libavcodec/qsvdec_other.c
> +++ b/libavcodec/qsvdec_other.c
> @@ -176,12 +176,13 @@ AVCodec ff_mpeg2_qsv_decoder = {
>      .decode         = qsv_decode_frame,
>      .flush          = qsv_decode_flush,
>      .close          = qsv_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
>      .priv_class     = &mpeg2_qsv_class,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_QSV,
>                                                      AV_PIX_FMT_NONE },
>      .hw_configs     = ff_qsv_hw_configs,
> +    .wrapper_name   = "qsv",
>  };
>  #endif
>
> @@ -203,12 +204,13 @@ AVCodec ff_vc1_qsv_decoder = {
>      .decode         = qsv_decode_frame,
>      .flush          = qsv_decode_flush,
>      .close          = qsv_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
>      .priv_class     = &vc1_qsv_class,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_QSV,
>                                                      AV_PIX_FMT_NONE },
>      .hw_configs     = ff_qsv_hw_configs,
> +    .wrapper_name   = "qsv",
>  };
>  #endif
>
> @@ -230,11 +232,12 @@ AVCodec ff_vp8_qsv_decoder = {
>      .decode         = qsv_decode_frame,
>      .flush          = qsv_decode_flush,
>      .close          = qsv_decode_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 |
> AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
>      .priv_class     = &vp8_qsv_class,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_QSV,
>                                                      AV_PIX_FMT_NONE },
>      .hw_configs     = ff_qsv_hw_configs,
> +    .wrapper_name   = "qsv",
>  };
>  #endif
> diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c
> index 3242062b40..77fb2823d4 100644
> --- a/libavcodec/qsvenc_h264.c
> +++ b/libavcodec/qsvenc_h264.c
> @@ -175,7 +175,7 @@ AVCodec ff_h264_qsv_encoder = {
>      .init           = qsv_enc_init,
>      .encode2        = qsv_enc_frame,
>      .close          = qsv_enc_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_P010,
>                                                      AV_PIX_FMT_QSV,
> @@ -183,4 +183,5 @@ AVCodec ff_h264_qsv_encoder = {
>      .priv_class     = &class,
>      .defaults       = qsv_enc_defaults,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "qsv",
>  };
> diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
> index f132a26c1a..4339b316a3 100644
> --- a/libavcodec/qsvenc_hevc.c
> +++ b/libavcodec/qsvenc_hevc.c
> @@ -277,7 +277,7 @@ AVCodec ff_hevc_qsv_encoder = {
>      .init           = qsv_enc_init,
>      .encode2        = qsv_enc_frame,
>      .close          = qsv_enc_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_P010,
>                                                      AV_PIX_FMT_QSV,
> @@ -285,4 +285,5 @@ AVCodec ff_hevc_qsv_encoder = {
>      .priv_class     = &class,
>      .defaults       = qsv_enc_defaults,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "qsv",
>  };
> diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c
> index 731ec9a014..c18fe91940 100644
> --- a/libavcodec/qsvenc_jpeg.c
> +++ b/libavcodec/qsvenc_jpeg.c
> @@ -83,9 +83,10 @@ AVCodec ff_mjpeg_qsv_encoder = {
>      .init           = qsv_enc_init,
>      .encode2        = qsv_enc_frame,
>      .close          = qsv_enc_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_QSV,
>                                                      AV_PIX_FMT_NONE },
>      .priv_class     = &class,
> +    .wrapper_name   = "qsv",
>  };
> diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c
> index 5b583fb491..a7427d8109 100644
> --- a/libavcodec/qsvenc_mpeg2.c
> +++ b/libavcodec/qsvenc_mpeg2.c
> @@ -104,11 +104,12 @@ AVCodec ff_mpeg2_qsv_encoder = {
>      .init           = qsv_enc_init,
>      .encode2        = qsv_enc_frame,
>      .close          = qsv_enc_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
>      .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
>                                                      AV_PIX_FMT_QSV,
>                                                      AV_PIX_FMT_NONE },
>      .priv_class     = &class,
>      .defaults       = qsv_enc_defaults,
>      .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name   = "qsv",
>  };
> diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
> index 958cdc522b..c4ea20ea83 100644
> --- a/libavcodec/v4l2_m2m_dec.c
> +++ b/libavcodec/v4l2_m2m_dec.c
> @@ -215,6 +215,8 @@ AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
>      .receive_frame  = v4l2_receive_frame,\
>      .close          = ff_v4l2_m2m_codec_end,\
>      .bsfs           = bsf_name, \
> +    .capabilities   = AV_CODEC_CAP_HARDWARE, \
> +    .wrapper_name   = "v4l2m2m", \
>  };
>
>  M2MDEC(h264,  "H.264", AV_CODEC_ID_H264,       "h264_mp4toannexb");
> diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c
> index 76ce85fdaa..f62ce7cdb5 100644
> --- a/libavcodec/v4l2_m2m_enc.c
> +++ b/libavcodec/v4l2_m2m_enc.c
> @@ -335,6 +335,8 @@ AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
>      .send_frame     = v4l2_send_frame,\
>      .receive_packet = v4l2_receive_packet,\
>      .close          = ff_v4l2_m2m_codec_end,\
> +    .capabilities   = AV_CODEC_CAP_HARDWARE, \
> +    .wrapper_name   = "v4l2m2m", \
>  };
>
>  M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4);
> diff --git a/libavcodec/vaapi_encode_h264.c
> b/libavcodec/vaapi_encode_h264.c
> index 6940823b8e..a7f9a60253 100644
> --- a/libavcodec/vaapi_encode_h264.c
> +++ b/libavcodec/vaapi_encode_h264.c
> @@ -1089,10 +1089,11 @@ AVCodec ff_h264_vaapi_encoder = {
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &vaapi_encode_h264_close,
>      .priv_class     = &vaapi_encode_h264_class,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_h264_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/vaapi_encode_h265.c
> b/libavcodec/vaapi_encode_h265.c
> index 8e98b0230d..f3b4f6c7e2 100644
> --- a/libavcodec/vaapi_encode_h265.c
> +++ b/libavcodec/vaapi_encode_h265.c
> @@ -1018,10 +1018,11 @@ AVCodec ff_hevc_vaapi_encoder = {
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &vaapi_encode_h265_close,
>      .priv_class     = &vaapi_encode_h265_class,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_h265_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/vaapi_encode_mjpeg.c
> b/libavcodec/vaapi_encode_mjpeg.c
> index 2cbf7925f2..c949e89646 100644
> --- a/libavcodec/vaapi_encode_mjpeg.c
> +++ b/libavcodec/vaapi_encode_mjpeg.c
> @@ -422,9 +422,11 @@ AVCodec ff_mjpeg_vaapi_encoder = {
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &ff_vaapi_encode_close,
>      .priv_class     = &vaapi_encode_mjpeg_class,
> +    .capabilities   = AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_mjpeg_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/vaapi_encode_mpeg2.c
> b/libavcodec/vaapi_encode_mpeg2.c
> index 02eca30dc5..4537955c40 100644
> --- a/libavcodec/vaapi_encode_mpeg2.c
> +++ b/libavcodec/vaapi_encode_mpeg2.c
> @@ -669,10 +669,11 @@ AVCodec ff_mpeg2_vaapi_encoder = {
>      .init           = &vaapi_encode_mpeg2_init,
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &vaapi_encode_mpeg2_close,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_mpeg2_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c
> index 423f7483e8..b4c5521d1f 100644
> --- a/libavcodec/vaapi_encode_vp8.c
> +++ b/libavcodec/vaapi_encode_vp8.c
> @@ -260,10 +260,11 @@ AVCodec ff_vp8_vaapi_encoder = {
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &ff_vaapi_encode_close,
>      .priv_class     = &vaapi_encode_vp8_class,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_vp8_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c
> index a987d1cd71..9108699ac3 100644
> --- a/libavcodec/vaapi_encode_vp9.c
> +++ b/libavcodec/vaapi_encode_vp9.c
> @@ -304,10 +304,11 @@ AVCodec ff_vp9_vaapi_encoder = {
>      .encode2        = &ff_vaapi_encode2,
>      .close          = &ff_vaapi_encode_close,
>      .priv_class     = &vaapi_encode_vp9_class,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> +    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>      .defaults       = vaapi_encode_vp9_defaults,
>      .pix_fmts = (const enum AVPixelFormat[]) {
>          AV_PIX_FMT_VAAPI,
>          AV_PIX_FMT_NONE,
>      },
> +    .wrapper_name   = "vaapi",
>  };
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 3b5c3000be..b529f00227 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -28,8 +28,8 @@
>  #include "libavutil/version.h"
>
>  #define LIBAVCODEC_VERSION_MAJOR  58
> -#define LIBAVCODEC_VERSION_MINOR   6
> -#define LIBAVCODEC_VERSION_MICRO 103
> +#define LIBAVCODEC_VERSION_MINOR   7
> +#define LIBAVCODEC_VERSION_MICRO 100
>
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>                                                 LIBAVCODEC_VERSION_MINOR, \
> diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
> index 086beb41fc..c47e5c4045 100644
> --- a/libavcodec/videotoolboxenc.c
> +++ b/libavcodec/videotoolboxenc.c
> @@ -2599,8 +2599,9 @@ AVCodec ff_hevc_videotoolbox_encoder = {
>      .init             = vtenc_init,
>      .encode2          = vtenc_frame,
>      .close            = vtenc_close,
> -    .capabilities     = AV_CODEC_CAP_DELAY,
> +    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARSWARE,


Typo, s/HARS/HARD/



>      .priv_class       = &hevc_videotoolbox_class,
>      .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
>                          FF_CODEC_CAP_INIT_CLEANUP,
> +    .wrapper_name     = "videotoolbox",
>  };
> --
> 2.15.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
wm4 Dec. 14, 2017, 4:57 p.m.
On Thu, 14 Dec 2017 16:01:49 +0000
Aman Gupta <ffmpeg@tmm1.net> wrote:


> > diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
> > index 086beb41fc..c47e5c4045 100644
> > --- a/libavcodec/videotoolboxenc.c
> > +++ b/libavcodec/videotoolboxenc.c
> > @@ -2599,8 +2599,9 @@ AVCodec ff_hevc_videotoolbox_encoder = {
> >      .init             = vtenc_init,
> >      .encode2          = vtenc_frame,
> >      .close            = vtenc_close,
> > -    .capabilities     = AV_CODEC_CAP_DELAY,
> > +    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARSWARE,  
> 
> 
> Typo, s/HARS/HARD/

Thanks, fixed locally.
Philip Langdale Dec. 14, 2017, 5:32 p.m.
On 2017-12-14 07:02, wm4 wrote:
> Explicitly identify decoder/encoder wrappers with a common name. This
> saves API users from guessing by the name suffix. For example, they
> don't have to guess that "h264_qsv" is the h264 QSV implementation, and
> instead they can just check the AVCodec .codec and .wrapper_name 
> fields.
> 
> Explicitly mark AVCodec entries that are hardware decoders or most
> likely hardware decoders with new AV_CODEC_CAPs. The purpose is 
> allowing
> API users listing hardware decoders in a more generic way. The proposed
> AVCodecHWConfig does not provide this information fully, because it's
> concerned with decoder configuration, not information about the fact
> whether the hardware is used or not.
> 
> AV_CODEC_CAP_HYBRID exists specifically for QSV, which can have 
> software
> implementations in case the hardware is not capable.
> 
> Based on a patch by Philip Langdale <philipl@overt.org>.

Ship it.

--phil
wm4 Dec. 14, 2017, 6:41 p.m.
On Thu, 14 Dec 2017 16:02:59 +0100
wm4 <nfxjfg@googlemail.com> wrote:

> Explicitly identify decoder/encoder wrappers with a common name. This
> saves API users from guessing by the name suffix. For example, they
> don't have to guess that "h264_qsv" is the h264 QSV implementation, and
> instead they can just check the AVCodec .codec and .wrapper_name fields.
> 
> Explicitly mark AVCodec entries that are hardware decoders or most
> likely hardware decoders with new AV_CODEC_CAPs. The purpose is allowing
> API users listing hardware decoders in a more generic way. The proposed
> AVCodecHWConfig does not provide this information fully, because it's
> concerned with decoder configuration, not information about the fact
> whether the hardware is used or not.
> 
> AV_CODEC_CAP_HYBRID exists specifically for QSV, which can have software
> implementations in case the hardware is not capable.
> 
> Based on a patch by Philip Langdale <philipl@overt.org>.
> ---

Pushed, with some fixes.

I apologize in advance should this break anything. (Lots of external
libraries.)

Patch hide | download patch | download mbox

diff --git a/doc/APIchanges b/doc/APIchanges
index 4af69c64bd..b4451ab193 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,10 @@  libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2017-xx-xx - xxxxxxc - lavc 58.7.100 - avcodec.h
+  Add AV_CODEC_CAP_HARDWARE, AV_CODEC_CAP_HYBRID, and AVCodec.wrapper_name,
+  and mark all AVCodecs accordingly.
+
 2017-xx-xx - xxxxxxx - lavu 56.4.100 / 56.7.0 - stereo3d.h
   Add view field to AVStereo3D structure and AVStereo3DView enum.
 
diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c
index 3711665bbd..5c0a9de8f6 100644
--- a/libavcodec/audiotoolboxdec.c
+++ b/libavcodec/audiotoolboxdec.c
@@ -597,6 +597,7 @@  static av_cold int ffat_close_decoder(AVCodecContext *avctx)
         .bsfs           = bsf_name, \
         .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, \
         .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, \
+        .wrapper_name   = "at", \
     };
 
 FFAT_DEC(aac,          AV_CODEC_ID_AAC, "aac_adtstoasc")
diff --git a/libavcodec/audiotoolboxenc.c b/libavcodec/audiotoolboxenc.c
index c47fbd1b2d..71885d1530 100644
--- a/libavcodec/audiotoolboxenc.c
+++ b/libavcodec/audiotoolboxenc.c
@@ -619,6 +619,7 @@  static const AVOption options[] = {
         }, \
         .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE, \
         .profiles       = PROFILES, \
+        .wrapper_name   = "at", \
     };
 
 static const uint64_t aac_at_channel_layouts[] = {
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 5db6a81320..7ea53b82f6 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1045,6 +1045,20 @@  typedef struct RcOverride{
  */
 #define AV_CODEC_CAP_LOSSLESS         0x80000000
 
+/**
+ * Codec is backed by a hardware implementation. Typically used to
+ * identify a non-hwaccel hardware decoder. For information about hwaccels, use
+ * avcodec_get_hw_config() instead.
+ */
+#define AV_CODEC_CAP_HARDWARE            (1 << 17)
+
+/**
+ * Codec is potentially backed by a hardware implementation, but not
+ * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the
+ * implementation provides some sort of internal fallback.
+ */
+#define AV_CODEC_CAP_HYBRID              (1 << 18)
+
 /**
  * Pan Scan area.
  * This specifies the area which should be displayed.
@@ -3377,6 +3391,18 @@  typedef struct AVCodec {
     const AVClass *priv_class;              ///< AVClass for the private context
     const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN}
 
+    /**
+     * Group name of the codec implementation.
+     * This is a short symbolic name of the wrapper backing this codec. A
+     * wrapper uses some kind of external implementation for the codec, such
+     * as an external library, or a codec implementation provided by the OS or
+     * the hardware.
+     * If this field is NULL, this is a builtin, libavcodec native decoder.
+     * If non-NULL, this will be the suffix in AVCodec.name in most cases
+     * (usually AVCodec.name will be of the form "<codec_name>_<wrapper_name>").
+     */
+    const char *wrapper_name;
+
     /*****************************************************************
      * No fields below this line are part of the public API. They
      * may not be used outside of libavcodec and can be changed and
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index 96d56f406a..c23033c7e3 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -1127,13 +1127,14 @@  static const AVCodecHWConfigInternal *cuvid_hw_configs[] = {
         .decode         = cuvid_decode_frame, \
         .receive_frame  = cuvid_output_frame, \
         .flush          = cuvid_flush, \
-        .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \
+        .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
         .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
                                                         AV_PIX_FMT_NV12, \
                                                         AV_PIX_FMT_P010, \
                                                         AV_PIX_FMT_P016, \
                                                         AV_PIX_FMT_NONE }, \
         .hw_configs     = cuvid_hw_configs, \
+        .wrapper_name   = "cuvid", \
     };
 
 #if CONFIG_HEVC_CUVID_DECODER
diff --git a/libavcodec/libcelt_dec.c b/libavcodec/libcelt_dec.c
index 878e4cc673..75b438b285 100644
--- a/libavcodec/libcelt_dec.c
+++ b/libavcodec/libcelt_dec.c
@@ -137,4 +137,5 @@  AVCodec ff_libcelt_decoder = {
     .close          = libcelt_dec_close,
     .decode         = libcelt_dec_decode,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libcelt",
 };
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index a0110da62b..677b11088b 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -385,4 +385,5 @@  AVCodec ff_libfdk_aac_decoder = {
     .priv_class     = &fdk_aac_dec_class,
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
                       FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "libfdk",
 };
diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c
index ca0f4bf722..d47137b227 100644
--- a/libavcodec/libfdk-aacenc.c
+++ b/libavcodec/libfdk-aacenc.c
@@ -428,4 +428,5 @@  AVCodec ff_libfdk_aac_encoder = {
     .profiles              = profiles,
     .supported_samplerates = aac_sample_rates,
     .channel_layouts       = aac_channel_layout,
+    .wrapper_name          = "libfdk",
 };
diff --git a/libavcodec/libgsmdec.c b/libavcodec/libgsmdec.c
index a503215f67..89e1de0fed 100644
--- a/libavcodec/libgsmdec.c
+++ b/libavcodec/libgsmdec.c
@@ -135,6 +135,7 @@  AVCodec ff_libgsm_decoder = {
     .decode         = libgsm_decode_frame,
     .flush          = libgsm_flush,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libgsm",
 };
 #endif
 #if CONFIG_LIBGSM_MS_DECODER
@@ -149,5 +150,6 @@  AVCodec ff_libgsm_ms_decoder = {
     .decode         = libgsm_decode_frame,
     .flush          = libgsm_flush,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libgsm",
 };
 #endif
diff --git a/libavcodec/libgsmenc.c b/libavcodec/libgsmenc.c
index e25db95181..c9e7ba056e 100644
--- a/libavcodec/libgsmenc.c
+++ b/libavcodec/libgsmenc.c
@@ -126,6 +126,7 @@  AVCodec ff_libgsm_encoder = {
     .close          = libgsm_encode_close,
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
+    .wrapper_name   = "libgsm",
 };
 #endif
 #if CONFIG_LIBGSM_MS_ENCODER
@@ -139,5 +140,6 @@  AVCodec ff_libgsm_ms_encoder = {
     .close          = libgsm_encode_close,
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
+    .wrapper_name   = "libgsm",
 };
 #endif
diff --git a/libavcodec/libilbc.c b/libavcodec/libilbc.c
index c4c054fa5d..9a56cc8785 100644
--- a/libavcodec/libilbc.c
+++ b/libavcodec/libilbc.c
@@ -193,4 +193,5 @@  AVCodec ff_libilbc_encoder = {
                                                      AV_SAMPLE_FMT_NONE },
     .defaults       = ilbc_encode_defaults,
     .priv_class     = &ilbc_enc_class,
+    .wrapper_name   = "libbilbc",
 };
diff --git a/libavcodec/libkvazaar.c b/libavcodec/libkvazaar.c
index 25e7b32f5f..41a1bbb45e 100644
--- a/libavcodec/libkvazaar.c
+++ b/libavcodec/libkvazaar.c
@@ -305,4 +305,6 @@  AVCodec ff_libkvazaar_encoder = {
     .close            = libkvazaar_close,
 
     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
+
+    .wrapper_name     = "libkvazaar",
 };
diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
index 5e26743f29..ecdd2e334c 100644
--- a/libavcodec/libmp3lame.c
+++ b/libavcodec/libmp3lame.c
@@ -349,4 +349,5 @@  AVCodec ff_libmp3lame_encoder = {
                                                   0 },
     .priv_class            = &libmp3lame_class,
     .defaults              = libmp3lame_defaults,
+    .wrapper_name          = "libmp3lame",
 };
diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c
index d509804315..516f625720 100644
--- a/libavcodec/libopencore-amr.c
+++ b/libavcodec/libopencore-amr.c
@@ -378,6 +378,7 @@  AVCodec ff_libopencore_amrwb_decoder = {
     .close          = amr_wb_decode_close,
     .decode         = amr_wb_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libopencore_amrwb",
 };
 
 #endif /* CONFIG_LIBOPENCORE_AMRWB_DECODER */
diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c
index d12e715117..b7ed85d175 100644
--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -147,4 +147,5 @@  AVCodec ff_libopenh264_decoder = {
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_THREADSAFE |
                       FF_CODEC_CAP_INIT_CLEANUP,
     .bsfs           = "h264_mp4toannexb",
+    .wrapper_name   = "libopenh264",
 };
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index 1152d0036f..fdadb101f5 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -301,4 +301,5 @@  AVCodec ff_libopenh264_encoder = {
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P,
                                                     AV_PIX_FMT_NONE },
     .priv_class     = &class,
+    .wrapper_name   = "libopenh264",
 };
diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c
index daf0a1c565..5e66cd99cc 100644
--- a/libavcodec/libopenjpegdec.c
+++ b/libavcodec/libopenjpegdec.c
@@ -512,4 +512,5 @@  AVCodec ff_libopenjpeg_decoder = {
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .max_lowres     = 31,
     .priv_class     = &openjpeg_class,
+    .wrapper_name   = "libopenjpeg",
 };
diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
index 59fe52d64a..7c7d0aa6b2 100644
--- a/libavcodec/libopenjpegenc.c
+++ b/libavcodec/libopenjpegenc.c
@@ -778,4 +778,5 @@  AVCodec ff_libopenjpeg_encoder = {
         AV_PIX_FMT_NONE
     },
     .priv_class     = &openjpeg_class,
+    .wrapper_name   = "libopenjpeg",
 };
diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
index 9b1e002ceb..4f7f4755c2 100644
--- a/libavcodec/libopusdec.c
+++ b/libavcodec/libopusdec.c
@@ -223,4 +223,5 @@  AVCodec ff_libopus_decoder = {
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT,
                                                      AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
+    .wrapper_name   = "libopus",
 };
diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c
index 3d88c296d3..b449497d15 100644
--- a/libavcodec/libopusenc.c
+++ b/libavcodec/libopusenc.c
@@ -566,4 +566,5 @@  AVCodec ff_libopus_encoder = {
     .supported_samplerates = libopus_sample_rates,
     .priv_class      = &libopus_class,
     .defaults        = libopus_defaults,
+    .wrapper_name    = "libopus",
 };
diff --git a/libavcodec/librsvgdec.c b/libavcodec/librsvgdec.c
index 77c771003c..e57070f8e4 100644
--- a/libavcodec/librsvgdec.c
+++ b/libavcodec/librsvgdec.c
@@ -124,4 +124,5 @@  AVCodec ff_librsvg_decoder = {
     .decode         = librsvg_decode_frame,
     .priv_data_size = sizeof(LibRSVGContext),
     .capabilities   = AV_CODEC_CAP_LOSSLESS | AV_CODEC_CAP_DR1,
+    .wrapper_name    = "librsvg",
 };
diff --git a/libavcodec/libshine.c b/libavcodec/libshine.c
index f4cf5981bc..7056fcd2e3 100644
--- a/libavcodec/libshine.c
+++ b/libavcodec/libshine.c
@@ -146,4 +146,5 @@  AVCodec ff_libshine_encoder = {
     .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
                                                   AV_CH_LAYOUT_STEREO,
                                                   0 },
+    .wrapper_name          = "libshine",
 };
diff --git a/libavcodec/libspeexdec.c b/libavcodec/libspeexdec.c
index 044883af73..d67c68c7f9 100644
--- a/libavcodec/libspeexdec.c
+++ b/libavcodec/libspeexdec.c
@@ -200,4 +200,5 @@  AVCodec ff_libspeex_decoder = {
     .decode         = libspeex_decode_frame,
     .flush          = libspeex_decode_flush,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libspeex",
 };
diff --git a/libavcodec/libspeexenc.c b/libavcodec/libspeexenc.c
index 5264899fd7..6a37dbc76c 100644
--- a/libavcodec/libspeexenc.c
+++ b/libavcodec/libspeexenc.c
@@ -365,4 +365,5 @@  AVCodec ff_libspeex_encoder = {
     .supported_samplerates = (const int[]){ 8000, 16000, 32000, 0 },
     .priv_class     = &speex_class,
     .defaults       = defaults,
+    .wrapper_name   = "libspeex",
 };
diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c
index d4c39283a6..16966ed433 100644
--- a/libavcodec/libtheoraenc.c
+++ b/libavcodec/libtheoraenc.c
@@ -385,4 +385,5 @@  AVCodec ff_libtheora_encoder = {
     .pix_fmts       = (const enum AVPixelFormat[]){
         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_NONE
     },
+    .wrapper_name   = "libtheora",
 };
diff --git a/libavcodec/libtwolame.c b/libavcodec/libtwolame.c
index 12d71e7acb..030f88868f 100644
--- a/libavcodec/libtwolame.c
+++ b/libavcodec/libtwolame.c
@@ -226,4 +226,5 @@  AVCodec ff_libtwolame_encoder = {
         AV_CH_LAYOUT_STEREO,
         0 },
     .supported_samplerates = twolame_samplerates,
+    .wrapper_name   = "libtwolame",
 };
diff --git a/libavcodec/libvo-amrwbenc.c b/libavcodec/libvo-amrwbenc.c
index f756940879..77d0ccef15 100644
--- a/libavcodec/libvo-amrwbenc.c
+++ b/libavcodec/libvo-amrwbenc.c
@@ -152,4 +152,5 @@  AVCodec ff_libvo_amrwbenc_encoder = {
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
     .priv_class     = &amrwb_class,
+    .wrapper_name   = "libvo_amrwbenc",
 };
diff --git a/libavcodec/libvorbisenc.c b/libavcodec/libvorbisenc.c
index 3ca5b55e8e..f78f872fe2 100644
--- a/libavcodec/libvorbisenc.c
+++ b/libavcodec/libvorbisenc.c
@@ -377,4 +377,5 @@  AVCodec ff_libvorbis_encoder = {
                                                       AV_SAMPLE_FMT_NONE },
     .priv_class     = &vorbis_class,
     .defaults       = defaults,
+    .wrapper_name   = "libvorbis",
 };
diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
index 2ae29d202a..04f27d3396 100644
--- a/libavcodec/libvpxdec.c
+++ b/libavcodec/libvpxdec.c
@@ -289,6 +289,7 @@  AVCodec ff_libvpx_vp8_decoder = {
     .close          = vpx_free,
     .decode         = vpx_decode,
     .capabilities   = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
+    .wrapper_name   = "libvpx",
 };
 #endif /* CONFIG_LIBVPX_VP8_DECODER */
 
@@ -310,5 +311,6 @@  AVCodec ff_libvpx_vp9_decoder = {
     .capabilities   = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
     .init_static_data = ff_vp9_init_static,
     .profiles       = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
+    .wrapper_name   = "libvpx",
 };
 #endif /* CONFIG_LIBVPX_VP9_DECODER */
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 9861e9d5ae..d0bd1e997a 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -1199,6 +1199,7 @@  AVCodec ff_libvpx_vp8_encoder = {
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_NONE },
     .priv_class     = &class_vp8,
     .defaults       = defaults,
+    .wrapper_name   = "libvpx",
 };
 #endif /* CONFIG_LIBVPX_VP8_ENCODER */
 
@@ -1229,5 +1230,6 @@  AVCodec ff_libvpx_vp9_encoder = {
     .priv_class     = &class_vp9,
     .defaults       = defaults,
     .init_static_data = ff_vp9_init_static,
+    .wrapper_name   = "libvpx",
 };
 #endif /* CONFIG_LIBVPX_VP9_ENCODER */
diff --git a/libavcodec/libwavpackenc.c b/libavcodec/libwavpackenc.c
index 6d5708985a..e84b074893 100644
--- a/libavcodec/libwavpackenc.c
+++ b/libavcodec/libwavpackenc.c
@@ -191,4 +191,5 @@  AVCodec ff_libwavpack_encoder = {
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SMALL_LAST_FRAME,
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32,
                                                      AV_SAMPLE_FMT_NONE },
+    .wrapper_name   = "libwavpack",
 };
diff --git a/libavcodec/libwebpenc.c b/libavcodec/libwebpenc.c
index 0bcf628e58..48f45b6320 100644
--- a/libavcodec/libwebpenc.c
+++ b/libavcodec/libwebpenc.c
@@ -109,4 +109,5 @@  AVCodec ff_libwebp_encoder = {
     },
     .priv_class     = &class,
     .defaults       = libwebp_defaults,
+    .wrapper_name   = "libwebp",
 };
diff --git a/libavcodec/libwebpenc_animencoder.c b/libavcodec/libwebpenc_animencoder.c
index 91bf64ca8b..7f35a0b939 100644
--- a/libavcodec/libwebpenc_animencoder.c
+++ b/libavcodec/libwebpenc_animencoder.c
@@ -148,4 +148,5 @@  AVCodec ff_libwebp_anim_encoder = {
     },
     .priv_class     = &class,
     .defaults       = libwebp_defaults,
+    .wrapper_name   = "libwebp",
 };
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 9c67c91f33..e2455e18de 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -1026,6 +1026,7 @@  AVCodec ff_libx264_encoder = {
     .init_static_data = X264_init_static,
     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
                         FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name     = "libx264",
 };
 #endif
 
@@ -1050,6 +1051,7 @@  AVCodec ff_libx264rgb_encoder = {
     .priv_class     = &rgbclass,
     .defaults       = x264_defaults,
     .pix_fmts       = pix_fmts_8bit_rgb,
+    .wrapper_name   = "libx264",
 };
 #endif
 
@@ -1076,5 +1078,6 @@  AVCodec ff_libx262_encoder = {
     .pix_fmts         = pix_fmts_8bit,
     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
                         FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name     = "libx264",
 };
 #endif
diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
index 25ccb02fcb..52ad2312a3 100644
--- a/libavcodec/libx265.c
+++ b/libavcodec/libx265.c
@@ -442,4 +442,5 @@  AVCodec ff_libx265_encoder = {
     .priv_class       = &class,
     .defaults         = x265_defaults,
     .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .wrapper_name     = "libx265",
 };
diff --git a/libavcodec/libxavs.c b/libavcodec/libxavs.c
index 865b5f62ef..801a05dbb5 100644
--- a/libavcodec/libxavs.c
+++ b/libavcodec/libxavs.c
@@ -478,4 +478,5 @@  AVCodec ff_libxavs_encoder = {
     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
     .priv_class     = &xavs_class,
     .defaults       = xavs_defaults,
+    .wrapper_name   = "libxavs",
 };
diff --git a/libavcodec/libxvid.c b/libavcodec/libxvid.c
index 5c05fa6d87..cdaae2094e 100644
--- a/libavcodec/libxvid.c
+++ b/libavcodec/libxvid.c
@@ -934,4 +934,5 @@  AVCodec ff_libxvid_encoder = {
     .priv_class     = &xvid_class,
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
                       FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "libxvid",
 };
diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c
index 687b6af129..30d0593430 100644
--- a/libavcodec/libzvbi-teletextdec.c
+++ b/libavcodec/libzvbi-teletextdec.c
@@ -573,4 +573,5 @@  AVCodec ff_libzvbi_teletext_decoder = {
     .capabilities = AV_CODEC_CAP_DELAY,
     .flush     = teletext_flush,
     .priv_class= &teletext_class,
+    .wrapper_name = "libzvbi",
 };
diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 39f5cbc045..1b5ae4ad59 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -539,10 +539,11 @@  AVCodec ff_h264_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .bsfs           = "h264_mp4toannexb",
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
 
@@ -557,10 +558,11 @@  AVCodec ff_hevc_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .bsfs           = "hevc_mp4toannexb",
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
 
@@ -575,9 +577,10 @@  AVCodec ff_mpeg2_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
 
@@ -592,9 +595,10 @@  AVCodec ff_mpeg4_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
 
@@ -609,9 +613,10 @@  AVCodec ff_vp8_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
 
@@ -626,8 +631,9 @@  AVCodec ff_vp9_mediacodec_decoder = {
     .decode         = mediacodec_decode_frame,
     .flush          = mediacodec_decode_flush,
     .close          = mediacodec_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .hw_configs     = mediacodec_hw_configs,
+    .wrapper_name   = "mediacodec",
 };
 #endif
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
index b3f0cca4b5..647a22ef7c 100644
--- a/libavcodec/mmaldec.c
+++ b/libavcodec/mmaldec.c
@@ -840,12 +840,13 @@  static const AVOption options[]={
         .decode         = ffmmal_decode, \
         .flush          = ffmmal_flush, \
         .priv_class     = &ffmmal_##NAME##_dec_class, \
-        .capabilities   = AV_CODEC_CAP_DELAY, \
+        .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE, \
         .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS, \
         .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL, \
                                                          AV_PIX_FMT_YUV420P, \
                                                          AV_PIX_FMT_NONE}, \
         .hw_configs     = mmal_hw_configs, \
+        .wrapper_name   = "mmal", \
     };
 
 FFMMAL_DEC(h264, AV_CODEC_ID_H264)
diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
index c3b4bac749..bc7bbcddeb 100644
--- a/libavcodec/nvenc_h264.c
+++ b/libavcodec/nvenc_h264.c
@@ -171,9 +171,10 @@  AVCodec ff_nvenc_encoder = {
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &nvenc_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
+    .wrapper_name   = "nvenc",
 };
 #endif
 
@@ -199,9 +200,10 @@  AVCodec ff_nvenc_h264_encoder = {
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &nvenc_h264_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
+    .wrapper_name   = "nvenc",
 };
 #endif
 
@@ -227,7 +229,8 @@  AVCodec ff_h264_nvenc_encoder = {
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &h264_nvenc_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
+    .wrapper_name   = "nvenc",
 };
diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
index 89e8c3e53a..0df7eab8cd 100644
--- a/libavcodec/nvenc_hevc.c
+++ b/libavcodec/nvenc_hevc.c
@@ -161,8 +161,9 @@  AVCodec ff_nvenc_hevc_encoder = {
     .priv_class     = &nvenc_hevc_class,
     .defaults       = defaults,
     .pix_fmts       = ff_nvenc_pix_fmts,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "nvenc",
 };
 
 #endif
@@ -188,6 +189,7 @@  AVCodec ff_hevc_nvenc_encoder = {
     .priv_class     = &hevc_nvenc_class,
     .defaults       = defaults,
     .pix_fmts       = ff_nvenc_pix_fmts,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "nvenc",
 };
diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c
index 6b4fc5e36e..5e0067335e 100644
--- a/libavcodec/qsvdec_h2645.c
+++ b/libavcodec/qsvdec_h2645.c
@@ -211,7 +211,7 @@  AVCodec ff_hevc_qsv_decoder = {
     .decode         = qsv_decode_frame,
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
     .priv_class     = &hevc_class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_P010,
@@ -219,6 +219,7 @@  AVCodec ff_hevc_qsv_decoder = {
                                                     AV_PIX_FMT_NONE },
     .hw_configs     = ff_qsv_hw_configs,
     .bsfs           = "hevc_mp4toannexb",
+    .wrapper_name   = "qsv",
 };
 #endif
 
@@ -245,7 +246,7 @@  AVCodec ff_h264_qsv_decoder = {
     .decode         = qsv_decode_frame,
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
     .priv_class     = &class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_P010,
@@ -253,5 +254,6 @@  AVCodec ff_h264_qsv_decoder = {
                                                     AV_PIX_FMT_NONE },
     .hw_configs     = ff_qsv_hw_configs,
     .bsfs           = "h264_mp4toannexb",
+    .wrapper_name   = "qsv",
 };
 #endif
diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c
index f7691f95bf..416e4c8164 100644
--- a/libavcodec/qsvdec_other.c
+++ b/libavcodec/qsvdec_other.c
@@ -176,12 +176,13 @@  AVCodec ff_mpeg2_qsv_decoder = {
     .decode         = qsv_decode_frame,
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
     .priv_class     = &mpeg2_qsv_class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .hw_configs     = ff_qsv_hw_configs,
+    .wrapper_name   = "qsv",
 };
 #endif
 
@@ -203,12 +204,13 @@  AVCodec ff_vc1_qsv_decoder = {
     .decode         = qsv_decode_frame,
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
     .priv_class     = &vc1_qsv_class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .hw_configs     = ff_qsv_hw_configs,
+    .wrapper_name   = "qsv",
 };
 #endif
 
@@ -230,11 +232,12 @@  AVCodec ff_vp8_qsv_decoder = {
     .decode         = qsv_decode_frame,
     .flush          = qsv_decode_flush,
     .close          = qsv_decode_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
     .priv_class     = &vp8_qsv_class,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .hw_configs     = ff_qsv_hw_configs,
+    .wrapper_name   = "qsv",
 };
 #endif
diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c
index 3242062b40..77fb2823d4 100644
--- a/libavcodec/qsvenc_h264.c
+++ b/libavcodec/qsvenc_h264.c
@@ -175,7 +175,7 @@  AVCodec ff_h264_qsv_encoder = {
     .init           = qsv_enc_init,
     .encode2        = qsv_enc_frame,
     .close          = qsv_enc_close,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_P010,
                                                     AV_PIX_FMT_QSV,
@@ -183,4 +183,5 @@  AVCodec ff_h264_qsv_encoder = {
     .priv_class     = &class,
     .defaults       = qsv_enc_defaults,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "qsv",
 };
diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
index f132a26c1a..4339b316a3 100644
--- a/libavcodec/qsvenc_hevc.c
+++ b/libavcodec/qsvenc_hevc.c
@@ -277,7 +277,7 @@  AVCodec ff_hevc_qsv_encoder = {
     .init           = qsv_enc_init,
     .encode2        = qsv_enc_frame,
     .close          = qsv_enc_close,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_P010,
                                                     AV_PIX_FMT_QSV,
@@ -285,4 +285,5 @@  AVCodec ff_hevc_qsv_encoder = {
     .priv_class     = &class,
     .defaults       = qsv_enc_defaults,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "qsv",
 };
diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c
index 731ec9a014..c18fe91940 100644
--- a/libavcodec/qsvenc_jpeg.c
+++ b/libavcodec/qsvenc_jpeg.c
@@ -83,9 +83,10 @@  AVCodec ff_mjpeg_qsv_encoder = {
     .init           = qsv_enc_init,
     .encode2        = qsv_enc_frame,
     .close          = qsv_enc_close,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .priv_class     = &class,
+    .wrapper_name   = "qsv",
 };
diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c
index 5b583fb491..a7427d8109 100644
--- a/libavcodec/qsvenc_mpeg2.c
+++ b/libavcodec/qsvenc_mpeg2.c
@@ -104,11 +104,12 @@  AVCodec ff_mpeg2_qsv_encoder = {
     .init           = qsv_enc_init,
     .encode2        = qsv_enc_frame,
     .close          = qsv_enc_close,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .priv_class     = &class,
     .defaults       = qsv_enc_defaults,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "qsv",
 };
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
index 958cdc522b..c4ea20ea83 100644
--- a/libavcodec/v4l2_m2m_dec.c
+++ b/libavcodec/v4l2_m2m_dec.c
@@ -215,6 +215,8 @@  AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
     .receive_frame  = v4l2_receive_frame,\
     .close          = ff_v4l2_m2m_codec_end,\
     .bsfs           = bsf_name, \
+    .capabilities   = AV_CODEC_CAP_HARDWARE, \
+    .wrapper_name   = "v4l2m2m", \
 };
 
 M2MDEC(h264,  "H.264", AV_CODEC_ID_H264,       "h264_mp4toannexb");
diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c
index 76ce85fdaa..f62ce7cdb5 100644
--- a/libavcodec/v4l2_m2m_enc.c
+++ b/libavcodec/v4l2_m2m_enc.c
@@ -335,6 +335,8 @@  AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
     .send_frame     = v4l2_send_frame,\
     .receive_packet = v4l2_receive_packet,\
     .close          = ff_v4l2_m2m_codec_end,\
+    .capabilities   = AV_CODEC_CAP_HARDWARE, \
+    .wrapper_name   = "v4l2m2m", \
 };
 
 M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4);
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 6940823b8e..a7f9a60253 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -1089,10 +1089,11 @@  AVCodec ff_h264_vaapi_encoder = {
     .encode2        = &ff_vaapi_encode2,
     .close          = &vaapi_encode_h264_close,
     .priv_class     = &vaapi_encode_h264_class,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_h264_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index 8e98b0230d..f3b4f6c7e2 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -1018,10 +1018,11 @@  AVCodec ff_hevc_vaapi_encoder = {
     .encode2        = &ff_vaapi_encode2,
     .close          = &vaapi_encode_h265_close,
     .priv_class     = &vaapi_encode_h265_class,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_h265_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/vaapi_encode_mjpeg.c b/libavcodec/vaapi_encode_mjpeg.c
index 2cbf7925f2..c949e89646 100644
--- a/libavcodec/vaapi_encode_mjpeg.c
+++ b/libavcodec/vaapi_encode_mjpeg.c
@@ -422,9 +422,11 @@  AVCodec ff_mjpeg_vaapi_encoder = {
     .encode2        = &ff_vaapi_encode2,
     .close          = &ff_vaapi_encode_close,
     .priv_class     = &vaapi_encode_mjpeg_class,
+    .capabilities   = AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_mjpeg_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c
index 02eca30dc5..4537955c40 100644
--- a/libavcodec/vaapi_encode_mpeg2.c
+++ b/libavcodec/vaapi_encode_mpeg2.c
@@ -669,10 +669,11 @@  AVCodec ff_mpeg2_vaapi_encoder = {
     .init           = &vaapi_encode_mpeg2_init,
     .encode2        = &ff_vaapi_encode2,
     .close          = &vaapi_encode_mpeg2_close,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_mpeg2_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c
index 423f7483e8..b4c5521d1f 100644
--- a/libavcodec/vaapi_encode_vp8.c
+++ b/libavcodec/vaapi_encode_vp8.c
@@ -260,10 +260,11 @@  AVCodec ff_vp8_vaapi_encoder = {
     .encode2        = &ff_vaapi_encode2,
     .close          = &ff_vaapi_encode_close,
     .priv_class     = &vaapi_encode_vp8_class,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_vp8_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c
index a987d1cd71..9108699ac3 100644
--- a/libavcodec/vaapi_encode_vp9.c
+++ b/libavcodec/vaapi_encode_vp9.c
@@ -304,10 +304,11 @@  AVCodec ff_vp9_vaapi_encoder = {
     .encode2        = &ff_vaapi_encode2,
     .close          = &ff_vaapi_encode_close,
     .priv_class     = &vaapi_encode_vp9_class,
-    .capabilities   = AV_CODEC_CAP_DELAY,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
     .defaults       = vaapi_encode_vp9_defaults,
     .pix_fmts = (const enum AVPixelFormat[]) {
         AV_PIX_FMT_VAAPI,
         AV_PIX_FMT_NONE,
     },
+    .wrapper_name   = "vaapi",
 };
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 3b5c3000be..b529f00227 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,8 +28,8 @@ 
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  58
-#define LIBAVCODEC_VERSION_MINOR   6
-#define LIBAVCODEC_VERSION_MICRO 103
+#define LIBAVCODEC_VERSION_MINOR   7
+#define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                LIBAVCODEC_VERSION_MINOR, \
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index 086beb41fc..c47e5c4045 100644
--- a/libavcodec/videotoolboxenc.c
+++ b/libavcodec/videotoolboxenc.c
@@ -2599,8 +2599,9 @@  AVCodec ff_hevc_videotoolbox_encoder = {
     .init             = vtenc_init,
     .encode2          = vtenc_frame,
     .close            = vtenc_close,
-    .capabilities     = AV_CODEC_CAP_DELAY,
+    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARSWARE,
     .priv_class       = &hevc_videotoolbox_class,
     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
                         FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name     = "videotoolbox",
 };