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