diff options
author | wu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-10-25 21:18:33 +0000 |
---|---|---|
committer | wu@webrtc.org <wu@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-10-25 21:18:33 +0000 |
commit | 5c9dd59107e049112f2e9a62d08a02ef4448a957 (patch) | |
tree | 3e9e0948f11342e546caae9591447068ac03c6f3 /app | |
parent | 95cabf5e0fa2507d360c2306433ce918ef484cfd (diff) | |
download | talk-5c9dd59107e049112f2e9a62d08a02ef4448a957.tar.gz |
Update libjingle to 55618622.
Update libyuv to r826.
TEST=try bots
R=niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/2889004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@5038 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'app')
-rw-r--r-- | app/webrtc/localaudiosource.cc | 20 | ||||
-rw-r--r-- | app/webrtc/localaudiosource.h | 5 | ||||
-rw-r--r-- | app/webrtc/localaudiosource_unittest.cc | 16 | ||||
-rw-r--r-- | app/webrtc/mediaconstraintsinterface.h | 6 | ||||
-rw-r--r-- | app/webrtc/mediastreamsignaling.cc | 4 | ||||
-rw-r--r-- | app/webrtc/peerconnection.cc | 3 | ||||
-rw-r--r-- | app/webrtc/peerconnection_unittest.cc | 4 | ||||
-rw-r--r-- | app/webrtc/peerconnectionfactory.cc | 2 | ||||
-rw-r--r-- | app/webrtc/peerconnectionfactory.h | 6 | ||||
-rw-r--r-- | app/webrtc/peerconnectioninterface.h | 13 | ||||
-rw-r--r-- | app/webrtc/statscollector.cc | 115 | ||||
-rw-r--r-- | app/webrtc/statscollector.h | 13 | ||||
-rw-r--r-- | app/webrtc/statscollector_unittest.cc | 197 | ||||
-rw-r--r-- | app/webrtc/statstypes.h | 11 | ||||
-rw-r--r-- | app/webrtc/test/fakeconstraints.h | 1 | ||||
-rw-r--r-- | app/webrtc/webrtcsdp_unittest.cc | 4 | ||||
-rw-r--r-- | app/webrtc/webrtcsession.cc | 21 | ||||
-rw-r--r-- | app/webrtc/webrtcsession.h | 3 | ||||
-rw-r--r-- | app/webrtc/webrtcsession_unittest.cc | 41 |
19 files changed, 344 insertions, 141 deletions
diff --git a/app/webrtc/localaudiosource.cc b/app/webrtc/localaudiosource.cc index 3663aac..2cd472a 100644 --- a/app/webrtc/localaudiosource.cc +++ b/app/webrtc/localaudiosource.cc @@ -53,7 +53,9 @@ const char MediaConstraintsInterface::kHighpassFilter[] = "googHighpassFilter"; const char MediaConstraintsInterface::kTypingNoiseDetection[] = "googTypingNoiseDetection"; -const char MediaConstraintsInterface::kInternalAecDump[] = "internalAecDump"; +const char MediaConstraintsInterface::kAudioMirroring[] = "googAudioMirroring"; +// TODO(perkj): Remove kInternalAecDump once its not used by Chrome. +const char MediaConstraintsInterface::kInternalAecDump[] = "deprecatedAecDump"; namespace { @@ -90,10 +92,10 @@ bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints, options->noise_suppression.Set(value); else if (iter->key == MediaConstraintsInterface::kHighpassFilter) options->highpass_filter.Set(value); - else if (iter->key == MediaConstraintsInterface::kInternalAecDump) - options->aec_dump.Set(value); else if (iter->key == MediaConstraintsInterface::kTypingNoiseDetection) options->typing_detection.Set(value); + else if (iter->key == MediaConstraintsInterface::kAudioMirroring) + options->stereo_swapping.Set(value); else success = false; } @@ -103,14 +105,16 @@ bool FromConstraints(const MediaConstraintsInterface::Constraints& constraints, } // namespace talk_base::scoped_refptr<LocalAudioSource> LocalAudioSource::Create( + const PeerConnectionFactoryInterface::Options& options, const MediaConstraintsInterface* constraints) { talk_base::scoped_refptr<LocalAudioSource> source( new talk_base::RefCountedObject<LocalAudioSource>()); - source->Initialize(constraints); + source->Initialize(options, constraints); return source; } void LocalAudioSource::Initialize( + const PeerConnectionFactoryInterface::Options& options, const MediaConstraintsInterface* constraints) { if (!constraints) return; @@ -119,12 +123,14 @@ void LocalAudioSource::Initialize( // constraints. FromConstraints(constraints->GetOptional(), &options_); - cricket::AudioOptions options; - if (!FromConstraints(constraints->GetMandatory(), &options)) { + cricket::AudioOptions audio_options; + if (!FromConstraints(constraints->GetMandatory(), &audio_options)) { source_state_ = kEnded; return; } - options_.SetAll(options); + options_.SetAll(audio_options); + if (options.enable_aec_dump) + options_.aec_dump.Set(true); source_state_ = kLive; } diff --git a/app/webrtc/localaudiosource.h b/app/webrtc/localaudiosource.h index e0fda03..fb769ed 100644 --- a/app/webrtc/localaudiosource.h +++ b/app/webrtc/localaudiosource.h @@ -30,6 +30,7 @@ #include "talk/app/webrtc/mediastreaminterface.h" #include "talk/app/webrtc/notifier.h" +#include "talk/app/webrtc/peerconnectioninterface.h" #include "talk/base/scoped_ptr.h" #include "talk/media/base/mediachannel.h" @@ -44,6 +45,7 @@ class LocalAudioSource : public Notifier<AudioSourceInterface> { public: // Creates an instance of LocalAudioSource. static talk_base::scoped_refptr<LocalAudioSource> Create( + const PeerConnectionFactoryInterface::Options& options, const MediaConstraintsInterface* constraints); virtual SourceState state() const { return source_state_; } @@ -58,7 +60,8 @@ class LocalAudioSource : public Notifier<AudioSourceInterface> { } private: - void Initialize(const MediaConstraintsInterface* constraints); + void Initialize(const PeerConnectionFactoryInterface::Options& options, + const MediaConstraintsInterface* constraints); cricket::AudioOptions options_; SourceState source_state_; diff --git a/app/webrtc/localaudiosource_unittest.cc b/app/webrtc/localaudiosource_unittest.cc index ae07787..f8880e0 100644 --- a/app/webrtc/localaudiosource_unittest.cc +++ b/app/webrtc/localaudiosource_unittest.cc @@ -39,6 +39,7 @@ using webrtc::LocalAudioSource; using webrtc::MediaConstraintsInterface; using webrtc::MediaSourceInterface; +using webrtc::PeerConnectionFactoryInterface; TEST(LocalAudioSourceTest, SetValidOptions) { webrtc::FakeConstraints constraints; @@ -52,7 +53,8 @@ TEST(LocalAudioSourceTest, SetValidOptions) { constraints.AddOptional(MediaConstraintsInterface::kHighpassFilter, true); talk_base::scoped_refptr<LocalAudioSource> source = - LocalAudioSource::Create(&constraints); + LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), + &constraints); bool value; EXPECT_TRUE(source->options().echo_cancellation.Get(&value)); @@ -72,7 +74,8 @@ TEST(LocalAudioSourceTest, SetValidOptions) { TEST(LocalAudioSourceTest, OptionNotSet) { webrtc::FakeConstraints constraints; talk_base::scoped_refptr<LocalAudioSource> source = - LocalAudioSource::Create(&constraints); + LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), + &constraints); bool value; EXPECT_FALSE(source->options().highpass_filter.Get(&value)); } @@ -83,7 +86,8 @@ TEST(LocalAudioSourceTest, MandatoryOverridesOptional) { constraints.AddOptional(MediaConstraintsInterface::kEchoCancellation, true); talk_base::scoped_refptr<LocalAudioSource> source = - LocalAudioSource::Create(&constraints); + LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), + &constraints); bool value; EXPECT_TRUE(source->options().echo_cancellation.Get(&value)); @@ -96,7 +100,8 @@ TEST(LocalAudioSourceTest, InvalidOptional) { constraints.AddOptional("invalidKey", false); talk_base::scoped_refptr<LocalAudioSource> source = - LocalAudioSource::Create(&constraints); + LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), + &constraints); EXPECT_EQ(MediaSourceInterface::kLive, source->state()); bool value; @@ -110,7 +115,8 @@ TEST(LocalAudioSourceTest, InvalidMandatory) { constraints.AddMandatory("invalidKey", false); talk_base::scoped_refptr<LocalAudioSource> source = - LocalAudioSource::Create(&constraints); + LocalAudioSource::Create(PeerConnectionFactoryInterface::Options(), + &constraints); EXPECT_EQ(MediaSourceInterface::kEnded, source->state()); bool value; diff --git a/app/webrtc/mediaconstraintsinterface.h b/app/webrtc/mediaconstraintsinterface.h index 48022dd..97d5cf6 100644 --- a/app/webrtc/mediaconstraintsinterface.h +++ b/app/webrtc/mediaconstraintsinterface.h @@ -81,6 +81,7 @@ class MediaConstraintsInterface { static const char kNoiseSuppression[]; // googNoiseSuppression static const char kHighpassFilter[]; // googHighpassFilter static const char kTypingNoiseDetection[]; // googTypingNoiseDetection + static const char kAudioMirroring[]; // googAudioMirroring // Google-specific constraint keys for a local video source static const char kNoiseReduction[]; // googNoiseReduction @@ -106,6 +107,8 @@ class MediaConstraintsInterface { static const char kEnableDtlsSrtp[]; // Enable DTLS-SRTP // Temporary pseudo-constraints used to enable DataChannels static const char kEnableRtpDataChannels[]; // Enable RTP DataChannels + // TODO(perkj): Remove kEnableSctpDataChannels once Chrome use + // PeerConnectionFactory::SetOptions. static const char kEnableSctpDataChannels[]; // Enable SCTP DataChannels // The prefix of internal-only constraints whose JS set values should be @@ -116,9 +119,8 @@ class MediaConstraintsInterface { // line flags. So they are prefixed with "internal" so JS values will be // removed. // Used by a local audio source. + // TODO(perkj): Remove once Chrome use PeerConnectionFactory::SetOptions. static const char kInternalAecDump[]; // internalAecDump - // Used for disabling security and use plain RTP. - static const char kInternalDisableEncryption[]; // internalDisableEncryption protected: // Dtor protected as objects shouldn't be deleted via this interface diff --git a/app/webrtc/mediastreamsignaling.cc b/app/webrtc/mediastreamsignaling.cc index 771a4e8..ef9f3e0 100644 --- a/app/webrtc/mediastreamsignaling.cc +++ b/app/webrtc/mediastreamsignaling.cc @@ -267,6 +267,10 @@ bool MediaStreamSignaling::AddDataChannelFromOpenMessage( } scoped_refptr<DataChannel> channel( data_channel_factory_->CreateDataChannel(label, &config)); + if (!channel.get()) { + LOG(LS_ERROR) << "Failed to create DataChannel from the OPEN message."; + return false; + } data_channels_[label] = channel; stream_observer_->OnAddDataChannel(channel); // It's immediately ready to use. diff --git a/app/webrtc/peerconnection.cc b/app/webrtc/peerconnection.cc index 7fafad7..de88f88 100644 --- a/app/webrtc/peerconnection.cc +++ b/app/webrtc/peerconnection.cc @@ -317,7 +317,8 @@ bool PeerConnection::DoInitialize( stats_.set_session(session_.get()); // Initialize the WebRtcSession. It creates transport channels etc. - if (!session_->Initialize(constraints, dtls_identity_service)) + if (!session_->Initialize(factory_->options(), constraints, + dtls_identity_service)) return false; // Register PeerConnection as receiver of local ice candidates. diff --git a/app/webrtc/peerconnection_unittest.cc b/app/webrtc/peerconnection_unittest.cc index 9de6ec9..76d9cd7 100644 --- a/app/webrtc/peerconnection_unittest.cc +++ b/app/webrtc/peerconnection_unittest.cc @@ -157,8 +157,8 @@ class PeerConnectionTestClientBase // Disable highpass filter so that we can get all the test audio frames. constraints.AddMandatory( MediaConstraintsInterface::kHighpassFilter, false); - talk_base::scoped_refptr<webrtc::LocalAudioSource> source = - webrtc::LocalAudioSource::Create(&constraints); + talk_base::scoped_refptr<webrtc::AudioSourceInterface> source = + peer_connection_factory_->CreateAudioSource(&constraints); // TODO(perkj): Test audio source when it is implemented. Currently audio // always use the default input. talk_base::scoped_refptr<webrtc::AudioTrackInterface> audio_track( diff --git a/app/webrtc/peerconnectionfactory.cc b/app/webrtc/peerconnectionfactory.cc index 7d30fab..e8b8f63 100644 --- a/app/webrtc/peerconnectionfactory.cc +++ b/app/webrtc/peerconnectionfactory.cc @@ -261,7 +261,7 @@ talk_base::scoped_refptr<AudioSourceInterface> PeerConnectionFactory::CreateAudioSource_s( const MediaConstraintsInterface* constraints) { talk_base::scoped_refptr<LocalAudioSource> source( - LocalAudioSource::Create(constraints)); + LocalAudioSource::Create(options_, constraints)); return source; } diff --git a/app/webrtc/peerconnectionfactory.h b/app/webrtc/peerconnectionfactory.h index 7faf609..dff885d 100644 --- a/app/webrtc/peerconnectionfactory.h +++ b/app/webrtc/peerconnectionfactory.h @@ -40,6 +40,10 @@ namespace webrtc { class PeerConnectionFactory : public PeerConnectionFactoryInterface, public talk_base::MessageHandler { public: + virtual void SetOptions(const Options& options) { + options_ = options; + } + virtual talk_base::scoped_refptr<PeerConnectionInterface> CreatePeerConnection( const PeerConnectionInterface::IceServers& configuration, @@ -77,6 +81,7 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface, virtual cricket::ChannelManager* channel_manager(); virtual talk_base::Thread* signaling_thread(); virtual talk_base::Thread* worker_thread(); + const Options& options() const { return options_; } protected: PeerConnectionFactory(); @@ -109,6 +114,7 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface, bool owns_ptrs_; talk_base::Thread* signaling_thread_; talk_base::Thread* worker_thread_; + Options options_; talk_base::scoped_refptr<PortAllocatorFactoryInterface> allocator_factory_; // External Audio device used for audio playback. talk_base::scoped_refptr<AudioDeviceModule> default_adm_; diff --git a/app/webrtc/peerconnectioninterface.h b/app/webrtc/peerconnectioninterface.h index bd86f3e..a127dad 100644 --- a/app/webrtc/peerconnectioninterface.h +++ b/app/webrtc/peerconnectioninterface.h @@ -390,6 +390,19 @@ class DTLSIdentityServiceInterface { // argument. class PeerConnectionFactoryInterface : public talk_base::RefCountInterface { public: + class Options { + public: + Options() : + enable_aec_dump(false), + disable_encryption(false), + disable_sctp_data_channels(false) { + } + bool enable_aec_dump; + bool disable_encryption; + bool disable_sctp_data_channels; + }; + + virtual void SetOptions(const Options& options) = 0; virtual talk_base::scoped_refptr<PeerConnectionInterface> CreatePeerConnection( const PeerConnectionInterface::IceServers& configuration, diff --git a/app/webrtc/statscollector.cc b/app/webrtc/statscollector.cc index 42ae662..db7cac4 100644 --- a/app/webrtc/statscollector.cc +++ b/app/webrtc/statscollector.cc @@ -82,6 +82,15 @@ const char StatsReport::kStatsValueNameFrameRateDecoded[] = "googFrameRateDecoded"; const char StatsReport::kStatsValueNameFrameRateOutput[] = "googFrameRateOutput"; +const char StatsReport::kStatsValueNameDecodeMs[] = "googDecodeMs"; +const char StatsReport::kStatsValueNameMaxDecodeMs[] = "googMaxDecodeMs"; +const char StatsReport::kStatsValueNameCurrentDelayMs[] = "googCurrentDelayMs"; +const char StatsReport::kStatsValueNameTargetDelayMs[] = "googTargetDelayMs"; +const char StatsReport::kStatsValueNameJitterBufferMs[] = "googJitterBufferMs"; +const char StatsReport::kStatsValueNameMinPlayoutDelayMs[] = + "googMinPlayoutDelayMs"; +const char StatsReport::kStatsValueNameRenderDelayMs[] = "googRenderDelayMs"; + const char StatsReport::kStatsValueNameFrameRateInput[] = "googFrameRateInput"; const char StatsReport::kStatsValueNameFrameRateSent[] = "googFrameRateSent"; const char StatsReport::kStatsValueNameFrameWidthReceived[] = @@ -119,6 +128,7 @@ const char StatsReport::kStatsValueNameWritable[] = "googWritable"; const char StatsReport::kStatsReportTypeSession[] = "googLibjingleSession"; const char StatsReport::kStatsReportTypeBwe[] = "VideoBwe"; +const char StatsReport::kStatsReportTypeRemoteSsrc[] = "remoteSsrc"; const char StatsReport::kStatsReportTypeSsrc[] = "ssrc"; const char StatsReport::kStatsReportTypeTrack[] = "googTrack"; const char StatsReport::kStatsReportTypeIceCandidate[] = "iceCandidate"; @@ -241,6 +251,21 @@ void ExtractStats(const cricket::VideoReceiverInfo& info, StatsReport* report) { info.framerate_decoded); report->AddValue(StatsReport::kStatsValueNameFrameRateOutput, info.framerate_output); + + report->AddValue(StatsReport::kStatsValueNameDecodeMs, + info.decode_ms); + report->AddValue(StatsReport::kStatsValueNameMaxDecodeMs, + info.max_decode_ms); + report->AddValue(StatsReport::kStatsValueNameCurrentDelayMs, + info.current_delay_ms); + report->AddValue(StatsReport::kStatsValueNameTargetDelayMs, + info.target_delay_ms); + report->AddValue(StatsReport::kStatsValueNameJitterBufferMs, + info.jitter_buffer_ms); + report->AddValue(StatsReport::kStatsValueNameMinPlayoutDelayMs, + info.min_playout_delay_ms); + report->AddValue(StatsReport::kStatsValueNameRenderDelayMs, + info.render_delay_ms); } void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) { @@ -293,6 +318,18 @@ void ExtractStats(const cricket::BandwidthEstimationInfo& info, info.bucket_delay); } +void ExtractRemoteStats(const cricket::MediaSenderInfo& info, + StatsReport* report) { + report->timestamp = info.remote_stats[0].timestamp; + // TODO(hta): Extract some stats here. +} + +void ExtractRemoteStats(const cricket::MediaReceiverInfo& info, + StatsReport* report) { + report->timestamp = info.remote_stats[0].timestamp; + // TODO(hta): Extract some stats here. +} + uint32 ExtractSsrc(const cricket::VoiceReceiverInfo& info) { return info.ssrc; } @@ -319,11 +356,20 @@ void ExtractStatsFromList(const std::vector<T>& data, for (; it != data.end(); ++it) { std::string id; uint32 ssrc = ExtractSsrc(*it); - StatsReport* report = collector->PrepareReport(ssrc, transport_id); + // Each object can result in 2 objects, a local and a remote object. + // TODO(hta): Handle the case of multiple SSRCs per object. + StatsReport* report = collector->PrepareLocalReport(ssrc, transport_id); if (!report) { continue; } ExtractStats(*it, report); + if (it->remote_stats.size() > 0) { + report = collector->PrepareRemoteReport(ssrc, transport_id); + if (!report) { + continue; + } + ExtractRemoteStats(*it, report); + } } }; @@ -406,8 +452,9 @@ void StatsCollector::UpdateStats() { } } -StatsReport* StatsCollector::PrepareReport(uint32 ssrc, - const std::string& transport_id) { +StatsReport* StatsCollector::PrepareLocalReport( + uint32 ssrc, + const std::string& transport_id) { std::string ssrc_id = talk_base::ToString<uint32>(ssrc); StatsMap::iterator it = reports_.find(StatsId( StatsReport::kStatsReportTypeSsrc, ssrc_id)); @@ -427,10 +474,8 @@ StatsReport* StatsCollector::PrepareReport(uint32 ssrc, &track_id); } - StatsReport* report = &reports_[ - StatsId(StatsReport::kStatsReportTypeSsrc, ssrc_id)]; - report->id = StatsId(StatsReport::kStatsReportTypeSsrc, ssrc_id); - report->type = StatsReport::kStatsReportTypeSsrc; + StatsReport* report = GetOrCreateReport(StatsReport::kStatsReportTypeSsrc, + ssrc_id); // Clear out stats from previous GatherStats calls if any. if (report->timestamp != stats_gathering_started_) { @@ -446,6 +491,44 @@ StatsReport* StatsCollector::PrepareReport(uint32 ssrc, return report; } +StatsReport* StatsCollector::PrepareRemoteReport( + uint32 ssrc, + const std::string& transport_id) { + std::string ssrc_id = talk_base::ToString<uint32>(ssrc); + StatsMap::iterator it = reports_.find(StatsId( + StatsReport::kStatsReportTypeRemoteSsrc, ssrc_id)); + + std::string track_id; + if (it == reports_.end()) { + if (!session()->GetTrackIdBySsrc(ssrc, &track_id)) { + LOG(LS_WARNING) << "The SSRC " << ssrc + << " is not associated with a track"; + return NULL; + } + } else { + // Keeps the old track id since we want to report the stats for inactive + // tracks. + ExtractValueFromReport(it->second, + StatsReport::kStatsValueNameTrackId, + &track_id); + } + + StatsReport* report = GetOrCreateReport( + StatsReport::kStatsReportTypeRemoteSsrc, ssrc_id); + + // Clear out stats from previous GatherStats calls if any. + // The timestamp will be added later. Zero it for debugging. + report->values.clear(); + report->timestamp = 0; + + report->AddValue(StatsReport::kStatsValueNameSsrc, ssrc_id); + report->AddValue(StatsReport::kStatsValueNameTrackId, track_id); + // Add the mapping of SSRC to transport. + report->AddValue(StatsReport::kStatsValueNameTransportId, + transport_id); + return report; +} + std::string StatsCollector::AddOneCertificateReport( const talk_base::SSLCertificate* cert, const std::string& issuer_id) { // TODO(bemasc): Move this computation to a helper class that caches these @@ -592,6 +675,9 @@ void StatsCollector::ExtractSessionInfo() { info.local_candidate.address().ToString()); report.AddValue(StatsReport::kStatsValueNameRemoteAddress, info.remote_candidate.address().ToString()); + report.AddValue(StatsReport::kStatsValueNameRtt, info.rtt); + report.AddValue(StatsReport::kStatsValueNameTransportType, + info.local_candidate.protocol()); reports_[report.id] = report; } } @@ -668,4 +754,19 @@ bool StatsCollector::GetTransportIdFromProxy(const std::string& proxy, return true; } +StatsReport* StatsCollector::GetOrCreateReport(const std::string& type, + const std::string& id) { + std::string statsid = StatsId(type, id); + StatsReport* report = NULL; + std::map<std::string, StatsReport>::iterator it = reports_.find(statsid); + if (it == reports_.end()) { + report = &reports_[statsid]; // Create new element. + report->id = statsid; + report->type = type; + } else { + report = &reports_[statsid]; + } + return report; +} + } // namespace webrtc diff --git a/app/webrtc/statscollector.h b/app/webrtc/statscollector.h index c34b5a0..01da059 100644 --- a/app/webrtc/statscollector.h +++ b/app/webrtc/statscollector.h @@ -65,9 +65,11 @@ class StatsCollector { // |reports|. bool GetStats(MediaStreamTrackInterface* track, StatsReports* reports); - WebRtcSession* session() { return session_; } - // Prepare an SSRC report for the given ssrc. Used internally. - StatsReport* PrepareReport(uint32 ssrc, const std::string& transport); + // Prepare an SSRC report for the given ssrc. Used internally + // in the ExtractStatsFromList template. + StatsReport* PrepareLocalReport(uint32 ssrc, const std::string& transport); + // Prepare an SSRC report for the given remote ssrc. Used internally. + StatsReport* PrepareRemoteReport(uint32 ssrc, const std::string& transport); // Extracts the ID of a Transport belonging to an SSRC. Used internally. bool GetTransportIdFromProxy(const std::string& proxy, std::string* transport_id); @@ -88,9 +90,12 @@ class StatsCollector { void ExtractVideoInfo(); double GetTimeNow(); void BuildSsrcToTransportId(); + WebRtcSession* session() { return session_; } + webrtc::StatsReport* GetOrCreateReport(const std::string& type, + const std::string& id); // A map from the report id to the report. - std::map<std::string, webrtc::StatsReport> reports_; + std::map<std::string, StatsReport> reports_; // Raw pointer to the session the statistics are gathered from. WebRtcSession* session_; double stats_gathering_started_; diff --git a/app/webrtc/statscollector_unittest.cc b/app/webrtc/statscollector_unittest.cc index d9cde5d..66a5ee0 100644 --- a/app/webrtc/statscollector_unittest.cc +++ b/app/webrtc/statscollector_unittest.cc @@ -58,6 +58,10 @@ namespace { const char kNotFound[] = "NOT FOUND"; const char kNoReports[] = "NO REPORTS"; +// Constant names for track identification. +const char kTrackId[] = "somename"; +const uint32 kSsrcOfTrack = 1234; + class MockWebRtcSession : public webrtc::WebRtcSession { public: explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) @@ -207,11 +211,37 @@ class StatsCollectorTest : public testing::Test { new cricket::ChannelManager(media_engine_, new cricket::FakeDeviceManager(), talk_base::Thread::Current())), - session_(channel_manager_.get()) { + session_(channel_manager_.get()), + track_id_(kTrackId) { // By default, we ignore session GetStats calls. EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); } + // This creates a standard setup with a transport called "trspname" + // having one transport channel + // and the specified virtual connection name. + void InitSessionStats(const std::string vc_name) { + const std::string kTransportName("trspname"); + cricket::TransportStats transport_stats; + cricket::TransportChannelStats channel_stats; + channel_stats.component = 1; + transport_stats.content_name = kTransportName; + transport_stats.channel_stats.push_back(channel_stats); + + session_stats_.transport_stats[kTransportName] = transport_stats; + session_stats_.proxy_to_transport[vc_name] = kTransportName; + } + + // Adds a track with a given SSRC into the stats. + void AddVideoTrackStats() { + stream_ = webrtc::MediaStream::Create("streamlabel"); + track_= webrtc::VideoTrack::Create(kTrackId, NULL); + stream_->AddTrack(track_); + EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) + .WillRepeatedly(DoAll(SetArgPointee<1>(track_id_), + Return(true))); + } + void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert, const std::vector<std::string>& local_ders, const talk_base::FakeSSLCertificate& remote_cert, @@ -283,9 +313,14 @@ class StatsCollectorTest : public testing::Test { EXPECT_NE(kNotFound, remote_certificate_id); CheckCertChainReports(reports, remote_ders, remote_certificate_id); } + cricket::FakeMediaEngine* media_engine_; talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; MockWebRtcSession session_; + cricket::SessionStats session_stats_; + talk_base::scoped_refptr<webrtc::MediaStream> stream_; + talk_base::scoped_refptr<webrtc::VideoTrack> track_; + std::string track_id_; }; // This test verifies that 64-bit counters are passed successfully. @@ -297,17 +332,13 @@ TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { webrtc::StatsReports reports; // returned values. cricket::VideoSenderInfo video_sender_info; cricket::VideoMediaInfo stats_read; - const uint32 kSsrcOfTrack = 1234; - const std::string kNameOfTrack("somename"); // The number of bytes must be larger than 0xFFFFFFFF for this test. const int64 kBytesSent = 12345678901234LL; const std::string kBytesSentString("12345678901234"); stats.set_session(&session_); - talk_base::scoped_refptr<webrtc::MediaStream> stream( - webrtc::MediaStream::Create("streamlabel")); - stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL)); - stats.AddStream(stream); + AddVideoTrackStats(); + stats.AddStream(stream_); // Construct a stats value to read. video_sender_info.ssrcs.push_back(1234); @@ -319,9 +350,6 @@ TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { EXPECT_CALL(*media_channel, GetStats(_)) .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); - EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) - .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack), - Return(true))); stats.UpdateStats(); stats.GetStats(NULL, &reports); std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); @@ -339,16 +367,12 @@ TEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { cricket::VideoMediaInfo stats_read; // Set up an SSRC just to test that we get both kinds of stats back: SSRC and // BWE. - const uint32 kSsrcOfTrack = 1234; - const std::string kNameOfTrack("somename"); const int64 kBytesSent = 12345678901234LL; const std::string kBytesSentString("12345678901234"); stats.set_session(&session_); - talk_base::scoped_refptr<webrtc::MediaStream> stream( - webrtc::MediaStream::Create("streamlabel")); - stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL)); - stats.AddStream(stream); + AddVideoTrackStats(); + stats.AddStream(stream_); // Construct a stats value to read. video_sender_info.ssrcs.push_back(1234); @@ -365,9 +389,7 @@ TEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { EXPECT_CALL(*media_channel, GetStats(_)) .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); - EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) - .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack), - Return(true))); + stats.UpdateStats(); stats.GetStats(NULL, &reports); std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); @@ -417,13 +439,8 @@ TEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; cricket::VideoChannel video_channel(talk_base::Thread::Current(), media_engine_, media_channel, &session_, "", false, NULL); - const std::string kTrackId("somename"); - talk_base::scoped_refptr<webrtc::MediaStream> stream( - webrtc::MediaStream::Create("streamlabel")); - talk_base::scoped_refptr<webrtc::VideoTrack> track = - webrtc::VideoTrack::Create(kTrackId, NULL); - stream->AddTrack(track); - stats.AddStream(stream); + AddVideoTrackStats(); + stats.AddStream(stream_); stats.set_session(&session_); @@ -449,13 +466,8 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; cricket::VideoChannel video_channel(talk_base::Thread::Current(), media_engine_, media_channel, &session_, "", false, NULL); - const std::string kTrackId("somename"); - talk_base::scoped_refptr<webrtc::MediaStream> stream( - webrtc::MediaStream::Create("streamlabel")); - talk_base::scoped_refptr<webrtc::VideoTrack> track = - webrtc::VideoTrack::Create(kTrackId, NULL); - stream->AddTrack(track); - stats.AddStream(stream); + AddVideoTrackStats(); + stats.AddStream(stream_); stats.set_session(&session_); @@ -464,7 +476,6 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { // Constructs an ssrc stats update. cricket::VideoSenderInfo video_sender_info; cricket::VideoMediaInfo stats_read; - const uint32 kSsrcOfTrack = 1234; const int64 kBytesSent = 12345678901234LL; // Construct a stats value to read. @@ -477,23 +488,20 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { EXPECT_CALL(*media_channel, GetStats(_)) .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); - EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) - .WillOnce(DoAll(SetArgPointee<1>(kTrackId), - Return(true))); stats.UpdateStats(); stats.GetStats(NULL, &reports); - // |reports| should contain one session report, one track report, and one ssrc - // report. - EXPECT_EQ((size_t)3, reports.size()); + // |reports| should contain at least one session report, one track report, + // and one ssrc report. + EXPECT_LE((size_t)3, reports.size()); const webrtc::StatsReport* track_report = FindNthReportByType( reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); EXPECT_FALSE(track_report == NULL); - stats.GetStats(track, &reports); - // |reports| should contain one session report, one track report, and one ssrc - // report. - EXPECT_EQ((size_t)3, reports.size()); + stats.GetStats(track_, &reports); + // |reports| should contain at least one session report, one track report, + // and one ssrc report. + EXPECT_LE((size_t)3, reports.size()); track_report = FindNthReportByType( reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); EXPECT_FALSE(track_report == NULL); @@ -516,13 +524,8 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { const std::string kVcName("vcname"); cricket::VideoChannel video_channel(talk_base::Thread::Current(), media_engine_, media_channel, &session_, kVcName, false, NULL); - const std::string kTrackId("somename"); - talk_base::scoped_refptr<webrtc::MediaStream> stream( - webrtc::MediaStream::Create("streamlabel")); - talk_base::scoped_refptr<webrtc::VideoTrack> track = - webrtc::VideoTrack::Create(kTrackId, NULL); - stream->AddTrack(track); - stats.AddStream(stream); + AddVideoTrackStats(); + stats.AddStream(stream_); stats.set_session(&session_); @@ -531,7 +534,6 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { // Constructs an ssrc stats update. cricket::VideoSenderInfo video_sender_info; cricket::VideoMediaInfo stats_read; - const uint32 kSsrcOfTrack = 1234; const int64 kBytesSent = 12345678901234LL; // Construct a stats value to read. @@ -544,23 +546,10 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { EXPECT_CALL(*media_channel, GetStats(_)) .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), Return(true))); - EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) - .WillOnce(DoAll(SetArgPointee<1>(kTrackId), - Return(true))); - // Instruct the session to return stats containing the transport channel. - const std::string kTransportName("trspname"); - cricket::SessionStats session_stats; - cricket::TransportStats transport_stats; - cricket::TransportChannelStats channel_stats; - channel_stats.component = 1; - transport_stats.content_name = kTransportName; - transport_stats.channel_stats.push_back(channel_stats); - - session_stats.transport_stats[kTransportName] = transport_stats; - session_stats.proxy_to_transport[kVcName] = kTransportName; + InitSessionStats(kVcName); EXPECT_CALL(session_, GetStats(_)) - .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), + .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), Return(true))); stats.UpdateStats(); @@ -575,6 +564,78 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { ASSERT_FALSE(transport_report == NULL); } +// This test verifies that a remote stats object will not be created for +// an outgoing SSRC where remote stats are not returned. +TEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { + webrtc::StatsCollector stats; // Implementation under test. + MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; + // The content_name known by the video channel. + const std::string kVcName("vcname"); + cricket::VideoChannel video_channel(talk_base::Thread::Current(), + media_engine_, media_channel, &session_, kVcName, false, NULL); + AddVideoTrackStats(); + stats.AddStream(stream_); + + stats.set_session(&session_); + + EXPECT_CALL(session_, video_channel()) + .WillRepeatedly(ReturnNull()); + + stats.UpdateStats(); + webrtc::StatsReports reports; + stats.GetStats(NULL, &reports); + const webrtc::StatsReport* remote_report = FindNthReportByType(reports, + webrtc::StatsReport::kStatsReportTypeRemoteSsrc, 1); + EXPECT_TRUE(remote_report == NULL); +} + +// This test verifies that a remote stats object will be created for +// an outgoing SSRC where stats are returned. +TEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { + webrtc::StatsCollector stats; // Implementation under test. + MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; + // The content_name known by the video channel. + const std::string kVcName("vcname"); + cricket::VideoChannel video_channel(talk_base::Thread::Current(), + media_engine_, media_channel, &session_, kVcName, false, NULL); + AddVideoTrackStats(); + stats.AddStream(stream_); + + stats.set_session(&session_); + + webrtc::StatsReports reports; + + // Instruct the session to return stats containing the transport channel. + InitSessionStats(kVcName); + EXPECT_CALL(session_, GetStats(_)) + .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), + Return(true))); + + // Constructs an ssrc stats update. + cricket::VideoMediaInfo stats_read; + + cricket::SsrcReceiverInfo remote_ssrc_stats; + remote_ssrc_stats.timestamp = 12345.678; + remote_ssrc_stats.ssrc = kSsrcOfTrack; + cricket::VideoSenderInfo video_sender_info; + video_sender_info.ssrcs.push_back(kSsrcOfTrack); + video_sender_info.remote_stats.push_back(remote_ssrc_stats); + stats_read.senders.push_back(video_sender_info); + + EXPECT_CALL(session_, video_channel()) + .WillRepeatedly(Return(&video_channel)); + EXPECT_CALL(*media_channel, GetStats(_)) + .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), + Return(true))); + + stats.UpdateStats(); + stats.GetStats(NULL, &reports); + const webrtc::StatsReport* remote_report = FindNthReportByType(reports, + webrtc::StatsReport::kStatsReportTypeRemoteSsrc, 1); + EXPECT_FALSE(remote_report == NULL); + EXPECT_NE(0, remote_report->timestamp); +} + // This test verifies that all chained certificates are correctly // reported TEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { @@ -638,6 +699,7 @@ TEST_F(StatsCollectorTest, NoTransport) { EXPECT_CALL(session_, GetStats(_)) .WillOnce(DoAll(SetArgPointee<0>(session_stats), Return(true))); + EXPECT_CALL(session_, video_channel()) .WillRepeatedly(ReturnNull()); @@ -712,5 +774,4 @@ TEST_F(StatsCollectorTest, NoCertificates) { ASSERT_EQ(kNotFound, remote_certificate_id); } - } // namespace diff --git a/app/webrtc/statstypes.h b/app/webrtc/statstypes.h index fb8c15b..e76aa86 100644 --- a/app/webrtc/statstypes.h +++ b/app/webrtc/statstypes.h @@ -88,6 +88,10 @@ class StatsReport { // The |id| field is the SSRC in decimal form of the rtp stream. static const char kStatsReportTypeSsrc[]; + // StatsReport of |type| = "remoteSsrc" is statistics for a specific + // rtp stream, generated by the remote end of the connection. + static const char kStatsReportTypeRemoteSsrc[]; + // StatsReport of |type| = "googTrack" is statistics for a specific media // track. The |id| field is the track id. static const char kStatsReportTypeTrack[]; @@ -137,6 +141,13 @@ class StatsReport { static const char kStatsValueNameFrameRateReceived[]; static const char kStatsValueNameFrameRateDecoded[]; static const char kStatsValueNameFrameRateOutput[]; + static const char kStatsValueNameDecodeMs[]; + static const char kStatsValueNameMaxDecodeMs[]; + static const char kStatsValueNameCurrentDelayMs[]; + static const char kStatsValueNameTargetDelayMs[]; + static const char kStatsValueNameJitterBufferMs[]; + static const char kStatsValueNameMinPlayoutDelayMs[]; + static const char kStatsValueNameRenderDelayMs[]; static const char kStatsValueNameFrameRateInput[]; static const char kStatsValueNameFrameRateSent[]; static const char kStatsValueNameFrameWidthReceived[]; diff --git a/app/webrtc/test/fakeconstraints.h b/app/webrtc/test/fakeconstraints.h index 927432d..b23007e 100644 --- a/app/webrtc/test/fakeconstraints.h +++ b/app/webrtc/test/fakeconstraints.h @@ -119,7 +119,6 @@ class FakeConstraints : public webrtc::MediaConstraintsInterface { } void SetAllowDtlsSctpDataChannels() { - SetMandatory(MediaConstraintsInterface::kEnableSctpDataChannels, true); SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, true); } diff --git a/app/webrtc/webrtcsdp_unittest.cc b/app/webrtc/webrtcsdp_unittest.cc index 6f2e388..777a707 100644 --- a/app/webrtc/webrtcsdp_unittest.cc +++ b/app/webrtc/webrtcsdp_unittest.cc @@ -282,7 +282,7 @@ static const char kSdpSctpDataChannelString[] = "a=ice-ufrag:ufrag_data\r\n" "a=ice-pwd:pwd_data\r\n" "a=mid:data_content_name\r\n" - "a=sctpmap:5000 webrtc-datachannel 65536\r\n"; + "a=sctpmap:5000 webrtc-datachannel 1024\r\n"; static const char kSdpSctpDataChannelWithCandidatesString[] = "m=application 2345 DTLS/SCTP 5000\r\n" @@ -297,7 +297,7 @@ static const char kSdpSctpDataChannelWithCandidatesString[] = "a=ice-ufrag:ufrag_data\r\n" "a=ice-pwd:pwd_data\r\n" "a=mid:data_content_name\r\n" - "a=sctpmap:5000 webrtc-datachannel 65536\r\n"; + "a=sctpmap:5000 webrtc-datachannel 1024\r\n"; // One candidate reference string as per W3c spec. diff --git a/app/webrtc/webrtcsession.cc b/app/webrtc/webrtcsession.cc index 74d1488..69a47c4 100644 --- a/app/webrtc/webrtcsession.cc +++ b/app/webrtc/webrtcsession.cc @@ -68,10 +68,7 @@ const char MediaConstraintsInterface::kEnableRtpDataChannels[] = // line flag. So it is prefixed with kInternalConstraintPrefix so JS values // will be removed. const char MediaConstraintsInterface::kEnableSctpDataChannels[] = - "internalSctpDataChannels"; - -const char MediaConstraintsInterface::kInternalDisableEncryption[] = - "internalDisableEncryption"; + "deprecatedSctpDataChannels"; // Error messages const char kSetLocalSdpFailed[] = "SetLocalDescription failed: "; @@ -458,6 +455,7 @@ WebRtcSession::~WebRtcSession() { } bool WebRtcSession::Initialize( + const PeerConnectionFactoryInterface::Options& options, const MediaConstraintsInterface* constraints, DTLSIdentityServiceInterface* dtls_identity_service) { // TODO(perkj): Take |constraints| into consideration. Return false if not all @@ -476,19 +474,16 @@ bool WebRtcSession::Initialize( } // Enable creation of RTP data channels if the kEnableRtpDataChannels is set. - // It takes precendence over the kEnableSctpDataChannels constraint. + // It takes precendence over the disable_sctp_data_channels + // PeerConnectionFactoryInterface::Options. if (FindConstraint( constraints, MediaConstraintsInterface::kEnableRtpDataChannels, &value, NULL) && value) { LOG(LS_INFO) << "Allowing RTP data engine."; data_channel_type_ = cricket::DCT_RTP; } else { - bool sctp_enabled = FindConstraint( - constraints, - MediaConstraintsInterface::kEnableSctpDataChannels, - &value, NULL) && value; // DTLS has to be enabled to use SCTP. - if (sctp_enabled && dtls_enabled_) { + if (!options.disable_sctp_data_channels && dtls_enabled_) { LOG(LS_INFO) << "Allowing SCTP data engine."; data_channel_type_ = cricket::DCT_SCTP; } @@ -520,11 +515,7 @@ bool WebRtcSession::Initialize( webrtc_session_desc_factory_->SignalIdentityReady.connect( this, &WebRtcSession::OnIdentityReady); - // Disable encryption if kDisableEncryption is set. - if (FindConstraint( - constraints, - MediaConstraintsInterface::kInternalDisableEncryption, - &value, NULL) && value) { + if (options.disable_encryption) { webrtc_session_desc_factory_->set_secure(cricket::SEC_DISABLED); } diff --git a/app/webrtc/webrtcsession.h b/app/webrtc/webrtcsession.h index 12e2291..dde33ca 100644 --- a/app/webrtc/webrtcsession.h +++ b/app/webrtc/webrtcsession.h @@ -110,7 +110,8 @@ class WebRtcSession : public cricket::BaseSession, MediaStreamSignaling* mediastream_signaling); virtual ~WebRtcSession(); - bool Initialize(const MediaConstraintsInterface* constraints, + bool Initialize(const PeerConnectionFactoryInterface::Options& options, + const MediaConstraintsInterface* constraints, DTLSIdentityServiceInterface* dtls_identity_service); // Deletes the voice, video and data channel and changes the session state // to STATE_RECEIVEDTERMINATE. diff --git a/app/webrtc/webrtcsession_unittest.cc b/app/webrtc/webrtcsession_unittest.cc index 493294f..ecbba18 100644 --- a/app/webrtc/webrtcsession_unittest.cc +++ b/app/webrtc/webrtcsession_unittest.cc @@ -81,6 +81,7 @@ using webrtc::FakeConstraints; using webrtc::IceCandidateCollection; using webrtc::JsepIceCandidate; using webrtc::JsepSessionDescription; +using webrtc::PeerConnectionFactoryInterface; using webrtc::PeerConnectionInterface; using webrtc::SessionDescriptionInterface; using webrtc::StreamCollection; @@ -317,7 +318,8 @@ class WebRtcSessionTest : public testing::Test { EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew, observer_.ice_gathering_state_); - EXPECT_TRUE(session_->Initialize(constraints_.get(), identity_service)); + EXPECT_TRUE(session_->Initialize(options_, constraints_.get(), + identity_service)); } void InitWithDtmfCodec() { @@ -919,6 +921,7 @@ class WebRtcSessionTest : public testing::Test { cricket::TestStunServer stun_server_; talk_base::FakeNetworkManager network_manager_; cricket::BasicPortAllocator allocator_; + PeerConnectionFactoryInterface::Options options_; talk_base::scoped_ptr<FakeConstraints> constraints_; FakeMediaStreamSignaling mediastream_signaling_; talk_base::scoped_ptr<WebRtcSessionForTest> session_; @@ -1932,9 +1935,7 @@ TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) { } TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) { - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kInternalDisableEncryption, true); + options_.disable_encryption = true; Init(NULL); mediastream_signaling_.SendAudioVideoStream1(); scoped_ptr<SessionDescriptionInterface> offer( @@ -2424,9 +2425,7 @@ TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) { // This test verifies the crypto parameter when security is disabled. TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescriptionWithDisabled) { - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kInternalDisableEncryption, true); + options_.disable_encryption = true; Init(NULL); mediastream_signaling_.SendAudioVideoStream1(); talk_base::scoped_ptr<SessionDescriptionInterface> offer( @@ -2567,8 +2566,8 @@ TEST_F(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { constraints_.reset(new FakeConstraints()); constraints_->AddOptional( webrtc::MediaConstraintsInterface::kEnableRtpDataChannels, true); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); + options_.disable_sctp_data_channels = false; + InitWithDtls(false); SetLocalDescriptionWithDataChannel(); @@ -2578,9 +2577,6 @@ TEST_F(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) { TEST_F(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) { MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); InitWithDtls(false); talk_base::scoped_ptr<SessionDescriptionInterface> offer(CreateOffer(NULL)); @@ -2591,9 +2587,6 @@ TEST_F(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) { TEST_F(WebRtcSessionTest, TestCreateAnswerWithSctpInOfferAndNoStreams) { MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); SetFactoryDtlsSrtp(); - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); InitWithDtls(false); // Create remote offer with SCTP. @@ -2613,8 +2606,6 @@ TEST_F(WebRtcSessionTest, TestCreateAnswerWithSctpInOfferAndNoStreams) { TEST_F(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { constraints_.reset(new FakeConstraints()); constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); - constraints_->AddOptional( webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false); InitWithDtls(false); @@ -2625,24 +2616,26 @@ TEST_F(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) { TEST_F(WebRtcSessionTest, TestSctpDataChannelWithDtls) { MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); InitWithDtls(false); SetLocalDescriptionWithDataChannel(); EXPECT_EQ(cricket::DCT_SCTP, data_engine_->last_channel_type()); } +TEST_F(WebRtcSessionTest, TestDisableSctpDataChannels) { + MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); + options_.disable_sctp_data_channels = true; + InitWithDtls(false); + + SetLocalDescriptionWithDataChannel(); + EXPECT_EQ(cricket::DCT_NONE, data_engine_->last_channel_type()); +} + TEST_F(WebRtcSessionTest, TestSctpDataChannelSendPortParsing) { MAYBE_SKIP_TEST(talk_base::SSLStreamAdapter::HaveDtlsSrtp); const int new_send_port = 9998; const int new_recv_port = 7775; - constraints_.reset(new FakeConstraints()); - constraints_->AddOptional( - webrtc::MediaConstraintsInterface::kEnableSctpDataChannels, true); - InitWithDtls(false); SetFactoryDtlsSrtp(); |