From 6608d9a1aa2b67d320aba0193b37271605aa7786 Mon Sep 17 00:00:00 2001 From: "henrik.lundin" Date: Wed, 10 Feb 2016 02:47:52 -0800 Subject: [PATCH] NetEq: Fix a negative shift value In some rare occations (very low energy signal), a shift value happened to be negative. This is now fixed by using the WEBRTC_SPL_SHIFT_W32, which in essence checks the sign of the number of shifts and performs a right or left shift accordingly. The fix reverts to how the code was written in old NetEq; see https://chromium.googlesource.com/external/webrtc/+/4d363ae305fa975e7f3ad2a5ca5dbe5e3f101f82/webrtc/modules/audio_coding/neteq/normal.c#165. BUG=webrtc:5490 Review URL: https://codereview.webrtc.org/1675293002 Cr-Commit-Position: refs/heads/master@{#11546} --- .../neteq4_universal_ref_android.pcm.sha1 | 2 +- .../audio_coding_module_unittest_oldapi.cc | 40 +++++++++---------- webrtc/modules/audio_coding/neteq/normal.cc | 3 +- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1 b/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1 index 4243b2aad5..2a4b9385a5 100644 --- a/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1 +++ b/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1 @@ -1 +1 @@ -133f5c18838c1d5c3cc61744e1e5f4d144518239 \ No newline at end of file +a349bd71dba548029b05d1d2a6dc7caafab9a856 \ No newline at end of file diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc index 67a44bd198..aba96e4081 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_unittest_oldapi.cc @@ -940,34 +940,34 @@ class AcmReceiverBitExactnessOldApi : public ::testing::Test { #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \ defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722) TEST_F(AcmReceiverBitExactnessOldApi, 8kHzOutput) { - Run(8000, PlatformChecksum("908002dc01fc4eb1d2be24eb1d3f354b", - "dcee98c623b147ebe1b40dd30efa896e", - "adc92e173f908f93b96ba5844209815a", - "ba16137d3a5a1e637252289c57522bfe"), + Run(8000, PlatformChecksum("d9334a99c7f185860028e6f08e5b7390", + "946803da293ef3fa39242d3059eac491", + "efb5a07480bad8afb184c4150f4b3f3a", + "51717ab374871cbfa2c6977ea2aa40f3"), std::vector()); } TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) { - Run(16000, PlatformChecksum("a909560b5ca49fa472b17b7b277195e9", - "f790e7a8cce4e2c8b7bb5e0e4c5dac0d", - "8cffa6abcb3e18e33b9d857666dff66a", - "66ee001e23534d4dcf5d0f81f916c93b"), + Run(16000, PlatformChecksum("9ad7d5a5f3c9fac4e880a6fbfd9d3ac8", + "4fc1b82404ae33511c1cdb385774b2a4", + "f580bfd4e5e29f0399b61b7512d4e3b4", + "5b2ae32c590b41d0c601179e14eaae96"), std::vector()); } TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) { - Run(32000, PlatformChecksum("441aab4b347fb3db4e9244337aca8d8e", - "306e0d990ee6e92de3fbecc0123ece37", - "3e126fe894720c3f85edadcc91964ba5", - "9c6ff204b14152c48fe41d5ab757943b"), + Run(32000, PlatformChecksum("08e6085ccb96494b242f0ecc4c8a2dc8", + "d1f853b1e046c67c9ee186786eaf2124", + "fdf5166b98c43235978685e40e28fea6", + "7f620312f2fa74a10048bbb7739d4bf3"), std::vector()); } TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) { - Run(48000, PlatformChecksum("4ee2730fa1daae755e8a8fd3abd779ec", - "aa7c232f63a67b2a72703593bdd172e0", - "0155665e93067c4e89256b944dd11999", - "fc4f0da8844cd808d822bbddf3b9c285"), + Run(48000, PlatformChecksum("31343887b7ef70772df733d072b0dd00", + "f6893278d75dad42ac44bff77f674b33", + "71f89e87ee1bad594f529d6c036289ad", + "b64c891e99eccc9ff45541ef67c9e9bf"), std::vector()); } @@ -1022,10 +1022,10 @@ TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) { std::vector external_decoders; external_decoders.push_back(ed); - Run(48000, PlatformChecksum("4ee2730fa1daae755e8a8fd3abd779ec", - "aa7c232f63a67b2a72703593bdd172e0", - "0155665e93067c4e89256b944dd11999", - "fc4f0da8844cd808d822bbddf3b9c285"), + Run(48000, PlatformChecksum("31343887b7ef70772df733d072b0dd00", + "f6893278d75dad42ac44bff77f674b33", + "71f89e87ee1bad594f529d6c036289ad", + "b64c891e99eccc9ff45541ef67c9e9bf"), external_decoders); EXPECT_CALL(mock_decoder, Die()); diff --git a/webrtc/modules/audio_coding/neteq/normal.cc b/webrtc/modules/audio_coding/neteq/normal.cc index 1b888f70d1..9bddfe7765 100644 --- a/webrtc/modules/audio_coding/neteq/normal.cc +++ b/webrtc/modules/audio_coding/neteq/normal.cc @@ -99,7 +99,8 @@ int Normal::Process(const int16_t* input, // We want background_noise_.energy() / energy in Q14. int32_t bgn_energy = background_noise_.Energy(channel_ix) << (scaling+14); - int16_t energy_scaled = static_cast(energy << scaling); + int16_t energy_scaled = + static_cast(WEBRTC_SPL_SHIFT_W32(energy, scaling)); int32_t ratio = WebRtcSpl_DivW32W16(bgn_energy, energy_scaled); mute_factor = WebRtcSpl_SqrtFloor(ratio << 14); } else {