gldisplay: add support removing a context from the internal list
authorMatthew Waters <matthew@centricular.com>
Tue, 4 Feb 2020 03:04:21 +0000 (14:04 +1100)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 3 Mar 2020 02:11:52 +0000 (02:11 +0000)
gst-libs/gst/gl/gstgldisplay.c
gst-libs/gst/gl/gstgldisplay.h

index 6be0638e75a2803e1b6c7ee67b8ef964d81107f9..f121330738c17e38116d5c99b6e973f1b27e26c3 100644 (file)
@@ -874,3 +874,46 @@ out:
 
   return ret;
 }
+
+/**
+ * gst_gl_display_remove_context:
+ * @display: a #GstGLDisplay
+ * @context: (transfer none): the #GstGLContext to remove
+ *
+ * Must be called with the object lock held.
+ *
+ * Since: 1.18
+ */
+void
+gst_gl_display_remove_context (GstGLDisplay * display, GstGLContext * needle)
+{
+  GstGLContext *context;
+  GList *prev = NULL, *l;
+
+  g_return_if_fail (GST_IS_GL_DISPLAY (display));
+  g_return_if_fail (GST_IS_GL_CONTEXT (needle));
+
+  l = display->priv->contexts;
+
+  while (l) {
+    GWeakRef *ref = l->data;
+
+    context = g_weak_ref_get (ref);
+    if (!context || context == needle) {
+      /* remove dead contexts */
+      g_weak_ref_clear (l->data);
+      g_free (l->data);
+      display->priv->contexts = g_list_delete_link (display->priv->contexts, l);
+      l = prev ? prev->next : display->priv->contexts;
+      if (context) {
+        GST_INFO_OBJECT (display, "removed context %" GST_PTR_FORMAT
+            " from internal list", context);
+        return;
+      } else
+        continue;
+    }
+  }
+
+  GST_WARNING_OBJECT (display, "%" GST_PTR_FORMAT " was not found in this "
+      "display", needle);
+}
index 872c957c7ccd31fa742f5ab120260cab6c2a4252..33cdda71032057f5d3b2bbe0845cde731101be3d 100644 (file)
@@ -141,8 +141,11 @@ GST_GL_API
 GstGLContext * gst_gl_display_get_gl_context_for_thread (GstGLDisplay * display,
     GThread * thread);
 GST_GL_API
-gboolean gst_gl_display_add_context (GstGLDisplay * display,
-    GstGLContext * context);
+gboolean        gst_gl_display_add_context      (GstGLDisplay * display,
+                                                 GstGLContext * context);
+GST_GL_API
+void            gst_gl_display_remove_context   (GstGLDisplay * display,
+                                                 GstGLContext * context);
 
 GST_GL_API
 GstGLWindow *   gst_gl_display_create_window    (GstGLDisplay * display);