diff options
author | Primiano Tucci <primiano@google.com> | 2014-09-30 14:46:33 +0100 |
---|---|---|
committer | Primiano Tucci <primiano@google.com> | 2014-09-30 14:46:33 +0100 |
commit | da0509e3087cc5ee9adc0fe1abb85112ea6529a5 (patch) | |
tree | 532416c2f3025131e902ab655f3d404945485a6b /app/webrtc/webrtcsdp.cc | |
parent | 67bbc8e3efef31646fec91b0b422a78708a3f4aa (diff) | |
parent | 6fd722a3e5cdf933ad206ec7cd697ce95a5630cd (diff) | |
download | talk-da0509e3087cc5ee9adc0fe1abb85112ea6529a5.tar.gz |
Merge from Chromium at DEPS revision 267aeeb8d85candroid-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1lollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-release
This commit was generated by merge_to_master.py.
Change-Id: I3cccc8f04ad0036aecdb7eefe316a059ebcefaf9
Diffstat (limited to 'app/webrtc/webrtcsdp.cc')
-rw-r--r-- | app/webrtc/webrtcsdp.cc | 96 |
1 files changed, 72 insertions, 24 deletions
diff --git a/app/webrtc/webrtcsdp.cc b/app/webrtc/webrtcsdp.cc index 792a091..5887409 100644 --- a/app/webrtc/webrtcsdp.cc +++ b/app/webrtc/webrtcsdp.cc @@ -71,6 +71,7 @@ using cricket::kCodecParamUseInbandFec; using cricket::kCodecParamSctpProtocol; using cricket::kCodecParamSctpStreams; using cricket::kCodecParamMaxAverageBitrate; +using cricket::kCodecParamMaxPlaybackRate; using cricket::kCodecParamAssociatedPayloadType; using cricket::kWildcardPayloadType; using cricket::MediaContentDescription; @@ -155,6 +156,9 @@ static const char kAttributeRecvOnly[] = "recvonly"; static const char kAttributeRtcpFb[] = "rtcp-fb"; static const char kAttributeSendRecv[] = "sendrecv"; static const char kAttributeInactive[] = "inactive"; +// draft-ietf-mmusic-sctp-sdp-07 +// a=sctp-port +static const char kAttributeSctpPort[] = "sctp-port"; // Experimental flags static const char kAttributeXGoogleFlag[] = "x-google-flag"; @@ -1100,6 +1104,26 @@ bool ParseIceOptions(const std::string& line, return true; } +bool ParseSctpPort(const std::string& line, + int* sctp_port, + SdpParseError* error) { + // draft-ietf-mmusic-sctp-sdp-07 + // a=sctp-port + std::vector<std::string> fields; + rtc::split(line.substr(kLinePrefixLength), + kSdpDelimiterSpace, &fields); + const size_t expected_min_fields = 2; + if (fields.size() < expected_min_fields) { + return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); + } + if (!rtc::FromString(fields[1], sctp_port)) { + return ParseFailed(line, + "Invalid sctp port value.", + error); + } + return true; +} + bool ParseExtmap(const std::string& line, RtpHeaderExtension* extmap, SdpParseError* error) { // RFC 5285 @@ -1511,7 +1535,8 @@ bool IsFmtpParam(const std::string& name) { kCodecParamStereo, kCodecParamUseInbandFec, kCodecParamStartBitrate, kCodecParamMaxBitrate, kCodecParamMinBitrate, kCodecParamMaxQuantization, kCodecParamSctpProtocol, kCodecParamSctpStreams, - kCodecParamMaxAverageBitrate, kCodecParamAssociatedPayloadType + kCodecParamMaxAverageBitrate, kCodecParamMaxPlaybackRate, + kCodecParamAssociatedPayloadType }; for (size_t i = 0; i < ARRAY_SIZE(kFmtpParams); ++i) { if (_stricmp(name.c_str(), kFmtpParams[i]) == 0) { @@ -1563,6 +1588,24 @@ void AddRtcpFbLines(const T& codec, std::string* message) { } } +bool AddSctpDataCodec(DataContentDescription* media_desc, + int sctp_port) { + if (media_desc->HasCodec(cricket::kGoogleSctpDataCodecId)) { + return ParseFailed("", + "Can't have multiple sctp port attributes.", + NULL); + } + // Add the SCTP Port number as a pseudo-codec "port" parameter + cricket::DataCodec codec_port( + cricket::kGoogleSctpDataCodecId, cricket::kGoogleSctpDataCodecName, + 0); + codec_port.SetParam(cricket::kCodecParamPort, sctp_port); + LOG(INFO) << "AddSctpDataCodec: Got SCTP Port Number " + << sctp_port; + media_desc->AddCodec(codec_port); + return true; +} + bool GetMinValue(const std::vector<int>& values, int* value) { if (values.empty()) { return false; @@ -2129,18 +2172,20 @@ bool ParseMediaDescription(const std::string& message, // <fmt> std::vector<int> codec_preference; - for (size_t j = 3 ; j < fields.size(); ++j) { - // TODO(wu): Remove when below bug is fixed. - // https://bugzilla.mozilla.org/show_bug.cgi?id=996329 - if (fields[j] == "" && j == fields.size() - 1) { - continue; - } + if (!is_sctp) { + for (size_t j = 3 ; j < fields.size(); ++j) { + // TODO(wu): Remove when below bug is fixed. + // https://bugzilla.mozilla.org/show_bug.cgi?id=996329 + if (fields[j] == "" && j == fields.size() - 1) { + continue; + } - int pl = 0; - if (!GetValueFromString(line, fields[j], &pl, error)) { - return false; + int pl = 0; + if (!GetValueFromString(line, fields[j], &pl, error)) { + return false; + } + codec_preference.push_back(pl); } - codec_preference.push_back(pl); } // Make a temporary TransportDescription based on |session_td|. @@ -2167,26 +2212,20 @@ bool ParseMediaDescription(const std::string& message, codec_preference, pos, &content_name, &transport, candidates, error)); } else if (HasAttribute(line, kMediaTypeData)) { - DataContentDescription* desc = + DataContentDescription* data_desc = ParseContentDescription<DataContentDescription>( message, cricket::MEDIA_TYPE_DATA, mline_index, protocol, codec_preference, pos, &content_name, &transport, candidates, error); + content.reset(data_desc); - if (desc && protocol == cricket::kMediaProtocolDtlsSctp) { - // Add the SCTP Port number as a pseudo-codec "port" parameter - cricket::DataCodec codec_port( - cricket::kGoogleSctpDataCodecId, cricket::kGoogleSctpDataCodecName, - 0); - codec_port.SetParam(cricket::kCodecParamPort, fields[3]); - LOG(INFO) << "ParseMediaDescription: Got SCTP Port Number " - << fields[3]; - ASSERT(!desc->HasCodec(cricket::kGoogleSctpDataCodecId)); - desc->AddCodec(codec_port); + int p; + if (data_desc && protocol == cricket::kMediaProtocolDtlsSctp && + rtc::FromString(fields[3], &p)) { + if (!AddSctpDataCodec(data_desc, p)) + return false; } - content.reset(desc); - // We should always use the default bandwidth for RTP-based data // channels. Don't allow SDP to set the bandwidth, because that // would give JS the opportunity to "break the Internet". @@ -2518,6 +2557,15 @@ bool ParseContent(const std::string& message, if (!ParseDtlsSetup(line, &(transport->connection_role), error)) { return false; } + } else if (HasAttribute(line, kAttributeSctpPort)) { + int sctp_port; + if (!ParseSctpPort(line, &sctp_port, error)) { + return false; + } + if (!AddSctpDataCodec(static_cast<DataContentDescription*>(media_desc), + sctp_port)) { + return false; + } } else if (is_rtp) { // // RTP specific attrubtes |