gstwaylandsink: "hide" video window when pipeline is stopped
Nicolas Dufresne
nicolas at ndufresne.ca
Wed Jan 22 20:47:30 UTC 2020
Le mercredi 22 janvier 2020 à 18:36 +0100, Guillermo Rodriguez Garcia a écrit :
> Hello all,
>
> I am using gstwaylandsink to render to an application supplied surface
> (via the GstVideoOverlay interface). I need to control the position of
> the video window, so the application creates a top-level, fully
> transparent surface with the same size as the screen, then I use
> set_render_rectangle to tell waylandsink where the video should
> actually be drawn. This is working fine.
>
> My problem is that when the pipeline is stopped (state set to NULL),
> the video area is cleared to black, and stays on top of the
> controlling application. I would need the video area to be "hidden"
> instead (i.e. removed from the composition).
>
> The thing is that looking at the code it seems that this (hiding the
> window) was actually the intended behaviour. Pipeline state changes
> are handled in gst_wayland_sink_change_state [1]. For the PAUSED to
> READY transition, the code looks like this:
>
> case GST_STATE_CHANGE_PAUSED_TO_READY:
> gst_buffer_replace (&sink->last_buffer, NULL);
> if (sink->window) {
> if (gst_wl_window_is_toplevel (sink->window)) {
> g_clear_object (&sink->window);
> } else {
> /* remove buffer from surface, show nothing */
> gst_wl_window_render (sink->window, NULL, NULL);
> }
> }
>
> In my case, sink->window is not a toplevel, so the 'else' branch runs.
>
> gst_wl_window_render does a wl_surface_attach with a NULL buffer +
> wl_surface_commit, which should actually "hide" the window. Yet for
> some reason this is not what is happening.
>
> I am probably missing something; any ideas or hints?
Indeed, I would expect exactly what you want to happen. Which compositor is
this?
>
> Thank you,
>
> [1]
> https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/blob/master/ext/wayland/gstwaylandsink.c#L376
>
More information about the gstreamer-devel
mailing list