From: <ca...@ke...> - 2009-12-16 00:40:18
|
Module: gst-plugins-gl Branch: master Commit: b7e2c8408e3c7c98cf3d8b9f8b3261ecaf542c41 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-gl/commit/?id=b7e2c8408e3c7c98cf3d8b9f8b3261ecaf542c41 Author: Julien Isorce <jul...@gm...> Date: Wed Dec 16 01:33:39 2009 +0100 gstglmixer: inactivate shared gl context before to release ours First, inactivate shared gl contexts known by each sink pad. Then, destroy the gl context known by the glmixer. Finally, re-activate shared gl contexts. This is to satisfy the fact that no shared gl context must be current when an opengl context is destroyed. Moreover the application may hang or crash without those steps. --- gst-libs/gst/gl/gstglmixer.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff --git a/gst-libs/gst/gl/gstglmixer.c b/gst-libs/gst/gl/gstglmixer.c index f43a649..a206e1a 100644 --- a/gst-libs/gst/gl/gstglmixer.c +++ b/gst-libs/gst/gl/gstglmixer.c @@ -1274,10 +1274,8 @@ gst_gl_mixer_change_state (GstElement * element, GstStateChange transition) while (walk) { GstGLMixerPad *sink_pad = GST_GL_MIXER_PAD (walk->data); walk = g_slist_next (walk); - if (sink_pad->display) { - g_object_unref (sink_pad->display); - sink_pad->display = NULL; - } + if (sink_pad->display) + gst_gl_display_activate_gl_context (sink_pad->display, FALSE); } if (mixer_class->reset) mixer_class->reset (mix); @@ -1290,6 +1288,15 @@ gst_gl_mixer_change_state (GstElement * element, GstStateChange transition) g_object_unref (mix->display); mix->display = NULL; } + while (walk) { + GstGLMixerPad *sink_pad = GST_GL_MIXER_PAD (walk->data); + walk = g_slist_next (walk); + if (sink_pad->display) { + gst_gl_display_activate_gl_context (sink_pad->display, TRUE); + g_object_unref (sink_pad->display); + sink_pad->display = NULL; + } + } break; } default: |