diff --git a/subprojects/gst-plugins-base/ext/gl/gstglimagesink.c b/subprojects/gst-plugins-base/ext/gl/gstglimagesink.c index 3cd0fbeb4d..5b9b4cd0e8 100644 --- a/subprojects/gst-plugins-base/ext/gl/gstglimagesink.c +++ b/subprojects/gst-plugins-base/ext/gl/gstglimagesink.c @@ -814,6 +814,7 @@ gst_glimage_sink_init (GstGLImageSink * glimage_sink) glimage_sink->handle_events = TRUE; glimage_sink->ignore_alpha = TRUE; glimage_sink->overlay_compositor = NULL; + glimage_sink->need_resize_window = FALSE; glimage_sink->mview_output_mode = DEFAULT_MULTIVIEW_MODE; glimage_sink->mview_output_flags = DEFAULT_MULTIVIEW_FLAGS; @@ -1527,11 +1528,19 @@ update_output_format (GstGLImageSink * glimage_sink) GstVideoMultiviewMode mv_mode; GstGLWindow *window = NULL; GstGLTextureTarget previous_target; + gint pre_width = 0, pre_height = 0; + gint cur_width = 0, cur_height = 0; GstStructure *s; const gchar *target_str; GstCaps *out_caps; gboolean ret; + pre_width = GST_VIDEO_INFO_WIDTH (out_info); + pre_height = GST_VIDEO_INFO_HEIGHT (out_info); + + cur_width = GST_VIDEO_INFO_WIDTH (&glimage_sink->in_info); + cur_height = GST_VIDEO_INFO_HEIGHT (&glimage_sink->in_info); + *out_info = glimage_sink->in_info; previous_target = glimage_sink->texture_target; @@ -1625,6 +1634,10 @@ update_output_format (GstGLImageSink * glimage_sink) gst_caps_unref (glimage_sink->out_caps); glimage_sink->out_caps = out_caps; + if ((pre_width != 0 && pre_width != cur_width) || + (pre_height != 0 && pre_height != cur_height)) + glimage_sink->need_resize_window = TRUE; + if (previous_target != GST_GL_TEXTURE_TARGET_NONE && glimage_sink->texture_target != previous_target) { /* regenerate the shader for the changed target */ @@ -2517,6 +2530,7 @@ gst_glimage_sink_redisplay (GstGLImageSink * gl_sink) GstGLWindow *window; GstBuffer *old_stored_buffer[2], *old_sync; gulong handler_id; + gboolean resize_window = gl_sink->need_resize_window; window = gst_gl_context_get_window (gl_sink->context); if (!window) @@ -2538,6 +2552,12 @@ gst_glimage_sink_redisplay (GstGLImageSink * gl_sink) return FALSE; } + resize_window = TRUE; + } + + if (resize_window) { + gl_sink->need_resize_window = FALSE; + gst_gl_window_set_preferred_size (window, GST_VIDEO_SINK_WIDTH (gl_sink), GST_VIDEO_SINK_HEIGHT (gl_sink)); gst_gl_window_show (window); diff --git a/subprojects/gst-plugins-base/ext/gl/gstglimagesink.h b/subprojects/gst-plugins-base/ext/gl/gstglimagesink.h index 93014d2ad2..eb72173e68 100644 --- a/subprojects/gst-plugins-base/ext/gl/gstglimagesink.h +++ b/subprojects/gst-plugins-base/ext/gl/gstglimagesink.h @@ -104,6 +104,8 @@ struct _GstGLImageSink GstGLSyncMeta *stored_sync_meta; GLuint redisplay_texture; + gboolean need_resize_window; + /* protected with drawing_lock */ gboolean window_resized; guint window_width;