From 704720f306d2025282b3789fce89bfaa8ecadf51 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 29 Jan 2009 18:55:22 +0100 Subject: [PATCH] Cleanups to the session object 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 | 60 +++++++++++++++++++--------------- gst/rtsp-server/rtsp-session.h | 9 ++--- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/gst/rtsp-server/rtsp-session.c b/gst/rtsp-server/rtsp-session.c index a5efc79235..cd5fd85eea 100644 --- a/gst/rtsp-server/rtsp-session.c +++ b/gst/rtsp-server/rtsp-session.c @@ -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; - - for (walk = media->streams; walk; walk = g_list_next (walk)) { - GstRTSPSessionStream *stream = (GstRTSPSessionStream *) walk->data; - - gst_rtsp_session_free_stream (stream); - } + g_list_foreach (media->streams, (GFunc) gst_rtsp_session_free_stream, + media); g_list_free (media->streams); + + if (media->url) + gst_rtsp_url_free (media->url); + + 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; } diff --git a/gst/rtsp-server/rtsp-session.h b/gst/rtsp-server/rtsp-session.h index 9905753ef0..3ff5ba05f4 100644 --- a/gst/rtsp-server/rtsp-session.h +++ b/gst/rtsp-server/rtsp-session.h @@ -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 {