[831/906] glimagesink: avoid to overload the drawer if already drawing

Especially if the application calls gst_video_overlay_expose a lot
This commit is contained in:
Julien Isorce 2013-11-06 21:55:49 +00:00 committed by Matthew Waters
parent 7f3ad8f445
commit c775bf584b
3 changed files with 19 additions and 6 deletions

View File

@ -107,6 +107,8 @@ gst_gl_window_init (GstGLWindow * window)
g_cond_init (&window->priv->cond_destroy_context); g_cond_init (&window->priv->cond_destroy_context);
window->priv->context_created = FALSE; window->priv->context_created = FALSE;
window->is_drawing = FALSE;
g_weak_ref_init (&window->context_ref, NULL); g_weak_ref_init (&window->context_ref, NULL);
} }
@ -221,6 +223,13 @@ gst_gl_window_draw (GstGLWindow * window, guint width, guint height)
g_return_if_fail (window_class->draw != NULL); g_return_if_fail (window_class->draw != NULL);
GST_GL_WINDOW_LOCK (window); GST_GL_WINDOW_LOCK (window);
/* avoid to overload the drawer */
if (window->is_drawing) {
GST_GL_WINDOW_UNLOCK (window);
return;
}
window_class->draw (window, width, height); window_class->draw (window, width, height);
GST_GL_WINDOW_UNLOCK (window); GST_GL_WINDOW_UNLOCK (window);
} }

View File

@ -76,6 +76,8 @@ struct _GstGLWindow {
guintptr external_gl_context; guintptr external_gl_context;
gboolean is_drawing;
GstGLWindowCB draw; GstGLWindowCB draw;
gpointer draw_data; gpointer draw_data;
GDestroyNotify draw_notify; GDestroyNotify draw_notify;

View File

@ -984,6 +984,7 @@ gst_glimage_sink_on_draw (const GstGLImageSink * gl_sink)
*/ */
const GstGLFuncs *gl = NULL; const GstGLFuncs *gl = NULL;
GstGLWindow *window = NULL;
g_return_if_fail (GST_IS_GLIMAGE_SINK (gl_sink)); g_return_if_fail (GST_IS_GLIMAGE_SINK (gl_sink));
@ -997,6 +998,9 @@ gst_glimage_sink_on_draw (const GstGLImageSink * gl_sink)
return; return;
} }
window = gst_gl_context_get_window (gl_sink->context);
window->is_drawing = TRUE;
/* opengl scene */ /* opengl scene */
GST_TRACE ("redrawing texture:%u", gl_sink->redisplay_texture); GST_TRACE ("redrawing texture:%u", gl_sink->redisplay_texture);
@ -1019,15 +1023,10 @@ gst_glimage_sink_on_draw (const GstGLImageSink * gl_sink)
GST_VIDEO_INFO_HEIGHT (&gl_sink->info), GST_VIDEO_INFO_HEIGHT (&gl_sink->info),
gl_sink->client_data); gl_sink->client_data);
if (doRedisplay) { if (doRedisplay)
GstGLWindow *window = gst_gl_context_get_window (gl_sink->context);
gst_gl_window_draw_unlocked (window, gst_gl_window_draw_unlocked (window,
GST_VIDEO_INFO_WIDTH (&gl_sink->info), GST_VIDEO_INFO_WIDTH (&gl_sink->info),
GST_VIDEO_INFO_HEIGHT (&gl_sink->info)); GST_VIDEO_INFO_HEIGHT (&gl_sink->info));
gst_object_unref (window);
}
} }
/* default opengl scene */ /* default opengl scene */
else { else {
@ -1103,6 +1102,9 @@ gst_glimage_sink_on_draw (const GstGLImageSink * gl_sink)
#endif #endif
} /* end default opengl scene */ } /* end default opengl scene */
window->is_drawing = FALSE;
gst_object_unref (window);
GST_GLIMAGE_SINK_UNLOCK (gl_sink); GST_GLIMAGE_SINK_UNLOCK (gl_sink);
} }