📄 mpegimdc.c
字号:
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 + -