qsv: Fix encoding error when input memory belongs to other GPU
authorSeungha Yang <seungha@centricular.com>
Fri, 4 Nov 2022 15:00:43 +0000 (00:00 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 5 Nov 2022 13:59:45 +0000 (13:59 +0000)
Copy frame if VA display of input buffer is different from that
of encoder, like we've been doing on Windows

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

subprojects/gst-plugins-bad/sys/qsv/gstqsvallocator_va.cpp

index e30e537..31159d4 100644 (file)
@@ -87,15 +87,17 @@ static GstBuffer *
 gst_qsv_va_allocator_upload (GstQsvAllocator * allocator,
     const GstVideoInfo * info, GstBuffer * buffer, GstBufferPool * pool)
 {
+  GstQsvVaAllocator *self = GST_QSV_VA_ALLOCATOR (allocator);
   GstVideoFrame src_frame, dst_frame;
   VASurfaceID surface;
   GstBuffer *dst_buf;
   GstFlowReturn ret;
 
-  /* TODO: handle buffer from different VA display */
   surface = gst_va_buffer_get_surface (buffer);
-  if (surface != VA_INVALID_ID)
+  if (surface != VA_INVALID_ID && gst_va_buffer_peek_display (buffer) ==
+      self->display) {
     return gst_buffer_ref (buffer);
+  }
 
   ret = gst_buffer_pool_acquire_buffer (pool, &dst_buf, nullptr);
   if (ret != GST_FLOW_OK) {