From afa1c19b37882a165fc0327ac103851edb95f7ec Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 16 Sep 2021 17:12:58 -0400 Subject: 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: --- ext/wayland/gstwaylandsink.c | 7 ++++--- ext/wayland/wlbuffer.c | 12 ++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'ext') 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; } -- cgit v1.2.1