From 308ad6f6d00ad98999fa1b5ceb8fc99a3c6b85af Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 13 Feb 2009 19:52:05 +0100 Subject: [PATCH] Add support for session keepalive Get and update the session timeout for all requests. get the session as early as possible. --- gst/rtsp-server/rtsp-client.c | 75 +++++++++++++---------------------- 1 file changed, 28 insertions(+), 47 deletions(-) diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index ed19555000..f0c0eb7848 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -289,7 +289,7 @@ no_prepare: /* Get the session or NULL when there was no session */ static GstRTSPSession * -ensure_session (GstRTSPClient *client, GstRTSPMessage *request) +find_session (GstRTSPClient *client, GstRTSPMessage *request) { GstRTSPResult res; GstRTSPSession *session; @@ -314,30 +314,26 @@ ensure_session (GstRTSPClient *client, GstRTSPMessage *request) /* ERRORS */ no_pool: { - send_generic_response (client, GST_RTSP_STS_SESSION_NOT_FOUND, request); return NULL; } session_not_found: { - send_generic_response (client, GST_RTSP_STS_SESSION_NOT_FOUND, request); return NULL; } service_unavailable: { - send_generic_response (client, GST_RTSP_STS_SERVICE_UNAVAILABLE, request); return NULL; } } static gboolean -handle_teardown_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_teardown_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPSessionMedia *media; - GstRTSPSession *session; GstRTSPMessage response = { 0 }; GstRTSPStatusCode code; - if (!(session = ensure_session (client, request))) + if (!session) goto no_session; /* get a handle to the configuration of the media in the session */ @@ -359,14 +355,12 @@ handle_teardown_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage send_response (client, session, &response); - g_object_unref (session); - return FALSE; /* ERRORS */ no_session: { - /* error was sent already */ + send_generic_response (client, GST_RTSP_STS_SESSION_NOT_FOUND, request); return FALSE; } not_found: @@ -377,14 +371,13 @@ not_found: } static gboolean -handle_pause_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_pause_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPSessionMedia *media; - GstRTSPSession *session; GstRTSPMessage response = { 0 }; GstRTSPStatusCode code; - if (!(session = ensure_session (client, request))) + if (!session) goto no_session; /* get a handle to the configuration of the media in the session */ @@ -407,34 +400,31 @@ handle_pause_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *re /* the state is now READY */ media->state = GST_RTSP_STATE_READY; - g_object_unref (session); return FALSE; /* ERRORS */ no_session: { + send_generic_response (client, GST_RTSP_STS_SESSION_NOT_FOUND, request); return FALSE; } not_found: { send_generic_response (client, GST_RTSP_STS_NOT_FOUND, request); - g_object_unref (session); return FALSE; } invalid_state: { send_generic_response (client, GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE, request); - g_object_unref (session); return FALSE; } } static gboolean -handle_play_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_play_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPSessionMedia *media; - GstRTSPSession *session; GstRTSPMessage response = { 0 }; GstRTSPStatusCode code; GString *rtpinfo; @@ -442,7 +432,7 @@ handle_play_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *req guint timestamp, seqnum; gchar *str; - if (!(session = ensure_session (client, request))) + if (!session) goto no_session; /* get a handle to the configuration of the media in the session */ @@ -494,7 +484,6 @@ handle_play_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *req gst_rtsp_session_media_play (media); media->state = GST_RTSP_STATE_PLAYING; - g_object_unref (session); return FALSE; @@ -507,27 +496,23 @@ no_session: not_found: { send_generic_response (client, GST_RTSP_STS_NOT_FOUND, request); - g_object_unref (session); return FALSE; } invalid_state: { send_generic_response (client, GST_RTSP_STS_METHOD_NOT_VALID_IN_THIS_STATE, request); - g_object_unref (session); return FALSE; } } static gboolean -handle_setup_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_setup_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPResult res; - gchar *sessid; gchar *transport; gchar **transports; gboolean have_transport; GstRTSPTransport *ct, *st; - GstRTSPSession *session; gint i; GstRTSPLowerTrans supported; GstRTSPMessage response = { 0 }; @@ -597,14 +582,8 @@ handle_setup_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *re g_free (ct->destination); ct->destination = g_strdup (inet_ntoa (client->address.sin_addr)); - /* a setup request creates a session for a client, check if the client already - * sent a session id to us */ - res = gst_rtsp_message_get_header (request, GST_RTSP_HDR_SESSION, &sessid, 0); - if (res == GST_RTSP_OK) { - /* we had a session in the request, find it again */ - if (!(session = gst_rtsp_session_pool_find (client->session_pool, sessid))) - goto session_not_found; - + if (session) { + g_object_ref (session); /* get a handle to the configuration of the media in the session, this can * return NULL if this is a new url to manage in this session. */ media = gst_rtsp_session_get_media (session, uri); @@ -669,7 +648,6 @@ handle_setup_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *re media->state = GST_RTSP_STATE_READY; break; } - g_object_unref (session); return TRUE; @@ -683,17 +661,14 @@ bad_request: not_found: { send_generic_response (client, GST_RTSP_STS_NOT_FOUND, request); + g_object_unref (session); return FALSE; } no_stream: { send_generic_response (client, GST_RTSP_STS_NOT_FOUND, request); g_object_unref (media); - return FALSE; - } -session_not_found: - { - send_generic_response (client, GST_RTSP_STS_SESSION_NOT_FOUND, request); + g_object_unref (session); return FALSE; } no_transport: @@ -721,7 +696,7 @@ service_unavailable: /* for the describe we must generate an SDP */ static gboolean -handle_describe_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_describe_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPMessage response = { 0 }; GstRTSPResult res; @@ -787,7 +762,7 @@ no_sdp: } static void -handle_options_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPMessage *request) +handle_options_request (GstRTSPClient *client, GstRTSPUrl *uri, GstRTSPSession *session, GstRTSPMessage *request) { GstRTSPMessage response = { 0 }; GstRTSPMethod options; @@ -852,6 +827,7 @@ handle_client (GstRTSPClient *client) while (TRUE) { GTimeVal timeout; + GstRTSPSession *session; timeout.tv_sec = client->timeout; timeout.tv_usec = 0; @@ -886,25 +862,28 @@ handle_client (GstRTSPClient *client) /* sanitize the uri */ santize_uri (uri); + /* get the session if there is any */ + session = find_session (client, &request); + /* now see what is asked and dispatch to a dedicated handler */ switch (method) { case GST_RTSP_OPTIONS: - handle_options_request (client, uri, &request); + handle_options_request (client, uri, session, &request); break; case GST_RTSP_DESCRIBE: - handle_describe_request (client, uri, &request); + handle_describe_request (client, uri, session, &request); break; case GST_RTSP_SETUP: - handle_setup_request (client, uri, &request); + handle_setup_request (client, uri, session, &request); break; case GST_RTSP_PLAY: - handle_play_request (client, uri, &request); + handle_play_request (client, uri, session, &request); break; case GST_RTSP_PAUSE: - handle_pause_request (client, uri, &request); + handle_pause_request (client, uri, session, &request); break; case GST_RTSP_TEARDOWN: - handle_teardown_request (client, uri, &request); + handle_teardown_request (client, uri, session, &request); break; case GST_RTSP_ANNOUNCE: case GST_RTSP_GET_PARAMETER: @@ -918,6 +897,8 @@ handle_client (GstRTSPClient *client) send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, &request); break; } + if (session) + g_object_unref (session); gst_rtsp_url_free (uri); } g_object_unref (client);