Cleanups to the session object
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 29 Jan 2009 17:55:22 +0000 (18:55 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 30 Jan 2009 11:17:57 +0000 (12:17 +0100)
Remove some unneeded variables in the session state of a stream such as the
owner media and the server transport.
Get the configuration of a media stream in a session based on the media_stream
in the original object instead of our cached index.
Free more data in the finalize method.

gst/rtsp-server/rtsp-session.c
gst/rtsp-server/rtsp-session.h

index a5efc79..cd5fd85 100644 (file)
@@ -42,7 +42,7 @@ gst_rtsp_session_init (GstRTSPSession * session)
 }
 
 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);
@@ -51,35 +51,36 @@ gst_rtsp_session_free_stream (GstRTSPSessionStream *stream)
 }
 
 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);
 }
 
@@ -156,27 +157,38 @@ GstRTSPSessionStream *
 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;
+  }
 }
 
 /**
@@ -210,9 +222,6 @@ gst_rtsp_session_stream_set_transport (GstRTSPSessionStream *stream,
     GstRTSPTransport *ct)
 {
   GstRTSPTransport *st;
-  GstRTSPSessionMedia *media;
-
-  media = stream->media;
 
   /* prepare the server transport */
   gst_rtsp_transport_new (&st);
@@ -229,7 +238,6 @@ gst_rtsp_session_stream_set_transport (GstRTSPSessionStream *stream,
 
   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;
 }
index 9905753..3ff5ba0 100644 (file)
@@ -51,22 +51,17 @@ typedef struct _GstRTSPSessionMedia GstRTSPSessionMedia;
  */
 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
 {