diff options
author | wu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-01-23 22:12:45 +0000 |
---|---|---|
committer | wu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-01-23 22:12:45 +0000 |
commit | 1b5713169ff3f21791214c4500e5d775048c3ba9 (patch) | |
tree | e4ecde34ce092d72f36ecb6c7bf09c7486aeeeb7 /app | |
parent | da972775f11f2dea29ee8538776299aa6fdd1d9d (diff) | |
download | talk-1b5713169ff3f21791214c4500e5d775048c3ba9.tar.gz |
Update talk to 60094938.
Review URL: https://webrtc-codereview.appspot.com/7489005
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@5420 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'app')
-rw-r--r-- | app/webrtc/mediastreamsignaling.cc | 103 | ||||
-rw-r--r-- | app/webrtc/mediastreamsignaling.h | 10 | ||||
-rw-r--r-- | app/webrtc/mediastreamsignaling_unittest.cc | 81 | ||||
-rw-r--r-- | app/webrtc/peerconnectionfactory.cc | 8 | ||||
-rw-r--r-- | app/webrtc/peerconnectionfactory.h | 4 | ||||
-rw-r--r-- | app/webrtc/peerconnectioninterface.h | 6 |
6 files changed, 134 insertions, 78 deletions
diff --git a/app/webrtc/mediastreamsignaling.cc b/app/webrtc/mediastreamsignaling.cc index 89129ac..610b3f8 100644 --- a/app/webrtc/mediastreamsignaling.cc +++ b/app/webrtc/mediastreamsignaling.cc @@ -295,24 +295,24 @@ bool MediaStreamSignaling::AddLocalStream(MediaStreamInterface* local_stream) { AudioTrackVector audio_tracks = local_stream->GetAudioTracks(); for (AudioTrackVector::const_iterator it = audio_tracks.begin(); it != audio_tracks.end(); ++it) { - TrackInfos::const_iterator track_info_it = - local_audio_tracks_.find((*it)->id()); - if (track_info_it != local_audio_tracks_.end()) { - const TrackInfo& info = track_info_it->second; - OnLocalTrackSeen(info.stream_label, info.track_id, info.ssrc, - cricket::MEDIA_TYPE_AUDIO); + const TrackInfo* track_info = FindTrackInfo(local_audio_tracks_, + local_stream->label(), + (*it)->id()); + if (track_info) { + OnLocalTrackSeen(track_info->stream_label, track_info->track_id, + track_info->ssrc, cricket::MEDIA_TYPE_AUDIO); } } VideoTrackVector video_tracks = local_stream->GetVideoTracks(); for (VideoTrackVector::const_iterator it = video_tracks.begin(); it != video_tracks.end(); ++it) { - TrackInfos::const_iterator track_info_it = - local_video_tracks_.find((*it)->id()); - if (track_info_it != local_video_tracks_.end()) { - const TrackInfo& info = track_info_it->second; - OnLocalTrackSeen(info.stream_label, info.track_id, info.ssrc, - cricket::MEDIA_TYPE_VIDEO); + const TrackInfo* track_info = FindTrackInfo(local_video_tracks_, + local_stream->label(), + (*it)->id()); + if (track_info) { + OnLocalTrackSeen(track_info->stream_label, track_info->track_id, + track_info->ssrc, cricket::MEDIA_TYPE_VIDEO); } } return true; @@ -321,6 +321,7 @@ bool MediaStreamSignaling::AddLocalStream(MediaStreamInterface* local_stream) { void MediaStreamSignaling::RemoveLocalStream( MediaStreamInterface* local_stream) { local_streams_->RemoveStream(local_stream); + stream_observer_->OnRemoveLocalStream(local_stream); } @@ -474,28 +475,6 @@ void MediaStreamSignaling::OnDataChannelClose() { } } -bool MediaStreamSignaling::GetRemoteAudioTrackSsrc( - const std::string& track_id, uint32* ssrc) const { - TrackInfos::const_iterator it = remote_audio_tracks_.find(track_id); - if (it == remote_audio_tracks_.end()) { - return false; - } - - *ssrc = it->second.ssrc; - return true; -} - -bool MediaStreamSignaling::GetRemoteVideoTrackSsrc( - const std::string& track_id, uint32* ssrc) const { - TrackInfos::const_iterator it = remote_video_tracks_.find(track_id); - if (it == remote_video_tracks_.end()) { - return false; - } - - *ssrc = it->second.ssrc; - return true; -} - void MediaStreamSignaling::UpdateSessionOptions() { options_.streams.clear(); if (local_streams_ != NULL) { @@ -554,12 +533,12 @@ void MediaStreamSignaling::UpdateRemoteStreamsList( // new StreamParam. TrackInfos::iterator track_it = current_tracks->begin(); while (track_it != current_tracks->end()) { - TrackInfo info = track_it->second; + const TrackInfo& info = *track_it; cricket::StreamParams params; if (!cricket::GetStreamBySsrc(streams, info.ssrc, ¶ms) || params.id != info.track_id) { OnRemoteTrackRemoved(info.stream_label, info.track_id, media_type); - current_tracks->erase(track_it++); + track_it = current_tracks->erase(track_it); } else { ++track_it; } @@ -583,10 +562,10 @@ void MediaStreamSignaling::UpdateRemoteStreamsList( new_streams->AddStream(stream); } - TrackInfos::iterator track_it = current_tracks->find(track_id); - if (track_it == current_tracks->end()) { - (*current_tracks)[track_id] = - TrackInfo(stream_label, track_id, ssrc); + const TrackInfo* track_info = FindTrackInfo(*current_tracks, stream_label, + track_id); + if (!track_info) { + current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); OnRemoteTrackSeen(stream_label, track_id, it->first_ssrc(), media_type); } } @@ -642,7 +621,7 @@ void MediaStreamSignaling::RejectRemoteTracks(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) { - TrackInfo info = track_it->second; + 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); @@ -695,15 +674,16 @@ void MediaStreamSignaling::MaybeCreateDefaultStream() { } if (remote_info_.default_audio_track_needed && default_remote_stream->GetAudioTracks().size() == 0) { - remote_audio_tracks_[kDefaultAudioTrackLabel] = - TrackInfo(kDefaultStreamLabel, kDefaultAudioTrackLabel, 0); + remote_audio_tracks_.push_back(TrackInfo(kDefaultStreamLabel, + kDefaultAudioTrackLabel, 0)); + OnRemoteTrackSeen(kDefaultStreamLabel, kDefaultAudioTrackLabel, 0, cricket::MEDIA_TYPE_AUDIO); } if (remote_info_.default_video_track_needed && default_remote_stream->GetVideoTracks().size() == 0) { - remote_video_tracks_[kDefaultVideoTrackLabel] = - TrackInfo(kDefaultStreamLabel, kDefaultVideoTrackLabel, 0); + remote_video_tracks_.push_back(TrackInfo(kDefaultStreamLabel, + kDefaultVideoTrackLabel, 0)); OnRemoteTrackSeen(kDefaultStreamLabel, kDefaultVideoTrackLabel, 0, cricket::MEDIA_TYPE_VIDEO); } @@ -736,16 +716,16 @@ void MediaStreamSignaling::UpdateLocalTracks( cricket::MediaType media_type) { TrackInfos* current_tracks = GetLocalTracks(media_type); - // Find removed tracks. Ie tracks where the track id or ssrc don't match the - // new StreamParam. + // Find removed tracks. Ie tracks where the track id, stream label or ssrc + // don't match the new StreamParam. TrackInfos::iterator track_it = current_tracks->begin(); while (track_it != current_tracks->end()) { - TrackInfo info = track_it->second; + const TrackInfo& info = *track_it; cricket::StreamParams params; if (!cricket::GetStreamBySsrc(streams, info.ssrc, ¶ms) || - params.id != info.track_id) { + params.id != info.track_id || params.sync_label != info.stream_label) { OnLocalTrackRemoved(info.stream_label, info.track_id, media_type); - current_tracks->erase(track_it++); + track_it = current_tracks->erase(track_it); } else { ++track_it; } @@ -759,10 +739,11 @@ void MediaStreamSignaling::UpdateLocalTracks( const std::string& stream_label = it->sync_label; const std::string& track_id = it->id; uint32 ssrc = it->first_ssrc(); - TrackInfos::iterator track_it = current_tracks->find(track_id); - if (track_it == current_tracks->end()) { - (*current_tracks)[track_id] = - TrackInfo(stream_label, track_id, ssrc); + const TrackInfo* track_info = FindTrackInfo(*current_tracks, + stream_label, + track_id); + if (!track_info) { + current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc)); OnLocalTrackSeen(stream_label, track_id, it->first_ssrc(), media_type); } @@ -948,4 +929,18 @@ void MediaStreamSignaling::OnDtlsRoleReadyForSctp(talk_base::SSLRole role) { } } +const MediaStreamSignaling::TrackInfo* +MediaStreamSignaling::FindTrackInfo( + const MediaStreamSignaling::TrackInfos& infos, + const std::string& stream_label, + const std::string track_id) const { + + for (TrackInfos::const_iterator it = infos.begin(); + it != infos.end(); ++it) { + if (it->stream_label == stream_label && it->track_id == track_id) + return &*it; + } + return NULL; +} + } // namespace webrtc diff --git a/app/webrtc/mediastreamsignaling.h b/app/webrtc/mediastreamsignaling.h index 6c54f40..c730b46 100644 --- a/app/webrtc/mediastreamsignaling.h +++ b/app/webrtc/mediastreamsignaling.h @@ -238,10 +238,6 @@ class MediaStreamSignaling { // Called when the data channel closes. void OnDataChannelClose(); - // Returns the SSRC for a given track. - bool GetRemoteAudioTrackSsrc(const std::string& track_id, uint32* ssrc) const; - bool GetRemoteVideoTrackSsrc(const std::string& track_id, uint32* ssrc) const; - // Returns all current known local MediaStreams. StreamCollectionInterface* local_streams() const { return local_streams_;} @@ -287,7 +283,7 @@ class MediaStreamSignaling { std::string track_id; uint32 ssrc; }; - typedef std::map<std::string, TrackInfo> TrackInfos; + typedef std::vector<TrackInfo> TrackInfos; void UpdateSessionOptions(); @@ -366,6 +362,10 @@ class MediaStreamSignaling { const std::vector<std::string>& active_channels, bool is_local_update); void CreateRemoteDataChannel(const std::string& label, uint32 remote_ssrc); + const TrackInfo* FindTrackInfo(const TrackInfos& infos, + const std::string& stream_label, + const std::string track_id) const; + RemotePeerInfo remote_info_; talk_base::Thread* signaling_thread_; DataChannelFactory* data_channel_factory_; diff --git a/app/webrtc/mediastreamsignaling_unittest.cc b/app/webrtc/mediastreamsignaling_unittest.cc index 6debcfd..49625ef 100644 --- a/app/webrtc/mediastreamsignaling_unittest.cc +++ b/app/webrtc/mediastreamsignaling_unittest.cc @@ -26,6 +26,7 @@ */ #include <string> +#include <vector> #include "talk/app/webrtc/audiotrack.h" #include "talk/app/webrtc/mediastream.h" @@ -383,31 +384,48 @@ class MockSignalingObserver : public webrtc::MediaStreamSignalingObserver { std::string track_id; uint32 ssrc; }; - typedef std::map<std::string, TrackInfo> TrackInfos; + typedef std::vector<TrackInfo> TrackInfos; void AddTrack(TrackInfos* track_infos, MediaStreamInterface* stream, MediaStreamTrackInterface* track, uint32 ssrc) { - (*track_infos)[track->id()] = TrackInfo(stream->label(), track->id(), - ssrc); + (*track_infos).push_back(TrackInfo(stream->label(), track->id(), + ssrc)); } void RemoveTrack(TrackInfos* track_infos, MediaStreamInterface* stream, MediaStreamTrackInterface* track) { - TrackInfos::iterator it = track_infos->find(track->id()); - ASSERT_TRUE(it != track_infos->end()); - ASSERT_EQ(it->second.stream_label, stream->label()); - track_infos->erase(it); + for (TrackInfos::iterator it = track_infos->begin(); + it != track_infos->end(); ++it) { + if (it->stream_label == stream->label() && it->track_id == track->id()) { + track_infos->erase(it); + return; + } + } + ADD_FAILURE(); + } + + const TrackInfo* FindTrackInfo(const TrackInfos& infos, + const std::string& stream_label, + const std::string track_id) const { + for (TrackInfos::const_iterator it = infos.begin(); + it != infos.end(); ++it) { + if (it->stream_label == stream_label && it->track_id == track_id) + return &*it; + } + return NULL; } + void VerifyTrack(const TrackInfos& track_infos, const std::string& stream_label, const std::string& track_id, uint32 ssrc) { - TrackInfos::const_iterator it = track_infos.find(track_id); - ASSERT_TRUE(it != track_infos.end()); - EXPECT_EQ(stream_label, it->second.stream_label); - EXPECT_EQ(ssrc, it->second.ssrc); + const TrackInfo* track_info = FindTrackInfo(track_infos, + stream_label, + track_id); + ASSERT_TRUE(track_info != NULL); + EXPECT_EQ(ssrc, track_info->ssrc); } TrackInfos remote_audio_tracks_; @@ -1051,6 +1069,47 @@ TEST_F(MediaStreamSignalingTest, ChangeSsrcOnTrackInLocalSessionDescription) { observer_->VerifyLocalVideoTrack(kStreams[0], kVideoTracks[0], 98); } +// This test that the correct MediaStreamSignalingObserver methods are called +// if a new session description is set with the same tracks but they are now +// sent on a another MediaStream. +TEST_F(MediaStreamSignalingTest, SignalSameTracksInSeparateMediaStream) { + talk_base::scoped_ptr<SessionDescriptionInterface> desc; + CreateSessionDescriptionAndReference(1, 1, desc.use()); + + signaling_->AddLocalStream(reference_collection_->at(0)); + signaling_->OnLocalDescriptionChanged(desc.get()); + EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); + EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); + + std::string stream_label_0 = kStreams[0]; + observer_->VerifyLocalAudioTrack(stream_label_0, kAudioTracks[0], 1); + observer_->VerifyLocalVideoTrack(stream_label_0, kVideoTracks[0], 2); + + // Add a new MediaStream but with the same tracks as in the first stream. + std::string stream_label_1 = kStreams[1]; + talk_base::scoped_refptr<webrtc::MediaStreamInterface> stream_1( + webrtc::MediaStream::Create(kStreams[1])); + stream_1->AddTrack(reference_collection_->at(0)->GetVideoTracks()[0]); + stream_1->AddTrack(reference_collection_->at(0)->GetAudioTracks()[0]); + signaling_->AddLocalStream(stream_1); + + // Replace msid in the original SDP. + std::string sdp; + desc->ToString(&sdp); + talk_base::replace_substrs( + kStreams[0], strlen(kStreams[0]), kStreams[1], strlen(kStreams[1]), &sdp); + + talk_base::scoped_ptr<SessionDescriptionInterface> updated_desc( + webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, + sdp, NULL)); + + signaling_->OnLocalDescriptionChanged(updated_desc.get()); + observer_->VerifyLocalAudioTrack(kStreams[1], kAudioTracks[0], 1); + observer_->VerifyLocalVideoTrack(kStreams[1], kVideoTracks[0], 2); + EXPECT_EQ(1u, observer_->NumberOfLocalAudioTracks()); + EXPECT_EQ(1u, observer_->NumberOfLocalVideoTracks()); +} + // Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for // SSL_SERVER. TEST_F(MediaStreamSignalingTest, SctpIdAllocationBasedOnRole) { diff --git a/app/webrtc/peerconnectionfactory.cc b/app/webrtc/peerconnectionfactory.cc index ee15b5d..dc14bfb 100644 --- a/app/webrtc/peerconnectionfactory.cc +++ b/app/webrtc/peerconnectionfactory.cc @@ -106,10 +106,10 @@ struct CreateVideoSourceParams : public talk_base::MessageData { }; struct StartAecDumpParams : public talk_base::MessageData { - explicit StartAecDumpParams(FILE* aec_dump_file) + explicit StartAecDumpParams(talk_base::PlatformFile aec_dump_file) : aec_dump_file(aec_dump_file) { } - FILE* aec_dump_file; + talk_base::PlatformFile aec_dump_file; bool result; }; @@ -289,7 +289,7 @@ PeerConnectionFactory::CreateVideoSource_s( return VideoSourceProxy::Create(signaling_thread_, source); } -bool PeerConnectionFactory::StartAecDump_s(FILE* file) { +bool PeerConnectionFactory::StartAecDump_s(talk_base::PlatformFile file) { return channel_manager_->StartAecDump(file); } @@ -380,7 +380,7 @@ scoped_refptr<AudioTrackInterface> PeerConnectionFactory::CreateAudioTrack( return AudioTrackProxy::Create(signaling_thread_, track); } -bool PeerConnectionFactory::StartAecDump(FILE* file) { +bool PeerConnectionFactory::StartAecDump(talk_base::PlatformFile file) { StartAecDumpParams params(file); signaling_thread_->Send(this, MSG_START_AEC_DUMP, ¶ms); return params.result; diff --git a/app/webrtc/peerconnectionfactory.h b/app/webrtc/peerconnectionfactory.h index 63d37f0..46b095f 100644 --- a/app/webrtc/peerconnectionfactory.h +++ b/app/webrtc/peerconnectionfactory.h @@ -78,7 +78,7 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface, CreateAudioTrack(const std::string& id, AudioSourceInterface* audio_source); - virtual bool StartAecDump(FILE* file); + virtual bool StartAecDump(talk_base::PlatformFile file); virtual cricket::ChannelManager* channel_manager(); virtual talk_base::Thread* signaling_thread(); @@ -109,7 +109,7 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface, PortAllocatorFactoryInterface* allocator_factory, DTLSIdentityServiceInterface* dtls_identity_service, PeerConnectionObserver* observer); - bool StartAecDump_s(FILE* file); + bool StartAecDump_s(talk_base::PlatformFile file); // Implements talk_base::MessageHandler. void OnMessage(talk_base::Message* msg); diff --git a/app/webrtc/peerconnectioninterface.h b/app/webrtc/peerconnectioninterface.h index d24c9a9..667774e 100644 --- a/app/webrtc/peerconnectioninterface.h +++ b/app/webrtc/peerconnectioninterface.h @@ -76,6 +76,7 @@ #include "talk/app/webrtc/jsep.h" #include "talk/app/webrtc/mediastreaminterface.h" #include "talk/app/webrtc/statstypes.h" +#include "talk/base/fileutils.h" #include "talk/base/socketaddress.h" namespace talk_base { @@ -442,9 +443,10 @@ class PeerConnectionFactoryInterface : public talk_base::RefCountInterface { // Starts AEC dump using existing file. Takes ownership of |file| and passes // it on to VoiceEngine (via other objects) immediately, which will take - // the ownerhip. + // the ownerhip. If the operation fails, the file will be closed. // TODO(grunell): Remove when Chromium has started to use AEC in each source. - virtual bool StartAecDump(FILE* file) = 0; + // http://crbug.com/264611. + virtual bool StartAecDump(talk_base::PlatformFile file) = 0; protected: // Dtor and ctor protected as objects shouldn't be created or deleted via |