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 <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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |