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
