@ -259,7 +259,9 @@ static int decode_residuals(FLACContext *s, int channel, int pred_order)
static int decode_subframe_fixed ( FLACContext * s , int channel , int pred_order )
{
int i ;
const int blocksize = s - > blocksize ;
int32_t * decoded = s - > decoded [ channel ] ;
int a , b , c , d , i ;
// av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
@ -268,38 +270,37 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
for ( i = 0 ; i < pred_order ; i + + )
{
s - > decoded [ channel ] [ i ] = get_sbits ( & s - > gb , s - > curr_bps ) ;
decoded [ i ] = get_sbits ( & s - > gb , s - > curr_bps ) ;
// av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]);
}
if ( decode_residuals ( s , channel , pred_order ) < 0 )
return - 1 ;
a = decoded [ pred_order - 1 ] ;
b = a - decoded [ pred_order - 2 ] ;
c = b - decoded [ pred_order - 2 ] + decoded [ pred_order - 3 ] ;
d = c - decoded [ pred_order - 2 ] + 2 * decoded [ pred_order - 3 ] - decoded [ pred_order - 4 ] ;
switch ( pred_order )
{
case 0 :
break ;
case 1 :
for ( i = pred_order ; i < s - > blocksize ; i + + )
s - > decoded [ channel ] [ i ] + = s - > decoded [ channel ] [ i - 1 ] ;
for ( i = pred_order ; i < blocksize ; i + + )
decoded [ i ] = a + = decoded [ i ] ;
break ;
case 2 :
for ( i = pred_order ; i < s - > blocksize ; i + + )
s - > decoded [ channel ] [ i ] + = 2 * s - > decoded [ channel ] [ i - 1 ]
- s - > decoded [ channel ] [ i - 2 ] ;
for ( i = pred_order ; i < blocksize ; i + + )
decoded [ i ] = a + = b + = decoded [ i ] ;
break ;
case 3 :
for ( i = pred_order ; i < s - > blocksize ; i + + )
s - > decoded [ channel ] [ i ] + = 3 * s - > decoded [ channel ] [ i - 1 ]
- 3 * s - > decoded [ channel ] [ i - 2 ]
+ s - > decoded [ channel ] [ i - 3 ] ;
for ( i = pred_order ; i < blocksize ; i + + )
decoded [ i ] = a + = b + = c + = decoded [ i ] ;
break ;
case 4 :
for ( i = pred_order ; i < s - > blocksize ; i + + )
s - > decoded [ channel ] [ i ] + = 4 * s - > decoded [ channel ] [ i - 1 ]
- 6 * s - > decoded [ channel ] [ i - 2 ]
+ 4 * s - > decoded [ channel ] [ i - 3 ]
- s - > decoded [ channel ] [ i - 4 ] ;
for ( i = pred_order ; i < blocksize ; i + + )
decoded [ i ] = a + = b + = c + = d + = decoded [ i ] ;
break ;
default :
av_log ( s - > avctx , AV_LOG_ERROR , " illegal pred order %d \n " , pred_order ) ;