From 78c82328ee008c40e7e00ab7aaa2548dd54f1e49 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Sun, 15 Mar 2015 12:58:26 +0000 Subject: [PATCH] gldisplay: tentative proper context collision detection Fixes tee name=t ! queue ! gliamgesink t. ! queue ! glimagesink --- gst-libs/gst/gl/gstgldisplay.c | 49 +++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c index c50384566c..89f22ead5f 100644 --- a/gst-libs/gst/gl/gstgldisplay.c +++ b/gst-libs/gst/gl/gstgldisplay.c @@ -390,6 +390,37 @@ gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display, return context; } +static gboolean +_check_collision (GstGLContext * context, GstGLContext * collision) +{ + GThread *thread, *collision_thread; + gboolean ret = FALSE; + + if (!context || !collision) + return FALSE; + + thread = gst_gl_context_get_thread (context); + collision_thread = gst_gl_context_get_thread (collision); + + if (!thread || !collision_thread) { + ret = FALSE; + goto out; + } + + if (collision == context) { + ret = TRUE; + goto out; + } + +out: + if (thread) + g_thread_unref (thread); + if (collision_thread) + g_thread_unref (collision_thread); + + return ret; +} + /** * gst_gl_display_add_context: * @display: a #GstGLDisplay @@ -403,6 +434,7 @@ gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display, gboolean gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context) { + GstGLContext *collision = NULL; GstGLDisplay *context_display; gboolean ret = TRUE; GThread *thread; @@ -419,16 +451,10 @@ gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context) thread = gst_gl_context_get_thread (context); if (thread) { - GstGLContext *collision = - _get_gl_context_for_thread_unlocked (display, thread); - g_thread_unref (thread); - if (collision) { - if (collision != context) { - gst_object_unref (collision); - ret = FALSE; - goto out; - } - gst_object_unref (collision); + collision = _get_gl_context_for_thread_unlocked (display, thread); + if (_check_collision (context, collision)) { + ret = FALSE; + goto out; } } @@ -438,6 +464,9 @@ gst_gl_display_add_context (GstGLDisplay * display, GstGLContext * context) display->priv->contexts = g_list_prepend (display->priv->contexts, ref); out: + if (collision) + gst_object_unref (collision); + GST_DEBUG_OBJECT (display, "%ssuccessfully inserted context %" GST_PTR_FORMAT, ret ? "" : "un", context); GST_OBJECT_UNLOCK (display);