mirror of https://github.com/mpv-player/mpv
vo_mediacodec_embed: implement hwcontext
Fixes vo_mediacodec_embed, which was broken in 80359c6615
This commit is contained in:
parent
eb619d0f57
commit
7e2252688b
|
@ -2540,7 +2540,6 @@ Window
|
|||
value cast to ``intptr_t``. Use with ``--vo=mediacodec_embed`` and
|
||||
``--hwdec=mediacodec`` for direct rendering using MediaCodec, or with
|
||||
``--vo=gpu --gpu-context=android`` (with or without ``--hwdec=mediacodec-copy``).
|
||||
This is currently broken.
|
||||
|
||||
``--no-window-dragging``
|
||||
Don't move the window when clicking on it and moving the mouse pointer.
|
||||
|
|
|
@ -16,17 +16,44 @@
|
|||
*/
|
||||
|
||||
#include <libavcodec/mediacodec.h>
|
||||
#include <libavutil/hwcontext.h>
|
||||
#include <libavutil/hwcontext_mediacodec.h>
|
||||
|
||||
#include "common/common.h"
|
||||
#include "vo.h"
|
||||
#include "video/mp_image.h"
|
||||
#include "video/hwdec.h"
|
||||
|
||||
struct priv {
|
||||
struct mp_image *next_image;
|
||||
struct mp_hwdec_ctx hwctx;
|
||||
};
|
||||
|
||||
static AVBufferRef *create_mediacodec_device_ref(struct vo *vo)
|
||||
{
|
||||
AVBufferRef *device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_MEDIACODEC);
|
||||
if (!device_ref)
|
||||
return NULL;
|
||||
|
||||
AVHWDeviceContext *ctx = (void *)device_ref->data;
|
||||
AVMediaCodecDeviceContext *hwctx = ctx->hwctx;
|
||||
hwctx->surface = (void *)(intptr_t)(vo->opts->WinID);
|
||||
|
||||
if (av_hwdevice_ctx_init(device_ref) < 0)
|
||||
av_buffer_unref(&device_ref);
|
||||
|
||||
return device_ref;
|
||||
}
|
||||
|
||||
static int preinit(struct vo *vo)
|
||||
{
|
||||
struct priv *p = vo->priv;
|
||||
vo->hwdec_devs = hwdec_devices_create();
|
||||
p->hwctx = (struct mp_hwdec_ctx){
|
||||
.driver_name = "mediacodec_embed",
|
||||
.av_device_ref = create_mediacodec_device_ref(vo),
|
||||
};
|
||||
hwdec_devices_add(vo->hwdec_devs, &p->hwctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -72,6 +99,9 @@ static void uninit(struct vo *vo)
|
|||
{
|
||||
struct priv *p = vo->priv;
|
||||
mp_image_unrefp(&p->next_image);
|
||||
|
||||
hwdec_devices_remove(vo->hwdec_devs, &p->hwctx);
|
||||
av_buffer_unref(&p->hwctx.av_device_ref);
|
||||
}
|
||||
|
||||
const struct vo_driver video_out_mediacodec_embed = {
|
||||
|
|
Loading…
Reference in New Issue