Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc

Issue 2782563003: Replace Clock with timeutils in AudioEncoder. (Closed)
Patch Set: Rebased Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698