@ -195,23 +195,23 @@ typedef struct TrellisPath {
static void set_special_band_scalefactors ( AACEncContext * s , SingleChannelElement * sce )
{
int w , g , start = 0 ;
int minscaler_n = sce - > sf_idx [ 0 ] , min scaler_i = sce - > sf_idx [ 0 ] ;
int w , g ;
int prevscaler_n = - 255 , prev scaler_i = 0 ;
int bands = 0 ;
for ( w = 0 ; w < sce - > ics . num_windows ; w + = sce - > ics . group_len [ w ] ) {
start = 0 ;
for ( g = 0 ; g < sce - > ics . num_swb ; g + + ) {
if ( sce - > zeroes [ w * 16 + g ] )
continue ;
if ( sce - > band_type [ w * 16 + g ] = = INTENSITY_BT | | sce - > band_type [ w * 16 + g ] = = INTENSITY_BT2 ) {
sce - > sf_idx [ w * 16 + g ] = av_clip ( roundf ( log2f ( sce - > is_ener [ w * 16 + g ] ) * 2 ) , - 155 , 100 ) ;
minscaler_i = FFMIN ( minscaler_i , sce - > sf_idx [ w * 16 + g ] ) ;
bands + + ;
} else if ( sce - > band_type [ w * 16 + g ] = = NOISE_BT ) {
sce - > sf_idx [ w * 16 + g ] = av_clip ( 3 + ceilf ( log2f ( sce - > pns_ener [ w * 16 + g ] ) * 2 ) , - 100 , 155 ) ;
minscaler_n = FFMIN ( minscaler_n , sce - > sf_idx [ w * 16 + g ] ) ;
if ( prevscaler_n = = - 255 )
prevscaler_n = sce - > sf_idx [ w * 16 + g ] ;
bands + + ;
}
start + = sce - > ics . swb_sizes [ g ] ;
}
}
@ -221,10 +221,12 @@ static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement
/* Clip the scalefactor indices */
for ( w = 0 ; w < sce - > ics . num_windows ; w + = sce - > ics . group_len [ w ] ) {
for ( g = 0 ; g < sce - > ics . num_swb ; g + + ) {
if ( sce - > zeroes [ w * 16 + g ] )
continue ;
if ( sce - > band_type [ w * 16 + g ] = = INTENSITY_BT | | sce - > band_type [ w * 16 + g ] = = INTENSITY_BT2 ) {
sce - > sf_idx [ w * 16 + g ] = av_clip ( sce - > sf_idx [ w * 16 + g ] , minscaler_i , minscaler_i + SCALE_MAX_DIFF ) ;
sce - > sf_idx [ w * 16 + g ] = prevscaler_i = av_clip ( sce - > sf_idx [ w * 16 + g ] , prevscaler_i - SCALE_MAX_DIFF , prev scaler_i + SCALE_MAX_DIFF ) ;
} else if ( sce - > band_type [ w * 16 + g ] = = NOISE_BT ) {
sce - > sf_idx [ w * 16 + g ] = av_clip ( sce - > sf_idx [ w * 16 + g ] , minscaler_n , min scaler_n + SCALE_MAX_DIFF ) ;
sce - > sf_idx [ w * 16 + g ] = prevscaler_n = av_clip ( sce - > sf_idx [ w * 16 + g ] , prevscaler_n - SCALE_MAX_DIFF , prev scaler_n + SCALE_MAX_DIFF ) ;
}
}
}