libs: display: drm: support gst.vaapi.app.Display context for drm backend
authorHaihao Xiang <haihao.xiang@intel.com>
Wed, 27 Jan 2021 04:05:44 +0000 (12:05 +0800)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 29 Jan 2021 14:08:42 +0000 (14:08 +0000)
Attributes for drm backend:
- va-display : ponter of VADisplay
- drm-device-fd : the DRM device file descriptor

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/409>

gst-libs/gst/vaapi/gstvaapidisplay_drm.c
gst-libs/gst/vaapi/gstvaapidisplay_drm.h
gst/vaapi/gstvaapivideocontext.c

index 7f4d399..c4e5001 100644 (file)
@@ -397,6 +397,40 @@ gst_vaapi_display_drm_new_with_device (gint 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
  *
index 5424b32..199c6ea 100644 (file)
@@ -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);
 
index 2528ff3..bd3db01 100644 (file)
@@ -34,6 +34,9 @@
 #if USE_WAYLAND
 #include <gst/vaapi/gstvaapidisplay_wayland.h>
 #endif
+#if USE_DRM
+#include <gst/vaapi/gstvaapidisplay_drm.h>
+#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 ();