OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 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 |
11 #include "webrtc/api/webrtcsession.h" | 11 #include "webrtc/api/webrtcsession.h" |
12 | 12 |
13 #include <limits.h> | 13 #include <limits.h> |
14 | 14 |
15 #include <algorithm> | 15 #include <algorithm> |
16 #include <set> | 16 #include <set> |
17 #include <utility> | 17 #include <utility> |
18 #include <vector> | 18 #include <vector> |
19 | 19 |
20 #include "webrtc/api/jsepicecandidate.h" | 20 #include "webrtc/api/jsepicecandidate.h" |
21 #include "webrtc/api/jsepsessiondescription.h" | 21 #include "webrtc/api/jsepsessiondescription.h" |
22 #include "webrtc/api/peerconnectioninterface.h" | 22 #include "webrtc/api/peerconnectioninterface.h" |
23 #include "webrtc/api/sctputils.h" | 23 #include "webrtc/api/sctputils.h" |
24 #include "webrtc/api/webrtcsessiondescriptionfactory.h" | 24 #include "webrtc/api/webrtcsessiondescriptionfactory.h" |
25 #include "webrtc/audio_sink.h" | 25 #include "webrtc/audio_sink.h" |
26 #include "webrtc/base/basictypes.h" | 26 #include "webrtc/base/basictypes.h" |
| 27 #include "webrtc/base/bind.h" |
27 #include "webrtc/base/checks.h" | 28 #include "webrtc/base/checks.h" |
28 #include "webrtc/base/helpers.h" | 29 #include "webrtc/base/helpers.h" |
29 #include "webrtc/base/logging.h" | 30 #include "webrtc/base/logging.h" |
30 #include "webrtc/base/stringencode.h" | 31 #include "webrtc/base/stringencode.h" |
31 #include "webrtc/base/stringutils.h" | 32 #include "webrtc/base/stringutils.h" |
32 #include "webrtc/call.h" | 33 #include "webrtc/call.h" |
33 #include "webrtc/media/base/mediaconstants.h" | 34 #include "webrtc/media/base/mediaconstants.h" |
34 #include "webrtc/media/base/videocapturer.h" | 35 #include "webrtc/media/base/videocapturer.h" |
35 #include "webrtc/p2p/base/portallocator.h" | 36 #include "webrtc/p2p/base/portallocator.h" |
36 #include "webrtc/p2p/base/transportchannel.h" | 37 #include "webrtc/p2p/base/transportchannel.h" |
37 #include "webrtc/pc/channel.h" | 38 #include "webrtc/pc/channel.h" |
38 #include "webrtc/pc/channelmanager.h" | 39 #include "webrtc/pc/channelmanager.h" |
39 #include "webrtc/pc/mediasession.h" | 40 #include "webrtc/pc/mediasession.h" |
40 | 41 |
| 42 #ifdef HAVE_QUIC |
| 43 #include "webrtc/p2p/quic/quictransportchannel.h" |
| 44 #endif // HAVE_QUIC |
| 45 |
41 using cricket::ContentInfo; | 46 using cricket::ContentInfo; |
42 using cricket::ContentInfos; | 47 using cricket::ContentInfos; |
43 using cricket::MediaContentDescription; | 48 using cricket::MediaContentDescription; |
44 using cricket::SessionDescription; | 49 using cricket::SessionDescription; |
45 using cricket::TransportInfo; | 50 using cricket::TransportInfo; |
46 | 51 |
47 using cricket::LOCAL_PORT_TYPE; | 52 using cricket::LOCAL_PORT_TYPE; |
48 using cricket::STUN_PORT_TYPE; | 53 using cricket::STUN_PORT_TYPE; |
49 using cricket::RELAY_PORT_TYPE; | 54 using cricket::RELAY_PORT_TYPE; |
50 using cricket::PRFLX_PORT_TYPE; | 55 using cricket::PRFLX_PORT_TYPE; |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 if (rtc_configuration.enable_dtls_srtp) { | 559 if (rtc_configuration.enable_dtls_srtp) { |
555 dtls_enabled_ = *(rtc_configuration.enable_dtls_srtp); | 560 dtls_enabled_ = *(rtc_configuration.enable_dtls_srtp); |
556 } | 561 } |
557 } | 562 } |
558 | 563 |
559 // Enable creation of RTP data channels if the kEnableRtpDataChannels is set. | 564 // Enable creation of RTP data channels if the kEnableRtpDataChannels is set. |
560 // It takes precendence over the disable_sctp_data_channels | 565 // It takes precendence over the disable_sctp_data_channels |
561 // PeerConnectionFactoryInterface::Options. | 566 // PeerConnectionFactoryInterface::Options. |
562 if (rtc_configuration.enable_rtp_data_channel) { | 567 if (rtc_configuration.enable_rtp_data_channel) { |
563 data_channel_type_ = cricket::DCT_RTP; | 568 data_channel_type_ = cricket::DCT_RTP; |
564 } else { | 569 } |
| 570 #ifdef HAVE_QUIC |
| 571 else if (rtc_configuration.enable_quic && dtls_enabled_) { |
| 572 // Use QUIC instead of DTLS when |enable_quic| is true and encryption is |
| 573 // enabled. |
| 574 data_channel_type_ = cricket::DCT_QUIC; |
| 575 transport_controller_->use_quic(); |
| 576 LOG(LS_INFO) << "Using QUIC instead of DTLS"; |
| 577 } |
| 578 #endif // HAVE_QUIC |
| 579 else { |
565 // DTLS has to be enabled to use SCTP. | 580 // DTLS has to be enabled to use SCTP. |
566 if (!options.disable_sctp_data_channels && dtls_enabled_) { | 581 if (!options.disable_sctp_data_channels && dtls_enabled_) { |
567 data_channel_type_ = cricket::DCT_SCTP; | 582 data_channel_type_ = cricket::DCT_SCTP; |
568 } | 583 } |
569 } | 584 } |
570 | 585 |
571 video_options_.screencast_min_bitrate_kbps = | 586 video_options_.screencast_min_bitrate_kbps = |
572 rtc_configuration.screencast_min_bitrate; | 587 rtc_configuration.screencast_min_bitrate; |
573 audio_options_.combined_audio_video_bwe = | 588 audio_options_.combined_audio_video_bwe = |
574 rtc_configuration.combined_audio_video_bwe; | 589 rtc_configuration.combined_audio_video_bwe; |
(...skipping 1166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1741 | 1756 |
1742 const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc); | 1757 const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc); |
1743 if (video && !video->rejected && !video_channel_) { | 1758 if (video && !video->rejected && !video_channel_) { |
1744 if (!CreateVideoChannel(video)) { | 1759 if (!CreateVideoChannel(video)) { |
1745 LOG(LS_ERROR) << "Failed to create video channel."; | 1760 LOG(LS_ERROR) << "Failed to create video channel."; |
1746 return false; | 1761 return false; |
1747 } | 1762 } |
1748 } | 1763 } |
1749 | 1764 |
1750 const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc); | 1765 const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc); |
1751 if (data_channel_type_ != cricket::DCT_NONE && | 1766 if (data_channel_type_ != cricket::DCT_NONE && data && !data->rejected && |
1752 data && !data->rejected && !data_channel_) { | 1767 !data_channel_) { |
1753 if (!CreateDataChannel(data)) { | 1768 if (!CreateDataChannel(data)) { |
1754 LOG(LS_ERROR) << "Failed to create data channel."; | 1769 LOG(LS_ERROR) << "Failed to create data channel."; |
1755 return false; | 1770 return false; |
1756 } | 1771 } |
1757 } | 1772 } |
1758 | 1773 |
1759 if (rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire) { | 1774 if (rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire) { |
1760 if (voice_channel()) { | 1775 if (voice_channel()) { |
1761 voice_channel()->ActivateRtcpMux(); | 1776 voice_channel()->ActivateRtcpMux(); |
1762 } | 1777 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1813 video_channel_->SignalDtlsSetupFailure.connect( | 1828 video_channel_->SignalDtlsSetupFailure.connect( |
1814 this, &WebRtcSession::OnDtlsSetupFailure); | 1829 this, &WebRtcSession::OnDtlsSetupFailure); |
1815 | 1830 |
1816 SignalVideoChannelCreated(); | 1831 SignalVideoChannelCreated(); |
1817 video_channel_->transport_channel()->SignalSentPacket.connect( | 1832 video_channel_->transport_channel()->SignalSentPacket.connect( |
1818 this, &WebRtcSession::OnSentPacket_w); | 1833 this, &WebRtcSession::OnSentPacket_w); |
1819 return true; | 1834 return true; |
1820 } | 1835 } |
1821 | 1836 |
1822 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) { | 1837 bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) { |
1823 bool sctp = (data_channel_type_ == cricket::DCT_SCTP); | 1838 #ifdef HAVE_QUIC |
| 1839 if (data_channel_type_ == cricket::DCT_QUIC) { |
| 1840 // The TransportController may not have a QuicTransportChannel, so force |
| 1841 // creation of it. |
| 1842 LOG(LS_INFO) << "Getting or creating QuicTransportChannel"; |
| 1843 RTC_DCHECK(transport_controller_->quic()); |
| 1844 cricket::TransportChannel* transport_channel = |
| 1845 worker_thread_->Invoke<cricket::TransportChannel*>( |
| 1846 rtc::Bind(&cricket::TransportController::CreateTransportChannel_w, |
| 1847 transport_controller_.get(), content->name, |
| 1848 cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
| 1849 if (!transport_channel) { |
| 1850 return false; |
| 1851 } |
| 1852 quic_transport_channel_ = |
| 1853 static_cast<cricket::QuicTransportChannel*>(transport_channel); |
| 1854 SignalQuicTransportChannelCreated(quic_transport_channel_); |
| 1855 return true; |
| 1856 } |
| 1857 #endif // HAVE_QUIC |
| 1858 bool sctp = data_channel_type_ == cricket::DCT_SCTP; |
1824 data_channel_.reset(channel_manager_->CreateDataChannel( | 1859 data_channel_.reset(channel_manager_->CreateDataChannel( |
1825 transport_controller_.get(), content->name, !sctp, data_channel_type_)); | 1860 transport_controller_.get(), content->name, !sctp, data_channel_type_)); |
1826 if (!data_channel_) { | 1861 if (!data_channel_) { |
1827 return false; | 1862 return false; |
1828 } | 1863 } |
1829 | 1864 |
1830 if (sctp) { | 1865 if (sctp) { |
1831 data_channel_->SignalDataReceived.connect( | 1866 data_channel_->SignalDataReceived.connect( |
1832 this, &WebRtcSession::OnDataChannelMessageReceived); | 1867 this, &WebRtcSession::OnDataChannelMessageReceived); |
1833 } | 1868 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1987 | 2022 |
1988 // We need to check the local/remote description for the Transport instead of | 2023 // We need to check the local/remote description for the Transport instead of |
1989 // the session, because a new Transport added during renegotiation may have | 2024 // the session, because a new Transport added during renegotiation may have |
1990 // them unset while the session has them set from the previous negotiation. | 2025 // them unset while the session has them set from the previous negotiation. |
1991 // Not doing so may trigger the auto generation of transport description and | 2026 // Not doing so may trigger the auto generation of transport description and |
1992 // mess up DTLS identity information, ICE credential, etc. | 2027 // mess up DTLS identity information, ICE credential, etc. |
1993 bool WebRtcSession::ReadyToUseRemoteCandidate( | 2028 bool WebRtcSession::ReadyToUseRemoteCandidate( |
1994 const IceCandidateInterface* candidate, | 2029 const IceCandidateInterface* candidate, |
1995 const SessionDescriptionInterface* remote_desc, | 2030 const SessionDescriptionInterface* remote_desc, |
1996 bool* valid) { | 2031 bool* valid) { |
1997 *valid = true;; | 2032 *valid = true; |
1998 | 2033 |
1999 const SessionDescriptionInterface* current_remote_desc = | 2034 const SessionDescriptionInterface* current_remote_desc = |
2000 remote_desc ? remote_desc : remote_desc_.get(); | 2035 remote_desc ? remote_desc : remote_desc_.get(); |
2001 | 2036 |
2002 if (!current_remote_desc) { | 2037 if (!current_remote_desc) { |
2003 return false; | 2038 return false; |
2004 } | 2039 } |
2005 | 2040 |
2006 size_t mediacontent_index = | 2041 size_t mediacontent_index = |
2007 static_cast<size_t>(candidate->sdp_mline_index()); | 2042 static_cast<size_t>(candidate->sdp_mline_index()); |
2008 size_t remote_content_size = | 2043 size_t remote_content_size = |
2009 current_remote_desc->description()->contents().size(); | 2044 current_remote_desc->description()->contents().size(); |
2010 if (mediacontent_index >= remote_content_size) { | 2045 if (mediacontent_index >= remote_content_size) { |
2011 LOG(LS_ERROR) << "ReadyToUseRemoteCandidate: Invalid candidate media index " | 2046 LOG(LS_ERROR) << "ReadyToUseRemoteCandidate: Invalid candidate media index " |
2012 << mediacontent_index; | 2047 << mediacontent_index; |
2013 | 2048 |
2014 *valid = false; | 2049 *valid = false; |
2015 return false; | 2050 return false; |
2016 } | 2051 } |
2017 | 2052 |
2018 cricket::ContentInfo content = | 2053 cricket::ContentInfo content = |
2019 current_remote_desc->description()->contents()[mediacontent_index]; | 2054 current_remote_desc->description()->contents()[mediacontent_index]; |
2020 cricket::BaseChannel* channel = GetChannel(content.name); | 2055 cricket::BaseChannel* channel = GetChannel(content.name); |
2021 if (!channel) { | 2056 if (!channel) { |
| 2057 #ifdef HAVE_QUIC |
| 2058 if (data_channel_type_ == cricket::DCT_QUIC && quic_transport_channel_ && |
| 2059 content.name == quic_transport_channel_->transport_name()) { |
| 2060 // QUIC data channels do not have a BaseChannel unless bundle is enabled. |
| 2061 return transport_controller_->ReadyForRemoteCandidates( |
| 2062 quic_transport_channel_->transport_name()); |
| 2063 } |
| 2064 #endif // HAVE_QUIC |
2022 return false; | 2065 return false; |
2023 } | 2066 } |
2024 | 2067 |
2025 return transport_controller_->ReadyForRemoteCandidates( | 2068 return transport_controller_->ReadyForRemoteCandidates( |
2026 channel->transport_name()); | 2069 channel->transport_name()); |
2027 } | 2070 } |
2028 | 2071 |
2029 void WebRtcSession::OnTransportControllerGatheringState( | 2072 void WebRtcSession::OnTransportControllerGatheringState( |
2030 cricket::IceGatheringState state) { | 2073 cricket::IceGatheringState state) { |
2031 ASSERT(signaling_thread()->IsCurrent()); | 2074 ASSERT(signaling_thread()->IsCurrent()); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2155 } | 2198 } |
2156 } | 2199 } |
2157 | 2200 |
2158 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel, | 2201 void WebRtcSession::OnSentPacket_w(cricket::TransportChannel* channel, |
2159 const rtc::SentPacket& sent_packet) { | 2202 const rtc::SentPacket& sent_packet) { |
2160 RTC_DCHECK(worker_thread()->IsCurrent()); | 2203 RTC_DCHECK(worker_thread()->IsCurrent()); |
2161 media_controller_->call_w()->OnSentPacket(sent_packet); | 2204 media_controller_->call_w()->OnSentPacket(sent_packet); |
2162 } | 2205 } |
2163 | 2206 |
2164 } // namespace webrtc | 2207 } // namespace webrtc |
OLD | NEW |