Index: webrtc/api/webrtcsession.cc |
diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc |
index 9f84840822fce12c4c9012b568e10c0b3b4e651b..2cd592a08241e350d14751127ba964cbaf2edc7b 100644 |
--- a/webrtc/api/webrtcsession.cc |
+++ b/webrtc/api/webrtcsession.cc |
@@ -24,6 +24,7 @@ |
#include "webrtc/api/webrtcsessiondescriptionfactory.h" |
#include "webrtc/audio_sink.h" |
#include "webrtc/base/basictypes.h" |
+#include "webrtc/base/bind.h" |
#include "webrtc/base/checks.h" |
#include "webrtc/base/helpers.h" |
#include "webrtc/base/logging.h" |
@@ -38,6 +39,10 @@ |
#include "webrtc/pc/channelmanager.h" |
#include "webrtc/pc/mediasession.h" |
+#ifdef HAVE_QUIC |
+#include "webrtc/p2p/quic/quictransportchannel.h" |
+#endif // HAVE_QUIC |
+ |
using cricket::ContentInfo; |
using cricket::ContentInfos; |
using cricket::MediaContentDescription; |
@@ -561,7 +566,17 @@ bool WebRtcSession::Initialize( |
// PeerConnectionFactoryInterface::Options. |
if (rtc_configuration.enable_rtp_data_channel) { |
data_channel_type_ = cricket::DCT_RTP; |
- } else { |
+ } |
+#ifdef HAVE_QUIC |
+ else if (rtc_configuration.enable_quic && dtls_enabled_) { |
+ // Use QUIC instead of DTLS when |enable_quic| is true and encryption is |
+ // enabled. |
+ data_channel_type_ = cricket::DCT_QUIC; |
+ transport_controller_->use_quic(); |
+ LOG(LS_INFO) << "Using QUIC instead of DTLS"; |
+ } |
+#endif // HAVE_QUIC |
+ else { |
// DTLS has to be enabled to use SCTP. |
if (!options.disable_sctp_data_channels && dtls_enabled_) { |
data_channel_type_ = cricket::DCT_SCTP; |
@@ -1748,8 +1763,8 @@ bool WebRtcSession::CreateChannels(const SessionDescription* desc) { |
} |
const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc); |
- if (data_channel_type_ != cricket::DCT_NONE && |
- data && !data->rejected && !data_channel_) { |
+ if (data_channel_type_ != cricket::DCT_NONE && data && !data->rejected && |
+ !data_channel_) { |
if (!CreateDataChannel(data)) { |
LOG(LS_ERROR) << "Failed to create data channel."; |
return false; |
@@ -1820,7 +1835,27 @@ bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content) { |
} |
bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) { |
- bool sctp = (data_channel_type_ == cricket::DCT_SCTP); |
+#ifdef HAVE_QUIC |
+ if (data_channel_type_ == cricket::DCT_QUIC) { |
+ // The TransportController may not have a QuicTransportChannel, so force |
+ // creation of it. |
+ LOG(LS_INFO) << "Getting or creating QuicTransportChannel"; |
+ RTC_DCHECK(transport_controller_->quic()); |
+ cricket::TransportChannel* transport_channel = |
+ worker_thread_->Invoke<cricket::TransportChannel*>( |
+ rtc::Bind(&cricket::TransportController::CreateTransportChannel_w, |
+ transport_controller_.get(), content->name, |
+ cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
+ if (!transport_channel) { |
+ return false; |
+ } |
+ quic_transport_channel_ = |
+ static_cast<cricket::QuicTransportChannel*>(transport_channel); |
+ SignalQuicTransportChannelCreated(quic_transport_channel_); |
+ return true; |
+ } |
+#endif // HAVE_QUIC |
+ bool sctp = data_channel_type_ == cricket::DCT_SCTP; |
data_channel_.reset(channel_manager_->CreateDataChannel( |
transport_controller_.get(), content->name, !sctp, data_channel_type_)); |
if (!data_channel_) { |
@@ -1994,7 +2029,7 @@ bool WebRtcSession::ReadyToUseRemoteCandidate( |
const IceCandidateInterface* candidate, |
const SessionDescriptionInterface* remote_desc, |
bool* valid) { |
- *valid = true;; |
+ *valid = true; |
const SessionDescriptionInterface* current_remote_desc = |
remote_desc ? remote_desc : remote_desc_.get(); |
@@ -2019,6 +2054,14 @@ bool WebRtcSession::ReadyToUseRemoteCandidate( |
current_remote_desc->description()->contents()[mediacontent_index]; |
cricket::BaseChannel* channel = GetChannel(content.name); |
if (!channel) { |
+#ifdef HAVE_QUIC |
+ if (data_channel_type_ == cricket::DCT_QUIC && quic_transport_channel_ && |
+ content.name == quic_transport_channel_->transport_name()) { |
+ // QUIC data channels do not have a BaseChannel unless bundle is enabled. |
+ return transport_controller_->ReadyForRemoteCandidates( |
+ quic_transport_channel_->transport_name()); |
+ } |
+#endif // HAVE_QUIC |
return false; |
} |