diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index 9d882c6ff7..97b41ac658 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -279,12 +279,17 @@ static int int_pow(int i, int *exp_ptr) a = a << 1; eq--; } + /* now POW_FRAC_ONE <= a < 2 * POW_FRAC_ONE */ +#if (POW_FRAC_BITS - 1) > FRAC_BITS + a = (a + (1 << (POW_FRAC_BITS - FRAC_BITS - 1))) >> (POW_FRAC_BITS - FRAC_BITS); + /* correct overflow */ + if (a >= 2 * (1 << FRAC_BITS)) { + a = a >> 1; + eq++; + } +#endif *exp_ptr = eq; -#if POW_FRAC_BITS == FRAC_BITS return a; -#else - return (a + (1 << (POW_FRAC_BITS - FRAC_BITS - 1))) >> (POW_FRAC_BITS - FRAC_BITS); -#endif } static int decode_init(AVCodecContext * avctx) @@ -388,10 +393,6 @@ static int decode_init(AVCodecContext * avctx) for(i=1;i> 1; + e1++; + } #endif e1--; if (m != m1 || e != e1) { @@ -413,9 +416,8 @@ static int decode_init(AVCodecContext * avctx) #endif /* normalized to FRAC_BITS */ table_4_3_value[i] = m; - table_4_3_exp[i] = e - 1; + table_4_3_exp[i] = e; } - for(i=0;i<7;i++) { float f;