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
4d363ae305/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}
This commit is contained in:
henrik.lundin 2016-02-10 02:47:52 -08:00 committed by Commit bot
parent 15583c19d7
commit 6608d9a1aa
3 changed files with 23 additions and 22 deletions

View File

@ -1 +1 @@
133f5c18838c1d5c3cc61744e1e5f4d144518239
a349bd71dba548029b05d1d2a6dc7caafab9a856

View File

@ -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<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 @@ TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) {
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());

View File

@ -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<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 {