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}
diff --git a/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1 b/resources/audio_coding/neteq4_universal_ref_android.pcm.sha1
index 4243b2a..2a4b938 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 67a44bd..aba96e4 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 @@
#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<ExternalDecoder>());
}
TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) {
- Run(16000, PlatformChecksum("a909560b5ca49fa472b17b7b277195e9",
- "f790e7a8cce4e2c8b7bb5e0e4c5dac0d",
- "8cffa6abcb3e18e33b9d857666dff66a",
- "66ee001e23534d4dcf5d0f81f916c93b"),
+ Run(16000, PlatformChecksum("9ad7d5a5f3c9fac4e880a6fbfd9d3ac8",
+ "4fc1b82404ae33511c1cdb385774b2a4",
+ "f580bfd4e5e29f0399b61b7512d4e3b4",
+ "5b2ae32c590b41d0c601179e14eaae96"),
std::vector<ExternalDecoder>());
}
TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) {
- Run(32000, PlatformChecksum("441aab4b347fb3db4e9244337aca8d8e",
- "306e0d990ee6e92de3fbecc0123ece37",
- "3e126fe894720c3f85edadcc91964ba5",
- "9c6ff204b14152c48fe41d5ab757943b"),
+ Run(32000, PlatformChecksum("08e6085ccb96494b242f0ecc4c8a2dc8",
+ "d1f853b1e046c67c9ee186786eaf2124",
+ "fdf5166b98c43235978685e40e28fea6",
+ "7f620312f2fa74a10048bbb7739d4bf3"),
std::vector<ExternalDecoder>());
}
TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) {
- Run(48000, PlatformChecksum("4ee2730fa1daae755e8a8fd3abd779ec",
- "aa7c232f63a67b2a72703593bdd172e0",
- "0155665e93067c4e89256b944dd11999",
- "fc4f0da8844cd808d822bbddf3b9c285"),
+ Run(48000, PlatformChecksum("31343887b7ef70772df733d072b0dd00",
+ "f6893278d75dad42ac44bff77f674b33",
+ "71f89e87ee1bad594f529d6c036289ad",
+ "b64c891e99eccc9ff45541ef67c9e9bf"),
std::vector<ExternalDecoder>());
}
@@ -1022,10 +1022,10 @@
std::vector<ExternalDecoder> 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 1b888f7..9bddfe7 100644
--- a/webrtc/modules/audio_coding/neteq/normal.cc
+++ b/webrtc/modules/audio_coding/neteq/normal.cc
@@ -99,7 +99,8 @@
// 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<int16_t>(energy << scaling);
+ int16_t energy_scaled =
+ static_cast<int16_t>(WEBRTC_SPL_SHIFT_W32(energy, scaling));
int32_t ratio = WebRtcSpl_DivW32W16(bgn_energy, energy_scaled);
mute_factor = WebRtcSpl_SqrtFloor(ratio << 14);
} else {