if (client->uri)
gst_rtsp_url_free (client->uri);
- if (client->media)
+ if (client->media) {
+ gst_rtsp_media_unprepare (client->media);
g_object_unref (client->media);
+ }
g_free (client->server_ip);
if (client->uri)
gst_rtsp_url_free (client->uri);
client->uri = NULL;
- if (client->media)
+ if (client->media) {
+ gst_rtsp_media_unprepare (client->media);
g_object_unref (client->media);
+ }
client->media = NULL;
if (!client->media_mapping)
return ret;
}
+static void
+watch_destroyed (GstRTSPMedia * media)
+{
+ GST_DEBUG_OBJECT (media, "source destroyed");
+ gst_object_unref (media);
+}
+
/* called from streaming threads */
static void
pad_added_cb (GstElement * element, GstPad * pad, GstRTSPMedia * media)
media->source = gst_bus_create_watch (bus);
gst_object_unref (bus);
- g_source_set_callback (media->source, (GSourceFunc) bus_message, media, NULL);
+ g_source_set_callback (media->source, (GSourceFunc) bus_message,
+ gst_object_ref (media), (GDestroyNotify) watch_destroyed);
klass = GST_RTSP_MEDIA_GET_CLASS (media);
media->id = g_source_attach (media->source, klass->context);
} else {
finish_unprepare (media);
}
+ if (media->source) {
+ g_source_destroy (media->source);
+ g_source_unref (media->source);
+ media->source = NULL;
+ }
g_rec_mutex_unlock (&media->state_lock);
return success;