_get_gl_context() can be called concurrently from either propose_allocation() or
decide_allocation(). If it so happens that this happens at the same time,
the check for whether we already had a GL context was outside the lock. Inside
the lock and loop, the first thing that happens is that we unref the current GL
context (if valid) as if there was a conflict adding it to the display. If the
timing was unlucky, subsequent use of the GL context would be referencing an
already unreffed GL context object resulting in a critical:
g_object_ref: assertion 'object->ref_count > 0' failed
https://bugzilla.gnome.org/show_bug.cgi?id=766703
_find_local_gl_context (mix);
+ GST_OBJECT_LOCK (mix->display);
if (!mix->context) {
- GST_OBJECT_LOCK (mix->display);
do {
if (mix->context) {
gst_object_unref (mix->context);
}
}
} while (!gst_gl_display_add_context (mix->display, mix->context));
- GST_OBJECT_UNLOCK (mix->display);
}
+ GST_OBJECT_UNLOCK (mix->display);
{
GstGLAPI current_gl_api = gst_gl_context_get_gl_api (mix->context);