| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 #include <functional> | 10 #include <functional> |
| 11 #include <list> | 11 #include <list> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 #include "webrtc/audio_state.h" | 16 #include "webrtc/audio_state.h" |
| 17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
| 18 #include "webrtc/base/event.h" |
| 18 #include "webrtc/base/logging.h" | 19 #include "webrtc/base/logging.h" |
| 19 #include "webrtc/base/scoped_ptr.h" | 20 #include "webrtc/base/scoped_ptr.h" |
| 20 #include "webrtc/base/thread_annotations.h" | 21 #include "webrtc/base/thread_annotations.h" |
| 21 #include "webrtc/call.h" | 22 #include "webrtc/call.h" |
| 22 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 23 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 23 #include "webrtc/system_wrappers/include/event_wrapper.h" | |
| 24 #include "webrtc/system_wrappers/include/trace.h" | 24 #include "webrtc/system_wrappers/include/trace.h" |
| 25 #include "webrtc/test/call_test.h" | 25 #include "webrtc/test/call_test.h" |
| 26 #include "webrtc/test/direct_transport.h" | 26 #include "webrtc/test/direct_transport.h" |
| 27 #include "webrtc/test/encoder_settings.h" | 27 #include "webrtc/test/encoder_settings.h" |
| 28 #include "webrtc/test/fake_decoder.h" | 28 #include "webrtc/test/fake_decoder.h" |
| 29 #include "webrtc/test/fake_encoder.h" | 29 #include "webrtc/test/fake_encoder.h" |
| 30 #include "webrtc/test/mock_voice_engine.h" | 30 #include "webrtc/test/mock_voice_engine.h" |
| 31 #include "webrtc/test/frame_generator_capturer.h" | 31 #include "webrtc/test/frame_generator_capturer.h" |
| 32 | 32 |
| 33 namespace webrtc { | 33 namespace webrtc { |
| 34 namespace { | 34 namespace { |
| 35 // Note: If you consider to re-use this class, think twice and instead consider | 35 // Note: If you consider to re-use this class, think twice and instead consider |
| 36 // writing tests that don't depend on the logging system. | 36 // writing tests that don't depend on the logging system. |
| 37 class LogObserver { | 37 class LogObserver { |
| 38 public: | 38 public: |
| 39 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } | 39 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } |
| 40 | 40 |
| 41 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } | 41 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } |
| 42 | 42 |
| 43 void PushExpectedLogLine(const std::string& expected_log_line) { | 43 void PushExpectedLogLine(const std::string& expected_log_line) { |
| 44 callback_.PushExpectedLogLine(expected_log_line); | 44 callback_.PushExpectedLogLine(expected_log_line); |
| 45 } | 45 } |
| 46 | 46 |
| 47 EventTypeWrapper Wait() { return callback_.Wait(); } | 47 bool Wait() { return callback_.Wait(); } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 class Callback : public rtc::LogSink { | 50 class Callback : public rtc::LogSink { |
| 51 public: | 51 public: |
| 52 Callback() : done_(EventWrapper::Create()) {} | 52 Callback() : done_(false, false) {} |
| 53 | 53 |
| 54 void OnLogMessage(const std::string& message) override { | 54 void OnLogMessage(const std::string& message) override { |
| 55 rtc::CritScope lock(&crit_sect_); | 55 rtc::CritScope lock(&crit_sect_); |
| 56 // Ignore log lines that are due to missing AST extensions, these are | 56 // Ignore log lines that are due to missing AST extensions, these are |
| 57 // logged when we switch back from AST to TOF until the wrapping bitrate | 57 // logged when we switch back from AST to TOF until the wrapping bitrate |
| 58 // estimator gives up on using AST. | 58 // estimator gives up on using AST. |
| 59 if (message.find("BitrateEstimator") != std::string::npos && | 59 if (message.find("BitrateEstimator") != std::string::npos && |
| 60 message.find("packet is missing") == std::string::npos) { | 60 message.find("packet is missing") == std::string::npos) { |
| 61 received_log_lines_.push_back(message); | 61 received_log_lines_.push_back(message); |
| 62 } | 62 } |
| 63 | 63 |
| 64 int num_popped = 0; | 64 int num_popped = 0; |
| 65 while (!received_log_lines_.empty() && !expected_log_lines_.empty()) { | 65 while (!received_log_lines_.empty() && !expected_log_lines_.empty()) { |
| 66 std::string a = received_log_lines_.front(); | 66 std::string a = received_log_lines_.front(); |
| 67 std::string b = expected_log_lines_.front(); | 67 std::string b = expected_log_lines_.front(); |
| 68 received_log_lines_.pop_front(); | 68 received_log_lines_.pop_front(); |
| 69 expected_log_lines_.pop_front(); | 69 expected_log_lines_.pop_front(); |
| 70 num_popped++; | 70 num_popped++; |
| 71 EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b; | 71 EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b; |
| 72 } | 72 } |
| 73 if (expected_log_lines_.size() <= 0) { | 73 if (expected_log_lines_.size() <= 0) { |
| 74 if (num_popped > 0) { | 74 if (num_popped > 0) { |
| 75 done_->Set(); | 75 done_.Set(); |
| 76 } | 76 } |
| 77 return; | 77 return; |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 | 80 |
| 81 EventTypeWrapper Wait() { | 81 bool Wait() { return done_.Wait(test::CallTest::kDefaultTimeoutMs); } |
| 82 return done_->Wait(test::CallTest::kDefaultTimeoutMs); | |
| 83 } | |
| 84 | 82 |
| 85 void PushExpectedLogLine(const std::string& expected_log_line) { | 83 void PushExpectedLogLine(const std::string& expected_log_line) { |
| 86 rtc::CritScope lock(&crit_sect_); | 84 rtc::CritScope lock(&crit_sect_); |
| 87 expected_log_lines_.push_back(expected_log_line); | 85 expected_log_lines_.push_back(expected_log_line); |
| 88 } | 86 } |
| 89 | 87 |
| 90 private: | 88 private: |
| 91 typedef std::list<std::string> Strings; | 89 typedef std::list<std::string> Strings; |
| 92 rtc::CriticalSection crit_sect_; | 90 rtc::CriticalSection crit_sect_; |
| 93 Strings received_log_lines_ GUARDED_BY(crit_sect_); | 91 Strings received_log_lines_ GUARDED_BY(crit_sect_); |
| 94 Strings expected_log_lines_ GUARDED_BY(crit_sect_); | 92 Strings expected_log_lines_ GUARDED_BY(crit_sect_); |
| 95 rtc::scoped_ptr<EventWrapper> done_; | 93 rtc::Event done_; |
| 96 }; | 94 }; |
| 97 | 95 |
| 98 Callback callback_; | 96 Callback callback_; |
| 99 }; | 97 }; |
| 100 } // namespace | 98 } // namespace |
| 101 | 99 |
| 102 static const int kTOFExtensionId = 4; | 100 static const int kTOFExtensionId = 4; |
| 103 static const int kASTExtensionId = 5; | 101 static const int kASTExtensionId = 5; |
| 104 | 102 |
| 105 class BitrateEstimatorTest : public test::CallTest { | 103 class BitrateEstimatorTest : public test::CallTest { |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; | 262 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
| 265 static const char* kSingleStreamLog = | 263 static const char* kSingleStreamLog = |
| 266 "RemoteBitrateEstimatorSingleStream: Instantiating."; | 264 "RemoteBitrateEstimatorSingleStream: Instantiating."; |
| 267 | 265 |
| 268 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { | 266 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { |
| 269 send_config_.rtp.extensions.push_back( | 267 send_config_.rtp.extensions.push_back( |
| 270 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 268 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 271 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 269 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 272 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 270 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 273 streams_.push_back(new Stream(this, false)); | 271 streams_.push_back(new Stream(this, false)); |
| 274 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 272 EXPECT_TRUE(receiver_log_.Wait()); |
| 275 } | 273 } |
| 276 | 274 |
| 277 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForAudio) { | 275 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForAudio) { |
| 278 send_config_.rtp.extensions.push_back( | 276 send_config_.rtp.extensions.push_back( |
| 279 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 277 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 280 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 278 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 281 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 279 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 282 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 280 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 283 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 281 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 284 streams_.push_back(new Stream(this, true)); | 282 streams_.push_back(new Stream(this, true)); |
| 285 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 283 EXPECT_TRUE(receiver_log_.Wait()); |
| 286 } | 284 } |
| 287 | 285 |
| 288 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { | 286 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { |
| 289 send_config_.rtp.extensions.push_back( | 287 send_config_.rtp.extensions.push_back( |
| 290 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 288 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 291 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 289 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 292 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 290 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 293 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 291 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 294 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 292 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 295 streams_.push_back(new Stream(this, false)); | 293 streams_.push_back(new Stream(this, false)); |
| 296 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 294 EXPECT_TRUE(receiver_log_.Wait()); |
| 297 } | 295 } |
| 298 | 296 |
| 299 TEST_F(BitrateEstimatorTest, SwitchesToASTForAudio) { | 297 TEST_F(BitrateEstimatorTest, SwitchesToASTForAudio) { |
| 300 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 298 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 301 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 299 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 302 streams_.push_back(new Stream(this, true)); | 300 streams_.push_back(new Stream(this, true)); |
| 303 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 301 EXPECT_TRUE(receiver_log_.Wait()); |
| 304 | 302 |
| 305 send_config_.rtp.extensions.push_back( | 303 send_config_.rtp.extensions.push_back( |
| 306 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 304 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 307 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 305 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 308 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 306 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 309 streams_.push_back(new Stream(this, true)); | 307 streams_.push_back(new Stream(this, true)); |
| 310 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 308 EXPECT_TRUE(receiver_log_.Wait()); |
| 311 } | 309 } |
| 312 | 310 |
| 313 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { | 311 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { |
| 314 send_config_.rtp.extensions.push_back( | 312 send_config_.rtp.extensions.push_back( |
| 315 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 313 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 316 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 314 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 317 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 315 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 318 streams_.push_back(new Stream(this, false)); | 316 streams_.push_back(new Stream(this, false)); |
| 319 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 317 EXPECT_TRUE(receiver_log_.Wait()); |
| 320 | 318 |
| 321 send_config_.rtp.extensions[0] = | 319 send_config_.rtp.extensions[0] = |
| 322 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); | 320 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); |
| 323 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 321 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 324 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 322 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 325 streams_.push_back(new Stream(this, false)); | 323 streams_.push_back(new Stream(this, false)); |
| 326 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 324 EXPECT_TRUE(receiver_log_.Wait()); |
| 327 } | 325 } |
| 328 | 326 |
| 329 TEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOFForVideo) { | 327 TEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOFForVideo) { |
| 330 send_config_.rtp.extensions.push_back( | 328 send_config_.rtp.extensions.push_back( |
| 331 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 329 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 332 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 330 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 333 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 331 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 334 streams_.push_back(new Stream(this, false)); | 332 streams_.push_back(new Stream(this, false)); |
| 335 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 333 EXPECT_TRUE(receiver_log_.Wait()); |
| 336 | 334 |
| 337 send_config_.rtp.extensions[0] = | 335 send_config_.rtp.extensions[0] = |
| 338 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); | 336 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); |
| 339 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 337 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 340 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 338 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 341 streams_.push_back(new Stream(this, false)); | 339 streams_.push_back(new Stream(this, false)); |
| 342 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 340 EXPECT_TRUE(receiver_log_.Wait()); |
| 343 | 341 |
| 344 send_config_.rtp.extensions[0] = | 342 send_config_.rtp.extensions[0] = |
| 345 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); | 343 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); |
| 346 receiver_log_.PushExpectedLogLine( | 344 receiver_log_.PushExpectedLogLine( |
| 347 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); | 345 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); |
| 348 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 346 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 349 streams_.push_back(new Stream(this, false)); | 347 streams_.push_back(new Stream(this, false)); |
| 350 streams_[0]->StopSending(); | 348 streams_[0]->StopSending(); |
| 351 streams_[1]->StopSending(); | 349 streams_[1]->StopSending(); |
| 352 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); | 350 EXPECT_TRUE(receiver_log_.Wait()); |
| 353 } | 351 } |
| 354 } // namespace webrtc | 352 } // namespace webrtc |
| OLD | NEW |