rtsp: only create transport when needed
authorWim Taymans <wim.taymans@collabora.co.uk>
Sat, 27 Oct 2012 22:23:57 +0000 (00:23 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Sat, 27 Oct 2012 22:23:57 +0000 (00:23 +0200)
Only create the StreamTransport when configured.

gst/rtsp-server/rtsp-client.c
gst/rtsp-server/rtsp-session-media.c
gst/rtsp-server/rtsp-session-media.h
gst/rtsp-server/rtsp-stream-transport.c
gst/rtsp-server/rtsp-stream-transport.h

index 7421065..f648333 100644 (file)
@@ -537,12 +537,13 @@ unlink_session_transports (GstRTSPClient * client, GstRTSPSession * session,
     GstRTSPStreamTransport *trans;
     GstRTSPTransport *tr;
 
-    /* get the stream as configured in the session */
-    trans = gst_rtsp_session_media_get_transport (media, i);
     /* get the transport, if there is no transport configured, skip this stream */
-    if (!(tr = trans->transport))
+    trans = gst_rtsp_session_media_get_transport (media, i);
+    if (trans == NULL)
       continue;
 
+    tr = trans->transport;
+
     if (tr->lower_transport == GST_RTSP_LOWER_TRANS_TCP) {
       /* for TCP, unlink the stream from the TCP connection of the client */
       unlink_transport (client, session, trans);
@@ -815,13 +816,13 @@ handle_play_request (GstRTSPClient * client, GstRTSPClientState * state)
     gchar *uristr;
     guint rtptime, seq;
 
-    /* get the stream as configured in the session */
-    trans = gst_rtsp_session_media_get_transport (media, i);
     /* get the transport, if there is no transport configured, skip this stream */
-    if (!(tr = trans->transport)) {
+    trans = gst_rtsp_session_media_get_transport (media, i);
+    if (trans == NULL) {
       GST_INFO ("stream %d is not configured", i);
       continue;
     }
+    tr = trans->transport;
 
     if (tr->lower_transport == GST_RTSP_LOWER_TRANS_TCP) {
       /* for TCP, link the stream to the TCP connection of the client */
@@ -1153,8 +1154,7 @@ handle_setup_request (GstRTSPClient * client, GstRTSPClientState * state)
   configure_client_transport (client, state, ct);
 
   /* set in the session media transport */
-  trans = gst_rtsp_session_media_get_transport (sessmedia, streamid);
-  gst_rtsp_stream_transport_set_transport (trans, ct);
+  trans = gst_rtsp_session_media_set_transport (sessmedia, stream, ct);
 
   /* configure keepalive for this transport */
   gst_rtsp_stream_transport_set_keepalive (trans,
index 12a01d4..7b100a6 100644 (file)
@@ -117,11 +117,41 @@ gst_rtsp_session_media_new (const GstRTSPUrl * url, GstRTSPMedia * media)
 }
 
 /**
+ * gst_rtsp_session_media_set_transport:
+ * @media: a #GstRTSPSessionMedia
+ * @stream: a #GstRTSPStream
+ * @tr: a #GstRTSPTransport
+ *
+ * Configure the transport for @stream to @tr in @media.
+ *
+ * Returns: the new or updated #GstRTSPStreamTransport for @stream.
+ */
+GstRTSPStreamTransport *
+gst_rtsp_session_media_set_transport (GstRTSPSessionMedia * media,
+    GstRTSPStream * stream, GstRTSPTransport * tr)
+{
+  GstRTSPStreamTransport *result;
+
+  g_return_val_if_fail (GST_IS_RTSP_SESSION_MEDIA (media), NULL);
+  g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), NULL);
+  g_return_val_if_fail (stream->idx < media->transports->len, NULL);
+
+  result = g_ptr_array_index (media->transports, stream->idx);
+  if (result == NULL) {
+    result = gst_rtsp_stream_transport_new (stream, tr);
+    g_ptr_array_index (media->transports, stream->idx) = result;
+  } else {
+    gst_rtsp_stream_transport_set_transport (result, tr);
+  }
+  return result;
+}
+
+/**
  * gst_rtsp_session_media_get_transport:
  * @media: a #GstRTSPSessionMedia
  * @idx: the stream index
  *
- * Get a previously created or create a new #GstRTSPStreamTransport at @idx.
+ * Get a previously created #GstRTSPStreamTransport for the stream at @idx.
  *
  * Returns: a #GstRTSPStreamTransport that is valid until the session of @media
  * is unreffed.
@@ -132,30 +162,11 @@ gst_rtsp_session_media_get_transport (GstRTSPSessionMedia * media, guint idx)
   GstRTSPStreamTransport *result;
 
   g_return_val_if_fail (GST_IS_RTSP_SESSION_MEDIA (media), NULL);
-  g_return_val_if_fail (media->media != NULL, NULL);
-
-  if (idx >= media->transports->len)
-    return NULL;
+  g_return_val_if_fail (idx < media->transports->len, NULL);
 
   result = g_ptr_array_index (media->transports, idx);
-  if (result == NULL) {
-    GstRTSPStream *stream;
 
-    stream = gst_rtsp_media_get_stream (media->media, idx);
-    if (stream == NULL)
-      goto no_media;
-
-    result = gst_rtsp_stream_transport_new (stream);
-
-    g_ptr_array_index (media->transports, idx) = result;
-  }
   return result;
-
-  /* ERRORS */
-no_media:
-  {
-    return NULL;
-  }
 }
 
 /**
index ac9588f..45e1bb2 100644 (file)
@@ -75,6 +75,9 @@ gboolean                 gst_rtsp_session_media_set_state      (GstRTSPSessionMe
                                                                 GstState state);
 
 /* get stream transport config */
+GstRTSPStreamTransport * gst_rtsp_session_media_set_transport  (GstRTSPSessionMedia *media,
+                                                                GstRTSPStream *stream,
+                                                                GstRTSPTransport *tr);
 GstRTSPStreamTransport * gst_rtsp_session_media_get_transport  (GstRTSPSessionMedia *media,
                                                                 guint idx);
 
index 1151f3d..c8ef8b0 100644 (file)
@@ -82,21 +82,24 @@ gst_rtsp_stream_transport_finalize (GObject * obj)
 /**
  * gst_rtsp_stream_transport_new:
  * @stream: a #GstRTSPStream
+ * @tr: (transfer full): a GstRTSPTransport
  *
  * Create a new #GstRTSPStreamTransport that can be used to manage
- * @stream.
+ * @stream with transport @tr.
  *
  * Returns: a new #GstRTSPStreamTransport
  */
 GstRTSPStreamTransport *
-gst_rtsp_stream_transport_new (GstRTSPStream * stream)
+gst_rtsp_stream_transport_new (GstRTSPStream * stream, GstRTSPTransport * tr)
 {
   GstRTSPStreamTransport *trans;
 
   g_return_val_if_fail (GST_IS_RTSP_STREAM (stream), NULL);
+  g_return_val_if_fail (tr != NULL, NULL);
 
   trans = g_object_new (GST_TYPE_RTSP_STREAM_TRANSPORT, NULL);
   trans->stream = stream;
+  trans->transport = tr;
 
   return trans;
 }
@@ -150,20 +153,20 @@ gst_rtsp_stream_transport_set_keepalive (GstRTSPStreamTransport * trans,
 /**
  * gst_rtsp_stream_transport_set_transport:
  * @trans: a #GstRTSPStreamTransport
- * @ct: a client #GstRTSPTransport
+ * @tr: (transfer full): a client #GstRTSPTransport
  *
  * Set @ct as the client transport. This function takes ownership of
- * the passed @ct.
+ * the passed @tr.
  */
 void
 gst_rtsp_stream_transport_set_transport (GstRTSPStreamTransport * trans,
-    GstRTSPTransport * ct)
+    GstRTSPTransport * tr)
 {
   g_return_if_fail (GST_IS_RTSP_STREAM_TRANSPORT (trans));
-  g_return_if_fail (ct != NULL);
+  g_return_if_fail (tr != NULL);
 
   /* keep track of the transports in the stream. */
   if (trans->transport)
     gst_rtsp_transport_free (trans->transport);
-  trans->transport = ct;
+  trans->transport = tr;
 }
index 913e789..eec7c04 100644 (file)
@@ -89,10 +89,11 @@ struct _GstRTSPStreamTransportClass {
 
 GType                    gst_rtsp_stream_transport_get_type (void);
 
-GstRTSPStreamTransport * gst_rtsp_stream_transport_new           (GstRTSPStream *stream);
+GstRTSPStreamTransport * gst_rtsp_stream_transport_new           (GstRTSPStream *stream,
+                                                                  GstRTSPTransport *tr);
 
 void                     gst_rtsp_stream_transport_set_transport (GstRTSPStreamTransport *trans,
-                                                                  GstRTSPTransport * ct);
+                                                                  GstRTSPTransport * tr);
 
 void                     gst_rtsp_stream_transport_set_callbacks (GstRTSPStreamTransport *trans,
                                                                   GstRTSPSendFunc send_rtp,