From: Michael Niedermayer Date: Tue, 1 Feb 2005 23:43:07 +0000 (+0000) Subject: faster, simpler and more accurate l3_unscale() X-Git-Tag: v0.5~14255 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d04728bb57a72b28c63ee1ab710e674a39591b19;p=platform%2Fupstream%2Flibav.git faster, simpler and more accurate l3_unscale() Originally committed as revision 3924 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index 9bf3fac..fb18822 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -162,13 +162,9 @@ static VLC huff_quad_vlc[2]; /* computed from band_size_long */ static uint16_t band_index_long[9][23]; /* XXX: free when all decoders are closed */ -#define TABLE_4_3_SIZE (8191 + 16) +#define TABLE_4_3_SIZE (8191 + 16)*4 static int8_t *table_4_3_exp; -#if FRAC_BITS <= 15 -static uint16_t *table_4_3_value; -#else static uint32_t *table_4_3_value; -#endif /* intensity stereo coef table */ static int32_t is_table[2][16]; static int32_t is_table_lsf[2][2][16]; @@ -191,14 +187,6 @@ static int32_t scale_factor_mult2[3][3] = { SCALE_GEN(4.0 / 9.0), /* 9 steps */ }; -/* 2^(n/4) */ -static uint32_t scale_factor_mult3[4] = { - FIXR(1.0), - FIXR(1.18920711500272106671), - FIXR(1.41421356237309504880), - FIXR(1.68179283050742908605), -}; - void ff_mpa_synth_init(MPA_INT *window); static MPA_INT window[512] __attribute__((aligned(16))); @@ -236,32 +224,19 @@ static inline int l2_unscale_group(int steps, int mant, int scale_factor) /* compute value^(4/3) * 2^(exponent/4). It normalized to FRAC_BITS */ static inline int l3_unscale(int value, int exponent) { -#if FRAC_BITS <= 15 + unsigned int m; -#else - uint64_t m; -#endif int e; - e = table_4_3_exp[value]; - e += (exponent >> 2); - e = FRAC_BITS - e; -#if FRAC_BITS <= 15 + e = table_4_3_exp [4*value + (exponent&3)]; + m = table_4_3_value[4*value + (exponent&3)]; + e -= (exponent >> 2); + assert(e>=1); if (e > 31) -#else - if (e > 63) -#endif return 0; - m = table_4_3_value[value]; -#if FRAC_BITS <= 15 - m = (m * scale_factor_mult3[exponent & 3]); m = (m + (1 << (e-1))) >> e; + return m; -#else - m = MUL64(m, scale_factor_mult3[exponent & 3]); - m = (m + (uint64_t_C(1) << (e-1))) >> e; - return m; -#endif } /* all integer n^(4/3) computation code */ @@ -426,32 +401,17 @@ static int decode_init(AVCodecContext * avctx) int_pow_init(); for(i=1;i> 1; - e1++; - } -#endif - e1--; - if (m != m1 || e != e1) { - printf("%4d: m=%x m1=%x e=%d e1=%d\n", - i, m, m1, e, e1); - } - } -#endif + f = pow((double)(i/4), 4.0 / 3.0) * pow(2, (i&3)*0.25); + fm = frexp(f, &e); + m = FIXHR(fm*0.5); + e+= FRAC_BITS - 31; + /* normalized to FRAC_BITS */ table_4_3_value[i] = m; - table_4_3_exp[i] = e; +// av_log(NULL, AV_LOG_DEBUG, "%d %d %f\n", i, m, pow((double)i, 4.0 / 3.0)); + table_4_3_exp[i] = -e; } for(i=0;i<7;i++) {