OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 | 10 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 }; | 52 }; |
53 | 53 |
54 AudioEncoderOpusStates CreateCodec(size_t num_channels) { | 54 AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
55 AudioEncoderOpusStates states; | 55 AudioEncoderOpusStates states; |
56 states.mock_audio_network_adaptor = | 56 states.mock_audio_network_adaptor = |
57 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); | 57 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); |
58 | 58 |
59 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( | 59 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( |
60 states.mock_audio_network_adaptor); | 60 states.mock_audio_network_adaptor); |
61 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( | 61 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( |
62 const std::string&, const Clock*) { | 62 const std::string&, RtcEventLog* event_log, const Clock*) { |
63 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( | 63 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( |
64 new NiceMock<MockAudioNetworkAdaptor>()); | 64 new NiceMock<MockAudioNetworkAdaptor>()); |
65 EXPECT_CALL(*adaptor, Die()); | 65 EXPECT_CALL(*adaptor, Die()); |
66 if (auto sp = mock_ptr.lock()) { | 66 if (auto sp = mock_ptr.lock()) { |
67 *sp = adaptor.get(); | 67 *sp = adaptor.get(); |
68 } else { | 68 } else { |
69 RTC_NOTREACHED(); | 69 RTC_NOTREACHED(); |
70 } | 70 } |
71 return adaptor; | 71 return adaptor; |
72 }; | 72 }; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 ElementsAre(20, 60)); | 259 ElementsAre(20, 60)); |
260 states.encoder->SetReceiverFrameLengthRange(21, 60); | 260 states.encoder->SetReceiverFrameLengthRange(21, 60); |
261 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); | 261 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); |
262 states.encoder->SetReceiverFrameLengthRange(20, 59); | 262 states.encoder->SetReceiverFrameLengthRange(20, 59); |
263 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); | 263 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
264 } | 264 } |
265 | 265 |
266 TEST(AudioEncoderOpusTest, | 266 TEST(AudioEncoderOpusTest, |
267 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { | 267 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
268 auto states = CreateCodec(2); | 268 auto states = CreateCodec(2); |
269 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 269 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
270 | 270 |
271 auto config = CreateEncoderRuntimeConfig(); | 271 auto config = CreateEncoderRuntimeConfig(); |
272 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 272 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
273 .WillOnce(Return(config)); | 273 .WillOnce(Return(config)); |
274 | 274 |
275 // Since using mock audio network adaptor, any packet loss fraction is fine. | 275 // Since using mock audio network adaptor, any packet loss fraction is fine. |
276 constexpr float kUplinkPacketLoss = 0.1f; | 276 constexpr float kUplinkPacketLoss = 0.1f; |
277 EXPECT_CALL(**states.mock_audio_network_adaptor, | 277 EXPECT_CALL(**states.mock_audio_network_adaptor, |
278 SetUplinkPacketLossFraction(kUplinkPacketLoss)); | 278 SetUplinkPacketLossFraction(kUplinkPacketLoss)); |
279 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); | 279 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); |
280 | 280 |
281 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 281 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
282 } | 282 } |
283 | 283 |
284 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { | 284 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
285 auto states = CreateCodec(2); | 285 auto states = CreateCodec(2); |
286 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 286 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
287 | 287 |
288 auto config = CreateEncoderRuntimeConfig(); | 288 auto config = CreateEncoderRuntimeConfig(); |
289 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 289 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
290 .WillOnce(Return(config)); | 290 .WillOnce(Return(config)); |
291 | 291 |
292 // Since using mock audio network adaptor, any target audio bitrate is fine. | 292 // Since using mock audio network adaptor, any target audio bitrate is fine. |
293 constexpr int kTargetAudioBitrate = 30000; | 293 constexpr int kTargetAudioBitrate = 30000; |
294 constexpr int64_t kProbingIntervalMs = 3000; | 294 constexpr int64_t kProbingIntervalMs = 3000; |
295 EXPECT_CALL(**states.mock_audio_network_adaptor, | 295 EXPECT_CALL(**states.mock_audio_network_adaptor, |
296 SetTargetAudioBitrate(kTargetAudioBitrate)); | 296 SetTargetAudioBitrate(kTargetAudioBitrate)); |
297 EXPECT_CALL(*states.mock_bitrate_smoother, | 297 EXPECT_CALL(*states.mock_bitrate_smoother, |
298 SetTimeConstantMs(kProbingIntervalMs * 4)); | 298 SetTimeConstantMs(kProbingIntervalMs * 4)); |
299 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); | 299 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); |
300 states.encoder->OnReceivedUplinkBandwidth( | 300 states.encoder->OnReceivedUplinkBandwidth( |
301 kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); | 301 kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); |
302 | 302 |
303 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 303 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
304 } | 304 } |
305 | 305 |
306 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) { | 306 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) { |
307 auto states = CreateCodec(2); | 307 auto states = CreateCodec(2); |
308 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 308 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
309 | 309 |
310 auto config = CreateEncoderRuntimeConfig(); | 310 auto config = CreateEncoderRuntimeConfig(); |
311 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 311 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
312 .WillOnce(Return(config)); | 312 .WillOnce(Return(config)); |
313 | 313 |
314 // Since using mock audio network adaptor, any rtt is fine. | 314 // Since using mock audio network adaptor, any rtt is fine. |
315 constexpr int kRtt = 30; | 315 constexpr int kRtt = 30; |
316 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); | 316 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); |
317 states.encoder->OnReceivedRtt(kRtt); | 317 states.encoder->OnReceivedRtt(kRtt); |
318 | 318 |
319 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 319 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
320 } | 320 } |
321 | 321 |
322 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { | 322 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { |
323 auto states = CreateCodec(2); | 323 auto states = CreateCodec(2); |
324 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 324 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
325 | 325 |
326 auto config = CreateEncoderRuntimeConfig(); | 326 auto config = CreateEncoderRuntimeConfig(); |
327 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 327 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
328 .WillOnce(Return(config)); | 328 .WillOnce(Return(config)); |
329 | 329 |
330 // Since using mock audio network adaptor, any overhead is fine. | 330 // Since using mock audio network adaptor, any overhead is fine. |
331 constexpr size_t kOverhead = 64; | 331 constexpr size_t kOverhead = 64; |
332 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); | 332 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); |
333 states.encoder->OnReceivedOverhead(kOverhead); | 333 states.encoder->OnReceivedOverhead(kOverhead); |
334 | 334 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 config.bitrate_bps = rtc::Optional<int>(12500); | 443 config.bitrate_bps = rtc::Optional<int>(12500); |
444 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); | 444 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); |
445 | 445 |
446 // Bitrate above hysteresis window. Expect lower complexity. | 446 // Bitrate above hysteresis window. Expect lower complexity. |
447 config.bitrate_bps = rtc::Optional<int>(14001); | 447 config.bitrate_bps = rtc::Optional<int>(14001); |
448 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); | 448 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); |
449 } | 449 } |
450 | 450 |
451 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { | 451 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { |
452 auto states = CreateCodec(2); | 452 auto states = CreateCodec(2); |
453 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 453 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
454 | 454 |
455 auto config = CreateEncoderRuntimeConfig(); | 455 auto config = CreateEncoderRuntimeConfig(); |
456 AudioNetworkAdaptor::EncoderRuntimeConfig empty_config; | 456 AudioNetworkAdaptor::EncoderRuntimeConfig empty_config; |
457 | 457 |
458 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 458 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
459 .WillOnce(Return(config)) | 459 .WillOnce(Return(config)) |
460 .WillOnce(Return(empty_config)); | 460 .WillOnce(Return(empty_config)); |
461 | 461 |
462 constexpr size_t kOverhead = 64; | 462 constexpr size_t kOverhead = 64; |
463 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) | 463 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) |
464 .Times(2); | 464 .Times(2); |
465 states.encoder->OnReceivedOverhead(kOverhead); | 465 states.encoder->OnReceivedOverhead(kOverhead); |
466 states.encoder->OnReceivedOverhead(kOverhead); | 466 states.encoder->OnReceivedOverhead(kOverhead); |
467 | 467 |
468 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 468 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
469 } | 469 } |
470 | 470 |
471 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { | 471 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { |
472 rtc::ScopedFakeClock fake_clock; | 472 rtc::ScopedFakeClock fake_clock; |
473 auto states = CreateCodec(2); | 473 auto states = CreateCodec(2); |
474 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 474 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
475 std::array<int16_t, 480 * 2> audio; | 475 std::array<int16_t, 480 * 2> audio; |
476 audio.fill(0); | 476 audio.fill(0); |
477 rtc::Buffer encoded; | 477 rtc::Buffer encoded; |
478 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 478 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
479 .WillOnce(Return(rtc::Optional<float>(50000))); | 479 .WillOnce(Return(rtc::Optional<float>(50000))); |
480 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); | 480 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); |
481 states.encoder->Encode( | 481 states.encoder->Encode( |
482 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 482 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
483 | 483 |
484 // Repeat update uplink bandwidth tests. | 484 // Repeat update uplink bandwidth tests. |
485 for (int i = 0; i < 5; i++) { | 485 for (int i = 0; i < 5; i++) { |
486 // Don't update till it is time to update again. | 486 // Don't update till it is time to update again. |
487 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( | 487 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( |
488 states.config.uplink_bandwidth_update_interval_ms - 1)); | 488 states.config.uplink_bandwidth_update_interval_ms - 1)); |
489 states.encoder->Encode( | 489 states.encoder->Encode( |
490 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 490 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
491 | 491 |
492 // Update when it is time to update. | 492 // Update when it is time to update. |
493 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 493 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
494 .WillOnce(Return(rtc::Optional<float>(40000))); | 494 .WillOnce(Return(rtc::Optional<float>(40000))); |
495 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); | 495 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); |
496 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); | 496 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); |
497 states.encoder->Encode( | 497 states.encoder->Encode( |
498 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 498 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
499 } | 499 } |
500 } | 500 } |
501 | 501 |
502 } // namespace webrtc | 502 } // namespace webrtc |
OLD | NEW |