1
0
Fork 0

avutil/hwcontext_mediacodec: add ANativeWindow support

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
Zhao Zhili 2022-10-20 12:41:32 +00:00
parent 040567965e
commit 2697f23f4e
3 changed files with 67 additions and 2 deletions

View File

@ -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,

View File

@ -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 */

View File

@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 57
#define LIBAVUTIL_VERSION_MINOR 42
#define LIBAVUTIL_VERSION_MINOR 43
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \