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 |