From 4ff4bcd725290c8f1a52e791496f164c3090ecaa Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Wed, 27 Jan 2021 12:05:44 +0800 Subject: [PATCH] libs: display: drm: support gst.vaapi.app.Display context for drm backend Attributes for drm backend: - va-display : ponter of VADisplay - drm-device-fd : the DRM device file descriptor Part-of: --- gst-libs/gst/vaapi/gstvaapidisplay_drm.c | 34 ++++++++++++++++++++++++ gst-libs/gst/vaapi/gstvaapidisplay_drm.h | 3 +++ gst/vaapi/gstvaapivideocontext.c | 12 +++++++++ 3 files changed, 49 insertions(+) diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c index 7f4d3996d6..c4e5001d13 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c @@ -396,6 +396,40 @@ gst_vaapi_display_drm_new_with_device (gint device) GST_VAAPI_DISPLAY_INIT_FROM_NATIVE_DISPLAY, GINT_TO_POINTER (device)); } +/** + * gst_vaapi_display_drm_new_with_va_display: + * @va_display: a VADisplay #va_display + * @fd: an open DRM device (file descriptor) #fd + * + * Creates a #GstVaapiDisplay based on the VADisplay @va_display and + * the open DRM device @fd. + * The caller still owns the device file descriptor and must call close() + * when all #GstVaapiDisplay references are released. + * + * Return value: a newly allocated #GstVaapiDisplay object + */ + +GstVaapiDisplay * +gst_vaapi_display_drm_new_with_va_display (VADisplay va_display, gint fd) +{ + GstVaapiDisplay *display; + GstVaapiDisplayInfo info = { + .va_display = va_display, + .native_display = GINT_TO_POINTER (fd), + }; + + g_return_val_if_fail (fd >= 0, NULL); + + display = g_object_new (GST_TYPE_VAAPI_DISPLAY_DRM, NULL); + if (!gst_vaapi_display_config (display, + GST_VAAPI_DISPLAY_INIT_FROM_VA_DISPLAY, &info)) { + gst_object_unref (display); + return NULL; + } + + return display; +} + /** * gst_vaapi_display_drm_get_device: * @display: a #GstVaapiDisplayDRM diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_drm.h b/gst-libs/gst/vaapi/gstvaapidisplay_drm.h index 5424b32456..199c6eae7d 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_drm.h +++ b/gst-libs/gst/vaapi/gstvaapidisplay_drm.h @@ -39,6 +39,9 @@ gst_vaapi_display_drm_new (const gchar * device_path); GstVaapiDisplay * gst_vaapi_display_drm_new_with_device (gint device); +GstVaapiDisplay * +gst_vaapi_display_drm_new_with_va_display (VADisplay va_display, gint fd); + gint gst_vaapi_display_drm_get_device (GstVaapiDisplayDRM * display); diff --git a/gst/vaapi/gstvaapivideocontext.c b/gst/vaapi/gstvaapivideocontext.c index 2528ff3728..bd3db01d92 100644 --- a/gst/vaapi/gstvaapivideocontext.c +++ b/gst/vaapi/gstvaapivideocontext.c @@ -34,6 +34,9 @@ #if USE_WAYLAND #include #endif +#if USE_DRM +#include +#endif GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT); @@ -117,6 +120,15 @@ gst_vaapi_video_context_get_display (GstContext * context, gboolean app_context, } } #endif +#if USE_DRM + if (!display) { + gint fd = -1; + if (gst_structure_get (structure, "drm-device-fd", G_TYPE_INT, &fd, + NULL)) { + display = gst_vaapi_display_drm_new_with_va_display (va_display, fd); + } + } +#endif _init_context_debug ();