@ -76,6 +76,7 @@ typedef struct WavpackContext {
int terms ;
Decorr decorr [ MAX_TERMS ] ;
int zero , one , zeroes ;
int and , or , shift ;
} WavpackContext ;
// exponent table copied from WavPack source
@ -235,7 +236,7 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
{
int i , j , count = 0 ;
int last , t ;
int A , B , L , L2 , R , R2 ;
int A , B , L , L2 , R , R2 , bit ;
int pos = 0 ;
uint32_t crc = 0xFFFFFFFF ;
@ -299,9 +300,10 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
if ( s - > joint )
L + = ( R - = ( L > > 1 ) ) ;
crc = ( crc * 3 + L ) * 3 + R ;
* dst + + = L ;
* dst + + = R ;
bit = ( L & s - > and ) | s - > or ;
* dst + + = ( ( L + bit ) < < s - > shift ) - bit ;
bit = ( R & s - > and ) | s - > or ;
* dst + + = ( ( R + bit ) < < s - > shift ) - bit ;
count + + ;
} while ( ! last & & count < s - > samples ) ;
@ -316,7 +318,7 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
{
int i , j , count = 0 ;
int last , t ;
int A , S , T ;
int A , S , T , bit ;
int pos = 0 ;
uint32_t crc = 0xFFFFFFFF ;
@ -344,7 +346,8 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
}
pos = ( pos + 1 ) & 7 ;
crc = crc * 3 + S ;
* dst + + = S ;
bit = ( S & s - > and ) | s - > or ;
* dst + + = ( ( S + bit ) < < s - > shift ) - bit ;
count + + ;
} while ( ! last & & count < s - > samples ) ;
@ -389,6 +392,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
}
memset ( s - > decorr , 0 , MAX_TERMS * sizeof ( Decorr ) ) ;
s - > and = s - > or = s - > shift = 0 ;
s - > samples = AV_RL32 ( buf ) ; buf + = 4 ;
if ( ! s - > samples ) {
@ -509,6 +513,23 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
}
got_entropy = 1 ;
break ;
case WP_ID_INT32INFO :
if ( size ! = 4 | | * buf ) {
av_log ( avctx , AV_LOG_ERROR , " Invalid INT32INFO, size = %i, sent_bits = %i \n " , size , * buf ) ;
buf + = ssize ;
continue ;
}
if ( buf [ 1 ] )
s - > shift = buf [ 1 ] ;
else if ( buf [ 2 ] ) {
s - > and = s - > or = 1 ;
s - > shift = buf [ 2 ] ;
} else if ( buf [ 3 ] ) {
s - > and = 1 ;
s - > shift = buf [ 3 ] ;
}
buf + = 4 ;
break ;
case WP_ID_DATA :
init_get_bits ( & s - > gb , buf , size * 8 ) ;
s - > data_size = size * 8 ;