1From 96ba65f77bce3d1470214438e74355b2282eafe7 Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Thu, 20 Jun 2019 10:32:04 +0800
4Subject: [PATCH 4/5] tsmf: gstreamer: X11: Fix wrong render x/y
5
6Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
7---
8 channels/tsmf/client/gstreamer/tsmf_X11.c      | 18 ++++++++++++++----
9 .../tsmf/client/gstreamer/tsmf_gstreamer.c     | 11 +++++++++++
10 channels/tsmf/client/gstreamer/tsmf_platform.h |  1 +
11 3 files changed, 26 insertions(+), 4 deletions(-)
12
13diff --git a/channels/tsmf/client/gstreamer/tsmf_X11.c b/channels/tsmf/client/gstreamer/tsmf_X11.c
14index ae383df..6028104 100644
15--- a/channels/tsmf/client/gstreamer/tsmf_X11.c
16+++ b/channels/tsmf/client/gstreamer/tsmf_X11.c
17@@ -97,6 +97,8 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus* bus, GstMessage* m
18
19 	TSMFGstreamerDecoder* decoder = user_data;
20
21+	int renderX, renderY;
22+
23 	if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_ELEMENT)
24 		return GST_BUS_PASS;
25
26@@ -112,6 +114,9 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus* bus, GstMessage* m
27
28 	if (hdl->subwin)
29 	{
30+		renderX = decoder->gstWindowless ? hdl->subwinX : 0;
31+		renderY = decoder->gstWindowless ? hdl->subwinY : 0;
32+
33 #if GST_VERSION_MAJOR > 0
34 		hdl->overlay = GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(message));
35 		gst_video_overlay_set_window_handle(hdl->overlay, hdl->subwin);
36@@ -130,7 +135,7 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus* bus, GstMessage* m
37 		    hdl->subwinY != -1)
38 		{
39 #if GST_VERSION_MAJOR > 0
40-			if (!gst_video_overlay_set_render_rectangle(hdl->overlay, 0, 0, hdl->subwinWidth,
41+			if (!gst_video_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, hdl->subwinWidth,
42 			                                            hdl->subwinHeight))
43 			{
44 				WLog_ERR(TAG, "Could not resize overlay!");
45@@ -138,7 +143,7 @@ static GstBusSyncReply tsmf_platform_bus_sync_handler(GstBus* bus, GstMessage* m
46
47 			gst_video_overlay_expose(hdl->overlay);
48 #else
49-			if (!gst_x_overlay_set_render_rectangle(hdl->overlay, 0, 0, hdl->subwinWidth,
50+			if (!gst_x_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, hdl->subwinWidth,
51 			                                        hdl->subwinHeight))
52 			{
53 				WLog_ERR(TAG, "Could not resize overlay!");
54@@ -335,6 +340,8 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width, i
55 {
56 	struct X11Handle* hdl;
57
58+	int renderX, renderY;
59+
60 	if (!decoder)
61 		return -1;
62
63@@ -346,6 +353,9 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width, i
64 	if (!decoder->platform)
65 		return -1;
66
67+	renderX = decoder->gstWindowless ? x : 0;
68+	renderY = decoder->gstWindowless ? y : 0;
69+
70 	hdl = (struct X11Handle*)decoder->platform;
71 	DEBUG_TSMF("resize: x=%d, y=%d, w=%d, h=%d", x, y, width, height);
72
73@@ -353,14 +363,14 @@ int tsmf_window_resize(TSMFGstreamerDecoder* decoder, int x, int y, int width, i
74 	{
75 #if GST_VERSION_MAJOR > 0
76
77-		if (!gst_video_overlay_set_render_rectangle(hdl->overlay, 0, 0, width, height))
78+		if (!gst_video_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, width, height))
79 		{
80 			WLog_ERR(TAG, "Could not resize overlay!");
81 		}
82
83 		gst_video_overlay_expose(hdl->overlay);
84 #else
85-		if (!gst_x_overlay_set_render_rectangle(hdl->overlay, 0, 0, width, height))
86+		if (!gst_x_overlay_set_render_rectangle(hdl->overlay, renderX, renderY, width, height))
87 		{
88 			WLog_ERR(TAG, "Could not resize overlay!");
89 		}
90diff --git a/channels/tsmf/client/gstreamer/tsmf_gstreamer.c b/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
91index 61ea6a8..2b39d46 100644
92--- a/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
93+++ b/channels/tsmf/client/gstreamer/tsmf_gstreamer.c
94@@ -78,11 +78,18 @@ static const char* get_type(TSMFGstreamerDecoder* mdecoder)
95 	}
96 }
97
98+#if GST_VERSION_MAJOR > 0
99+static void cb_child_added(GstChildProxy *child_proxy, GObject *object, const char* name, TSMFGstreamerDecoder* mdecoder)
100+#else
101 static void cb_child_added(GstChildProxy* child_proxy, GObject* object,
102                            TSMFGstreamerDecoder* mdecoder)
103+#endif
104 {
105 	DEBUG_TSMF("NAME: %s", G_OBJECT_TYPE_NAME(object));
106
107+	if (!g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstKMSSink"))
108+		mdecoder->gstWindowless = TRUE;
109+
110 	if (!g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstXvImageSink") ||
111 	    !g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstXImageSink") ||
112 	    !g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstFluVAAutoSink"))
113@@ -623,6 +630,9 @@ BOOL tsmf_gstreamer_pipeline_build(TSMFGstreamerDecoder* mdecoder)
114 	g_object_set(G_OBJECT(mdecoder->queue), "max-size-bytes", 0, NULL);
115 	g_object_set(G_OBJECT(mdecoder->queue), "max-size-time", (guint64)0, NULL);
116
117+	if (!g_strcmp0(G_OBJECT_TYPE_NAME(mdecoder->outsink), "GstKMSSink"))
118+		mdecoder->gstWindowless = TRUE;
119+
120 	/* Only set these properties if not an autosink, otherwise we will set properties when real
121 	 * sinks are added */
122 	if (!g_strcmp0(G_OBJECT_TYPE_NAME(mdecoder->outsink), "GstAutoVideoSink") &&
123@@ -1051,6 +1061,7 @@ ITSMFDecoder* freerdp_tsmf_client_subsystem_entry(void)
124 	decoder->iface.BufferLevel = tsmf_gstreamer_buffer_level;
125 	decoder->iface.SetAckFunc = tsmf_gstreamer_ack;
126 	decoder->iface.SetSyncFunc = tsmf_gstreamer_sync;
127+	decoder->gstWindowless = FALSE;
128 	decoder->paused = FALSE;
129 	decoder->gstVolume = 0.5;
130 	decoder->gstMuted = FALSE;
131diff --git a/channels/tsmf/client/gstreamer/tsmf_platform.h b/channels/tsmf/client/gstreamer/tsmf_platform.h
132index b6f0b33..9b6f778 100644
133--- a/channels/tsmf/client/gstreamer/tsmf_platform.h
134+++ b/channels/tsmf/client/gstreamer/tsmf_platform.h
135@@ -41,6 +41,7 @@ typedef struct _TSMFGstreamerDecoder
136 	GstElement* queue;
137 	GstElement* outsink;
138 	GstElement* volume;
139+	BOOL gstWindowless;
140
141 	BOOL ready;
142 	BOOL paused;
143--
1442.20.1
145
146