Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
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".

  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