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 <memory> | 12 #include <memory> |
13 #include <string> | 13 #include <string> |
14 | 14 |
15 #include "webrtc/api/call/audio_state.h" | |
16 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
17 #include "webrtc/base/event.h" | 16 #include "webrtc/base/event.h" |
18 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
19 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
20 #include "webrtc/call.h" | 19 #include "webrtc/call.h" |
21 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 20 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
22 #include "webrtc/system_wrappers/include/trace.h" | 21 #include "webrtc/system_wrappers/include/trace.h" |
23 #include "webrtc/test/call_test.h" | 22 #include "webrtc/test/call_test.h" |
24 #include "webrtc/test/direct_transport.h" | 23 #include "webrtc/test/direct_transport.h" |
25 #include "webrtc/test/encoder_settings.h" | 24 #include "webrtc/test/encoder_settings.h" |
26 #include "webrtc/test/fake_decoder.h" | 25 #include "webrtc/test/fake_decoder.h" |
27 #include "webrtc/test/fake_encoder.h" | 26 #include "webrtc/test/fake_encoder.h" |
28 #include "webrtc/test/frame_generator_capturer.h" | 27 #include "webrtc/test/frame_generator_capturer.h" |
29 #include "webrtc/test/gtest.h" | 28 #include "webrtc/test/gtest.h" |
30 #include "webrtc/test/mock_voice_engine.h" | |
31 | 29 |
32 namespace webrtc { | 30 namespace webrtc { |
33 namespace { | 31 namespace { |
34 // Note: If you consider to re-use this class, think twice and instead consider | 32 // Note: If you consider to re-use this class, think twice and instead consider |
35 // writing tests that don't depend on the logging system. | 33 // writing tests that don't depend on the logging system. |
36 class LogObserver { | 34 class LogObserver { |
37 public: | 35 public: |
38 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } | 36 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } |
39 | 37 |
40 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } | 38 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 | 92 |
95 Callback callback_; | 93 Callback callback_; |
96 }; | 94 }; |
97 } // namespace | 95 } // namespace |
98 | 96 |
99 static const int kTOFExtensionId = 4; | 97 static const int kTOFExtensionId = 4; |
100 static const int kASTExtensionId = 5; | 98 static const int kASTExtensionId = 5; |
101 | 99 |
102 class BitrateEstimatorTest : public test::CallTest { | 100 class BitrateEstimatorTest : public test::CallTest { |
103 public: | 101 public: |
104 BitrateEstimatorTest() : mock_voice_engine_(decoder_factory_), | 102 BitrateEstimatorTest() : receive_config_(nullptr) {} |
105 receive_config_(nullptr) {} | |
106 | 103 |
107 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); } | 104 virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); } |
108 | 105 |
109 virtual void SetUp() { | 106 virtual void SetUp() { |
110 AudioState::Config audio_state_config; | |
111 audio_state_config.voice_engine = &mock_voice_engine_; | |
112 Call::Config config(&event_log_); | 107 Call::Config config(&event_log_); |
113 config.audio_state = AudioState::Create(audio_state_config); | |
114 receiver_call_.reset(Call::Create(config)); | 108 receiver_call_.reset(Call::Create(config)); |
115 sender_call_.reset(Call::Create(config)); | 109 sender_call_.reset(Call::Create(config)); |
116 | 110 |
117 send_transport_.reset(new test::DirectTransport(sender_call_.get())); | 111 send_transport_.reset(new test::DirectTransport(sender_call_.get())); |
118 send_transport_->SetReceiver(receiver_call_->Receiver()); | 112 send_transport_->SetReceiver(receiver_call_->Receiver()); |
119 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); | 113 receive_transport_.reset(new test::DirectTransport(receiver_call_.get())); |
120 receive_transport_->SetReceiver(sender_call_->Receiver()); | 114 receive_transport_->SetReceiver(sender_call_->Receiver()); |
121 | 115 |
122 video_send_config_ = VideoSendStream::Config(send_transport_.get()); | 116 video_send_config_ = VideoSendStream::Config(send_transport_.get()); |
123 video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[0]); | 117 video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[0]); |
(...skipping 29 matching lines...) Expand all Loading... |
153 | 147 |
154 receiver_call_.reset(); | 148 receiver_call_.reset(); |
155 sender_call_.reset(); | 149 sender_call_.reset(); |
156 } | 150 } |
157 | 151 |
158 protected: | 152 protected: |
159 friend class Stream; | 153 friend class Stream; |
160 | 154 |
161 class Stream { | 155 class Stream { |
162 public: | 156 public: |
163 Stream(BitrateEstimatorTest* test, bool receive_audio) | 157 explicit Stream(BitrateEstimatorTest* test) |
164 : test_(test), | 158 : test_(test), |
165 is_sending_receiving_(false), | 159 is_sending_receiving_(false), |
166 send_stream_(nullptr), | 160 send_stream_(nullptr), |
167 audio_receive_stream_(nullptr), | |
168 video_receive_stream_(nullptr), | |
169 frame_generator_capturer_(), | 161 frame_generator_capturer_(), |
170 fake_encoder_(Clock::GetRealTimeClock()), | 162 fake_encoder_(Clock::GetRealTimeClock()), |
171 fake_decoder_() { | 163 fake_decoder_() { |
172 test_->video_send_config_.rtp.ssrcs[0]++; | 164 test_->video_send_config_.rtp.ssrcs[0]++; |
173 test_->video_send_config_.encoder_settings.encoder = &fake_encoder_; | 165 test_->video_send_config_.encoder_settings.encoder = &fake_encoder_; |
174 send_stream_ = test_->sender_call_->CreateVideoSendStream( | 166 send_stream_ = test_->sender_call_->CreateVideoSendStream( |
175 test_->video_send_config_.Copy(), | 167 test_->video_send_config_.Copy(), |
176 test_->video_encoder_config_.Copy()); | 168 test_->video_encoder_config_.Copy()); |
177 RTC_DCHECK_EQ(1u, test_->video_encoder_config_.number_of_streams); | 169 RTC_DCHECK_EQ(1u, test_->video_encoder_config_.number_of_streams); |
178 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( | 170 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create( |
179 kDefaultWidth, kDefaultHeight, kDefaultFramerate, | 171 kDefaultWidth, kDefaultHeight, kDefaultFramerate, |
180 Clock::GetRealTimeClock())); | 172 Clock::GetRealTimeClock())); |
181 send_stream_->SetSource( | 173 send_stream_->SetSource( |
182 frame_generator_capturer_.get(), | 174 frame_generator_capturer_.get(), |
183 VideoSendStream::DegradationPreference::kBalanced); | 175 VideoSendStream::DegradationPreference::kBalanced); |
184 send_stream_->Start(); | 176 send_stream_->Start(); |
185 frame_generator_capturer_->Start(); | 177 frame_generator_capturer_->Start(); |
186 | 178 |
187 if (receive_audio) { | 179 VideoReceiveStream::Decoder decoder; |
188 AudioReceiveStream::Config receive_config; | 180 decoder.decoder = &fake_decoder_; |
189 receive_config.rtp.remote_ssrc = test_->video_send_config_.rtp.ssrcs[0]; | 181 decoder.payload_type = |
190 // Bogus non-default id to prevent hitting a RTC_DCHECK when creating | 182 test_->video_send_config_.encoder_settings.payload_type; |
191 // the AudioReceiveStream. Every receive stream has to correspond to | 183 decoder.payload_name = |
192 // an underlying channel id. | 184 test_->video_send_config_.encoder_settings.payload_name; |
193 receive_config.voe_channel_id = 0; | 185 test_->receive_config_.decoders.clear(); |
194 receive_config.rtp.extensions.push_back( | 186 test_->receive_config_.decoders.push_back(decoder); |
195 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); | 187 test_->receive_config_.rtp.remote_ssrc = |
196 receive_config.decoder_factory = test_->decoder_factory_; | 188 test_->video_send_config_.rtp.ssrcs[0]; |
197 audio_receive_stream_ = | 189 test_->receive_config_.rtp.local_ssrc++; |
198 test_->receiver_call_->CreateAudioReceiveStream(receive_config); | 190 test_->receive_config_.renderer = &test->fake_renderer_; |
199 } else { | 191 video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream( |
200 VideoReceiveStream::Decoder decoder; | 192 test_->receive_config_.Copy()); |
201 decoder.decoder = &fake_decoder_; | 193 video_receive_stream_->Start(); |
202 decoder.payload_type = | |
203 test_->video_send_config_.encoder_settings.payload_type; | |
204 decoder.payload_name = | |
205 test_->video_send_config_.encoder_settings.payload_name; | |
206 test_->receive_config_.decoders.clear(); | |
207 test_->receive_config_.decoders.push_back(decoder); | |
208 test_->receive_config_.rtp.remote_ssrc = | |
209 test_->video_send_config_.rtp.ssrcs[0]; | |
210 test_->receive_config_.rtp.local_ssrc++; | |
211 test_->receive_config_.renderer = &test->fake_renderer_; | |
212 video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream( | |
213 test_->receive_config_.Copy()); | |
214 video_receive_stream_->Start(); | |
215 } | |
216 is_sending_receiving_ = true; | 194 is_sending_receiving_ = true; |
217 } | 195 } |
218 | 196 |
219 ~Stream() { | 197 ~Stream() { |
220 EXPECT_FALSE(is_sending_receiving_); | 198 EXPECT_FALSE(is_sending_receiving_); |
221 test_->sender_call_->DestroyVideoSendStream(send_stream_); | 199 test_->sender_call_->DestroyVideoSendStream(send_stream_); |
222 frame_generator_capturer_.reset(nullptr); | 200 frame_generator_capturer_.reset(nullptr); |
223 send_stream_ = nullptr; | 201 send_stream_ = nullptr; |
224 if (audio_receive_stream_) { | |
225 test_->receiver_call_->DestroyAudioReceiveStream(audio_receive_stream_); | |
226 audio_receive_stream_ = nullptr; | |
227 } | |
228 if (video_receive_stream_) { | 202 if (video_receive_stream_) { |
229 test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_); | 203 test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_); |
230 video_receive_stream_ = nullptr; | 204 video_receive_stream_ = nullptr; |
231 } | 205 } |
232 } | 206 } |
233 | 207 |
234 void StopSending() { | 208 void StopSending() { |
235 if (is_sending_receiving_) { | 209 if (is_sending_receiving_) { |
236 frame_generator_capturer_->Stop(); | 210 frame_generator_capturer_->Stop(); |
237 send_stream_->Stop(); | 211 send_stream_->Stop(); |
238 if (video_receive_stream_) { | 212 if (video_receive_stream_) { |
239 video_receive_stream_->Stop(); | 213 video_receive_stream_->Stop(); |
240 } | 214 } |
241 is_sending_receiving_ = false; | 215 is_sending_receiving_ = false; |
242 } | 216 } |
243 } | 217 } |
244 | 218 |
245 private: | 219 private: |
246 BitrateEstimatorTest* test_; | 220 BitrateEstimatorTest* test_; |
247 bool is_sending_receiving_; | 221 bool is_sending_receiving_; |
248 VideoSendStream* send_stream_; | 222 VideoSendStream* send_stream_; |
249 AudioReceiveStream* audio_receive_stream_; | |
250 VideoReceiveStream* video_receive_stream_; | 223 VideoReceiveStream* video_receive_stream_; |
251 std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; | 224 std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; |
252 test::FakeEncoder fake_encoder_; | 225 test::FakeEncoder fake_encoder_; |
253 test::FakeDecoder fake_decoder_; | 226 test::FakeDecoder fake_decoder_; |
254 }; | 227 }; |
255 | 228 |
256 testing::NiceMock<test::MockVoiceEngine> mock_voice_engine_; | |
257 LogObserver receiver_log_; | 229 LogObserver receiver_log_; |
258 std::unique_ptr<test::DirectTransport> send_transport_; | 230 std::unique_ptr<test::DirectTransport> send_transport_; |
259 std::unique_ptr<test::DirectTransport> receive_transport_; | 231 std::unique_ptr<test::DirectTransport> receive_transport_; |
260 std::unique_ptr<Call> sender_call_; | 232 std::unique_ptr<Call> sender_call_; |
261 std::unique_ptr<Call> receiver_call_; | 233 std::unique_ptr<Call> receiver_call_; |
262 VideoReceiveStream::Config receive_config_; | 234 VideoReceiveStream::Config receive_config_; |
263 std::vector<Stream*> streams_; | 235 std::vector<Stream*> streams_; |
264 }; | 236 }; |
265 | 237 |
266 static const char* kAbsSendTimeLog = | 238 static const char* kAbsSendTimeLog = |
267 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; | 239 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
268 static const char* kSingleStreamLog = | 240 static const char* kSingleStreamLog = |
269 "RemoteBitrateEstimatorSingleStream: Instantiating."; | 241 "RemoteBitrateEstimatorSingleStream: Instantiating."; |
270 | 242 |
271 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { | 243 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { |
272 video_send_config_.rtp.extensions.push_back( | 244 video_send_config_.rtp.extensions.push_back( |
273 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 245 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
274 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 246 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
275 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 247 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
276 streams_.push_back(new Stream(this, false)); | 248 streams_.push_back(new Stream(this)); |
277 EXPECT_TRUE(receiver_log_.Wait()); | 249 EXPECT_TRUE(receiver_log_.Wait()); |
278 } | 250 } |
279 | 251 |
280 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { | 252 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { |
281 video_send_config_.rtp.extensions.push_back( | 253 video_send_config_.rtp.extensions.push_back( |
282 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); | 254 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId)); |
283 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 255 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
284 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 256 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
285 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 257 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
286 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 258 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
287 streams_.push_back(new Stream(this, false)); | 259 streams_.push_back(new Stream(this)); |
288 EXPECT_TRUE(receiver_log_.Wait()); | 260 EXPECT_TRUE(receiver_log_.Wait()); |
289 } | 261 } |
290 | 262 |
291 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { | 263 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { |
292 video_send_config_.rtp.extensions.push_back( | 264 video_send_config_.rtp.extensions.push_back( |
293 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 265 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
294 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 266 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
295 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 267 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
296 streams_.push_back(new Stream(this, false)); | 268 streams_.push_back(new Stream(this)); |
297 EXPECT_TRUE(receiver_log_.Wait()); | 269 EXPECT_TRUE(receiver_log_.Wait()); |
298 | 270 |
299 video_send_config_.rtp.extensions[0] = | 271 video_send_config_.rtp.extensions[0] = |
300 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); | 272 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); |
301 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 273 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
302 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 274 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
303 streams_.push_back(new Stream(this, false)); | 275 streams_.push_back(new Stream(this)); |
304 EXPECT_TRUE(receiver_log_.Wait()); | 276 EXPECT_TRUE(receiver_log_.Wait()); |
305 } | 277 } |
306 | 278 |
307 // This test is flaky. See webrtc:5790. | 279 // This test is flaky. See webrtc:5790. |
308 TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) { | 280 TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) { |
309 video_send_config_.rtp.extensions.push_back( | 281 video_send_config_.rtp.extensions.push_back( |
310 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); | 282 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId)); |
311 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 283 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
312 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 284 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
313 receiver_log_.PushExpectedLogLine(kSingleStreamLog); | 285 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
314 streams_.push_back(new Stream(this, false)); | 286 streams_.push_back(new Stream(this)); |
315 EXPECT_TRUE(receiver_log_.Wait()); | 287 EXPECT_TRUE(receiver_log_.Wait()); |
316 | 288 |
317 video_send_config_.rtp.extensions[0] = | 289 video_send_config_.rtp.extensions[0] = |
318 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); | 290 RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId); |
319 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 291 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
320 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); | 292 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
321 streams_.push_back(new Stream(this, false)); | 293 streams_.push_back(new Stream(this)); |
322 EXPECT_TRUE(receiver_log_.Wait()); | 294 EXPECT_TRUE(receiver_log_.Wait()); |
323 | 295 |
324 video_send_config_.rtp.extensions[0] = | 296 video_send_config_.rtp.extensions[0] = |
325 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId); | 297 RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId); |
326 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); | 298 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
327 receiver_log_.PushExpectedLogLine( | 299 receiver_log_.PushExpectedLogLine( |
328 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); | 300 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); |
329 streams_.push_back(new Stream(this, false)); | 301 streams_.push_back(new Stream(this)); |
330 streams_[0]->StopSending(); | 302 streams_[0]->StopSending(); |
331 streams_[1]->StopSending(); | 303 streams_[1]->StopSending(); |
332 EXPECT_TRUE(receiver_log_.Wait()); | 304 EXPECT_TRUE(receiver_log_.Wait()); |
333 } | 305 } |
334 } // namespace webrtc | 306 } // namespace webrtc |
OLD | NEW |