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

Philip Langdale philipl at overt.org
Tue Nov 28 06:46:00 EET 2017


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)
 /**
  * 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
-- 
2.14.1



More information about the ffmpeg-devel mailing list