Fixed removeSSRC() to update SSRC list in addition to attributes

This commit is contained in:
Paul-Louis Ageneau
2021-06-04 11:07:20 +02:00
parent 76d2d3d97f
commit 2d97cc18c6
2 changed files with 36 additions and 33 deletions

View File

@ -146,6 +146,7 @@ public:
void addSSRC(uint32_t ssrc, optional<string> name, void addSSRC(uint32_t ssrc, optional<string> name,
optional<string> msid = nullopt, optional<string> trackID = nullopt); optional<string> msid = nullopt, optional<string> trackID = nullopt);
void removeSSRC(uint32_t oldSSRC);
void replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional<string> name, void replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional<string> name,
optional<string> msid = nullopt, optional<string> trackID = nullopt); optional<string> msid = nullopt, optional<string> trackID = nullopt);
bool hasSSRC(uint32_t ssrc); bool hasSSRC(uint32_t ssrc);
@ -182,6 +183,8 @@ public:
void setMLine(string_view view); void setMLine(string_view view);
}; };
void addRTPMap(const RTPMap &map);
std::map<int, RTPMap>::iterator beginMaps(); std::map<int, RTPMap>::iterator beginMaps();
std::map<int, RTPMap>::iterator endMaps(); std::map<int, RTPMap>::iterator endMaps();
std::map<int, RTPMap>::iterator removeMap(std::map<int, RTPMap>::iterator iterator); std::map<int, RTPMap>::iterator removeMap(std::map<int, RTPMap>::iterator iterator);
@ -197,11 +200,6 @@ public:
std::map<int, RTPMap> mRtpMap; std::map<int, RTPMap> mRtpMap;
std::vector<uint32_t> mSsrcs; std::vector<uint32_t> mSsrcs;
std::map<uint32_t, string> mCNameMap; std::map<uint32_t, string> mCNameMap;
public:
void addRTPMap(const RTPMap &map);
void removeSSRC(uint32_t oldSSRC);
}; };
class RTC_CPP_EXPORT Audio : public Media { class RTC_CPP_EXPORT Audio : public Media {

View File

@ -547,8 +547,11 @@ void Description::Entry::parseSdpLine(string_view line) {
mAttributes.emplace_back(line.substr(2)); mAttributes.emplace_back(line.substr(2));
} }
} }
std::vector<string>::iterator Description::Entry::beginAttributes() { return mAttributes.begin(); } std::vector<string>::iterator Description::Entry::beginAttributes() { return mAttributes.begin(); }
std::vector<string>::iterator Description::Entry::endAttributes() { return mAttributes.end(); } std::vector<string>::iterator Description::Entry::endAttributes() { return mAttributes.end(); }
std::vector<string>::iterator std::vector<string>::iterator
Description::Entry::removeAttribute(std::vector<string>::iterator it) { Description::Entry::removeAttribute(std::vector<string>::iterator it) {
return mAttributes.erase(it); return mAttributes.erase(it);
@ -556,12 +559,12 @@ Description::Entry::removeAttribute(std::vector<string>::iterator it) {
void Description::Media::addSSRC(uint32_t ssrc, optional<string> name, optional<string> msid, void Description::Media::addSSRC(uint32_t ssrc, optional<string> name, optional<string> msid,
optional<string> trackID) { optional<string> trackID) {
if (name) { if (name) {
mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + *name); mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + *name);
mCNameMap.emplace(ssrc, *name); mCNameMap.emplace(ssrc, *name);
} else { } else {
mAttributes.emplace_back("ssrc:" + std::to_string(ssrc)); mAttributes.emplace_back("ssrc:" + std::to_string(ssrc));
} }
if (msid) if (msid)
mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " msid:" + *msid + " " + mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " msid:" + *msid + " " +
@ -570,26 +573,28 @@ void Description::Media::addSSRC(uint32_t ssrc, optional<string> name, optional<
mSsrcs.emplace_back(ssrc); mSsrcs.emplace_back(ssrc);
} }
void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, optional<string> name,
optional<string> msid, optional<string> 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) { void Description::Media::removeSSRC(uint32_t oldSSRC) {
auto it = mAttributes.begin(); auto it = mAttributes.begin();
while (it != mAttributes.end()) { 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); it = mAttributes.erase(it);
} else else
it++; ++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<string> name,
optional<string> msid, optional<string> trackID) {
removeSSRC(oldSSRC);
addSSRC(ssrc, std::move(name), std::move(msid), std::move(trackID));
} }
bool Description::Media::hasSSRC(uint32_t ssrc) { bool Description::Media::hasSSRC(uint32_t ssrc) {
@ -864,11 +869,11 @@ void Description::Media::parseSdpLine(string_view line) {
if (!hasSSRC(ssrc)) { if (!hasSSRC(ssrc)) {
mSsrcs.emplace_back(ssrc); mSsrcs.emplace_back(ssrc);
} }
auto cnamePos = value.find("cname:"); auto cnamePos = value.find("cname:");
if (cnamePos != std::string::npos) { if (cnamePos != std::string::npos) {
auto cname = value.substr(cnamePos + 6); auto cname = value.substr(cnamePos + 6);
mCNameMap.emplace(ssrc, cname); mCNameMap.emplace(ssrc, cname);
} }
mAttributes.emplace_back(attr); mAttributes.emplace_back(attr);
} else { } else {
Entry::parseSdpLine(line); Entry::parseSdpLine(line);
@ -887,10 +892,10 @@ void Description::Media::addRTPMap(const Description::Media::RTPMap &map) {
std::vector<uint32_t> Description::Media::getSSRCs() { return mSsrcs; } std::vector<uint32_t> Description::Media::getSSRCs() { return mSsrcs; }
std::optional<std::string> Description::Media::getCNameForSsrc(uint32_t ssrc) { std::optional<std::string> Description::Media::getCNameForSsrc(uint32_t ssrc) {
auto it = mCNameMap.find(ssrc); auto it = mCNameMap.find(ssrc);
if (it != mCNameMap.end()) { if (it != mCNameMap.end()) {
return it->second; return it->second;
} }
return std::nullopt; return std::nullopt;
} }