summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorwu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-01-23 22:12:45 +0000
committerwu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2014-01-23 22:12:45 +0000
commit1b5713169ff3f21791214c4500e5d775048c3ba9 (patch)
treee4ecde34ce092d72f36ecb6c7bf09c7486aeeeb7 /app
parentda972775f11f2dea29ee8538776299aa6fdd1d9d (diff)
downloadtalk-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.cc103
-rw-r--r--app/webrtc/mediastreamsignaling.h10
-rw-r--r--app/webrtc/mediastreamsignaling_unittest.cc81
-rw-r--r--app/webrtc/peerconnectionfactory.cc8
-rw-r--r--app/webrtc/peerconnectionfactory.h4
-rw-r--r--app/webrtc/peerconnectioninterface.h6
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, &params) ||
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, &params) ||
- 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, &params);
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