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 |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 case PeerConnectionInterface::kNoHost: | 389 case PeerConnectionInterface::kNoHost: |
390 return (cricket::CF_ALL & ~cricket::CF_HOST); | 390 return (cricket::CF_ALL & ~cricket::CF_HOST); |
391 case PeerConnectionInterface::kAll: | 391 case PeerConnectionInterface::kAll: |
392 return cricket::CF_ALL; | 392 return cricket::CF_ALL; |
393 default: | 393 default: |
394 ASSERT(false); | 394 ASSERT(false); |
395 } | 395 } |
396 return cricket::CF_NONE; | 396 return cricket::CF_NONE; |
397 } | 397 } |
398 | 398 |
| 399 // Helper method to set a voice/video channel on all applicable senders |
| 400 // and receivers when one is created/destroyed by WebRtcSession. |
| 401 // |
| 402 // Used by On(Voice|Video)Channel(Created|Destroyed) |
| 403 template <class SENDER, |
| 404 class RECEIVER, |
| 405 class CHANNEL, |
| 406 class SENDERS, |
| 407 class RECEIVERS> |
| 408 void SetChannelOnSendersAndReceivers(CHANNEL* channel, |
| 409 SENDERS& senders, |
| 410 RECEIVERS& receivers, |
| 411 cricket::MediaType media_type) { |
| 412 for (auto& sender : senders) { |
| 413 if (sender->media_type() == media_type) { |
| 414 static_cast<SENDER*>(sender->internal())->SetChannel(channel); |
| 415 } |
| 416 } |
| 417 for (auto& receiver : receivers) { |
| 418 if (receiver->media_type() == media_type) { |
| 419 if (!channel) { |
| 420 receiver->internal()->Stop(); |
| 421 } |
| 422 static_cast<RECEIVER*>(receiver->internal())->SetChannel(channel); |
| 423 } |
| 424 } |
| 425 } |
| 426 |
399 } // namespace | 427 } // namespace |
400 | 428 |
401 namespace webrtc { | 429 namespace webrtc { |
402 | 430 |
403 // Generate a RTCP CNAME when a PeerConnection is created. | 431 // Generate a RTCP CNAME when a PeerConnection is created. |
404 std::string GenerateRtcpCname() { | 432 std::string GenerateRtcpCname() { |
405 std::string cname; | 433 std::string cname; |
406 if (!rtc::CreateRandomString(kRtcpCnameLength, &cname)) { | 434 if (!rtc::CreateRandomString(kRtcpCnameLength, &cname)) { |
407 LOG(LS_ERROR) << "Failed to generate CNAME."; | 435 LOG(LS_ERROR) << "Failed to generate CNAME."; |
408 RTC_DCHECK(false); | 436 RTC_DCHECK(false); |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 // Initialize the WebRtcSession. It creates transport channels etc. | 627 // Initialize the WebRtcSession. It creates transport channels etc. |
600 if (!session_->Initialize(factory_->options(), std::move(cert_generator), | 628 if (!session_->Initialize(factory_->options(), std::move(cert_generator), |
601 configuration)) { | 629 configuration)) { |
602 return false; | 630 return false; |
603 } | 631 } |
604 | 632 |
605 // Register PeerConnection as receiver of local ice candidates. | 633 // Register PeerConnection as receiver of local ice candidates. |
606 // All the callbacks will be posted to the application from PeerConnection. | 634 // All the callbacks will be posted to the application from PeerConnection. |
607 session_->RegisterIceObserver(this); | 635 session_->RegisterIceObserver(this); |
608 session_->SignalState.connect(this, &PeerConnection::OnSessionStateChange); | 636 session_->SignalState.connect(this, &PeerConnection::OnSessionStateChange); |
| 637 session_->SignalVoiceChannelCreated.connect( |
| 638 this, &PeerConnection::OnVoiceChannelCreated); |
609 session_->SignalVoiceChannelDestroyed.connect( | 639 session_->SignalVoiceChannelDestroyed.connect( |
610 this, &PeerConnection::OnVoiceChannelDestroyed); | 640 this, &PeerConnection::OnVoiceChannelDestroyed); |
| 641 session_->SignalVideoChannelCreated.connect( |
| 642 this, &PeerConnection::OnVideoChannelCreated); |
611 session_->SignalVideoChannelDestroyed.connect( | 643 session_->SignalVideoChannelDestroyed.connect( |
612 this, &PeerConnection::OnVideoChannelDestroyed); | 644 this, &PeerConnection::OnVideoChannelDestroyed); |
613 session_->SignalDataChannelCreated.connect( | 645 session_->SignalDataChannelCreated.connect( |
614 this, &PeerConnection::OnDataChannelCreated); | 646 this, &PeerConnection::OnDataChannelCreated); |
615 session_->SignalDataChannelDestroyed.connect( | 647 session_->SignalDataChannelDestroyed.connect( |
616 this, &PeerConnection::OnDataChannelDestroyed); | 648 this, &PeerConnection::OnDataChannelDestroyed); |
617 session_->SignalDataChannelOpenMessage.connect( | 649 session_->SignalDataChannelOpenMessage.connect( |
618 this, &PeerConnection::OnDataChannelOpenMessage); | 650 this, &PeerConnection::OnDataChannelOpenMessage); |
619 return true; | 651 return true; |
620 } | 652 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 LOG(LS_ERROR) << "Sender for track " << track->id() << " already exists."; | 736 LOG(LS_ERROR) << "Sender for track " << track->id() << " already exists."; |
705 return nullptr; | 737 return nullptr; |
706 } | 738 } |
707 | 739 |
708 // TODO(deadbeef): Support adding a track to multiple streams. | 740 // TODO(deadbeef): Support adding a track to multiple streams. |
709 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender; | 741 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender; |
710 if (track->kind() == MediaStreamTrackInterface::kAudioKind) { | 742 if (track->kind() == MediaStreamTrackInterface::kAudioKind) { |
711 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 743 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
712 signaling_thread(), | 744 signaling_thread(), |
713 new AudioRtpSender(static_cast<AudioTrackInterface*>(track), | 745 new AudioRtpSender(static_cast<AudioTrackInterface*>(track), |
714 session_.get(), stats_.get())); | 746 session_->voice_channel(), stats_.get())); |
715 if (!streams.empty()) { | 747 if (!streams.empty()) { |
716 new_sender->internal()->set_stream_id(streams[0]->label()); | 748 new_sender->internal()->set_stream_id(streams[0]->label()); |
717 } | 749 } |
718 const TrackInfo* track_info = FindTrackInfo( | 750 const TrackInfo* track_info = FindTrackInfo( |
719 local_audio_tracks_, new_sender->internal()->stream_id(), track->id()); | 751 local_audio_tracks_, new_sender->internal()->stream_id(), track->id()); |
720 if (track_info) { | 752 if (track_info) { |
721 new_sender->internal()->SetSsrc(track_info->ssrc); | 753 new_sender->internal()->SetSsrc(track_info->ssrc); |
722 } | 754 } |
723 } else if (track->kind() == MediaStreamTrackInterface::kVideoKind) { | 755 } else if (track->kind() == MediaStreamTrackInterface::kVideoKind) { |
724 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 756 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
725 signaling_thread(), | 757 signaling_thread(), |
726 new VideoRtpSender(static_cast<VideoTrackInterface*>(track), | 758 new VideoRtpSender(static_cast<VideoTrackInterface*>(track), |
727 session_.get())); | 759 session_->video_channel())); |
728 if (!streams.empty()) { | 760 if (!streams.empty()) { |
729 new_sender->internal()->set_stream_id(streams[0]->label()); | 761 new_sender->internal()->set_stream_id(streams[0]->label()); |
730 } | 762 } |
731 const TrackInfo* track_info = FindTrackInfo( | 763 const TrackInfo* track_info = FindTrackInfo( |
732 local_video_tracks_, new_sender->internal()->stream_id(), track->id()); | 764 local_video_tracks_, new_sender->internal()->stream_id(), track->id()); |
733 if (track_info) { | 765 if (track_info) { |
734 new_sender->internal()->SetSsrc(track_info->ssrc); | 766 new_sender->internal()->SetSsrc(track_info->ssrc); |
735 } | 767 } |
736 } else { | 768 } else { |
737 LOG(LS_ERROR) << "CreateSender called with invalid kind: " << track->kind(); | 769 LOG(LS_ERROR) << "CreateSender called with invalid kind: " << track->kind(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 return DtmfSenderProxy::Create(signaling_thread(), sender.get()); | 814 return DtmfSenderProxy::Create(signaling_thread(), sender.get()); |
783 } | 815 } |
784 | 816 |
785 rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender( | 817 rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender( |
786 const std::string& kind, | 818 const std::string& kind, |
787 const std::string& stream_id) { | 819 const std::string& stream_id) { |
788 TRACE_EVENT0("webrtc", "PeerConnection::CreateSender"); | 820 TRACE_EVENT0("webrtc", "PeerConnection::CreateSender"); |
789 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender; | 821 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender; |
790 if (kind == MediaStreamTrackInterface::kAudioKind) { | 822 if (kind == MediaStreamTrackInterface::kAudioKind) { |
791 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 823 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
792 signaling_thread(), new AudioRtpSender(session_.get(), stats_.get())); | 824 signaling_thread(), |
| 825 new AudioRtpSender(session_->voice_channel(), stats_.get())); |
793 } else if (kind == MediaStreamTrackInterface::kVideoKind) { | 826 } else if (kind == MediaStreamTrackInterface::kVideoKind) { |
794 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 827 new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
795 signaling_thread(), new VideoRtpSender(session_.get())); | 828 signaling_thread(), new VideoRtpSender(session_->video_channel())); |
796 } else { | 829 } else { |
797 LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind; | 830 LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind; |
798 return new_sender; | 831 return new_sender; |
799 } | 832 } |
800 if (!stream_id.empty()) { | 833 if (!stream_id.empty()) { |
801 new_sender->internal()->set_stream_id(stream_id); | 834 new_sender->internal()->set_stream_id(stream_id); |
802 } | 835 } |
803 senders_.push_back(new_sender); | 836 senders_.push_back(new_sender); |
804 return new_sender; | 837 return new_sender; |
805 } | 838 } |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 RTC_DCHECK(false && "Not implemented"); | 1343 RTC_DCHECK(false && "Not implemented"); |
1311 break; | 1344 break; |
1312 } | 1345 } |
1313 } | 1346 } |
1314 | 1347 |
1315 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, | 1348 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, |
1316 const std::string& track_id, | 1349 const std::string& track_id, |
1317 uint32_t ssrc) { | 1350 uint32_t ssrc) { |
1318 receivers_.push_back( | 1351 receivers_.push_back( |
1319 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create( | 1352 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create( |
1320 signaling_thread(), | 1353 signaling_thread(), new AudioRtpReceiver(stream, track_id, ssrc, |
1321 new AudioRtpReceiver(stream, track_id, ssrc, session_.get()))); | 1354 session_->voice_channel()))); |
1322 } | 1355 } |
1323 | 1356 |
1324 void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream, | 1357 void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream, |
1325 const std::string& track_id, | 1358 const std::string& track_id, |
1326 uint32_t ssrc) { | 1359 uint32_t ssrc) { |
1327 receivers_.push_back( | 1360 receivers_.push_back( |
1328 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create( | 1361 RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create( |
1329 signaling_thread(), | 1362 signaling_thread(), |
1330 new VideoRtpReceiver(stream, track_id, factory_->worker_thread(), | 1363 new VideoRtpReceiver(stream, track_id, factory_->worker_thread(), |
1331 ssrc, session_.get()))); | 1364 ssrc, session_->video_channel()))); |
1332 } | 1365 } |
1333 | 1366 |
1334 // TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote | 1367 // TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote |
1335 // description. | 1368 // description. |
1336 void PeerConnection::DestroyReceiver(const std::string& track_id) { | 1369 void PeerConnection::DestroyReceiver(const std::string& track_id) { |
1337 auto it = FindReceiverForTrack(track_id); | 1370 auto it = FindReceiverForTrack(track_id); |
1338 if (it == receivers_.end()) { | 1371 if (it == receivers_.end()) { |
1339 LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id | 1372 LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id |
1340 << " doesn't exist."; | 1373 << " doesn't exist."; |
1341 } else { | 1374 } else { |
1342 (*it)->internal()->Stop(); | 1375 (*it)->internal()->Stop(); |
1343 receivers_.erase(it); | 1376 receivers_.erase(it); |
1344 } | 1377 } |
1345 } | 1378 } |
1346 | 1379 |
1347 void PeerConnection::StopReceivers(cricket::MediaType media_type) { | |
1348 TrackInfos* current_tracks = GetRemoteTracks(media_type); | |
1349 for (const auto& track_info : *current_tracks) { | |
1350 auto it = FindReceiverForTrack(track_info.track_id); | |
1351 if (it == receivers_.end()) { | |
1352 LOG(LS_WARNING) << "RtpReceiver for track with id " << track_info.track_id | |
1353 << " doesn't exist."; | |
1354 } else { | |
1355 (*it)->internal()->Stop(); | |
1356 } | |
1357 } | |
1358 } | |
1359 | |
1360 void PeerConnection::OnIceConnectionChange( | 1380 void PeerConnection::OnIceConnectionChange( |
1361 PeerConnectionInterface::IceConnectionState new_state) { | 1381 PeerConnectionInterface::IceConnectionState new_state) { |
1362 RTC_DCHECK(signaling_thread()->IsCurrent()); | 1382 RTC_DCHECK(signaling_thread()->IsCurrent()); |
1363 // After transitioning to "closed", ignore any additional states from | 1383 // After transitioning to "closed", ignore any additional states from |
1364 // WebRtcSession (such as "disconnected"). | 1384 // WebRtcSession (such as "disconnected"). |
1365 if (IsClosed()) { | 1385 if (IsClosed()) { |
1366 return; | 1386 return; |
1367 } | 1387 } |
1368 ice_connection_state_ = new_state; | 1388 ice_connection_state_ = new_state; |
1369 observer_->OnIceConnectionChange(ice_connection_state_); | 1389 observer_->OnIceConnectionChange(ice_connection_state_); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 if (sender != senders_.end()) { | 1435 if (sender != senders_.end()) { |
1416 // We already have a sender for this track, so just change the stream_id | 1436 // We already have a sender for this track, so just change the stream_id |
1417 // so that it's correct in the next call to CreateOffer. | 1437 // so that it's correct in the next call to CreateOffer. |
1418 (*sender)->internal()->set_stream_id(stream->label()); | 1438 (*sender)->internal()->set_stream_id(stream->label()); |
1419 return; | 1439 return; |
1420 } | 1440 } |
1421 | 1441 |
1422 // Normal case; we've never seen this track before. | 1442 // Normal case; we've never seen this track before. |
1423 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender = | 1443 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender = |
1424 RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 1444 RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
1425 signaling_thread(), new AudioRtpSender(track, stream->label(), | 1445 signaling_thread(), |
1426 session_.get(), stats_.get())); | 1446 new AudioRtpSender(track, stream->label(), session_->voice_channel(), |
| 1447 stats_.get())); |
1427 senders_.push_back(new_sender); | 1448 senders_.push_back(new_sender); |
1428 // If the sender has already been configured in SDP, we call SetSsrc, | 1449 // If the sender has already been configured in SDP, we call SetSsrc, |
1429 // which will connect the sender to the underlying transport. This can | 1450 // which will connect the sender to the underlying transport. This can |
1430 // occur if a local session description that contains the ID of the sender | 1451 // occur if a local session description that contains the ID of the sender |
1431 // is set before AddStream is called. It can also occur if the local | 1452 // is set before AddStream is called. It can also occur if the local |
1432 // session description is not changed and RemoveStream is called, and | 1453 // session description is not changed and RemoveStream is called, and |
1433 // later AddStream is called again with the same stream. | 1454 // later AddStream is called again with the same stream. |
1434 const TrackInfo* track_info = | 1455 const TrackInfo* track_info = |
1435 FindTrackInfo(local_audio_tracks_, stream->label(), track->id()); | 1456 FindTrackInfo(local_audio_tracks_, stream->label(), track->id()); |
1436 if (track_info) { | 1457 if (track_info) { |
(...skipping 21 matching lines...) Expand all Loading... |
1458 if (sender != senders_.end()) { | 1479 if (sender != senders_.end()) { |
1459 // We already have a sender for this track, so just change the stream_id | 1480 // We already have a sender for this track, so just change the stream_id |
1460 // so that it's correct in the next call to CreateOffer. | 1481 // so that it's correct in the next call to CreateOffer. |
1461 (*sender)->internal()->set_stream_id(stream->label()); | 1482 (*sender)->internal()->set_stream_id(stream->label()); |
1462 return; | 1483 return; |
1463 } | 1484 } |
1464 | 1485 |
1465 // Normal case; we've never seen this track before. | 1486 // Normal case; we've never seen this track before. |
1466 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender = | 1487 rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender = |
1467 RtpSenderProxyWithInternal<RtpSenderInternal>::Create( | 1488 RtpSenderProxyWithInternal<RtpSenderInternal>::Create( |
1468 signaling_thread(), | 1489 signaling_thread(), new VideoRtpSender(track, stream->label(), |
1469 new VideoRtpSender(track, stream->label(), session_.get())); | 1490 session_->video_channel())); |
1470 senders_.push_back(new_sender); | 1491 senders_.push_back(new_sender); |
1471 const TrackInfo* track_info = | 1492 const TrackInfo* track_info = |
1472 FindTrackInfo(local_video_tracks_, stream->label(), track->id()); | 1493 FindTrackInfo(local_video_tracks_, stream->label(), track->id()); |
1473 if (track_info) { | 1494 if (track_info) { |
1474 new_sender->internal()->SetSsrc(track_info->ssrc); | 1495 new_sender->internal()->SetSsrc(track_info->ssrc); |
1475 } | 1496 } |
1476 } | 1497 } |
1477 | 1498 |
1478 void PeerConnection::OnVideoTrackRemoved(VideoTrackInterface* track, | 1499 void PeerConnection::OnVideoTrackRemoved(VideoTrackInterface* track, |
1479 MediaStreamInterface* stream) { | 1500 MediaStreamInterface* stream) { |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1998 // Since this method is triggered by a signal from the DataChannel, | 2019 // Since this method is triggered by a signal from the DataChannel, |
1999 // we can't free it directly here; we need to free it asynchronously. | 2020 // we can't free it directly here; we need to free it asynchronously. |
2000 sctp_data_channels_to_free_.push_back(*it); | 2021 sctp_data_channels_to_free_.push_back(*it); |
2001 sctp_data_channels_.erase(it); | 2022 sctp_data_channels_.erase(it); |
2002 signaling_thread()->Post(this, MSG_FREE_DATACHANNELS, nullptr); | 2023 signaling_thread()->Post(this, MSG_FREE_DATACHANNELS, nullptr); |
2003 return; | 2024 return; |
2004 } | 2025 } |
2005 } | 2026 } |
2006 } | 2027 } |
2007 | 2028 |
| 2029 void PeerConnection::OnVoiceChannelCreated() { |
| 2030 SetChannelOnSendersAndReceivers<AudioRtpSender, AudioRtpReceiver>( |
| 2031 session_->voice_channel(), senders_, receivers_, |
| 2032 cricket::MEDIA_TYPE_AUDIO); |
| 2033 } |
| 2034 |
2008 void PeerConnection::OnVoiceChannelDestroyed() { | 2035 void PeerConnection::OnVoiceChannelDestroyed() { |
2009 StopReceivers(cricket::MEDIA_TYPE_AUDIO); | 2036 SetChannelOnSendersAndReceivers<AudioRtpSender, AudioRtpReceiver, |
| 2037 cricket::VoiceChannel>( |
| 2038 nullptr, senders_, receivers_, cricket::MEDIA_TYPE_AUDIO); |
| 2039 } |
| 2040 |
| 2041 void PeerConnection::OnVideoChannelCreated() { |
| 2042 SetChannelOnSendersAndReceivers<VideoRtpSender, VideoRtpReceiver>( |
| 2043 session_->video_channel(), senders_, receivers_, |
| 2044 cricket::MEDIA_TYPE_VIDEO); |
2010 } | 2045 } |
2011 | 2046 |
2012 void PeerConnection::OnVideoChannelDestroyed() { | 2047 void PeerConnection::OnVideoChannelDestroyed() { |
2013 StopReceivers(cricket::MEDIA_TYPE_VIDEO); | 2048 SetChannelOnSendersAndReceivers<VideoRtpSender, VideoRtpReceiver, |
| 2049 cricket::VideoChannel>( |
| 2050 nullptr, senders_, receivers_, cricket::MEDIA_TYPE_VIDEO); |
2014 } | 2051 } |
2015 | 2052 |
2016 void PeerConnection::OnDataChannelCreated() { | 2053 void PeerConnection::OnDataChannelCreated() { |
2017 for (const auto& channel : sctp_data_channels_) { | 2054 for (const auto& channel : sctp_data_channels_) { |
2018 channel->OnTransportChannelCreated(); | 2055 channel->OnTransportChannelCreated(); |
2019 } | 2056 } |
2020 } | 2057 } |
2021 | 2058 |
2022 void PeerConnection::OnDataChannelDestroyed() { | 2059 void PeerConnection::OnDataChannelDestroyed() { |
2023 // Use a temporary copy of the RTP/SCTP DataChannel list because the | 2060 // Use a temporary copy of the RTP/SCTP DataChannel list because the |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2179 port_allocator_->set_candidate_filter( | 2216 port_allocator_->set_candidate_filter( |
2180 ConvertIceTransportTypeToCandidateFilter(configuration.type)); | 2217 ConvertIceTransportTypeToCandidateFilter(configuration.type)); |
2181 // Call this last since it may create pooled allocator sessions using the | 2218 // Call this last since it may create pooled allocator sessions using the |
2182 // candidate filter set above. | 2219 // candidate filter set above. |
2183 port_allocator_->SetConfiguration(stun_servers, turn_servers, | 2220 port_allocator_->SetConfiguration(stun_servers, turn_servers, |
2184 configuration.ice_candidate_pool_size); | 2221 configuration.ice_candidate_pool_size); |
2185 return true; | 2222 return true; |
2186 } | 2223 } |
2187 | 2224 |
2188 } // namespace webrtc | 2225 } // namespace webrtc |
OLD | NEW |