Index: webrtc/pc/webrtcsdp.cc |
diff --git a/webrtc/pc/webrtcsdp.cc b/webrtc/pc/webrtcsdp.cc |
index ed49c344e81f962b42102a4f5cdeede47ef0197b..b749d6ff324887c8bce74c933c941b61b3fc1b28 100644 |
--- a/webrtc/pc/webrtcsdp.cc |
+++ b/webrtc/pc/webrtcsdp.cc |
@@ -234,7 +234,9 @@ static void BuildMediaDescription(const ContentInfo* content_info, |
const std::vector<Candidate>& candidates, |
bool unified_plan_sdp, |
std::string* message); |
-static void BuildSctpContentAttributes(std::string* message, int sctp_port); |
+static void BuildSctpContentAttributes(std::string* message, |
+ int sctp_port, |
+ bool use_sctpmap); |
static void BuildRtpContentAttributes(const MediaContentDescription* media_desc, |
const MediaType media_type, |
bool unified_plan_sdp, |
@@ -1275,16 +1277,21 @@ void BuildMediaDescription(const ContentInfo* content_info, |
if (IsDtlsSctp(media_desc->protocol())) { |
fmt.append(" "); |
- for (std::vector<cricket::DataCodec>::const_iterator it = |
- data_desc->codecs().begin(); |
- it != data_desc->codecs().end(); ++it) { |
- if (cricket::CodecNamesEq(it->name, cricket::kGoogleSctpDataCodecName) |
- && it->GetParam(cricket::kCodecParamPort, &sctp_port)) { |
- break; |
+ if (data_desc->use_sctpmap()) { |
+ for (std::vector<cricket::DataCodec>::const_iterator it = |
+ data_desc->codecs().begin(); |
+ it != data_desc->codecs().end(); ++it) { |
+ if (cricket::CodecNamesEq(it->name, |
+ cricket::kGoogleSctpDataCodecName) && |
+ it->GetParam(cricket::kCodecParamPort, &sctp_port)) { |
+ break; |
+ } |
} |
- } |
- fmt.append(rtc::ToString<int>(sctp_port)); |
+ fmt.append(rtc::ToString<int>(sctp_port)); |
+ } else { |
+ fmt.append(kDefaultSctpmapProtocol); |
+ } |
} else { |
for (std::vector<cricket::DataCodec>::const_iterator it = |
data_desc->codecs().begin(); |
@@ -1407,23 +1414,34 @@ void BuildMediaDescription(const ContentInfo* content_info, |
AddLine(os.str(), message); |
if (IsDtlsSctp(media_desc->protocol())) { |
- BuildSctpContentAttributes(message, sctp_port); |
+ const DataContentDescription* data_desc = |
+ static_cast<const DataContentDescription*>(media_desc); |
+ bool use_sctpmap = data_desc->use_sctpmap(); |
+ BuildSctpContentAttributes(message, sctp_port, use_sctpmap); |
} else if (IsRtp(media_desc->protocol())) { |
BuildRtpContentAttributes(media_desc, media_type, unified_plan_sdp, |
message); |
} |
} |
-void BuildSctpContentAttributes(std::string* message, int sctp_port) { |
- // draft-ietf-mmusic-sctp-sdp-04 |
- // a=sctpmap:sctpmap-number protocol [streams] |
- // TODO(lally): switch this over to mmusic-sctp-sdp-12 (or later), with |
- // 'a=sctp-port:' |
+void BuildSctpContentAttributes(std::string* message, |
+ int sctp_port, |
+ bool use_sctpmap) { |
std::ostringstream os; |
- InitAttrLine(kAttributeSctpmap, &os); |
- os << kSdpDelimiterColon << sctp_port << kSdpDelimiterSpace |
- << kDefaultSctpmapProtocol << kSdpDelimiterSpace |
- << cricket::kMaxSctpStreams; |
+ if (use_sctpmap) { |
+ // draft-ietf-mmusic-sctp-sdp-04 |
+ // a=sctpmap:sctpmap-number protocol [streams] |
+ InitAttrLine(kAttributeSctpmap, &os); |
+ os << kSdpDelimiterColon << sctp_port << kSdpDelimiterSpace |
+ << kDefaultSctpmapProtocol << kSdpDelimiterSpace |
+ << cricket::kMaxSctpStreams; |
+ } else { |
+ // draft-ietf-mmusic-sctp-sdp-23 |
+ // a=sctp-port:<port> |
+ InitAttrLine(kAttributeSctpPort, &os); |
+ os << kSdpDelimiterColon << sctp_port; |
+ // TODO(zstein): emit max-message-size here |
+ } |
AddLine(os.str(), message); |
} |
@@ -2291,6 +2309,7 @@ bool ParseMediaDescription(const std::string& message, |
std::vector<std::string> fields; |
rtc::split(line.substr(kLinePrefixLength), |
kSdpDelimiterSpace, &fields); |
+ |
const size_t expected_min_fields = 4; |
if (fields.size() < expected_min_fields) { |
return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); |
@@ -2351,10 +2370,15 @@ bool ParseMediaDescription(const std::string& message, |
candidates, error); |
content.reset(data_desc); |
- int p; |
- if (data_desc && IsDtlsSctp(protocol) && rtc::FromString(fields[3], &p)) { |
- if (!AddSctpDataCodec(data_desc, p)) |
- return false; |
+ if (data_desc && IsDtlsSctp(protocol)) { |
+ int p; |
+ if (rtc::FromString(fields[3], &p)) { |
+ if (!AddSctpDataCodec(data_desc, p)) { |
+ return false; |
+ } |
+ } else if (fields[3] == kDefaultSctpmapProtocol) { |
+ data_desc->set_use_sctpmap(false); |
+ } |
} |
} else { |
LOG(LS_WARNING) << "Unsupported media type: " << line; |