HYL_OK3568_LINUX/yocto/meta-rockchip/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.20/0007-waylandsink-Enable-changing-window-handle.patch
2025-05-10 21:49:39 +08:00

94 lines
3.0 KiB
Diff

From 8a6691696ff6d98cfe31f47122b1da9addb9f73c Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Tue, 25 Dec 2018 16:20:35 +0800
Subject: [PATCH 07/33] waylandsink: Enable changing window handle
Changing window handle is dangerous, but we need this feature for:
https://redmine.rockchip.com.cn/issues/184629
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
ext/wayland/gstwaylandsink.c | 22 ++++++++++++++++------
ext/wayland/gstwaylandsink.h | 2 ++
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index ff8a7f5..9e55e4f 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -675,9 +675,10 @@ render_last_buffer (GstWaylandSink * sink, gboolean redraw)
sink->callback = callback;
wl_callback_add_listener (callback, &frame_callback_listener, sink);
- if (G_UNLIKELY (sink->video_info_changed && !redraw)) {
+ if (G_UNLIKELY ((sink->video_info_changed && !redraw) || sink->resend_info)) {
info = &sink->video_info;
sink->video_info_changed = FALSE;
+ sink->resend_info = FALSE;
}
gst_wl_window_render (sink->window, wlbuffer, info);
}
@@ -941,18 +942,21 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle)
g_return_if_fail (sink != NULL);
- if (sink->window != NULL) {
- GST_WARNING_OBJECT (sink, "changing window handle is not supported");
+ if (sink->window_handle == handle)
return;
- }
+
+ sink->window_handle = handle;
g_mutex_lock (&sink->render_lock);
+ if (sink->window != NULL) {
+ GST_WARNING_OBJECT (sink, "changing window handle is dangerous");
+ g_clear_object (&sink->window);
+ }
+
GST_DEBUG_OBJECT (sink, "Setting window handle %" GST_PTR_FORMAT,
(void *) handle);
- g_clear_object (&sink->window);
-
if (handle) {
if (G_LIKELY (gst_wayland_sink_find_display (sink))) {
/* we cannot use our own display with an external window handle */
@@ -965,6 +969,12 @@ gst_wayland_sink_set_window_handle (GstVideoOverlay * overlay, guintptr handle)
} else {
sink->window = gst_wl_window_new_in_surface (sink->display, surface,
&sink->render_lock);
+
+ if (sink->last_buffer) {
+ /* Resend video info to force resize video surface */
+ sink->resend_info = TRUE;
+ sink->redraw_pending = FALSE;
+ }
}
} else {
GST_ERROR_OBJECT (sink, "Failed to find display handle, "
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
index 7aabb6f..1c5fb07 100644
--- a/ext/wayland/gstwaylandsink.h
+++ b/ext/wayland/gstwaylandsink.h
@@ -57,6 +57,7 @@ struct _GstWaylandSink
GstWlWindow *window;
GstBufferPool *pool;
gboolean use_dmabuf;
+ guintptr window_handle;
gboolean video_info_changed;
GstVideoInfo video_info;
@@ -64,6 +65,7 @@ struct _GstWaylandSink
gchar *display_name;
+ gboolean resend_info;
gboolean redraw_pending;
GMutex render_lock;
GstBuffer *last_buffer;
--
2.20.1