[Spice-devel] [PATCH spice-gtk 2/3] fixup! Gstreamer: Control GstVideoOverlay from the widget

Snir Sheriber ssheribe at redhat.com
Mon Dec 17 10:43:05 UTC 2018


Hi,

On 12/17/18 11:51 AM, Frediano Ziglio wrote:
> ---
>   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;


The indentation is wrong in previous line, see attached patch


>   #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


Something went wrong with my split, I think these two should removed in 
previous patch
otherwise it won't apply if you checkout there.


Other than that I'm fine with the changes.

Thanks


>   /* 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;
>           }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-spice-widget-priv-Fix-indentation.patch
Type: text/x-patch
Size: 2735 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20181217/418e39ab/attachment-0001.bin>


More information about the Spice-devel mailing list