bool SipccSdpAttributeList::LoadSimulcast(sdp_t* sdp, uint16_t level, SdpErrorHolder& errorHolder) { const char* simulcastRaw = sdp_attr_get_simple_string(sdp, SDP_ATTR_SIMULCAST, level, 0, 1); if (!simulcastRaw) { return true; } UniquePtr<SdpSimulcastAttribute> simulcast( new SdpSimulcastAttribute); std::istringstream is(simulcastRaw); std::string error; if (!simulcast->Parse(is, &error)) { std::ostringstream fullError; fullError << error << " at column " << is.tellg(); errorHolder.AddParseError( sdp_attr_line_number(sdp, SDP_ATTR_SIMULCAST, level, 0, 1), fullError.str()); return false; } SetAttribute(simulcast.release()); return true; }
/* static */ void JsepTrack::AddToMsection(const std::vector<JsConstraints>& constraintsList, sdp::Direction direction, SdpMediaSection* msection) { UniquePtr<SdpSimulcastAttribute> simulcast(new SdpSimulcastAttribute); UniquePtr<SdpRidAttributeList> rids(new SdpRidAttributeList); for (const JsConstraints& constraints : constraintsList) { if (!constraints.rid.empty()) { SdpRidAttributeList::Rid rid; rid.id = constraints.rid; rid.direction = direction; rids->mRids.push_back(rid); SdpSimulcastAttribute::Version version; version.choices.push_back(constraints.rid); if (direction == sdp::kSend) { simulcast->sendVersions.push_back(version); } else { simulcast->recvVersions.push_back(version); } } } if (!rids->mRids.empty()) { msection->GetAttributeList().SetAttribute(simulcast.release()); msection->GetAttributeList().SetAttribute(rids.release()); } }