1From 72365798203c974bfde948a2dcccb5c181ba9b89 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Tue, 8 Jun 2021 09:09:38 +0800 4Subject: [PATCH 23/41] waylandsink: Use create_immed to create dmabuf 5 6The async creation has lots of issues when the device overloaded. 7 8Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9--- 10 gst-libs/gst/wayland/gstwldisplay.c | 2 +- 11 gst-libs/gst/wayland/gstwllinuxdmabuf.c | 60 ++----------------------- 12 2 files changed, 5 insertions(+), 57 deletions(-) 13 14diff --git a/gst-libs/gst/wayland/gstwldisplay.c b/gst-libs/gst/wayland/gstwldisplay.c 15index 1f83cb2..71a5dde 100644 16--- a/gst-libs/gst/wayland/gstwldisplay.c 17+++ b/gst-libs/gst/wayland/gstwldisplay.c 18@@ -277,7 +277,7 @@ registry_handle_global (void *data, struct wl_registry *registry, 19 wl_registry_bind (registry, id, &wp_viewporter_interface, 1); 20 } else if (g_strcmp0 (interface, "zwp_linux_dmabuf_v1") == 0) { 21 priv->dmabuf = 22- wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 1); 23+ wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 2); 24 zwp_linux_dmabuf_v1_add_listener (priv->dmabuf, &dmabuf_listener, self); 25 } 26 } 27diff --git a/gst-libs/gst/wayland/gstwllinuxdmabuf.c b/gst-libs/gst/wayland/gstwllinuxdmabuf.c 28index d6ee6ec..2d5bb6b 100644 29--- a/gst-libs/gst/wayland/gstwllinuxdmabuf.c 30+++ b/gst-libs/gst/wayland/gstwllinuxdmabuf.c 31@@ -46,41 +46,9 @@ gst_wl_linux_dmabuf_init_once (void) 32 33 typedef struct 34 { 35- GMutex lock; 36- GCond cond; 37 struct wl_buffer *wbuf; 38 } ConstructBufferData; 39 40-static void 41-create_succeeded (void *data, struct zwp_linux_buffer_params_v1 *params, 42- struct wl_buffer *new_buffer) 43-{ 44- ConstructBufferData *d = data; 45- 46- g_mutex_lock (&d->lock); 47- d->wbuf = new_buffer; 48- zwp_linux_buffer_params_v1_destroy (params); 49- g_cond_signal (&d->cond); 50- g_mutex_unlock (&d->lock); 51-} 52- 53-static void 54-create_failed (void *data, struct zwp_linux_buffer_params_v1 *params) 55-{ 56- ConstructBufferData *d = data; 57- 58- g_mutex_lock (&d->lock); 59- d->wbuf = NULL; 60- zwp_linux_buffer_params_v1_destroy (params); 61- g_cond_signal (&d->cond); 62- g_mutex_unlock (&d->lock); 63-} 64- 65-static const struct zwp_linux_buffer_params_v1_listener params_listener = { 66- create_succeeded, 67- create_failed 68-}; 69- 70 struct wl_buffer * 71 gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 72 GstWlDisplay * display, const GstVideoInfo * info) 73@@ -90,7 +58,6 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 74 guint i, width, height; 75 guint nplanes, flags = 0; 76 struct zwp_linux_buffer_params_v1 *params; 77- gint64 timeout; 78 ConstructBufferData data; 79 80 g_return_val_if_fail (gst_wl_display_check_format_for_dmabuf (display, 81@@ -99,10 +66,6 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 82 mem = gst_buffer_peek_memory (buf, 0); 83 format = gst_video_format_to_wl_dmabuf_format (GST_VIDEO_INFO_FORMAT (info)); 84 85- g_cond_init (&data.cond); 86- g_mutex_init (&data.lock); 87- g_mutex_lock (&data.lock); 88- 89 width = GST_VIDEO_INFO_WIDTH (info); 90 height = GST_VIDEO_INFO_HEIGHT (info); 91 nplanes = GST_VIDEO_INFO_N_PLANES (info); 92@@ -145,21 +108,10 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 93 } 94 } 95 96- /* Request buffer creation */ 97- zwp_linux_buffer_params_v1_add_listener (params, ¶ms_listener, &data); 98- zwp_linux_buffer_params_v1_create (params, width, height, format, flags); 99- 100- /* Wait for the request answer */ 101- wl_display_flush (gst_wl_display_get_display (display)); 102- data.wbuf = (gpointer) 0x1; 103- timeout = g_get_monotonic_time () + G_TIME_SPAN_SECOND; 104- while (data.wbuf == (gpointer) 0x1) { 105- if (!g_cond_wait_until (&data.cond, &data.lock, timeout)) { 106- GST_ERROR_OBJECT (mem->allocator, "zwp_linux_buffer_params_v1 time out"); 107- zwp_linux_buffer_params_v1_destroy (params); 108- data.wbuf = NULL; 109- } 110- } 111+ data.wbuf = 112+ zwp_linux_buffer_params_v1_create_immed (params, width, height, format, 113+ flags); 114+ zwp_linux_buffer_params_v1_destroy (params); 115 116 out: 117 if (!data.wbuf) { 118@@ -170,9 +122,5 @@ out: 119 data.wbuf, width, height, (char *) &format, nplanes); 120 } 121 122- g_mutex_unlock (&data.lock); 123- g_mutex_clear (&data.lock); 124- g_cond_clear (&data.cond); 125- 126 return data.wbuf; 127 } 128-- 1292.20.1 130 131