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