Module: sems
Branch: master
Commit: 230f38a619baa5a507df4242255bc049491f3827
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=230f38a619baa5a507df4242255bc049491f3827

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Tue Apr 24 11:09:31 2012 +0200

b/f: relay RTP DTMF packets iff audio is currently relayed as well.

---

 core/AmB2BMedia.cpp  |    9 ++++++---
 core/AmRtpStream.cpp |   39 ++++++++++++++++++++++++---------------
 core/AmRtpStream.h   |    1 +
 3 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/core/AmB2BMedia.cpp b/core/AmB2BMedia.cpp
index 9fac358..8a6920e 100644
--- a/core/AmB2BMedia.cpp
+++ b/core/AmB2BMedia.cpp
@@ -2,6 +2,7 @@
 #include "AmAudio.h"
 #include "amci/codecs.h"
 #include <string.h>
+#include <strings.h>
 #include "AmB2BSession.h"
 #include "AmRtpReceiver.h"
 
@@ -195,11 +196,13 @@ void AudioStreamData::setStreamRelay(const SdpMedia &m, 
AmRtpStream *other)
     PayloadMask mask;
 
     // walk through the media line and add all payload IDs to the bit mask
-    for (std::vector<SdpPayload>::const_iterator i = m.payloads.begin(); 
+    for (std::vector<SdpPayload>::const_iterator i = m.payloads.begin();
         i != m.payloads.end(); ++i) 
     {
-      mask.set(i->payload_type);
-      TRACE("marking payload %d for relay\n", i->payload_type);
+      if(strcasecmp("telephone-event",i->encoding_name.c_str()) != 0){
+       mask.set(i->payload_type);
+       TRACE("marking payload %d for relay\n", i->payload_type);
+      }
     }
 
     stream->enableRtpRelay(mask, other);
diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp
index 5ceeb9c..226e925 100644
--- a/core/AmRtpStream.cpp
+++ b/core/AmRtpStream.cpp
@@ -321,8 +321,7 @@ int AmRtpStream::receive( unsigned char* buffer, unsigned 
int size,
     return RTP_EMPTY;
   }
 
-  if (local_telephone_event_pt.get() &&
-      rp->payload == local_telephone_event_pt->payload_type)
+  if (rp->payload == getLocalTelephoneEventPT())
     {
       dtmf_payload_t* dpl = (dtmf_payload_t*)rp->getData();
 
@@ -709,8 +708,8 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   memcpy(&last_recv_time, &p->recv_time, sizeof(struct timeval));
 
   if (!receiving && !passive) {
-    if (force_receive_dtmf && local_telephone_event_pt.get() &&
-        p->payload == local_telephone_event_pt->payload_type)
+    if (force_receive_dtmf &&
+        p->payload == getLocalTelephoneEventPT())
     {
       dtmf_payload_t* dpl = (dtmf_payload_t*)p->getData();
 
@@ -723,7 +722,12 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   }
 
   if (relay_enabled) {
-    if (relay_payloads.get(p->payload)) {
+    // Relay DTMF packets if current audio payload
+    // is also relayed.
+    // Else, check whether or not we should relay this payload
+    if ((p->payload == getLocalTelephoneEventPT() &&
+        !active) || relay_payloads.get(p->payload)) {
+
       if(active){
        DBG("switching to relay-mode\t(ts=%u;stream=%p)\n",
            p->timestamp,this);
@@ -740,13 +744,13 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   }
 
   receive_mut.lock();
+  // NOTE: useless, as DTMF events are pushed into 'rtp_ev_qu'
   // free packet on double packet for TS received
-  if(!(local_telephone_event_pt.get() &&
-       (p->payload == local_telephone_event_pt->payload_type))) {
-    if (receive_buf.find(p->timestamp) != receive_buf.end()) {
-      mem.freePacket(receive_buf[p->timestamp]);
-    }
-  }  
+  // if(p->payload == getLocalTelephoneEventPT()) {
+  //   if (receive_buf.find(p->timestamp) != receive_buf.end()) {
+  //     mem.freePacket(receive_buf[p->timestamp]);
+  //   }
+  // }  
 
 #ifdef WITH_ZRTP
   if (session->zrtp_audio) {
@@ -764,8 +768,7 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
          ERROR("parsing decoded packet!\n");
          mem.freePacket(p);
        } else {
-          if(local_telephone_event_pt.get() && 
-            (p->payload == local_telephone_event_pt->payload_type)) {
+          if(p->payload == getLocalTelephoneEventPT()) {
             rtp_ev_qu.push(p);
           } else {
            receive_buf[p->timestamp] = p;
@@ -794,8 +797,7 @@ void AmRtpStream::bufferPacket(AmRtpPacket* p)
   } else {
 #endif // WITH_ZRTP
 
-    if(local_telephone_event_pt.get() &&
-       (p->payload == local_telephone_event_pt->payload_type)) {
+    if(p->payload == getLocalTelephoneEventPT()) {
       rtp_ev_qu.push(p);
     } else {
       receive_buf[p->timestamp] = p;
@@ -925,6 +927,13 @@ int AmRtpStream::getLocalTelephoneEventRate()
   return 0;
 }
 
+int AmRtpStream::getLocalTelephoneEventPT()
+{
+  if(local_telephone_event_pt.get())
+    return local_telephone_event_pt->payload_type;
+  return -1;
+}
+
 void AmRtpStream::setPayloadProvider(AmPayloadProvider* pl_prov)
 {
   payload_provider = pl_prov;
diff --git a/core/AmRtpStream.h b/core/AmRtpStream.h
index d70e166..88a7a50 100644
--- a/core/AmRtpStream.h
+++ b/core/AmRtpStream.h
@@ -362,6 +362,7 @@ public:
 
   unsigned int get_ssrc() { return l_ssrc; }
 
+  int getLocalTelephoneEventPT();
   int getLocalTelephoneEventRate();
 
   void setPayloadProvider(AmPayloadProvider* pl_prov);

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

Reply via email to