On Mon, Dec 11, 2017 at 01:33:18PM +0100, Matthieu Bouron wrote: > On Sun, Dec 03, 2017 at 05:32:22PM -0800, Aman Gupta wrote: > > From: Aman Gupta <a...@tmm1.net> > > > > --- > > libavcodec/mediacodecdec.c | 2 +- > > libavcodec/mediacodecdec_common.c | 14 +++++++++++++- > > 2 files changed, 14 insertions(+), 2 deletions(-) > > > > diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c > > index 39f5cbc045..eabf6d0648 100644 > > --- a/libavcodec/mediacodecdec.c > > +++ b/libavcodec/mediacodecdec.c > > @@ -520,7 +520,7 @@ static const AVCodecHWConfigInternal > > *mediacodec_hw_configs[] = { > > &(const AVCodecHWConfigInternal) { > > .public = { > > .pix_fmt = AV_PIX_FMT_MEDIACODEC, > > - .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, > > + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX, > > .device_type = AV_HWDEVICE_TYPE_NONE, > > }, > > .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); > > } > > [...] > > New patch attached fixing errors in get_format() by keeping the original > AVCodecHWConfigInternal (ad-hoc) and adding a new one (hw-device) with the > device_type field set to the MediaCodec. > > The updated patchset works without errors with both the old hwaccel method and > the new device_ctx method.
Attaching missing patch. [...] -- Matthieu B.
>From 2bbdae2141ba8ca8db54175f4440ac8190f5953d Mon Sep 17 00:00:00 2001 From: Aman Gupta <a...@tmm1.net> Date: Sun, 3 Dec 2017 17:32:22 -0800 Subject: [PATCH 2/2] libavcodec/mediacodec: use AVMediaCodecDeviceContext hw_device_ctx if set Signed-off-by: Matthieu Bouron <matthieu.bou...@gmail.com> --- libavcodec/mediacodecdec.c | 8 ++++++++ libavcodec/mediacodecdec_common.c | 14 +++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 86cc629430..c8ad0b80e7 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -543,6 +543,14 @@ static const AVCodecHWConfigInternal *mediacodec_hw_configs[] = { }, .hwaccel = NULL, }, + &(const AVCodecHWConfigInternal) { + .public = { + .pix_fmt = AV_PIX_FMT_MEDIACODEC, + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX, + .device_type = AV_HWDEVICE_TYPE_MEDIACODEC, + }, + .hwaccel = NULL, + }, 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); } -- 2.15.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel