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

Aman Gupta ffmpeg at tmm1.net
Thu Dec 14 18:01:49 EET 2017


On Thu, Dec 14, 2017 at 7:10 AM wm4 <nfxjfg at 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 at 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 at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list