va: vpp: global lock to handle shared buffers
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Sat, 19 Sep 2020 12:26:42 +0000 (14:26 +0200)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Wed, 23 Sep 2020 16:19:22 +0000 (18:19 +0200)
Add a global mutex to exclusive access to shared stream buffers, such
as DMABufs or VASurfaces after a tee:

LIBVA_DRIVER_NAME=iHD \
gst-launch-1.0 v4l2src ! tee name=t t. ! queue ! \
  vapostproc skin-tone=9 ! xvimagesink \
  t. ! queue ! vapostproc ! xvimagesink

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1529>

sys/va/gstvafilter.c
sys/va/gstvavpp.c
sys/va/plugin.c

index 42150a6b9049b79dd598daf5ab6f03c630b56fc8..b7df8411e17903d58ae9a8053c9bad1284dbdadd 100644 (file)
@@ -397,6 +397,7 @@ gst_va_filter_close (GstVaFilter * self)
 
   GST_OBJECT_LOCK (self);
   g_clear_pointer (&self->available_filters, g_array_unref);
+  g_clear_pointer (&self->filters, g_array_unref);
   gst_va_filter_init (self);
   GST_OBJECT_UNLOCK (self);
 
index c66d70f16613d629252b80e12e9fa5f766e250b3..61e91430ea51aecab46fdfabc3f1e35ea4ba7e06 100644 (file)
@@ -139,6 +139,8 @@ enum
   VPP_CONVERT_FEATURE = 1 << 4,
 };
 
+extern GRecMutex GST_VA_SHARED_LOCK;
+
 /* *INDENT-OFF* */
 static const gchar *caps_str = GST_VIDEO_CAPS_MAKE_WITH_FEATURES ("memory:VAMemory",
             "{ NV12, I420, YV12, YUY2, RGBA, BGRA, P010_10LE, ARGB, ABGR }") " ;"
@@ -1004,6 +1006,18 @@ _get_sinkpad_pool (GstVaVpp * self)
   return self->sinkpad_pool;
 }
 
+static gboolean
+_try_import_buffer_unlocked (GstVaVpp * self, GstBuffer * inbuf)
+{
+  VASurfaceID surface;
+
+  surface = gst_va_buffer_get_surface (inbuf, NULL);
+  if (surface != VA_INVALID_ID)
+    return TRUE;
+
+  return _try_import_dmabuf (self, inbuf);
+}
+
 static GstFlowReturn
 gst_va_vpp_import_input_buffer (GstVaVpp * self, GstBuffer * inbuf,
     GstBuffer ** buf)
@@ -1012,16 +1026,12 @@ gst_va_vpp_import_input_buffer (GstVaVpp * self, GstBuffer * inbuf,
   GstBufferPool *pool;
   GstFlowReturn ret;
   GstVideoFrame in_frame, out_frame;
-  VASurfaceID surface;
-  gboolean copied;
-
-  surface = gst_va_buffer_get_surface (inbuf, NULL);
-  if (surface != VA_INVALID_ID) {
-    *buf = gst_buffer_ref (inbuf);
-    return GST_FLOW_OK;
-  }
+  gboolean imported, copied;
 
-  if (_try_import_dmabuf (self, inbuf)) {
+  g_rec_mutex_lock (&GST_VA_SHARED_LOCK);
+  imported = _try_import_buffer_unlocked (self, inbuf);
+  g_rec_mutex_unlock (&GST_VA_SHARED_LOCK);
+  if (imported) {
     *buf = gst_buffer_ref (inbuf);
     return GST_FLOW_OK;
   }
index d164df0cc6f4138037da067b41e205a27c89d907..46d9c35774b64a55a71d25fd6c15a4649147d44b 100644 (file)
 #define GST_CAT_DEFAULT gstva_debug
 GST_DEBUG_CATEGORY (gstva_debug);
 
+/* big bad mutex to exclusive access to shared stream buffers, such as
+ * DMABuf after a tee */
+GRecMutex GST_VA_SHARED_LOCK = { 0, };
+
 static void
 plugin_add_dependencies (GstPlugin * plugin)
 {