diff --git a/src/rssink.c b/src/rssink.c index 92018e04..6faa230e 100644 --- a/src/rssink.c +++ b/src/rssink.c @@ -42,6 +42,8 @@ extern gboolean sink_start (void * filesink); extern gboolean sink_stop (void * filesink); extern void sink_drop (void * filesink); +extern void cstring_drop (void * str); + GST_DEBUG_CATEGORY_STATIC (gst_rs_sink_debug); #define GST_CAT_DEFAULT gst_rs_sink_debug @@ -151,9 +153,13 @@ gst_rs_sink_get_property (GObject * object, guint prop_id, GValue * value, GstRsSink *sink = GST_RS_SINK (object); switch (prop_id) { - case PROP_URI: - g_value_take_string (value, sink_get_uri (sink->instance)); + case PROP_URI: { + gchar *str = sink_get_uri (sink->instance); + g_value_set_string (value, str); + if (str) + cstring_drop (str); break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/src/rssource.c b/src/rssource.c index 0338dfa4..38c957a8 100644 --- a/src/rssource.c +++ b/src/rssource.c @@ -43,6 +43,8 @@ extern gboolean source_is_seekable (void * source); extern gboolean source_start (void * source); extern gboolean source_stop (void * source); +extern void cstring_drop (void * str); + GST_DEBUG_CATEGORY_STATIC (gst_rs_src_debug); #define GST_CAT_DEFAULT gst_rs_src_debug @@ -161,9 +163,13 @@ gst_rs_src_get_property (GObject * object, guint prop_id, GValue * value, GstRsSrc *src = GST_RS_SRC (object); switch (prop_id) { - case PROP_URI: - g_value_take_string (value, source_get_uri (src->instance)); + case PROP_URI: { + gchar *str = source_get_uri (src->instance); + g_value_set_string (value, str); + if (str) + cstring_drop (str); break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/src/utils.rs b/src/utils.rs index 61b3b00b..aa3c8223 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -14,6 +14,10 @@ // License along with this library; if not, write to the // Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, // Boston, MA 02110-1301, USA. +// +// +use libc::c_char; +use std::ffi::CString; #[macro_export] macro_rules! println_err( @@ -52,3 +56,8 @@ impl GBoolean { } } +#[no_mangle] +pub extern "C" fn cstring_drop(ptr: *mut c_char) { + unsafe { CString::from_raw(ptr); } +} +