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

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

Issue 2546493002: Update smoothed bitrate. (Closed)
Patch Set: Deprecated OnReceivedTargetAudioBitrate. Created 3 years, 12 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 <memory> 11 #include <memory>
12 12
13 #include "webrtc/base/checks.h" 13 #include "webrtc/base/checks.h"
14 #include "webrtc/common_audio/mocks/mock_smoothing_filter.h"
14 #include "webrtc/common_types.h" 15 #include "webrtc/common_types.h"
15 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_netw ork_adaptor.h" 16 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_netw ork_adaptor.h"
16 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h" 17 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
17 #include "webrtc/test/field_trial.h" 18 #include "webrtc/test/field_trial.h"
18 #include "webrtc/test/gmock.h" 19 #include "webrtc/test/gmock.h"
19 #include "webrtc/test/gtest.h" 20 #include "webrtc/test/gtest.h"
20 #include "webrtc/system_wrappers/include/clock.h" 21 #include "webrtc/system_wrappers/include/clock.h"
21 22
22 namespace webrtc { 23 namespace webrtc {
23 using ::testing::NiceMock; 24 using ::testing::NiceMock;
(...skipping 11 matching lines...) Expand all
35 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); 36 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
36 config.payload_type = codec_inst.pltype; 37 config.payload_type = codec_inst.pltype;
37 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip 38 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
38 : AudioEncoderOpus::kAudio; 39 : AudioEncoderOpus::kAudio;
39 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); 40 config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
40 return config; 41 return config;
41 } 42 }
42 43
43 struct AudioEncoderOpusStates { 44 struct AudioEncoderOpusStates {
44 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; 45 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor;
46 MockSmoothingFilter* mock_bitrate_smoother;
45 std::unique_ptr<AudioEncoderOpus> encoder; 47 std::unique_ptr<AudioEncoderOpus> encoder;
46 std::unique_ptr<SimulatedClock> simulated_clock; 48 std::unique_ptr<SimulatedClock> simulated_clock;
49 AudioEncoderOpus::Config config;
47 }; 50 };
48 51
49 AudioEncoderOpusStates CreateCodec(size_t num_channels) { 52 AudioEncoderOpusStates CreateCodec(size_t num_channels) {
50 AudioEncoderOpusStates states; 53 AudioEncoderOpusStates states;
51 states.mock_audio_network_adaptor = 54 states.mock_audio_network_adaptor =
52 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); 55 std::make_shared<MockAudioNetworkAdaptor*>(nullptr);
53 56
54 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( 57 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr(
55 states.mock_audio_network_adaptor); 58 states.mock_audio_network_adaptor);
56 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( 59 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr](
57 const std::string&, const Clock*) { 60 const std::string&, const Clock*) {
58 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( 61 std::unique_ptr<MockAudioNetworkAdaptor> adaptor(
59 new NiceMock<MockAudioNetworkAdaptor>()); 62 new NiceMock<MockAudioNetworkAdaptor>());
60 EXPECT_CALL(*adaptor, Die()); 63 EXPECT_CALL(*adaptor, Die());
61 if (auto sp = mock_ptr.lock()) { 64 if (auto sp = mock_ptr.lock()) {
62 *sp = adaptor.get(); 65 *sp = adaptor.get();
63 } else { 66 } else {
64 RTC_NOTREACHED(); 67 RTC_NOTREACHED();
65 } 68 }
66 return adaptor; 69 return adaptor;
67 }; 70 };
68 71
69 CodecInst codec_inst = kDefaultOpusSettings; 72 CodecInst codec_inst = kDefaultOpusSettings;
70 codec_inst.channels = num_channels; 73 codec_inst.channels = num_channels;
71 auto config = CreateConfig(codec_inst); 74 states.config = CreateConfig(codec_inst);
75 std::unique_ptr<MockSmoothingFilter> bitrate_smoother(
76 new MockSmoothingFilter());
77 states.mock_bitrate_smoother = bitrate_smoother.get();
72 states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs)); 78 states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs));
73 config.clock = states.simulated_clock.get(); 79 states.config.clock = states.simulated_clock.get();
74 80
75 states.encoder.reset(new AudioEncoderOpus(config, std::move(creator))); 81 states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator),
82 std::move(bitrate_smoother)));
76 return states; 83 return states;
77 } 84 }
78 85
79 AudioNetworkAdaptor::EncoderRuntimeConfig CreateEncoderRuntimeConfig() { 86 AudioNetworkAdaptor::EncoderRuntimeConfig CreateEncoderRuntimeConfig() {
80 constexpr int kBitrate = 40000; 87 constexpr int kBitrate = 40000;
81 constexpr int kFrameLength = 60; 88 constexpr int kFrameLength = 60;
82 constexpr bool kEnableFec = true; 89 constexpr bool kEnableFec = true;
83 constexpr bool kEnableDtx = false; 90 constexpr bool kEnableDtx = false;
84 constexpr size_t kNumChannels = 1; 91 constexpr size_t kNumChannels = 1;
85 constexpr float kPacketLossFraction = 0.1f; 92 constexpr float kPacketLossFraction = 0.1f;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 EXPECT_TRUE(states.encoder->SetDtx(false)); 159 EXPECT_TRUE(states.encoder->SetDtx(false));
153 } 160 }
154 161
155 TEST(AudioEncoderOpusTest, 162 TEST(AudioEncoderOpusTest,
156 OnReceivedTargetAudioBitrateWithoutAudioNetworkAdaptor) { 163 OnReceivedTargetAudioBitrateWithoutAudioNetworkAdaptor) {
157 auto states = CreateCodec(1); 164 auto states = CreateCodec(1);
158 // Constants are replicated from audio_states.encoderopus.cc. 165 // Constants are replicated from audio_states.encoderopus.cc.
159 const int kMinBitrateBps = 500; 166 const int kMinBitrateBps = 500;
160 const int kMaxBitrateBps = 512000; 167 const int kMaxBitrateBps = 512000;
161 // Set a too low bitrate. 168 // Set a too low bitrate.
162 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps - 1); 169 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps - 1,
170 rtc::Optional<int64_t>());
163 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); 171 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
164 // Set a too high bitrate. 172 // Set a too high bitrate.
165 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps + 1); 173 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps + 1,
174 rtc::Optional<int64_t>());
166 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); 175 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
167 // Set the minimum rate. 176 // Set the minimum rate.
168 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps); 177 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps,
178 rtc::Optional<int64_t>());
169 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); 179 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
170 // Set the maximum rate. 180 // Set the maximum rate.
171 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps); 181 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps,
182 rtc::Optional<int64_t>());
172 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); 183 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
173 // Set rates from 1000 up to 32000 bps. 184 // Set rates from 1000 up to 32000 bps.
174 for (int rate = 1000; rate <= 32000; rate += 1000) { 185 for (int rate = 1000; rate <= 32000; rate += 1000) {
175 states.encoder->OnReceivedTargetAudioBitrate(rate); 186 states.encoder->OnReceivedTargetAudioBitrate(rate,
187 rtc::Optional<int64_t>());
176 EXPECT_EQ(rate, states.encoder->GetTargetBitrate()); 188 EXPECT_EQ(rate, states.encoder->GetTargetBitrate());
177 } 189 }
178 } 190 }
179 191
180 namespace { 192 namespace {
181 193
182 // Returns a vector with the n evenly-spaced numbers a, a + (b - a)/(n - 1), 194 // Returns a vector with the n evenly-spaced numbers a, a + (b - a)/(n - 1),
183 // ..., b. 195 // ..., b.
184 std::vector<float> IntervalSteps(float a, float b, size_t n) { 196 std::vector<float> IntervalSteps(float a, float b, size_t n) {
185 RTC_DCHECK_GT(n, 1u); 197 RTC_DCHECK_GT(n, 1u);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 ElementsAre(states.encoder->next_frame_length_ms())); 255 ElementsAre(states.encoder->next_frame_length_ms()));
244 states.encoder->SetReceiverFrameLengthRange(0, 12345); 256 states.encoder->SetReceiverFrameLengthRange(0, 12345);
245 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), 257 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(),
246 ElementsAre(20, 60)); 258 ElementsAre(20, 60));
247 states.encoder->SetReceiverFrameLengthRange(21, 60); 259 states.encoder->SetReceiverFrameLengthRange(21, 60);
248 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); 260 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60));
249 states.encoder->SetReceiverFrameLengthRange(20, 59); 261 states.encoder->SetReceiverFrameLengthRange(20, 59);
250 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); 262 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20));
251 } 263 }
252 264
253 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) {
254 auto states = CreateCodec(2);
255 states.encoder->EnableAudioNetworkAdaptor("", nullptr);
256
257 auto config = CreateEncoderRuntimeConfig();
258 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
259 .WillOnce(Return(config));
260
261 // Since using mock audio network adaptor, any bandwidth value is fine.
262 constexpr int kUplinkBandwidth = 50000;
263 EXPECT_CALL(**states.mock_audio_network_adaptor,
264 SetUplinkBandwidth(kUplinkBandwidth));
265 states.encoder->OnReceivedUplinkBandwidth(kUplinkBandwidth);
266
267 CheckEncoderRuntimeConfig(states.encoder.get(), config);
268 }
269
270 TEST(AudioEncoderOpusTest, 265 TEST(AudioEncoderOpusTest,
271 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { 266 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) {
272 auto states = CreateCodec(2); 267 auto states = CreateCodec(2);
273 states.encoder->EnableAudioNetworkAdaptor("", nullptr); 268 states.encoder->EnableAudioNetworkAdaptor("", nullptr);
274 269
275 auto config = CreateEncoderRuntimeConfig(); 270 auto config = CreateEncoderRuntimeConfig();
276 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) 271 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
277 .WillOnce(Return(config)); 272 .WillOnce(Return(config));
278 273
279 // Since using mock audio network adaptor, any packet loss fraction is fine. 274 // Since using mock audio network adaptor, any packet loss fraction is fine.
280 constexpr float kUplinkPacketLoss = 0.1f; 275 constexpr float kUplinkPacketLoss = 0.1f;
281 EXPECT_CALL(**states.mock_audio_network_adaptor, 276 EXPECT_CALL(**states.mock_audio_network_adaptor,
282 SetUplinkPacketLossFraction(kUplinkPacketLoss)); 277 SetUplinkPacketLossFraction(kUplinkPacketLoss));
283 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); 278 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss);
284 279
285 CheckEncoderRuntimeConfig(states.encoder.get(), config); 280 CheckEncoderRuntimeConfig(states.encoder.get(), config);
286 } 281 }
287 282
288 TEST(AudioEncoderOpusTest, 283 TEST(AudioEncoderOpusTest,
289 InvokeAudioNetworkAdaptorOnReceivedTargetAudioBitrate) { 284 InvokeAudioNetworkAdaptorOnReceivedTargetAudioBitrate) {
290 auto states = CreateCodec(2); 285 auto states = CreateCodec(2);
291 states.encoder->EnableAudioNetworkAdaptor("", nullptr); 286 states.encoder->EnableAudioNetworkAdaptor("", nullptr);
292 287
293 auto config = CreateEncoderRuntimeConfig(); 288 auto config = CreateEncoderRuntimeConfig();
294 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) 289 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
295 .WillOnce(Return(config)); 290 .WillOnce(Return(config));
296 291
297 // 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.
298 constexpr int kTargetAudioBitrate = 30000; 293 constexpr int kTargetAudioBitrate = 30000;
294 constexpr int64_t kProbingIntervalMs = 3000;
299 EXPECT_CALL(**states.mock_audio_network_adaptor, 295 EXPECT_CALL(**states.mock_audio_network_adaptor,
300 SetTargetAudioBitrate(kTargetAudioBitrate)); 296 SetTargetAudioBitrate(kTargetAudioBitrate));
301 states.encoder->OnReceivedTargetAudioBitrate(kTargetAudioBitrate); 297 EXPECT_CALL(*states.mock_bitrate_smoother,
298 SetTimeConstantMs(kProbingIntervalMs * 4));
299 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate));
300 states.encoder->OnReceivedTargetAudioBitrate(
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);
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())
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 // optimized packet loss rate should have been increase to 0.1. 360 // optimized packet loss rate should have been increase to 0.1.
361 EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate()); 361 EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate());
362 } 362 }
363 363
364 TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) { 364 TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) {
365 test::ScopedFieldTrials override_field_trials( 365 test::ScopedFieldTrials override_field_trials(
366 "WebRTC-SendSideBwe-WithOverhead/Enabled/"); 366 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
367 367
368 auto states = CreateCodec(2); 368 auto states = CreateCodec(2);
369 369
370 states.encoder->OnReceivedTargetAudioBitrate(kDefaultOpusSettings.rate * 2); 370 states.encoder->OnReceivedTargetAudioBitrate(kDefaultOpusSettings.rate * 2,
371 rtc::Optional<int64_t>());
371 372
372 // Since |OnReceivedOverhead| has not been called, the codec bitrate should 373 // Since |OnReceivedOverhead| has not been called, the codec bitrate should
373 // not change. 374 // not change.
374 EXPECT_EQ(kDefaultOpusSettings.rate, states.encoder->GetTargetBitrate()); 375 EXPECT_EQ(kDefaultOpusSettings.rate, states.encoder->GetTargetBitrate());
375 } 376 }
376 377
377 TEST(AudioEncoderOpusTest, OverheadRemovedFromTargetAudioBitrate) { 378 TEST(AudioEncoderOpusTest, OverheadRemovedFromTargetAudioBitrate) {
378 test::ScopedFieldTrials override_field_trials( 379 test::ScopedFieldTrials override_field_trials(
379 "WebRTC-SendSideBwe-WithOverhead/Enabled/"); 380 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
380 381
381 auto states = CreateCodec(2); 382 auto states = CreateCodec(2);
382 383
383 constexpr size_t kOverheadBytesPerPacket = 64; 384 constexpr size_t kOverheadBytesPerPacket = 64;
384 states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket); 385 states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket);
385 386
386 constexpr int kTargetBitrateBps = 40000; 387 constexpr int kTargetBitrateBps = 40000;
387 states.encoder->OnReceivedTargetAudioBitrate(kTargetBitrateBps); 388 states.encoder->OnReceivedTargetAudioBitrate(kTargetBitrateBps,
389 rtc::Optional<int64_t>());
388 390
389 int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize); 391 int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize);
390 EXPECT_EQ(kTargetBitrateBps - 392 EXPECT_EQ(kTargetBitrateBps -
391 8 * static_cast<int>(kOverheadBytesPerPacket) * packet_rate, 393 8 * static_cast<int>(kOverheadBytesPerPacket) * packet_rate,
392 states.encoder->GetTargetBitrate()); 394 states.encoder->GetTargetBitrate());
393 } 395 }
394 396
395 TEST(AudioEncoderOpusTest, BitrateBounded) { 397 TEST(AudioEncoderOpusTest, BitrateBounded) {
396 test::ScopedFieldTrials override_field_trials( 398 test::ScopedFieldTrials override_field_trials(
397 "WebRTC-SendSideBwe-WithOverhead/Enabled/"); 399 "WebRTC-SendSideBwe-WithOverhead/Enabled/");
398 400
399 constexpr int kMinBitrateBps = 500; 401 constexpr int kMinBitrateBps = 500;
400 constexpr int kMaxBitrateBps = 512000; 402 constexpr int kMaxBitrateBps = 512000;
401 403
402 auto states = CreateCodec(2); 404 auto states = CreateCodec(2);
403 405
404 constexpr size_t kOverheadBytesPerPacket = 64; 406 constexpr size_t kOverheadBytesPerPacket = 64;
405 states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket); 407 states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket);
406 408
407 int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize); 409 int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize);
408 410
409 // Set a target rate that is smaller than |kMinBitrateBps| when overhead is 411 // Set a target rate that is smaller than |kMinBitrateBps| when overhead is
410 // subtracted. The eventual codec rate should be bounded by |kMinBitrateBps|. 412 // subtracted. The eventual codec rate should be bounded by |kMinBitrateBps|.
411 int target_bitrate = 413 int target_bitrate =
412 kOverheadBytesPerPacket * 8 * packet_rate + kMinBitrateBps - 1; 414 kOverheadBytesPerPacket * 8 * packet_rate + kMinBitrateBps - 1;
413 states.encoder->OnReceivedTargetAudioBitrate(target_bitrate); 415 states.encoder->OnReceivedTargetAudioBitrate(target_bitrate,
416 rtc::Optional<int64_t>());
414 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); 417 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
415 418
416 // Set a target rate that is greater than |kMaxBitrateBps| when overhead is 419 // Set a target rate that is greater than |kMaxBitrateBps| when overhead is
417 // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|. 420 // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|.
418 target_bitrate = 421 target_bitrate =
419 kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1; 422 kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1;
420 states.encoder->OnReceivedTargetAudioBitrate(target_bitrate); 423 states.encoder->OnReceivedTargetAudioBitrate(target_bitrate,
424 rtc::Optional<int64_t>());
421 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); 425 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
422 } 426 }
423 427
424 // Verifies that the complexity adaptation in the config works as intended. 428 // Verifies that the complexity adaptation in the config works as intended.
425 TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) { 429 TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) {
426 AudioEncoderOpus::Config config; 430 AudioEncoderOpus::Config config;
427 config.low_rate_complexity = 8; 431 config.low_rate_complexity = 8;
428 config.complexity = 6; 432 config.complexity = 6;
429 433
430 // Bitrate within hysteresis window. Expect empty output. 434 // Bitrate within hysteresis window. Expect empty output.
431 config.bitrate_bps = rtc::Optional<int>(12500); 435 config.bitrate_bps = rtc::Optional<int>(12500);
432 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); 436 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
433 437
434 // Bitrate below hysteresis window. Expect higher complexity. 438 // Bitrate below hysteresis window. Expect higher complexity.
435 config.bitrate_bps = rtc::Optional<int>(10999); 439 config.bitrate_bps = rtc::Optional<int>(10999);
436 EXPECT_EQ(rtc::Optional<int>(8), config.GetNewComplexity()); 440 EXPECT_EQ(rtc::Optional<int>(8), config.GetNewComplexity());
437 441
438 // Bitrate within hysteresis window. Expect empty output. 442 // Bitrate within hysteresis window. Expect empty output.
439 config.bitrate_bps = rtc::Optional<int>(12500); 443 config.bitrate_bps = rtc::Optional<int>(12500);
440 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); 444 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
441 445
442 // Bitrate above hysteresis window. Expect lower complexity. 446 // Bitrate above hysteresis window. Expect lower complexity.
443 config.bitrate_bps = rtc::Optional<int>(14001); 447 config.bitrate_bps = rtc::Optional<int>(14001);
444 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); 448 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity());
445 } 449 }
450
451 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) {
452 auto states = CreateCodec(2);
453 states.encoder->EnableAudioNetworkAdaptor("", nullptr);
454 int16_t audio[480 * 2];
455 rtc::Buffer encoded;
456 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage())
457 .WillOnce(Return(rtc::Optional<float>(50000)));
458 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000));
459 states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2),
460 &encoded);
461
462 // Repeat update uplink bandwidth tests.
463 for (int i = 0; i < 5; i++) {
464 // Don't update till it is time to update again.
465 states.simulated_clock->AdvanceTimeMilliseconds(
466 states.config.update_uplink_bandwidth_interval_ms - 1);
467 states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2),
468 &encoded);
469
470 // Update when it is time to update.
471 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage())
472 .WillOnce(Return(rtc::Optional<float>(40000)));
473 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000));
474 states.simulated_clock->AdvanceTimeMilliseconds(1);
475 states.encoder->Encode(0, rtc::ArrayView<const int16_t>(audio, 480 * 2),
476 &encoded);
477 }
478 }
446 } // namespace webrtc 479 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698