diff options
Diffstat (limited to 'gst-libs/gst/gl/eagl/gstglcontext_eagl.m')
-rw-r--r-- | gst-libs/gst/gl/eagl/gstglcontext_eagl.m | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m index 42dde56cf..293a80d9c 100644 --- a/gst-libs/gst/gl/eagl/gstglcontext_eagl.m +++ b/gst-libs/gst/gl/eagl/gstglcontext_eagl.m @@ -31,6 +31,7 @@ #define GST_CAT_DEFAULT gst_gl_context_debug +static void gst_gl_context_eagl_finalize (GObject * object); static gboolean gst_gl_context_eagl_create_context (GstGLContext * context, GstGLAPI gl_api, GstGLContext * other_context, GError ** error); static void gst_gl_context_eagl_destroy_context (GstGLContext * context); @@ -53,6 +54,7 @@ struct _GstGLContextEaglPrivate GLuint framebuffer; GLuint color_renderbuffer; GLuint depth_renderbuffer; + GRecMutex current_lock; }; #define GST_GL_CONTEXT_EAGL_GET_PRIVATE(o) \ @@ -63,12 +65,13 @@ G_DEFINE_TYPE (GstGLContextEagl, gst_gl_context_eagl, GST_GL_TYPE_CONTEXT); static void gst_gl_context_eagl_class_init (GstGLContextEaglClass * klass) { - GstGLContextClass *context_class; - - context_class = (GstGLContextClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; + GstGLContextClass *context_class = (GstGLContextClass *) klass; g_type_class_add_private (klass, sizeof (GstGLContextEaglPrivate)); + gobject_class->finalize = gst_gl_context_eagl_finalize; + context_class->destroy_context = GST_DEBUG_FUNCPTR (gst_gl_context_eagl_destroy_context); context_class->create_context = @@ -90,6 +93,14 @@ static void gst_gl_context_eagl_init (GstGLContextEagl * context) { context->priv = GST_GL_CONTEXT_EAGL_GET_PRIVATE (context); + g_rec_mutex_init (&context->priv->current_lock); +} + +static void +gst_gl_context_eagl_finalize (GObject * object) +{ + g_rec_mutex_clear (&GST_GL_CONTEXT_EAGL (object)->priv->current_lock); + G_OBJECT_CLASS (gst_gl_context_eagl_parent_class)->finalize (object); } /* Must be called in the gl thread */ @@ -363,6 +374,20 @@ gst_gl_context_eagl_activate (GstGLContext * context, gboolean activate) return TRUE; } +void +_gst_gl_context_eagl_invoke (GstGLContext * context, + GstGLContextEaglInvokeFunc func, gpointer data, GDestroyNotify destroy) +{ + GstGLContextEagl *context_eagl = (GstGLContextEagl *) context; + + g_rec_mutex_lock (&context_eagl->priv->current_lock); + gst_gl_context_activate (context, TRUE); + func (data); + if (destroy) + destroy (data); + g_rec_mutex_unlock (&context_eagl->priv->current_lock); +} + static GstGLAPI gst_gl_context_eagl_get_gl_api (GstGLContext * context) { |