[spice-gtk,v3] streaming: make draw-area visible on MJPEG encoder creation

Submitted by Kevin Pouget on Sept. 2, 2019, 3:50 p.m.

Details

Message ID 20190902155002.18766-1-kpouget@redhat.com
State New
Headers show
Series "streaming: make draw-area visible on MJPEG encoder creation" ( rev: 3 ) in Spice

Not browsing as part of any series.

Commit Message

Kevin Pouget Sept. 2, 2019, 3:50 p.m.
This patch allows the MJPEG encoder to inform the spice-widget that
its video drawing area (draw-area) should be made visible on screen.

This is required to switch from GST video decoding to native MJPEG
decoding, otherwise the gst-area remained on top and the MJPEG video
stream was never shown.

Signed-off-by: Kevin Pouget <kpouget@redhat.com>
---
v2 -> v3: address Snir comments:

- comment about NULL in the signal description
- move 'if (pipeline_ptr == NULL) ...' outside  of 'if defined(GDK_WINDOWING_X11)'

regarding EGL note, it might be something like this:

> gtk_stack_set_visible_child_name(d->stack, egl_enabled(d) ?
>                                            "gl-area" : "draw-area");

but it's just a wild guess!

---
 src/channel-display-mjpeg.c |  3 +++
 src/channel-display.c       |  4 +++-
 src/spice-widget.c          | 11 +++++++++--
 3 files changed, 15 insertions(+), 3 deletions(-)

2.21.0

Patch hide | download patch | download mbox

diff --git a/src/channel-display-mjpeg.c b/src/channel-display-mjpeg.c
index 647d31b..636a98b 100644
--- a/src/channel-display-mjpeg.c
+++ b/src/channel-display-mjpeg.c
@@ -300,5 +300,8 @@  VideoDecoder* create_mjpeg_decoder(int codec_type, display_stream *stream)

     /* All the other fields are initialized to zero by g_new0(). */

+    /* makes the draw-area visible */
+    hand_pipeline_to_widget(stream, NULL);
+
     return (VideoDecoder*)decoder;
 }
diff --git a/src/channel-display.c b/src/channel-display.c
index 59c809d..cd87c7c 100644
--- a/src/channel-display.c
+++ b/src/channel-display.c
@@ -485,7 +485,9 @@  static void spice_display_channel_class_init(SpiceDisplayChannelClass *klass)
      *
      * The #SpiceDisplayChannel::gst-video-overlay signal is emitted when
      * pipeline is ready and can be passed to widget to register GStreamer
-     * overlay interface and other GStreamer callbacks.
+     * overlay interface and other GStreamer callbacks. If the pipeline
+     * pointer is NULL, the drawing area of the native renderer is set
+     * visible.
      *
      * Returns: %TRUE if the overlay is being set
      *
diff --git a/src/spice-widget.c b/src/spice-widget.c
index a9ba1f1..d73e02f 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -2780,14 +2780,20 @@  static void gst_size_allocate(GtkWidget *widget, GdkRectangle *a, gpointer data)
 }

 /* This callback should pass to the widget a pointer of the pipeline
- * so that we can set pipeline and overlay related calls from here.
+ * so that we can the set GST pipeline and overlay related calls from
+ * here.  If the pipeline pointer is NULL, the drawing area of the
+ * native renderer is set visible.
  */
 static gboolean set_overlay(SpiceChannel *channel, void* pipeline_ptr, SpiceDisplay *display)
 {
-#if defined(GDK_WINDOWING_X11)
     SpiceDisplayPrivate *d = display->priv;

+    if (pipeline_ptr == NULLg0) {
+        gtk_stack_set_visible_child_name(d->stack, "draw-area");
+        return true;
+    }
+
+#if defined(GDK_WINDOWING_X11)
     /* GstVideoOverlay is currently used only under x */
     if (!g_getenv("DISABLE_GSTVIDEOOVERLAY") &&
         GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
--

Comments

Hi,

On 9/2/19 6:50 PM, Kevin Pouget wrote:
> This patch allows the MJPEG encoder to inform the spice-widget that
> its video drawing area (draw-area) should be made visible on screen.
>
> This is required to switch from GST video decoding to native MJPEG
> decoding, otherwise the gst-area remained on top and the MJPEG video
> stream was never shown.
>
> Signed-off-by: Kevin Pouget <kpouget@redhat.com>
> ---
> v2 -> v3: address Snir comments:
>
> - comment about NULL in the signal description
> - move 'if (pipeline_ptr == NULL) ...' outside  of 'if defined(GDK_WINDOWING_X11)'
>
> regarding EGL note, it might be something like this:
>
>> gtk_stack_set_visible_child_name(d->stack, egl_enabled(d) ?
>>                                             "gl-area" : "draw-area");


Yes, but AFAIU this should never happen

So I'll ack also without it.

Snir.

> but it's just a wild guess!
>
> ---
>   src/channel-display-mjpeg.c |  3 +++
>   src/channel-display.c       |  4 +++-
>   src/spice-widget.c          | 11 +++++++++--
>   3 files changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/src/channel-display-mjpeg.c b/src/channel-display-mjpeg.c
> index 647d31b..636a98b 100644
> --- a/src/channel-display-mjpeg.c
> +++ b/src/channel-display-mjpeg.c
> @@ -300,5 +300,8 @@ VideoDecoder* create_mjpeg_decoder(int codec_type, display_stream *stream)
>
>       /* All the other fields are initialized to zero by g_new0(). */
>
> +    /* makes the draw-area visible */
> +    hand_pipeline_to_widget(stream, NULL);
> +
>       return (VideoDecoder*)decoder;
>   }
> diff --git a/src/channel-display.c b/src/channel-display.c
> index 59c809d..cd87c7c 100644
> --- a/src/channel-display.c
> +++ b/src/channel-display.c
> @@ -485,7 +485,9 @@ static void spice_display_channel_class_init(SpiceDisplayChannelClass *klass)
>        *
>        * The #SpiceDisplayChannel::gst-video-overlay signal is emitted when
>        * pipeline is ready and can be passed to widget to register GStreamer
> -     * overlay interface and other GStreamer callbacks.
> +     * overlay interface and other GStreamer callbacks. If the pipeline
> +     * pointer is NULL, the drawing area of the native renderer is set
> +     * visible.
>        *
>        * Returns: %TRUE if the overlay is being set
>        *
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index a9ba1f1..d73e02f 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -2780,14 +2780,20 @@ static void gst_size_allocate(GtkWidget *widget, GdkRectangle *a, gpointer data)
>   }
>
>   /* This callback should pass to the widget a pointer of the pipeline
> - * so that we can set pipeline and overlay related calls from here.
> + * so that we can the set GST pipeline and overlay related calls from
> + * here.  If the pipeline pointer is NULL, the drawing area of the
> + * native renderer is set visible.
>    */
>   static gboolean set_overlay(SpiceChannel *channel, void* pipeline_ptr, SpiceDisplay *display)
>   {
> -#if defined(GDK_WINDOWING_X11)
>       SpiceDisplayPrivate *d = display->priv;
>
> +    if (pipeline_ptr == NULLg0) {
> +        gtk_stack_set_visible_child_name(d->stack, "draw-area");
> +        return true;
> +    }
> +
> +#if defined(GDK_WINDOWING_X11)
>       /* GstVideoOverlay is currently used only under x */
>       if (!g_getenv("DISABLE_GSTVIDEOOVERLAY") &&
>           GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
> --
> 2.21.0
> _______________________________________________
> Spice-devel mailing list
> Spice-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel