summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2021-09-16 17:12:58 -0400
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-09-17 14:14:42 +0000
commitafa1c19b37882a165fc0327ac103851edb95f7ec (patch)
tree0c2ea7e0e0b1b7d1bc17884e39c0567baf68f37e
parentf51371d7b9b628b95e635d45d44345c7de2dd20f (diff)
waylandsink: Fix double render check
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>
-rw-r--r--ext/wayland/gstwaylandsink.c7
-rw-r--r--ext/wayland/wlbuffer.c12
2 files changed, 14 insertions, 5 deletions
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index 4fbb17c9b..0761304ce 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -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;
}
diff --git a/ext/wayland/wlbuffer.c b/ext/wayland/wlbuffer.c
index 0739bdaf2..caab58d35 100644
--- a/ext/wayland/wlbuffer.c
+++ b/ext/wayland/wlbuffer.c
@@ -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;
}