From 29965fa8a75f388d440d9132b707729bab295e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 15 May 2016 17:47:38 +0300 Subject: [PATCH] Add finalizer for the sink to drop the instance --- src/rssink.c | 13 +++++++++++++ src/rssink.rs | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/rssink.c b/src/rssink.c index 9bef3803..808e53da 100644 --- a/src/rssink.c +++ b/src/rssink.c @@ -21,6 +21,7 @@ extern gboolean sink_set_uri (void * filesink, const char *uri); extern char * sink_get_uri (void * filesink); extern gboolean sink_start (void * filesink); extern gboolean sink_stop (void * filesink); +extern void sink_drop (void * filesink); GST_DEBUG_CATEGORY_STATIC (gst_rs_sink_debug); #define GST_CAT_DEFAULT gst_rs_sink_debug @@ -39,6 +40,7 @@ enum static void gst_rs_sink_uri_handler_init (gpointer g_iface, gpointer iface_data); +static void gst_rs_sink_finalize (GObject * object); static void gst_rs_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rs_sink_get_property (GObject * object, guint prop_id, @@ -64,6 +66,7 @@ gst_rs_sink_class_init (GstRsSinkClass * klass) gstelement_class = GST_ELEMENT_CLASS (klass); gstbasesink_class = GST_BASE_SINK_CLASS (klass); + gobject_class->finalize = gst_rs_sink_finalize; gobject_class->set_property = gst_rs_sink_set_property; gobject_class->get_property = gst_rs_sink_get_property; @@ -96,6 +99,16 @@ gst_rs_sink_init (GstRsSink * sink, GstRsSinkClass * klass) sink->instance = data->create_instance (); } +static void +gst_rs_sink_finalize (GObject * object) +{ + GstRsSink *sink = GST_RS_SINK (object); + + sink_drop (sink->instance); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + static void gst_rs_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) diff --git a/src/rssink.rs b/src/rssink.rs index 601b0bd9..9f871cf7 100644 --- a/src/rssink.rs +++ b/src/rssink.rs @@ -13,6 +13,11 @@ pub trait Sink { fn render(&mut self, data: &[u8]) -> GstFlowReturn; } +#[no_mangle] +pub extern "C" fn sink_drop(ptr: *mut Box) { + unsafe { Box::from_raw(ptr) }; +} + #[no_mangle] pub extern "C" fn sink_set_uri(ptr: *mut Box, uri_ptr: *const c_char) -> GBoolean{ let source: &mut Box = unsafe { &mut *ptr };