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