Chromium Code Reviews| Index: webrtc/api/peerconnection.cc |
| diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc |
| index 691a512b6af158811e25c111c8662a8cb35328ed..8923f540aa360a79baee729bb47cc41fe65c5b5e 100644 |
| --- a/webrtc/api/peerconnection.cc |
| +++ b/webrtc/api/peerconnection.cc |
| @@ -377,43 +377,6 @@ void AddSendStreams( |
| namespace webrtc { |
| -// Factory class for creating remote MediaStreams and MediaStreamTracks. |
| -class RemoteMediaStreamFactory { |
| - public: |
| - explicit RemoteMediaStreamFactory(rtc::Thread* signaling_thread) |
| - : signaling_thread_(signaling_thread) {} |
| - |
| - rtc::scoped_refptr<MediaStreamInterface> CreateMediaStream( |
| - const std::string& stream_label) { |
| - return MediaStreamProxy::Create(signaling_thread_, |
| - MediaStream::Create(stream_label)); |
| - } |
| - |
| - AudioTrackInterface* AddAudioTrack(uint32_t ssrc, |
| - AudioProviderInterface* provider, |
| - webrtc::MediaStreamInterface* stream, |
| - const std::string& track_id) { |
| - return AddTrack<AudioTrackInterface, AudioTrack, AudioTrackProxy>( |
| - stream, track_id, RemoteAudioSource::Create(ssrc, provider)); |
| - } |
| - |
| - private: |
| - template <typename TI, typename T, typename TP, typename S> |
| - TI* AddTrack(MediaStreamInterface* stream, |
| - const std::string& track_id, |
| - const S& source) { |
| - rtc::scoped_refptr<TI> track( |
| - TP::Create(signaling_thread_, T::Create(track_id, source))); |
| - track->set_state(webrtc::MediaStreamTrackInterface::kLive); |
| - if (stream->AddTrack(track)) { |
| - return track; |
| - } |
| - return nullptr; |
| - } |
| - |
| - rtc::Thread* signaling_thread_; |
| -}; |
| - |
| bool ExtractMediaSessionOptions( |
| const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options, |
| bool is_offer, |
| @@ -608,9 +571,6 @@ bool PeerConnection::Initialize( |
| media_controller_.reset(factory_->CreateMediaController(media_config)); |
| - remote_stream_factory_.reset( |
| - new RemoteMediaStreamFactory(factory_->signaling_thread())); |
| - |
| session_.reset( |
| new WebRtcSession(media_controller_.get(), factory_->signaling_thread(), |
| factory_->worker_thread(), port_allocator_.get())); |
| @@ -1320,29 +1280,28 @@ void PeerConnection::OnMessage(rtc::Message* msg) { |
| } |
| void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream, |
| - AudioTrackInterface* audio_track, |
| + const std::string& track_id, |
| uint32_t ssrc) { |
| receivers_.push_back(RtpReceiverProxy::Create( |
| signaling_thread(), |
| - new AudioRtpReceiver(audio_track, ssrc, session_.get()))); |
| + new AudioRtpReceiver(stream, track_id, ssrc, session_.get()))); |
| } |
| void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream, |
| const std::string& track_id, |
| uint32_t ssrc) { |
| - VideoRtpReceiver* video_receiver = new VideoRtpReceiver( |
| - stream, track_id, factory_->worker_thread(), ssrc, session_.get()); |
| - receivers_.push_back( |
| - RtpReceiverProxy::Create(signaling_thread(), video_receiver)); |
| + receivers_.push_back(RtpReceiverProxy::Create( |
| + signaling_thread(), |
| + new VideoRtpReceiver(stream, track_id, factory_->worker_thread(), ssrc, |
| + session_.get()))); |
| } |
| // TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote |
| // description. |
| -void PeerConnection::DestroyAudioReceiver(MediaStreamInterface* stream, |
| - AudioTrackInterface* audio_track) { |
| - auto it = FindReceiverForTrack(audio_track); |
| +void PeerConnection::DestroyReceiver(const std::string& track_id) { |
| + auto it = FindReceiverForTrack(track_id); |
| if (it == receivers_.end()) { |
| - LOG(LS_WARNING) << "RtpReceiver for track with id " << audio_track->id() |
| + LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id |
| << " doesn't exist."; |
| } else { |
| (*it)->Stop(); |
| @@ -1350,15 +1309,10 @@ void PeerConnection::DestroyAudioReceiver(MediaStreamInterface* stream, |
| } |
| } |
| -void PeerConnection::DestroyVideoReceiver(MediaStreamInterface* stream, |
| - VideoTrackInterface* video_track) { |
| - auto it = FindReceiverForTrack(video_track); |
| - if (it == receivers_.end()) { |
| - LOG(LS_WARNING) << "RtpReceiver for track with id " << video_track->id() |
| - << " doesn't exist."; |
| - } else { |
| - (*it)->Stop(); |
| - receivers_.erase(it); |
| +void PeerConnection::DestroyReceivers(cricket::MediaType media_type) { |
| + TrackInfos* current_tracks = GetRemoteTracks(media_type); |
| + for (const auto& track_info : *current_tracks) { |
| + DestroyReceiver(track_info.track_id); |
| } |
| } |
| @@ -1639,7 +1593,8 @@ void PeerConnection::UpdateRemoteStreamsList( |
| remote_streams_->find(stream_label); |
| if (!stream) { |
| // This is a new MediaStream. Create a new remote MediaStream. |
| - stream = remote_stream_factory_->CreateMediaStream(stream_label); |
| + stream = MediaStreamProxy::Create(rtc::Thread::Current(), |
| + MediaStream::Create(stream_label)); |
| remote_streams_->AddStream(stream); |
| new_streams->AddStream(stream); |
| } |
| @@ -1658,8 +1613,8 @@ void PeerConnection::UpdateRemoteStreamsList( |
| remote_streams_->find(kDefaultStreamLabel); |
| if (!default_stream) { |
| // Create the new default MediaStream. |
| - default_stream = |
| - remote_stream_factory_->CreateMediaStream(kDefaultStreamLabel); |
| + default_stream = MediaStreamProxy::Create( |
| + rtc::Thread::Current(), MediaStream::Create(kDefaultStreamLabel)); |
| remote_streams_->AddStream(default_stream); |
| new_streams->AddStream(default_stream); |
| } |
| @@ -1683,9 +1638,7 @@ void PeerConnection::OnRemoteTrackSeen(const std::string& stream_label, |
| MediaStreamInterface* stream = remote_streams_->find(stream_label); |
| if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
| - AudioTrackInterface* audio_track = remote_stream_factory_->AddAudioTrack( |
| - ssrc, session_.get(), stream, track_id); |
| - CreateAudioReceiver(stream, audio_track, ssrc); |
| + CreateAudioReceiver(stream, track_id, ssrc); |
| } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| CreateVideoReceiver(stream, track_id, ssrc); |
| } else { |
| @@ -1699,21 +1652,24 @@ void PeerConnection::OnRemoteTrackRemoved(const std::string& stream_label, |
| MediaStreamInterface* stream = remote_streams_->find(stream_label); |
| if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
| + // When the MediaEngine audio channel is destroyed, the RemoteAudioSource |
| + // will be notified which will end the AudioRtpReceiver::track(). |
| + DestroyReceiver(track_id); |
| rtc::scoped_refptr<AudioTrackInterface> audio_track = |
| stream->FindAudioTrack(track_id); |
| if (audio_track) { |
| - audio_track->set_state(webrtc::MediaStreamTrackInterface::kEnded); |
| stream->RemoveTrack(audio_track); |
| - DestroyAudioReceiver(stream, audio_track); |
| } |
| } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| + // Stopping or destroying a VideoRtpReceiver will end the |
| + // VideoRtpReceiver::track(). |
| + DestroyReceiver(track_id); |
| rtc::scoped_refptr<VideoTrackInterface> video_track = |
| stream->FindVideoTrack(track_id); |
| if (video_track) { |
| + // There's no guarantee the track is still available, e.g. the track may |
| + // have been removed from the stream by an application. |
| stream->RemoveTrack(video_track); |
| - // Stopping or destroying a VideoRtpReceiver will end the |
| - // VideoRtpReceiver::track(). |
| - DestroyVideoReceiver(stream, video_track); |
| } |
| } else { |
| ASSERT(false && "Invalid media type"); |
| @@ -1735,31 +1691,6 @@ void PeerConnection::UpdateEndedRemoteMediaStreams() { |
| } |
| } |
| -void PeerConnection::EndRemoteTracks(cricket::MediaType media_type) { |
| - TrackInfos* current_tracks = GetRemoteTracks(media_type); |
| - for (TrackInfos::iterator track_it = current_tracks->begin(); |
| - track_it != current_tracks->end(); ++track_it) { |
| - const TrackInfo& info = *track_it; |
| - MediaStreamInterface* stream = remote_streams_->find(info.stream_label); |
| - if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
| - AudioTrackInterface* track = stream->FindAudioTrack(info.track_id); |
| - // There's no guarantee the track is still available, e.g. the track may |
| - // have been removed from the stream by javascript. |
| - if (track) { |
| - track->set_state(webrtc::MediaStreamTrackInterface::kEnded); |
| - } |
| - } |
| - if (media_type == cricket::MEDIA_TYPE_VIDEO) { |
| - VideoTrackInterface* track = stream->FindVideoTrack(info.track_id); |
| - // There's no guarantee the track is still available, e.g. the track may |
| - // have been removed from the stream by javascript. |
| - if (track) { |
| - track->set_state(webrtc::MediaStreamTrackInterface::kEnded); |
| - } |
| - } |
| - } |
| -} |
| - |
| void PeerConnection::UpdateLocalTracks( |
| const std::vector<cricket::StreamParams>& streams, |
| cricket::MediaType media_type) { |
| @@ -2019,11 +1950,11 @@ void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) { |
| } |
| void PeerConnection::OnVoiceChannelDestroyed() { |
| - EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO); |
| + DestroyReceivers(cricket::MEDIA_TYPE_AUDIO); |
|
Taylor Brandstetter
2016/03/21 18:49:54
I don't think this should go so far as to destroy
perkj_webrtc
2016/03/22 16:59:54
Done.
|
| } |
| void PeerConnection::OnVideoChannelDestroyed() { |
| - EndRemoteTracks(cricket::MEDIA_TYPE_VIDEO); |
| + DestroyReceivers(cricket::MEDIA_TYPE_VIDEO); |
| } |
| void PeerConnection::OnDataChannelCreated() { |
| @@ -2081,11 +2012,11 @@ PeerConnection::FindSenderForTrack(MediaStreamTrackInterface* track) { |
| } |
| std::vector<rtc::scoped_refptr<RtpReceiverInterface>>::iterator |
| -PeerConnection::FindReceiverForTrack(MediaStreamTrackInterface* track) { |
| +PeerConnection::FindReceiverForTrack(const std::string& track_id) { |
| return std::find_if( |
| receivers_.begin(), receivers_.end(), |
| - [track](const rtc::scoped_refptr<RtpReceiverInterface>& receiver) { |
| - return receiver->track() == track; |
| + [track_id](const rtc::scoped_refptr<RtpReceiverInterface>& receiver) { |
| + return receiver->id() == track_id; |
| }); |
| } |