summaryrefslogtreecommitdiff
path: root/gst-libs/gst/gl/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/gl/cocoa')
-rw-r--r--gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h6
-rw-r--r--gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m25
-rw-r--r--gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m26
3 files changed, 57 insertions, 0 deletions
diff --git a/gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h b/gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h
index ae7abc8a6..2459e2a28 100644
--- a/gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h
+++ b/gst-libs/gst/gl/cocoa/gstgl_cocoa_private.h
@@ -40,6 +40,7 @@ struct _GstGLContextCocoaPrivate
GstGLAPI context_api;
gint source_id;
+ GRecMutex current_lock;
};
@@ -59,8 +60,13 @@ struct _GstGLContextCocoaPrivate
gboolean gst_gl_window_cocoa_create_window (GstGLWindowCocoa *window_cocoa);
+
void _invoke_on_main (GstGLWindowCB func, gpointer data);
+typedef void (*GstGLContextCocoaInvokeFunc) (gpointer data);
+void _gst_gl_context_cocoa_invoke (GstGLContext * context,
+ GstGLContextCocoaInvokeFunc func, gpointer data, GDestroyNotify notify);
+
G_END_DECLS
#endif /* __GST_GL_COCOA_PRIVATE_H__ */
diff --git a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
index ac1e0d692..c50d0069f 100644
--- a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
@@ -43,14 +43,18 @@ GST_DEBUG_CATEGORY_STATIC (gst_gl_context_cocoa_debug);
G_DEFINE_TYPE_WITH_CODE (GstGLContextCocoa, gst_gl_context_cocoa,
GST_GL_TYPE_CONTEXT, GST_DEBUG_CATEGORY_INIT (gst_gl_context_cocoa_debug, "glcontext_cocoa", 0, "Cocoa GL Context"); );
+static void gst_gl_context_cocoa_finalize (GObject * object);
static void
gst_gl_context_cocoa_class_init (GstGLContextCocoaClass * klass)
{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
GstGLContextClass *context_class = (GstGLContextClass *) klass;
g_type_class_add_private (klass, sizeof (GstGLContextCocoaPrivate));
+ gobject_class->finalize = gst_gl_context_cocoa_finalize;
+
context_class->destroy_context =
GST_DEBUG_FUNCPTR (gst_gl_context_cocoa_destroy_context);
context_class->create_context =
@@ -68,6 +72,13 @@ static void
gst_gl_context_cocoa_init (GstGLContextCocoa * context)
{
context->priv = GST_GL_CONTEXT_COCOA_GET_PRIVATE (context);
+ g_rec_mutex_init (&context->priv->current_lock);
+}
+
+static void gst_gl_context_cocoa_finalize (GObject * object)
+{
+ g_rec_mutex_clear (&GST_GL_CONTEXT_COCOA (object)->priv->current_lock);
+ G_OBJECT_CLASS (gst_gl_context_cocoa_parent_class)->finalize (object);
}
/* Must be called in the gl thread */
@@ -327,3 +338,17 @@ gst_gl_context_cocoa_get_current_context (void)
{
return (guintptr) CGLGetCurrentContext ();
}
+
+void
+_gst_gl_context_cocoa_invoke (GstGLContext * context,
+ GstGLContextCocoaInvokeFunc func, gpointer data, GDestroyNotify destroy)
+{
+ GstGLContextCocoa *context_cocoa = (GstGLContextCocoa *) context;
+
+ g_rec_mutex_lock (&context_cocoa->priv->current_lock);
+ gst_gl_context_activate (context, TRUE);
+ func (data);
+ if (destroy)
+ destroy (data);
+ g_rec_mutex_unlock (&context_cocoa->priv->current_lock);
+}
diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
index 0d027c5a1..3d771fb6d 100644
--- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
@@ -77,6 +77,10 @@ static void gst_gl_window_cocoa_set_preferred_size (GstGLWindow * window,
gint width, gint height);
static void gst_gl_window_cocoa_show (GstGLWindow * window);
static void gst_gl_window_cocoa_queue_resize (GstGLWindow * window);
+static void gst_gl_window_cocoa_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
+static void gst_gl_window_cocoa_send_message (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data);
struct _GstGLWindowCocoaPrivate
{
@@ -111,6 +115,10 @@ gst_gl_window_cocoa_class_init (GstGLWindowCocoaClass * klass)
GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_set_preferred_size);
window_class->show = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_show);
window_class->queue_resize = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_queue_resize);
+ window_class->send_message_async =
+ GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_send_message_async);
+ window_class->send_message =
+ GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_send_message);
gobject_class->finalize = gst_gl_window_cocoa_finalize;
}
@@ -370,6 +378,24 @@ gst_gl_cocoa_resize_cb (GstGLNSView * view, guint width, guint height)
[pool release];
}
+static void
+gst_gl_window_cocoa_send_message_async (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data, GDestroyNotify destroy)
+{
+ GstGLContext *context = gst_gl_window_get_context (window);
+ _gst_gl_context_cocoa_invoke (context, callback, data, destroy);
+ gst_object_unref (context);
+}
+
+static void
+gst_gl_window_cocoa_send_message (GstGLWindow * window,
+ GstGLWindowCB callback, gpointer data)
+{
+ GstGLContext *context = gst_gl_window_get_context (window);
+ _gst_gl_context_cocoa_invoke (context, callback, data, NULL);
+ gst_object_unref (context);
+}
+
/* =============================================================*/
/* */
/* GstGLNSWindow implementation */