summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/pc/webrtc_sdp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/pc/webrtc_sdp.cc')
-rw-r--r--third_party/libwebrtc/pc/webrtc_sdp.cc95
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,