]> git.sesse.net Git - vlc/commitdiff
RTCP SR is back
authorRémi Denis-Courmont <rem@videolan.org>
Sat, 8 Sep 2007 12:00:13 +0000 (12:00 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Sat, 8 Sep 2007 12:00:13 +0000 (12:00 +0000)
modules/stream_out/rtcp.c
modules/stream_out/rtp.c
modules/stream_out/rtp.h

index b5ed1c3e938ad6394bad1a12720a743996ec5e26..468c76bd4aec9d0e468eb7fc06b0db581ecc2346 100644 (file)
@@ -59,20 +59,21 @@ struct rtcp_sender_t
 };
 
 
-rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd,
-                         int proto, uint16_t dport)
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto)
 {
     rtcp_sender_t *rtcp;
     uint8_t *ptr;
     char src[NI_MAXNUMERICHOST], dst[NI_MAXNUMERICHOST];
-    int sport;
+    int sport, dport;
     int fd;
 
     if (net_GetSockAddress (rtp_fd, src, &sport)
-     || net_GetPeerAddress (rtp_fd, dst, NULL))
+     || net_GetPeerAddress (rtp_fd, dst, &dport))
         return NULL;
 
     sport++;
+    dport++;
+
     fd = net_OpenDgram (obj, src, sport, dst, dport, AF_UNSPEC, proto);
     if (fd == -1)
         return NULL;
@@ -127,7 +128,7 @@ rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd,
     SetWBE (lenptr, ptr - sdes);
 
     rtcp->length = ptr - rtcp->payload;
-    return VLC_SUCCESS;
+    return rtcp;
 }
 
 
index 40ba98d59f8f0b99e0d729129a2aeaa8170dd8f9..49e48f9beeafcf9a5531dd2834b4758af6e897cc 100644 (file)
@@ -224,7 +224,7 @@ typedef int (*pf_rtp_packetizer_t)( sout_stream_t *, sout_stream_id_t *,
 typedef struct rtp_sink_t
 {
     int rtp_fd;
-    int rtcp_fd;
+    rtcp_sender_t *rtcp;
 } rtp_sink_t;
 
 struct sout_stream_id_t
@@ -1314,7 +1314,10 @@ static void ThreadSend( vlc_object_t *p_this )
 
         vlc_mutex_lock( &id->lock_sink );
         for( int i = 0; i < id->sinkc; i++ )
+        {
             send( id->sinkv[i].rtp_fd, out->p_buffer, out->i_buffer, 0 );
+            SendRTCP( id->sinkv[i].rtcp, out );
+        }
         vlc_mutex_unlock( &id->lock_sink );
 
         block_Release( out );
@@ -1328,7 +1331,10 @@ static inline void rtp_packetize_send( sout_stream_id_t *id, block_t *out )
 
 int rtp_add_sink( sout_stream_id_t *id, int fd )
 {
-    rtp_sink_t sink = { fd, -1 };
+    rtp_sink_t sink = { fd, NULL };
+    sink.rtcp = OpenRTCP( VLC_OBJECT( id->p_stream ), fd, IPPROTO_UDP );
+    if( sink.rtcp == NULL )
+        msg_Err( id, "RTCP failed!" );
 
     vlc_mutex_lock( &id->lock_sink );
     INSERT_ELEM( id->sinkv, id->sinkc, id->sinkc, sink );
@@ -1338,18 +1344,23 @@ int rtp_add_sink( sout_stream_id_t *id, int fd )
 
 void rtp_del_sink( sout_stream_id_t *id, int fd )
 {
+    rtp_sink_t sink = { fd, NULL };
+
     /* NOTE: must be safe to use if fd is not included */
     vlc_mutex_lock( &id->lock_sink );
     for( int i = 0; i < id->sinkc; i++ )
     {
         if (id->sinkv[i].rtp_fd == fd)
         {
+            sink = id->sinkv[i];
             REMOVE_ELEM( id->sinkv, id->sinkc, i );
             break;
         }
     }
     vlc_mutex_unlock( &id->lock_sink );
-    net_Close( fd );
+
+    CloseRTCP( sink.rtcp );
+    net_Close( sink.rtp_fd );
 }
 
 /****************************************************************************
index 5e21d6d21035f49832c5dd33447cc76c8b691f87..a9f65ef4b8bdcf53c861a44228295c76660f95a1 100644 (file)
@@ -41,7 +41,6 @@ void rtp_del_sink( sout_stream_id_t *id, int fd );
 
 /* RTCP */
 typedef struct rtcp_sender_t rtcp_sender_t;
-rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd,
-                         int proto, uint16_t dport);
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto);
 void CloseRTCP (rtcp_sender_t *rtcp);
 void SendRTCP (rtcp_sender_t *restrict rtcp, const block_t *rtp);