@ -876,36 +876,39 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne
for ( g = 0 ; g < sce - > ics . num_swb ; g + + ) {
int noise_sfi , try_pns = 0 ;
float dist1 = 0.0f , dist2 = 0.0f , noise_amp ;
float energy = 0.0f , threshold = 0.0f , spread = 0.0f ;
float pns_energy = 0.0f , energy_ratio , dist_thresh ;
float sfb_energy = 0.0f , threshold = 0.0f , spread = 0.0f ;
float freq_boost = FFMAX ( 0.88f * start * freq_mult / NOISE_LOW_LIMIT , 1.0f ) ;
if ( start * freq_mult < NOISE_LOW_LIMIT ) {
start + = sce - > ics . swb_sizes [ g ] ;
continue ;
} else {
dist_thresh = FFMIN ( 0.008f * ( NOISE_LOW_LIMIT / start * freq_mult ) , 1.11f ) ;
}
for ( w2 = 0 ; w2 < sce - > ics . group_len [ w ] ; w2 + + ) {
band = & s - > psy . ch [ s - > cur_channel ] . psy_bands [ ( w + w2 ) * 16 + g ] ;
energy + = band - > energy ;
spread + = band - > spread ;
threshold + = band - > threshold ;
sfb_ energy + = band - > energy ;
spread + = band - > spread ;
threshold + = band - > threshold ;
}
sce - > pns_ener [ w * 16 + g ] = energy ;
if ( sce - > zeroes [ w * 16 + g ] ) {
try_pns = 1 ;
} else if ( energy < threshold ) {
} else if ( sfb_ energy < threshold * freq_boost ) {
try_pns = 1 ;
} else if ( spread > spread_threshold ) {
try_pns = 0 ;
} else if ( energy < threshold * thr_mult ) {
} else if ( sfb_ energy < threshold * thr_mult * freq_boos t ) {
try_pns = 1 ;
}
if ( ! try_pns | | ! energy ) {
if ( ! try_pns | | ! sfb_ energy) {
start + = sce - > ics . swb_sizes [ g ] ;
continue ;
}
noise_sfi = av_clip ( roundf ( log2f ( energy ) * 2 ) , - 100 , 155 ) ; /* Quantize */
noise_amp = - ff_aac_pow2sf_tab [ noise_sfi + POW_SF2_ZERO ] ; /* Dequantize */
noise_sfi = av_clip ( roundf ( log2f ( sfb_ energy) * 2 ) , - 100 , 155 ) ; /* Quantize */
noise_amp = - ff_aac_pow2sf_tab [ noise_sfi + POW_SF2_ZERO ] ; /* Dequantize */
for ( w2 = 0 ; w2 < sce - > ics . group_len [ w ] ; w2 + + ) {
float band_energy , scale ;
band = & s - > psy . ch [ s - > cur_channel + 0 ] . psy_bands [ ( w + w2 ) * 16 + g ] ;
@ -914,6 +917,7 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne
band_energy = s - > fdsp - > scalarproduct_float ( PNS , PNS , sce - > ics . swb_sizes [ g ] ) ;
scale = noise_amp / sqrtf ( band_energy ) ;
s - > fdsp - > vector_fmul_scalar ( PNS , PNS , scale , sce - > ics . swb_sizes [ g ] ) ;
pns_energy + = s - > fdsp - > scalarproduct_float ( PNS , PNS , sce - > ics . swb_sizes [ g ] ) ;
abs_pow34_v ( NOR34 , & sce - > coeffs [ start + ( w + w2 ) * 128 ] , sce - > ics . swb_sizes [ g ] ) ;
abs_pow34_v ( PNS34 , PNS , sce - > ics . swb_sizes [ g ] ) ;
dist1 + = quantize_band_cost ( s , & sce - > coeffs [ start + ( w + w2 ) * 128 ] ,
@ -929,7 +933,9 @@ static void search_for_pns(AACEncContext *s, AVCodecContext *avctx, SingleChanne
NOISE_BT ,
lambda / band - > threshold , INFINITY , NULL , 0 ) ;
}
if ( dist2 < dist1 ) {
energy_ratio = sfb_energy / pns_energy ; /* Compensates for quantization error */
sce - > pns_ener [ w * 16 + g ] = energy_ratio * sfb_energy ;
if ( energy_ratio > 0.80f & & energy_ratio < 1.20f & & dist1 / dist2 > dist_thresh ) {
sce - > band_type [ w * 16 + g ] = NOISE_BT ;
sce - > zeroes [ w * 16 + g ] = 0 ;
if ( sce - > band_type [ w * 16 + g - 1 ] ! = NOISE_BT & & /* Prevent holes */