mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 00:36:51 +00:00
glimagesink: resize viewport when video size changed in caps
When re-negotiation happends and caps is changed, resize the viewport to the corresponding video size in changed caps. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7341>
This commit is contained in:
parent
c3f86005de
commit
c35687fcbf
2 changed files with 22 additions and 0 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue