diff --git a/include/rtc/description.hpp b/include/rtc/description.hpp index 49ab1d3..a6049d1 100644 --- a/include/rtc/description.hpp +++ b/include/rtc/description.hpp @@ -146,6 +146,7 @@ public: void addSSRC(uint32_t ssrc, optional name, optional msid = nullopt, optional trackID = nullopt); + void removeSSRC(uint32_t oldSSRC); void replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional name, optional msid = nullopt, optional trackID = nullopt); bool hasSSRC(uint32_t ssrc); @@ -182,6 +183,8 @@ public: void setMLine(string_view view); }; + void addRTPMap(const RTPMap &map); + std::map::iterator beginMaps(); std::map::iterator endMaps(); std::map::iterator removeMap(std::map::iterator iterator); @@ -197,11 +200,6 @@ public: std::map mRtpMap; std::vector mSsrcs; std::map mCNameMap; - - public: - void addRTPMap(const RTPMap &map); - - void removeSSRC(uint32_t oldSSRC); }; class RTC_CPP_EXPORT Audio : public Media { diff --git a/src/description.cpp b/src/description.cpp index 2a67e22..9c9d975 100644 --- a/src/description.cpp +++ b/src/description.cpp @@ -547,8 +547,11 @@ void Description::Entry::parseSdpLine(string_view line) { mAttributes.emplace_back(line.substr(2)); } } + std::vector::iterator Description::Entry::beginAttributes() { return mAttributes.begin(); } + std::vector::iterator Description::Entry::endAttributes() { return mAttributes.end(); } + std::vector::iterator Description::Entry::removeAttribute(std::vector::iterator it) { return mAttributes.erase(it); @@ -556,12 +559,12 @@ Description::Entry::removeAttribute(std::vector::iterator it) { void Description::Media::addSSRC(uint32_t ssrc, optional name, optional msid, optional trackID) { - if (name) { + if (name) { mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + *name); - mCNameMap.emplace(ssrc, *name); - } else { + mCNameMap.emplace(ssrc, *name); + } else { mAttributes.emplace_back("ssrc:" + std::to_string(ssrc)); - } + } if (msid) mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " msid:" + *msid + " " + @@ -570,26 +573,28 @@ void Description::Media::addSSRC(uint32_t ssrc, optional name, optional< mSsrcs.emplace_back(ssrc); } -void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional name, - optional msid, optional trackID) { - auto it = mAttributes.begin(); - while (it != mAttributes.end()) { - if (it->find("ssrc:" + std::to_string(oldSSRC)) == 0) { - it = mAttributes.erase(it); - } else - it++; - } - addSSRC(ssrc, std::move(name), std::move(msid), std::move(trackID)); -} - void Description::Media::removeSSRC(uint32_t oldSSRC) { auto it = mAttributes.begin(); while (it != mAttributes.end()) { - if (it->find("ssrc:" + std::to_string(oldSSRC)) == 0) { + if (match_prefix(*it, "ssrc:" + std::to_string(oldSSRC))) it = mAttributes.erase(it); - } else - it++; + else + ++it; } + + auto jt = mSsrcs.begin(); + while (jt != mSsrcs.end()) { + if (*jt == oldSSRC) + jt = mSsrcs.erase(jt); + else + ++jt; + } +} + +void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional name, + optional msid, optional trackID) { + removeSSRC(oldSSRC); + addSSRC(ssrc, std::move(name), std::move(msid), std::move(trackID)); } bool Description::Media::hasSSRC(uint32_t ssrc) { @@ -864,11 +869,11 @@ void Description::Media::parseSdpLine(string_view line) { if (!hasSSRC(ssrc)) { mSsrcs.emplace_back(ssrc); } - auto cnamePos = value.find("cname:"); - if (cnamePos != std::string::npos) { - auto cname = value.substr(cnamePos + 6); - mCNameMap.emplace(ssrc, cname); - } + auto cnamePos = value.find("cname:"); + if (cnamePos != std::string::npos) { + auto cname = value.substr(cnamePos + 6); + mCNameMap.emplace(ssrc, cname); + } mAttributes.emplace_back(attr); } else { Entry::parseSdpLine(line); @@ -887,10 +892,10 @@ void Description::Media::addRTPMap(const Description::Media::RTPMap &map) { std::vector Description::Media::getSSRCs() { return mSsrcs; } std::optional Description::Media::getCNameForSsrc(uint32_t ssrc) { - auto it = mCNameMap.find(ssrc); - if (it != mCNameMap.end()) { - return it->second; - } + auto it = mCNameMap.find(ssrc); + if (it != mCNameMap.end()) { + return it->second; + } return std::nullopt; }