diff options
Diffstat (limited to 'third_party/libwebrtc/pc/webrtc_sdp.cc')
-rw-r--r-- | third_party/libwebrtc/pc/webrtc_sdp.cc | 95 |
1 files changed, 41 insertions, 54 deletions
diff --git a/third_party/libwebrtc/pc/webrtc_sdp.cc b/third_party/libwebrtc/pc/webrtc_sdp.cc index 88f1ce0d1b..ea9c8580cd 100644 --- a/third_party/libwebrtc/pc/webrtc_sdp.cc +++ b/third_party/libwebrtc/pc/webrtc_sdp.cc @@ -29,7 +29,6 @@ #include "absl/strings/ascii.h" #include "absl/strings/match.h" #include "api/candidate.h" -#include "api/crypto_params.h" #include "api/jsep_ice_candidate.h" #include "api/jsep_session_description.h" #include "api/media_types.h" @@ -74,7 +73,6 @@ using cricket::AudioContentDescription; using cricket::Candidate; using cricket::Candidates; using cricket::ContentInfo; -using cricket::CryptoParams; using cricket::ICE_CANDIDATE_COMPONENT_RTCP; using cricket::ICE_CANDIDATE_COMPONENT_RTP; using cricket::kApplicationSpecificBandwidth; @@ -157,7 +155,6 @@ static const char kSsrcAttributeMsid[] = "msid"; static const char kDefaultMsid[] = "default"; static const char kNoStreamMsid[] = "-"; static const char kAttributeSsrcGroup[] = "ssrc-group"; -static const char kAttributeCrypto[] = "crypto"; static const char kAttributeCandidate[] = "candidate"; static const char kAttributeCandidateTyp[] = "typ"; static const char kAttributeCandidateRaddr[] = "raddr"; @@ -340,9 +337,6 @@ static bool ParseSsrcAttribute(absl::string_view line, static bool ParseSsrcGroupAttribute(absl::string_view line, SsrcGroupVec* ssrc_groups, SdpParseError* error); -static bool ParseCryptoAttribute(absl::string_view line, - MediaContentDescription* media_desc, - SdpParseError* error); static bool ParseRtpmapAttribute(absl::string_view line, const cricket::MediaType media_type, const std::vector<int>& payload_types, @@ -1126,7 +1120,7 @@ bool ParseCandidate(absl::string_view message, return ParseFailed(first_line, "Unsupported transport type.", error); } - std::string candidate_type; + absl::string_view candidate_type; const absl::string_view type = fields[7]; if (type == kCandidateHost) { candidate_type = cricket::LOCAL_PORT_TYPE; @@ -1668,18 +1662,6 @@ void BuildRtpContentAttributes(const MediaContentDescription* media_desc, AddLine(os.str(), message); } - // RFC 4568 - // a=crypto:<tag> <crypto-suite> <key-params> [<session-params>] - for (const CryptoParams& crypto_params : media_desc->cryptos()) { - InitAttrLine(kAttributeCrypto, &os); - os << kSdpDelimiterColon << crypto_params.tag << " " - << crypto_params.crypto_suite << " " << crypto_params.key_params; - if (!crypto_params.session_params.empty()) { - os << " " << crypto_params.session_params; - } - AddLine(os.str(), message); - } - // RFC 4566 // a=rtpmap:<payload type> <encoding name>/<clock rate> // [/<encodingparameters>] @@ -2359,6 +2341,7 @@ static bool ParseMsidAttribute(absl::string_view line, // Note that JSEP stipulates not sending msid-appdata so // a=msid:<stream id> <track id> // is supported for backward compability reasons only. + // RFC 8830 section 2 states that duplicate a=msid:stream track is illegal. std::vector<std::string> fields; size_t num_fields = rtc::tokenize(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); @@ -2615,6 +2598,25 @@ static void BackfillCodecParameters(std::vector<cricket::Codec>& codecs) { if (!codec.GetParam(cricket::kH264FmtpPacketizationMode, &unused_value)) { codec.SetParam(cricket::kH264FmtpPacketizationMode, "0"); } + } else if (absl::EqualsIgnoreCase(cricket::kAv1CodecName, codec.name)) { + // https://aomediacodec.github.io/av1-rtp-spec/#72-sdp-parameters + if (!codec.GetParam(cricket::kAv1FmtpProfile, &unused_value)) { + codec.SetParam(cricket::kAv1FmtpProfile, "0"); + } + if (!codec.GetParam(cricket::kAv1FmtpLevelIdx, &unused_value)) { + codec.SetParam(cricket::kAv1FmtpLevelIdx, "5"); + } + if (!codec.GetParam(cricket::kAv1FmtpTier, &unused_value)) { + codec.SetParam(cricket::kAv1FmtpTier, "0"); + } + } else if (absl::EqualsIgnoreCase(cricket::kH265CodecName, codec.name)) { + // https://datatracker.ietf.org/doc/html/draft-aboba-avtcore-hevc-webrtc + if (!codec.GetParam(cricket::kH265FmtpLevelId, &unused_value)) { + codec.SetParam(cricket::kH265FmtpLevelId, "93"); + } + if (!codec.GetParam(cricket::kH265FmtpTxMode, &unused_value)) { + codec.SetParam(cricket::kH265FmtpTxMode, "SRST"); + } } } } @@ -2669,6 +2671,21 @@ static std::unique_ptr<MediaContentDescription> ParseContentDescription( return media_desc; } +bool HasDuplicateMsidLines(cricket::SessionDescription* desc) { + std::set<std::pair<std::string, std::string>> seen_msids; + for (const cricket::ContentInfo& content : desc->contents()) { + for (const cricket::StreamParams& stream : + content.media_description()->streams()) { + auto msid = std::pair(stream.first_stream_id(), stream.id); + if (seen_msids.find(msid) != seen_msids.end()) { + return true; + } + seen_msids.insert(std::move(msid)); + } + } + return false; +} + bool ParseMediaDescription( absl::string_view message, const TransportDescription& session_td, @@ -2851,6 +2868,11 @@ bool ParseMediaDescription( // Create TransportInfo with the media level "ice-pwd" and "ice-ufrag". desc->AddTransportInfo(TransportInfo(content_name, transport)); } + // Apply whole-description sanity checks + if (HasDuplicateMsidLines(desc)) { + ParseFailed(message, *pos, "Duplicate a=msid lines detected", error); + return false; + } desc->set_msid_signaling(msid_signaling); @@ -3206,10 +3228,6 @@ bool ParseContent(absl::string_view message, if (!ParseSsrcAttribute(*line, &ssrc_infos, msid_signaling, error)) { return false; } - } else if (HasAttribute(*line, kAttributeCrypto)) { - if (!ParseCryptoAttribute(*line, media_desc, error)) { - return false; - } } else if (HasAttribute(*line, kAttributeRtpmap)) { if (!ParseRtpmapAttribute(*line, media_type, payload_types, media_desc, error)) { @@ -3537,37 +3555,6 @@ bool ParseSsrcGroupAttribute(absl::string_view line, return true; } -bool ParseCryptoAttribute(absl::string_view line, - MediaContentDescription* media_desc, - SdpParseError* error) { - std::vector<absl::string_view> fields = - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); - // RFC 4568 - // a=crypto:<tag> <crypto-suite> <key-params> [<session-params>] - const size_t expected_min_fields = 3; - if (fields.size() < expected_min_fields) { - return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); - } - std::string tag_value; - if (!GetValue(fields[0], kAttributeCrypto, &tag_value, error)) { - return false; - } - int tag = 0; - if (!GetValueFromString(line, tag_value, &tag, error)) { - return false; - } - const absl::string_view crypto_suite = fields[1]; - const absl::string_view key_params = fields[2]; - absl::string_view session_params; - if (fields.size() > 3) { - session_params = fields[3]; - } - - media_desc->AddCrypto( - CryptoParams(tag, crypto_suite, key_params, session_params)); - return true; -} - // Updates or creates a new codec entry in the audio description with according // to `name`, `clockrate`, `bitrate`, and `channels`. void UpdateCodec(int payload_type, |