| 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 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 }; | 52 }; |
| 53 | 53 |
| 54 AudioEncoderOpusStates CreateCodec(size_t num_channels) { | 54 AudioEncoderOpusStates CreateCodec(size_t num_channels) { |
| 55 AudioEncoderOpusStates states; | 55 AudioEncoderOpusStates states; |
| 56 states.mock_audio_network_adaptor = | 56 states.mock_audio_network_adaptor = |
| 57 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); | 57 std::make_shared<MockAudioNetworkAdaptor*>(nullptr); |
| 58 | 58 |
| 59 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( | 59 std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr( |
| 60 states.mock_audio_network_adaptor); | 60 states.mock_audio_network_adaptor); |
| 61 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( | 61 AudioEncoderOpus::AudioNetworkAdaptorCreator creator = [mock_ptr]( |
| 62 const std::string&, const Clock*) { | 62 const std::string&, RtcEventLog* event_log, const Clock*) { |
| 63 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( | 63 std::unique_ptr<MockAudioNetworkAdaptor> adaptor( |
| 64 new NiceMock<MockAudioNetworkAdaptor>()); | 64 new NiceMock<MockAudioNetworkAdaptor>()); |
| 65 EXPECT_CALL(*adaptor, Die()); | 65 EXPECT_CALL(*adaptor, Die()); |
| 66 if (auto sp = mock_ptr.lock()) { | 66 if (auto sp = mock_ptr.lock()) { |
| 67 *sp = adaptor.get(); | 67 *sp = adaptor.get(); |
| 68 } else { | 68 } else { |
| 69 RTC_NOTREACHED(); | 69 RTC_NOTREACHED(); |
| 70 } | 70 } |
| 71 return adaptor; | 71 return adaptor; |
| 72 }; | 72 }; |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 ElementsAre(20, 60)); | 259 ElementsAre(20, 60)); |
| 260 states.encoder->SetReceiverFrameLengthRange(21, 60); | 260 states.encoder->SetReceiverFrameLengthRange(21, 60); |
| 261 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); | 261 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60)); |
| 262 states.encoder->SetReceiverFrameLengthRange(20, 59); | 262 states.encoder->SetReceiverFrameLengthRange(20, 59); |
| 263 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); | 263 EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20)); |
| 264 } | 264 } |
| 265 | 265 |
| 266 TEST(AudioEncoderOpusTest, | 266 TEST(AudioEncoderOpusTest, |
| 267 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { | 267 InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) { |
| 268 auto states = CreateCodec(2); | 268 auto states = CreateCodec(2); |
| 269 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 269 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
| 270 | 270 |
| 271 auto config = CreateEncoderRuntimeConfig(); | 271 auto config = CreateEncoderRuntimeConfig(); |
| 272 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 272 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
| 273 .WillOnce(Return(config)); | 273 .WillOnce(Return(config)); |
| 274 | 274 |
| 275 // 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. |
| 276 constexpr float kUplinkPacketLoss = 0.1f; | 276 constexpr float kUplinkPacketLoss = 0.1f; |
| 277 EXPECT_CALL(**states.mock_audio_network_adaptor, | 277 EXPECT_CALL(**states.mock_audio_network_adaptor, |
| 278 SetUplinkPacketLossFraction(kUplinkPacketLoss)); | 278 SetUplinkPacketLossFraction(kUplinkPacketLoss)); |
| 279 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); | 279 states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss); |
| 280 | 280 |
| 281 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 281 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
| 282 } | 282 } |
| 283 | 283 |
| 284 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { | 284 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) { |
| 285 auto states = CreateCodec(2); | 285 auto states = CreateCodec(2); |
| 286 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 286 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
| 287 | 287 |
| 288 auto config = CreateEncoderRuntimeConfig(); | 288 auto config = CreateEncoderRuntimeConfig(); |
| 289 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 289 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
| 290 .WillOnce(Return(config)); | 290 .WillOnce(Return(config)); |
| 291 | 291 |
| 292 // 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. |
| 293 constexpr int kTargetAudioBitrate = 30000; | 293 constexpr int kTargetAudioBitrate = 30000; |
| 294 constexpr int64_t kProbingIntervalMs = 3000; | 294 constexpr int64_t kProbingIntervalMs = 3000; |
| 295 EXPECT_CALL(**states.mock_audio_network_adaptor, | 295 EXPECT_CALL(**states.mock_audio_network_adaptor, |
| 296 SetTargetAudioBitrate(kTargetAudioBitrate)); | 296 SetTargetAudioBitrate(kTargetAudioBitrate)); |
| 297 EXPECT_CALL(*states.mock_bitrate_smoother, | 297 EXPECT_CALL(*states.mock_bitrate_smoother, |
| 298 SetTimeConstantMs(kProbingIntervalMs * 4)); | 298 SetTimeConstantMs(kProbingIntervalMs * 4)); |
| 299 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); | 299 EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate)); |
| 300 states.encoder->OnReceivedUplinkBandwidth( | 300 states.encoder->OnReceivedUplinkBandwidth( |
| 301 kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs)); | 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, 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()) |
| 312 .WillOnce(Return(config)); | 312 .WillOnce(Return(config)); |
| 313 | 313 |
| 314 // Since using mock audio network adaptor, any rtt is fine. | 314 // Since using mock audio network adaptor, any rtt is fine. |
| 315 constexpr int kRtt = 30; | 315 constexpr int kRtt = 30; |
| 316 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); | 316 EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt)); |
| 317 states.encoder->OnReceivedRtt(kRtt); | 317 states.encoder->OnReceivedRtt(kRtt); |
| 318 | 318 |
| 319 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 319 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
| 320 } | 320 } |
| 321 | 321 |
| 322 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { | 322 TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) { |
| 323 auto states = CreateCodec(2); | 323 auto states = CreateCodec(2); |
| 324 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 324 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
| 325 | 325 |
| 326 auto config = CreateEncoderRuntimeConfig(); | 326 auto config = CreateEncoderRuntimeConfig(); |
| 327 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 327 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
| 328 .WillOnce(Return(config)); | 328 .WillOnce(Return(config)); |
| 329 | 329 |
| 330 // Since using mock audio network adaptor, any overhead is fine. | 330 // Since using mock audio network adaptor, any overhead is fine. |
| 331 constexpr size_t kOverhead = 64; | 331 constexpr size_t kOverhead = 64; |
| 332 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); | 332 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)); |
| 333 states.encoder->OnReceivedOverhead(kOverhead); | 333 states.encoder->OnReceivedOverhead(kOverhead); |
| 334 | 334 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 config.bitrate_bps = rtc::Optional<int>(12500); | 443 config.bitrate_bps = rtc::Optional<int>(12500); |
| 444 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); | 444 EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity()); |
| 445 | 445 |
| 446 // Bitrate above hysteresis window. Expect lower complexity. | 446 // Bitrate above hysteresis window. Expect lower complexity. |
| 447 config.bitrate_bps = rtc::Optional<int>(14001); | 447 config.bitrate_bps = rtc::Optional<int>(14001); |
| 448 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); | 448 EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity()); |
| 449 } | 449 } |
| 450 | 450 |
| 451 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { | 451 TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) { |
| 452 auto states = CreateCodec(2); | 452 auto states = CreateCodec(2); |
| 453 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 453 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
| 454 | 454 |
| 455 auto config = CreateEncoderRuntimeConfig(); | 455 auto config = CreateEncoderRuntimeConfig(); |
| 456 AudioNetworkAdaptor::EncoderRuntimeConfig empty_config; | 456 AudioNetworkAdaptor::EncoderRuntimeConfig empty_config; |
| 457 | 457 |
| 458 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) | 458 EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig()) |
| 459 .WillOnce(Return(config)) | 459 .WillOnce(Return(config)) |
| 460 .WillOnce(Return(empty_config)); | 460 .WillOnce(Return(empty_config)); |
| 461 | 461 |
| 462 constexpr size_t kOverhead = 64; | 462 constexpr size_t kOverhead = 64; |
| 463 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) | 463 EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead)) |
| 464 .Times(2); | 464 .Times(2); |
| 465 states.encoder->OnReceivedOverhead(kOverhead); | 465 states.encoder->OnReceivedOverhead(kOverhead); |
| 466 states.encoder->OnReceivedOverhead(kOverhead); | 466 states.encoder->OnReceivedOverhead(kOverhead); |
| 467 | 467 |
| 468 CheckEncoderRuntimeConfig(states.encoder.get(), config); | 468 CheckEncoderRuntimeConfig(states.encoder.get(), config); |
| 469 } | 469 } |
| 470 | 470 |
| 471 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { | 471 TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) { |
| 472 rtc::ScopedFakeClock fake_clock; | 472 rtc::ScopedFakeClock fake_clock; |
| 473 auto states = CreateCodec(2); | 473 auto states = CreateCodec(2); |
| 474 states.encoder->EnableAudioNetworkAdaptor("", nullptr); | 474 states.encoder->EnableAudioNetworkAdaptor("", nullptr, nullptr); |
| 475 std::array<int16_t, 480 * 2> audio; | 475 std::array<int16_t, 480 * 2> audio; |
| 476 audio.fill(0); | 476 audio.fill(0); |
| 477 rtc::Buffer encoded; | 477 rtc::Buffer encoded; |
| 478 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 478 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| 479 .WillOnce(Return(rtc::Optional<float>(50000))); | 479 .WillOnce(Return(rtc::Optional<float>(50000))); |
| 480 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); | 480 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000)); |
| 481 states.encoder->Encode( | 481 states.encoder->Encode( |
| 482 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 482 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 483 | 483 |
| 484 // Repeat update uplink bandwidth tests. | 484 // Repeat update uplink bandwidth tests. |
| 485 for (int i = 0; i < 5; i++) { | 485 for (int i = 0; i < 5; i++) { |
| 486 // Don't update till it is time to update again. | 486 // Don't update till it is time to update again. |
| 487 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( | 487 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds( |
| 488 states.config.uplink_bandwidth_update_interval_ms - 1)); | 488 states.config.uplink_bandwidth_update_interval_ms - 1)); |
| 489 states.encoder->Encode( | 489 states.encoder->Encode( |
| 490 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 490 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 491 | 491 |
| 492 // Update when it is time to update. | 492 // Update when it is time to update. |
| 493 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) | 493 EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage()) |
| 494 .WillOnce(Return(rtc::Optional<float>(40000))); | 494 .WillOnce(Return(rtc::Optional<float>(40000))); |
| 495 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); | 495 EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000)); |
| 496 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); | 496 fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); |
| 497 states.encoder->Encode( | 497 states.encoder->Encode( |
| 498 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); | 498 0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded); |
| 499 } | 499 } |
| 500 } | 500 } |
| 501 | 501 |
| 502 } // namespace webrtc | 502 } // namespace webrtc |
| OLD | NEW |