summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang@intel.com>2021-01-27 12:05:44 +0800
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-01-29 14:08:42 +0000
commit4ff4bcd725290c8f1a52e791496f164c3090ecaa (patch)
tree442c4f3fa6a3ceff6c9c3848248fc676b1e82e1c
parent85284f4aacc9cfc059c59aa033166fedc247e117 (diff)
downloadgstreamer-vaapi-4ff4bcd725290c8f1a52e791496f164c3090ecaa.tar.gz
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: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/409>
-rw-r--r--gst-libs/gst/vaapi/gstvaapidisplay_drm.c34
-rw-r--r--gst-libs/gst/vaapi/gstvaapidisplay_drm.h3
-rw-r--r--gst/vaapi/gstvaapivideocontext.c12
3 files changed, 49 insertions, 0 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
index 7f4d3996..c4e5001d 100644
--- a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
+++ b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
@@ -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
*
diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_drm.h b/gst-libs/gst/vaapi/gstvaapidisplay_drm.h
index 5424b324..199c6eae 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 2528ff37..bd3db01d 100644
--- a/gst/vaapi/gstvaapivideocontext.c
+++ b/gst/vaapi/gstvaapivideocontext.c
@@ -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 ();