diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn index fe9ca70033..4f8d4aea68 100644 --- a/modules/audio_coding/BUILD.gn +++ b/modules/audio_coding/BUILD.gn @@ -1332,6 +1332,7 @@ if (rtc_include_tests) { "../../api/audio:audio_frame_api", "../../api/audio_codecs:builtin_audio_decoder_factory", "../../api/audio_codecs:builtin_audio_encoder_factory", + "../../api/audio_codecs/isac:audio_encoder_isac_float", "../../rtc_base:checks", "../../rtc_base:rtc_base_approved", "../../rtc_base/synchronization:rw_lock_wrapper", diff --git a/modules/audio_coding/test/Tester.cc b/modules/audio_coding/test/Tester.cc index 8ce50a413b..b06422575a 100644 --- a/modules/audio_coding/test/Tester.cc +++ b/modules/audio_coding/test/Tester.cc @@ -51,7 +51,6 @@ TEST(AudioCodingModuleTest, TestRedFec) { } #endif -#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX) #if defined(WEBRTC_ANDROID) TEST(AudioCodingModuleTest, DISABLED_TestIsac) { #else @@ -59,7 +58,6 @@ TEST(AudioCodingModuleTest, TestIsac) { #endif webrtc::ISACTest(ACM_TEST_MODE).Perform(); } -#endif #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \ defined(WEBRTC_CODEC_ILBC) diff --git a/modules/audio_coding/test/iSACTest.cc b/modules/audio_coding/test/iSACTest.cc index 95af4d461a..a130ae3e66 100644 --- a/modules/audio_coding/test/iSACTest.cc +++ b/modules/audio_coding/test/iSACTest.cc @@ -24,15 +24,47 @@ #endif #include "api/audio_codecs/builtin_audio_decoder_factory.h" +#include "api/audio_codecs/isac/audio_encoder_isac_float.h" #include "modules/audio_coding/codecs/audio_format_conversion.h" #include "modules/audio_coding/test/utility.h" #include "rtc_base/strings/string_builder.h" #include "rtc_base/timeutils.h" #include "system_wrappers/include/sleep.h" +#include "test/gmock.h" +#include "test/gtest.h" #include "test/testsupport/fileutils.h" namespace webrtc { +using ::testing::AnyOf; +using ::testing::Eq; +using ::testing::StrCaseEq; + +namespace { + +AudioEncoderIsacFloat::Config MakeConfig(const CodecInst& ci) { + EXPECT_THAT(ci.plname, StrCaseEq("ISAC")); + EXPECT_THAT(ci.plfreq, AnyOf(Eq(16000), Eq(32000))); + EXPECT_THAT(ci.channels, Eq(1u)); + AudioEncoderIsacFloat::Config config; + config.sample_rate_hz = ci.plfreq; + EXPECT_THAT(config.IsOk(), Eq(true)); + return config; +} + +AudioEncoderIsacFloat::Config TweakConfig( + AudioEncoderIsacFloat::Config config, + const ACMTestISACConfig& test_config) { + if (test_config.currentRateBitPerSec > 0) { + config.bit_rate = test_config.currentRateBitPerSec; + } + if (test_config.currentFrameSizeMsec != 0) { + config.frame_size_ms = test_config.currentFrameSizeMsec; + } + EXPECT_THAT(config.IsOk(), Eq(true)); + return config; +} + void SetISACConfigDefault(ACMTestISACConfig& isacConfig) { isacConfig.currentRateBitPerSec = 0; isacConfig.currentFrameSizeMsec = 0; @@ -40,34 +72,9 @@ void SetISACConfigDefault(ACMTestISACConfig& isacConfig) { isacConfig.initRateBitPerSec = 0; isacConfig.initFrameSizeInMsec = 0; isacConfig.enforceFrameSize = false; - return; } -int16_t SetISAConfig(ACMTestISACConfig& isacConfig, - AudioCodingModule* acm, - int testMode) { - if ((isacConfig.currentRateBitPerSec != 0) || - (isacConfig.currentFrameSizeMsec != 0)) { - auto sendCodec = acm->SendCodec(); - EXPECT_TRUE(sendCodec); - if (isacConfig.currentRateBitPerSec < 0) { - // Register iSAC in adaptive (channel-dependent) mode. - sendCodec->rate = -1; - EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec)); - } else { - if (isacConfig.currentRateBitPerSec != 0) { - sendCodec->rate = isacConfig.currentRateBitPerSec; - } - if (isacConfig.currentFrameSizeMsec != 0) { - sendCodec->pacsize = - isacConfig.currentFrameSizeMsec * (sendCodec->plfreq / 1000); - } - EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec)); - } - } - - return 0; -} +} // namespace ISACTest::ISACTest(int testMode) : _acmA(AudioCodingModule::Create( @@ -120,8 +127,10 @@ void ISACTest::Setup() { file_name_swb_ = webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); + _acmB->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC16kHz), _paramISAC16kHz.pltype)); + _acmA->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC32kHz), _paramISAC32kHz.pltype)); _inFileA.Open(file_name_swb_, 32000, "rb"); // Set test length to 500 ms (50 blocks of 10 ms each). @@ -234,14 +243,13 @@ void ISACTest::EncodeDecode(int testNr, file_name_out = file_stream_b.str(); _outFileB.Open(file_name_out, 32000, "wb"); - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz)); - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz)); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); - // Side A is sending super-wideband, and side B is sending wideband. - SetISAConfig(swbISACConfig, _acmA.get(), _testMode); - SetISAConfig(wbISACConfig, _acmB.get(), _testMode); + _acmA->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + TweakConfig(MakeConfig(_paramISAC32kHz), swbISACConfig), + _paramISAC32kHz.pltype)); + _acmB->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + TweakConfig(MakeConfig(_paramISAC16kHz), wbISACConfig), + _paramISAC16kHz.pltype)); bool adaptiveMode = false; if ((swbISACConfig.currentRateBitPerSec == -1) || @@ -307,8 +315,10 @@ void ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) { // Start with side A sending super-wideband and side B seding wideband. // Toggle sending wideband/super-wideband in this test. - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); + _acmA->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC32kHz), _paramISAC32kHz.pltype)); + _acmB->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC16kHz), _paramISAC16kHz.pltype)); int numSendCodecChanged = 0; _myTimer.Reset(); @@ -324,12 +334,14 @@ void ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) { // Switch side A to send super-wideband. _inFileA.Close(); _inFileA.Open(file_name_swb_, 32000, "rb"); - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz)); + _acmA->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC32kHz), _paramISAC32kHz.pltype)); } else { // Switch side A to send wideband. _inFileA.Close(); _inFileA.Open(file_name_swb_, 32000, "rb"); - EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz)); + _acmA->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC16kHz), _paramISAC16kHz.pltype)); } numSendCodecChanged++; } @@ -339,12 +351,14 @@ void ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) { // Switch side B to send super-wideband. _inFileB.Close(); _inFileB.Open(file_name_swb_, 32000, "rb"); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz)); + _acmB->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC32kHz), _paramISAC32kHz.pltype)); } else { // Switch side B to send wideband. _inFileB.Close(); _inFileB.Open(file_name_swb_, 32000, "rb"); - EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz)); + _acmB->SetEncoder(AudioEncoderIsacFloat::MakeAudioEncoder( + MakeConfig(_paramISAC16kHz), _paramISAC16kHz.pltype)); } numSendCodecChanged++; }