diff options
Diffstat (limited to 'media/libstagefright/codecs/amrwbenc/src/preemph.c')
-rw-r--r-- | media/libstagefright/codecs/amrwbenc/src/preemph.c | 104 |
1 files changed, 58 insertions, 46 deletions
diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c index c867bf7..70c8650 100644 --- a/media/libstagefright/codecs/amrwbenc/src/preemph.c +++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c @@ -18,7 +18,7 @@ * File: preemph.c * * * * Description: Preemphasis: filtering through 1 - g z^-1 * -* Preemph2 --> signal is multiplied by 2 * +* Preemph2 --> signal is multiplied by 2 * * * ************************************************************************/ @@ -26,62 +26,74 @@ #include "basic_op.h" void Preemph( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ) + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ) { - Word16 temp; - Word32 i, L_tmp; + Word16 temp; + Word32 i, L_tmp; - temp = x[lg - 1]; + temp = x[lg - 1]; - for (i = lg - 1; i > 0; i--) - { - L_tmp = L_deposit_h(x[i]); - L_tmp -= (x[i - 1] * mu)<<1; - x[i] = (L_tmp + 0x8000)>>16; - } + for (i = lg - 1; i > 0; i--) + { + L_tmp = L_deposit_h(x[i]); + L_tmp -= (x[i - 1] * mu)<<1; + x[i] = (L_tmp + 0x8000)>>16; + } - L_tmp = L_deposit_h(x[0]); - L_tmp -= ((*mem) * mu)<<1; - x[0] = (L_tmp + 0x8000)>>16; + L_tmp = L_deposit_h(x[0]); + L_tmp -= ((*mem) * mu)<<1; + x[0] = (L_tmp + 0x8000)>>16; - *mem = temp; + *mem = temp; - return; + return; } void Preemph2( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ) + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ) { - Word16 temp; - Word32 i, L_tmp; - - temp = x[lg - 1]; - - for (i = (Word16) (lg - 1); i > 0; i--) - { - L_tmp = L_deposit_h(x[i]); - L_tmp -= (x[i - 1] * mu)<<1; - L_tmp = (L_tmp << 1); - x[i] = (L_tmp + 0x8000)>>16; - } - - L_tmp = L_deposit_h(x[0]); - L_tmp -= ((*mem) * mu)<<1; - L_tmp = (L_tmp << 1); - x[0] = (L_tmp + 0x8000)>>16; - - *mem = temp; - - return; + Word16 temp; + Word32 i, L_tmp; + + temp = x[lg - 1]; + + for (i = (Word16) (lg - 1); i > 0; i--) + { + L_tmp = L_deposit_h(x[i]); + L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow + if (L_tmp > INT32_MAX / 2) { + L_tmp = INT32_MAX / 2; + } + L_tmp = (L_tmp << 1); + if (L_tmp > INT32_MAX - 0x8000) { + L_tmp = INT32_MAX - 0x8000; + } + x[i] = (L_tmp + 0x8000)>>16; + } + + L_tmp = L_deposit_h(x[0]); + L_tmp -= ((*mem) * mu)<<1; + if (L_tmp > INT32_MAX / 2) { + L_tmp = INT32_MAX / 2; + } + L_tmp = (L_tmp << 1); + if (L_tmp > INT32_MAX - 0x8000) { + L_tmp = INT32_MAX - 0x8000; + } + x[0] = (L_tmp + 0x8000)>>16; + + *mem = temp; + + return; } |