Module: sems
Branch: rco/sbc_rtp_relay
Commit: d92bf7e2b7a63682b1eab509b4d586af4174cf7f
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=d92bf7e2b7a63682b1eab509b4d586af4174cf7f

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Wed Feb 16 15:31:59 2011 +0100

changed relay_rtp_stream to AmRtpStream**.

this allows for non-default AmRtpStream constructor.

---

 core/AmB2BSession.cpp |   44 +++++++++++++++++++++++++++++---------------
 core/AmB2BSession.h   |    2 +-
 core/AmRtpStream.cpp  |    8 ++++++--
 3 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp
index 73fc74b..cfe5e0b 100644
--- a/core/AmB2BSession.cpp
+++ b/core/AmB2BSession.cpp
@@ -67,8 +67,11 @@ AmB2BSession::~AmB2BSession()
   if (rtp_relay_enabled)
     clearRtpReceiverRelay();
 
-  if (NULL != relay_rtp_streams)
+  if (NULL != relay_rtp_streams){
+    for(unsigned int i=0; i<relay_rtp_streams_cnt; i++)
+      delete relay_rtp_streams[i];
     delete[] relay_rtp_streams;
+  }
 
   DBG("relayed_req.size() = %u\n",(unsigned int)relayed_req.size());
   DBG("recvd_req.size() = %u\n",(unsigned int)recvd_req.size());
@@ -268,13 +271,16 @@ void AmB2BSession::updateRelayStreams(const string& 
content_type, const string&
   if (NULL == relay_rtp_streams) {
     relay_rtp_streams_cnt = parser_sdp.media.size();
     if (relay_rtp_streams_cnt > MAX_RELAY_STREAMS) {
-      WARN("got SDP with more media streams (%zd) than MAX_RELAY_STREAMS (%u),"
+      WARN("got SDP with more media streams (%d) than MAX_RELAY_STREAMS (%u),"
           "consider changing MAX_RELAY_STREAMS and rebuilding SEMS.\n",
           relay_rtp_streams_cnt, MAX_RELAY_STREAMS);
       relay_rtp_streams_cnt = MAX_RELAY_STREAMS;
     }
 
-    relay_rtp_streams = new AmRtpStream[relay_rtp_streams_cnt];
+    relay_rtp_streams = new AmRtpStream*[relay_rtp_streams_cnt];
+    for(unsigned int i=0; i<relay_rtp_streams_cnt; i++){
+      relay_rtp_streams[i] = new AmRtpStream(NULL,dlg.getOutboundIf());
+    }
     DBG("Created %u RTP relay streams\n", relay_rtp_streams_cnt);
   }
 
@@ -290,11 +296,15 @@ void AmB2BSession::updateRelayStreams(const string& 
content_type, const string&
     if (r_addr.empty())
       r_addr = parser_sdp.conn.address;
 
+    // TODO:
+    //  - disable streams with port == 0
+
     DBG("initializing RTP relay stream %u with remote <%s:%u>\n",
        media_index, r_addr.c_str(), it->port);
-    relay_rtp_streams[media_index].setRAddr(r_addr, it->port);
+
+    relay_rtp_streams[media_index]->setRAddr(r_addr, it->port);
     if (sdp.remote_active || rtp_relay_force_symmetric_rtp) {
-      relay_rtp_streams[media_index].setPassiveMode(true);
+      relay_rtp_streams[media_index]->setPassiveMode(true);
     }
     media_index ++;
   }
@@ -323,6 +333,8 @@ bool AmB2BSession::replaceConnectionAddress(const string& 
content_type,
   if (!parser_sdp.conn.address.empty())
     parser_sdp.conn.address = advertisedIP();
 
+  DBG("new connection address: %s",parser_sdp.conn.address.c_str());
+
   string replaced_ports;
 
   unsigned int media_index = 0;
@@ -336,7 +348,7 @@ bool AmB2BSession::replaceConnectionAddress(const string& 
content_type,
     if (!it->conn.address.empty())
       it->conn.address = advertisedIP();
     try {
-      it->port = relay_rtp_streams[media_index].getLocalPort();
+      it->port = relay_rtp_streams[media_index]->getLocalPort();
       replaced_ports += (!media_index) ? int2str(it->port) : 
"/"+int2str(it->port);
     } catch (const string& s) {
       ERROR("setting port: '%s'\n", s.c_str());
@@ -726,17 +738,19 @@ void AmB2BSession::setupRelayStreams(AmB2BSession* 
other_session) {
     relay_rtp_streams_cnt = other_session->relay_rtp_streams_cnt;
     DBG("creating %u RTP streams from other_session\n",
        relay_rtp_streams_cnt);
-    relay_rtp_streams = new AmRtpStream[relay_rtp_streams_cnt];
+    relay_rtp_streams = new AmRtpStream*[relay_rtp_streams_cnt];
+    for(unsigned int i=0; i<relay_rtp_streams_cnt; i++){
+      relay_rtp_streams[i] = new AmRtpStream(NULL,dlg.getOutboundIf());
+    }
   }
 
-
   // link the other streams as our relay streams
   for (unsigned int i=0; i<relay_rtp_streams_cnt; i++) {
-    other_session->relay_rtp_streams[i].setRelayStream(&relay_rtp_streams[i]);
-    other_stream_fds[i] = other_session->relay_rtp_streams[i].getLocalSocket();
+    other_session->relay_rtp_streams[i]->setRelayStream(relay_rtp_streams[i]);
+    other_stream_fds[i] = 
other_session->relay_rtp_streams[i]->getLocalSocket();
     // set local IP (todo: option for other interface!)
-    relay_rtp_streams[i].setLocalIP(AmConfig::LocalIP);
-    relay_rtp_streams[i].enableRtpRelay();
+    relay_rtp_streams[i]->setLocalIP(advertisedIP());
+    relay_rtp_streams[i]->enableRtpRelay();
   }
 }
 
@@ -748,8 +762,8 @@ void AmB2BSession::clearRtpReceiverRelay() {
       other_stream_fds[i] = 0;
     }
     // clear our relay streams from RTP receiver
-    if (relay_rtp_streams[i].hasLocalSocket()) {
-      
AmRtpReceiver::instance()->removeStream(relay_rtp_streams[i].getLocalSocket());
+    if (relay_rtp_streams[i]->hasLocalSocket()) {
+      
AmRtpReceiver::instance()->removeStream(relay_rtp_streams[i]->getLocalSocket());
     }
   }
 }
@@ -975,7 +989,7 @@ void 
AmB2BCallerSession::initializeRTPRelay(AmB2BCalleeSession* callee_session)
 
   // bind caller session's relay_streams to a port
   for (unsigned int i=0; i<relay_rtp_streams_cnt; i++)
-    relay_rtp_streams[i].getLocalPort();
+    relay_rtp_streams[i]->getLocalPort();
 }
 
 AmB2BCalleeSession::AmB2BCalleeSession(const string& other_local_tag)
diff --git a/core/AmB2BSession.h b/core/AmB2BSession.h
index a06d99e..7cf6c14 100644
--- a/core/AmB2BSession.h
+++ b/core/AmB2BSession.h
@@ -227,7 +227,7 @@ class AmB2BSession: public AmSession
 
   /** RTP streams which receive from our side and are used
       for relaying RTP from the other side */
-  AmRtpStream* relay_rtp_streams;
+  AmRtpStream** relay_rtp_streams;
   /** number of relay RTP streams */
   unsigned int relay_rtp_streams_cnt;
   /** fd of the other streams' sockets (to remove from
diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp
index 812e272..649f1a3 100644
--- a/core/AmRtpStream.cpp
+++ b/core/AmRtpStream.cpp
@@ -128,7 +128,7 @@ void AmRtpStream::setLocalPort()
     if(!bind(l_sd,(const struct sockaddr*)&l_saddr,
             sizeof(struct sockaddr_storage)))
 #else  
-      l_saddr.sin_port = htons(port);
+    l_saddr.sin_port = htons(port);
     if(!bind(l_sd,(const struct sockaddr*)&l_saddr,
             sizeof(struct sockaddr_in)))
 #endif
@@ -159,11 +159,15 @@ void AmRtpStream::setLocalPort()
 
   l_port = port;
   AmRtpReceiver::instance()->addStream(l_sd,this);
-  DBG("local rtp port set to %i\n",l_port);
+  DBG("added to RTP receiver 
(%s:%i)\n",get_addr_str(l_saddr.sin_addr).c_str(),l_port);
 }
 
 int AmRtpStream::ping()
 {
+  // TODO:
+  //  - we'd better send an empty UDP packet 
+  //    for this purpose.
+
   unsigned char ping_chr[2];
 
   ping_chr[0] = 0;

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to