From 1cdbbddad04d6663f67b7e1aaf8a77185d4de9fc Mon Sep 17 00:00:00 2001 From: Tristan Matthews <tristan.matthews@savoirfairelinux.com> Date: Wed, 5 Dec 2012 18:14:14 -0500 Subject: [PATCH] * #18261: sdp: add RTCP info (for audio) to SDP --- daemon/src/sip/sdp.cpp | 25 ++++++++++++++++++++++++- daemon/src/sip/sdp.h | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp index ce0797931b..5df6c7be82 100644 --- a/daemon/src/sip/sdp.cpp +++ b/daemon/src/sip/sdp.cpp @@ -272,12 +272,35 @@ Sdp::setMediaDescriptorLines(bool audio) if (!zrtpHelloHash_.empty()) addZrtpAttribute(med, zrtpHelloHash_); - if (audio) + if (audio) { setTelephoneEventRtpmap(med); + addRTCPAttribute(med); // video has its own RTCP + } return med; } + +void Sdp::addRTCPAttribute(pjmedia_sdp_media *med) +{ + // FIXME: get this from CCRTP directly, don't just assume that the RTCP port is + // RTP + 1 + std::ostringstream os; + os << localIpAddr_ << ":" << (localAudioPort_ + 1); + const std::string str(os.str()); + const pj_str_t input_str = {(char*) str.c_str(), str.size()}; + pj_sockaddr outputAddr; + pj_status_t status = pj_sockaddr_parse(PJ_AF_UNSPEC, 0, &input_str, &outputAddr); + if (status != PJ_SUCCESS) { + ERROR("Could not parse address %s", str.c_str()); + return; + } + pjmedia_sdp_attr *attr = pjmedia_sdp_attr_create_rtcp(memPool_, &outputAddr); + if (attr) + pjmedia_sdp_attr_add(&med->attr_count, med->attr, attr); +} + + void Sdp::setTelephoneEventRtpmap(pjmedia_sdp_media *med) { pjmedia_sdp_attr *attr_rtpmap = static_cast<pjmedia_sdp_attr *>(pj_pool_zalloc(memPool_, sizeof(pjmedia_sdp_attr))); diff --git a/daemon/src/sip/sdp.h b/daemon/src/sip/sdp.h index 7e41b63b2f..5e1e133dc7 100644 --- a/daemon/src/sip/sdp.h +++ b/daemon/src/sip/sdp.h @@ -357,6 +357,8 @@ class Sdp { * @throw SdpException */ void addZrtpAttribute(pjmedia_sdp_media* media, std::string hash); + + void addRTCPAttribute(pjmedia_sdp_media *med); }; -- GitLab