summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/gl/caopengllayersink.h2
-rw-r--r--ext/gl/caopengllayersink.m22
2 files changed, 18 insertions, 6 deletions
diff --git a/ext/gl/caopengllayersink.h b/ext/gl/caopengllayersink.h
index 3507154ea..25bc10650 100644
--- a/ext/gl/caopengllayersink.h
+++ b/ext/gl/caopengllayersink.h
@@ -61,7 +61,7 @@ struct _GstCAOpenGLLayerSink
GstBuffer *next_buffer;
GstBuffer *next_sync;
- GstGLCAOpenGLLayer *layer;
+ gpointer layer;
gboolean keep_aspect_ratio;
diff --git a/ext/gl/caopengllayersink.m b/ext/gl/caopengllayersink.m
index 851a4e0b2..1e42034ac 100644
--- a/ext/gl/caopengllayersink.m
+++ b/ext/gl/caopengllayersink.m
@@ -79,7 +79,7 @@ gst_ca_opengl_layer_sink_bin_get_property (GObject * object, guint prop_id,
static void
gst_ca_opengl_layer_sink_bin_init (GstCAOpenGLLayerSinkBin * self)
{
- GstGLCAOpenGLLayer *sink = g_object_new (GST_TYPE_CA_OPENGL_LAYER_SINK, NULL);
+ gpointer *sink = g_object_new (GST_TYPE_CA_OPENGL_LAYER_SINK, NULL);
g_signal_connect (sink, "notify::layer", G_CALLBACK (_on_notify_layer), self);
@@ -266,6 +266,11 @@ gst_ca_opengl_layer_sink_finalize (GObject * object)
g_mutex_clear (&ca_sink->drawing_lock);
+ if (ca_sink->layer) {
+ CFRelease(ca_sink->layer);
+ ca_sink->layer = NULL;
+ }
+
GST_DEBUG ("finalized");
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -322,13 +327,16 @@ static void
_create_layer (gpointer data)
{
GstCAOpenGLLayerSink *ca_sink = data;
+ id layer;
if (!ca_sink->layer) {
- ca_sink->layer = [[NSClassFromString(@"GstGLCAOpenGLLayer") alloc]
+ layer = [[NSClassFromString(@"GstGLCAOpenGLLayer") alloc]
initWithGstGLContext:GST_GL_CONTEXT_COCOA (ca_sink->context)];
- [ca_sink->layer setDrawCallback:(GstGLWindowCB)gst_ca_opengl_layer_sink_on_draw
+
+ ca_sink->layer = (__bridge_retained gpointer)layer;
+ [layer setDrawCallback:(GstGLWindowCB)gst_ca_opengl_layer_sink_on_draw
data:ca_sink notify:NULL];
- [ca_sink->layer setResizeCallback:(GstGLWindowResizeCB)gst_ca_opengl_layer_sink_on_resize
+ [layer setResizeCallback:(GstGLWindowResizeCB)gst_ca_opengl_layer_sink_on_resize
data:ca_sink notify:NULL];
g_object_notify (G_OBJECT (ca_sink), "layer");
}
@@ -507,6 +515,10 @@ gst_ca_opengl_layer_sink_change_state (GstElement * element, GstStateChange tran
break;
}
case GST_STATE_CHANGE_READY_TO_NULL:
+ if (ca_sink->layer) {
+ CFRelease(ca_sink->layer);
+ ca_sink->layer = NULL;
+ }
break;
default:
break;
@@ -698,7 +710,7 @@ gst_ca_opengl_layer_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
/* The layer will automatically call the draw callback to draw the new
* content */
[CATransaction begin];
- [ca_sink->layer setNeedsDisplay];
+ [(__bridge GstGLCAOpenGLLayer *)(ca_sink->layer) setNeedsDisplay];
[CATransaction commit];
GST_TRACE ("post redisplay");