linuxOS_AP05/buildroot/package/freerdp/0002-tsmf-gstreamer-X11-Fix-wrong-render-x-y.patch
2025-06-02 13:59:07 +08:00

144 lines
5.7 KiB
Diff

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