diff --git a/webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h b/webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h index 76ba2ff1e6..505142e756 100644 --- a/webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h +++ b/webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h @@ -35,9 +35,9 @@ extern "C" { * Returned value : Size in bytes of speechOut16b */ -int16_t WebRtcPcm16b_EncodeW16(int16_t *speechIn16b, +int16_t WebRtcPcm16b_EncodeW16(const int16_t* speechIn16b, int16_t len, - int16_t *speechOut16b); + int16_t* speechOut16b); /**************************************************************************** * WebRtcPcm16b_Encode(...) diff --git a/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.c b/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.c index 34aadc3f23..7661dc132c 100644 --- a/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.c +++ b/webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.c @@ -25,9 +25,9 @@ /* Encoder with int16_t Output */ -int16_t WebRtcPcm16b_EncodeW16(int16_t *speechIn16b, +int16_t WebRtcPcm16b_EncodeW16(const int16_t* speechIn16b, int16_t len, - int16_t *speechOut16b) + int16_t* speechOut16b) { #ifdef WEBRTC_ARCH_BIG_ENDIAN WEBRTC_SPL_MEMCPY_W16(speechOut16b, speechIn16b, len); diff --git a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc index 1fd53455d3..d60077df79 100644 --- a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc +++ b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc @@ -26,6 +26,7 @@ #include "gflags/gflags.h" #include "gtest/gtest.h" #include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h" +#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" #include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h" #include "webrtc/test/testsupport/fileutils.h" #include "webrtc/test/testsupport/gtest_disable.h" @@ -870,15 +871,12 @@ TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) { } } -class NetEqBgnTest - : public NetEqDecodingTest, - public ::testing::WithParamInterface { +class NetEqBgnTest : public NetEqDecodingTest { protected: - NetEqBgnTest() : NetEqDecodingTest() { - config_.background_noise_mode = GetParam(); - } + virtual void TestCondition(double sum_squared_noise, + bool should_be_faded) = 0; - void CheckBgnOff(int sampling_rate_hz) { + void CheckBgn(int sampling_rate_hz) { int expected_samples_per_channel = 0; uint8_t payload_type = 0xFF; // Invalid. if (sampling_rate_hz == 8000) { @@ -896,21 +894,17 @@ class NetEqBgnTest NetEqOutputType type; int16_t output[kBlockSize32kHz]; // Maximum size is chosen. - int16_t input[kBlockSize32kHz]; // Maximum size is chosen. + test::AudioLoop input; + // We are using the same 32 kHz input file for all tests, regardless of + // |sampling_rate_hz|. The output may sound weird, but the test is still + // valid. + ASSERT_TRUE(input.Init( + webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), + 10 * sampling_rate_hz, // Max 10 seconds loop length. + expected_samples_per_channel)); // Payload of 10 ms of PCM16 32 kHz. uint8_t payload[kBlockSize32kHz * sizeof(int16_t)]; - - // Random payload. - for (int n = 0; n < expected_samples_per_channel; ++n) { - input[n] = (rand() & ((1 << 10) - 1)) - ((1 << 5) - 1); - } - int enc_len_bytes = - WebRtcPcm16b_EncodeW16(input, - expected_samples_per_channel, - reinterpret_cast(payload)); - ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2); - WebRtcRTPHeader rtp_info; PopulateRtpInfo(0, 0, &rtp_info); rtp_info.header.payloadType = payload_type; @@ -920,6 +914,12 @@ class NetEqBgnTest uint32_t receive_timestamp = 0; for (int n = 0; n < 10; ++n) { // Insert few packets and get audio. + int enc_len_bytes = + WebRtcPcm16b_EncodeW16(input.GetNextBlock(), + expected_samples_per_channel, + reinterpret_cast(payload)); + ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2); + number_channels = 0; samples_per_channel = 0; ASSERT_EQ(0, @@ -981,12 +981,7 @@ class NetEqBgnTest double sum_squared = 0; for (int k = 0; k < number_channels * samples_per_channel; ++k) sum_squared += output[k] * output[k]; - if (config_.background_noise_mode == NetEq::kBgnOn) { - EXPECT_NE(0, sum_squared); - } else if (config_.background_noise_mode == NetEq::kBgnOff || - n > kFadingThreshold) { - EXPECT_EQ(0, sum_squared); - } + TestCondition(sum_squared, n > kFadingThreshold); } else { EXPECT_EQ(kOutputPLC, type); } @@ -995,17 +990,57 @@ class NetEqBgnTest } }; -TEST_P(NetEqBgnTest, BackgroundNoise) { - CheckBgnOff(8000); - CheckBgnOff(16000); - CheckBgnOff(32000); +class NetEqBgnTestOn : public NetEqBgnTest { + protected: + NetEqBgnTestOn() : NetEqBgnTest() { + config_.background_noise_mode = NetEq::kBgnOn; + } + + void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) { + EXPECT_NE(0, sum_squared_noise); + } +}; + +class NetEqBgnTestOff : public NetEqBgnTest { + protected: + NetEqBgnTestOff() : NetEqBgnTest() { + config_.background_noise_mode = NetEq::kBgnOff; + } + + void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) { + EXPECT_EQ(0, sum_squared_noise); + } +}; + +class NetEqBgnTestFade : public NetEqBgnTest { + protected: + NetEqBgnTestFade() : NetEqBgnTest() { + config_.background_noise_mode = NetEq::kBgnFade; + } + + void TestCondition(double sum_squared_noise, bool should_be_faded) { + if (should_be_faded) + EXPECT_EQ(0, sum_squared_noise); + } +}; + +TEST_F(NetEqBgnTestOn, RunTest) { + CheckBgn(8000); + CheckBgn(16000); + CheckBgn(32000); } -INSTANTIATE_TEST_CASE_P(BgnModes, - NetEqBgnTest, - ::testing::Values(NetEq::kBgnOn, - NetEq::kBgnOff, - NetEq::kBgnFade)); +TEST_F(NetEqBgnTestOff, RunTest) { + CheckBgn(8000); + CheckBgn(16000); + CheckBgn(32000); +} + +TEST_F(NetEqBgnTestFade, RunTest) { + CheckBgn(8000); + CheckBgn(16000); + CheckBgn(32000); +} TEST_F(NetEqDecodingTest, SyncPacketInsert) { WebRtcRTPHeader rtp_info;