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