}
static void
-gst_rtsp_session_free_stream (GstRTSPSessionStream *stream)
+gst_rtsp_session_free_stream (GstRTSPSessionStream *stream, GstRTSPSessionMedia *media)
{
if (stream->client_trans)
gst_rtsp_transport_free (stream->client_trans);
}
static void
-gst_rtsp_session_free_media (GstRTSPSessionMedia *media)
+gst_rtsp_session_free_media (GstRTSPSessionMedia *media, GstRTSPSession *session)
{
- GList *walk;
+ g_list_foreach (media->streams, (GFunc) gst_rtsp_session_free_stream,
+ media);
+ g_list_free (media->streams);
- for (walk = media->streams; walk; walk = g_list_next (walk)) {
- GstRTSPSessionStream *stream = (GstRTSPSessionStream *) walk->data;
+ if (media->url)
+ gst_rtsp_url_free (media->url);
- gst_rtsp_session_free_stream (stream);
- }
- g_list_free (media->streams);
+ if (media->media)
+ g_object_unref (media->media);
+
+ g_free (media);
}
static void
gst_rtsp_session_finalize (GObject * obj)
{
GstRTSPSession *session;
- GList *walk;
session = GST_RTSP_SESSION (obj);
- g_free (session->sessionid);
-
- for (walk = session->medias; walk; walk = g_list_next (walk)) {
- GstRTSPSessionMedia *media = (GstRTSPSessionMedia *) walk->data;
-
- gst_rtsp_session_free_media (media);
- }
+ /* free all media */
+ g_list_foreach (session->medias, (GFunc) gst_rtsp_session_free_media,
+ session);
g_list_free (session->medias);
+ /* free session id */
+ g_free (session->sessionid);
+
G_OBJECT_CLASS (gst_rtsp_session_parent_class)->finalize (obj);
}
gst_rtsp_session_media_get_stream (GstRTSPSessionMedia *media, guint idx)
{
GstRTSPSessionStream *result;
+ GstRTSPMediaStream *media_stream;
GList *walk;
- result = NULL;
+ g_return_val_if_fail (media != NULL, NULL);
+ g_return_val_if_fail (media->media != NULL, NULL);
+
+ media_stream = gst_rtsp_media_get_stream (media->media, idx);
+ if (media_stream == NULL)
+ goto no_media;
+ result = NULL;
for (walk = media->streams; walk; walk = g_list_next (walk)) {
result = (GstRTSPSessionStream *) walk->data;
- if (result->idx == idx)
+ if (result->media_stream == media_stream)
break;
result = NULL;
}
if (result == NULL) {
result = g_new0 (GstRTSPSessionStream, 1);
- result->idx = idx;
- result->media = media;
- result->media_stream = gst_rtsp_media_get_stream (media->media, idx);
+ result->media_stream = media_stream;
media->streams = g_list_prepend (media->streams, result);
}
return result;
+
+ /* ERRORS */
+no_media:
+ {
+ return NULL;
+ }
}
/**
GstRTSPTransport *ct)
{
GstRTSPTransport *st;
- GstRTSPSessionMedia *media;
-
- media = stream->media;
/* prepare the server transport */
gst_rtsp_transport_new (&st);
st->server_port.min = stream->media_stream->server_port.min;
st->server_port.max = stream->media_stream->server_port.max;
- stream->server_trans = st;
return st;
}
*/
struct _GstRTSPSessionStream
{
- guint idx;
-
- /* the owner media */
- GstRTSPSessionMedia *media;
-
+ /* the stream of the media */
GstRTSPMediaStream *media_stream;
/* client and server transports */
GstRTSPTransport *client_trans;
- GstRTSPTransport *server_trans;
};
/**
* GstRTSPSessionMedia:
*
- * State of a client session regarding a specific media.
+ * State of a client session regarding a specific media identified by uri.
*/
struct _GstRTSPSessionMedia
{