⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegimdc.c

📁 Application (fix point) for playing MP3 data on embedded systems. mp3play is designed to be able to
💻 C
📖 第 1 页 / 共 3 页
字号:
     prev[5-2] = WIN_MULT( in3, 11-2 );     ts[(12+0)*SBLIMIT] += WIN_MULT( in0, 0 );     ts[(17-0)*SBLIMIT] += WIN_MULT( in0, 5-0 );     ts[(12+2)*SBLIMIT] += WIN_MULT( in4, 2 );     ts[(17-2)*SBLIMIT] += WIN_MULT( in4, 5-2 );  }  in++;  {     IMDCT_TYPE in0,in1,in2,in3,in4,in5;     prev[12]=prev[13]=prev[14]=prev[15]=prev[16]=prev[17]=(MPEGIMDCT_BLOCK_TYPE)0;     DCT12_PART1     {       IMDCT_TYPE tmp0,tmp1 = (in0 - in4);       {         IMDCT_TYPE tmp2 = T12_MULT( (in1 - in5), 1 );         tmp0 = tmp1 + tmp2;         tmp1 -= tmp2;       }       prev[11-1] = WIN_MULT( tmp0, 11-1 );       prev[6 +1] = WIN_MULT( tmp0, 6+1 );       prev[0+1] += WIN_MULT( tmp1, 1 );       prev[5-1] += WIN_MULT( tmp1, 5-1 );     }     DCT12_PART2     prev[11-0] = WIN_MULT( in2, 11-0 );     prev[6 +0] = WIN_MULT( in2, 6+0 );     prev[6 +2] = WIN_MULT( in3, 6+2 );     prev[11-2] = WIN_MULT( in3, 11-2 );     prev[0+0] += WIN_MULT( in0, 0 );     prev[5-0] += WIN_MULT( in0, 5-0 );     prev[0+2] += WIN_MULT( in4, 2 );     prev[5-2] += WIN_MULT( in4, 5-2 );  }}int MPEGIMDCT_hybrid( MPEGIMDCT *mpegimdct, MPEGAUD_FRACT_TYPE *in,                      MPEGAUD_FRACT_TYPE *out, INT16 block_type, BOOL mixed,                      INT16 ch, INT16 sb_max )/*--------------------------------------------------------------------------   Apply the hybrid imdct to a granule   Return 0 if Ok*/{   static BOOL init = FALSE;   MPEGIMDCT_BLOCK_TYPE *prev;   INT16 bt1,bt2;   INT16 sb;#define O( i ) out[ i*32 ]   if( !init ) {      int i,j;#ifdef IMDCT_INT#define KW ((double)(1<<(WIN_BITS-1))+0)#define KC (double)(1<<COS_BITS)#define KT ((double)(1<<(TFC_BITS-1))+0)#else#define KW 0.5#define KC 1#define KT 0.5#endif      for(i=0;i<18;i++) {         win[0][i]    = win[1][i]    = KW * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );         win[0][i+18] = win[3][i+18] = KW * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );      }      for(i=0;i<6;i++) {         win[1][i+18] = KW / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );         win[3][i+12] = KW / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );         win[1][i+24] = KW * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );         win[1][i+30] = win[3][i] = 0.0;         win[3][i+6 ] = KW * sin( M_PI / 24.0 * (double) (2*i+1) )  / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );      }      for(i=0;i<9;i++) COS9[i] = KC * cos( M_PI / 18.0 * (double) i);      for(i=0;i<9;i++) tfcos36[i] = KT / cos ( M_PI * (double) (i*2+1) / 36.0 );      for(i=0;i<3;i++) tfcos12[i] = KT / cos ( M_PI * (double) (i*2+1) / 12.0 );      COS6_1 = KC * cos( M_PI / 6.0 * (double) 1 );      COS6_2 = KC * cos( M_PI / 6.0 * (double) 2 );      for(i=0;i<12;i++) {         win[2][i]  = KW * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );         for(j=0;j<6;j++) COS1[i][j] = KC * cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );      }      for(j=0;j<4;j++) {         static const int len[4] = { 36,36,12,36 }; /* #3 Added const */         for(i=0;i<len[j];i+=2) win1[j][i] = + win[j][i];         for(i=1;i<len[j];i+=2) win1[j][i] = - win[j][i];      }      init = TRUE;   }   prev = mpegimdct->prevblk[ ch ];   bt1 = (mixed) ? 0 : block_type;   bt2 = block_type;   if( bt2 == 2 ) {      if( !bt1 ) {         dct36( in, prev, win[0], out );         in += SSLIMIT;         dct36( in, prev+18, win1[0], out+1 );         in += SSLIMIT;      }      else {         dct12( in, prev, win[2], out );         in += SSLIMIT;         dct12( in, prev+18, win1[2], out+1 );         in += SSLIMIT;      }      prev += 36; out += 2;      for( sb=2; sb<sb_max; sb += 2,out += 2, prev += 36 ) {         dct12( in, prev, win[2], out );         in += SSLIMIT;         dct12( in, prev+18, win1[2], out+1 );         in += SSLIMIT;      }   }   else {      dct36( in, prev, win[bt1], out );      in += SSLIMIT;      dct36( in, prev+18, win1[bt1], out+1 );      in += SSLIMIT;      prev += 36; out += 2;      for ( sb=2; sb<sb_max; sb += 2, out += 2, prev += 36 ) {         dct36( in, prev, win[bt2], out );         in += SSLIMIT;         dct36( in, prev+18, win1[bt2], out+1 );         in += SSLIMIT;      }   }   for( ; sb< SBLIMIT; sb++ ) {      O( 0 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 1 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 2 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      O( 3 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 4 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 5 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      O( 6 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 7 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 8 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      O( 9 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 10 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 11 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      O( 12 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 13 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 14 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      O( 15 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 16 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;          O( 17 ) = *prev; *prev++ = (MPEGIMDCT_BLOCK_TYPE)0;      out++;   }   return 0;}#else // -> NOT NEW_IMDCT#ifndef PI#define PI 3.14159265358979323846#endif#ifdef IMDCT_INT#define IMDCT_IO_TYPE MPEGAUD_FRACT_TYPE#define IMDCT_TYPE INT32#define IMDCT_BITS 14#define WIN_TYPE INT16#define WIN_BITS 14#define WIN_MULT( t, w ) (((t) * (w))>>WIN_BITS)#else#define IMDCT_IO_TYPE REAL#define IMDCT_TYPE REAL#define IMDCT_BITS 0#define WIN_TYPE REAL#define WIN_BITS 0#define WIN_MULT( t, w ) ((t) * (w))#endifstatic int imdct_l( IMDCT_IO_TYPE *x, IMDCT_IO_TYPE *out,                    MPEGIMDCT_BLOCK_TYPE *prev, WIN_TYPE *win ){   static const IMDCT_TYPE K0 = 0.9990482216 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K1 = 0.9914448614 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K2 = 0.9762960071 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K3 = 0.9537169507 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K4 = 0.9238795325 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K5 = 0.8870108332 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K6 = 0.8433914458 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K7 = 0.7933533403 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K8 = 0.7372773368 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K9 = 0.6755902076 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K10 = 0.6087614290 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K11 = 0.5372996083 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K12 = 0.4617486132 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K13 = 0.3826834324 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K14 = 0.3007057995 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K15 = 0.2164396139 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K16 = 0.1305261922 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K17 = 0.04361938737 * (1<<IMDCT_BITS); /* #3 Added const */   IMDCT_TYPE k1, k2;   IMDCT_TYPE s[ 6 ];   IMDCT_TYPE t[ 6 ];   IMDCT_TYPE temp;   INT16 i;#ifdef IMDCT_INT#define S( a ) (INT32)x[ a ] - (INT32)x[ 11-a ] - (INT32)x[ 12+a ]//   #define M( xi, Kx ) ((INT32)x[ xi ] * (Kx))#define M( xi, Kx ) (x[ xi ] * (Kx))#define MT( ti, Kx ) (t[ ti ] * (Kx))#define W( t, wi ) WIN_MULT( (t>>IMDCT_BITS), win[ wi ] )#else#define S( a ) x[ a ] - x[ 11-a ] - x[ 12+a ]#define M( xi, Kx ) (REAL)(x[ xi ] * (Kx))#define MT( ti, Kx ) (REAL)(t[ ti ] * (Kx))#define W( t, wi ) (REAL)(t * win[ wi ])#endif#define O( i ) out[ i*32 ]   k1 = M( 4, K13 ) - M( 13, K4 );   k2 = M( 4, K4 )  + M( 13, K13 );   s[ 0 ] = -M( 1, K7 )  + k1 + M( 7, K1 )  + M( 10, K16 ) - M( 16, K10 );   s[ 1 ] = -M( 1, K4 )  - k1 + M( 7, K13 ) + M( 10, K4 )  + M( 16, K13 );   s[ 2 ] = -M( 1, K1 )  - k2 - M( 7, K7 )  - M( 10, K10 ) - M( 16, K16 );   s[ 3 ] = -M( 1, K10 ) + k2 + M( 7, K16 ) - M( 10, K1 )  + M( 16, K7 );   s[ 4 ] = -M( 1, K13 ) + k2 - M( 7, K4 )  + M( 10, K13 ) - M( 16, K4 );   s[ 5 ] = -M( 1, K16 ) + k1 - M( 7, K10 ) + M( 10, K7 )  + M( 16, K1 );   t[ 0 ] = S( 0 );   t[ 1 ] = S( 2 );   t[ 2 ] = S( 3 );   t[ 3 ] = S( 5 );   // 0   temp =   M( 0, K9 ) - M( 2, K11 ) + M( 3, K5 )   - M( 5, K3 )   - M( 6, K15 ) + M( 8, K17 )          - M( 9, K0 ) + M( 11, K2 ) - M( 12, K14 ) + M( 14, K12 ) + M( 15, K6 ) - M( 17, K8 );   temp += s[ 0 ];   O( 0 ) = prev[ 0 ] + W( temp, 0 );   O( 17 ) = prev[ 17 ] -W( temp, 17 );   // 1   temp =   MT( 0, K10 ) - MT( 1, K16 ) + MT( 2, K1 ) - MT( 3, K7 ) + s[ 1 ];   O( 1 ) = prev[ 1 ] + W( temp, 1 );   O( 16 ) =  prev[ 16 ] -W( temp, 16 );   // 2   temp =   M( 0, K11 ) + M( 2, K14 ) + M( 3, K8 )  + M( 5, K17 ) + M( 6, K5 )  - M( 8, K15 )          + M( 9, K2 ) - M( 11, K12 ) + M( 12, K0 ) - M( 14, K9 ) + M( 15, K3 ) - M( 17, K6 );   temp += s[ 2 ];   O( 2 ) = prev[ 2 ] + W( temp, 2 );   O( 15 ) = prev[ 15 ] -W( temp, 15 );   // 3   temp =   M( 0, K12 ) + M( 2, K9 ) + M( 3, K15 )  + M( 5, K6 ) - M( 6, K17 )  + M( 8, K3 )          - M( 9, K14 ) + M( 11, K0 ) - M( 12, K11 ) + M( 14, K2 ) - M( 15, K8 ) + M( 17, K5 );   temp += s[ 2 ];   O( 3 ) = prev[ 3 ] + W( temp, 3 );   O( 14 ) = prev[ 14 ] -W( temp, 14 );   // 4   temp =   MT( 0, K13 ) + MT( 1, K4 ) - MT( 2, K13 ) + MT( 3, K4 ) + s[ 1 ];   O( 4 ) = prev[ 4 ] + W( temp, 4 );   O( 13 ) = prev[ 13 ]  -W( temp, 13 );   // 5   temp =   M( 0, K14 ) + M( 2, K0 ) - M( 3, K6 )  + M( 5, K15 ) - M( 6, K8 )  - M( 8, K5 )          + M( 9, K12 ) - M( 11, K9 ) + M( 12, K2 ) + M( 14, K11 ) + M( 15, K17 ) + M( 17, K3 );   temp += s[ 0 ];   O( 5 ) = prev[ 5 ] + W( temp, 5 );   O( 12 ) = prev[ 12 ] -W( temp, 12 );   // 6   temp =   M( 0, K15 ) + M( 2, K5 ) - M( 3, K0 )  - M( 5, K9 ) + M( 6, K14 )  - M( 8, K11 )          + M( 9, K6 ) + M( 11, K3 ) - M( 12, K8 ) + M( 14, K17 ) - M( 15, K12 ) - M( 17, K2 );   temp += s[ 3 ];   O( 6 ) = prev[ 6 ] + W( temp, 6 );   O( 11 ) = prev[ 11 ] -W( temp, 11 );   // 7   temp =   MT( 0, K16 ) + MT( 1, K10 ) - MT( 2, K7 ) - MT( 3, K1 ) + s[ 4 ];   O( 7 ) = prev[ 7 ] + W( temp, 7 );   O( 10 ) = prev[ 10 ] -W( temp, 10 );   // 8   temp =   M( 0, K17 ) + M( 2, K15 ) - M( 3, K14 ) - M( 5, K12 ) + M( 6, K11 ) + M( 8, K9 )          - M( 9, K8 ) - M( 11, K6 ) + M( 12, K5 ) + M( 14, K3 ) - M( 15, K2 ) - M( 17, K0 );   temp += s[ 5 ];   O( 8 ) = prev[ 8 ] + W( temp, 8 );   O( 9 ) = prev[ 9 ] -W( temp, 9 );   // 9+9   temp = - M( 0, K8 ) + M( 2, K6 ) - M( 3, K12 ) + M( 5, K14 ) + M( 6, K2 ) - M( 8, K0 )          - M( 9, K17 ) + M( 11, K15 ) - M( 12, K3 ) + M( 14, K5 ) + M( 15, K11 ) - M( 17, K9 );   temp -= s[ 3 ];   prev[ 0 ] = W( temp, 18 );   prev[ 17 ] = W( temp, 35 );   // 10+9   temp =  - MT( 0, K7 ) + MT( 1, K1 ) + MT( 2, K16 ) - MT( 3, K10 ) - s[ 4 ];   prev[ 1 ] = W( temp, 19 );   prev[ 16 ] = W( temp, 34 );   // 11+9   temp = - M( 0, K6 ) + M( 2, K3 ) + M( 3, K9 ) - M( 5, K0 ) - M( 6, K12 ) + M( 8, K2 )          + M( 9, K15 ) - M( 11, K5 ) + M( 12, K17 ) + M( 14, K8 ) - M( 15, K14 ) - M( 17, K11 );   temp -= s[ 5 ];   prev[ 2 ] = W( temp, 20 );   prev[ 15 ] = W( temp, 33 );   // 12+9   temp = - M( 0, K5 ) + M( 2, K8 ) + M( 3, K2 ) - M( 5, K11 ) - M( 6, K0 ) + M( 8, K14 )          + M( 9, K3 ) - M( 11, K17 ) - M( 12, K6 ) - M( 14, K15 ) + M( 15, K9 ) + M( 17, K12 );   temp += s[ 5 ];   prev[ 3 ] = W( temp, 21 );   prev[ 14 ] = W( temp, 32 );   // 13+9   temp =  - MT( 0, K4 ) + MT( 1, K13 ) + MT( 2, K4 ) + MT( 3, K13 ) + s[ 4 ];   prev[ 4 ] = W( temp, 22 );   prev[ 13 ] = W( temp, 31 );   // 14+9   temp = - M( 0, K3 ) - M( 2, K17 ) + M( 3, K11 ) + M( 5, K2 ) + M( 6, K9 ) - M( 8, K12 )          - M( 9, K5 ) - M( 11, K8 ) - M( 12, K15 ) + M( 14, K6 ) + M( 15, K0 ) + M( 17, K14 );   temp += s[ 3 ];   prev[ 5 ] = W( temp, 23 );   prev[ 12 ] = W( temp, 30 );   // 15+9   temp = - M( 0, K2 ) - M( 2, K12 ) - M( 3, K17 ) + M( 5, K8 ) + M( 6, K3 ) + M( 8, K6 )          + M( 9, K11 ) - M( 11, K14 ) - M( 12, K9 ) - M( 14, K0 ) - M( 15, K5 ) - M( 17, K15 );   temp += s[ 0 ];   prev[ 6 ] = W( temp, 24 );   prev[ 11 ] = W( temp, 29 );   // 16+9   temp =  - MT( 0, K1 ) - MT( 1, K7 ) - MT( 2, K10 ) - MT( 3, K16 ) + s[ 1 ];   prev[ 7 ] = W( temp, 25 );   prev[ 10 ] = W( temp, 28 );   // 17+9   temp = - M( 0, K0 ) - M( 2, K2 ) - M( 3, K3 ) - M( 5, K5 ) - M( 6, K6 ) - M( 8, K8 )          - M( 9, K9 ) - M( 11, K11 ) - M( 12, K12 ) - M( 14, K14 ) - M( 15, K15 ) - M( 17, K17 );   temp += s[ 2 ];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -