@ -115,6 +115,8 @@ typedef struct WMADecodeContext {
float max_exponent [ MAX_CHANNELS ] ;
float max_exponent [ MAX_CHANNELS ] ;
int16_t coefs1 [ MAX_CHANNELS ] [ BLOCK_MAX_SIZE ] ;
int16_t coefs1 [ MAX_CHANNELS ] [ BLOCK_MAX_SIZE ] ;
DECLARE_ALIGNED_16 ( float , coefs [ MAX_CHANNELS ] [ BLOCK_MAX_SIZE ] ) ;
DECLARE_ALIGNED_16 ( float , coefs [ MAX_CHANNELS ] [ BLOCK_MAX_SIZE ] ) ;
DECLARE_ALIGNED_16 ( FFTSample , output [ BLOCK_MAX_SIZE * 2 ] ) ;
DECLARE_ALIGNED_16 ( float , window [ BLOCK_MAX_SIZE * 2 ] ) ;
MDCTContext mdct_ctx [ BLOCK_NB_SIZES ] ;
MDCTContext mdct_ctx [ BLOCK_NB_SIZES ] ;
float * windows [ BLOCK_NB_SIZES ] ;
float * windows [ BLOCK_NB_SIZES ] ;
DECLARE_ALIGNED_16 ( FFTSample , mdct_tmp [ BLOCK_MAX_SIZE ] ) ; /* temporary storage for imdct */
DECLARE_ALIGNED_16 ( FFTSample , mdct_tmp [ BLOCK_MAX_SIZE ] ) ; /* temporary storage for imdct */
@ -717,7 +719,6 @@ static int wma_decode_block(WMADecodeContext *s)
{
{
int n , v , a , ch , code , bsize ;
int n , v , a , ch , code , bsize ;
int coef_nb_bits , total_gain , parse_exponents ;
int coef_nb_bits , total_gain , parse_exponents ;
DECLARE_ALIGNED_16 ( float , window [ BLOCK_MAX_SIZE * 2 ] ) ;
int nb_coefs [ MAX_CHANNELS ] ;
int nb_coefs [ MAX_CHANNELS ] ;
float mdct_norm ;
float mdct_norm ;
@ -1072,7 +1073,7 @@ static int wma_decode_block(WMADecodeContext *s)
next_block_len = 1 < < s - > next_block_len_bits ;
next_block_len = 1 < < s - > next_block_len_bits ;
/* right part */
/* right part */
wptr = window + block_len ;
wptr = s - > window + block_len ;
if ( block_len < = next_block_len ) {
if ( block_len < = next_block_len ) {
for ( i = 0 ; i < block_len ; i + + )
for ( i = 0 ; i < block_len ; i + + )
* wptr + + = s - > windows [ bsize ] [ i ] ;
* wptr + + = s - > windows [ bsize ] [ i ] ;
@ -1088,7 +1089,7 @@ static int wma_decode_block(WMADecodeContext *s)
}
}
/* left part */
/* left part */
wptr = window + block_len ;
wptr = s - > window + block_len ;
if ( block_len < = prev_block_len ) {
if ( block_len < = prev_block_len ) {
for ( i = 0 ; i < block_len ; i + + )
for ( i = 0 ; i < block_len ; i + + )
* - - wptr = s - > windows [ bsize ] [ i ] ;
* - - wptr = s - > windows [ bsize ] [ i ] ;
@ -1107,14 +1108,13 @@ static int wma_decode_block(WMADecodeContext *s)
for ( ch = 0 ; ch < s - > nb_channels ; ch + + ) {
for ( ch = 0 ; ch < s - > nb_channels ; ch + + ) {
if ( s - > channel_coded [ ch ] ) {
if ( s - > channel_coded [ ch ] ) {
DECLARE_ALIGNED_16 ( FFTSample , output [ BLOCK_MAX_SIZE * 2 ] ) ;
float * ptr ;
float * ptr ;
int n4 , index , n ;
int n4 , index , n ;
n = s - > block_len ;
n = s - > block_len ;
n4 = s - > block_len / 2 ;
n4 = s - > block_len / 2 ;
s - > mdct_ctx [ bsize ] . fft . imdct_calc ( & s - > mdct_ctx [ bsize ] ,
s - > mdct_ctx [ bsize ] . fft . imdct_calc ( & s - > mdct_ctx [ bsize ] ,
output , s - > coefs [ ch ] , s - > mdct_tmp ) ;
s - > output , s - > coefs [ ch ] , s - > mdct_tmp ) ;
/* XXX: optimize all that by build the window and
/* XXX: optimize all that by build the window and
multipying / adding at the same time */
multipying / adding at the same time */
@ -1122,13 +1122,13 @@ static int wma_decode_block(WMADecodeContext *s)
/* multiply by the window and add in the frame */
/* multiply by the window and add in the frame */
index = ( s - > frame_len / 2 ) + s - > block_pos - n4 ;
index = ( s - > frame_len / 2 ) + s - > block_pos - n4 ;
ptr = & s - > frame_out [ ch ] [ index ] ;
ptr = & s - > frame_out [ ch ] [ index ] ;
s - > dsp . vector_fmul_add_add ( ptr , window , output , ptr , 0 , 2 * n , 1 ) ;
s - > dsp . vector_fmul_add_add ( ptr , s - > window , s - > output , ptr , 0 , 2 * n , 1 ) ;
/* specific fast case for ms-stereo : add to second
/* specific fast case for ms-stereo : add to second
channel if it is not coded */
channel if it is not coded */
if ( s - > ms_stereo & & ! s - > channel_coded [ 1 ] ) {
if ( s - > ms_stereo & & ! s - > channel_coded [ 1 ] ) {
ptr = & s - > frame_out [ 1 ] [ index ] ;
ptr = & s - > frame_out [ 1 ] [ index ] ;
s - > dsp . vector_fmul_add_add ( ptr , window , output , ptr , 0 , 2 * n , 1 ) ;
s - > dsp . vector_fmul_add_add ( ptr , s - > window , s - > output , ptr , 0 , 2 * n , 1 ) ;
}
}
}
}
}
}