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

📄 mpegimdc.c

📁 uclinux下s3c4510B CPU播放mp3 C程序
💻 C
📖 第 1 页 / 共 3 页
字号:
   prev[ 8 ] = W( temp, 26 );   prev[ 9 ] = W( temp, 27 );   return 0;#undef O#undef set_k#undef S#undef W#undef MT#undef M}static int imdct_s( IMDCT_IO_TYPE *x, IMDCT_IO_TYPE *out,                    MPEGIMDCT_BLOCK_TYPE *prev, WIN_TYPE *win ){   static const IMDCT_TYPE K0 = 0.9914448614 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K1 = 0.9238795325 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K2 = 0.7933533403 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K3 = 0.6087614290 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K4 = 0.3826834324 * (1<<IMDCT_BITS); /* #3 Added const */   static const IMDCT_TYPE K5 = 0.1305261922 * (1<<IMDCT_BITS); /* #3 Added const */   IMDCT_TYPE s[ 2 ];   IMDCT_TYPE t[ 2 ];   IMDCT_TYPE temp;   INT16 i;#ifdef IMDCT_INT#define M( xi, Kx ) ((INT32)x[ (xi*3) ] * (Kx))#define MT( ti, Kx ) (t[ ti ] * (Kx))#define W( t, wi ) WIN_MULT( (t>>IMDCT_BITS), win[ wi ] )#else#define M( xi, Kx ) (REAL)(x[ (xi*3) ] * (Kx))#define MT( ti, Kx ) (REAL)(t[ ti ] * (Kx))#define W( t, wi ) (REAL)(t * win[ wi ])#endif#define O( i ) out[ i*32 ]// Step 1   O( 0 ) = prev[ 0 ]; O( 1 ) = prev[ 1 ]; O( 2 ) = prev[ 2 ];   O( 3 ) = prev[ 3 ]; O( 4 ) = prev[ 4 ]; O( 5 ) = prev[ 5 ];   s[ 0 ] = M( 1, K1 ) + M( 4, K4 );   s[ 1 ] = M( 1, K4 ) - M( 4, K1 );   t[ 0 ] =  x[0*3] - x[3*3];   t[ 1 ] =  x[2*3] + x[5*3];   // 0   temp =   M( 0, K3 ) - M( 2, K5 ) + M( 3, K0 ) - M( 5, K2 ) - s[ 0 ];   O( 6 ) = prev[ 6 ] + W( temp, 0 );   O( 11 ) = prev[ 11 ] -W( temp, 5 );   // 1   temp =   MT( 0, K4 ) + MT( 1, K1 ) - s[ 0 ];   O( 7 ) = prev[ 7 ] + W( temp, 1 );   O( 10 ) = prev[ 10 ] -W( temp, 4 );   // 2   temp =   M( 0, K5 ) + M( 2, K3 ) - M( 3, K2 ) - M( 5, K0 ) - s[ 1 ];   O( 8 ) = prev[ 8 ] + W( temp, 2 );   O( 9 ) = prev[ 9 ] -W( temp, 3 );   // 3   // 3+3   temp = - M( 0, K2 ) + M( 2, K0 ) + M( 3, K5 ) - M( 5, K3 ) + s[ 1 ];   O( 12 ) = W( temp, 6 );   O( 17 ) = W( temp, 11 );   // 4+3   temp = - MT( 0, K1 ) + MT( 1, K4 ) - s[ 1 ];   O( 13 ) = W( temp, 7 );   O( 16 ) = W( temp, 10 );   // 5+3   temp = - M( 0, K0 ) - M( 2, K2 ) - M( 3, K3 ) - M( 5, K5 ) - s[ 0 ];   O( 14 ) = W( temp, 8 );   O( 15 ) = W( temp, 9 );// Step 2   x++;   s[ 0 ] = M( 1, K1 ) + M( 4, K4 );   s[ 1 ] = M( 1, K4 ) - M( 4, K1 );   t[ 0 ] =  x[0*3] - x[3*3];   t[ 1 ] =  x[2*3] + x[5*3];   // 0   temp =   M( 0, K3 ) - M( 2, K5 ) + M( 3, K0 ) - M( 5, K2 ) - s[ 0 ];   O( 12 ) += W( temp, 0 );   O( 17 ) += -W( temp, 5 );   // 1   temp =   MT( 0, K4 ) + MT( 1, K1 ) - s[ 0 ];   O( 13 ) += W( temp, 1 );   O( 16 ) += -W( temp, 4 );   // 2   temp =   M( 0, K5 ) + M( 2, K3 ) - M( 3, K2 ) - M( 5, K0 ) - s[ 1 ];   O( 14 ) += W( temp, 2 );   O( 15 ) += -W( temp, 3 );   // 3   // 3+3   temp = - M( 0, K2 ) + M( 2, K0 ) + M( 3, K5 ) - M( 5, K3 ) + s[ 1 ];   prev[ 0 ] = W( temp, 6 );   prev[ 5 ] = W( temp, 11 );   // 4+3   temp = - MT( 0, K1 ) + MT( 1, K4 ) - s[ 1 ];   prev[ 1 ] = W( temp, 7 );   prev[ 4 ] = W( temp, 10 );   // 5+3   temp = - M( 0, K0 ) - M( 2, K2 ) - M( 3, K3 ) - M( 5, K5 ) - s[ 0 ];   prev[ 2 ] = W( temp, 8 );   prev[ 3 ] = W( temp, 9 );// Step 3   x++;   s[ 0 ] = M( 1, K1 ) + M( 4, K4 );   s[ 1 ] = M( 1, K4 ) - M( 4, K1 );   t[ 0 ] =  x[0*3] - x[3*3];   t[ 1 ] =  x[2*3] + x[5*3];   // 0   temp =   M( 0, K3 ) - M( 2, K5 ) + M( 3, K0 ) - M( 5, K2 ) - s[ 0 ];   prev[ 0 ] += W( temp, 0 );   prev[ 5 ] += -W( temp, 5 );   // 1   temp =   MT( 0, K4 ) + MT( 1, K1 ) - s[ 0 ];   prev[ 1 ] += W( temp, 1 );   prev[ 4 ] += -W( temp, 4 );   // 2   temp =   M( 0, K5 ) + M( 2, K3 ) - M( 3, K2 ) - M( 5, K0 ) - s[ 1 ];   prev[ 2 ] += W( temp, 2 );   prev[ 3 ] += -W( temp, 3 );   // 3   // 3+3   temp = - M( 0, K2 ) + M( 2, K0 ) + M( 3, K5 ) - M( 5, K3 ) + s[ 1 ];   prev[ 6 ] = W( temp, 6 );   prev[ 11 ] = W( temp, 11 );   // 4+3   temp = - MT( 0, K1 ) + MT( 1, K4 ) - s[ 1 ];   prev[ 7 ] = W( temp, 7 );   prev[ 10 ] = W( temp, 10 );   // 5+3   temp = - M( 0, K0 ) - M( 2, K2 ) - M( 3, K3 ) - M( 5, K5 ) - s[ 0 ];   prev[ 8 ] = W( temp, 8 );   prev[ 9 ] = W( temp, 9 );   prev[ 12 ] = prev[ 13 ] = prev[ 14 ] =   prev[ 15 ] = prev[ 16 ] = prev[ 17 ] = 0;   return 0;#undef O#undef set_k#undef W#undef MT#undef M}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*/{#ifndef USE_IMDCT_TABLE   static WIN_TYPE win[ 2 ][ 4 ][ 36 ];#endif   static BOOL init = FALSE;   register MPEGIMDCT_BLOCK_TYPE *prev;   INT16 sb;   INT16 bt;#ifdef IMDCT_TABLE_GEN   static FILE *fdct_out;   int i, j;#endif   if( !init ) {      INT16 i, j;#ifdef IMDCT_INT#if !defined(USE_IMDCT_TABLE) || defined(IMDCT_TABLE_GEN)      printf("Generating table values\n");      // Block type 0      for( i=0; i<36; i++ ) win[0][0][i] = sin( PI/36 * (i+0.5) ) * (1<<WIN_BITS);      // Block type 1      for( i=0;  i<18; i++ ) win[0][1][i] = sin( PI/36 * (i+0.5) ) * (1<<WIN_BITS);      for( i=18; i<24; i++ ) win[0][1][i] = 1<<WIN_BITS;      for( i=24; i<30; i++ ) win[0][1][i] = sin( PI/12 * (i+0.5-18) ) * (1<<WIN_BITS);      for( i=30; i<36; i++ ) win[0][1][i] = 0;      // Block type 3      for( i=0;  i<6;  i++ ) win[0][3][i] = 0.0;      for( i=6;  i<12; i++ ) win[0][3][i] = sin( PI/12 * (i+0.5-6) ) * (1<<WIN_BITS);      for( i=12; i<18; i++ ) win[0][3][i] = 1<<WIN_BITS;      for( i=18; i<36; i++ ) win[0][3][i] = sin( PI/36 * (i+0.5) ) * (1<<WIN_BITS);      // Block type 2      for( i=0;  i<12; i++) win[0][2][i] = sin( PI/12 * (i+0.5) ) * (1<<WIN_BITS);      for( i=12; i<36; i++) win[0][2][i] = 0;      for(j=0; j<4; j++) {         for(i=0;i<36;i+=2) win[1][j][i] = +win[0][j][i];         for(i=1;i<36;i+=2) win[1][j][i] = -win[0][j][i];      }#endif //if ~defined(USE_IMDCT_TABLE) || defined(IMDCT_TABLE_GEN)#else       // Block type 0      for( i=0; i<36; i++ ) win[0][0][i] = sin( PI/36 * (i+0.5) );      // Block type 1      for( i=0;  i<18; i++ ) win[0][1][i] = sin( PI/36 * (i+0.5) );      for( i=18; i<24; i++ ) win[0][1][i] = 1.0;      for( i=24; i<30; i++ ) win[0][1][i] = sin( PI/12 * (i+0.5-18) );      for( i=30; i<36; i++ ) win[0][1][i] = 0.0;      // Block type 3      for( i=0;  i<6;  i++ ) win[0][3][i] = 0.0;      for( i=6;  i<12; i++ ) win[0][3][i] = sin( PI/12 * (i+0.5-6) );      for( i=12; i<18; i++ ) win[0][3][i] = 1.0;      for( i=18; i<36; i++ ) win[0][3][i] = sin( PI/36 * (i+0.5) );      // Block type 2      for( i=0;  i<12; i++) win[0][2][i] = sin( PI/12 * (i+0.5) ) ;      for( i=12; i<36; i++) win[0][2][i] = 0.0;      for(j=0; j<4; j++) {         for(i=0;i<36;i+=2) win[1][j][i] = +win[0][j][i];         for(i=1;i<36;i+=2) win[1][j][i] = -win[0][j][i];      }#endif //#if IMDCT_INT#ifdef IMDCT_TABLE_GEN      fdct_out = fopen("imdct.out", "w");      fprintf(fdct_out,"static short win[2][4][36] =\n{\n");      fprintf(fdct_out,"  /* Start of table */\n  {\n", j);      for(j=0; j<4; j++) {	fprintf(fdct_out,"   /* Start of row %d */\n    {\n", j);	for(i=0; i < 32; i = i + 4) {	  fprintf(fdct_out,"      %d, %d, %d, %d, \n",		win[0][j][i], win[0][j][i+1], win[0][j][i+2], win[0][j][i+3]);	}	// finish row, no comma at end	fprintf(fdct_out,"      %d, %d, %d, %d \n",		win[0][j][i], win[0][j][i+1], win[0][j][i+2], win[0][j][i+3]);	fprintf(fdct_out,"    }, /* end of row %d */\n", j);      }      fprintf(fdct_out,"  },\n /* Start of second half of table */\n  {\n", j);      for(j=0; j<4; j++) {	fprintf(fdct_out,"    /* Start of row %d */\n    {\n", j);	for(i=0; i < 32; i = i + 4) {	  fprintf(fdct_out,"      %d, %d, %d, %d, \n",		win[1][j][i], win[1][j][i+1], win[1][j][i+2], win[1][j][i+3]);	}	// finish row, no comma at end	fprintf(fdct_out,"      %d, %d, %d, %d \n",		win[1][j][i], win[1][j][i+1], win[1][j][i+2], win[1][j][i+3]);	fprintf(fdct_out,"    }, /* end of row %d */\n", j);      }      fprintf(fdct_out,"  }\n/* End of second half of table */\n};\n", j);      fclose(fdct_out);#endif      init = TRUE;   }#define O( i ) out[ i*32 ]   prev = mpegimdct->prevblk[ ch ];   for( sb=0; sb<sb_max; sb++ ) {      bt = ((mixed) && (sb < 2)) ? 0 : block_type;      if( bt == 2 ) { // Short block         imdct_s( in, out, prev, &win[ sb & 1 ][ bt ][ 0 ] );      }      else {         imdct_l( in, out, prev, &win[ sb & 1 ][ bt ][ 0 ] );      }      in += 18;      out++;      prev += 18;   }   for( ; sb<MPA_SBLIMIT; sb++ ) {      // overlap addition with 0      O( 0 ) = *prev; *prev++ = 0; O( 1 ) = *prev; *prev++ = 0; O( 2 ) = *prev; *prev++ = 0;      O( 3 ) = *prev; *prev++ = 0; O( 4 ) = *prev; *prev++ = 0; O( 5 ) = *prev; *prev++ = 0;      O( 6 ) = *prev; *prev++ = 0; O( 7 ) = *prev; *prev++ = 0; O( 8 ) = *prev; *prev++ = 0;      O( 9 ) = *prev; *prev++ = 0; O( 10 ) = *prev; *prev++ = 0; O( 11 ) = *prev; *prev++ = 0;      O( 12 ) = *prev; *prev++ = 0; O( 13 ) = *prev; *prev++ = 0; O( 14 ) = *prev; *prev++ = 0;      O( 15 ) = *prev; *prev++ = 0; O( 16 ) = *prev; *prev++ = 0; O( 17 ) = *prev; *prev++ = 0;      out++;   }MPEGAUD_CHECK_DEMO;   return 0;} /* MPEGIMDCT_hybrid */#endif // NOT NEW_IMDCT#endif // NOT ASM_OPTIMIZEint MPEGIMDCT_reset( MPEGIMDCT *mpegimdct )/*-----------------------------------------   Reset the MPEGIMDCT module*/{   if( !mpegimdct ) return -1;   // Reset previous block buffer   memset( mpegimdct->prevblk, 0, MPA_MAX_CHANNELS * MPA_GRANULE_SIZE * sizeof( MPEGIMDCT_BLOCK_TYPE ) );   return 0;} /* MPEGIMDCT_reset */void MPEGIMDCT_close( MPEGIMDCT *mpegimdct )/*------------------------------------------   Close the MPEGIMDCT module*/{   if( !mpegimdct ) return;   free( mpegimdct );} /* MPEGIMDCT_close */MPEGIMDCT *MPEGIMDCT_open( void )/*-------------------------------   Open the MPEGIMDCT module*/{   MPEGIMDCT *mpegimdct;   mpegimdct = (MPEGIMDCT *)malloc( sizeof(MPEGIMDCT) );   if( !mpegimdct ) return NULL;   (void)MPEGIMDCT_reset( mpegimdct );   return mpegimdct;} /* MPEGIMDCT_open */

⌨️ 快捷键说明

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