| Index: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
|
| diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
|
| index 8137998b9c257fa8730f30acdc30a94462c12ecc..76574d6432407f0ef30c6f98853a30fef0100379 100644
|
| --- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
|
| +++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
|
| @@ -33,30 +33,30 @@
|
| const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000};
|
| constexpr int64_t kInitialTimeUs = 12345678;
|
|
|
| -AudioEncoderOpusConfig CreateConfig(const CodecInst& codec_inst) {
|
| - AudioEncoderOpusConfig config;
|
| +AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) {
|
| + AudioEncoderOpus::Config config;
|
| config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
|
| config.num_channels = codec_inst.channels;
|
| - config.bitrate_bps = codec_inst.rate;
|
| - config.application = config.num_channels == 1
|
| - ? AudioEncoderOpusConfig::ApplicationMode::kVoip
|
| - : AudioEncoderOpusConfig::ApplicationMode::kAudio;
|
| + config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
|
| + config.payload_type = codec_inst.pltype;
|
| + config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
|
| + : AudioEncoderOpus::kAudio;
|
| config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
|
| return config;
|
| }
|
|
|
| -AudioEncoderOpusConfig CreateConfigWithParameters(
|
| +AudioEncoderOpus::Config CreateConfigWithParameters(
|
| const SdpAudioFormat::Parameters& params) {
|
| - const SdpAudioFormat format("opus", 48000, 2, params);
|
| - return *AudioEncoderOpusImpl::SdpToConfig(format);
|
| + SdpAudioFormat format("opus", 48000, 2, params);
|
| + return AudioEncoderOpus::CreateConfig(0, format);
|
| }
|
|
|
| struct AudioEncoderOpusStates {
|
| std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor;
|
| MockSmoothingFilter* mock_bitrate_smoother;
|
| - std::unique_ptr<AudioEncoderOpusImpl> encoder;
|
| + std::unique_ptr<AudioEncoderOpus> encoder;
|
| std::unique_ptr<rtc::ScopedFakeClock> fake_clock;
|
| - AudioEncoderOpusConfig config;
|
| + AudioEncoderOpus::Config config;
|
| };
|
|
|
| AudioEncoderOpusStates CreateCodec(size_t num_channels) {
|
| @@ -67,7 +67,7 @@
|
| states.fake_clock->SetTimeMicros(kInitialTimeUs);
|
| std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr(
|
| states.mock_audio_network_adaptor);
|
| - AudioEncoderOpusImpl::AudioNetworkAdaptorCreator creator =
|
| + AudioEncoderOpus::AudioNetworkAdaptorCreator creator =
|
| [mock_ptr](const std::string&, RtcEventLog* event_log) {
|
| std::unique_ptr<MockAudioNetworkAdaptor> adaptor(
|
| new NiceMock<MockAudioNetworkAdaptor>());
|
| @@ -87,9 +87,8 @@
|
| new MockSmoothingFilter());
|
| states.mock_bitrate_smoother = bitrate_smoother.get();
|
|
|
| - states.encoder.reset(new AudioEncoderOpusImpl(
|
| - states.config, codec_inst.pltype, std::move(creator),
|
| - std::move(bitrate_smoother)));
|
| + states.encoder.reset(new AudioEncoderOpus(states.config, std::move(creator),
|
| + std::move(bitrate_smoother)));
|
| return states;
|
| }
|
|
|
| @@ -111,7 +110,7 @@
|
| return config;
|
| }
|
|
|
| -void CheckEncoderRuntimeConfig(const AudioEncoderOpusImpl* encoder,
|
| +void CheckEncoderRuntimeConfig(const AudioEncoderOpus* encoder,
|
| const AudioEncoderRuntimeConfig& config) {
|
| EXPECT_EQ(*config.bitrate_bps, encoder->GetTargetBitrate());
|
| EXPECT_EQ(*config.frame_length_ms, encoder->next_frame_length_ms());
|
| @@ -122,7 +121,7 @@
|
|
|
| // Create 10ms audio data blocks for a total packet size of "packet_size_ms".
|
| std::unique_ptr<test::AudioLoop> Create10msAudioBlocks(
|
| - const std::unique_ptr<AudioEncoderOpusImpl>& encoder,
|
| + const std::unique_ptr<AudioEncoderOpus>& encoder,
|
| int packet_size_ms) {
|
| const std::string file_name =
|
| test::ResourcePath("audio_coding/testfile32kHz", "pcm");
|
| @@ -143,22 +142,19 @@
|
|
|
| TEST(AudioEncoderOpusTest, DefaultApplicationModeMono) {
|
| auto states = CreateCodec(1);
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, DefaultApplicationModeStereo) {
|
| auto states = CreateCodec(2);
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application());
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, ChangeApplicationMode) {
|
| auto states = CreateCodec(2);
|
| EXPECT_TRUE(
|
| states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, ResetWontChangeApplicationMode) {
|
| @@ -167,20 +163,17 @@
|
| // Trigger a reset.
|
| states.encoder->Reset();
|
| // Verify that the mode is still kAudio.
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kAudio, states.encoder->application());
|
|
|
| // Now change to kVoip.
|
| EXPECT_TRUE(
|
| states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
|
|
|
| // Trigger a reset again.
|
| states.encoder->Reset();
|
| // Verify that the mode is still kVoip.
|
| - EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
|
| - states.encoder->application());
|
| + EXPECT_EQ(AudioEncoderOpus::kVoip, states.encoder->application());
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, ToggleDtx) {
|
| @@ -245,7 +238,7 @@
|
| float expected_return) {
|
| // |kSampleIntervalMs| is chosen to ease the calculation since
|
| // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of
|
| - // PacketLossFractionSmoother used in AudioEncoderOpusImpl.
|
| + // PacketLossFractionSmoother used in AudioEncoderOpus.
|
| constexpr int64_t kSampleIntervalMs = 184198;
|
| for (float loss : losses) {
|
| states->encoder->OnReceivedUplinkPacketLossFraction(loss);
|
| @@ -459,29 +452,25 @@
|
|
|
| // Verifies that the complexity adaptation in the config works as intended.
|
| TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) {
|
| - AudioEncoderOpusConfig config;
|
| + AudioEncoderOpus::Config config;
|
| config.low_rate_complexity = 8;
|
| config.complexity = 6;
|
|
|
| // Bitrate within hysteresis window. Expect empty output.
|
| - config.bitrate_bps = 12500;
|
| - EXPECT_EQ(rtc::Optional<int>(),
|
| - AudioEncoderOpusImpl::GetNewComplexity(config));
|
| + config.bitrate_bps = rtc::Optional<int>(12500);
|
| + EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
|
|
|
| // Bitrate below hysteresis window. Expect higher complexity.
|
| - config.bitrate_bps = 10999;
|
| - EXPECT_EQ(rtc::Optional<int>(8),
|
| - AudioEncoderOpusImpl::GetNewComplexity(config));
|
| + config.bitrate_bps = rtc::Optional<int>(10999);
|
| + EXPECT_EQ(rtc::Optional<int>(8), config.GetNewComplexity());
|
|
|
| // Bitrate within hysteresis window. Expect empty output.
|
| - config.bitrate_bps = 12500;
|
| - EXPECT_EQ(rtc::Optional<int>(),
|
| - AudioEncoderOpusImpl::GetNewComplexity(config));
|
| + config.bitrate_bps = rtc::Optional<int>(12500);
|
| + EXPECT_EQ(rtc::Optional<int>(), config.GetNewComplexity());
|
|
|
| // Bitrate above hysteresis window. Expect lower complexity.
|
| - config.bitrate_bps = 14001;
|
| - EXPECT_EQ(rtc::Optional<int>(6),
|
| - AudioEncoderOpusImpl::GetNewComplexity(config));
|
| + config.bitrate_bps = rtc::Optional<int>(14001);
|
| + EXPECT_EQ(rtc::Optional<int>(6), config.GetNewComplexity());
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) {
|
| @@ -563,82 +552,84 @@
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, TestConfigDefaults) {
|
| - const auto config_opt = AudioEncoderOpusImpl::SdpToConfig({"opus", 48000, 2});
|
| - ASSERT_TRUE(config_opt);
|
| - EXPECT_EQ(48000, config_opt->max_playback_rate_hz);
|
| - EXPECT_EQ(1u, config_opt->num_channels);
|
| - EXPECT_FALSE(config_opt->fec_enabled);
|
| - EXPECT_FALSE(config_opt->dtx_enabled);
|
| - EXPECT_EQ(20, config_opt->frame_size_ms);
|
| + const AudioEncoderOpus::Config config =
|
| + AudioEncoderOpus::CreateConfig(0, {"opus", 48000, 2});
|
| +
|
| + EXPECT_EQ(48000, config.max_playback_rate_hz);
|
| + EXPECT_EQ(1u, config.num_channels);
|
| + EXPECT_FALSE(config.fec_enabled);
|
| + EXPECT_FALSE(config.dtx_enabled);
|
| + EXPECT_EQ(20, config.frame_size_ms);
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, TestConfigFromParams) {
|
| - const auto config1 = CreateConfigWithParameters({{"stereo", "0"}});
|
| - EXPECT_EQ(1U, config1.num_channels);
|
| -
|
| - const auto config2 = CreateConfigWithParameters({{"stereo", "1"}});
|
| - EXPECT_EQ(2U, config2.num_channels);
|
| -
|
| - const auto config3 = CreateConfigWithParameters({{"useinbandfec", "0"}});
|
| - EXPECT_FALSE(config3.fec_enabled);
|
| -
|
| - const auto config4 = CreateConfigWithParameters({{"useinbandfec", "1"}});
|
| - EXPECT_TRUE(config4.fec_enabled);
|
| -
|
| - const auto config5 = CreateConfigWithParameters({{"usedtx", "0"}});
|
| - EXPECT_FALSE(config5.dtx_enabled);
|
| -
|
| - const auto config6 = CreateConfigWithParameters({{"usedtx", "1"}});
|
| - EXPECT_TRUE(config6.dtx_enabled);
|
| -
|
| - const auto config7 = CreateConfigWithParameters({{"cbr", "0"}});
|
| - EXPECT_FALSE(config7.cbr_enabled);
|
| -
|
| - const auto config8 = CreateConfigWithParameters({{"cbr", "1"}});
|
| - EXPECT_TRUE(config8.cbr_enabled);
|
| -
|
| - const auto config9 =
|
| - CreateConfigWithParameters({{"maxplaybackrate", "12345"}});
|
| - EXPECT_EQ(12345, config9.max_playback_rate_hz);
|
| -
|
| - const auto config10 =
|
| - CreateConfigWithParameters({{"maxaveragebitrate", "96000"}});
|
| - EXPECT_EQ(96000, config10.bitrate_bps);
|
| -
|
| - const auto config11 = CreateConfigWithParameters({{"maxptime", "40"}});
|
| - for (int frame_length : config11.supported_frame_lengths_ms) {
|
| + AudioEncoderOpus::Config config;
|
| +
|
| + config = CreateConfigWithParameters({{"stereo", "0"}});
|
| + EXPECT_EQ(1U, config.num_channels);
|
| +
|
| + config = CreateConfigWithParameters({{"stereo", "1"}});
|
| + EXPECT_EQ(2U, config.num_channels);
|
| +
|
| + config = CreateConfigWithParameters({{"useinbandfec", "0"}});
|
| + EXPECT_FALSE(config.fec_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"useinbandfec", "1"}});
|
| + EXPECT_TRUE(config.fec_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"usedtx", "0"}});
|
| + EXPECT_FALSE(config.dtx_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"usedtx", "1"}});
|
| + EXPECT_TRUE(config.dtx_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"cbr", "0"}});
|
| + EXPECT_FALSE(config.cbr_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"cbr", "1"}});
|
| + EXPECT_TRUE(config.cbr_enabled);
|
| +
|
| + config = CreateConfigWithParameters({{"maxplaybackrate", "12345"}});
|
| + EXPECT_EQ(12345, config.max_playback_rate_hz);
|
| +
|
| + config = CreateConfigWithParameters({{"maxaveragebitrate", "96000"}});
|
| + EXPECT_EQ(96000, config.bitrate_bps);
|
| +
|
| + config = CreateConfigWithParameters({{"maxptime", "40"}});
|
| + for (int frame_length : config.supported_frame_lengths_ms) {
|
| EXPECT_LE(frame_length, 40);
|
| }
|
|
|
| - const auto config12 = CreateConfigWithParameters({{"minptime", "40"}});
|
| - for (int frame_length : config12.supported_frame_lengths_ms) {
|
| + config = CreateConfigWithParameters({{"minptime", "40"}});
|
| + for (int frame_length : config.supported_frame_lengths_ms) {
|
| EXPECT_GE(frame_length, 40);
|
| }
|
|
|
| - const auto config13 = CreateConfigWithParameters({{"ptime", "40"}});
|
| - EXPECT_EQ(40, config13.frame_size_ms);
|
| + config = CreateConfigWithParameters({{"ptime", "40"}});
|
| + EXPECT_EQ(40, config.frame_size_ms);
|
|
|
| constexpr int kMinSupportedFrameLength = 10;
|
| constexpr int kMaxSupportedFrameLength =
|
| WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60;
|
|
|
| - const auto config14 = CreateConfigWithParameters({{"ptime", "1"}});
|
| - EXPECT_EQ(kMinSupportedFrameLength, config14.frame_size_ms);
|
| -
|
| - const auto config15 = CreateConfigWithParameters({{"ptime", "2000"}});
|
| - EXPECT_EQ(kMaxSupportedFrameLength, config15.frame_size_ms);
|
| + config = CreateConfigWithParameters({{"ptime", "1"}});
|
| + EXPECT_EQ(kMinSupportedFrameLength, config.frame_size_ms);
|
| +
|
| + config = CreateConfigWithParameters({{"ptime", "2000"}});
|
| + EXPECT_EQ(kMaxSupportedFrameLength, config.frame_size_ms);
|
| }
|
|
|
| TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) {
|
| const webrtc::SdpAudioFormat format("opus", 48000, 2);
|
| - const auto default_config = *AudioEncoderOpusImpl::SdpToConfig(format);
|
| + const AudioEncoderOpus::Config default_config =
|
| + AudioEncoderOpus::CreateConfig(0, format);
|
| #if WEBRTC_OPUS_SUPPORT_120MS_PTIME
|
| const std::vector<int> default_supported_frame_lengths_ms({20, 60, 120});
|
| #else
|
| const std::vector<int> default_supported_frame_lengths_ms({20, 60});
|
| #endif
|
|
|
| - AudioEncoderOpusConfig config;
|
| + AudioEncoderOpus::Config config;
|
| config = CreateConfigWithParameters({{"stereo", "invalid"}});
|
| EXPECT_EQ(default_config.num_channels, config.num_channels);
|
|
|
| @@ -690,18 +681,18 @@
|
| // range of 6000 and 510000
|
| TEST(AudioEncoderOpusTest, SetSendCodecOpusMaxAverageBitrate) {
|
| // Ignore if less than 6000.
|
| - const auto config1 = AudioEncoderOpusImpl::SdpToConfig(
|
| - {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}});
|
| - EXPECT_EQ(6000, config1->bitrate_bps);
|
| + const AudioEncoderOpus::Config config1 = AudioEncoderOpus::CreateConfig(
|
| + 0, {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}});
|
| + EXPECT_EQ(6000, config1.bitrate_bps);
|
|
|
| // Ignore if larger than 510000.
|
| - const auto config2 = AudioEncoderOpusImpl::SdpToConfig(
|
| - {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}});
|
| - EXPECT_EQ(510000, config2->bitrate_bps);
|
| -
|
| - const auto config3 = AudioEncoderOpusImpl::SdpToConfig(
|
| - {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}});
|
| - EXPECT_EQ(200000, config3->bitrate_bps);
|
| + const AudioEncoderOpus::Config config2 = AudioEncoderOpus::CreateConfig(
|
| + 0, {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}});
|
| + EXPECT_EQ(510000, config2.bitrate_bps);
|
| +
|
| + const AudioEncoderOpus::Config config3 = AudioEncoderOpus::CreateConfig(
|
| + 0, {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}});
|
| + EXPECT_EQ(200000, config3.bitrate_bps);
|
| }
|
|
|
| // Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
|
|
|