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

Side by Side Diff: webrtc/api/peerconnection.cc

Issue 2046173002: Use VoiceChannel/VideoChannel directly from RtpSender/RtpReceiver. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Comment formatting. Created 4 years, 6 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 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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698