mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
avutil/hwcontext_mediacodec: add ANativeWindow support
Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
parent
040567965e
commit
2697f23f4e
@ -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,
|
||||
|
@ -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 */
|
||||
|
@ -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, \
|
||||
|
Loading…
x
Reference in New Issue
Block a user