glimagesink: avoid updating the viewport in the draw loop
authorMatthew Waters <matthew@centricular.com>
Wed, 16 Sep 2015 07:28:05 +0000 (17:28 +1000)
committerMatthew Waters <matthew@centricular.com>
Wed, 16 Sep 2015 08:04:51 +0000 (18:04 +1000)
Fixes flashes/incorrect aspect ratio when resizing glimagesink on OSX.

ext/gl/gstglimagesink.c
ext/gl/gstglimagesink.h

index 8e299806de949c11c8f9157b8fd3610246373aa3..939c371e81fd22ce786a3ed7f9547f4ef763a2e3 100644 (file)
@@ -1742,11 +1742,19 @@ gst_glimage_sink_cleanup_glthread (GstGLImageSink * gl_sink)
 static void
 gst_glimage_sink_on_resize (GstGLImageSink * gl_sink, gint width, gint height)
 {
+  const GstGLFuncs *gl = gl_sink->context->gl_vtable;
+
   GST_DEBUG_OBJECT (gl_sink, "GL Window resized to %ux%u", width, height);
 
   GST_GLIMAGE_SINK_LOCK (gl_sink);
   gl_sink->output_mode_changed = TRUE;
   gst_glimage_sink_do_resize (gl_sink, width, height);
+
+  gl->Viewport (gl_sink->display_rect.x, gl_sink->display_rect.y,
+      gl_sink->display_rect.w, gl_sink->display_rect.h);
+  GST_DEBUG_OBJECT (gl_sink, "GL output area now %u,%u %ux%u",
+      gl_sink->display_rect.x, gl_sink->display_rect.y,
+      gl_sink->display_rect.w, gl_sink->display_rect.h);
   GST_GLIMAGE_SINK_UNLOCK (gl_sink);
 }
 
@@ -1812,8 +1820,6 @@ gst_glimage_sink_do_resize (GstGLImageSink * gl_sink, gint width, gint height)
       gl_sink->display_rect.w = width;
       gl_sink->display_rect.h = height;
     }
-    gl_sink->update_viewport = TRUE;
-
   }
 }
 
@@ -1852,18 +1858,12 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink)
 
   if (gl_sink->caps_change && gl_sink->window_width > 0
       && gl_sink->window_height > 0) {
+    /* FIXME: invoke a winsys resize event to get the correct viewport
+     * on OSX where the calayer messes with the viewport */
     gst_glimage_sink_do_resize (gl_sink, gl_sink->window_width,
         gl_sink->window_height);
     gl_sink->caps_change = FALSE;
   }
-  if (gl_sink->update_viewport == TRUE) {
-    gl->Viewport (gl_sink->display_rect.x, gl_sink->display_rect.y,
-        gl_sink->display_rect.w, gl_sink->display_rect.h);
-    GST_DEBUG_OBJECT (gl_sink, "GL output area now %u,%u %ux%u",
-        gl_sink->display_rect.x, gl_sink->display_rect.y,
-        gl_sink->display_rect.w, gl_sink->display_rect.h);
-    gl_sink->update_viewport = FALSE;
-  }
 
   sync_meta = gst_buffer_get_gl_sync_meta (gl_sink->stored_sync);
   if (sync_meta)
index c4ccaae480d864a598dd497a62bdbd5a9aba32bc..f7b3bfb03a07bfae708704058c6a7b95fc258aa4 100644 (file)
@@ -101,7 +101,6 @@ struct _GstGLImageSink
     gboolean caps_change;
     guint window_width;
     guint window_height;
-    gboolean update_viewport;
 
     GstVideoRectangle display_rect;