waylandsink: Fix double render check
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 16 Sep 2021 21:12:58 +0000 (17:12 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 17 Sep 2021 14:14:42 +0000 (14:14 +0000)
Our code does not support rendering twice the same wl_buffer in a row, so it
tries to skip that case, but for this it relied on the GstBuffer pointer,
while the cache actually works at the GstMemory level now. To avoid this
compare the GstWlBuffer instead.

This fixes crash when use in zero-copy with videorate element.

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

ext/wayland/gstwaylandsink.c
ext/wayland/wlbuffer.c

index 4fbb17c9badb2dfa900ae1190b2e09e75958979a..0761304ce3db05d4b63a70c0a4c64d2fd77d7494 100644 (file)
@@ -829,7 +829,7 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
         if (G_UNLIKELY (!wbuf))
           goto no_wl_buffer_shm;
 
-        gst_buffer_add_wl_buffer (to_render, wbuf, sink->display);
+        wlbuffer = gst_buffer_add_wl_buffer (to_render, wbuf, sink->display);
       }
 
       if (!gst_video_frame_map (&dst, &sink->video_info, to_render,
@@ -853,12 +853,13 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
   if (!wbuf)
     goto no_wl_buffer;
 
-  gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
+  wlbuffer = gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
   to_render = buffer;
 
 render:
   /* drop double rendering */
-  if (G_UNLIKELY (to_render == sink->last_buffer)) {
+  if (G_UNLIKELY (wlbuffer ==
+          gst_buffer_get_wl_buffer (sink->display, sink->last_buffer))) {
     GST_LOG_OBJECT (sink, "Buffer already being rendered");
     goto done;
   }
index 0739bdaf2c82b885b949fdd2958edd4fe1c3ad47..caab58d3524e70f4c65f2cc0a898307a172ebd49 100644 (file)
@@ -185,10 +185,18 @@ gst_buffer_add_wl_buffer (GstBuffer * gstbuffer, struct wl_buffer *wlbuffer,
 GstWlBuffer *
 gst_buffer_get_wl_buffer (GstWlDisplay * display, GstBuffer * gstbuffer)
 {
-  GstMemory *mem0 = gst_buffer_peek_memory (gstbuffer, 0);
-  GstWlBuffer *wlbuf = gst_wl_display_lookup_buffer (display, mem0);
+  GstMemory *mem0;
+  GstWlBuffer *wlbuf;
+
+  if (!gstbuffer)
+    return NULL;
+
+  mem0 = gst_buffer_peek_memory (gstbuffer, 0);
+
+  wlbuf = gst_wl_display_lookup_buffer (display, mem0);
   if (wlbuf)
     wlbuf->current_gstbuffer = gstbuffer;
+
   return wlbuf;
 }