gst/rtsp/gstrtspsrc.*: Parse server address from SDP.
authorWim Taymans <wim.taymans@gmail.com>
Wed, 25 Apr 2007 08:36:46 +0000 (08:36 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Wed, 25 Apr 2007 08:36:46 +0000 (08:36 +0000)
Original commit message from CVS:
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize),
(gst_rtspsrc_stream_free), (request_pt_map),
(gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open):
* gst/rtsp/gstrtspsrc.h:
Parse server address from SDP.
Hook up a udpsink to send RTCP back to the server.
* docs/plugins/gst-plugins-good-plugins-sections.txt:
* gst/rtsp/rtsptransport.h:
Add some docs.

ChangeLog
docs/plugins/gst-plugins-good-plugins-sections.txt
gst/rtsp/gstrtspsrc.c
gst/rtsp/gstrtspsrc.h
gst/rtsp/rtsptransport.h

index 3792b66..4de511e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2007-04-25  Wim Taymans  <wim@fluendo.com>
+
+       * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize),
+       (gst_rtspsrc_stream_free), (request_pt_map),
+       (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open):
+       * gst/rtsp/gstrtspsrc.h:
+       Parse server address from SDP.
+       Hook up a udpsink to send RTCP back to the server.
+
+       * docs/plugins/gst-plugins-good-plugins-sections.txt:
+       * gst/rtsp/rtsptransport.h:
+       Add some docs.
+
 2007-04-25  Stefan Kost  <ensonic@users.sf.net>
 
        * gst/wavparse/gstwavparse.c: (gst_wavparse_stream_headers):
index d8e572b..86ba733 100644 (file)
@@ -489,6 +489,7 @@ gst_progress_report_get_type
 
 <SECTION>
 <FILE>element-rtspsrc</FILE>
+RTSPLowerTrans
 GstRTSPSrc
 <TITLE>rtspsrc</TITLE>
 <SUBSECTION Standard>
index db0c36a..066a17d 100644 (file)
@@ -311,6 +311,7 @@ gst_rtspsrc_finalize (GObject * object)
   g_free (rtspsrc->req_location);
   g_free (rtspsrc->content_base);
   rtsp_url_free (rtspsrc->url);
+  g_free (rtspsrc->addr);
 
   if (rtspsrc->extension) {
 #ifdef WITH_EXT_REAL
@@ -556,6 +557,12 @@ gst_rtspsrc_stream_free (GstRTSPSrc * src, GstRTSPStream * stream)
       stream->udpsrc[i] = NULL;
     }
   }
+  if (stream->udpsink) {
+    gst_element_set_state (stream->udpsink, GST_STATE_NULL);
+    gst_bin_remove (GST_BIN_CAST (src), stream->udpsink);
+    gst_object_unref (stream->udpsink);
+    stream->udpsink = NULL;
+  }
   if (stream->srcpad) {
     gst_pad_set_active (stream->srcpad, FALSE);
     if (stream->added) {
@@ -1086,6 +1093,8 @@ request_pt_map (GstElement * sess, guint session, guint pt, GstRTSPSrc * src)
   GstRTSPStream *stream;
   GList *lstream;
 
+  GST_DEBUG_OBJECT (src, "getting pt map for pt %d in session %d", pt, session);
+
   lstream = g_list_find_custom (src->streams, GINT_TO_POINTER (session),
       (GCompareFunc) find_stream_by_id);
   if (!lstream)
@@ -1093,8 +1102,6 @@ request_pt_map (GstElement * sess, guint session, guint pt, GstRTSPSrc * src)
 
   stream = (GstRTSPStream *) lstream->data;
 
-  GST_DEBUG_OBJECT (src, "getting pt map for pt %d in session %d", pt, session);
-
   return stream->caps;
 
 unknown_stream:
@@ -1312,6 +1319,38 @@ use_no_manager:
         gst_object_unref (pad);
       }
     }
