glimagesink: add property to request full screen window Only affects windows created internally, externally created windows (i.e. windows created and owned by apps) are not affected. BUG: 142900877 Change-Id: I8b3039f0b063f7b46e4040419e750c057f185ced
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c index 43653bb..7fa3b71 100644 --- a/ext/gl/gstglimagesink.c +++ b/ext/gl/gstglimagesink.c
@@ -100,6 +100,7 @@ #define DEFAULT_HANDLE_EVENTS TRUE #define DEFAULT_FORCE_ASPECT_RATIO TRUE #define DEFAULT_IGNORE_ALPHA TRUE +#define DEFAULT_FULLSCREEN FALSE #define DEFAULT_MULTIVIEW_MODE GST_VIDEO_MULTIVIEW_MODE_MONO #define DEFAULT_MULTIVIEW_FLAGS GST_VIDEO_MULTIVIEW_FLAGS_NONE @@ -123,6 +124,7 @@ PROP_BIN_OUTPUT_MULTIVIEW_LAYOUT, PROP_BIN_OUTPUT_MULTIVIEW_FLAGS, PROP_BIN_OUTPUT_MULTIVIEW_DOWNMIX_MODE, + PROP_BIN_FULLSCREEN, PROP_BIN_LAST }; @@ -285,6 +287,11 @@ "Output anaglyph type to generate when downmixing to mono", GST_TYPE_GL_STEREO_DOWNMIX_MODE_TYPE, DEFAULT_MULTIVIEW_DOWNMIX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_BIN_FULLSCREEN, + g_param_spec_boolean ("fullscreen", "Fullscreen", + "Requests that internally created windows are fullscreen" + " (does not affect external windows)", + DEFAULT_FULLSCREEN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gst_video_overlay_install_properties (gobject_class, PROP_BIN_LAST); @@ -394,6 +401,7 @@ PROP_OUTPUT_MULTIVIEW_LAYOUT, PROP_OUTPUT_MULTIVIEW_FLAGS, PROP_OUTPUT_MULTIVIEW_DOWNMIX_MODE, + PROP_FULLSCREEN, PROP_LAST }; @@ -697,6 +705,12 @@ GST_TYPE_GL_STEREO_DOWNMIX_MODE_TYPE, DEFAULT_MULTIVIEW_DOWNMIX, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_FULLSCREEN, + g_param_spec_boolean ("fullscreen", "Fullscreen", + "Requests that internally created windows are fullscreen" + " (does not affect external windows)", + DEFAULT_FULLSCREEN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gst_video_overlay_install_properties (gobject_class, PROP_LAST); gst_element_class_set_metadata (element_class, "OpenGL video sink", @@ -779,6 +793,8 @@ glimage_sink->current_rotate_method = DEFAULT_ROTATE_METHOD; glimage_sink->transform_matrix = NULL; + glimage_sink->fullscreen = DEFAULT_FULLSCREEN; + g_mutex_init (&glimage_sink->drawing_lock); } @@ -833,6 +849,9 @@ glimage_sink->output_mode_changed = TRUE; GST_GLIMAGE_SINK_UNLOCK (glimage_sink); break; + case PROP_FULLSCREEN: + glimage_sink->fullscreen = g_value_get_boolean (value); + break; default: if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -892,6 +911,9 @@ case PROP_OUTPUT_MULTIVIEW_DOWNMIX_MODE: g_value_set_enum (value, glimage_sink->mview_downmix_mode); break; + case PROP_FULLSCREEN: + g_value_set_boolean (value, glimage_sink->fullscreen); + break; default: if (!gst_video_overlay_set_property (object, PROP_LAST, prop_id, value)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -2341,6 +2363,7 @@ gst_gl_window_set_preferred_size (window, GST_VIDEO_SINK_WIDTH (gl_sink), GST_VIDEO_SINK_HEIGHT (gl_sink)); + gst_gl_window_prefer_fullscreen (window, gl_sink->fullscreen); gst_gl_window_show (window); }
diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h index 12166ec..f5ac43d 100644 --- a/ext/gl/gstglimagesink.h +++ b/ext/gl/gstglimagesink.h
@@ -141,6 +141,8 @@ GstGLRotateMethod current_rotate_method; GstGLRotateMethod rotate_method; const gfloat *transform_matrix; + + gboolean fullscreen; }; struct _GstGLImageSinkClass
diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c index f7237a4..daee213 100644 --- a/gst-libs/gst/gl/gstglwindow.c +++ b/gst-libs/gst/gl/gstglwindow.c
@@ -931,6 +931,18 @@ } void +gst_gl_window_prefer_fullscreen (GstGLWindow * window, gboolean fullscreen) +{ + GstGLWindowClass *window_class; + + g_return_val_if_fail (GST_IS_GL_WINDOW (window), FALSE); + window_class = GST_GL_WINDOW_GET_CLASS (window); + + if (window_class->prefer_fullscreen) + window_class->prefer_fullscreen (window, fullscreen); +} + +void gst_gl_window_queue_resize (GstGLWindow * window) { GstGLWindowClass *window_class;
diff --git a/gst-libs/gst/gl/gstglwindow.h b/gst-libs/gst/gl/gstglwindow.h index ece8d31..b857e4d 100644 --- a/gst-libs/gst/gl/gstglwindow.h +++ b/gst-libs/gst/gl/gstglwindow.h
@@ -168,6 +168,7 @@ void (*show) (GstGLWindow *window); gboolean (*set_render_rectangle)(GstGLWindow *window, gint x, gint y, gint width, gint height); void (*queue_resize) (GstGLWindow *window); + void (*prefer_fullscreen) (GstGLWindow *window, gboolean fullscreen); /*< private >*/ gpointer _reserved[GST_PADDING]; @@ -251,6 +252,10 @@ gint width, gint height); +GST_GL_API +void gst_gl_window_prefer_fullscreen (GstGLWindow * window, + gboolean fullscreen); + /* subclass usage only */ GST_GL_API void gst_gl_window_resize (GstGLWindow *window, guint width, guint height);
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c index 3852818..06809fa 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
@@ -328,6 +328,25 @@ } static void +gst_gl_window_wayland_egl_prefer_fullscreen (GstGLWindow * window, + gboolean fullscreen) +{ + GstGLWindowWaylandEGL *window_egl = GST_GL_WINDOW_WAYLAND_EGL (window); + + window_egl->window.preferred_fullscreen = fullscreen; +} + +static void +gst_gl_window_wayland_egl_set_preferred_size (GstGLWindow * window, gint width, + gint height) +{ + GstGLWindowWaylandEGL *window_egl = GST_GL_WINDOW_WAYLAND_EGL (window); + + window_egl->window.preferred_width = width; + window_egl->window.preferred_height = height; +} + +static void gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass) { GstGLWindowClass *window_class = (GstGLWindowClass *) klass; @@ -344,6 +363,10 @@ GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_display); window_class->set_render_rectangle = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_set_render_rectangle); + window_class->set_preferred_size = + GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_set_preferred_size); + window_class->prefer_fullscreen = + GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_prefer_fullscreen); } static void @@ -470,6 +493,17 @@ create_surfaces (window_egl); + if (!window_egl->window.foreign_surface && + window_egl->window.preferred_width && + window_egl->window.preferred_height && + window_egl->window.preferred_fullscreen) { + window_resize(window_egl, window_egl->window.preferred_width, + window_egl->window.preferred_height); + wl_shell_surface_set_fullscreen (window_egl->window.shell_surface, + WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, + 0, NULL); + } + gst_gl_window_send_message (window, (GstGLWindowCB) _roundtrip_async, window); }
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h index 07c7ad1..a643617 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
@@ -73,6 +73,8 @@ int fullscreen, configured; int window_width, window_height; int window_x, window_y; + int preferred_width, preferred_height; + gboolean preferred_fullscreen; }; struct _GstGLWindowWaylandEGL {