Commit 59d3e367 authored by Fabrice Bellard's avatar Fabrice Bellard

fixed incorrect global gain - slightly increased precision of n^(4/3) table

Originally committed as revision 557 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 777cc95f
...@@ -279,12 +279,17 @@ static int int_pow(int i, int *exp_ptr) ...@@ -279,12 +279,17 @@ static int int_pow(int i, int *exp_ptr)
a = a << 1; a = a << 1;
eq--; 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; *exp_ptr = eq;
#if POW_FRAC_BITS == FRAC_BITS
return a; return a;
#else
return (a + (1 << (POW_FRAC_BITS - FRAC_BITS - 1))) >> (POW_FRAC_BITS - FRAC_BITS);
#endif
} }
static int decode_init(AVCodecContext * avctx) static int decode_init(AVCodecContext * avctx)
...@@ -388,10 +393,6 @@ 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++) { for(i=1;i<TABLE_4_3_SIZE;i++) {
int e, m; int e, m;
m = int_pow(i, &e); m = int_pow(i, &e);
#if FRAC_BITS <= 15
if ((unsigned short)m != m)
m = 65535;
#endif
#if 0 #if 0
/* test code */ /* test code */
{ {
...@@ -401,8 +402,10 @@ static int decode_init(AVCodecContext * avctx) ...@@ -401,8 +402,10 @@ static int decode_init(AVCodecContext * avctx)
fm = frexp(f, &e1); fm = frexp(f, &e1);
m1 = FIXR(2 * fm); m1 = FIXR(2 * fm);
#if FRAC_BITS <= 15 #if FRAC_BITS <= 15
if ((unsigned short)m1 != m1) if ((unsigned short)m1 != m1) {
m1 = 65535; m1 = m1 >> 1;
e1++;
}
#endif #endif
e1--; e1--;
if (m != m1 || e != e1) { if (m != m1 || e != e1) {
...@@ -413,10 +416,9 @@ static int decode_init(AVCodecContext * avctx) ...@@ -413,10 +416,9 @@ static int decode_init(AVCodecContext * avctx)
#endif #endif
/* normalized to FRAC_BITS */ /* normalized to FRAC_BITS */
table_4_3_value[i] = m; 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++) { for(i=0;i<7;i++) {
float f; float f;
int v; int v;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment