]> git.sesse.net Git - vlc/commitdiff
RTCP: support for RTP/RTCP multiplexed on the same port
authorRémi Denis-Courmont <rem@videolan.org>
Wed, 19 Sep 2007 19:30:01 +0000 (19:30 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Wed, 19 Sep 2007 19:30:01 +0000 (19:30 +0000)
modules/stream_out/rtcp.c
modules/stream_out/rtp.c
modules/stream_out/rtp.h

index 468c76bd4aec9d0e468eb7fc06b0db581ecc2346..ba724d9af52d500a058612b909ecd9af62c15262 100644 (file)
@@ -59,22 +59,45 @@ struct rtcp_sender_t
 };
 
 
-rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto)
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto,
+                         vlc_bool_t mux)
 {
     rtcp_sender_t *rtcp;
     uint8_t *ptr;
-    char src[NI_MAXNUMERICHOST], dst[NI_MAXNUMERICHOST];
-    int sport, dport;
     int fd;
+    char src[NI_MAXNUMERICHOST];
+    int sport;
 
-    if (net_GetSockAddress (rtp_fd, src, &sport)
-     || net_GetPeerAddress (rtp_fd, dst, &dport))
+    if (net_GetSockAddress (rtp_fd, src, &sport))
         return NULL;
 
-    sport++;
-    dport++;
+    if (mux)
+    {
+        /* RTP/RTCP mux: duplicate the socket */
+#ifndef WIN32
+        fd = dup (rtp_fd);
+#else
+        WSAPROTOCOL_INFO info;
+        WSADuplicateSocket (rtp_fd, GetProcessId (), &info);
+        fd = WSASocket (info.iAddressFamily, info.iSockets, info.iProtocol,
+                        &info, 0, 0);
+#endif
+    }
+    else
+    {
+        /* RTCP on a separate port */
+        char dst[NI_MAXNUMERICHOST];
+        int dport;
+
+        if (net_GetPeerAddress (rtp_fd, dst, &dport))
+            return NULL;
+
+        sport++;
+        dport++;
+
+        fd = net_OpenDgram (obj, src, sport, dst, dport, AF_UNSPEC, proto);
+    }
 
-    fd = net_OpenDgram (obj, src, sport, dst, dport, AF_UNSPEC, proto);
     if (fd == -1)
         return NULL;
 
index ca386d4c28295808d1a49070840f355aec8925e8..203e1d43be20d2bb75af28b13b71b2aff24bff9b 100644 (file)
@@ -1421,7 +1421,7 @@ 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, NULL };
-    sink.rtcp = OpenRTCP( VLC_OBJECT( id->p_stream ), fd, IPPROTO_UDP );
+    sink.rtcp = OpenRTCP( VLC_OBJECT( id->p_stream ), fd, IPPROTO_UDP, 0 );
     if( sink.rtcp == NULL )
         msg_Err( id, "RTCP failed!" );
 
index a9f65ef4b8bdcf53c861a44228295c76660f95a1..850293c4f51ddc64f656d1a5195263e8bf331bf2 100644 (file)
@@ -41,6 +41,7 @@ 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);
+rtcp_sender_t *OpenRTCP (vlc_object_t *obj, int rtp_fd, int proto,
+                         vlc_bool_t mux);
 void CloseRTCP (rtcp_sender_t *rtcp);
 void SendRTCP (rtcp_sender_t *restrict rtcp, const block_t *rtp);