OSDN Git Service

Use cbrtf and exp2f instead of pow to calculate tables for MPEG audio decoding.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Thu, 15 Oct 2009 06:59:23 +0000 (06:59 +0000)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Thu, 15 Oct 2009 06:59:23 +0000 (06:59 +0000)
This hopefully is fast enough so that it is reasonable to use the same formula
directly instead of the table for CONFIG_SMALL.

Originally committed as revision 20233 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mpegaudiodec.c

index dd986bd..e531fd3 100644 (file)
@@ -408,9 +408,10 @@ static av_cold int decode_init(AVCodecContext * avctx)
 
         int_pow_init();
         for(i=1;i<TABLE_4_3_SIZE;i++) {
+            double value = i/4;
             double f, fm;
             int e, m;
-            f = pow((double)(i/4), 4.0 / 3.0) * pow(2, (i&3)*0.25);
+            f = value * cbrtf(value) * exp2f((i&3)*0.25);
             fm = frexp(f, &e);
             m = (uint32_t)(fm*(1LL<<31) + 0.5);
             e+= FRAC_BITS - 31 + 5 - 100;
@@ -420,8 +421,9 @@ static av_cold int decode_init(AVCodecContext * avctx)
             table_4_3_exp[i] = -e;
         }
         for(i=0; i<512*16; i++){
+            double value = i & 15;
             int exponent= (i>>4);
-            double f= pow(i&15, 4.0 / 3.0) * pow(2, (exponent-400)*0.25 + FRAC_BITS + 5);
+            double f= value * cbrtf(value) * exp2f((exponent-400)*0.25 + FRAC_BITS + 5);
             expval_table[exponent][i&15]= llrint(f);
             if((i&15)==1)
                 exp_table[exponent]= llrint(f);