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 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 session_options->AddSendStream(cricket::MEDIA_TYPE_DATA, streamid, | 371 session_options->AddSendStream(cricket::MEDIA_TYPE_DATA, streamid, |
372 sync_label); | 372 sync_label); |
373 } | 373 } |
374 } | 374 } |
375 } | 375 } |
376 | 376 |
377 } // namespace | 377 } // namespace |
378 | 378 |
379 namespace webrtc { | 379 namespace webrtc { |
380 | 380 |
381 // Factory class for creating remote MediaStreams and MediaStreamTracks. | |
382 class RemoteMediaStreamFactory { | |
383 public: | |
384 explicit RemoteMediaStreamFactory(rtc::Thread* signaling_thread) | |
385 : signaling_thread_(signaling_thread) {} | |
386 | |
387 rtc::scoped_refptr<MediaStreamInterface> CreateMediaStream( | |
388 const std::string& stream_label) { | |
389 return MediaStreamProxy::Create(signaling_thread_, | |
390 MediaStream::Create(stream_label)); | |
391 } | |
392 | |
393 AudioTrackInterface* AddAudioTrack(uint32_t ssrc, | |
394 AudioProviderInterface* provider, | |
395 webrtc::MediaStreamInterface* stream, | |
396 const std::string& track_id) { | |
397 return AddTrack<AudioTrackInterface, AudioTrack, AudioTrackProxy>( | |
398 stream, track_id, RemoteAudioSource::Create(ssrc, provider)); | |
399 } | |
400 | |
401 private: | |
402 template <typename TI, typename T, typename TP, typename S> | |
403 TI* AddTrack(MediaStreamInterface* stream, | |
404 const std::string& track_id, | |
405 const S& source) { | |
406 rtc::scoped_refptr<TI> track( | |
407 TP::Create(signaling_thread_, T::Create(track_id, source))); | |
408 track->set_state(webrtc::MediaStreamTrackInterface::kLive); | |
409 if (stream->AddTrack(track)) { | |
410 return track; | |
411 } | |
412 return nullptr; | |
413 } | |
414 | |
415 rtc::Thread* signaling_thread_; | |
416 }; | |
417 | |
418 bool ExtractMediaSessionOptions( | 381 bool ExtractMediaSessionOptions( |
419 const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options, | 382 const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options, |
420 bool is_offer, | 383 bool is_offer, |
421 cricket::MediaSessionOptions* session_options) { | 384 cricket::MediaSessionOptions* session_options) { |
422 typedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; | 385 typedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions; |
423 if (!IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_audio) || | 386 if (!IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_audio) || |
424 !IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_video)) { | 387 !IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_video)) { |
425 return false; | 388 return false; |
426 } | 389 } |
427 | 390 |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_TCP; | 565 portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_TCP; |
603 LOG(LS_INFO) << "TCP candidates are disabled."; | 566 LOG(LS_INFO) << "TCP candidates are disabled."; |
604 } | 567 } |
605 | 568 |
606 port_allocator_->set_flags(portallocator_flags); | 569 port_allocator_->set_flags(portallocator_flags); |
607 // No step delay is used while allocating ports. | 570 // No step delay is used while allocating ports. |
608 port_allocator_->set_step_delay(cricket::kMinimumStepDelay); | 571 port_allocator_->set_step_delay(cricket::kMinimumStepDelay); |
609 | 572 |
610 media_controller_.reset(factory_->CreateMediaController(media_config)); | 573 media_controller_.reset(factory_->CreateMediaController(media_config)); |
611 | 574 |
612 remote_stream_factory_.reset( | |
613 new RemoteMediaStreamFactory(factory_->signaling_thread())); | |
614 | |
615 session_.reset( | 575 session_.reset( |
616 new WebRtcSession(media_controller_.get(), factory_->signaling_thread(), | 576 new WebRtcSession(media_controller_.get(), factory_->signaling_thread(), |
617 factory_->worker_thread(), port_allocator_.get())); | 577 factory_->worker_thread(), port_allocator_.get())); |
618 stats_.reset(new StatsCollector(this)); | 578 stats_.reset(new StatsCollector(this)); |
619 | 579 |
620 // Initialize the WebRtcSession. It creates transport channels etc. | 580 // Initialize the WebRtcSession. It creates transport channels etc. |
621 if (!session_->Initialize(factory_->options(), std::move(dtls_identity_store), | 581 if (!session_->Initialize(factory_->options(), std::move(dtls_identity_store), |
622 configuration)) { | 582 configuration)) { |
623 return false; | 583 return false; |
624 } | 584 } |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 sctp_data_channels_to_free_.clear(); | 1274 sctp_data_channels_to_free_.clear(); |
1315 break; | 1275 break; |
1316 } | 1276 } |
1317 default: | 1277 default: |
1318 RTC_DCHECK(false && "Not implemented"); | 1278 RTC_DCHECK(false && "Not implemented"); |
1319 break; | 1279 break; |
1320 } | 1280 } |
1321 } | 1281 } |
1322 | 1282 |
1323 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, | 1283 void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, |
1324 AudioTrackInterface* audio_track, | 1284 const std::string& track_id, |
1325 uint32_t ssrc) { | 1285 uint32_t ssrc) { |
1326 receivers_.push_back(RtpReceiverProxy::Create( | 1286 receivers_.push_back(RtpReceiverProxy::Create( |
1327 signaling_thread(), | 1287 signaling_thread(), |
1328 new AudioRtpReceiver(audio_track, ssrc, session_.get()))); | 1288 new AudioRtpReceiver(stream, track_id, ssrc, session_.get()))); |
1329 } | 1289 } |
1330 | 1290 |
1331 void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream, | 1291 void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream, |
1332 const std::string& track_id, | 1292 const std::string& track_id, |
1333 uint32_t ssrc) { | 1293 uint32_t ssrc) { |
1334 VideoRtpReceiver* video_receiver = new VideoRtpReceiver( | 1294 receivers_.push_back(RtpReceiverProxy::Create( |
1335 stream, track_id, factory_->worker_thread(), ssrc, session_.get()); | 1295 signaling_thread(), |
1336 receivers_.push_back( | 1296 new VideoRtpReceiver(stream, track_id, factory_->worker_thread(), ssrc, |
1337 RtpReceiverProxy::Create(signaling_thread(), video_receiver)); | 1297 session_.get()))); |
1338 } | 1298 } |
1339 | 1299 |
1340 // TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote | 1300 // TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote |
1341 // description. | 1301 // description. |
1342 void PeerConnection::DestroyAudioReceiver(MediaStreamInterface* stream, | 1302 void PeerConnection::DestroyAudioReceiver(const std::string& track_id) { |
1343 AudioTrackInterface* audio_track) { | 1303 auto it = FindReceiverForTrack(track_id); |
1344 auto it = FindReceiverForTrack(audio_track); | |
1345 if (it == receivers_.end()) { | 1304 if (it == receivers_.end()) { |
1346 LOG(LS_WARNING) << "RtpReceiver for track with id " << audio_track->id() | 1305 LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id |
1347 << " doesn't exist."; | 1306 << " doesn't exist."; |
1348 } else { | 1307 } else { |
1349 (*it)->Stop(); | 1308 (*it)->Stop(); |
1350 receivers_.erase(it); | 1309 receivers_.erase(it); |
1351 } | 1310 } |
1352 } | 1311 } |
1353 | 1312 |
1354 void PeerConnection::DestroyVideoReceiver(MediaStreamInterface* stream, | 1313 void PeerConnection::DestroyVideoReceiver(const std::string& track_id) { |
1355 VideoTrackInterface* video_track) { | 1314 auto it = FindReceiverForTrack(track_id); |
1356 auto it = FindReceiverForTrack(video_track); | |
1357 if (it == receivers_.end()) { | 1315 if (it == receivers_.end()) { |
1358 LOG(LS_WARNING) << "RtpReceiver for track with id " << video_track->id() | 1316 LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id |
1359 << " doesn't exist."; | 1317 << " doesn't exist."; |
1360 } else { | 1318 } else { |
1361 (*it)->Stop(); | 1319 (*it)->Stop(); |
1362 receivers_.erase(it); | 1320 receivers_.erase(it); |
1363 } | 1321 } |
1364 } | 1322 } |
1365 | 1323 |
1366 void PeerConnection::OnIceConnectionChange( | 1324 void PeerConnection::OnIceConnectionChange( |
1367 PeerConnectionInterface::IceConnectionState new_state) { | 1325 PeerConnectionInterface::IceConnectionState new_state) { |
1368 RTC_DCHECK(signaling_thread()->IsCurrent()); | 1326 RTC_DCHECK(signaling_thread()->IsCurrent()); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1633 // The sync_label is the MediaStream label and the |stream.id| is the | 1591 // The sync_label is the MediaStream label and the |stream.id| is the |
1634 // track id. | 1592 // track id. |
1635 const std::string& stream_label = params.sync_label; | 1593 const std::string& stream_label = params.sync_label; |
1636 const std::string& track_id = params.id; | 1594 const std::string& track_id = params.id; |
1637 uint32_t ssrc = params.first_ssrc(); | 1595 uint32_t ssrc = params.first_ssrc(); |
1638 | 1596 |
1639 rtc::scoped_refptr<MediaStreamInterface> stream = | 1597 rtc::scoped_refptr<MediaStreamInterface> stream = |
1640 remote_streams_->find(stream_label); | 1598 remote_streams_->find(stream_label); |
1641 if (!stream) { | 1599 if (!stream) { |
1642 // This is a new MediaStream. Create a new remote MediaStream. | 1600 // This is a new MediaStream. Create a new remote MediaStream. |
1643 stream = remote_stream_factory_->CreateMediaStream(stream_label); | 1601 stream = MediaStreamProxy::Create(rtc::Thread::Current(), |
| 1602 MediaStream::Create(stream_label)); |
1644 remote_streams_->AddStream(stream); | 1603 remote_streams_->AddStream(stream); |
1645 new_streams->AddStream(stream); | 1604 new_streams->AddStream(stream); |
1646 } | 1605 } |
1647 | 1606 |
1648 const TrackInfo* track_info = | 1607 const TrackInfo* track_info = |
1649 FindTrackInfo(*current_tracks, stream_label, track_id); | 1608 FindTrackInfo(*current_tracks, stream_label, track_id); |
1650 if (!track_info) { | 1609 if (!track_info) { |
1651 current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); | 1610 current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); |
1652 OnRemoteTrackSeen(stream_label, track_id, ssrc, media_type); | 1611 OnRemoteTrackSeen(stream_label, track_id, ssrc, media_type); |
1653 } | 1612 } |
1654 } | 1613 } |
1655 | 1614 |
1656 // Add default track if necessary. | 1615 // Add default track if necessary. |
1657 if (default_track_needed) { | 1616 if (default_track_needed) { |
1658 rtc::scoped_refptr<MediaStreamInterface> default_stream = | 1617 rtc::scoped_refptr<MediaStreamInterface> default_stream = |
1659 remote_streams_->find(kDefaultStreamLabel); | 1618 remote_streams_->find(kDefaultStreamLabel); |
1660 if (!default_stream) { | 1619 if (!default_stream) { |
1661 // Create the new default MediaStream. | 1620 // Create the new default MediaStream. |
1662 default_stream = | 1621 default_stream = MediaStreamProxy::Create( |
1663 remote_stream_factory_->CreateMediaStream(kDefaultStreamLabel); | 1622 rtc::Thread::Current(), MediaStream::Create(kDefaultStreamLabel)); |
1664 remote_streams_->AddStream(default_stream); | 1623 remote_streams_->AddStream(default_stream); |
1665 new_streams->AddStream(default_stream); | 1624 new_streams->AddStream(default_stream); |
1666 } | 1625 } |
1667 std::string default_track_id = (media_type == cricket::MEDIA_TYPE_AUDIO) | 1626 std::string default_track_id = (media_type == cricket::MEDIA_TYPE_AUDIO) |
1668 ? kDefaultAudioTrackLabel | 1627 ? kDefaultAudioTrackLabel |
1669 : kDefaultVideoTrackLabel; | 1628 : kDefaultVideoTrackLabel; |
1670 const TrackInfo* default_track_info = | 1629 const TrackInfo* default_track_info = |
1671 FindTrackInfo(*current_tracks, kDefaultStreamLabel, default_track_id); | 1630 FindTrackInfo(*current_tracks, kDefaultStreamLabel, default_track_id); |
1672 if (!default_track_info) { | 1631 if (!default_track_info) { |
1673 current_tracks->push_back( | 1632 current_tracks->push_back( |
1674 TrackInfo(kDefaultStreamLabel, default_track_id, 0)); | 1633 TrackInfo(kDefaultStreamLabel, default_track_id, 0)); |
1675 OnRemoteTrackSeen(kDefaultStreamLabel, default_track_id, 0, media_type); | 1634 OnRemoteTrackSeen(kDefaultStreamLabel, default_track_id, 0, media_type); |
1676 } | 1635 } |
1677 } | 1636 } |
1678 } | 1637 } |
1679 | 1638 |
1680 void PeerConnection::OnRemoteTrackSeen(const std::string& stream_label, | 1639 void PeerConnection::OnRemoteTrackSeen(const std::string& stream_label, |
1681 const std::string& track_id, | 1640 const std::string& track_id, |
1682 uint32_t ssrc, | 1641 uint32_t ssrc, |
1683 cricket::MediaType media_type) { | 1642 cricket::MediaType media_type) { |
1684 MediaStreamInterface* stream = remote_streams_->find(stream_label); | 1643 MediaStreamInterface* stream = remote_streams_->find(stream_label); |
1685 | 1644 |
1686 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 1645 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
1687 AudioTrackInterface* audio_track = remote_stream_factory_->AddAudioTrack( | 1646 CreateAudioReceiver(stream, track_id, ssrc); |
1688 ssrc, session_.get(), stream, track_id); | |
1689 CreateAudioReceiver(stream, audio_track, ssrc); | |
1690 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 1647 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
1691 CreateVideoReceiver(stream, track_id, ssrc); | 1648 CreateVideoReceiver(stream, track_id, ssrc); |
1692 } else { | 1649 } else { |
1693 RTC_DCHECK(false && "Invalid media type"); | 1650 RTC_DCHECK(false && "Invalid media type"); |
1694 } | 1651 } |
1695 } | 1652 } |
1696 | 1653 |
1697 void PeerConnection::OnRemoteTrackRemoved(const std::string& stream_label, | 1654 void PeerConnection::OnRemoteTrackRemoved(const std::string& stream_label, |
1698 const std::string& track_id, | 1655 const std::string& track_id, |
1699 cricket::MediaType media_type) { | 1656 cricket::MediaType media_type) { |
1700 MediaStreamInterface* stream = remote_streams_->find(stream_label); | 1657 MediaStreamInterface* stream = remote_streams_->find(stream_label); |
1701 | 1658 |
1702 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 1659 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
| 1660 DestroyAudioReceiver(track_id); |
1703 rtc::scoped_refptr<AudioTrackInterface> audio_track = | 1661 rtc::scoped_refptr<AudioTrackInterface> audio_track = |
1704 stream->FindAudioTrack(track_id); | 1662 stream->FindAudioTrack(track_id); |
1705 if (audio_track) { | 1663 if (audio_track) { |
1706 audio_track->set_state(webrtc::MediaStreamTrackInterface::kEnded); | |
1707 stream->RemoveTrack(audio_track); | 1664 stream->RemoveTrack(audio_track); |
1708 DestroyAudioReceiver(stream, audio_track); | |
1709 } | 1665 } |
1710 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 1666 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| 1667 // Stopping or destroying a VideoRtpReceiver will end the |
| 1668 // VideoRtpReceiver::track(). |
| 1669 DestroyVideoReceiver(track_id); |
1711 rtc::scoped_refptr<VideoTrackInterface> video_track = | 1670 rtc::scoped_refptr<VideoTrackInterface> video_track = |
1712 stream->FindVideoTrack(track_id); | 1671 stream->FindVideoTrack(track_id); |
1713 if (video_track) { | 1672 if (video_track) { |
| 1673 // There's no guarantee the track is still available, e.g. the track may |
| 1674 // have been removed from the stream by an application. |
1714 stream->RemoveTrack(video_track); | 1675 stream->RemoveTrack(video_track); |
1715 // Stopping or destroying a VideoRtpReceiver will end the | |
1716 // VideoRtpReceiver::track(). | |
1717 DestroyVideoReceiver(stream, video_track); | |
1718 } | 1676 } |
1719 } else { | 1677 } else { |
1720 ASSERT(false && "Invalid media type"); | 1678 ASSERT(false && "Invalid media type"); |
1721 } | 1679 } |
1722 } | 1680 } |
1723 | 1681 |
1724 void PeerConnection::UpdateEndedRemoteMediaStreams() { | 1682 void PeerConnection::UpdateEndedRemoteMediaStreams() { |
1725 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams_to_remove; | 1683 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams_to_remove; |
1726 for (size_t i = 0; i < remote_streams_->count(); ++i) { | 1684 for (size_t i = 0; i < remote_streams_->count(); ++i) { |
1727 MediaStreamInterface* stream = remote_streams_->at(i); | 1685 MediaStreamInterface* stream = remote_streams_->at(i); |
1728 if (stream->GetAudioTracks().empty() && stream->GetVideoTracks().empty()) { | 1686 if (stream->GetAudioTracks().empty() && stream->GetVideoTracks().empty()) { |
1729 streams_to_remove.push_back(stream); | 1687 streams_to_remove.push_back(stream); |
1730 } | 1688 } |
1731 } | 1689 } |
1732 | 1690 |
1733 for (const auto& stream : streams_to_remove) { | 1691 for (const auto& stream : streams_to_remove) { |
1734 remote_streams_->RemoveStream(stream); | 1692 remote_streams_->RemoveStream(stream); |
1735 observer_->OnRemoveStream(stream); | 1693 observer_->OnRemoveStream(stream); |
1736 } | 1694 } |
1737 } | 1695 } |
1738 | 1696 |
1739 void PeerConnection::EndRemoteTracks(cricket::MediaType media_type) { | 1697 void PeerConnection::EndRemoteTracks(cricket::MediaType media_type) { |
1740 TrackInfos* current_tracks = GetRemoteTracks(media_type); | 1698 TrackInfos* current_tracks = GetRemoteTracks(media_type); |
1741 for (TrackInfos::iterator track_it = current_tracks->begin(); | 1699 for (TrackInfos::iterator track_it = current_tracks->begin(); |
1742 track_it != current_tracks->end(); ++track_it) { | 1700 track_it != current_tracks->end(); ++track_it) { |
1743 const TrackInfo& info = *track_it; | 1701 const TrackInfo& info = *track_it; |
1744 MediaStreamInterface* stream = remote_streams_->find(info.stream_label); | |
1745 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 1702 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
1746 AudioTrackInterface* track = stream->FindAudioTrack(info.track_id); | 1703 DestroyAudioReceiver(info.track_id); |
1747 // There's no guarantee the track is still available, e.g. the track may | |
1748 // have been removed from the stream by javascript. | |
1749 if (track) { | |
1750 track->set_state(webrtc::MediaStreamTrackInterface::kEnded); | |
1751 } | |
1752 } | 1704 } |
1753 if (media_type == cricket::MEDIA_TYPE_VIDEO) { | 1705 if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
1754 VideoTrackInterface* track = stream->FindVideoTrack(info.track_id); | 1706 DestroyVideoReceiver(info.track_id); |
1755 // There's no guarantee the track is still available, e.g. the track may | |
1756 // have been removed from the stream by javascript. | |
1757 if (track) { | |
1758 track->set_state(webrtc::MediaStreamTrackInterface::kEnded); | |
1759 } | |
1760 } | 1707 } |
1761 } | 1708 } |
1762 } | 1709 } |
1763 | 1710 |
1764 void PeerConnection::UpdateLocalTracks( | 1711 void PeerConnection::UpdateLocalTracks( |
1765 const std::vector<cricket::StreamParams>& streams, | 1712 const std::vector<cricket::StreamParams>& streams, |
1766 cricket::MediaType media_type) { | 1713 cricket::MediaType media_type) { |
1767 TrackInfos* current_tracks = GetLocalTracks(media_type); | 1714 TrackInfos* current_tracks = GetLocalTracks(media_type); |
1768 | 1715 |
1769 // Find removed tracks. I.e., tracks where the track id, stream label or ssrc | 1716 // Find removed tracks. I.e., tracks where the track id, stream label or ssrc |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2075 std::vector<rtc::scoped_refptr<RtpSenderInterface>>::iterator | 2022 std::vector<rtc::scoped_refptr<RtpSenderInterface>>::iterator |
2076 PeerConnection::FindSenderForTrack(MediaStreamTrackInterface* track) { | 2023 PeerConnection::FindSenderForTrack(MediaStreamTrackInterface* track) { |
2077 return std::find_if( | 2024 return std::find_if( |
2078 senders_.begin(), senders_.end(), | 2025 senders_.begin(), senders_.end(), |
2079 [track](const rtc::scoped_refptr<RtpSenderInterface>& sender) { | 2026 [track](const rtc::scoped_refptr<RtpSenderInterface>& sender) { |
2080 return sender->track() == track; | 2027 return sender->track() == track; |
2081 }); | 2028 }); |
2082 } | 2029 } |
2083 | 2030 |
2084 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>::iterator | 2031 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>::iterator |
2085 PeerConnection::FindReceiverForTrack(MediaStreamTrackInterface* track) { | 2032 PeerConnection::FindReceiverForTrack(const std::string& track_id) { |
2086 return std::find_if( | 2033 return std::find_if( |
2087 receivers_.begin(), receivers_.end(), | 2034 receivers_.begin(), receivers_.end(), |
2088 [track](const rtc::scoped_refptr<RtpReceiverInterface>& receiver) { | 2035 [track_id](const rtc::scoped_refptr<RtpReceiverInterface>& receiver) { |
2089 return receiver->track() == track; | 2036 return receiver->id() == track_id; |
2090 }); | 2037 }); |
2091 } | 2038 } |
2092 | 2039 |
2093 PeerConnection::TrackInfos* PeerConnection::GetRemoteTracks( | 2040 PeerConnection::TrackInfos* PeerConnection::GetRemoteTracks( |
2094 cricket::MediaType media_type) { | 2041 cricket::MediaType media_type) { |
2095 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || | 2042 RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO || |
2096 media_type == cricket::MEDIA_TYPE_VIDEO); | 2043 media_type == cricket::MEDIA_TYPE_VIDEO); |
2097 return (media_type == cricket::MEDIA_TYPE_AUDIO) ? &remote_audio_tracks_ | 2044 return (media_type == cricket::MEDIA_TYPE_AUDIO) ? &remote_audio_tracks_ |
2098 : &remote_video_tracks_; | 2045 : &remote_video_tracks_; |
2099 } | 2046 } |
(...skipping 22 matching lines...) Expand all Loading... |
2122 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { | 2069 DataChannel* PeerConnection::FindDataChannelBySid(int sid) const { |
2123 for (const auto& channel : sctp_data_channels_) { | 2070 for (const auto& channel : sctp_data_channels_) { |
2124 if (channel->id() == sid) { | 2071 if (channel->id() == sid) { |
2125 return channel; | 2072 return channel; |
2126 } | 2073 } |
2127 } | 2074 } |
2128 return nullptr; | 2075 return nullptr; |
2129 } | 2076 } |
2130 | 2077 |
2131 } // namespace webrtc | 2078 } // namespace webrtc |
OLD | NEW |