summaryrefslogtreecommitdiff
path: root/libavcodec/mpegaudiodec.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2002-05-21 21:07:47 +0000
committerFabrice Bellard <fabrice@bellard.org>2002-05-21 21:07:47 +0000
commit59d3e367a85f5faa1f8890bc69799e4d3bf2811e (patch)
tree0512c44ab17b103a90561bc94d6a7411a6ea37a7 /libavcodec/mpegaudiodec.c
parent777cc95fb4e58de7d7eb8d931b2ff3f4f83da56e (diff)
fixed incorrect global gain - slightly increased precision of n^(4/3) table
Originally committed as revision 557 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpegaudiodec.c')
-rw-r--r--libavcodec/mpegaudiodec.c26
1 files changed, 14 insertions, 12 deletions
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<TABLE_4_3_SIZE;i++) {
int e, m;
m = int_pow(i, &e);
-#if FRAC_BITS <= 15
- if ((unsigned short)m != m)
- m = 65535;
-#endif
#if 0
/* test code */
{
@@ -401,8 +402,10 @@ static int decode_init(AVCodecContext * avctx)
fm = frexp(f, &e1);
m1 = FIXR(2 * fm);
#if FRAC_BITS <= 15
- if ((unsigned short)m1 != m1)
- m1 = 65535;
+ if ((unsigned short)m1 != m1) {
+ m1 = m1 >> 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;