From 8a6691696ff6d98cfe31f47122b1da9addb9f73c Mon Sep 17 00:00:00 2001 From: Jeffy Chen 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 --- 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