1From 8a6691696ff6d98cfe31f47122b1da9addb9f73c Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Tue, 25 Dec 2018 16:20:35 +0800 4Subject: [PATCH 07/33] waylandsink: Enable changing window handle 5 6Changing window handle is dangerous, but we need this feature for: 7https://redmine.rockchip.com.cn/issues/184629 8 9Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10--- 11 ext/wayland/gstwaylandsink.c | 22 ++++++++++++++++------ 12 ext/wayland/gstwaylandsink.h | 2 ++ 13 2 files changed, 18 insertions(+), 6 deletions(-) 14 15diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c 16index ff8a7f5..9e55e4f 100644 17--- a/ext/wayland/gstwaylandsink.c 18+++ b/ext/wayland/gstwaylandsink.c 19@@ -675,9 +675,10 @@ render_last_buffer (GstWaylandSink * sink, gboolean redraw) 20 sink->callback = callback; 21 wl_callback_add_listener (callback, &frame_callback_listener, sink); 22 23- if (G_UNLIKELY (sink->video_info_changed && !redraw)) { 24+ if (G_UNLIKELY ((sink->video_info_changed && !redraw) || sink->resend_info)) { 25 info = &sink->video_info; 26 sink->video_info_changed = FALSE; 27+ sink->resend_info = FALSE; 28 } 29 gst_wl_window_render (sink->window, wlbuffer, info); 30 } 31@@ -941,18 +942,21 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle) 32 33 g_return_if_fail (sink != NULL); 34 35- if (sink->window != NULL) { 36- GST_WARNING_OBJECT (sink, "changing window handle is not supported"); 37+ if (sink->window_handle == handle) 38 return; 39- } 40+ 41+ sink->window_handle = handle; 42 43 g_mutex_lock (&sink->render_lock); 44 45+ if (sink->window != NULL) { 46+ GST_WARNING_OBJECT (sink, "changing window handle is dangerous"); 47+ g_clear_object (&sink->window); 48+ } 49+ 50 GST_DEBUG_OBJECT (sink, "Setting window handle %" GST_PTR_FORMAT, 51 (void *) handle); 52 53- g_clear_object (&sink->window); 54- 55 if (handle) { 56 if (G_LIKELY (gst_wayland_sink_find_display (sink))) { 57 /* we cannot use our own display with an external window handle */ 58@@ -965,6 +969,12 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle) 59 } else { 60 sink->window = gst_wl_window_new_in_surface (sink->display, surface, 61 &sink->render_lock); 62+ 63+ if (sink->last_buffer) { 64+ /* Resend video info to force resize video surface */ 65+ sink->resend_info = TRUE; 66+ sink->redraw_pending = FALSE; 67+ } 68 } 69 } else { 70 GST_ERROR_OBJECT (sink, "Failed to find display handle, " 71diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h 72index 7aabb6f..1c5fb07 100644 73--- a/ext/wayland/gstwaylandsink.h 74+++ b/ext/wayland/gstwaylandsink.h 75@@ -57,6 +57,7 @@ struct _GstWaylandSink 76 GstWlWindow *window; 77 GstBufferPool *pool; 78 gboolean use_dmabuf; 79+ guintptr window_handle; 80 81 gboolean video_info_changed; 82 GstVideoInfo video_info; 83@@ -64,6 +65,7 @@ struct _GstWaylandSink 84 85 gchar *display_name; 86 87+ gboolean resend_info; 88 gboolean redraw_pending; 89 GMutex render_lock; 90 GstBuffer *last_buffer; 91-- 922.20.1 93 94