va: compositor: Do not use allocator and pool from other display.
authorHe Junyan <junyan.he@intel.com>
Fri, 4 Nov 2022 13:26:23 +0000 (21:26 +0800)
committerHe Junyan <junyan.he@intel.com>
Sat, 5 Nov 2022 05:39:34 +0000 (13:39 +0800)
Just like the va decoder, the compositor should not use allocator
and pool from other display. Also, when importing the input buffer,
if it is from other display, we should fallback to memory copy.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1167
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3322>

subprojects/gst-plugins-bad/sys/va/gstvacompositor.c

index ae57a4d..21db966 100644 (file)
@@ -656,6 +656,7 @@ gst_va_compositor_decide_allocation (GstAggregator * agg, GstQuery * query)
   GstVideoInfo info;
   guint min, max, size = 0, usage_hint = VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE;
   gboolean update_pool, update_allocator, has_videometa, copy_frames;
+  gboolean dont_use_other_pool = FALSE;
 
   gst_query_parse_allocation (query, &caps, NULL);
 
@@ -668,13 +669,20 @@ gst_va_compositor_decide_allocation (GstAggregator * agg, GstQuery * query)
   }
 
   if (gst_query_get_n_allocation_params (query) > 0) {
+    GstVaDisplay *display;
+
     gst_query_parse_nth_allocation_param (query, 0, &allocator, &other_params);
-    if (allocator && !(GST_IS_VA_DMABUF_ALLOCATOR (allocator)
-            || GST_IS_VA_ALLOCATOR (allocator))) {
+    display = gst_va_allocator_peek_display (allocator);
+    if (!display) {
       /* save the allocator for the other pool */
       other_allocator = allocator;
       allocator = NULL;
+    } else if (display != self->display) {
+      /* The allocator and pool belong to other display, we should not use. */
+      gst_clear_object (&allocator);
+      dont_use_other_pool = TRUE;
     }
+
     update_allocator = TRUE;
   } else {
     update_allocator = FALSE;
@@ -689,6 +697,8 @@ gst_va_compositor_decide_allocation (GstAggregator * agg, GstQuery * query)
             "may need other pool for copy frames %" GST_PTR_FORMAT, pool);
         other_pool = pool;
         pool = NULL;
+      } else if (dont_use_other_pool) {
+        gst_clear_object (&pool);
       }
     }
 
@@ -911,7 +921,8 @@ _try_import_buffer (GstVaCompositor * self, GstVideoInfo * info,
   gboolean ret;
 
   surface = gst_va_buffer_get_surface (inbuf);
-  if (surface != VA_INVALID_ID)
+  if (surface != VA_INVALID_ID &&
+      (gst_va_buffer_peek_display (inbuf) == self->display))
     return TRUE;
 
   g_rec_mutex_lock (&GST_VA_SHARED_LOCK);