From c85b825bb273ce1a0de01f2d0a33ae5662d9312e Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Mon, 6 Nov 2017 23:19:15 +1100 Subject: [PATCH] gltestsrc: free in the GL thread on stop Calling GL functions not on the GL thread may crash in some GL implementations. https://bugzilla.gnome.org/show_bug.cgi?id=789665 --- ext/gl/gstgltestsrc.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ext/gl/gstgltestsrc.c b/ext/gl/gstgltestsrc.c index 0305413657..cba25c9a62 100644 --- a/ext/gl/gstgltestsrc.c +++ b/ext/gl/gstgltestsrc.c @@ -522,31 +522,36 @@ gst_gl_test_src_start (GstBaseSrc * basesrc) return TRUE; } +static void +gst_gl_test_src_gl_stop (GstGLContext * context, GstGLTestSrc * src) +{ + if (src->fbo) + gst_object_unref (src->fbo); + src->fbo = NULL; + + if (src->shader) + gst_object_unref (src->shader); + src->shader = NULL; + + + if (src->src_impl) + src->src_funcs->free (src->src_impl); + src->src_impl = NULL; +} + static gboolean gst_gl_test_src_stop (GstBaseSrc * basesrc) { GstGLTestSrc *src = GST_GL_TEST_SRC (basesrc); + gst_gl_context_thread_add (src->context, + (GstGLContextThreadFunc) gst_gl_test_src_gl_stop, src); + gst_caps_replace (&src->out_caps, NULL); - if (src->context) { - if (src->shader) { - gst_object_unref (src->shader); - src->shader = NULL; - } - - if (src->fbo) - gst_object_unref (src->fbo); - src->fbo = NULL; - + if (src->context) gst_object_unref (src->context); - src->context = NULL; - } - - if (src->src_impl) { - src->src_funcs->free (src->src_impl); - src->src_impl = NULL; - } + src->context = NULL; return TRUE; }