Chromium Code Reviews| Index: talk/app/webrtc/peerconnection.cc | 
| diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc | 
| index caa892d00b9b04802c15908b04f97bd4ddf3cfb1..efdea66a0f5bc639abfe0f870da5e40b2668f7eb 100644 | 
| --- a/talk/app/webrtc/peerconnection.cc | 
| +++ b/talk/app/webrtc/peerconnection.cc | 
| @@ -1088,6 +1088,8 @@ void PeerConnection::SetRemoteDescription( | 
| const cricket::SessionDescription* remote_desc = desc->description(); | 
| + remote_info_.msid_supported |= remote_desc->msid_supported(); | 
| + | 
| // We wait to signal new streams until we finish processing the description, | 
| // since only at that point will new streams have all their tracks. | 
| rtc::scoped_refptr<StreamCollection> new_streams(StreamCollection::Create()); | 
| @@ -1098,6 +1100,7 @@ void PeerConnection::SetRemoteDescription( | 
| if (audio_content) { | 
| if (audio_content->rejected) { | 
| RemoveTracks(cricket::MEDIA_TYPE_AUDIO); | 
| + remote_info_.default_audio_track_needed = false; | 
| } else { | 
| const cricket::AudioContentDescription* desc = | 
| static_cast<const cricket::AudioContentDescription*>( | 
| @@ -1116,6 +1119,7 @@ void PeerConnection::SetRemoteDescription( | 
| if (video_content) { | 
| if (video_content->rejected) { | 
| RemoveTracks(cricket::MEDIA_TYPE_VIDEO); | 
| + remote_info_.default_video_track_needed = false; | 
| } else { | 
| const cricket::VideoContentDescription* desc = | 
| static_cast<const cricket::VideoContentDescription*>( | 
| @@ -1147,14 +1151,8 @@ void PeerConnection::SetRemoteDescription( | 
| observer_->OnAddStream(new_stream); | 
| } | 
| - // Find removed MediaStreams. | 
| - if (remote_info_.IsDefaultMediaStreamNeeded() && | 
| - remote_streams_->find(kDefaultStreamLabel) != nullptr) { | 
| - // The default media stream already exists. No need to do anything. | 
| - } else { | 
| - UpdateEndedRemoteMediaStreams(); | 
| - remote_info_.msid_supported |= remote_streams_->count() > 0; | 
| - } | 
| + MaybeRemoveDefaultTracks(); | 
| + UpdateEndedRemoteMediaStreams(); | 
| MaybeCreateDefaultStream(); | 
| SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer); | 
| @@ -1503,14 +1501,14 @@ void PeerConnection::UpdateRemoteStreamsList( | 
| TrackInfos* current_tracks = GetRemoteTracks(media_type); | 
| // Find removed tracks. I.e., tracks where the track id or ssrc don't match | 
| - // the | 
| - // new StreamParam. | 
| + // the new StreamParam. | 
| auto track_it = current_tracks->begin(); | 
| while (track_it != current_tracks->end()) { | 
| const TrackInfo& info = *track_it; | 
| const cricket::StreamParams* params = | 
| cricket::GetStreamBySsrc(streams, info.ssrc); | 
| - if (!params || params->id != info.track_id) { | 
| + if (info.stream_label != kDefaultStreamLabel && | 
| 
 
pthatcher1
2015/12/02 22:05:53
Would it be cleaner to put this inside of UpdateRe
 
 | 
| + (!params || params->id != info.track_id)) { | 
| OnRemoteTrackRemoved(info.stream_label, info.track_id, media_type); | 
| track_it = current_tracks->erase(track_it); | 
| } else { | 
| @@ -1533,6 +1531,9 @@ void PeerConnection::UpdateRemoteStreamsList( | 
| stream = remote_stream_factory_->CreateMediaStream(stream_label); | 
| remote_streams_->AddStream(stream); | 
| new_streams->AddStream(stream); | 
| + // Just in case the peer supports MSID, but doesn't indicate so with | 
| + // "a=msid-semantic"... | 
| + remote_info_.msid_supported = true; | 
| } | 
| const TrackInfo* track_info = | 
| @@ -1604,6 +1605,40 @@ void PeerConnection::UpdateEndedRemoteMediaStreams() { | 
| } | 
| } | 
| +void PeerConnection::MaybeRemoveDefaultTracks() { | 
| + rtc::scoped_refptr<MediaStreamInterface> default_remote_stream = | 
| + remote_streams_->find(kDefaultStreamLabel); | 
| + if (!default_remote_stream) { | 
| + return; | 
| + } | 
| + | 
| + if ((!remote_info_.IsDefaultMediaStreamNeeded() || | 
| + !remote_info_.default_audio_track_needed) && | 
| + default_remote_stream->GetAudioTracks().size() > 0) { | 
| + auto it = | 
| + std::find(remote_audio_tracks_.begin(), remote_audio_tracks_.end(), | 
| + TrackInfo(kDefaultStreamLabel, kDefaultAudioTrackLabel, 0)); | 
| + if (it != remote_audio_tracks_.end()) { | 
| + OnRemoteTrackRemoved(kDefaultStreamLabel, kDefaultAudioTrackLabel, | 
| + cricket::MEDIA_TYPE_AUDIO); | 
| + remote_audio_tracks_.erase(it); | 
| + } | 
| + } | 
| + | 
| + if ((!remote_info_.IsDefaultMediaStreamNeeded() || | 
| + !remote_info_.default_video_track_needed) && | 
| + default_remote_stream->GetVideoTracks().size() > 0) { | 
| + auto it = | 
| + std::find(remote_video_tracks_.begin(), remote_video_tracks_.end(), | 
| + TrackInfo(kDefaultStreamLabel, kDefaultVideoTrackLabel, 0)); | 
| + if (it != remote_video_tracks_.end()) { | 
| + OnRemoteTrackRemoved(kDefaultStreamLabel, kDefaultVideoTrackLabel, | 
| + cricket::MEDIA_TYPE_VIDEO); | 
| + remote_video_tracks_.erase(it); | 
| + } | 
| + } | 
| +} | 
| + | 
| void PeerConnection::MaybeCreateDefaultStream() { | 
| if (!remote_info_.IsDefaultMediaStreamNeeded()) { | 
| return; |