@ -792,11 +792,9 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
{
int start = 0 , i , w , w2 , g ;
int destbits = avctx - > bit_rate * 1024.0 / avctx - > sample_rate / avctx - > channels * ( lambda / 120.f ) ;
const float freq_mult = avctx - > sample_rate / ( 1024.0f / sce - > ics . num_windows ) / 2.0f ;
float dists [ 128 ] = { 0 } , uplims [ 128 ] = { 0 } ;
float maxvals [ 128 ] ;
int noise_sf [ 128 ] = { 0 } ;
int fflag , minscaler , minscaler_n ;
int fflag , minscaler ;
int its = 0 ;
int allz = 0 ;
float minthr = INFINITY ;
@ -807,13 +805,12 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
//XXX: some heuristic to determine initial quantizers will reduce search time
//determine zero bands and upper limits
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 + + ) {
int nz = 0 ;
float uplim = 0.0f , energy = 0.0f ;
for ( w2 = 0 ; w2 < sce - > ics . group_len [ w ] ; w2 + + ) {
FFPsyBand * band = & s - > psy . ch [ s - > cur_channel ] . psy_bands [ ( w + w2 ) * 16 + g ] ;
uplim + = band - > threshold ;
uplim + = band - > threshold ;
energy + = band - > energy ;
if ( band - > energy < = band - > threshold | | band - > threshold = = 0.0f ) {
sce - > zeroes [ ( w + w2 ) * 16 + g ] = 1 ;
@ -822,18 +819,10 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
nz = 1 ;
}
uplims [ w * 16 + g ] = uplim * 512 ;
if ( s - > options . pns & & start * freq_mult > NOISE_LOW_LIMIT & & energy < uplim * 1.2f ) {
noise_sf [ w * 16 + g ] = av_clip ( 4 + FFMIN ( log2f ( energy ) * 2 , 255 ) , - 100 , 155 ) ;
sce - > band_type [ w * 16 + g ] = NOISE_BT ;
nz = 1 ;
} else { /** Band type will be determined by the twoloop algorithm */
sce - > band_type [ w * 16 + g ] = 0 ;
}
sce - > zeroes [ w * 16 + g ] = ! nz ;
if ( nz )
minthr = FFMIN ( minthr , uplim ) ;
allz | = nz ;
start + = sce - > ics . swb_sizes [ g ] ;
}
}
for ( w = 0 ; w < sce - > ics . num_windows ; w + = sce - > ics . group_len [ w ] ) {
@ -864,7 +853,6 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
do {
int tbits , qstep ;
minscaler = sce - > sf_idx [ 0 ] ;
minscaler_n = sce - > sf_idx [ 0 ] ;
//inner loop - quantize spectrum to fit into given number of bits
qstep = its ? 1 : 32 ;
do {
@ -879,11 +867,7 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
int cb ;
float dist = 0.0f ;
if ( sce - > band_type [ w * 16 + g ] = = NOISE_BT ) {
minscaler_n = FFMIN ( minscaler_n , noise_sf [ w * 16 + g ] ) ;
start + = sce - > ics . swb_sizes [ g ] ;
continue ;
} else if ( sce - > zeroes [ w * 16 + g ] | | sce - > sf_idx [ w * 16 + g ] > = 218 ) {
if ( sce - > zeroes [ w * 16 + g ] | | sce - > sf_idx [ w * 16 + g ] > = 218 ) {
start + = sce - > ics . swb_sizes [ g ] ;
continue ;
}
@ -927,16 +911,9 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
fflag = 0 ;
minscaler = av_clip ( minscaler , 60 , 255 - SCALE_MAX_DIFF ) ;
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 - > band_type [ w * 16 + g ] = = NOISE_BT )
sce - > sf_idx [ w * 16 + g ] = av_clip ( noise_sf [ w * 16 + g ] , minscaler_n , minscaler_n + SCALE_MAX_DIFF ) ;
for ( w = 0 ; w < sce - > ics . num_windows ; w + = sce - > ics . group_len [ w ] ) {
for ( g = 0 ; g < sce - > ics . num_swb ; g + + ) {
int prevsc = sce - > sf_idx [ w * 16 + g ] ;
if ( sce - > band_type [ w * 16 + g ] = = NOISE_BT )
continue ;
if ( dists [ w * 16 + g ] > uplims [ w * 16 + g ] & & sce - > sf_idx [ w * 16 + g ] > 60 ) {
if ( find_min_book ( maxvals [ w * 16 + g ] , sce - > sf_idx [ w * 16 + g ] - 1 ) )
sce - > sf_idx [ w * 16 + g ] - - ;