[FFmpeg-cvslog] lavc/mediacodec: use AVMediaCodecDeviceContext hw_device_ctx if set

Aman Gupta git at videolan.org
Sat Dec 16 02:03:12 EET 2017


ffmpeg | branch: master | Aman Gupta <aman at tmm1.net> | Sun Dec  3 17:32:22 2017 -0800| [8bf4e6d3ce25723832625dddbf1c06ab20ab5828] | committer: Matthieu Bouron

lavc/mediacodec: use AVMediaCodecDeviceContext hw_device_ctx if set

Signed-off-by: Matthieu Bouron <matthieu.bouron at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8bf4e6d3ce25723832625dddbf1c06ab20ab5828
---

 doc/APIchanges                    |  3 +++
 libavcodec/mediacodecdec.c        |  5 +++--
 libavcodec/mediacodecdec_common.c | 14 +++++++++++++-
 libavcodec/version.h              |  2 +-
 4 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 811568196d..da444ffb7c 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2017-xx-xx - xxxxxxx - lavc 58.8.100 - avcodec.h
+  The MediaCodec decoders now support AVCodecContext.hw_device_ctx.
+
 2017-xx-xx - xxxxxxx - lavu 56.6.100 - hwcontext.h hwcontext_mediacodec.h
   Add AV_HWDEVICE_TYPE_MEDIACODEC and a new installed header with
   MediaCodec-specific hwcontext definitions.
diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 1b5ae4ad59..b698ceaef9 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -520,8 +520,9 @@ static const AVCodecHWConfigInternal *mediacodec_hw_configs[] = {
     &(const AVCodecHWConfigInternal) {
         .public          = {
             .pix_fmt     = AV_PIX_FMT_MEDIACODEC,
-            .methods     = AV_CODEC_HW_CONFIG_METHOD_AD_HOC,
-            .device_type = AV_HWDEVICE_TYPE_NONE,
+            .methods     = AV_CODEC_HW_CONFIG_METHOD_AD_HOC |
+                           AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX,
+            .device_type = AV_HWDEVICE_TYPE_MEDIACODEC,
         },
         .hwaccel         = NULL,
     },
diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index cb2f6ae5e5..a9147f3a08 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 
 #include "libavutil/common.h"
+#include "libavutil/hwcontext_mediacodec.h"
 #include "libavutil/mem.h"
 #include "libavutil/log.h"
 #include "libavutil/pixfmt.h"
@@ -476,7 +477,18 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
     if (pix_fmt == AV_PIX_FMT_MEDIACODEC) {
         AVMediaCodecContext *user_ctx = avctx->hwaccel_context;
 
-        if (user_ctx && user_ctx->surface) {
+        if (avctx->hw_device_ctx) {
+            AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)(avctx->hw_device_ctx->data);
+            if (device_ctx->type == AV_HWDEVICE_TYPE_MEDIACODEC) {
+                if (device_ctx->hwctx) {
+                    AVMediaCodecDeviceContext *mediacodec_ctx = (AVMediaCodecDeviceContext *)device_ctx->hwctx;
+                    s->surface = ff_mediacodec_surface_ref(mediacodec_ctx->surface, avctx);
+                    av_log(avctx, AV_LOG_INFO, "Using surface %p\n", s->surface);
+                }
+            }
+        }
+
+        if (!s->surface && user_ctx && user_ctx->surface) {
             s->surface = ff_mediacodec_surface_ref(user_ctx->surface, avctx);
             av_log(avctx, AV_LOG_INFO, "Using surface %p\n", s->surface);
         }
diff --git a/libavcodec/version.h b/libavcodec/version.h
index b529f00227..d55de89797 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  58
-#define LIBAVCODEC_VERSION_MINOR   7
+#define LIBAVCODEC_VERSION_MINOR   8
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \



More information about the ffmpeg-cvslog mailing list