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 |
11 #include <array> | 11 #include <array> |
12 #include <memory> | 12 #include <memory> |
13 #include <utility> | 13 #include <utility> |
14 | 14 |
15 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
16 #include "webrtc/base/fakeclock.h" | 16 #include "webrtc/base/fakeclock.h" |
17 #include "webrtc/common_audio/mocks/mock_smoothing_filter.h" | 17 #include "webrtc/common_audio/mocks/mock_smoothing_filter.h" |
18 #include "webrtc/common_types.h" | 18 #include "webrtc/common_types.h" |
19 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_netw
ork_adaptor.h" | 19 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_netw
ork_adaptor.h" |
20 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h" | 20 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h" |
21 #include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" | 21 #include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" |
22 #include "webrtc/test/field_trial.h" | 22 #include "webrtc/test/field_trial.h" |
23 #include "webrtc/test/gmock.h" | 23 #include "webrtc/test/gmock.h" |
24 #include "webrtc/test/gtest.h" | 24 #include "webrtc/test/gtest.h" |
25 #include "webrtc/test/testsupport/fileutils.h" | 25 #include "webrtc/test/testsupport/fileutils.h" |
26 #include "webrtc/system_wrappers/include/clock.h" | |
27 | 26 |
28 namespace webrtc { | 27 namespace webrtc { |
29 using ::testing::NiceMock; | 28 using ::testing::NiceMock; |
30 using ::testing::Return; | 29 using ::testing::Return; |
31 | 30 |
32 namespace { | 31 namespace { |
33 | 32 |
34 const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000}; | 33 const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000}; |
35 constexpr int64_t kInitialTimeUs = 12345678; | 34 constexpr int64_t kInitialTimeUs = 12345678; |
36 | 35 |
(...skipping 12 matching lines...) Expand all Loading... |
49 AudioEncoderOpus::Config CreateConfigWithParameters( | 48 AudioEncoderOpus::Config CreateConfigWithParameters( |
50 const SdpAudioFormat::Parameters& params) { | 49 const SdpAudioFormat::Parameters& params) { |
51 SdpAudioFormat format("opus", 48000, 2, params); | 50 SdpAudioFormat format("opus", 48000, 2, params); |
52 return AudioEncoderOpus::CreateConfig(0, format); | 51 return AudioEncoderOpus::CreateConfig(0, format); |
53 } | 52 } |
54 | 53 |
55 struct AudioEncoderOpusStates { | 54 struct AudioEncoderOpusStates { |
56 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; | 55 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; |
57 MockSmoothingFilter* mock_bitrate_smoother; | 56 MockSmoothingFilter* mock_bitrate_smoother; |
58 std::unique_ptr<AudioEncoderOpus> encoder; | 57 std::unique_ptr<AudioEncoderOpus> encoder; |
59 std::unique_ptr<SimulatedClock> simulated_clock; | 58 std::unique_ptr<rtc::ScopedFakeClock> fake_clock; |
60 AudioEncoderOpus::Config config; | 59 AudioEncoderOpus::Config config; |
61 }; | 60 }; |
62 | 61 |
63 AudioEncoderOpusStates CreateCodec(size_t num_channels) { | 62 AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
64 AudioEncoderOpusStates states; | 63 AudioEncoderOpusStates states; |
65 states.mock_audio_network_adaptor = | 64 states.mock_audio_network_adaptor = |
66 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); | 65 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); |
67 | 66 |
68 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( | 67 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( |
69 states.mock_audio_network_adaptor); | 68 states.mock_audio_network_adaptor); |
70 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( | 69 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = |
71 const std::string&, RtcEventLog* event_log, const Clock*) { | 70 [mock_ptr](const std::string&, RtcEventLog* event_log) { |
72 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( | 71 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( |
73 new NiceMock<MockAudioNetworkAdaptor>()); | 72 new NiceMock<MockAudioNetworkAdaptor>()); |
74 EXPECT_CALL(*adaptor, Die()); | 73 EXPECT_CALL(*adaptor, Die()); |
75 if (auto sp = mock_ptr.lock()) { | 74 if (auto sp = mock_ptr.lock()) { |
76 *sp = adaptor.get(); | 75 *sp = adaptor.get(); |
77 } else { | 76 } else { |
78 RTC_NOTREACHED(); | 77 RTC_NOTREACHED(); |
79 } | 78 } |
80 return adaptor; | 79 return adaptor; |
81 }; | 80 }; |
82 | 81 |
83 CodecInst codec_inst = kDefaultOpusSettings; | 82 CodecInst codec_inst = kDefaultOpusSettings; |
84 codec_inst.channels = num_channels; | 83 codec_inst.channels = num_channels; |
85 states.config = CreateConfig(codec_inst); | 84 states.config = CreateConfig(codec_inst); |
86 std::unique_ptr<MockSmoothingFilter> bitrate_smoother( | 85 std::unique_ptr<MockSmoothingFilter> bitrate_smoother( |
87 new MockSmoothingFilter()); | 86 new MockSmoothingFilter()); |
88 states.mock_bitrate_smoother = bitrate_smoother.get(); | 87 states.mock_bitrate_smoother = bitrate_smoother.get(); |
89 states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs)); | 88 states.fake_clock.reset(new rtc::ScopedFakeClock()); |
90 states.config.clock = states.simulated_clock.get(); | 89 states.fake_clock->SetTimeMicros(kInitialTimeUs); |
91 | 90 |
92 states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator), | 91 states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator), |
93 std::move(bitrate_smoother))); | 92 std::move(bitrate_smoother))); |
94 return states; | 93 return states; |
95 } | 94 } |
96 | 95 |
97 AudioEncoderRuntimeConfig CreateEncoderRuntimeConfig() { | 96 AudioEncoderRuntimeConfig CreateEncoderRuntimeConfig() { |
98 constexpr int kBitrate = 40000; | 97 constexpr int kBitrate = 40000; |
99 constexpr int kFrameLength = 60; | 98 constexpr int kFrameLength = 60; |
100 constexpr bool kEnableFec = true; | 99 constexpr bool kEnableFec = true; |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 // of them. | 236 // of them. |
238 void TestSetPacketLossRate(AudioEncoderOpusStates* states, | 237 void TestSetPacketLossRate(AudioEncoderOpusStates* states, |
239 const std::vector<float>& losses, | 238 const std::vector<float>& losses, |
240 float expected_return) { | 239 float expected_return) { |
241 // |kSampleIntervalMs| is chosen to ease the calculation since | 240 // |kSampleIntervalMs| is chosen to ease the calculation since |
242 // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of | 241 // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of |
243 // PacketLossFractionSmoother used in AudioEncoderOpus. | 242 // PacketLossFractionSmoother used in AudioEncoderOpus. |
244 constexpr int64_t kSampleIntervalMs = 184198; | 243 constexpr int64_t kSampleIntervalMs = 184198; |
245 for (float loss : losses) { | 244 for (float loss : losses) { |
246 states->encoder->OnReceivedUplinkPacketLossFraction(loss); | 245 states->encoder->OnReceivedUplinkPacketLossFraction(loss); |
247 states->simulated_clock->AdvanceTimeMilliseconds(kSampleIntervalMs); | 246 states->fake_clock->AdvanceTime( |
| 247 rtc::TimeDelta::FromMilliseconds(kSampleIntervalMs)); |
248 EXPECT_FLOAT_EQ(expected_return, states->encoder->packet_loss_rate()); | 248 EXPECT_FLOAT_EQ(expected_return, states->encoder->packet_loss_rate()); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 } // namespace | 252 } // namespace |
253 | 253 |
254 TEST(AudioEncoderOpusTest, PacketLossRateOptimized) { | 254 TEST(AudioEncoderOpusTest, PacketLossRateOptimized) { |
255 auto states = CreateCodec(1); | 255 auto states = CreateCodec(1); |
256 auto I = [](float a, float b) { return IntervalSteps(a, b, 10); }; | 256 auto I = [](float a, float b) { return IntervalSteps(a, b, 10); }; |
257 constexpr float eps = 1e-8f; | 257 constexpr float eps = 1e-8f; |
(...skipping 26 matching lines...) Expand all Loading... |
284 states.encoder->SetReceiverFrameLengthRange(0, 12345); | 284 states.encoder->SetReceiverFrameLengthRange(0, 12345); |
285 states.encoder->SetReceiverFrameLengthRange(21, 60); | 285 states.encoder->SetReceiverFrameLengthRange(21, 60); |
286 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); | 286 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); |
287 states.encoder->SetReceiverFrameLengthRange(20, 59); | 287 states.encoder->SetReceiverFrameLengthRange(20, 59); |
288 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); | 288 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
289 } | 289 } |
290 | 290 |
291 TEST(AudioEncoderOpusTest, | 291 TEST(AudioEncoderOpusTest, |
292 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { | 292 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
293 auto states = CreateCodec(2); | 293 auto states = CreateCodec(2); |
294 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 294 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
295 | 295 |
296 auto config = CreateEncoderRuntimeConfig(); | 296 auto config = CreateEncoderRuntimeConfig(); |
297 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 297 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
298 .WillOnce(Return(config)); | 298 .WillOnce(Return(config)); |
299 | 299 |
300 // Since using mock audio network adaptor, any packet loss fraction is fine. | 300 // Since using mock audio network adaptor, any packet loss fraction is fine. |
301 constexpr float kUplinkPacketLoss = 0.1f; | 301 constexpr float kUplinkPacketLoss = 0.1f; |
302 EXPECT_CALL(**states.mock_audio_network_adaptor, | 302 EXPECT_CALL(**states.mock_audio_network_adaptor, |
303 SetUplinkPacketLossFraction(kUplinkPacketLoss)); | 303 SetUplinkPacketLossFraction(kUplinkPacketLoss)); |
304 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); | 304 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); |
305 | 305 |
306 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 306 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
307 } | 307 } |
308 | 308 |
309 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { | 309 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
310 auto states = CreateCodec(2); | 310 auto states = CreateCodec(2); |
311 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 311 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
312 | 312 |
313 auto config = CreateEncoderRuntimeConfig(); | 313 auto config = CreateEncoderRuntimeConfig(); |
314 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 314 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
315 .WillOnce(Return(config)); | 315 .WillOnce(Return(config)); |
316 | 316 |
317 // Since using mock audio network adaptor, any target audio bitrate is fine. | 317 // Since using mock audio network adaptor, any target audio bitrate is fine. |
318 constexpr int kTargetAudioBitrate = 30000; | 318 constexpr int kTargetAudioBitrate = 30000; |
319 constexpr int64_t kProbingIntervalMs = 3000; | 319 constexpr int64_t kProbingIntervalMs = 3000; |
320 EXPECT_CALL(**states.mock_audio_network_adaptor, | 320 EXPECT_CALL(**states.mock_audio_network_adaptor, |
321 SetTargetAudioBitrate(kTargetAudioBitrate)); | 321 SetTargetAudioBitrate(kTargetAudioBitrate)); |
322 EXPECT_CALL(*states.mock_bitrate_smoother, | 322 EXPECT_CALL(*states.mock_bitrate_smoother, |
323 SetTimeConstantMs(kProbingIntervalMs * 4)); | 323 SetTimeConstantMs(kProbingIntervalMs * 4)); |
324 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); | 324 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); |
325 states.encoder->OnReceivedUplinkBandwidth( | 325 states.encoder->OnReceivedUplinkBandwidth( |
326 kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); | 326 kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); |
327 | 327 |
328 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 328 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
329 } | 329 } |
330 | 330 |
331 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) { | 331 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) { |
332 auto states = CreateCodec(2); | 332 auto states = CreateCodec(2); |
333 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 333 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
334 | 334 |
335 auto config = CreateEncoderRuntimeConfig(); | 335 auto config = CreateEncoderRuntimeConfig(); |
336 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 336 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
337 .WillOnce(Return(config)); | 337 .WillOnce(Return(config)); |
338 | 338 |
339 // Since using mock audio network adaptor, any rtt is fine. | 339 // Since using mock audio network adaptor, any rtt is fine. |
340 constexpr int kRtt = 30; | 340 constexpr int kRtt = 30; |
341 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); | 341 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); |
342 states.encoder->OnReceivedRtt(kRtt); | 342 states.encoder->OnReceivedRtt(kRtt); |
343 | 343 |
344 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 344 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
345 } | 345 } |
346 | 346 |
347 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { | 347 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { |
348 auto states = CreateCodec(2); | 348 auto states = CreateCodec(2); |
349 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 349 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
350 | 350 |
351 auto config = CreateEncoderRuntimeConfig(); | 351 auto config = CreateEncoderRuntimeConfig(); |
352 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 352 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
353 .WillOnce(Return(config)); | 353 .WillOnce(Return(config)); |
354 | 354 |
355 // Since using mock audio network adaptor, any overhead is fine. | 355 // Since using mock audio network adaptor, any overhead is fine. |
356 constexpr size_t kOverhead = 64; | 356 constexpr size_t kOverhead = 64; |
357 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); | 357 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); |
358 states.encoder->OnReceivedOverhead(kOverhead); | 358 states.encoder->OnReceivedOverhead(kOverhead); |
359 | 359 |
360 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 360 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
361 } | 361 } |
362 | 362 |
363 TEST(AudioEncoderOpusTest, | 363 TEST(AudioEncoderOpusTest, |
364 PacketLossFractionSmoothedOnSetUplinkPacketLossFraction) { | 364 PacketLossFractionSmoothedOnSetUplinkPacketLossFraction) { |
365 auto states = CreateCodec(2); | 365 auto states = CreateCodec(2); |
366 | 366 |
367 // The values are carefully chosen so that if no smoothing is made, the test | 367 // The values are carefully chosen so that if no smoothing is made, the test |
368 // will fail. | 368 // will fail. |
369 constexpr float kPacketLossFraction_1 = 0.02f; | 369 constexpr float kPacketLossFraction_1 = 0.02f; |
370 constexpr float kPacketLossFraction_2 = 0.198f; | 370 constexpr float kPacketLossFraction_2 = 0.198f; |
371 // |kSecondSampleTimeMs| is chosen to ease the calculation since | 371 // |kSecondSampleTimeMs| is chosen to ease the calculation since |
372 // 0.9999 ^ 6931 = 0.5. | 372 // 0.9999 ^ 6931 = 0.5. |
373 constexpr int64_t kSecondSampleTimeMs = 6931; | 373 constexpr int64_t kSecondSampleTimeMs = 6931; |
374 | 374 |
375 // First time, no filtering. | 375 // First time, no filtering. |
376 states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_1); | 376 states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_1); |
377 EXPECT_FLOAT_EQ(0.01f, states.encoder->packet_loss_rate()); | 377 EXPECT_FLOAT_EQ(0.01f, states.encoder->packet_loss_rate()); |
378 | 378 |
379 states.simulated_clock->AdvanceTimeMilliseconds(kSecondSampleTimeMs); | 379 states.fake_clock->AdvanceTime( |
| 380 rtc::TimeDelta::FromMilliseconds(kSecondSampleTimeMs)); |
380 states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_2); | 381 states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_2); |
381 | 382 |
382 // Now the output of packet loss fraction smoother should be | 383 // Now the output of packet loss fraction smoother should be |
383 // (0.02 + 0.198) / 2 = 0.109, which reach the threshold for the optimized | 384 // (0.02 + 0.198) / 2 = 0.109, which reach the threshold for the optimized |
384 // packet loss rate to increase to 0.05. If no smoothing has been made, the | 385 // packet loss rate to increase to 0.05. If no smoothing has been made, the |
385 // optimized packet loss rate should have been increase to 0.1. | 386 // optimized packet loss rate should have been increase to 0.1. |
386 EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate()); | 387 EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate()); |
387 } | 388 } |
388 | 389 |
389 TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) { | 390 TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 config.bitrate_bps = rtc::Optional<int>(12500); | 469 config.bitrate_bps = rtc::Optional<int>(12500); |
469 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); | 470 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); |
470 | 471 |
471 // Bitrate above hysteresis window. Expect lower complexity. | 472 // Bitrate above hysteresis window. Expect lower complexity. |
472 config.bitrate_bps = rtc::Optional<int>(14001); | 473 config.bitrate_bps = rtc::Optional<int>(14001); |
473 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); | 474 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); |
474 } | 475 } |
475 | 476 |
476 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { | 477 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { |
477 auto states = CreateCodec(2); | 478 auto states = CreateCodec(2); |
478 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 479 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
479 | 480 |
480 auto config = CreateEncoderRuntimeConfig(); | 481 auto config = CreateEncoderRuntimeConfig(); |
481 AudioEncoderRuntimeConfig empty_config; | 482 AudioEncoderRuntimeConfig empty_config; |
482 | 483 |
483 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 484 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
484 .WillOnce(Return(config)) | 485 .WillOnce(Return(config)) |
485 .WillOnce(Return(empty_config)); | 486 .WillOnce(Return(empty_config)); |
486 | 487 |
487 constexpr size_t kOverhead = 64; | 488 constexpr size_t kOverhead = 64; |
488 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) | 489 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) |
489 .Times(2); | 490 .Times(2); |
490 states.encoder->OnReceivedOverhead(kOverhead); | 491 states.encoder->OnReceivedOverhead(kOverhead); |
491 states.encoder->OnReceivedOverhead(kOverhead); | 492 states.encoder->OnReceivedOverhead(kOverhead); |
492 | 493 |
493 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 494 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
494 } | 495 } |
495 | 496 |
496 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { | 497 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { |
497 rtc::ScopedFakeClock fake_clock; | |
498 auto states = CreateCodec(2); | 498 auto states = CreateCodec(2); |
499 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); | 499 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
500 std::array<int16_t, 480 * 2> audio; | 500 std::array<int16_t, 480 * 2> audio; |
501 audio.fill(0); | 501 audio.fill(0); |
502 rtc::Buffer encoded; | 502 rtc::Buffer encoded; |
503 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 503 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
504 .WillOnce(Return(rtc::Optional<float>(50000))); | 504 .WillOnce(Return(rtc::Optional<float>(50000))); |
505 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); | 505 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); |
506 states.encoder->Encode( | 506 states.encoder->Encode( |
507 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 507 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
508 | 508 |
509 // Repeat update uplink bandwidth tests. | 509 // Repeat update uplink bandwidth tests. |
510 for (int i = 0; i < 5; i++) { | 510 for (int i = 0; i < 5; i++) { |
511 // Don't update till it is time to update again. | 511 // Don't update till it is time to update again. |
512 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( | 512 states.fake_clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds( |
513 states.config.uplink_bandwidth_update_interval_ms - 1)); | 513 states.config.uplink_bandwidth_update_interval_ms - 1)); |
514 states.encoder->Encode( | 514 states.encoder->Encode( |
515 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 515 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
516 | 516 |
517 // Update when it is time to update. | 517 // Update when it is time to update. |
518 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 518 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
519 .WillOnce(Return(rtc::Optional<float>(40000))); | 519 .WillOnce(Return(rtc::Optional<float>(40000))); |
520 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); | 520 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); |
521 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); | 521 states.fake_clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); |
522 states.encoder->Encode( | 522 states.encoder->Encode( |
523 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 523 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
524 } | 524 } |
525 } | 525 } |
526 | 526 |
527 TEST(AudioEncoderOpusTest, EncodeAtMinBitrate) { | 527 TEST(AudioEncoderOpusTest, EncodeAtMinBitrate) { |
528 auto states = CreateCodec(1); | 528 auto states = CreateCodec(1); |
529 constexpr int kNumPacketsToEncode = 2; | 529 constexpr int kNumPacketsToEncode = 2; |
530 auto audio_frames = | 530 auto audio_frames = |
531 Create10msAudioBlocks(states.encoder, kNumPacketsToEncode * 20); | 531 Create10msAudioBlocks(states.encoder, kNumPacketsToEncode * 20); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 EXPECT_EQ(24001, config.max_playback_rate_hz); | 741 EXPECT_EQ(24001, config.max_playback_rate_hz); |
742 EXPECT_EQ(32000, config.bitrate_bps); | 742 EXPECT_EQ(32000, config.bitrate_bps); |
743 | 743 |
744 config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}, | 744 config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}, |
745 {"stereo", "1"}}); | 745 {"stereo", "1"}}); |
746 EXPECT_EQ(24001, config.max_playback_rate_hz); | 746 EXPECT_EQ(24001, config.max_playback_rate_hz); |
747 EXPECT_EQ(64000, config.bitrate_bps); | 747 EXPECT_EQ(64000, config.bitrate_bps); |
748 } | 748 } |
749 | 749 |
750 } // namespace webrtc | 750 } // namespace webrtc |
OLD | NEW |