Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Unified Diff: webrtc/api/webrtcsession.cc

Issue 2166873002: Modified PeerConnection and WebRtcSession for end-to-end QuicDataChannel usage. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Change the comments and minor fix. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/api/webrtcsession.h ('k') | webrtc/api/webrtcsession_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/api/webrtcsession.cc
diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc
index 7497e2c7e0a9f879f6590fe22f7e041f053d1938..35a5fab4c6ec08850f13ce8a11fe015ae6e61609 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;
@@ -460,7 +465,8 @@ WebRtcSession::WebRtcSession(
rtc::Thread* signaling_thread,
cricket::PortAllocator* port_allocator,
std::unique_ptr<cricket::TransportController> transport_controller)
- : worker_thread_(worker_thread),
+ : network_thread_(network_thread),
+ worker_thread_(worker_thread),
signaling_thread_(signaling_thread),
// RFC 3264: The numeric value of the session id and version in the
// o line MUST be representable with a "64 bit signed integer".
@@ -505,6 +511,11 @@ WebRtcSession::~WebRtcSession() {
SignalDataChannelDestroyed();
channel_manager_->DestroyDataChannel(data_channel_.release());
}
+#ifdef HAVE_QUIC
+ if (quic_data_transport_) {
+ quic_data_transport_.reset();
+ }
+#endif
SignalDestroyed();
LOG(LS_INFO) << "Session: " << id() << " is destroyed.";
@@ -545,7 +556,21 @@ 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) {
+ // Use QUIC instead of DTLS when |enable_quic| is true.
+ data_channel_type_ = cricket::DCT_QUIC;
+ transport_controller_->use_quic();
+ if (dtls_enabled_) {
+ LOG(LS_INFO) << "Using QUIC instead of DTLS";
+ }
+ quic_data_transport_.reset(
+ new QuicDataTransport(signaling_thread(), worker_thread(),
+ network_thread(), transport_controller_.get()));
+ }
+#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;
@@ -1035,6 +1060,15 @@ bool WebRtcSession::EnableBundle(const cricket::ContentGroup& bundle) {
const std::string& transport_name = *first_content_name;
cricket::BaseChannel* first_channel = GetChannel(transport_name);
+#ifdef HAVE_QUIC
+ if (quic_data_transport_ &&
+ bundle.HasContentName(quic_data_transport_->content_name()) &&
+ quic_data_transport_->transport_name() != transport_name) {
+ LOG(LS_ERROR) << "Unable to BUNDLE " << quic_data_transport_->content_name()
+ << " on " << transport_name << "with QUIC.";
+ }
+#endif
+
auto maybe_set_transport = [this, bundle, transport_name,
first_channel](cricket::BaseChannel* ch) {
if (!ch || !bundle.HasContentName(ch->content_name())) {
@@ -1543,9 +1577,17 @@ void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
const cricket::ContentInfo* data_info =
cricket::GetFirstDataContent(desc);
- if ((!data_info || data_info->rejected) && data_channel_) {
- SignalDataChannelDestroyed();
- channel_manager_->DestroyDataChannel(data_channel_.release());
+ if (!data_info || data_info->rejected) {
+ if (data_channel_) {
+ SignalDataChannelDestroyed();
+ channel_manager_->DestroyDataChannel(data_channel_.release());
+ }
+#ifdef HAVE_QUIC
+ // Clean up the existing QuicDataTransport and its QuicTransportChannels.
+ if (quic_data_transport_) {
+ quic_data_transport_.reset();
+ }
+#endif
}
}
@@ -1659,6 +1701,15 @@ bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content,
bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content,
const std::string* bundle_transport) {
+#ifdef HAVE_QUIC
+ if (data_channel_type_ == cricket::DCT_QUIC) {
+ RTC_DCHECK(transport_controller_->quic());
+ const std::string transport_name =
+ bundle_transport ? *bundle_transport : content->name;
+ quic_data_transport_->SetTransport(transport_name);
+ return true;
+ }
+#endif // HAVE_QUIC
bool sctp = (data_channel_type_ == cricket::DCT_SCTP);
bool require_rtcp_mux =
rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
@@ -1842,7 +1893,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();
@@ -1865,13 +1916,12 @@ bool WebRtcSession::ReadyToUseRemoteCandidate(
cricket::ContentInfo content =
current_remote_desc->description()->contents()[mediacontent_index];
- cricket::BaseChannel* channel = GetChannel(content.name);
- if (!channel) {
+
+ const std::string transport_name = GetTransportName(content.name);
+ if (transport_name.empty()) {
return false;
}
-
- return transport_controller_->ReadyForRemoteCandidates(
- channel->transport_name());
+ return transport_controller_->ReadyForRemoteCandidates(transport_name);
}
void WebRtcSession::OnTransportControllerGatheringState(
@@ -2008,4 +2058,19 @@ void WebRtcSession::OnSentPacket_w(const rtc::SentPacket& sent_packet) {
media_controller_->call_w()->OnSentPacket(sent_packet);
}
+const std::string WebRtcSession::GetTransportName(
+ const std::string& content_name) {
+ cricket::BaseChannel* channel = GetChannel(content_name);
+ if (!channel) {
+#ifdef HAVE_QUIC
+ if (data_channel_type_ == cricket::DCT_QUIC && quic_data_transport_ &&
+ content_name == quic_data_transport_->transport_name()) {
+ return quic_data_transport_->transport_name();
+ }
+#endif
+ // Return an empty string if failed to retrieve the transport name.
+ return "";
+ }
+ return channel->transport_name();
+}
} // namespace webrtc
« no previous file with comments | « webrtc/api/webrtcsession.h ('k') | webrtc/api/webrtcsession_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698