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