[Spice-devel] [PATCH spice-gtk 2/3] fixup! Gstreamer: Control GstVideoOverlay from the widget
Frediano Ziglio
fziglio at redhat.com
Mon Dec 17 09:51:01 UTC 2018
---
src/channel-display.c | 2 ++
src/spice-widget-priv.h | 3 +--
src/spice-widget.c | 51 ++++++++++++++++-------------------------
3 files changed, 23 insertions(+), 33 deletions(-)
diff --git a/src/channel-display.c b/src/channel-display.c
index 6b6a172c..e63fb3bb 100644
--- a/src/channel-display.c
+++ b/src/channel-display.c
@@ -29,7 +29,9 @@
#include "spice-session-priv.h"
#include "channel-display-priv.h"
#include "decode.h"
+#ifdef HAVE_GSTVIDEO
#include "gst/gst.h"
+#endif
/**
* SECTION:channel-display
diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h
index 651d306e..0264577d 100644
--- a/src/spice-widget-priv.h
+++ b/src/spice-widget-priv.h
@@ -154,8 +154,7 @@ struct _SpiceDisplayPrivate {
#endif // HAVE_EGL
double scroll_delta_y;
#ifdef HAVE_GSTVIDEO
- GWeakRef overlay_element_weak_ref;
- GstPipeline *pipeline;
+ GWeakRef overlay_weak_ref;
#endif
};
diff --git a/src/spice-widget.c b/src/spice-widget.c
index ae834204..e78fab4c 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -2119,14 +2119,12 @@ static void unrealize(GtkWidget *widget)
spice_cairo_image_destroy(display);
#if HAVE_EGL
- if (display->priv->egl.context_ready)
+ if (display->priv->egl.context_ready) {
spice_egl_unrealize_display(display);
+ }
#endif
#ifdef HAVE_GSTVIDEO
- SpiceDisplayPrivate *d = display->priv;
-
- g_weak_ref_set(&d->overlay_element_weak_ref, NULL);
- g_clear_weak_pointer(&d->pipeline);
+ g_weak_ref_set(&display->priv->overlay_weak_ref, NULL);
#endif
GTK_WIDGET_CLASS(spice_display_parent_class)->unrealize(widget);
@@ -2556,27 +2554,23 @@ static void queue_draw_area(SpiceDisplay *display, gint x, gint y,
}
#if defined(HAVE_GSTVIDEO) && defined(GDK_WINDOWING_X11)
-static void gst_sync_bus_call(GstBus *bus, GstMessage *msg, gpointer data)
+static void gst_sync_bus_call(GstBus *bus, GstMessage *msg, SpiceDisplay *display)
{
switch(GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_ELEMENT: {
- if (gst_is_video_overlay_prepare_window_handle_message(msg)) {
- if (!g_getenv("DISABLE_GSTVIDEOOVERLAY") &&
- GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
- SpiceDisplay *display = data;
- GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(display));
-
- if (window && gdk_window_ensure_native(window)) {
- SpiceDisplayPrivate *d = display->priv;
- GstElement *overlay_element;
-
- g_weak_ref_set(&d->overlay_element_weak_ref, GST_ELEMENT(GST_MESSAGE_SRC(msg)));
- overlay_element = g_weak_ref_get(&d->overlay_element_weak_ref);
- gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(overlay_element), (uintptr_t)GDK_WINDOW_XID(window));
- gst_video_overlay_handle_events(GST_VIDEO_OVERLAY(overlay_element), false);
- gst_object_unref(overlay_element);
- return;
- }
+ if (gst_is_video_overlay_prepare_window_handle_message(msg) &&
+ !g_getenv("DISABLE_GSTVIDEOOVERLAY") &&
+ GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+ GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(display));
+
+ if (window && gdk_window_ensure_native(window)) {
+ SpiceDisplayPrivate *d = display->priv;
+
+ GstVideoOverlay *overlay = GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(msg));
+ g_weak_ref_set(&d->overlay_weak_ref, overlay);
+ gst_video_overlay_set_window_handle(overlay, (uintptr_t)GDK_WINDOW_XID(window));
+ gst_video_overlay_handle_events(overlay, false);
+ return;
}
}
break;
@@ -2588,15 +2582,12 @@ static void gst_sync_bus_call(GstBus *bus, GstMessage *msg, gpointer data)
}
#endif
-{
-#ifdef GDK_WINDOWING_X11
/* This callback should pass to the widget a pointer of the pipeline
* so that we can set pipeline and overlay related calls from here.
*/
-static gboolean set_overlay(SpiceChannel *channel, void* pipeline_ptr, gpointer data)
+static gboolean set_overlay(SpiceChannel *channel, void* pipeline_ptr, SpiceDisplay *display)
{
#if defined(HAVE_GSTVIDEO) && defined(GDK_WINDOWING_X11)
- SpiceDisplay *display = data;
SpiceDisplayPrivate *d = display->priv;
/* GstVideoOverlay is currently used only under x */
@@ -2609,11 +2600,9 @@ static gboolean set_overlay(SpiceChannel *channel, void* pipeline_ptr, gpointer
GstBus *bus;
gtk_stack_set_visible_child_name(d->stack, "gst-area");
- d->pipeline = pipeline_ptr;
- g_object_add_weak_pointer(pipeline_ptr, (gpointer*)&(d->pipeline)); // Taking a weak ref although pipeline is not used again
- bus = gst_pipeline_get_bus(GST_PIPELINE(d->pipeline));
+ bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline_ptr));
gst_bus_enable_sync_message_emission(bus);
- g_signal_connect (bus, "sync-message", G_CALLBACK (gst_sync_bus_call), data);
+ g_signal_connect(bus, "sync-message", G_CALLBACK(gst_sync_bus_call), display);
gst_object_unref(bus);
return true;
}
--
2.17.2
More information about the Spice-devel
mailing list