[FFmpeg-devel] [PATCH 1/2] avcodec: Add metadata to identify hardware backed codecs

wm4 nfxjfg at googlemail.com
Wed Nov 29 16:31:52 EET 2017


On Mon, 27 Nov 2017 20:46:00 -0800
Philip Langdale <philipl at overt.org> wrote:

> If hardware acceleration is implemented through an HWAccel, then it's
> easy to recognise, but some hardware implementations are best suited
> to implementation as full decoders, and these are not easy to identify.
> Clients typically need hardcoded lists of codecs, and usually need to
> rely on related codecs using a particular naming convention.
> 
> To make it easier to discover these codecs dynamically, we can
> introduce an explicit AV_CODEC_CAP_HARDWARE that indicates the codec
> is hardware-backed. We also introduce a 'provider' field into AVCodec
> that allows for an identifier to be attached to these codecs for
> simple matching. The provider could also be used to identify the
> use of an external software library.
> 
> Unfortunately, we know of at least one case where an external interface
> might silently end up using a separate software implementation (libmfx)
> and so we introduce AV_CODEC_CAP_MAYBE_NOT_HARDWARE so say that you
> can't trust it 100%. It's silly but what can you do?
> 
> The expected use-case here is allowing a client application to
> enumerate hardware decoding options for a given format and to allow
> a user to select one based on a recognisable identifier (the provider).
> 
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>  Changelog            |  1 +
>  doc/APIchanges       |  5 +++++
>  libavcodec/avcodec.h | 19 +++++++++++++++++++
>  3 files changed, 25 insertions(+)
> 
> diff --git a/Changelog b/Changelog
> index 76d6fad56b..a99edbf4b7 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -21,6 +21,7 @@ version <next>:
>  - video mix filter
>  - video normalize filter
>  - audio lv2 wrapper filter
> +- Added codec metadata to identify hardware backed decoders
>  
>  
>  version 3.4:
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 44a740e51f..7856cb13a1 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,11 @@ libavutil:     2017-10-21
>  
>  API changes, most recent first:
>  
> +2017-12-xx - xxxxxxx - lavc 58.7.100 - avcodec.h
> +  Add AV_CODEC_CAP_HARDWARE
> +  Add AV_CODEC_CAP_MAYBE_NOT_HARDWARE
> +  Add AVCodec.provider
> +
>  2017-xx-xx - xxxxxxx - lavc 58.6.100 - avcodec.h
>    Add const to AVCodecContext.hwaccel.
>  
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index c1e68b1d13..04cfa48665 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -1036,6 +1036,16 @@ typedef struct RcOverride{
>   * choice for probing.
>   */
>  #define AV_CODEC_CAP_AVOID_PROBING       (1 << 17)
> +/**
> + * Codec is backed by a hardware implementation. Typically used to
> + * identify a non-hwaccel hardware decoder.
> + */
> +#define AV_CODEC_CAP_HARDWARE            (1 << 18)
> +/**
> + * Codec is normally backed by a hardware implementation, but the
> + * external abstraction could be software backed.
> + */
> +#define AV_CODEC_CAP_MAYBE_NOT_HARDWARE  (1 << 19)

One could argue that every hw-backed decoder might fallback to software
fully or partially. For example, Intel is known to have hybrid drivers
(that sometimes even tend to be slower than libavcodec), and
videotoolbox has a software decoder (though we disable it). So I'm not
sure if this flag is really necessary, but I'm not opposed either.

>  /**
>   * Codec is intra only.
>   */
> @@ -3475,6 +3485,15 @@ typedef struct AVCodec {
>       * The user can only access this field via avcodec_get_hw_config().
>       */
>      const struct AVCodecHWConfigInternal **hw_configs;
> +
> +    /**
> +     * String that helps identify the external provider for the codec.
> +     * For example, if some external hardware decoder provides support
> +     * for a variety of codecs, they could each set the same provider
> +     * value to signify their relationship. Could also be used to
> +     * identify the use of an external software implementation.
> +     */
> +   const char *provider;
>  } AVCodec;
>  
>  #if FF_API_CODEC_GET_SET

Generally LGTM. It's pretty useless if it doesn't land in libav,
though. Can you post it there too?


More information about the ffmpeg-devel mailing list