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

Side by Side Diff: webrtc/pc/channel.cc

Issue 2812243005: Move ready to send logic from BaseChannel to RtpTransport. (Closed)
Patch Set: Created 3 years, 8 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 unified diff | Download patch
OLDNEW
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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 signaling_thread_(signaling_thread), 169 signaling_thread_(signaling_thread),
170 content_name_(content_name), 170 content_name_(content_name),
171 rtp_transport_(rtcp_mux_required), 171 rtp_transport_(rtcp_mux_required),
172 srtp_required_(srtp_required), 172 srtp_required_(srtp_required),
173 media_channel_(media_channel), 173 media_channel_(media_channel),
174 selected_candidate_pair_(nullptr) { 174 selected_candidate_pair_(nullptr) {
175 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); 175 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
176 #if defined(ENABLE_EXTERNAL_AUTH) 176 #if defined(ENABLE_EXTERNAL_AUTH)
177 srtp_filter_.EnableExternalAuth(); 177 srtp_filter_.EnableExternalAuth();
178 #endif 178 #endif
179 rtp_transport_.SignalReadyToSend.connect(
180 this, &BaseChannel::OnTransportReadyToSend);
179 LOG(LS_INFO) << "Created channel for " << content_name; 181 LOG(LS_INFO) << "Created channel for " << content_name;
180 } 182 }
181 183
182 BaseChannel::~BaseChannel() { 184 BaseChannel::~BaseChannel() {
183 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); 185 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
184 RTC_DCHECK(worker_thread_ == rtc::Thread::Current()); 186 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
185 Deinit(); 187 Deinit();
186 StopConnectionMonitor(); 188 StopConnectionMonitor();
187 // Eats any outstanding messages or packets. 189 // Eats any outstanding messages or packets.
188 worker_thread_->Clear(&invoker_); 190 worker_thread_->Clear(&invoker_);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 : rtp_transport_.rtp_packet_transport(); 372 : rtp_transport_.rtp_packet_transport();
371 373
372 if (!old_packet_transport && !new_packet_transport) { 374 if (!old_packet_transport && !new_packet_transport) {
373 // Nothing to do. 375 // Nothing to do.
374 return; 376 return;
375 } 377 }
376 378
377 RTC_DCHECK(old_packet_transport != new_packet_transport); 379 RTC_DCHECK(old_packet_transport != new_packet_transport);
378 if (old_dtls_transport) { 380 if (old_dtls_transport) {
379 DisconnectFromDtlsTransport(old_dtls_transport); 381 DisconnectFromDtlsTransport(old_dtls_transport);
382 rtp_transport_.Disconnect(rtcp);
380 } else if (old_packet_transport) { 383 } else if (old_packet_transport) {
381 DisconnectFromPacketTransport(old_packet_transport); 384 DisconnectFromPacketTransport(old_packet_transport);
385 rtp_transport_.Disconnect(rtcp);
Taylor Brandstetter 2017/04/14 18:05:33 Could the "disconnect"/"connect" happen implicitly
Zach Stein 2017/04/18 23:39:29 Done.
382 } 386 }
383 387
384 if (rtcp) { 388 if (rtcp) {
385 rtp_transport_.set_rtcp_packet_transport(new_packet_transport); 389 rtp_transport_.set_rtcp_packet_transport(new_packet_transport);
386 } else { 390 } else {
387 rtp_transport_.set_rtp_packet_transport(new_packet_transport); 391 rtp_transport_.set_rtp_packet_transport(new_packet_transport);
388 } 392 }
389 old_dtls_transport = new_dtls_transport; 393 old_dtls_transport = new_dtls_transport;
390 394
391 // If there's no new transport, we're done after disconnecting from old one. 395 // If there's no new transport, we're done after disconnecting from old one.
392 if (!new_packet_transport) { 396 if (!new_packet_transport) {
393 return; 397 return;
394 } 398 }
395 399
396 if (rtcp && new_dtls_transport) { 400 if (rtcp && new_dtls_transport) {
397 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) 401 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive()))
398 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " 402 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active "
399 << "should never happen."; 403 << "should never happen.";
400 } 404 }
405
406 rtp_transport_.Connect(rtcp);
401 if (new_dtls_transport) { 407 if (new_dtls_transport) {
402 ConnectToDtlsTransport(new_dtls_transport); 408 ConnectToDtlsTransport(new_dtls_transport);
403 } else { 409 } else {
404 ConnectToPacketTransport(new_packet_transport); 410 ConnectToPacketTransport(new_packet_transport);
405 } 411 }
406 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_; 412 auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_;
407 for (const auto& pair : socket_options) { 413 for (const auto& pair : socket_options) {
408 new_packet_transport->SetOption(pair.first, pair.second); 414 new_packet_transport->SetOption(pair.first, pair.second);
409 } 415 }
410 } 416 }
411 417
412 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) { 418 void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) {
413 RTC_DCHECK(network_thread_->IsCurrent()); 419 RTC_DCHECK(network_thread_->IsCurrent());
414 420
421 // TODO(zstein): de-dup with ConnectToPacketTransport
415 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 422 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
416 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); 423 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
417 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
418 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); 424 transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
419 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); 425 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
420 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect( 426 transport->ice_transport()->SignalSelectedCandidatePairChanged.connect(
421 this, &BaseChannel::OnSelectedCandidatePairChanged); 427 this, &BaseChannel::OnSelectedCandidatePairChanged);
422 } 428 }
423 429
424 void BaseChannel::DisconnectFromDtlsTransport( 430 void BaseChannel::DisconnectFromDtlsTransport(
425 DtlsTransportInternal* transport) { 431 DtlsTransportInternal* transport) {
426 RTC_DCHECK(network_thread_->IsCurrent()); 432 RTC_DCHECK(network_thread_->IsCurrent());
427 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1, 433 OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1,
428 false); 434 false);
429 435
430 transport->SignalWritableState.disconnect(this); 436 transport->SignalWritableState.disconnect(this);
431 transport->SignalReadPacket.disconnect(this); 437 transport->SignalReadPacket.disconnect(this);
432 transport->SignalReadyToSend.disconnect(this);
433 transport->SignalDtlsState.disconnect(this); 438 transport->SignalDtlsState.disconnect(this);
434 transport->SignalSentPacket.disconnect(this); 439 transport->SignalSentPacket.disconnect(this);
435 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect( 440 transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect(
436 this); 441 this);
437 } 442 }
438 443
439 void BaseChannel::ConnectToPacketTransport( 444 void BaseChannel::ConnectToPacketTransport(
440 rtc::PacketTransportInternal* transport) { 445 rtc::PacketTransportInternal* transport) {
441 RTC_DCHECK_RUN_ON(network_thread_); 446 RTC_DCHECK_RUN_ON(network_thread_);
442 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 447 transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
443 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead); 448 transport->SignalReadPacket.connect(this, &BaseChannel::OnPacketRead);
444 transport->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
445 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n); 449 transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
446 } 450 }
447 451
448 void BaseChannel::DisconnectFromPacketTransport( 452 void BaseChannel::DisconnectFromPacketTransport(
449 rtc::PacketTransportInternal* transport) { 453 rtc::PacketTransportInternal* transport) {
450 RTC_DCHECK_RUN_ON(network_thread_); 454 RTC_DCHECK_RUN_ON(network_thread_);
451 transport->SignalWritableState.disconnect(this); 455 transport->SignalWritableState.disconnect(this);
452 transport->SignalReadPacket.disconnect(this); 456 transport->SignalReadPacket.disconnect(this);
453 transport->SignalReadyToSend.disconnect(this);
454 transport->SignalSentPacket.disconnect(this); 457 transport->SignalSentPacket.disconnect(this);
455 } 458 }
456 459
457 bool BaseChannel::Enable(bool enable) { 460 bool BaseChannel::Enable(bool enable) {
458 worker_thread_->Invoke<void>( 461 worker_thread_->Invoke<void>(
459 RTC_FROM_HERE, 462 RTC_FROM_HERE,
460 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w, 463 Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w,
461 this)); 464 this));
462 return true; 465 return true;
463 } 466 }
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine 614 // OnPacketRead gets called from P2PSocket; now pass data to MediaEngine
612 RTC_DCHECK(network_thread_->IsCurrent()); 615 RTC_DCHECK(network_thread_->IsCurrent());
613 616
614 // When using RTCP multiplexing we might get RTCP packets on the RTP 617 // When using RTCP multiplexing we might get RTCP packets on the RTP
615 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. 618 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
616 bool rtcp = PacketIsRtcp(transport, data, len); 619 bool rtcp = PacketIsRtcp(transport, data, len);
617 rtc::CopyOnWriteBuffer packet(data, len); 620 rtc::CopyOnWriteBuffer packet(data, len);
618 HandlePacket(rtcp, &packet, packet_time); 621 HandlePacket(rtcp, &packet, packet_time);
619 } 622 }
620 623
621 void BaseChannel::OnReadyToSend(rtc::PacketTransportInternal* transport) {
622 RTC_DCHECK(transport == rtp_transport_.rtp_packet_transport() ||
623 transport == rtp_transport_.rtcp_packet_transport());
624 SetTransportChannelReadyToSend(
625 transport == rtp_transport_.rtcp_packet_transport(), true);
626 }
627
628 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport, 624 void BaseChannel::OnDtlsState(DtlsTransportInternal* transport,
629 DtlsTransportState state) { 625 DtlsTransportState state) {
630 if (!ShouldSetupDtlsSrtp_n()) { 626 if (!ShouldSetupDtlsSrtp_n()) {
631 return; 627 return;
632 } 628 }
633 629
634 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED 630 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED
635 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to 631 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to
636 // cover other scenarios like the whole transport is writable (not just this 632 // cover other scenarios like the whole transport is writable (not just this
637 // TransportChannel) or when TransportChannel is attached after DTLS is 633 // TransportChannel) or when TransportChannel is attached after DTLS is
(...skipping 23 matching lines...) Expand all
661 last_sent_packet_id); 657 last_sent_packet_id);
662 658
663 UpdateTransportOverhead(); 659 UpdateTransportOverhead();
664 } 660 }
665 invoker_.AsyncInvoke<void>( 661 invoker_.AsyncInvoke<void>(
666 RTC_FROM_HERE, worker_thread_, 662 RTC_FROM_HERE, worker_thread_,
667 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, 663 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name,
668 network_route)); 664 network_route));
669 } 665 }
670 666
671 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) { 667 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) {
Taylor Brandstetter 2017/04/14 18:05:33 Can this method be removed, and the necessary logi
Zach Stein 2017/04/18 23:39:29 Done.
672 RTC_DCHECK(network_thread_->IsCurrent()); 668 RTC_DCHECK(network_thread_->IsCurrent());
673 if (rtcp) { 669 rtp_transport_.SetReadyToSend(rtcp, ready);
674 rtcp_ready_to_send_ = ready; 670 }
675 } else {
676 rtp_ready_to_send_ = ready;
677 }
678 671
679 bool ready_to_send = 672 void BaseChannel::OnTransportReadyToSend(bool ready) {
680 (rtp_ready_to_send_ &&
681 // In the case of rtcp mux |rtcp_packet_transport_| will be null.
682 (rtcp_ready_to_send_ || !rtp_transport_.rtcp_packet_transport()));
683
684 invoker_.AsyncInvoke<void>( 673 invoker_.AsyncInvoke<void>(
685 RTC_FROM_HERE, worker_thread_, 674 RTC_FROM_HERE, worker_thread_,
686 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready_to_send)); 675 Bind(&MediaChannel::OnReadyToSend, media_channel_, ready));
687 } 676 }
688 677
689 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport, 678 bool BaseChannel::PacketIsRtcp(const rtc::PacketTransportInternal* transport,
690 const char* data, 679 const char* data,
691 size_t len) { 680 size_t len) {
692 return (transport == rtp_transport_.rtcp_packet_transport() || 681 return (transport == rtp_transport_.rtcp_packet_transport() ||
693 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len))); 682 rtcp_mux_filter_.DemuxRtcp(data, static_cast<int>(len)));
694 } 683 }
695 684
696 bool BaseChannel::SendPacket(bool rtcp, 685 bool BaseChannel::SendPacket(bool rtcp,
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after
2486 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA, 2475 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA,
2487 new DataChannelReadyToSendMessageData(writable)); 2476 new DataChannelReadyToSendMessageData(writable));
2488 } 2477 }
2489 2478
2490 void RtpDataChannel::GetSrtpCryptoSuites_n( 2479 void RtpDataChannel::GetSrtpCryptoSuites_n(
2491 std::vector<int>* crypto_suites) const { 2480 std::vector<int>* crypto_suites) const {
2492 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites); 2481 GetSupportedDataCryptoSuites(crypto_options(), crypto_suites);
2493 } 2482 }
2494 2483
2495 } // namespace cricket 2484 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698