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;
}
示例#2
0
/* 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());
  }
}