Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 // but we tolerate "RTP/SAVPF" in offers we receive, for compatibility. | 60 // but we tolerate "RTP/SAVPF" in offers we receive, for compatibility. |
| 61 const char kMediaProtocolSavpf[] = "RTP/SAVPF"; | 61 const char kMediaProtocolSavpf[] = "RTP/SAVPF"; |
| 62 | 62 |
| 63 const char kMediaProtocolRtpPrefix[] = "RTP/"; | 63 const char kMediaProtocolRtpPrefix[] = "RTP/"; |
| 64 | 64 |
| 65 const char kMediaProtocolSctp[] = "SCTP"; | 65 const char kMediaProtocolSctp[] = "SCTP"; |
| 66 const char kMediaProtocolDtlsSctp[] = "DTLS/SCTP"; | 66 const char kMediaProtocolDtlsSctp[] = "DTLS/SCTP"; |
| 67 const char kMediaProtocolUdpDtlsSctp[] = "UDP/DTLS/SCTP"; | 67 const char kMediaProtocolUdpDtlsSctp[] = "UDP/DTLS/SCTP"; |
| 68 const char kMediaProtocolTcpDtlsSctp[] = "TCP/DTLS/SCTP"; | 68 const char kMediaProtocolTcpDtlsSctp[] = "TCP/DTLS/SCTP"; |
| 69 | 69 |
| 70 // Note that the below functions support some protocol strings purely for | |
| 71 // legacy compatibility, as required by JSEP in Section 5.1.2, Profile Names | |
| 72 // and Interoperability. | |
| 73 | |
| 74 static bool IsDtlsRtp(const std::string& protocol) { | |
| 75 // Most-likely values first. | |
| 76 return protocol == "UDP/TLS/RTP/SAVPF" || protocol == "TCP/TLS/RTP/SAVPF" || | |
| 77 protocol == "UDP/TLS/RTP/SAVP" || protocol == "TCP/TLS/RTP/SAVP"; | |
| 78 } | |
| 79 | |
| 80 static bool IsPlainRtp(const std::string& protocol) { | |
| 81 // Most-likely values first. | |
| 82 return protocol == "RTP/SAVPF" || protocol == "RTP/AVPF" || | |
| 83 protocol == "RTP/SAVP" || protocol == "RTP/AVP"; | |
| 84 } | |
| 85 | |
| 86 static bool IsDtlsSctp(const std::string& protocol) { | |
| 87 return protocol == kMediaProtocolDtlsSctp || | |
| 88 protocol == kMediaProtocolUdpDtlsSctp || | |
| 89 protocol == kMediaProtocolTcpDtlsSctp; | |
|
Taylor Brandstetter
2017/05/24 17:43:21
This is the only method that was changed and not j
| |
| 90 } | |
| 91 | |
| 92 static bool IsPlainSctp(const std::string& protocol) { | |
| 93 return protocol == kMediaProtocolSctp; | |
| 94 } | |
| 95 | |
| 96 static bool IsSctp(const std::string& protocol) { | |
| 97 return IsPlainSctp(protocol) || IsDtlsSctp(protocol); | |
| 98 } | |
| 99 | |
| 70 RtpTransceiverDirection RtpTransceiverDirection::FromMediaContentDirection( | 100 RtpTransceiverDirection RtpTransceiverDirection::FromMediaContentDirection( |
| 71 MediaContentDirection md) { | 101 MediaContentDirection md) { |
| 72 const bool send = (md == MD_SENDRECV || md == MD_SENDONLY); | 102 const bool send = (md == MD_SENDRECV || md == MD_SENDONLY); |
| 73 const bool recv = (md == MD_SENDRECV || md == MD_RECVONLY); | 103 const bool recv = (md == MD_SENDRECV || md == MD_RECVONLY); |
| 74 return RtpTransceiverDirection(send, recv); | 104 return RtpTransceiverDirection(send, recv); |
| 75 } | 105 } |
| 76 | 106 |
| 77 MediaContentDirection RtpTransceiverDirection::ToMediaContentDirection() const { | 107 MediaContentDirection RtpTransceiverDirection::ToMediaContentDirection() const { |
| 78 if (send && recv) { | 108 if (send && recv) { |
| 79 return MD_SENDRECV; | 109 return MD_SENDRECV; |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 391 // audio and video extensions. | 421 // audio and video extensions. |
| 392 class UsedRtpHeaderExtensionIds : public UsedIds<webrtc::RtpExtension> { | 422 class UsedRtpHeaderExtensionIds : public UsedIds<webrtc::RtpExtension> { |
| 393 public: | 423 public: |
| 394 UsedRtpHeaderExtensionIds() | 424 UsedRtpHeaderExtensionIds() |
| 395 : UsedIds<webrtc::RtpExtension>(webrtc::RtpExtension::kMinId, | 425 : UsedIds<webrtc::RtpExtension>(webrtc::RtpExtension::kMinId, |
| 396 webrtc::RtpExtension::kMaxId) {} | 426 webrtc::RtpExtension::kMaxId) {} |
| 397 | 427 |
| 398 private: | 428 private: |
| 399 }; | 429 }; |
| 400 | 430 |
| 401 static bool IsSctp(const MediaContentDescription* desc) { | |
| 402 return ((desc->protocol() == kMediaProtocolSctp) || | |
| 403 (desc->protocol() == kMediaProtocolDtlsSctp)); | |
| 404 } | |
| 405 | |
| 406 // Adds a StreamParams for each Stream in Streams with media type | 431 // Adds a StreamParams for each Stream in Streams with media type |
| 407 // media_type to content_description. | 432 // media_type to content_description. |
| 408 // |current_params| - All currently known StreamParams of any media type. | 433 // |current_params| - All currently known StreamParams of any media type. |
| 409 template <class C> | 434 template <class C> |
| 410 static bool AddStreamParams(MediaType media_type, | 435 static bool AddStreamParams(MediaType media_type, |
| 411 const MediaSessionOptions& options, | 436 const MediaSessionOptions& options, |
| 412 StreamParamsVec* current_streams, | 437 StreamParamsVec* current_streams, |
| 413 MediaContentDescriptionImpl<C>* content_description, | 438 MediaContentDescriptionImpl<C>* content_description, |
| 414 const bool add_legacy_stream) { | 439 const bool add_legacy_stream) { |
| 415 // SCTP streams are not negotiated using SDP/ContentDescriptions. | 440 // SCTP streams are not negotiated using SDP/ContentDescriptions. |
| 416 if (IsSctp(content_description)) { | 441 if (IsSctp(content_description->protocol())) { |
| 417 return true; | 442 return true; |
| 418 } | 443 } |
| 419 | 444 |
| 420 const bool include_rtx_streams = | 445 const bool include_rtx_streams = |
| 421 ContainsRtxCodec(content_description->codecs()); | 446 ContainsRtxCodec(content_description->codecs()); |
| 422 | 447 |
| 423 const MediaSessionOptions::Streams& streams = options.streams; | 448 const MediaSessionOptions::Streams& streams = options.streams; |
| 424 if (streams.empty() && add_legacy_stream) { | 449 if (streams.empty() && add_legacy_stream) { |
| 425 // TODO(perkj): Remove this legacy stream when all apps use StreamParams. | 450 // TODO(perkj): Remove this legacy stream when all apps use StreamParams. |
| 426 std::vector<uint32_t> ssrcs; | 451 std::vector<uint32_t> ssrcs; |
| (...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1078 const bool wants_receive = recv_audio || recv_video || recv_data; | 1103 const bool wants_receive = recv_audio || recv_video || recv_data; |
| 1079 | 1104 |
| 1080 auto offer_rtd = | 1105 auto offer_rtd = |
| 1081 RtpTransceiverDirection::FromMediaContentDirection(offer->direction()); | 1106 RtpTransceiverDirection::FromMediaContentDirection(offer->direction()); |
| 1082 auto wants_rtd = RtpTransceiverDirection(wants_send, wants_receive); | 1107 auto wants_rtd = RtpTransceiverDirection(wants_send, wants_receive); |
| 1083 answer->set_direction(NegotiateRtpTransceiverDirection(offer_rtd, wants_rtd) | 1108 answer->set_direction(NegotiateRtpTransceiverDirection(offer_rtd, wants_rtd) |
| 1084 .ToMediaContentDirection()); | 1109 .ToMediaContentDirection()); |
| 1085 return true; | 1110 return true; |
| 1086 } | 1111 } |
| 1087 | 1112 |
| 1088 static bool IsDtlsRtp(const std::string& protocol) { | |
| 1089 // Most-likely values first. | |
| 1090 return protocol == "UDP/TLS/RTP/SAVPF" || protocol == "TCP/TLS/RTP/SAVPF" || | |
| 1091 protocol == "UDP/TLS/RTP/SAVP" || protocol == "TCP/TLS/RTP/SAVP"; | |
| 1092 } | |
| 1093 | |
| 1094 static bool IsPlainRtp(const std::string& protocol) { | |
| 1095 // Most-likely values first. | |
| 1096 return protocol == "RTP/SAVPF" || protocol == "RTP/AVPF" || | |
| 1097 protocol == "RTP/SAVP" || protocol == "RTP/AVP"; | |
| 1098 } | |
| 1099 | |
| 1100 static bool IsDtlsSctp(const std::string& protocol) { | |
| 1101 return protocol == "DTLS/SCTP"; | |
| 1102 } | |
| 1103 | |
| 1104 static bool IsPlainSctp(const std::string& protocol) { | |
| 1105 return protocol == "SCTP"; | |
| 1106 } | |
| 1107 | |
| 1108 static bool IsMediaProtocolSupported(MediaType type, | 1113 static bool IsMediaProtocolSupported(MediaType type, |
| 1109 const std::string& protocol, | 1114 const std::string& protocol, |
| 1110 bool secure_transport) { | 1115 bool secure_transport) { |
| 1111 // Since not all applications serialize and deserialize the media protocol, | 1116 // Since not all applications serialize and deserialize the media protocol, |
| 1112 // we will have to accept |protocol| to be empty. | 1117 // we will have to accept |protocol| to be empty. |
| 1113 if (protocol.empty()) { | 1118 if (protocol.empty()) { |
| 1114 return true; | 1119 return true; |
| 1115 } | 1120 } |
| 1116 | 1121 |
| 1117 if (type == MEDIA_TYPE_DATA) { | 1122 if (type == MEDIA_TYPE_DATA) { |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1350 audio_added = true; | 1355 audio_added = true; |
| 1351 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_VIDEO)) { | 1356 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_VIDEO)) { |
| 1352 if (!AddVideoContentForOffer(options, current_description, | 1357 if (!AddVideoContentForOffer(options, current_description, |
| 1353 video_rtp_extensions, video_codecs, | 1358 video_rtp_extensions, video_codecs, |
| 1354 ¤t_streams, offer.get())) { | 1359 ¤t_streams, offer.get())) { |
| 1355 return NULL; | 1360 return NULL; |
| 1356 } | 1361 } |
| 1357 video_added = true; | 1362 video_added = true; |
| 1358 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_DATA)) { | 1363 } else if (IsMediaContentOfType(&*it, MEDIA_TYPE_DATA)) { |
| 1359 MediaSessionOptions options_copy(options); | 1364 MediaSessionOptions options_copy(options); |
| 1360 if (IsSctp(static_cast<const MediaContentDescription*>( | 1365 if (IsSctp(static_cast<const MediaContentDescription*>(it->description) |
| 1361 it->description))) { | 1366 ->protocol())) { |
| 1362 options_copy.data_channel_type = DCT_SCTP; | 1367 options_copy.data_channel_type = DCT_SCTP; |
| 1363 } | 1368 } |
| 1364 if (!AddDataContentForOffer(options_copy, current_description, | 1369 if (!AddDataContentForOffer(options_copy, current_description, |
| 1365 &data_codecs, ¤t_streams, | 1370 &data_codecs, ¤t_streams, |
| 1366 offer.get())) { | 1371 offer.get())) { |
| 1367 return NULL; | 1372 return NULL; |
| 1368 } | 1373 } |
| 1369 data_added = true; | 1374 data_added = true; |
| 1370 } else { | 1375 } else { |
| 1371 RTC_NOTREACHED(); | 1376 RTC_NOTREACHED(); |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1790 : secure(); | 1795 : secure(); |
| 1791 std::vector<std::string> crypto_suites; | 1796 std::vector<std::string> crypto_suites; |
| 1792 if (is_sctp) { | 1797 if (is_sctp) { |
| 1793 // SDES doesn't make sense for SCTP, so we disable it, and we only | 1798 // SDES doesn't make sense for SCTP, so we disable it, and we only |
| 1794 // get SDES crypto suites for RTP-based data channels. | 1799 // get SDES crypto suites for RTP-based data channels. |
| 1795 sdes_policy = cricket::SEC_DISABLED; | 1800 sdes_policy = cricket::SEC_DISABLED; |
| 1796 // Unlike SetMediaProtocol below, we need to set the protocol | 1801 // Unlike SetMediaProtocol below, we need to set the protocol |
| 1797 // before we call CreateMediaContentOffer. Otherwise, | 1802 // before we call CreateMediaContentOffer. Otherwise, |
| 1798 // CreateMediaContentOffer won't know this is SCTP and will | 1803 // CreateMediaContentOffer won't know this is SCTP and will |
| 1799 // generate SSRCs rather than SIDs. | 1804 // generate SSRCs rather than SIDs. |
| 1805 // TODO(deadbeef): Use kMediaProtocolDtls | |
| 1800 data->set_protocol( | 1806 data->set_protocol( |
| 1801 secure_transport ? kMediaProtocolDtlsSctp : kMediaProtocolSctp); | 1807 secure_transport ? kMediaProtocolDtlsSctp : kMediaProtocolSctp); |
| 1802 } else { | 1808 } else { |
| 1803 GetSupportedDataSdesCryptoSuiteNames(options.crypto_options, | 1809 GetSupportedDataSdesCryptoSuiteNames(options.crypto_options, |
| 1804 &crypto_suites); | 1810 &crypto_suites); |
| 1805 } | 1811 } |
| 1806 | 1812 |
| 1807 if (!CreateMediaContentOffer( | 1813 if (!CreateMediaContentOffer( |
| 1808 options, | 1814 options, |
| 1809 *data_codecs, | 1815 *data_codecs, |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2183 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); | 2189 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); |
| 2184 } | 2190 } |
| 2185 | 2191 |
| 2186 DataContentDescription* GetFirstDataContentDescription( | 2192 DataContentDescription* GetFirstDataContentDescription( |
| 2187 SessionDescription* sdesc) { | 2193 SessionDescription* sdesc) { |
| 2188 return static_cast<DataContentDescription*>( | 2194 return static_cast<DataContentDescription*>( |
| 2189 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); | 2195 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); |
| 2190 } | 2196 } |
| 2191 | 2197 |
| 2192 } // namespace cricket | 2198 } // namespace cricket |
| OLD | NEW |