qsv: Use pipeline's VA context
authorSeungha Yang <seungha@centricular.com>
Fri, 25 Mar 2022 12:03:02 +0000 (21:03 +0900)
committerSeungha Yang <seungha@centricular.com>
Thu, 31 Mar 2022 20:48:24 +0000 (20:48 +0000)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2030>

subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_va.h
subprojects/gst-plugins-bad/sys/qsv/gstqsvdecoder.cpp
subprojects/gst-plugins-bad/sys/qsv/gstqsvencoder.cpp

index 8c6e6e0..ba4bf91 100644 (file)
@@ -20,7 +20,7 @@
 #pragma once
 
 #include <gst/gst.h>
-#include <gst/va/gstvadisplay.h>
+#include <gst/va/gstva.h>
 #include "gstqsvallocator.h"
 
 G_BEGIN_DECLS
index fe5ca56..9faaa6f 100644 (file)
@@ -26,7 +26,6 @@
 #include <string.h>
 
 #ifdef G_OS_WIN32
-#include <gst/d3d11/gstd3d11.h>
 #include "gstqsvallocator_d3d11.h"
 
 #include <wrl.h>
@@ -35,7 +34,6 @@
 using namespace Microsoft::WRL;
 /* *INDENT-ON* */
 #else
-#include <gst/va/gstvadisplay_drm.h>
 #include "gstqsvallocator_va.h"
 #endif /* G_OS_WIN32 */
 
@@ -243,13 +241,16 @@ gst_qsv_decoder_finalize (GObject * object)
 static void
 gst_qsv_decoder_set_context (GstElement * element, GstContext * context)
 {
-#ifdef G_OS_WIN32
   GstQsvDecoder *self = GST_QSV_DECODER (element);
   GstQsvDecoderClass *klass = GST_QSV_DECODER_GET_CLASS (element);
   GstQsvDecoderPrivate *priv = self->priv;
 
+#ifdef G_OS_WIN32
   gst_d3d11_handle_set_context_for_adapter_luid (element,
       context, klass->adapter_luid, (GstD3D11Device **) & priv->device);
+#else
+  gst_va_handle_set_context (element, context, klass->display_path,
+      (GstVaDisplay **) & priv->device);
 #endif
 
   GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
@@ -319,19 +320,14 @@ gst_qsv_decoder_open_platform_device (GstQsvDecoder * self)
   mfxStatus status;
   GstVaDisplay *display;
 
-  /* TODO: use GstVADisplay context sharing */
-  if (!priv->device) {
-    display = gst_va_display_drm_new_from_path (klass->display_path);
-    if (!display) {
-      GST_ERROR_OBJECT (self, "VA display is unavailable");
-      return FALSE;
-    }
-
-    priv->device = GST_OBJECT (display);
-  } else {
-    display = GST_VA_DISPLAY (priv->device);
+  if (!gst_va_ensure_element_data (GST_ELEMENT (self), klass->display_path,
+          (GstVaDisplay **) & priv->device)) {
+    GST_ERROR_OBJECT (self, "VA display is unavailable");
+    return FALSE;
   }
 
+  display = GST_VA_DISPLAY (priv->device);
+
   priv->allocator = gst_qsv_va_allocator_new (display);
 
   status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_VA_DISPLAY,
@@ -1270,14 +1266,15 @@ gst_qsv_decoder_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
 static gboolean
 gst_qsv_decoder_handle_context_query (GstQsvDecoder * self, GstQuery * query)
 {
-#ifdef G_OS_WIN32
   GstQsvDecoderPrivate *priv = self->priv;
 
+#ifdef G_OS_WIN32
   return gst_d3d11_handle_context_query (GST_ELEMENT (self), query,
       (GstD3D11Device *) priv->device);
+#else
+  return gst_va_handle_context_query (GST_ELEMENT (self), query,
+      (GstVaDisplay *) priv->device);
 #endif
-
-  return FALSE;
 }
 
 static gboolean
index b31d3cb..6f1b18a 100644 (file)
@@ -27,7 +27,6 @@
 #include <string>
 
 #ifdef G_OS_WIN32
-#include <gst/d3d11/gstd3d11.h>
 #include "gstqsvallocator_d3d11.h"
 
 #include <wrl.h>
@@ -36,7 +35,6 @@
 using namespace Microsoft::WRL;
 /* *INDENT-ON* */
 #else
-#include <gst/va/gstvadisplay_drm.h>
 #include "gstqsvallocator_va.h"
 #endif /* G_OS_WIN32 */
 
@@ -294,13 +292,16 @@ gst_qsv_encoder_get_property (GObject * object, guint prop_id, GValue * value,
 static void
 gst_qsv_encoder_set_context (GstElement * element, GstContext * context)
 {
-#ifdef G_OS_WIN32
   GstQsvEncoder *self = GST_QSV_ENCODER (element);
   GstQsvEncoderClass *klass = GST_QSV_ENCODER_GET_CLASS (element);
   GstQsvEncoderPrivate *priv = self->priv;
 
+#ifdef G_OS_WIN32
   gst_d3d11_handle_set_context_for_adapter_luid (element,
       context, klass->adapter_luid, (GstD3D11Device **) & priv->device);
+#else
+  gst_va_handle_set_context (element, context, klass->display_path,
+      (GstVaDisplay **) & priv->device);
 #endif
 
   GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
@@ -377,19 +378,14 @@ gst_qsv_encoder_open_platform_device (GstQsvEncoder * self)
   mfxStatus status;
   GstVaDisplay *display;
 
-  /* GstVADisplay context sharing is not public yet (VA plugin internal) */
-  if (!priv->device) {
-    display = gst_va_display_drm_new_from_path (klass->display_path);
-    if (!display) {
-      GST_ERROR_OBJECT (self, "VA display is unavailable");
-      return FALSE;
-    }
-
-    priv->device = GST_OBJECT (display);
-  } else {
-    display = GST_VA_DISPLAY (priv->device);
+  if (!gst_va_ensure_element_data (GST_ELEMENT (self), klass->display_path,
+          (GstVaDisplay **) & priv->device)) {
+    GST_ERROR_OBJECT (self, "VA display is unavailable");
+    return FALSE;
   }
 
+  display = GST_VA_DISPLAY (priv->device);
+
   priv->allocator = gst_qsv_va_allocator_new (display);
 
   status = MFXVideoCORE_SetHandle (priv->session, MFX_HANDLE_VA_DISPLAY,
@@ -1302,14 +1298,15 @@ gst_qsv_encoder_flush (GstVideoEncoder * encoder)
 static gboolean
 gst_qsv_encoder_handle_context_query (GstQsvEncoder * self, GstQuery * query)
 {
-#ifdef G_OS_WIN32
   GstQsvEncoderPrivate *priv = self->priv;
 
+#ifdef G_OS_WIN32
   return gst_d3d11_handle_context_query (GST_ELEMENT (self), query,
       (GstD3D11Device *) priv->device);
+#else
+  return gst_va_handle_context_query (GST_ELEMENT (self), query,
+      (GstVaDisplay *) priv->device);
 #endif
-
-  return FALSE;
 }
 
 static gboolean