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