diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2021-09-16 17:12:58 -0400 |
---|---|---|
committer | GStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2021-09-17 14:14:42 +0000 |
commit | afa1c19b37882a165fc0327ac103851edb95f7ec (patch) | |
tree | 0c2ea7e0e0b1b7d1bc17884e39c0567baf68f37e | |
parent | f51371d7b9b628b95e635d45d44345c7de2dd20f (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.c | 7 | ||||
-rw-r--r-- | ext/wayland/wlbuffer.c | 12 |
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; } |