| 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/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 17 #include "webrtc/base/scoped_ptr.h" | 17 #include "webrtc/base/scoped_ptr.h" |
| 18 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
| 19 #include "webrtc/call.h" | 19 #include "webrtc/call.h" |
| 20 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 20 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 21 #include "webrtc/system_wrappers/include/event_wrapper.h" | 21 #include "webrtc/system_wrappers/include/event_wrapper.h" |
| 22 #include "webrtc/system_wrappers/include/trace.h" | 22 #include "webrtc/system_wrappers/include/trace.h" |
| 23 #include "webrtc/test/call_test.h" | 23 #include "webrtc/test/call_test.h" |
| 24 #include "webrtc/test/direct_transport.h" | 24 #include "webrtc/test/direct_transport.h" |
| 25 #include "webrtc/test/encoder_settings.h" | 25 #include "webrtc/test/encoder_settings.h" |
| 26 #include "webrtc/test/fake_decoder.h" | 26 #include "webrtc/test/fake_decoder.h" |
| 27 #include "webrtc/test/fake_encoder.h" | 27 #include "webrtc/test/fake_encoder.h" |
| 28 #include "webrtc/test/fake_voice_engine.h" | 28 #include "webrtc/test/mock_voice_engine.h" |
| 29 #include "webrtc/test/frame_generator_capturer.h" | 29 #include "webrtc/test/frame_generator_capturer.h" |
| 30 | 30 |
| 31 namespace webrtc { | 31 namespace webrtc { |
| 32 namespace { | 32 namespace { |
| 33 // Note: If you consider to re-use this class, think twice and instead consider | 33 // Note: If you consider to re-use this class, think twice and instead consider |
| 34 // writing tests that don't depend on the trace system. | 34 // writing tests that don't depend on the trace system. |
| 35 class TraceObserver { | 35 class TraceObserver { |
| 36 public: | 36 public: |
| 37 TraceObserver() { | 37 TraceObserver() { |
| 38 Trace::set_level_filter(kTraceTerseInfo); | 38 Trace::set_level_filter(kTraceTerseInfo); |
| 39 | 39 |
| 40 Trace::CreateTrace(); | 40 Trace::CreateTrace(); |
| 41 Trace::SetTraceCallback(&callback_); | 41 Trace::SetTraceCallback(&callback_); |
| 42 | 42 |
| 43 // Call webrtc trace to initialize the tracer that would otherwise trigger a | 43 // Call webrtc trace to initialize the tracer that would otherwise trigger a |
| 44 // data-race if left to be initialized by multiple threads (i.e. threads | 44 // data-race if left to be initialized by multiple threads (i.e. threads |
| 45 // spawned by test::DirectTransport members in BitrateEstimatorTest). | 45 // spawned by test::DirectTransport members in BitrateEstimatorTest). |
| 46 WEBRTC_TRACE(kTraceStateInfo, | 46 WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, |
| 47 kTraceUtility, | |
| 48 -1, | |
| 49 "Instantiate without data races."); | 47 "Instantiate without data races."); |
| 50 } | 48 } |
| 51 | 49 |
| 52 ~TraceObserver() { | 50 ~TraceObserver() { |
| 53 Trace::SetTraceCallback(nullptr); | 51 Trace::SetTraceCallback(nullptr); |
| 54 Trace::ReturnTrace(); | 52 Trace::ReturnTrace(); |
| 55 } | 53 } |
| 56 | 54 |
| 57 void PushExpectedLogLine(const std::string& expected_log_line) { | 55 void PushExpectedLogLine(const std::string& expected_log_line) { |
| 58 callback_.PushExpectedLogLine(expected_log_line); | 56 callback_.PushExpectedLogLine(expected_log_line); |
| 59 } | 57 } |
| 60 | 58 |
| 61 EventTypeWrapper Wait() { | 59 EventTypeWrapper Wait() { return callback_.Wait(); } |
| 62 return callback_.Wait(); | |
| 63 } | |
| 64 | 60 |
| 65 private: | 61 private: |
| 66 class Callback : public TraceCallback { | 62 class Callback : public TraceCallback { |
| 67 public: | 63 public: |
| 68 Callback() : done_(EventWrapper::Create()) {} | 64 Callback() : done_(EventWrapper::Create()) {} |
| 69 | 65 |
| 70 void Print(TraceLevel level, const char* message, int length) override { | 66 void Print(TraceLevel level, const char* message, int length) override { |
| 71 rtc::CritScope lock(&crit_sect_); | 67 rtc::CritScope lock(&crit_sect_); |
| 72 std::string msg(message); | 68 std::string msg(message); |
| 73 if (msg.find("BitrateEstimator") != std::string::npos) { | 69 if (msg.find("BitrateEstimator") != std::string::npos) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 }; | 107 }; |
| 112 } // namespace | 108 } // namespace |
| 113 | 109 |
| 114 static const int kTOFExtensionId = 4; | 110 static const int kTOFExtensionId = 4; |
| 115 static const int kASTExtensionId = 5; | 111 static const int kASTExtensionId = 5; |
| 116 | 112 |
| 117 class BitrateEstimatorTest : public test::CallTest { | 113 class BitrateEstimatorTest : public test::CallTest { |
| 118 public: | 114 public: |
| 119 BitrateEstimatorTest() : receive_config_(nullptr) {} | 115 BitrateEstimatorTest() : receive_config_(nullptr) {} |
| 120 | 116 |
| 121 virtual ~BitrateEstimatorTest() { | 117 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); } |
| 122 EXPECT_TRUE(streams_.empty()); | |
| 123 } | |
| 124 | 118 |
| 125 virtual void SetUp() { | 119 virtual void SetUp() { |
| 120 EXPECT_CALL(mock_voice_engine_, GetEventLog()) |
| 121 .WillRepeatedly(testing::Return(nullptr)); |
| 122 |
| 126 Call::Config config; | 123 Call::Config config; |
| 127 config.voice_engine = &fake_voice_engine_; | 124 config.voice_engine = &mock_voice_engine_; |
| 128 receiver_call_.reset(Call::Create(config)); | 125 receiver_call_.reset(Call::Create(config)); |
| 129 sender_call_.reset(Call::Create(config)); | 126 sender_call_.reset(Call::Create(config)); |
| 130 | 127 |
| 131 send_transport_.reset(new test::DirectTransport(sender_call_.get())); | 128 send_transport_.reset(new test::DirectTransport(sender_call_.get())); |
| 132 send_transport_->SetReceiver(receiver_call_->Receiver()); | 129 send_transport_->SetReceiver(receiver_call_->Receiver()); |
| 133 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); | 130 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); |
| 134 receive_transport_->SetReceiver(sender_call_->Receiver()); | 131 receive_transport_->SetReceiver(sender_call_->Receiver()); |
| 135 | 132 |
| 136 send_config_ = VideoSendStream::Config(send_transport_.get()); | 133 send_config_ = VideoSendStream::Config(send_transport_.get()); |
| 137 send_config_.rtp.ssrcs.push_back(kSendSsrcs[0]); | 134 send_config_.rtp.ssrcs.push_back(kSendSsrcs[0]); |
| 138 // Encoders will be set separately per stream. | 135 // Encoders will be set separately per stream. |
| 139 send_config_.encoder_settings.encoder = nullptr; | 136 send_config_.encoder_settings.encoder = nullptr; |
| 140 send_config_.encoder_settings.payload_name = "FAKE"; | 137 send_config_.encoder_settings.payload_name = "FAKE"; |
| 141 send_config_.encoder_settings.payload_type = kFakeSendPayloadType; | 138 send_config_.encoder_settings.payload_type = kFakeSendPayloadType; |
| 142 encoder_config_.streams = test::CreateVideoStreams(1); | 139 encoder_config_.streams = test::CreateVideoStreams(1); |
| 143 | 140 |
| 144 receive_config_ = VideoReceiveStream::Config(receive_transport_.get()); | 141 receive_config_ = VideoReceiveStream::Config(receive_transport_.get()); |
| 145 // receive_config_.decoders will be set by every stream separately. | 142 // receive_config_.decoders will be set by every stream separately. |
| 146 receive_config_.rtp.remote_ssrc = send_config_.rtp.ssrcs[0]; | 143 receive_config_.rtp.remote_ssrc = send_config_.rtp.ssrcs[0]; |
| 147 receive_config_.rtp.local_ssrc = kReceiverLocalSsrc; | 144 receive_config_.rtp.local_ssrc = kReceiverLocalSsrc; |
| 148 receive_config_.rtp.remb = true; | 145 receive_config_.rtp.remb = true; |
| 149 receive_config_.rtp.extensions.push_back( | 146 receive_config_.rtp.extensions.push_back( |
| 150 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 147 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 151 receive_config_.rtp.extensions.push_back( | 148 receive_config_.rtp.extensions.push_back( |
| 152 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 149 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 153 } | 150 } |
| 154 | 151 |
| 155 virtual void TearDown() { | 152 virtual void TearDown() { |
| 156 std::for_each(streams_.begin(), streams_.end(), | 153 std::for_each(streams_.begin(), streams_.end(), |
| 157 std::mem_fun(&Stream::StopSending)); | 154 std::mem_fun(&Stream::StopSending)); |
| 158 | 155 |
| 159 send_transport_->StopSending(); | 156 send_transport_->StopSending(); |
| 160 receive_transport_->StopSending(); | 157 receive_transport_->StopSending(); |
| 161 | 158 |
| 162 while (!streams_.empty()) { | 159 while (!streams_.empty()) { |
| 163 delete streams_.back(); | 160 delete streams_.back(); |
| 164 streams_.pop_back(); | 161 streams_.pop_back(); |
| 165 } | 162 } |
| 166 | 163 |
| 167 receiver_call_.reset(); | 164 receiver_call_.reset(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 180 video_receive_stream_(nullptr), | 177 video_receive_stream_(nullptr), |
| 181 frame_generator_capturer_(), | 178 frame_generator_capturer_(), |
| 182 fake_encoder_(Clock::GetRealTimeClock()), | 179 fake_encoder_(Clock::GetRealTimeClock()), |
| 183 fake_decoder_() { | 180 fake_decoder_() { |
| 184 test_->send_config_.rtp.ssrcs[0]++; | 181 test_->send_config_.rtp.ssrcs[0]++; |
| 185 test_->send_config_.encoder_settings.encoder = &fake_encoder_; | 182 test_->send_config_.encoder_settings.encoder = &fake_encoder_; |
| 186 send_stream_ = test_->sender_call_->CreateVideoSendStream( | 183 send_stream_ = test_->sender_call_->CreateVideoSendStream( |
| 187 test_->send_config_, test_->encoder_config_); | 184 test_->send_config_, test_->encoder_config_); |
| 188 RTC_DCHECK_EQ(1u, test_->encoder_config_.streams.size()); | 185 RTC_DCHECK_EQ(1u, test_->encoder_config_.streams.size()); |
| 189 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( | 186 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( |
| 190 send_stream_->Input(), | 187 send_stream_->Input(), test_->encoder_config_.streams[0].width, |
| 191 test_->encoder_config_.streams[0].width, | 188 test_->encoder_config_.streams[0].height, 30, |
| 192 test_->encoder_config_.streams[0].height, | |
| 193 30, | |
| 194 Clock::GetRealTimeClock())); | 189 Clock::GetRealTimeClock())); |
| 195 send_stream_->Start(); | 190 send_stream_->Start(); |
| 196 frame_generator_capturer_->Start(); | 191 frame_generator_capturer_->Start(); |
| 197 | 192 |
| 198 if (receive_audio) { | 193 if (receive_audio) { |
| 199 AudioReceiveStream::Config receive_config; | 194 AudioReceiveStream::Config receive_config; |
| 200 receive_config.rtp.remote_ssrc = test_->send_config_.rtp.ssrcs[0]; | 195 receive_config.rtp.remote_ssrc = test_->send_config_.rtp.ssrcs[0]; |
| 201 // Bogus non-default id to prevent hitting a RTC_DCHECK when creating | 196 // Bogus non-default id to prevent hitting a RTC_DCHECK when creating |
| 202 // the AudioReceiveStream. Every receive stream has to correspond to | 197 // the AudioReceiveStream. Every receive stream has to correspond to |
| 203 // an underlying channel id. | 198 // an underlying channel id. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 BitrateEstimatorTest* test_; | 250 BitrateEstimatorTest* test_; |
| 256 bool is_sending_receiving_; | 251 bool is_sending_receiving_; |
| 257 VideoSendStream* send_stream_; | 252 VideoSendStream* send_stream_; |
| 258 AudioReceiveStream* audio_receive_stream_; | 253 AudioReceiveStream* audio_receive_stream_; |
| 259 VideoReceiveStream* video_receive_stream_; | 254 VideoReceiveStream* video_receive_stream_; |
| 260 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; | 255 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; |
| 261 test::FakeEncoder fake_encoder_; | 256 test::FakeEncoder fake_encoder_; |
| 262 test::FakeDecoder fake_decoder_; | 257 test::FakeDecoder fake_decoder_; |
| 263 }; | 258 }; |
| 264 | 259 |
| 265 test::FakeVoiceEngine fake_voice_engine_; | 260 test::MockVoiceEngine mock_voice_engine_; |
| 266 TraceObserver receiver_trace_; | 261 TraceObserver receiver_trace_; |
| 267 rtc::scoped_ptr<test::DirectTransport> send_transport_; | 262 rtc::scoped_ptr<test::DirectTransport> send_transport_; |
| 268 rtc::scoped_ptr<test::DirectTransport> receive_transport_; | 263 rtc::scoped_ptr<test::DirectTransport> receive_transport_; |
| 269 rtc::scoped_ptr<Call> sender_call_; | 264 rtc::scoped_ptr<Call> sender_call_; |
| 270 rtc::scoped_ptr<Call> receiver_call_; | 265 rtc::scoped_ptr<Call> receiver_call_; |
| 271 VideoReceiveStream::Config receive_config_; | 266 VideoReceiveStream::Config receive_config_; |
| 272 std::vector<Stream*> streams_; | 267 std::vector<Stream*> streams_; |
| 273 }; | 268 }; |
| 274 | 269 |
| 275 static const char* kAbsSendTimeLog = | 270 static const char* kAbsSendTimeLog = |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); | 352 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); |
| 358 receiver_trace_.PushExpectedLogLine( | 353 receiver_trace_.PushExpectedLogLine( |
| 359 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); | 354 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); |
| 360 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 355 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); |
| 361 streams_.push_back(new Stream(this, false)); | 356 streams_.push_back(new Stream(this, false)); |
| 362 streams_[0]->StopSending(); | 357 streams_[0]->StopSending(); |
| 363 streams_[1]->StopSending(); | 358 streams_[1]->StopSending(); |
| 364 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 359 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); |
| 365 } | 360 } |
| 366 } // namespace webrtc | 361 } // namespace webrtc |
| OLD | NEW |