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