+    /* configure udpsink back to the server for RTCP messages. */
+    {
+      GstPad *pad;
+
+      stream->udpsink = gst_element_factory_make ("udpsink", NULL);
+      if (stream->udpsink == NULL)
+        goto no_sink_element;
+
+      /* we keep this playing always */
+      gst_element_set_locked_state (stream->udpsink, TRUE);
+      gst_element_set_state (stream->udpsink, GST_STATE_PLAYING);
+
+      /* no sync needed */
+      g_object_set (G_OBJECT (stream->udpsink), "sync", FALSE, NULL);
+
+      /* configure host and port */
+      g_object_set (G_OBJECT (stream->udpsink), "host", src->addr, "port",
+          transport->server_port.max, NULL);
+
+      gst_object_ref (stream->udpsink);
+      gst_bin_add (GST_BIN_CAST (src), stream->udpsink);
+
+      stream->rtcppad = gst_element_get_pad (stream->udpsink, "sink");
+
+      /* get session RTCP pad */
+      name = g_strdup_printf ("rtcp_src_%d", stream->id);
+      pad = gst_element_get_request_pad (src->session, name);
+      g_free (name);
+
+      /* and link */
+      gst_pad_link (pad, stream->rtcppad);
+    }
   }
 
   if (src->session && !src->session_sig_id) {
@@ -1365,6 +1404,11 @@ no_element:
     GST_DEBUG_OBJECT (src, "no UDP source element found");
     return FALSE;
   }
+no_sink_element:
+  {
+    GST_DEBUG_OBJECT (src, "no UDP sink element found");
+    return FALSE;
+  }
 start_session_failure:
   {
     GST_DEBUG_OBJECT (src, "could not start session");
@@ -2570,6 +2614,16 @@ gst_rtspsrc_open (GstRTSPSrc * src)
   if (src->extension && src->extension->parse_sdp)
     src->extension->parse_sdp (src->extension, &sdp);
 
+  /* parse address */
+  {
+    SDPOrigin *origin;
+
+    origin = sdp_message_get_origin (&sdp);
+
+    g_free (src->addr);
+    src->addr = g_strdup (origin->addr);
+  }
+
   /* create streams */
   n_streams = sdp_message_medias_len (&sdp);
   for (i = 0; i < n_streams; i++) {
index 19cf7f1..c35c943 100644 (file)
@@ -96,6 +96,7 @@ struct _GstRTSPStream {
 
   /* our udp sink back to the server */
   GstElement   *udpsink;
+  GstPad       *rtcppad;
 
   /* state */
   gint          pt;
@@ -142,6 +143,7 @@ struct _GstRTSPSrc {
   gchar           *content_base;
   RTSPLowerTrans   cur_protocols;
   gboolean         tried_url_auth;
+  gchar           *addr;
 
   /* supported methods */
   gint             methods;
index 76e2910..0581839 100644 (file)
 
 G_BEGIN_DECLS
 
+/**
+ * RTSPTransMode:
+ * @RTSP_TRANS_UNKNOWN: invalid tansport mode
+ * @RTSP_TRANS_RTP: transfer RTP data
+ * @RTSP_TRANS_RDT: transfer RDT (RealMedia) data
+ *
+ * The transfer mode to use.
+ */
 typedef enum {
   RTSP_TRANS_UNKNOWN =  0,
   RTSP_TRANS_RTP     = (1 << 0),
   RTSP_TRANS_RDT     = (1 << 1)
 } RTSPTransMode;
 
+/**
+ * RTSPProfile:
+ * @RTSP_PROFILE_UNKNOWN: invalid profile
+ * @RTSP_PROFILE_AVP: the Audio/Visual profile
+ * @RTSP_PROFILE_SAVP: the secure Audio/Visual profile
+ *
+ * The transfer profile to use.
+ */
 typedef enum {
   RTSP_PROFILE_UNKNOWN =  0,
   RTSP_PROFILE_AVP     = (1 << 0),
   RTSP_PROFILE_SAVP    = (1 << 1)
 } RTSPProfile;
 
+/**
+ * RTSPLowerTrans:
+ * @RTSP_LOWER_TRANS_UNKNOWN: invalid transport flag
+ * @RTSP_LOWER_TRANS_UDP: stream data over UDP
+ * @RTSP_LOWER_TRANS_UDP_MCAST: stream data over UDP multicast
+ * @RTSP_LOWER_TRANS_TCP: stream data over TCP
+ *
+ * The different transport methods.
+ */
 typedef enum {
   RTSP_LOWER_TRANS_UNKNOWN   = 0,
   RTSP_LOWER_TRANS_UDP       = (1 << 0),
@@ -66,13 +91,26 @@ typedef enum {
   RTSP_LOWER_TRANS_TCP       = (1 << 2)
 } RTSPLowerTrans;
 
+/**
+ * RTSPRange:
+ * @min: minimum value of the range
+ * @max: maximum value of the range
+ *
+ * A type to specify a range.
+ */
 typedef struct
 {
   gint min;
   gint max;
 } RTSPRange;
 
+/**
+ * RTSPTransport:
+ *
+ * A structure holding the RTSP transport values.
+ */
 typedef struct _RTSPTransport {
+  /*< private >*/
   RTSPTransMode  trans;
   RTSPProfile    profile;
   RTSPLowerTrans lower_transport;