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 <memory> | 12 #include <memory> |
12 | 13 |
13 #include "webrtc/base/checks.h" | 14 #include "webrtc/base/checks.h" |
| 15 #include "webrtc/base/fakeclock.h" |
| 16 #include "webrtc/common_audio/mocks/mock_smoothing_filter.h" |
14 #include "webrtc/common_types.h" | 17 #include "webrtc/common_types.h" |
15 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_netw
ork_adaptor.h" | 18 #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" | 19 #include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h" |
17 #include "webrtc/test/field_trial.h" | 20 #include "webrtc/test/field_trial.h" |
18 #include "webrtc/test/gmock.h" | 21 #include "webrtc/test/gmock.h" |
19 #include "webrtc/test/gtest.h" | 22 #include "webrtc/test/gtest.h" |
20 #include "webrtc/system_wrappers/include/clock.h" | 23 #include "webrtc/system_wrappers/include/clock.h" |
21 | 24 |
22 namespace webrtc { | 25 namespace webrtc { |
23 using ::testing::NiceMock; | 26 using ::testing::NiceMock; |
(...skipping 11 matching lines...) Expand all Loading... |
35 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); | 38 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate); |
36 config.payload_type = codec_inst.pltype; | 39 config.payload_type = codec_inst.pltype; |
37 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip | 40 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip |
38 : AudioEncoderOpus::kAudio; | 41 : AudioEncoderOpus::kAudio; |
39 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); | 42 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); |
40 return config; | 43 return config; |
41 } | 44 } |
42 | 45 |
43 struct AudioEncoderOpusStates { | 46 struct AudioEncoderOpusStates { |
44 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; | 47 std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor; |
| 48 MockSmoothingFilter* mock_bitrate_smoother; |
45 std::unique_ptr<AudioEncoderOpus> encoder; | 49 std::unique_ptr<AudioEncoderOpus> encoder; |
46 std::unique_ptr<SimulatedClock> simulated_clock; | 50 std::unique_ptr<SimulatedClock> simulated_clock; |
| 51 AudioEncoderOpus::Config config; |
47 }; | 52 }; |
48 | 53 |
49 AudioEncoderOpusStates CreateCodec(size_t num_channels) { | 54 AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
50 AudioEncoderOpusStates states; | 55 AudioEncoderOpusStates states; |
51 states.mock_audio_network_adaptor = | 56 states.mock_audio_network_adaptor = |
52 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); | 57 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); |
53 | 58 |
54 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( | 59 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( |
55 states.mock_audio_network_adaptor); | 60 states.mock_audio_network_adaptor); |
56 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( | 61 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( |
57 const std::string&, const Clock*) { | 62 const std::string&, const Clock*) { |
58 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( | 63 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( |
59 new NiceMock<MockAudioNetworkAdaptor>()); | 64 new NiceMock<MockAudioNetworkAdaptor>()); |
60 EXPECT_CALL(*adaptor, Die()); | 65 EXPECT_CALL(*adaptor, Die()); |
61 if (auto sp = mock_ptr.lock()) { | 66 if (auto sp = mock_ptr.lock()) { |
62 *sp = adaptor.get(); | 67 *sp = adaptor.get(); |
63 } else { | 68 } else { |
64 RTC_NOTREACHED(); | 69 RTC_NOTREACHED(); |
65 } | 70 } |
66 return adaptor; | 71 return adaptor; |
67 }; | 72 }; |
68 | 73 |
69 CodecInst codec_inst = kDefaultOpusSettings; | 74 CodecInst codec_inst = kDefaultOpusSettings; |
70 codec_inst.channels = num_channels; | 75 codec_inst.channels = num_channels; |
71 auto config = CreateConfig(codec_inst); | 76 states.config = CreateConfig(codec_inst); |
| 77 std::unique_ptr<MockSmoothingFilter> bitrate_smoother( |
| 78 new MockSmoothingFilter()); |
| 79 states.mock_bitrate_smoother = bitrate_smoother.get(); |
72 states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs)); | 80 states.simulated_clock.reset(new SimulatedClock(kInitialTimeUs)); |
73 config.clock = states.simulated_clock.get(); | 81 states.config.clock = states.simulated_clock.get(); |
74 | 82 |
75 states.encoder.reset(new AudioEncoderOpus(config, std::move(creator))); | 83 states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator), |
| 84 std::move(bitrate_smoother))); |
76 return states; | 85 return states; |
77 } | 86 } |
78 | 87 |
79 AudioNetworkAdaptor::EncoderRuntimeConfig CreateEncoderRuntimeConfig() { | 88 AudioNetworkAdaptor::EncoderRuntimeConfig CreateEncoderRuntimeConfig() { |
80 constexpr int kBitrate = 40000; | 89 constexpr int kBitrate = 40000; |
81 constexpr int kFrameLength = 60; | 90 constexpr int kFrameLength = 60; |
82 constexpr bool kEnableFec = true; | 91 constexpr bool kEnableFec = true; |
83 constexpr bool kEnableDtx = false; | 92 constexpr bool kEnableDtx = false; |
84 constexpr size_t kNumChannels = 1; | 93 constexpr size_t kNumChannels = 1; |
85 constexpr float kPacketLossFraction = 0.1f; | 94 constexpr float kPacketLossFraction = 0.1f; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 auto states = CreateCodec(2); | 155 auto states = CreateCodec(2); |
147 // Enable DTX | 156 // Enable DTX |
148 EXPECT_TRUE(states.encoder->SetDtx(true)); | 157 EXPECT_TRUE(states.encoder->SetDtx(true)); |
149 // Verify that the mode is still kAudio. | 158 // Verify that the mode is still kAudio. |
150 EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application()); | 159 EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application()); |
151 // Turn off DTX. | 160 // Turn off DTX. |
152 EXPECT_TRUE(states.encoder->SetDtx(false)); | 161 EXPECT_TRUE(states.encoder->SetDtx(false)); |
153 } | 162 } |
154 | 163 |
155 TEST(AudioEncoderOpusTest, | 164 TEST(AudioEncoderOpusTest, |
156 OnReceivedTargetAudioBitrateWithoutAudioNetworkAdaptor) { | 165 OnReceivedUplinkBandwidthWithoutAudioNetworkAdaptor) { |
157 auto states = CreateCodec(1); | 166 auto states = CreateCodec(1); |
158 // Constants are replicated from audio_states.encoderopus.cc. | 167 // Constants are replicated from audio_states.encoderopus.cc. |
159 const int kMinBitrateBps = 500; | 168 const int kMinBitrateBps = 500; |
160 const int kMaxBitrateBps = 512000; | 169 const int kMaxBitrateBps = 512000; |
161 // Set a too low bitrate. | 170 // Set a too low bitrate. |
162 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps - 1); | 171 states.encoder->OnReceivedUplinkBandwidth(kMinBitrateBps - 1, |
| 172 rtc::Optional<int64_t>()); |
163 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); | 173 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); |
164 // Set a too high bitrate. | 174 // Set a too high bitrate. |
165 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps + 1); | 175 states.encoder->OnReceivedUplinkBandwidth(kMaxBitrateBps + 1, |
| 176 rtc::Optional<int64_t>()); |
166 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); | 177 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
167 // Set the minimum rate. | 178 // Set the minimum rate. |
168 states.encoder->OnReceivedTargetAudioBitrate(kMinBitrateBps); | 179 states.encoder->OnReceivedUplinkBandwidth(kMinBitrateBps, |
| 180 rtc::Optional<int64_t>()); |
169 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); | 181 EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate()); |
170 // Set the maximum rate. | 182 // Set the maximum rate. |
171 states.encoder->OnReceivedTargetAudioBitrate(kMaxBitrateBps); | 183 states.encoder->OnReceivedUplinkBandwidth(kMaxBitrateBps, |
| 184 rtc::Optional<int64_t>()); |
172 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); | 185 EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate()); |
173 // Set rates from 1000 up to 32000 bps. | 186 // Set rates from 1000 up to 32000 bps. |
174 for (int rate = 1000; rate <= 32000; rate += 1000) { | 187 for (int rate = 1000; rate <= 32000; rate += 1000) { |
175 states.encoder->OnReceivedTargetAudioBitrate(rate); | 188 states.encoder->OnReceivedUplinkBandwidth(rate, rtc::Optional<int64_t>()); |
176 EXPECT_EQ(rate, states.encoder->GetTargetBitrate()); | 189 EXPECT_EQ(rate, states.encoder->GetTargetBitrate()); |
177 } | 190 } |
178 } | 191 } |
179 | 192 |
180 namespace { | 193 namespace { |
181 | 194 |
182 // Returns a vector with the n evenly-spaced numbers a, a + (b - a)/(n - 1), | 195 // Returns a vector with the n evenly-spaced numbers a, a + (b - a)/(n - 1), |
183 // ..., b. | 196 // ..., b. |
184 std::vector<float> IntervalSteps(float a, float b, size_t n) { | 197 std::vector<float> IntervalSteps(float a, float b, size_t n) { |
185 RTC_DCHECK_GT(n, 1u); | 198 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())); | 256 ElementsAre(states.encoder->next_frame_length_ms())); |
244 states.encoder->SetReceiverFrameLengthRange(0, 12345); | 257 states.encoder->SetReceiverFrameLengthRange(0, 12345); |
245 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), | 258 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), |
246 ElementsAre(20, 60)); | 259 ElementsAre(20, 60)); |
247 states.encoder->SetReceiverFrameLengthRange(21, 60); | 260 states.encoder->SetReceiverFrameLengthRange(21, 60); |
248 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); | 261 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); |
249 states.encoder->SetReceiverFrameLengthRange(20, 59); | 262 states.encoder->SetReceiverFrameLengthRange(20, 59); |
250 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); | 263 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
251 } | 264 } |
252 | 265 |
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, | 266 TEST(AudioEncoderOpusTest, |
271 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { | 267 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
272 auto states = CreateCodec(2); | 268 auto states = CreateCodec(2); |
273 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 269 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
274 | 270 |
275 auto config = CreateEncoderRuntimeConfig(); | 271 auto config = CreateEncoderRuntimeConfig(); |
276 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 272 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
277 .WillOnce(Return(config)); | 273 .WillOnce(Return(config)); |
278 | 274 |
279 // Since using mock audio network adaptor, any packet loss fraction is fine. | 275 // Since using mock audio network adaptor, any packet loss fraction is fine. |
280 constexpr float kUplinkPacketLoss = 0.1f; | 276 constexpr float kUplinkPacketLoss = 0.1f; |
281 EXPECT_CALL(**states.mock_audio_network_adaptor, | 277 EXPECT_CALL(**states.mock_audio_network_adaptor, |
282 SetUplinkPacketLossFraction(kUplinkPacketLoss)); | 278 SetUplinkPacketLossFraction(kUplinkPacketLoss)); |
283 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); | 279 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); |
284 | 280 |
285 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 281 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
286 } | 282 } |
287 | 283 |
288 TEST(AudioEncoderOpusTest, | 284 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
289 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->OnReceivedUplinkBandwidth( |
| 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->OnReceivedUplinkBandwidth(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->OnReceivedUplinkBandwidth(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->OnReceivedUplinkBandwidth(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->OnReceivedUplinkBandwidth(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. |
(...skipping 26 matching lines...) Expand all Loading... |
457 | 461 |
458 constexpr size_t kOverhead = 64; | 462 constexpr size_t kOverhead = 64; |
459 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) | 463 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) |
460 .Times(2); | 464 .Times(2); |
461 states.encoder->OnReceivedOverhead(kOverhead); | 465 states.encoder->OnReceivedOverhead(kOverhead); |
462 states.encoder->OnReceivedOverhead(kOverhead); | 466 states.encoder->OnReceivedOverhead(kOverhead); |
463 | 467 |
464 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 468 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
465 } | 469 } |
466 | 470 |
| 471 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { |
| 472 rtc::ScopedFakeClock fake_clock; |
| 473 auto states = CreateCodec(2); |
| 474 states.encoder->EnableAudioNetworkAdaptor("", nullptr); |
| 475 std::array<int16_t, 480 * 2> audio; |
| 476 audio.fill(0); |
| 477 rtc::Buffer encoded; |
| 478 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| 479 .WillOnce(Return(rtc::Optional<float>(50000))); |
| 480 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); |
| 481 states.encoder->Encode( |
| 482 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 483 |
| 484 // Repeat update uplink bandwidth tests. |
| 485 for (int i = 0; i < 5; i++) { |
| 486 // Don't update till it is time to update again. |
| 487 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( |
| 488 states.config.uplink_bandwidth_update_interval_ms - 1)); |
| 489 states.encoder->Encode( |
| 490 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 491 |
| 492 // Update when it is time to update. |
| 493 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| 494 .WillOnce(Return(rtc::Optional<float>(40000))); |
| 495 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); |
| 496 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); |
| 497 states.encoder->Encode( |
| 498 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 499 } |
| 500 } |
| 501 |
467 } // namespace webrtc | 502 } // namespace webrtc |
OLD | NEW |