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 2269173004: Renaming BaseChannel methods and adding comments for added clarity. (Closed)
Patch Set: 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 unified diff | Download patch
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
11 #include <utility> 11 #include <utility>
12 12
13 #include "webrtc/pc/channel.h" 13 #include "webrtc/pc/channel.h"
14 14
15 #include "webrtc/audio_sink.h" 15 #include "webrtc/audio_sink.h"
16 #include "webrtc/base/bind.h" 16 #include "webrtc/base/bind.h"
17 #include "webrtc/base/byteorder.h" 17 #include "webrtc/base/byteorder.h"
18 #include "webrtc/base/checks.h"
18 #include "webrtc/base/common.h" 19 #include "webrtc/base/common.h"
19 #include "webrtc/base/copyonwritebuffer.h" 20 #include "webrtc/base/copyonwritebuffer.h"
20 #include "webrtc/base/dscp.h" 21 #include "webrtc/base/dscp.h"
21 #include "webrtc/base/logging.h" 22 #include "webrtc/base/logging.h"
22 #include "webrtc/base/networkroute.h" 23 #include "webrtc/base/networkroute.h"
23 #include "webrtc/base/trace_event.h" 24 #include "webrtc/base/trace_event.h"
24 #include "webrtc/media/base/mediaconstants.h" 25 #include "webrtc/media/base/mediaconstants.h"
25 #include "webrtc/media/base/rtputils.h" 26 #include "webrtc/media/base/rtputils.h"
26 #include "webrtc/p2p/base/transportchannel.h" 27 #include "webrtc/p2p/base/transportchannel.h"
27 #include "webrtc/pc/channelmanager.h" 28 #include "webrtc/pc/channelmanager.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 const std::string& content_name, 165 const std::string& content_name,
165 bool rtcp) 166 bool rtcp)
166 : worker_thread_(worker_thread), 167 : worker_thread_(worker_thread),
167 network_thread_(network_thread), 168 network_thread_(network_thread),
168 169
169 content_name_(content_name), 170 content_name_(content_name),
170 171
171 transport_controller_(transport_controller), 172 transport_controller_(transport_controller),
172 rtcp_enabled_(rtcp), 173 rtcp_enabled_(rtcp),
173 media_channel_(media_channel) { 174 media_channel_(media_channel) {
174 ASSERT(worker_thread_ == rtc::Thread::Current()); 175 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
175 if (transport_controller) { 176 if (transport_controller) {
176 RTC_DCHECK_EQ(network_thread, transport_controller->network_thread()); 177 RTC_DCHECK_EQ(network_thread, transport_controller->network_thread());
177 } 178 }
178 LOG(LS_INFO) << "Created channel for " << content_name; 179 LOG(LS_INFO) << "Created channel for " << content_name;
179 } 180 }
180 181
181 BaseChannel::~BaseChannel() { 182 BaseChannel::~BaseChannel() {
182 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel"); 183 TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
183 ASSERT(worker_thread_ == rtc::Thread::Current()); 184 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
184 Deinit(); 185 Deinit();
185 StopConnectionMonitor(); 186 StopConnectionMonitor();
186 // Eats any outstanding messages or packets. 187 // Eats any outstanding messages or packets.
187 worker_thread_->Clear(&invoker_); 188 worker_thread_->Clear(&invoker_);
188 worker_thread_->Clear(this); 189 worker_thread_->Clear(this);
189 // We must destroy the media channel before the transport channel, otherwise 190 // We must destroy the media channel before the transport channel, otherwise
190 // the media channel may try to send on the dead transport channel. NULLing 191 // the media channel may try to send on the dead transport channel. NULLing
191 // is not an effective strategy since the sends will come on another thread. 192 // is not an effective strategy since the sends will come on another thread.
192 delete media_channel_; 193 delete media_channel_;
193 // Note that we don't just call SetTransportChannel_n(nullptr) because that 194 // Note that we don't just call SetTransportChannel_n(nullptr) because that
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 274
274 bool BaseChannel::SetTransport(const std::string& transport_name) { 275 bool BaseChannel::SetTransport(const std::string& transport_name) {
275 return network_thread_->Invoke<bool>( 276 return network_thread_->Invoke<bool>(
276 RTC_FROM_HERE, Bind(&BaseChannel::SetTransport_n, this, transport_name)); 277 RTC_FROM_HERE, Bind(&BaseChannel::SetTransport_n, this, transport_name));
277 } 278 }
278 279
279 bool BaseChannel::SetTransport_n(const std::string& transport_name) { 280 bool BaseChannel::SetTransport_n(const std::string& transport_name) {
280 RTC_DCHECK(network_thread_->IsCurrent()); 281 RTC_DCHECK(network_thread_->IsCurrent());
281 282
282 if (transport_name == transport_name_) { 283 if (transport_name == transport_name_) {
283 // Nothing to do if transport name isn't changing 284 // Nothing to do if transport name isn't changing.
284 return true; 285 return true;
285 } 286 }
286 287
287 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport 288 // When using DTLS-SRTP, we must reset the SrtpFilter every time the transport
288 // changes and wait until the DTLS handshake is complete to set the newly 289 // changes and wait until the DTLS handshake is complete to set the newly
289 // negotiated parameters. 290 // negotiated parameters.
290 if (ShouldSetupDtlsSrtp_n()) { 291 if (ShouldSetupDtlsSrtp_n()) {
291 // Set |writable_| to false such that UpdateWritableState_w can set up 292 // Set |writable_| to false such that UpdateWritableState_w can set up
292 // DTLS-SRTP when the writable_ becomes true again. 293 // DTLS-SRTP when |writable_| becomes true again.
293 writable_ = false; 294 writable_ = false;
294 srtp_filter_.ResetParams(); 295 srtp_filter_.ResetParams();
295 } 296 }
296 297
297 // If this BaseChannel uses RTCP and we haven't fully negotiated RTCP mux, 298 // If this BaseChannel uses RTCP and we haven't fully negotiated RTCP mux,
298 // we need an RTCP channel. 299 // we need an RTCP channel.
299 if (rtcp_enabled_ && !rtcp_mux_filter_.IsFullyActive()) { 300 if (rtcp_enabled_ && !rtcp_mux_filter_.IsFullyActive()) {
300 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name() 301 LOG(LS_INFO) << "Create RTCP TransportChannel for " << content_name()
301 << " on " << transport_name << " transport "; 302 << " on " << transport_name << " transport ";
302 // TODO(deadbeef): Remove this grossness when we remove non-muxed RTCP. 303 // TODO(deadbeef): Remove this grossness when we remove non-muxed RTCP.
(...skipping 10 matching lines...) Expand all
313 SetTransportChannel_n(transport_controller_->CreateTransportChannel_n( 314 SetTransportChannel_n(transport_controller_->CreateTransportChannel_n(
314 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP)); 315 transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP));
315 if (!transport_channel_) { 316 if (!transport_channel_) {
316 return false; 317 return false;
317 } 318 }
318 319
319 // TODO(deadbeef): Remove this grossness when we remove non-muxed RTCP. 320 // TODO(deadbeef): Remove this grossness when we remove non-muxed RTCP.
320 if (rtcp_transport_channel_) { 321 if (rtcp_transport_channel_) {
321 // We can only update the RTCP ready to send after set_transport_channel has 322 // We can only update the RTCP ready to send after set_transport_channel has
322 // handled channel writability. 323 // handled channel writability.
323 SetReadyToSend(true, rtcp_transport_channel_->writable()); 324 SetTransportChannelReadyToSend(true, rtcp_transport_channel_->writable());
324 } 325 }
325 transport_name_ = transport_name; 326 transport_name_ = transport_name;
326 return true; 327 return true;
327 } 328 }
328 329
329 void BaseChannel::SetTransportChannel_n(TransportChannel* new_tc) { 330 void BaseChannel::SetTransportChannel_n(TransportChannel* new_tc) {
330 RTC_DCHECK(network_thread_->IsCurrent()); 331 RTC_DCHECK(network_thread_->IsCurrent());
331 332
332 TransportChannel* old_tc = transport_channel_; 333 TransportChannel* old_tc = transport_channel_;
333 if (!old_tc && !new_tc) { 334 if (!old_tc && !new_tc) {
334 // Nothing to do 335 // Nothing to do.
335 return; 336 return;
336 } 337 }
337 ASSERT(old_tc != new_tc); 338 RTC_DCHECK(old_tc != new_tc);
338 339
339 if (old_tc) { 340 if (old_tc) {
340 DisconnectFromTransportChannel(old_tc); 341 DisconnectFromTransportChannel(old_tc);
341 transport_controller_->DestroyTransportChannel_n( 342 transport_controller_->DestroyTransportChannel_n(
342 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP); 343 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTP);
343 } 344 }
344 345
345 transport_channel_ = new_tc; 346 transport_channel_ = new_tc;
346 347
347 if (new_tc) { 348 if (new_tc) {
348 ConnectToTransportChannel(new_tc); 349 ConnectToTransportChannel(new_tc);
349 for (const auto& pair : socket_options_) { 350 for (const auto& pair : socket_options_) {
350 new_tc->SetOption(pair.first, pair.second); 351 new_tc->SetOption(pair.first, pair.second);
351 } 352 }
352 } 353 }
353 354
354 // Update aggregate writable/ready-to-send state between RTP and RTCP upon 355 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
355 // setting new channel 356 // setting new transport channels.
356 UpdateWritableState_n(); 357 UpdateWritableState_n();
357 SetReadyToSend(false, new_tc && new_tc->writable()); 358 // On setting a new channel, assume it's ready to send if it's writable,
359 // because we have no way of knowing otherwise (the channel doesn't give us
360 // "was last send successful?").
361 //
362 // This won't always be accurate (the last SendPacket call from another
363 // BaseChannel could have resulted in an error), but even so, we'll just
364 // encounter the error again and update "ready to send" accordingly.
365 SetTransportChannelReadyToSend(false, new_tc && new_tc->writable());
358 } 366 }
359 367
360 void BaseChannel::SetRtcpTransportChannel_n(TransportChannel* new_tc, 368 void BaseChannel::SetRtcpTransportChannel_n(TransportChannel* new_tc,
361 bool update_writablity) { 369 bool update_writablity) {
362 RTC_DCHECK(network_thread_->IsCurrent()); 370 RTC_DCHECK(network_thread_->IsCurrent());
363 371
364 TransportChannel* old_tc = rtcp_transport_channel_; 372 TransportChannel* old_tc = rtcp_transport_channel_;
365 if (!old_tc && !new_tc) { 373 if (!old_tc && !new_tc) {
366 // Nothing to do 374 // Nothing to do.
367 return; 375 return;
368 } 376 }
369 ASSERT(old_tc != new_tc); 377 RTC_DCHECK(old_tc != new_tc);
370 378
371 if (old_tc) { 379 if (old_tc) {
372 DisconnectFromTransportChannel(old_tc); 380 DisconnectFromTransportChannel(old_tc);
373 transport_controller_->DestroyTransportChannel_n( 381 transport_controller_->DestroyTransportChannel_n(
374 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP); 382 transport_name_, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
375 } 383 }
376 384
377 rtcp_transport_channel_ = new_tc; 385 rtcp_transport_channel_ = new_tc;
378 386
379 if (new_tc) { 387 if (new_tc) {
380 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive())) 388 RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_filter_.IsActive()))
381 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active " 389 << "Setting RTCP for DTLS/SRTP after SrtpFilter is active "
382 << "should never happen."; 390 << "should never happen.";
383 ConnectToTransportChannel(new_tc); 391 ConnectToTransportChannel(new_tc);
384 for (const auto& pair : rtcp_socket_options_) { 392 for (const auto& pair : rtcp_socket_options_) {
385 new_tc->SetOption(pair.first, pair.second); 393 new_tc->SetOption(pair.first, pair.second);
386 } 394 }
387 } 395 }
388 396
389 if (update_writablity) { 397 if (update_writablity) {
390 // Update aggregate writable/ready-to-send state between RTP and RTCP upon 398 // Update aggregate writable/ready-to-send state between RTP and RTCP upon
391 // setting new channel 399 // setting new channel
392 UpdateWritableState_n(); 400 UpdateWritableState_n();
393 SetReadyToSend(true, new_tc && new_tc->writable()); 401 // On setting a new channel, assume it's ready to send if it's writable,
402 // because we have no way of knowing otherwise (the channel doesn't give us
403 // "was last send successful?").
404 //
405 // This won't always be accurate (the last SendPacket call from another
406 // BaseChannel could have resulted in an error), but even so, we'll just
Taylor Brandstetter 2016/08/24 23:40:34 I know this comment is duplicated, but so is the r
407 // encounter the error again and update "ready to send" accordingly.
408 SetTransportChannelReadyToSend(true, new_tc && new_tc->writable());
394 } 409 }
395 } 410 }
396 411
397 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) { 412 void BaseChannel::ConnectToTransportChannel(TransportChannel* tc) {
398 RTC_DCHECK(network_thread_->IsCurrent()); 413 RTC_DCHECK(network_thread_->IsCurrent());
399 414
400 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState); 415 tc->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
401 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead); 416 tc->SignalReadPacket.connect(this, &BaseChannel::OnChannelRead);
402 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend); 417 tc->SignalReadyToSend.connect(this, &BaseChannel::OnReadyToSend);
403 tc->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState); 418 tc->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
480 connection_monitor_->Stop(); 495 connection_monitor_->Stop();
481 connection_monitor_.reset(); 496 connection_monitor_.reset();
482 } 497 }
483 } 498 }
484 499
485 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) { 500 bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) {
486 RTC_DCHECK(network_thread_->IsCurrent()); 501 RTC_DCHECK(network_thread_->IsCurrent());
487 return transport_channel_->GetStats(infos); 502 return transport_channel_->GetStats(infos);
488 } 503 }
489 504
490 bool BaseChannel::IsReadyToReceive_w() const { 505 bool BaseChannel::IsReadyToReceiveMedia_w() const {
491 // Receive data if we are enabled and have local content, 506 // Receive data if we are enabled and have local content,
492 return enabled() && IsReceiveContentDirection(local_content_direction_); 507 return enabled() && IsReceiveContentDirection(local_content_direction_);
493 } 508 }
494 509
495 bool BaseChannel::IsReadyToSend_w() const { 510 bool BaseChannel::IsReadyToSendMedia_w() const {
511 // Need to access some state updated on the network thread.
512 return network_thread_->Invoke<bool>(
513 RTC_FROM_HERE, Bind(&BaseChannel::IsReadyToSendMedia_n, this));
514 }
515
516 bool BaseChannel::IsReadyToSendMedia_n() const {
496 // Send outgoing data if we are enabled, have local and remote content, 517 // Send outgoing data if we are enabled, have local and remote content,
497 // and we have had some form of connectivity. 518 // and we have had some form of connectivity.
498 return enabled() && IsReceiveContentDirection(remote_content_direction_) && 519 return enabled() && IsReceiveContentDirection(remote_content_direction_) &&
499 IsSendContentDirection(local_content_direction_) && 520 IsSendContentDirection(local_content_direction_) &&
500 network_thread_->Invoke<bool>( 521 was_ever_writable() &&
501 RTC_FROM_HERE, Bind(&BaseChannel::IsTransportReadyToSend_n, this));
502 }
503
504 bool BaseChannel::IsTransportReadyToSend_n() const {
505 return was_ever_writable() &&
506 (srtp_filter_.IsActive() || !ShouldSetupDtlsSrtp_n()); 522 (srtp_filter_.IsActive() || !ShouldSetupDtlsSrtp_n());
507 } 523 }
508 524
509 bool BaseChannel::SendPacket(rtc::CopyOnWriteBuffer* packet, 525 bool BaseChannel::SendPacket(rtc::CopyOnWriteBuffer* packet,
510 const rtc::PacketOptions& options) { 526 const rtc::PacketOptions& options) {
511 return SendPacket(false, packet, options); 527 return SendPacket(false, packet, options);
512 } 528 }
513 529
514 bool BaseChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet, 530 bool BaseChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet,
515 const rtc::PacketOptions& options) { 531 const rtc::PacketOptions& options) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 RTC_DCHECK(network_thread_->IsCurrent()); 579 RTC_DCHECK(network_thread_->IsCurrent());
564 580
565 // When using RTCP multiplexing we might get RTCP packets on the RTP 581 // When using RTCP multiplexing we might get RTCP packets on the RTP
566 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP. 582 // transport. We feed RTP traffic into the demuxer to determine if it is RTCP.
567 bool rtcp = PacketIsRtcp(channel, data, len); 583 bool rtcp = PacketIsRtcp(channel, data, len);
568 rtc::CopyOnWriteBuffer packet(data, len); 584 rtc::CopyOnWriteBuffer packet(data, len);
569 HandlePacket(rtcp, &packet, packet_time); 585 HandlePacket(rtcp, &packet, packet_time);
570 } 586 }
571 587
572 void BaseChannel::OnReadyToSend(TransportChannel* channel) { 588 void BaseChannel::OnReadyToSend(TransportChannel* channel) {
573 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 589 RTC_DCHECK(channel == transport_channel_ ||
574 SetReadyToSend(channel == rtcp_transport_channel_, true); 590 channel == rtcp_transport_channel_);
591 SetTransportChannelReadyToSend(channel == rtcp_transport_channel_, true);
575 } 592 }
576 593
577 void BaseChannel::OnDtlsState(TransportChannel* channel, 594 void BaseChannel::OnDtlsState(TransportChannel* channel,
578 DtlsTransportState state) { 595 DtlsTransportState state) {
579 if (!ShouldSetupDtlsSrtp_n()) { 596 if (!ShouldSetupDtlsSrtp_n()) {
580 return; 597 return;
581 } 598 }
582 599
583 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED 600 // Reset the srtp filter if it's not the CONNECTED state. For the CONNECTED
584 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to 601 // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to
585 // cover other scenarios like the whole channel is writable (not just this 602 // cover other scenarios like the whole channel is writable (not just this
586 // TransportChannel) or when TransportChannel is attached after DTLS is 603 // TransportChannel) or when TransportChannel is attached after DTLS is
587 // negotiated. 604 // negotiated.
588 if (state != DTLS_TRANSPORT_CONNECTED) { 605 if (state != DTLS_TRANSPORT_CONNECTED) {
589 srtp_filter_.ResetParams(); 606 srtp_filter_.ResetParams();
590 } 607 }
591 } 608 }
592 609
593 void BaseChannel::OnSelectedCandidatePairChanged( 610 void BaseChannel::OnSelectedCandidatePairChanged(
594 TransportChannel* channel, 611 TransportChannel* channel,
595 CandidatePairInterface* selected_candidate_pair, 612 CandidatePairInterface* selected_candidate_pair,
596 int last_sent_packet_id, 613 int last_sent_packet_id,
597 bool ready_to_send) { 614 bool ready_to_send) {
598 ASSERT(channel == transport_channel_ || channel == rtcp_transport_channel_); 615 RTC_DCHECK(channel == transport_channel_ ||
616 channel == rtcp_transport_channel_);
599 RTC_DCHECK(network_thread_->IsCurrent()); 617 RTC_DCHECK(network_thread_->IsCurrent());
600 std::string transport_name = channel->transport_name(); 618 std::string transport_name = channel->transport_name();
601 rtc::NetworkRoute network_route; 619 rtc::NetworkRoute network_route;
602 if (selected_candidate_pair) { 620 if (selected_candidate_pair) {
603 network_route = rtc::NetworkRoute( 621 network_route = rtc::NetworkRoute(
604 ready_to_send, selected_candidate_pair->local_candidate().network_id(), 622 ready_to_send, selected_candidate_pair->local_candidate().network_id(),
605 selected_candidate_pair->remote_candidate().network_id(), 623 selected_candidate_pair->remote_candidate().network_id(),
606 last_sent_packet_id); 624 last_sent_packet_id);
607 } 625 }
608 invoker_.AsyncInvoke<void>( 626 invoker_.AsyncInvoke<void>(
609 RTC_FROM_HERE, worker_thread_, 627 RTC_FROM_HERE, worker_thread_,
610 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name, 628 Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name,
611 network_route)); 629 network_route));
612 } 630 }
613 631
614 void BaseChannel::SetReadyToSend(bool rtcp, bool ready) { 632 void BaseChannel::SetTransportChannelReadyToSend(bool rtcp, bool ready) {
615 RTC_DCHECK(network_thread_->IsCurrent()); 633 RTC_DCHECK(network_thread_->IsCurrent());
616 if (rtcp) { 634 if (rtcp) {
617 rtcp_ready_to_send_ = ready; 635 rtcp_ready_to_send_ = ready;
618 } else { 636 } else {
619 rtp_ready_to_send_ = ready; 637 rtp_ready_to_send_ = ready;
620 } 638 }
621 639
622 bool ready_to_send = 640 bool ready_to_send =
623 (rtp_ready_to_send_ && 641 (rtp_ready_to_send_ &&
624 // In the case of rtcp mux |rtcp_transport_channel_| will be null. 642 // In the case of rtcp mux |rtcp_transport_channel_| will be null.
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 } 752 }
735 } 753 }
736 754
737 // Update the length of the packet now that we've added the auth tag. 755 // Update the length of the packet now that we've added the auth tag.
738 packet->SetSize(len); 756 packet->SetSize(len);
739 } else if (secure_required_) { 757 } else if (secure_required_) {
740 // This is a double check for something that supposedly can't happen. 758 // This is a double check for something that supposedly can't happen.
741 LOG(LS_ERROR) << "Can't send outgoing " << PacketType(rtcp) 759 LOG(LS_ERROR) << "Can't send outgoing " << PacketType(rtcp)
742 << " packet when SRTP is inactive and crypto is required"; 760 << " packet when SRTP is inactive and crypto is required";
743 761
744 ASSERT(false); 762 RTC_DCHECK(false);
745 return false; 763 return false;
746 } 764 }
747 765
748 // Bon voyage. 766 // Bon voyage.
749 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL; 767 int flags = (secure() && secure_dtls()) ? PF_SRTP_BYPASS : PF_NORMAL;
750 int ret = channel->SendPacket(packet->data<char>(), packet->size(), 768 int ret = channel->SendPacket(packet->data<char>(), packet->size(),
751 updated_options, flags); 769 updated_options, flags);
752 if (ret != static_cast<int>(packet->size())) { 770 if (ret != static_cast<int>(packet->size())) {
753 if (channel->GetError() == ENOTCONN) { 771 if (channel->GetError() == ENOTCONN) {
754 LOG(LS_WARNING) << "Got ENOTCONN from transport."; 772 LOG(LS_WARNING) << "Got ENOTCONN from transport.";
755 SetReadyToSend(rtcp, false); 773 SetTransportChannelReadyToSend(rtcp, false);
756 } 774 }
757 return false; 775 return false;
758 } 776 }
759 return true; 777 return true;
760 } 778 }
761 779
762 bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) { 780 bool BaseChannel::WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) {
763 // Protect ourselves against crazy data. 781 // Protect ourselves against crazy data.
764 if (!ValidPacket(rtcp, packet)) { 782 if (!ValidPacket(rtcp, packet)) {
765 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " " 783 LOG(LS_ERROR) << "Dropping incoming " << content_name_ << " "
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 GetContentDescription(content_info); 894 GetContentDescription(content_info);
877 if (content_desc && content_info && !content_info->rejected && 895 if (content_desc && content_info && !content_info->rejected &&
878 !SetRemoteContent(content_desc, action, error_desc)) { 896 !SetRemoteContent(content_desc, action, error_desc)) {
879 LOG(LS_ERROR) << "Failure in SetRemoteContent with action " << action; 897 LOG(LS_ERROR) << "Failure in SetRemoteContent with action " << action;
880 return false; 898 return false;
881 } 899 }
882 return true; 900 return true;
883 } 901 }
884 902
885 void BaseChannel::EnableMedia_w() { 903 void BaseChannel::EnableMedia_w() {
886 ASSERT(worker_thread_ == rtc::Thread::Current()); 904 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
887 if (enabled_) 905 if (enabled_)
888 return; 906 return;
889 907
890 LOG(LS_INFO) << "Channel enabled"; 908 LOG(LS_INFO) << "Channel enabled";
891 enabled_ = true; 909 enabled_ = true;
892 ChangeState_w(); 910 UpdateMediaSendRecvState_w();
893 } 911 }
894 912
895 void BaseChannel::DisableMedia_w() { 913 void BaseChannel::DisableMedia_w() {
896 ASSERT(worker_thread_ == rtc::Thread::Current()); 914 RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
897 if (!enabled_) 915 if (!enabled_)
898 return; 916 return;
899 917
900 LOG(LS_INFO) << "Channel disabled"; 918 LOG(LS_INFO) << "Channel disabled";
901 enabled_ = false; 919 enabled_ = false;
902 ChangeState_w(); 920 UpdateMediaSendRecvState_w();
903 } 921 }
904 922
905 void BaseChannel::UpdateWritableState_n() { 923 void BaseChannel::UpdateWritableState_n() {
906 if (transport_channel_ && transport_channel_->writable() && 924 if (transport_channel_ && transport_channel_->writable() &&
907 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) { 925 (!rtcp_transport_channel_ || rtcp_transport_channel_->writable())) {
908 ChannelWritable_n(); 926 ChannelWritable_n();
909 } else { 927 } else {
910 ChannelNotWritable_n(); 928 ChannelNotWritable_n();
911 } 929 }
912 } 930 }
(...skipping 14 matching lines...) Expand all
927 if (it->best_connection) { 945 if (it->best_connection) {
928 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString() 946 LOG(LS_INFO) << "Using " << it->local_candidate.ToSensitiveString()
929 << "->" << it->remote_candidate.ToSensitiveString(); 947 << "->" << it->remote_candidate.ToSensitiveString();
930 break; 948 break;
931 } 949 }
932 } 950 }
933 951
934 was_ever_writable_ = true; 952 was_ever_writable_ = true;
935 MaybeSetupDtlsSrtp_n(); 953 MaybeSetupDtlsSrtp_n();
936 writable_ = true; 954 writable_ = true;
937 ChangeState(); 955 UpdateMediaSendRecvState();
938 } 956 }
939 957
940 void BaseChannel::SignalDtlsSetupFailure_n(bool rtcp) { 958 void BaseChannel::SignalDtlsSetupFailure_n(bool rtcp) {
941 RTC_DCHECK(network_thread_->IsCurrent()); 959 RTC_DCHECK(network_thread_->IsCurrent());
942 invoker_.AsyncInvoke<void>( 960 invoker_.AsyncInvoke<void>(
943 RTC_FROM_HERE, signaling_thread(), 961 RTC_FROM_HERE, signaling_thread(),
944 Bind(&BaseChannel::SignalDtlsSetupFailure_s, this, rtcp)); 962 Bind(&BaseChannel::SignalDtlsSetupFailure_s, this, rtcp));
945 } 963 }
946 964
947 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) { 965 void BaseChannel::SignalDtlsSetupFailure_s(bool rtcp) {
948 ASSERT(signaling_thread() == rtc::Thread::Current()); 966 RTC_DCHECK(signaling_thread() == rtc::Thread::Current());
949 SignalDtlsSetupFailure(this, rtcp); 967 SignalDtlsSetupFailure(this, rtcp);
950 } 968 }
951 969
952 bool BaseChannel::SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp) { 970 bool BaseChannel::SetDtlsSrtpCryptoSuites_n(TransportChannel* tc, bool rtcp) {
953 std::vector<int> crypto_suites; 971 std::vector<int> crypto_suites;
954 // We always use the default SRTP crypto suites for RTCP, but we may use 972 // We always use the default SRTP crypto suites for RTCP, but we may use
955 // different crypto suites for RTP depending on the media type. 973 // different crypto suites for RTP depending on the media type.
956 if (!rtcp) { 974 if (!rtcp) {
957 GetSrtpCryptoSuites_n(&crypto_suites); 975 GetSrtpCryptoSuites_n(&crypto_suites);
958 } else { 976 } else {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 1016
999 // OK, we're now doing DTLS (RFC 5764) 1017 // OK, we're now doing DTLS (RFC 5764)
1000 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2); 1018 std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2);
1001 1019
1002 // RFC 5705 exporter using the RFC 5764 parameters 1020 // RFC 5705 exporter using the RFC 5764 parameters
1003 if (!channel->ExportKeyingMaterial( 1021 if (!channel->ExportKeyingMaterial(
1004 kDtlsSrtpExporterLabel, 1022 kDtlsSrtpExporterLabel,
1005 NULL, 0, false, 1023 NULL, 0, false,
1006 &dtls_buffer[0], dtls_buffer.size())) { 1024 &dtls_buffer[0], dtls_buffer.size())) {
1007 LOG(LS_WARNING) << "DTLS-SRTP key export failed"; 1025 LOG(LS_WARNING) << "DTLS-SRTP key export failed";
1008 ASSERT(false); // This should never happen 1026 RTC_DCHECK(false); // This should never happen
1009 return false; 1027 return false;
1010 } 1028 }
1011 1029
1012 // Sync up the keys with the DTLS-SRTP interface 1030 // Sync up the keys with the DTLS-SRTP interface
1013 std::vector<unsigned char> client_write_key(key_len + salt_len); 1031 std::vector<unsigned char> client_write_key(key_len + salt_len);
1014 std::vector<unsigned char> server_write_key(key_len + salt_len); 1032 std::vector<unsigned char> server_write_key(key_len + salt_len);
1015 size_t offset = 0; 1033 size_t offset = 0;
1016 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len); 1034 memcpy(&client_write_key[0], &dtls_buffer[offset], key_len);
1017 offset += key_len; 1035 offset += key_len;
1018 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len); 1036 memcpy(&server_write_key[0], &dtls_buffer[offset], key_len);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1078 } 1096 }
1079 } 1097 }
1080 1098
1081 void BaseChannel::ChannelNotWritable_n() { 1099 void BaseChannel::ChannelNotWritable_n() {
1082 RTC_DCHECK(network_thread_->IsCurrent()); 1100 RTC_DCHECK(network_thread_->IsCurrent());
1083 if (!writable_) 1101 if (!writable_)
1084 return; 1102 return;
1085 1103
1086 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")"; 1104 LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")";
1087 writable_ = false; 1105 writable_ = false;
1088 ChangeState(); 1106 UpdateMediaSendRecvState();
1089 } 1107 }
1090 1108
1091 bool BaseChannel::SetRtpTransportParameters( 1109 bool BaseChannel::SetRtpTransportParameters(
1092 const MediaContentDescription* content, 1110 const MediaContentDescription* content,
1093 ContentAction action, 1111 ContentAction action,
1094 ContentSource src, 1112 ContentSource src,
1095 std::string* error_desc) { 1113 std::string* error_desc) {
1096 if (action == CA_UPDATE) { 1114 if (action == CA_UPDATE) {
1097 // These parameters never get changed by a CA_UDPATE. 1115 // These parameters never get changed by a CA_UDPATE.
1098 return true; 1116 return true;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 bool BaseChannel::SetRtcpMux_n(bool enable, 1219 bool BaseChannel::SetRtcpMux_n(bool enable,
1202 ContentAction action, 1220 ContentAction action,
1203 ContentSource src, 1221 ContentSource src,
1204 std::string* error_desc) { 1222 std::string* error_desc) {
1205 bool ret = false; 1223 bool ret = false;
1206 switch (action) { 1224 switch (action) {
1207 case CA_OFFER: 1225 case CA_OFFER:
1208 ret = rtcp_mux_filter_.SetOffer(enable, src); 1226 ret = rtcp_mux_filter_.SetOffer(enable, src);
1209 break; 1227 break;
1210 case CA_PRANSWER: 1228 case CA_PRANSWER:
1229 // This may activate RTCP muxing, but we don't yet destroy the channel
1230 // because the final answer may deactivate it.
1211 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src); 1231 ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
1212 break; 1232 break;
1213 case CA_ANSWER: 1233 case CA_ANSWER:
1214 ret = rtcp_mux_filter_.SetAnswer(enable, src); 1234 ret = rtcp_mux_filter_.SetAnswer(enable, src);
1215 if (ret && rtcp_mux_filter_.IsActive()) { 1235 if (ret && rtcp_mux_filter_.IsActive()) {
1216 // We activated RTCP mux, close down the RTCP transport. 1236 // We activated RTCP mux, close down the RTCP transport.
1217 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name() 1237 LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
1218 << " by destroying RTCP transport channel for " 1238 << " by destroying RTCP transport channel for "
1219 << transport_name(); 1239 << transport_name();
1220 SetRtcpTransportChannel_n(nullptr, true); 1240 SetRtcpTransportChannel_n(nullptr, true);
(...skipping 17 matching lines...) Expand all
1238 // If the RTP transport is already writable, then so are we. 1258 // If the RTP transport is already writable, then so are we.
1239 if (transport_channel_->writable()) { 1259 if (transport_channel_->writable()) {
1240 ChannelWritable_n(); 1260 ChannelWritable_n();
1241 } 1261 }
1242 } 1262 }
1243 1263
1244 return true; 1264 return true;
1245 } 1265 }
1246 1266
1247 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) { 1267 bool BaseChannel::AddRecvStream_w(const StreamParams& sp) {
1248 ASSERT(worker_thread() == rtc::Thread::Current()); 1268 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
1249 return media_channel()->AddRecvStream(sp); 1269 return media_channel()->AddRecvStream(sp);
1250 } 1270 }
1251 1271
1252 bool BaseChannel::RemoveRecvStream_w(uint32_t ssrc) { 1272 bool BaseChannel::RemoveRecvStream_w(uint32_t ssrc) {
1253 ASSERT(worker_thread() == rtc::Thread::Current()); 1273 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
1254 return media_channel()->RemoveRecvStream(ssrc); 1274 return media_channel()->RemoveRecvStream(ssrc);
1255 } 1275 }
1256 1276
1257 bool BaseChannel::UpdateLocalStreams_w(const std::vector<StreamParams>& streams, 1277 bool BaseChannel::UpdateLocalStreams_w(const std::vector<StreamParams>& streams,
1258 ContentAction action, 1278 ContentAction action,
1259 std::string* error_desc) { 1279 std::string* error_desc) {
1260 if (!VERIFY(action == CA_OFFER || action == CA_ANSWER || 1280 if (!VERIFY(action == CA_OFFER || action == CA_ANSWER ||
1261 action == CA_PRANSWER || action == CA_UPDATE)) 1281 action == CA_PRANSWER || action == CA_UPDATE))
1262 return false; 1282 return false;
1263 1283
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
1657 int flags) { 1677 int flags) {
1658 BaseChannel::OnChannelRead(channel, data, len, packet_time, flags); 1678 BaseChannel::OnChannelRead(channel, data, len, packet_time, flags);
1659 1679
1660 // Set a flag when we've received an RTP packet. If we're waiting for early 1680 // Set a flag when we've received an RTP packet. If we're waiting for early
1661 // media, this will disable the timeout. 1681 // media, this will disable the timeout.
1662 if (!received_media_ && !PacketIsRtcp(channel, data, len)) { 1682 if (!received_media_ && !PacketIsRtcp(channel, data, len)) {
1663 received_media_ = true; 1683 received_media_ = true;
1664 } 1684 }
1665 } 1685 }
1666 1686
1667 void BaseChannel::ChangeState() { 1687 void BaseChannel::UpdateMediaSendRecvState() {
1668 RTC_DCHECK(network_thread_->IsCurrent()); 1688 RTC_DCHECK(network_thread_->IsCurrent());
1669 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_, 1689 invoker_.AsyncInvoke<void>(
1670 Bind(&BaseChannel::ChangeState_w, this)); 1690 RTC_FROM_HERE, worker_thread_,
1691 Bind(&BaseChannel::UpdateMediaSendRecvState_w, this));
1671 } 1692 }
1672 1693
1673 void VoiceChannel::ChangeState_w() { 1694 void VoiceChannel::UpdateMediaSendRecvState_w() {
1674 // Render incoming data if we're the active call, and we have the local 1695 // Render incoming data if we're the active call, and we have the local
1675 // content. We receive data on the default channel and multiplexed streams. 1696 // content. We receive data on the default channel and multiplexed streams.
1676 bool recv = IsReadyToReceive_w(); 1697 bool recv = IsReadyToReceiveMedia_w();
1677 media_channel()->SetPlayout(recv); 1698 media_channel()->SetPlayout(recv);
1678 1699
1679 // Send outgoing data if we're the active call, we have the remote content, 1700 // Send outgoing data if we're the active call, we have the remote content,
1680 // and we have had some form of connectivity. 1701 // and we have had some form of connectivity.
1681 bool send = IsReadyToSend_w(); 1702 bool send = IsReadyToSendMedia_w();
1682 media_channel()->SetSend(send); 1703 media_channel()->SetSend(send);
1683 1704
1684 LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send; 1705 LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send;
1685 } 1706 }
1686 1707
1687 const ContentInfo* VoiceChannel::GetFirstContent( 1708 const ContentInfo* VoiceChannel::GetFirstContent(
1688 const SessionDescription* sdesc) { 1709 const SessionDescription* sdesc) {
1689 return GetFirstAudioContent(sdesc); 1710 return GetFirstAudioContent(sdesc);
1690 } 1711 }
1691 1712
1692 bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content, 1713 bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content,
1693 ContentAction action, 1714 ContentAction action,
1694 std::string* error_desc) { 1715 std::string* error_desc) {
1695 TRACE_EVENT0("webrtc", "VoiceChannel::SetLocalContent_w"); 1716 TRACE_EVENT0("webrtc", "VoiceChannel::SetLocalContent_w");
1696 ASSERT(worker_thread() == rtc::Thread::Current()); 1717 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
1697 LOG(LS_INFO) << "Setting local voice description"; 1718 LOG(LS_INFO) << "Setting local voice description";
1698 1719
1699 const AudioContentDescription* audio = 1720 const AudioContentDescription* audio =
1700 static_cast<const AudioContentDescription*>(content); 1721 static_cast<const AudioContentDescription*>(content);
1701 ASSERT(audio != NULL); 1722 RTC_DCHECK(audio != NULL);
1702 if (!audio) { 1723 if (!audio) {
1703 SafeSetError("Can't find audio content in local description.", error_desc); 1724 SafeSetError("Can't find audio content in local description.", error_desc);
1704 return false; 1725 return false;
1705 } 1726 }
1706 1727
1707 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) { 1728 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) {
1708 return false; 1729 return false;
1709 } 1730 }
1710 1731
1711 AudioRecvParameters recv_params = last_recv_params_; 1732 AudioRecvParameters recv_params = last_recv_params_;
(...skipping 11 matching lines...) Expand all
1723 // TODO(pthatcher): Move local streams into AudioSendParameters, and 1744 // TODO(pthatcher): Move local streams into AudioSendParameters, and
1724 // only give it to the media channel once we have a remote 1745 // only give it to the media channel once we have a remote
1725 // description too (without a remote description, we won't be able 1746 // description too (without a remote description, we won't be able
1726 // to send them anyway). 1747 // to send them anyway).
1727 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) { 1748 if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) {
1728 SafeSetError("Failed to set local audio description streams.", error_desc); 1749 SafeSetError("Failed to set local audio description streams.", error_desc);
1729 return false; 1750 return false;
1730 } 1751 }
1731 1752
1732 set_local_content_direction(content->direction()); 1753 set_local_content_direction(content->direction());
1733 ChangeState_w(); 1754 UpdateMediaSendRecvState_w();
1734 return true; 1755 return true;
1735 } 1756 }
1736 1757
1737 bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content, 1758 bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content,
1738 ContentAction action, 1759 ContentAction action,
1739 std::string* error_desc) { 1760 std::string* error_desc) {
1740 TRACE_EVENT0("webrtc", "VoiceChannel::SetRemoteContent_w"); 1761 TRACE_EVENT0("webrtc", "VoiceChannel::SetRemoteContent_w");
1741 ASSERT(worker_thread() == rtc::Thread::Current()); 1762 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
1742 LOG(LS_INFO) << "Setting remote voice description"; 1763 LOG(LS_INFO) << "Setting remote voice description";
1743 1764
1744 const AudioContentDescription* audio = 1765 const AudioContentDescription* audio =
1745 static_cast<const AudioContentDescription*>(content); 1766 static_cast<const AudioContentDescription*>(content);
1746 ASSERT(audio != NULL); 1767 RTC_DCHECK(audio != NULL);
1747 if (!audio) { 1768 if (!audio) {
1748 SafeSetError("Can't find audio content in remote description.", error_desc); 1769 SafeSetError("Can't find audio content in remote description.", error_desc);
1749 return false; 1770 return false;
1750 } 1771 }
1751 1772
1752 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) { 1773 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) {
1753 return false; 1774 return false;
1754 } 1775 }
1755 1776
1756 AudioSendParameters send_params = last_send_params_; 1777 AudioSendParameters send_params = last_send_params_;
(...skipping 17 matching lines...) Expand all
1774 if (!UpdateRemoteStreams_w(audio->streams(), action, error_desc)) { 1795 if (!UpdateRemoteStreams_w(audio->streams(), action, error_desc)) {
1775 SafeSetError("Failed to set remote audio description streams.", error_desc); 1796 SafeSetError("Failed to set remote audio description streams.", error_desc);
1776 return false; 1797 return false;
1777 } 1798 }
1778 1799
1779 if (audio->rtp_header_extensions_set()) { 1800 if (audio->rtp_header_extensions_set()) {
1780 MaybeCacheRtpAbsSendTimeHeaderExtension_w(audio->rtp_header_extensions()); 1801 MaybeCacheRtpAbsSendTimeHeaderExtension_w(audio->rtp_header_extensions());
1781 } 1802 }
1782 1803
1783 set_remote_content_direction(content->direction()); 1804 set_remote_content_direction(content->direction());
1784 ChangeState_w(); 1805 UpdateMediaSendRecvState_w();
1785 return true; 1806 return true;
1786 } 1807 }
1787 1808
1788 void VoiceChannel::HandleEarlyMediaTimeout() { 1809 void VoiceChannel::HandleEarlyMediaTimeout() {
1789 // This occurs on the main thread, not the worker thread. 1810 // This occurs on the main thread, not the worker thread.
1790 if (!received_media_) { 1811 if (!received_media_) {
1791 LOG(LS_INFO) << "No early media received before timeout"; 1812 LOG(LS_INFO) << "No early media received before timeout";
1792 SignalEarlyMediaTimeout(this); 1813 SignalEarlyMediaTimeout(this);
1793 } 1814 }
1794 } 1815 }
(...skipping 24 matching lines...) Expand all
1819 } 1840 }
1820 } 1841 }
1821 1842
1822 void VoiceChannel::OnConnectionMonitorUpdate( 1843 void VoiceChannel::OnConnectionMonitorUpdate(
1823 ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos) { 1844 ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
1824 SignalConnectionMonitor(this, infos); 1845 SignalConnectionMonitor(this, infos);
1825 } 1846 }
1826 1847
1827 void VoiceChannel::OnMediaMonitorUpdate( 1848 void VoiceChannel::OnMediaMonitorUpdate(
1828 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) { 1849 VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) {
1829 ASSERT(media_channel == this->media_channel()); 1850 RTC_DCHECK(media_channel == this->media_channel());
1830 SignalMediaMonitor(this, info); 1851 SignalMediaMonitor(this, info);
1831 } 1852 }
1832 1853
1833 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor, 1854 void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor,
1834 const AudioInfo& info) { 1855 const AudioInfo& info) {
1835 SignalAudioMonitor(this, info); 1856 SignalAudioMonitor(this, info);
1836 } 1857 }
1837 1858
1838 void VoiceChannel::GetSrtpCryptoSuites_n( 1859 void VoiceChannel::GetSrtpCryptoSuites_n(
1839 std::vector<int>* crypto_suites) const { 1860 std::vector<int>* crypto_suites) const {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 return InvokeOnWorker( 1949 return InvokeOnWorker(
1929 RTC_FROM_HERE, 1950 RTC_FROM_HERE,
1930 Bind(&VideoChannel::SetRtpReceiveParameters_w, this, ssrc, parameters)); 1951 Bind(&VideoChannel::SetRtpReceiveParameters_w, this, ssrc, parameters));
1931 } 1952 }
1932 1953
1933 bool VideoChannel::SetRtpReceiveParameters_w(uint32_t ssrc, 1954 bool VideoChannel::SetRtpReceiveParameters_w(uint32_t ssrc,
1934 webrtc::RtpParameters parameters) { 1955 webrtc::RtpParameters parameters) {
1935 return media_channel()->SetRtpReceiveParameters(ssrc, parameters); 1956 return media_channel()->SetRtpReceiveParameters(ssrc, parameters);
1936 } 1957 }
1937 1958
1938 void VideoChannel::ChangeState_w() { 1959 void VideoChannel::UpdateMediaSendRecvState_w() {
1939 // Send outgoing data if we're the active call, we have the remote content, 1960 // Send outgoing data if we're the active call, we have the remote content,
1940 // and we have had some form of connectivity. 1961 // and we have had some form of connectivity.
1941 bool send = IsReadyToSend_w(); 1962 bool send = IsReadyToSendMedia_w();
1942 if (!media_channel()->SetSend(send)) { 1963 if (!media_channel()->SetSend(send)) {
1943 LOG(LS_ERROR) << "Failed to SetSend on video channel"; 1964 LOG(LS_ERROR) << "Failed to SetSend on video channel";
1944 // TODO(gangji): Report error back to server. 1965 // TODO(gangji): Report error back to server.
1945 } 1966 }
1946 1967
1947 LOG(LS_INFO) << "Changing video state, send=" << send; 1968 LOG(LS_INFO) << "Changing video state, send=" << send;
1948 } 1969 }
1949 1970
1950 bool VideoChannel::GetStats(VideoMediaInfo* stats) { 1971 bool VideoChannel::GetStats(VideoMediaInfo* stats) {
1951 return InvokeOnWorker(RTC_FROM_HERE, Bind(&VideoMediaChannel::GetStats, 1972 return InvokeOnWorker(RTC_FROM_HERE, Bind(&VideoMediaChannel::GetStats,
(...skipping 17 matching lines...) Expand all
1969 1990
1970 const ContentInfo* VideoChannel::GetFirstContent( 1991 const ContentInfo* VideoChannel::GetFirstContent(
1971 const SessionDescription* sdesc) { 1992 const SessionDescription* sdesc) {
1972 return GetFirstVideoContent(sdesc); 1993 return GetFirstVideoContent(sdesc);
1973 } 1994 }
1974 1995
1975 bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content, 1996 bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content,
1976 ContentAction action, 1997 ContentAction action,
1977 std::string* error_desc) { 1998 std::string* error_desc) {
1978 TRACE_EVENT0("webrtc", "VideoChannel::SetLocalContent_w"); 1999 TRACE_EVENT0("webrtc", "VideoChannel::SetLocalContent_w");
1979 ASSERT(worker_thread() == rtc::Thread::Current()); 2000 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
1980 LOG(LS_INFO) << "Setting local video description"; 2001 LOG(LS_INFO) << "Setting local video description";
1981 2002
1982 const VideoContentDescription* video = 2003 const VideoContentDescription* video =
1983 static_cast<const VideoContentDescription*>(content); 2004 static_cast<const VideoContentDescription*>(content);
1984 ASSERT(video != NULL); 2005 RTC_DCHECK(video != NULL);
1985 if (!video) { 2006 if (!video) {
1986 SafeSetError("Can't find video content in local description.", error_desc); 2007 SafeSetError("Can't find video content in local description.", error_desc);
1987 return false; 2008 return false;
1988 } 2009 }
1989 2010
1990 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) { 2011 if (!SetRtpTransportParameters(content, action, CS_LOCAL, error_desc)) {
1991 return false; 2012 return false;
1992 } 2013 }
1993 2014
1994 VideoRecvParameters recv_params = last_recv_params_; 2015 VideoRecvParameters recv_params = last_recv_params_;
(...skipping 11 matching lines...) Expand all
2006 // TODO(pthatcher): Move local streams into VideoSendParameters, and 2027 // TODO(pthatcher): Move local streams into VideoSendParameters, and
2007 // only give it to the media channel once we have a remote 2028 // only give it to the media channel once we have a remote
2008 // description too (without a remote description, we won't be able 2029 // description too (without a remote description, we won't be able
2009 // to send them anyway). 2030 // to send them anyway).
2010 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) { 2031 if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) {
2011 SafeSetError("Failed to set local video description streams.", error_desc); 2032 SafeSetError("Failed to set local video description streams.", error_desc);
2012 return false; 2033 return false;
2013 } 2034 }
2014 2035
2015 set_local_content_direction(content->direction()); 2036 set_local_content_direction(content->direction());
2016 ChangeState_w(); 2037 UpdateMediaSendRecvState_w();
2017 return true; 2038 return true;
2018 } 2039 }
2019 2040
2020 bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content, 2041 bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
2021 ContentAction action, 2042 ContentAction action,
2022 std::string* error_desc) { 2043 std::string* error_desc) {
2023 TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w"); 2044 TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w");
2024 ASSERT(worker_thread() == rtc::Thread::Current()); 2045 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
2025 LOG(LS_INFO) << "Setting remote video description"; 2046 LOG(LS_INFO) << "Setting remote video description";
2026 2047
2027 const VideoContentDescription* video = 2048 const VideoContentDescription* video =
2028 static_cast<const VideoContentDescription*>(content); 2049 static_cast<const VideoContentDescription*>(content);
2029 ASSERT(video != NULL); 2050 RTC_DCHECK(video != NULL);
2030 if (!video) { 2051 if (!video) {
2031 SafeSetError("Can't find video content in remote description.", error_desc); 2052 SafeSetError("Can't find video content in remote description.", error_desc);
2032 return false; 2053 return false;
2033 } 2054 }
2034 2055
2035 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) { 2056 if (!SetRtpTransportParameters(content, action, CS_REMOTE, error_desc)) {
2036 return false; 2057 return false;
2037 } 2058 }
2038 2059
2039 VideoSendParameters send_params = last_send_params_; 2060 VideoSendParameters send_params = last_send_params_;
(...skipping 18 matching lines...) Expand all
2058 if (!UpdateRemoteStreams_w(video->streams(), action, error_desc)) { 2079 if (!UpdateRemoteStreams_w(video->streams(), action, error_desc)) {
2059 SafeSetError("Failed to set remote video description streams.", error_desc); 2080 SafeSetError("Failed to set remote video description streams.", error_desc);
2060 return false; 2081 return false;
2061 } 2082 }
2062 2083
2063 if (video->rtp_header_extensions_set()) { 2084 if (video->rtp_header_extensions_set()) {
2064 MaybeCacheRtpAbsSendTimeHeaderExtension_w(video->rtp_header_extensions()); 2085 MaybeCacheRtpAbsSendTimeHeaderExtension_w(video->rtp_header_extensions());
2065 } 2086 }
2066 2087
2067 set_remote_content_direction(content->direction()); 2088 set_remote_content_direction(content->direction());
2068 ChangeState_w(); 2089 UpdateMediaSendRecvState_w();
2069 return true; 2090 return true;
2070 } 2091 }
2071 2092
2072 void VideoChannel::OnMessage(rtc::Message *pmsg) { 2093 void VideoChannel::OnMessage(rtc::Message *pmsg) {
2073 switch (pmsg->message_id) { 2094 switch (pmsg->message_id) {
2074 case MSG_CHANNEL_ERROR: { 2095 case MSG_CHANNEL_ERROR: {
2075 const VideoChannelErrorMessageData* data = 2096 const VideoChannelErrorMessageData* data =
2076 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata); 2097 static_cast<VideoChannelErrorMessageData*>(pmsg->pdata);
2077 delete data; 2098 delete data;
2078 break; 2099 break;
2079 } 2100 }
2080 default: 2101 default:
2081 BaseChannel::OnMessage(pmsg); 2102 BaseChannel::OnMessage(pmsg);
2082 break; 2103 break;
2083 } 2104 }
2084 } 2105 }
2085 2106
2086 void VideoChannel::OnConnectionMonitorUpdate( 2107 void VideoChannel::OnConnectionMonitorUpdate(
2087 ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) { 2108 ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) {
2088 SignalConnectionMonitor(this, infos); 2109 SignalConnectionMonitor(this, infos);
2089 } 2110 }
2090 2111
2091 // TODO(pthatcher): Look into removing duplicate code between 2112 // TODO(pthatcher): Look into removing duplicate code between
2092 // audio, video, and data, perhaps by using templates. 2113 // audio, video, and data, perhaps by using templates.
2093 void VideoChannel::OnMediaMonitorUpdate( 2114 void VideoChannel::OnMediaMonitorUpdate(
2094 VideoMediaChannel* media_channel, const VideoMediaInfo &info) { 2115 VideoMediaChannel* media_channel, const VideoMediaInfo &info) {
2095 ASSERT(media_channel == this->media_channel()); 2116 RTC_DCHECK(media_channel == this->media_channel());
2096 SignalMediaMonitor(this, info); 2117 SignalMediaMonitor(this, info);
2097 } 2118 }
2098 2119
2099 void VideoChannel::GetSrtpCryptoSuites_n( 2120 void VideoChannel::GetSrtpCryptoSuites_n(
2100 std::vector<int>* crypto_suites) const { 2121 std::vector<int>* crypto_suites) const {
2101 GetSupportedVideoCryptoSuites(crypto_options(), crypto_suites); 2122 GetSupportedVideoCryptoSuites(crypto_options(), crypto_suites);
2102 } 2123 }
2103 2124
2104 DataChannel::DataChannel(rtc::Thread* worker_thread, 2125 DataChannel::DataChannel(rtc::Thread* worker_thread,
2105 rtc::Thread* network_thread, 2126 rtc::Thread* network_thread,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2190 bool is_sctp = ((content->protocol() == kMediaProtocolSctp) || 2211 bool is_sctp = ((content->protocol() == kMediaProtocolSctp) ||
2191 (content->protocol() == kMediaProtocolDtlsSctp)); 2212 (content->protocol() == kMediaProtocolDtlsSctp));
2192 DataChannelType data_channel_type = is_sctp ? DCT_SCTP : DCT_RTP; 2213 DataChannelType data_channel_type = is_sctp ? DCT_SCTP : DCT_RTP;
2193 return SetDataChannelType(data_channel_type, error_desc); 2214 return SetDataChannelType(data_channel_type, error_desc);
2194 } 2215 }
2195 2216
2196 bool DataChannel::SetLocalContent_w(const MediaContentDescription* content, 2217 bool DataChannel::SetLocalContent_w(const MediaContentDescription* content,
2197 ContentAction action, 2218 ContentAction action,
2198 std::string* error_desc) { 2219 std::string* error_desc) {
2199 TRACE_EVENT0("webrtc", "DataChannel::SetLocalContent_w"); 2220 TRACE_EVENT0("webrtc", "DataChannel::SetLocalContent_w");
2200 ASSERT(worker_thread() == rtc::Thread::Current()); 2221 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
2201 LOG(LS_INFO) << "Setting local data description"; 2222 LOG(LS_INFO) << "Setting local data description";
2202 2223
2203 const DataContentDescription* data = 2224 const DataContentDescription* data =
2204 static_cast<const DataContentDescription*>(content); 2225 static_cast<const DataContentDescription*>(content);
2205 ASSERT(data != NULL); 2226 RTC_DCHECK(data != NULL);
2206 if (!data) { 2227 if (!data) {
2207 SafeSetError("Can't find data content in local description.", error_desc); 2228 SafeSetError("Can't find data content in local description.", error_desc);
2208 return false; 2229 return false;
2209 } 2230 }
2210 2231
2211 if (!SetDataChannelTypeFromContent(data, error_desc)) { 2232 if (!SetDataChannelTypeFromContent(data, error_desc)) {
2212 return false; 2233 return false;
2213 } 2234 }
2214 2235
2215 if (data_channel_type_ == DCT_RTP) { 2236 if (data_channel_type_ == DCT_RTP) {
(...skipping 22 matching lines...) Expand all
2238 // TODO(pthatcher): Move local streams into DataSendParameters, and 2259 // TODO(pthatcher): Move local streams into DataSendParameters, and
2239 // only give it to the media channel once we have a remote 2260 // only give it to the media channel once we have a remote
2240 // description too (without a remote description, we won't be able 2261 // description too (without a remote description, we won't be able
2241 // to send them anyway). 2262 // to send them anyway).
2242 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) { 2263 if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) {
2243 SafeSetError("Failed to set local data description streams.", error_desc); 2264 SafeSetError("Failed to set local data description streams.", error_desc);
2244 return false; 2265 return false;
2245 } 2266 }
2246 2267
2247 set_local_content_direction(content->direction()); 2268 set_local_content_direction(content->direction());
2248 ChangeState_w(); 2269 UpdateMediaSendRecvState_w();
2249 return true; 2270 return true;
2250 } 2271 }
2251 2272
2252 bool DataChannel::SetRemoteContent_w(const MediaContentDescription* content, 2273 bool DataChannel::SetRemoteContent_w(const MediaContentDescription* content,
2253 ContentAction action, 2274 ContentAction action,
2254 std::string* error_desc) { 2275 std::string* error_desc) {
2255 TRACE_EVENT0("webrtc", "DataChannel::SetRemoteContent_w"); 2276 TRACE_EVENT0("webrtc", "DataChannel::SetRemoteContent_w");
2256 ASSERT(worker_thread() == rtc::Thread::Current()); 2277 RTC_DCHECK(worker_thread() == rtc::Thread::Current());
2257 2278
2258 const DataContentDescription* data = 2279 const DataContentDescription* data =
2259 static_cast<const DataContentDescription*>(content); 2280 static_cast<const DataContentDescription*>(content);
2260 ASSERT(data != NULL); 2281 RTC_DCHECK(data != NULL);
2261 if (!data) { 2282 if (!data) {
2262 SafeSetError("Can't find data content in remote description.", error_desc); 2283 SafeSetError("Can't find data content in remote description.", error_desc);
2263 return false; 2284 return false;
2264 } 2285 }
2265 2286
2266 // If the remote data doesn't have codecs and isn't an update, it 2287 // If the remote data doesn't have codecs and isn't an update, it
2267 // must be empty, so ignore it. 2288 // must be empty, so ignore it.
2268 if (!data->has_codecs() && action != CA_UPDATE) { 2289 if (!data->has_codecs() && action != CA_UPDATE) {
2269 return true; 2290 return true;
2270 } 2291 }
(...skipping 22 matching lines...) Expand all
2293 // and only give it to the media channel once we have a local 2314 // and only give it to the media channel once we have a local
2294 // description too (without a local description, we won't be able to 2315 // description too (without a local description, we won't be able to
2295 // recv them anyway). 2316 // recv them anyway).
2296 if (!UpdateRemoteStreams_w(data->streams(), action, error_desc)) { 2317 if (!UpdateRemoteStreams_w(data->streams(), action, error_desc)) {
2297 SafeSetError("Failed to set remote data description streams.", 2318 SafeSetError("Failed to set remote data description streams.",
2298 error_desc); 2319 error_desc);
2299 return false; 2320 return false;
2300 } 2321 }
2301 2322
2302 set_remote_content_direction(content->direction()); 2323 set_remote_content_direction(content->direction());
2303 ChangeState_w(); 2324 UpdateMediaSendRecvState_w();
2304 return true; 2325 return true;
2305 } 2326 }
2306 2327
2307 void DataChannel::ChangeState_w() { 2328 void DataChannel::UpdateMediaSendRecvState_w() {
2308 // Render incoming data if we're the active call, and we have the local 2329 // Render incoming data if we're the active call, and we have the local
2309 // content. We receive data on the default channel and multiplexed streams. 2330 // content. We receive data on the default channel and multiplexed streams.
2310 bool recv = IsReadyToReceive_w(); 2331 bool recv = IsReadyToReceiveMedia_w();
2311 if (!media_channel()->SetReceive(recv)) { 2332 if (!media_channel()->SetReceive(recv)) {
2312 LOG(LS_ERROR) << "Failed to SetReceive on data channel"; 2333 LOG(LS_ERROR) << "Failed to SetReceive on data channel";
2313 } 2334 }
2314 2335
2315 // Send outgoing data if we're the active call, we have the remote content, 2336 // Send outgoing data if we're the active call, we have the remote content,
2316 // and we have had some form of connectivity. 2337 // and we have had some form of connectivity.
2317 bool send = IsReadyToSend_w(); 2338 bool send = IsReadyToSendMedia_w();
2318 if (!media_channel()->SetSend(send)) { 2339 if (!media_channel()->SetSend(send)) {
2319 LOG(LS_ERROR) << "Failed to SetSend on data channel"; 2340 LOG(LS_ERROR) << "Failed to SetSend on data channel";
2320 } 2341 }
2321 2342
2322 // Trigger SignalReadyToSendData asynchronously. 2343 // Trigger SignalReadyToSendData asynchronously.
2323 OnDataChannelReadyToSend(send); 2344 OnDataChannelReadyToSend(send);
2324 2345
2325 LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send; 2346 LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send;
2326 } 2347 }
2327 2348
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2377 void DataChannel::StopMediaMonitor() { 2398 void DataChannel::StopMediaMonitor() {
2378 if (media_monitor_) { 2399 if (media_monitor_) {
2379 media_monitor_->Stop(); 2400 media_monitor_->Stop();
2380 media_monitor_->SignalUpdate.disconnect(this); 2401 media_monitor_->SignalUpdate.disconnect(this);
2381 media_monitor_.reset(); 2402 media_monitor_.reset();
2382 } 2403 }
2383 } 2404 }
2384 2405
2385 void DataChannel::OnMediaMonitorUpdate( 2406 void DataChannel::OnMediaMonitorUpdate(
2386 DataMediaChannel* media_channel, const DataMediaInfo& info) { 2407 DataMediaChannel* media_channel, const DataMediaInfo& info) {
2387 ASSERT(media_channel == this->media_channel()); 2408 RTC_DCHECK(media_channel == this->media_channel());
2388 SignalMediaMonitor(this, info); 2409 SignalMediaMonitor(this, info);
2389 } 2410 }
2390 2411
2391 void DataChannel::OnDataReceived( 2412 void DataChannel::OnDataReceived(
2392 const ReceiveDataParams& params, const char* data, size_t len) { 2413 const ReceiveDataParams& params, const char* data, size_t len) {
2393 DataReceivedMessageData* msg = new DataReceivedMessageData( 2414 DataReceivedMessageData* msg = new DataReceivedMessageData(
2394 params, data, len); 2415 params, data, len);
2395 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_DATARECEIVED, msg); 2416 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_DATARECEIVED, msg);
2396 } 2417 }
2397 2418
(...skipping 21 matching lines...) Expand all
2419 } 2440 }
2420 2441
2421 void DataChannel::OnStreamClosedRemotely(uint32_t sid) { 2442 void DataChannel::OnStreamClosedRemotely(uint32_t sid) {
2422 rtc::TypedMessageData<uint32_t>* message = 2443 rtc::TypedMessageData<uint32_t>* message =
2423 new rtc::TypedMessageData<uint32_t>(sid); 2444 new rtc::TypedMessageData<uint32_t>(sid);
2424 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY, 2445 signaling_thread()->Post(RTC_FROM_HERE, this, MSG_STREAMCLOSEDREMOTELY,
2425 message); 2446 message);
2426 } 2447 }
2427 2448
2428 } // namespace cricket 2449 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/pc/channel.h ('k') | webrtc/pc/channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698