vo_gpu: hwdec_drmprime_drm: add hwdec ctx

This allows to use drm hwaccels that require a hwdevice.

Tested with v4l2request hwaccel and cedrus driver on an allwinner device
running mpv with --vo=gpu --gpu-context=drm --hwdec=drm.
This commit is contained in:
Jonas Karlman 2019-01-24 22:11:10 +01:00 committed by wm4
parent c3687b9eaa
commit 16d2ddb505
2 changed files with 15 additions and 1 deletions

View File

@ -23,6 +23,7 @@
#include <math.h> #include <math.h>
#include <stdbool.h> #include <stdbool.h>
#include <libavutil/hwcontext.h>
#include <libavutil/hwcontext_drm.h> #include <libavutil/hwcontext_drm.h>
#include "common.h" #include "common.h"
@ -44,6 +45,7 @@ struct drm_frame {
struct priv { struct priv {
struct mp_log *log; struct mp_log *log;
struct mp_hwdec_ctx hwctx;
struct mp_image_params params; struct mp_image_params params;
@ -231,6 +233,9 @@ static void uninit(struct ra_hwdec *hw)
disable_video_plane(hw); disable_video_plane(hw);
set_current_frame(hw, NULL); set_current_frame(hw, NULL);
hwdec_devices_remove(hw->devs, &p->hwctx);
av_buffer_unref(&p->hwctx.av_device_ref);
if (p->ctx) { if (p->ctx) {
drm_atomic_destroy_context(p->ctx); drm_atomic_destroy_context(p->ctx);
p->ctx = NULL; p->ctx = NULL;
@ -284,6 +289,15 @@ static int init(struct ra_hwdec *hw)
} }
disable_video_plane(hw); disable_video_plane(hw);
p->hwctx = (struct mp_hwdec_ctx) {
.driver_name = hw->driver->name,
};
if (!av_hwdevice_ctx_create(&p->hwctx.av_device_ref, AV_HWDEVICE_TYPE_DRM,
drmGetDeviceNameFromFd2(p->ctx->fd), NULL, 0)) {
hwdec_devices_add(hw->devs, &p->hwctx);
}
return 0; return 0;
err: err:

View File

@ -563,7 +563,7 @@ video_output_features = [
'name': '--drm', 'name': '--drm',
'desc': 'DRM', 'desc': 'DRM',
'deps': 'vt.h', 'deps': 'vt.h',
'func': check_pkg_config('libdrm'), 'func': check_pkg_config('libdrm', '>= 2.4.74'),
}, { }, {
'name': '--drmprime', 'name': '--drmprime',
'desc': 'DRM Prime ffmpeg support', 'desc': 'DRM Prime ffmpeg support',