hc
2023-02-18 a08c8b75ee83d7f62c9aefc23bfb42082aa4076c
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
From eb2f635e4abf76b1438260cfb299a0507e08b5e4 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Thu, 20 Jun 2019 10:32:04 +0800
Subject: [PATCH] tsmf: gstreamer: X11: Fix wrong render x/y
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 channels/tsmf/client/gstreamer/tsmf_X11.c       | 18 ++++++++++++++----
 channels/tsmf/client/gstreamer/tsmf_gstreamer.c | 11 +++++++++++
 channels/tsmf/client/gstreamer/tsmf_platform.h  |  1 +
 3 files changed, 26 insertions(+), 4 deletions(-)
 
diff --git a/channels/tsmf/client/gstreamer/tsmf_X11.c b/channels/tsmf/client/gstreamer/tsmf_X11.c
index b57b927..fb9fd3b 100644
--- a/channels/tsmf/client/gstreamer/tsmf_X11.c
+++ b/channels/tsmf/client/gstreamer/tsmf_X11.c
@@ -96,6 +96,8 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus *bus, GstMessage *m
 
     TSMFGstreamerDecoder* decoder = user_data;
 
+    int renderX, renderY;
+
     if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
         return GST_BUS_PASS;
 
@@ -111,6 +113,9 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus *bus, GstMessage *m
 
     if (hdl->subwin)
     {
+        renderX = decoder->gstWindowless ? hdl->subwinX : 0;
+        renderY = decoder->gstWindowless ? hdl->subwinY : 0;
+
 #if GST_VERSION_MAJOR > 0
         hdl->overlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
         gst_video_overlay_set_window_handle(hdl->overlay, hdl->subwin);
@@ -128,14 +133,14 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus *bus, GstMessage *m
         if (hdl->subwinWidth != -1 && hdl->subwinHeight != -1 && hdl->subwinX != -1 && hdl->subwinY != -1)
         {
 #if GST_VERSION_MAJOR > 0
-            if (!gst_video_overlay_set_render_rectangle(hdl->overlay, 0, 0, hdl->subwinWidth, hdl->subwinHeight))
+            if (!gst_video_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, hdl->subwinWidth, hdl->subwinHeight))
             {
                 WLog_ERR(TAG, "Could not resize overlay!");
             }
 
             gst_video_overlay_expose(hdl->overlay);
 #else
-            if (!gst_x_overlay_set_render_rectangle(hdl->overlay, 0, 0, hdl->subwinWidth, hdl->subwinHeight))
+            if (!gst_x_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, hdl->subwinWidth, hdl->subwinHeight))
             {
                 WLog_ERR(TAG, "Could not resize overlay!");
             }
@@ -328,6 +333,8 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width,
 {
     struct X11Handle* hdl;
 
+    int renderX, renderY;
+
     if (!decoder)
         return -1;
 
@@ -339,6 +346,9 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width,
     if (!decoder->platform)
         return -1;
 
+    renderX = decoder->gstWindowless ? x : 0;
+    renderY = decoder->gstWindowless ? y : 0;
+
     hdl = (struct X11Handle*) decoder->platform;
     DEBUG_TSMF("resize: x=%d, y=%d, w=%d, h=%d", x, y, width, height);
 
@@ -346,14 +356,14 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width,
     {
 #if GST_VERSION_MAJOR > 0
 
-        if (!gst_video_overlay_set_render_rectangle(hdl->overlay, 0, 0, width, height))
+        if (!gst_video_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, width, height))
         {
             WLog_ERR(TAG, "Could not resize overlay!");
         }
 
         gst_video_overlay_expose(hdl->overlay);
 #else
-        if (!gst_x_overlay_set_render_rectangle(hdl->overlay, 0, 0, width, height))
+        if (!gst_x_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, width, height))
         {
             WLog_ERR(TAG, "Could not resize overlay!");
         }
diff --git a/channels/tsmf/client/gstreamer/tsmf_gstreamer.c b/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
index 0addbe7..5ee1601 100644
--- a/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
+++ b/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
@@ -78,10 +78,17 @@ const char* get_type(TSMFGstreamerDecoder* mdecoder)
     }
 }
 
+#if GST_VERSION_MAJOR > 0
+static void cb_child_added(GstChildProxy *child_proxy, GObject *object, const char* name, TSMFGstreamerDecoder* mdecoder)
+#else
 static void cb_child_added(GstChildProxy *child_proxy, GObject *object, TSMFGstreamerDecoder* mdecoder)
+#endif
 {
     DEBUG_TSMF("NAME: %s", G_OBJECT_TYPE_NAME(object));
 
+    if (!g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstKMSSink"))
+        mdecoder->gstWindowless = TRUE;
+
     if (!g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstXvImageSink") || !g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstXImageSink") || !g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstFluVAAutoSink"))
     {
         gst_base_sink_set_max_lateness((GstBaseSink *) object, 10000000); /* nanoseconds */
@@ -650,6 +657,9 @@ BOOL tsmf_gstreamer_pipeline_build(TSMFGstreamerDecoder* mdecoder)
     g_object_set(G_OBJECT(mdecoder->queue), "max-size-bytes", 0, NULL);
     g_object_set(G_OBJECT(mdecoder->queue), "max-size-time", (guint64) 0, NULL);
 
+    if (!g_strcmp0(G_OBJECT_TYPE_NAME(mdecoder->outsink), "GstKMSSink"))
+        mdecoder->gstWindowless = TRUE;
+
     /* Only set these properties if not an autosink, otherwise we will set properties when real sinks are added */
     if (!g_strcmp0(G_OBJECT_TYPE_NAME(mdecoder->outsink), "GstAutoVideoSink") && !g_strcmp0(G_OBJECT_TYPE_NAME(mdecoder->outsink), "GstAutoAudioSink"))
     {
@@ -1056,6 +1066,7 @@ ITSMFDecoder* freerdp_tsmf_client_subsystem_entry(void)
     decoder->iface.BufferLevel = tsmf_gstreamer_buffer_level;
     decoder->iface.SetAckFunc = tsmf_gstreamer_ack;
     decoder->iface.SetSyncFunc = tsmf_gstreamer_sync;
+    decoder->gstWindowless = FALSE;
     decoder->paused = FALSE;
     decoder->gstVolume = 0.5;
     decoder->gstMuted = FALSE;
diff --git a/channels/tsmf/client/gstreamer/tsmf_platform.h b/channels/tsmf/client/gstreamer/tsmf_platform.h
index 7fb6be1..460ac12 100644
--- a/channels/tsmf/client/gstreamer/tsmf_platform.h
+++ b/channels/tsmf/client/gstreamer/tsmf_platform.h
@@ -41,6 +41,7 @@ typedef struct _TSMFGstreamerDecoder
     GstElement *queue;
     GstElement *outsink;
     GstElement *volume;
+    BOOL gstWindowless;
 
     BOOL ready;
     BOOL paused;
-- 
2.11.0