vo_opengl: add KMS/DRM VAAPI hardware decoding interop

Just requires glueing it together with Bloat Super Glue (tm).
This commit is contained in:
wm4 2016-01-20 19:41:29 +01:00
parent ca00e347fc
commit 68366b05f2
3 changed files with 26 additions and 1 deletions

View File

@ -353,6 +353,9 @@ static int drm_egl_init(struct MPGLContext *ctx, int flags)
void *(*gpa)(const GLubyte*) = (void *(*)(const GLubyte*))eglGetProcAddress;
mpgl_load_functions(ctx->gl, gpa, egl_exts, ctx->vo->log);
ctx->native_display_type = "drm";
ctx->native_display = (void *)(intptr_t)p->kms->fd;
// required by gbm_surface_lock_front_buffer
eglSwapBuffers(p->egl.display, p->egl.surface);

View File

@ -65,6 +65,19 @@ static VADisplay *create_wayland_va_display(GL *gl)
}
#endif
#if HAVE_VAAPI_DRM
#include <va/va_drm.h>
static VADisplay *create_drm_va_display(GL *gl)
{
int drm_fd = (intptr_t)gl->MPGetNativeDisplay("drm");
// Note: yes, drm_fd==0 could be valid - but it's rare and doesn't fit with
// our slightly crappy way of passing it through, so consider 0 not
// valid.
return drm_fd ? vaGetDisplayDRM(drm_fd) : NULL;
}
#endif
static VADisplay *create_native_va_display(GL *gl)
{
if (!gl->MPGetNativeDisplay)
@ -79,6 +92,11 @@ static VADisplay *create_native_va_display(GL *gl)
display = create_wayland_va_display(gl);
if (display)
return display;
#endif
#if HAVE_VAAPI_DRM
display = create_drm_va_display(gl);
if (display)
return display;
#endif
return display;
}

View File

@ -705,7 +705,11 @@ video_output_features = [
'desc': 'VAAPI (Wayland support)',
'deps': [ 'vaapi', 'gl-wayland' ],
'func': check_pkg_config('libva-wayland', '>= 0.36.0'),
}, {
'name': '--vaapi-drm',
'desc': 'VAAPI (DRM/EGL support)',
'deps': [ 'vaapi', 'egl-drm' ],
'func': check_pkg_config('libva-drm', '>= 0.36.0'),
}, {
'name': '--vaapi-glx',
'desc': 'VAAPI GLX',