hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
From 0153720bff9351ed37985dff762f7f564365a265 Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Date: Thu, 16 Sep 2021 17:12:58 -0400
Subject: [PATCH 04/40] 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>
(cherry picked from commit afa1c19b37882a165fc0327ac103851edb95f7ec)
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 ext/wayland/gstwaylandsink.c |  7 ++++---
 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 1c74147..6b9019c 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -827,7 +827,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,
@@ -851,12 +851,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 0739bda..caab58d 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;
 }
 
-- 
2.17.1