| Index: webrtc/api/peerconnection.cc
|
| diff --git a/webrtc/api/peerconnection.cc b/webrtc/api/peerconnection.cc
|
| index 691a512b6af158811e25c111c8662a8cb35328ed..b2b8062ca843a00015851e2f9a735d53e13fee0f 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,16 @@ 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::StopReceivers(cricket::MediaType media_type) {
|
| + TrackInfos* current_tracks = GetRemoteTracks(media_type);
|
| + for (const auto& track_info : *current_tracks) {
|
| + auto it = FindReceiverForTrack(track_info.track_id);
|
| + if (it == receivers_.end()) {
|
| + LOG(LS_WARNING) << "RtpReceiver for track with id " << track_info.track_id
|
| + << " doesn't exist.";
|
| + } else {
|
| + (*it)->Stop();
|
| + }
|
| }
|
| }
|
|
|
| @@ -1639,7 +1599,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 +1619,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 +1644,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 +1658,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 +1697,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 +1956,11 @@ void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) {
|
| }
|
|
|
| void PeerConnection::OnVoiceChannelDestroyed() {
|
| - EndRemoteTracks(cricket::MEDIA_TYPE_AUDIO);
|
| + StopReceivers(cricket::MEDIA_TYPE_AUDIO);
|
| }
|
|
|
| void PeerConnection::OnVideoChannelDestroyed() {
|
| - EndRemoteTracks(cricket::MEDIA_TYPE_VIDEO);
|
| + StopReceivers(cricket::MEDIA_TYPE_VIDEO);
|
| }
|
|
|
| void PeerConnection::OnDataChannelCreated() {
|
| @@ -2081,11 +2018,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;
|
| });
|
| }
|
|
|
|
|