bool SdpHelper::IsBundleSlave(const Sdp& sdp, uint16_t level) { auto& msection = sdp.GetMediaSection(level); if (!msection.GetAttributeList().HasAttribute(SdpAttribute::kMidAttribute)) { // No mid, definitely no bundle for this m-section return false; } std::string mid(msection.GetAttributeList().GetMid()); BundledMids bundledMids; nsresult rv = GetBundledMids(sdp, &bundledMids); if (NS_FAILED(rv)) { // Should have been caught sooner. MOZ_ASSERT(false); return false; } if (bundledMids.count(mid) && level != bundledMids[mid]->GetLevel()) { // mid is bundled, and isn't the bundle m-section return true; } return false; }
void SdpHelper::SetDefaultAddresses(const std::string& defaultCandidateAddr, uint16_t defaultCandidatePort, const std::string& defaultRtcpCandidateAddr, uint16_t defaultRtcpCandidatePort, Sdp* sdp, uint16_t level, BundledMids bundledMids) { SdpMediaSection& msection = sdp->GetMediaSection(level); if (msection.GetAttributeList().HasAttribute(SdpAttribute::kMidAttribute)) { std::string mid(msection.GetAttributeList().GetMid()); if (bundledMids.count(mid)) { const SdpMediaSection* masterBundleMsection(bundledMids[mid]); if (msection.GetLevel() != masterBundleMsection->GetLevel()) { // Slave bundle m-section. Skip. return; } // Master bundle m-section. Set defaultCandidateAddr and // defaultCandidatePort on all bundled m-sections. for (auto i = bundledMids.begin(); i != bundledMids.end(); ++i) { if (i->second != masterBundleMsection) { continue; } SdpMediaSection* bundledMsection = FindMsectionByMid(*sdp, i->first); if (!bundledMsection) { MOZ_ASSERT(false); continue; } SetDefaultAddresses(defaultCandidateAddr, defaultCandidatePort, defaultRtcpCandidateAddr, defaultRtcpCandidatePort, bundledMsection); } } } SetDefaultAddresses(defaultCandidateAddr, defaultCandidatePort, defaultRtcpCandidateAddr, defaultRtcpCandidatePort, &msection); // TODO(bug 1095793): Will this have an mid someday? SdpAttributeList& attrs = msection.GetAttributeList(); attrs.SetAttribute( new SdpFlagAttribute(SdpAttribute::kEndOfCandidatesAttribute)); // Remove trickle-ice option attrs.RemoveAttribute(SdpAttribute::kIceOptionsAttribute); }