diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp index ce0797931bc78a0be00577563403fe48d718b0f3..5df6c7be82160cb7b83edd63995d8416dfea9208 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 7e41b63b2fb561e3c5c6b9022864327f24adf4e9..5e1e133dc721a1089ec228dc985ba0fde3b1340f 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); };