From: Zhao Zhili <quinkblack@foxmail.com>
To: ffmpeg-devel@ffmpeg.org
Cc: matthieu.bouron@stupeflix.com, Zhao Zhili <zhilizhao@tencent.com>,
aman@tmm1.net
Subject: [FFmpeg-devel] [PATCH 08/12] avutil/hwcontext_mediacodec: add ANativeWindow support
Date: Mon, 24 Oct 2022 11:16:54 +0800
Message-ID: <tencent_B05A7D06AC423AEDC149B78C69AE00756B0A@qq.com> (raw)
In-Reply-To: <20221024031658.1026118-1-quinkblack@foxmail.com>
From: Zhao Zhili <zhilizhao@tencent.com>
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
libavutil/hwcontext_mediacodec.c | 56 +++++++++++++++++++++++++++++++-
libavutil/hwcontext_mediacodec.h | 11 +++++++
libavutil/version.h | 4 +--
3 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/libavutil/hwcontext_mediacodec.c b/libavutil/hwcontext_mediacodec.c
index b0d8993e15..bb1779d34d 100644
--- a/libavutil/hwcontext_mediacodec.c
+++ b/libavutil/hwcontext_mediacodec.c
@@ -18,12 +18,24 @@
#include "config.h"
+#include <android/native_window.h>
+#include <dlfcn.h>
+#include <media/NdkMediaCodec.h>
+
#include "buffer.h"
#include "common.h"
#include "hwcontext.h"
#include "hwcontext_internal.h"
#include "hwcontext_mediacodec.h"
+typedef struct MediaCodecDeviceContext {
+ AVMediaCodecDeviceContext ctx;
+
+ void *libmedia;
+ media_status_t (*create_surface)(ANativeWindow **surface);
+} MediaCodecDeviceContext;
+
+
static int mc_device_create(AVHWDeviceContext *ctx, const char *device,
AVDictionary *opts, int flags)
{
@@ -35,13 +47,55 @@ static int mc_device_create(AVHWDeviceContext *ctx, const char *device,
return 0;
}
+static int mc_device_init(AVHWDeviceContext *ctx)
+{
+ MediaCodecDeviceContext *s = ctx->hwctx;
+ AVMediaCodecDeviceContext *dev = (AVMediaCodecDeviceContext *)s;
+ ANativeWindow *native_window = NULL;
+
+ if (dev->surface)
+ return 0;
+
+ if (dev->native_window)
+ return 0;
+
+ s->libmedia = dlopen("libmediandk.so", RTLD_NOW);
+ if (!s->libmedia)
+ return AVERROR_UNKNOWN;
+
+ s->create_surface = dlsym(s->libmedia, "AMediaCodec_createPersistentInputSurface");
+ if (!s->create_surface)
+ return AVERROR_UNKNOWN;
+
+ s->create_surface(&native_window);
+ dev->native_window = native_window;
+ return 0;
+}
+
+static void mc_device_uninit(AVHWDeviceContext *ctx)
+{
+ MediaCodecDeviceContext *s = ctx->hwctx;
+ AVMediaCodecDeviceContext *dev = ctx->hwctx;
+ if (!s->libmedia)
+ return;
+
+ if (dev->native_window) {
+ ANativeWindow_release(dev->native_window);
+ dev->native_window = NULL;
+ }
+ dlclose(s->libmedia);
+ s->libmedia = NULL;
+}
+
const HWContextType ff_hwcontext_type_mediacodec = {
.type = AV_HWDEVICE_TYPE_MEDIACODEC,
.name = "mediacodec",
- .device_hwctx_size = sizeof(AVMediaCodecDeviceContext),
+ .device_hwctx_size = sizeof(MediaCodecDeviceContext),
.device_create = mc_device_create,
+ .device_init = mc_device_init,
+ .device_uninit = mc_device_uninit,
.pix_fmts = (const enum AVPixelFormat[]){
AV_PIX_FMT_MEDIACODEC,
diff --git a/libavutil/hwcontext_mediacodec.h b/libavutil/hwcontext_mediacodec.h
index 101a9806d5..920e17764f 100644
--- a/libavutil/hwcontext_mediacodec.h
+++ b/libavutil/hwcontext_mediacodec.h
@@ -31,6 +31,17 @@ typedef struct AVMediaCodecDeviceContext {
* This is the default surface used by decoders on this device.
*/
void *surface;
+
+ /**
+ * Pointer to ANativeWindow.
+ *
+ * It both surface and native_window is NULL, try to create it
+ * automatically if OS support.
+ *
+ * It can be used as output surface for decoder and input surface for
+ * encoder.
+ */
+ void *native_window;
} AVMediaCodecDeviceContext;
#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index cb0c928bd0..2df788e529 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,8 +79,8 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 57
-#define LIBAVUTIL_VERSION_MINOR 39
-#define LIBAVUTIL_VERSION_MICRO 101
+#define LIBAVUTIL_VERSION_MINOR 40
+#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \
--
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-10-24 3:18 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20221024031658.1026118-1-quinkblack@foxmail.com>
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 01/12] avcodec/mediacodec: fix incorrect crop info Zhao Zhili
[not found] ` <CAK=uwuy5YEqEV_k9yVBVHw44iUK_NdprL7vZq8TV63Aczvt-pQ@mail.gmail.com>
2022-11-19 14:56 ` Zhao Zhili
2022-11-19 22:55 ` Aman Karmani
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 02/12] avcodec/mediacodecdec: don't break out if both input and output port return try again Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 03/12] avcodec/mediacodecdec_common: fix misuse av_free/av_freep Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 04/12] avcodec/mediacodecdec_common: fix useless av_buffer_unref Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 05/12] avcodec/mediacodec_wrapper: separate implementation from interface Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 06/12] avcodec/mediacodec: add NDK media codec wrapper Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 07/12] avcodec/mediacodecdec: enable NDK mediacodec Zhao Zhili
2022-10-24 3:16 ` Zhao Zhili [this message]
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 09/12] avcodec/mediacodec: add ANativeWindow support Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 10/12] avcodec: add MediaCodec encoder Zhao Zhili
2022-10-26 21:17 ` Tomas Härdin
2022-10-27 2:49 ` "zhilizhao(赵志立)"
2022-10-27 9:56 ` Tomas Härdin
2022-10-27 12:41 ` "zhilizhao(赵志立)"
[not found] ` <CAK=uwuxEwO98S2js5fnY_T1gf1epz+WRBiWyk86qM6oQmAMMMQ@mail.gmail.com>
2022-11-19 17:13 ` "zhilizhao(赵志立)"
2022-11-19 18:14 ` Olivier Ayache
2022-11-20 23:44 ` Aman Karmani
2022-11-21 4:40 ` "zhilizhao(赵志立)"
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 11/12] avutil/hwcontext: verify hw_frames_ctx in transfer_data_alloc Zhao Zhili
2022-10-24 3:16 ` [FFmpeg-devel] [PATCH 12/12] fftools/ffmpeg_opt: set default hwaccel_output_format for mediacodec Zhao Zhili
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tencent_B05A7D06AC423AEDC149B78C69AE00756B0A@qq.com \
--to=quinkblack@foxmail.com \
--cc=aman@tmm1.net \
--cc=ffmpeg-devel@ffmpeg.org \
--cc=matthieu.bouron@stupeflix.com \
--cc=zhilizhao@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git