@ -129,13 +129,24 @@ av_cold void ff_aac_sbr_init(void)
ff_ps_init ( ) ;
}
/** Places SBR in pure upsampling mode. */
static void sbr_turnoff ( SpectralBandReplication * sbr ) {
sbr - > start = 0 ;
// Init defults used in pure upsampling mode
sbr - > kx [ 1 ] = 32 ; //Typo in spec, kx' inits to 32
sbr - > m [ 1 ] = 0 ;
// Reset values for first SBR header
sbr - > data [ 0 ] . e_a [ 1 ] = sbr - > data [ 1 ] . e_a [ 1 ] = - 1 ;
memset ( & sbr - > spectrum_params , - 1 , sizeof ( SpectrumParameters ) ) ;
}
av_cold void ff_aac_sbr_ctx_init ( AACContext * ac , SpectralBandReplication * sbr )
{
float mdct_scale ;
if ( sbr - > mdct . mdct_bits )
return ;
sbr - > kx [ 0 ] = sbr - > kx [ 1 ] = 32 ; //Typo in spec, kx' inits to 32
sbr - > data [ 0 ] . e_a [ 1 ] = sbr - > data [ 1 ] . e_a [ 1 ] = - 1 ;
sbr - > kx [ 0 ] = sbr - > kx [ 1 ] ;
sbr_turnoff ( sbr ) ;
sbr - > data [ 0 ] . synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - ( 1280 - 128 ) ;
sbr - > data [ 1 ] . synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - ( 1280 - 128 ) ;
/* SBR requires samples to be scaled to +/-32768.0 to work correctly.
@ -998,18 +1009,18 @@ static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr,
if ( id_aac = = TYPE_SCE | | id_aac = = TYPE_CCE ) {
if ( read_sbr_single_channel_element ( ac , sbr , gb ) ) {
sbr - > start = 0 ;
sbr_turnoff ( sbr ) ;
return get_bits_count ( gb ) - cnt ;
}
} else if ( id_aac = = TYPE_CPE ) {
if ( read_sbr_channel_pair_element ( ac , sbr , gb ) ) {
sbr - > start = 0 ;
sbr_turnoff ( sbr ) ;
return get_bits_count ( gb ) - cnt ;
}
} else {
av_log ( ac - > avctx , AV_LOG_ERROR ,
" Invalid bitstream - cannot apply SBR to element type %d \n " , id_aac ) ;
sbr - > start = 0 ;
sbr_turnoff ( sbr ) ;
return get_bits_count ( gb ) - cnt ;
}
if ( get_bits1 ( gb ) ) { // bs_extended_data
@ -1041,7 +1052,7 @@ static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr)
if ( err < 0 ) {
av_log ( ac - > avctx , AV_LOG_ERROR ,
" SBR reset failed. Switching SBR to pure upsampling mode. \n " ) ;
sbr - > start = 0 ;
sbr_turnoff ( sbr ) ;
}
}
@ -1076,6 +1087,7 @@ int ff_decode_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
//Save some state from the previous frame.
sbr - > kx [ 0 ] = sbr - > kx [ 1 ] ;
sbr - > m [ 0 ] = sbr - > m [ 1 ] ;
sbr - > kx_and_m_pushed = 1 ;
num_sbr_bits + + ;
if ( get_bits1 ( gb ) ) // bs_header_flag
@ -1391,7 +1403,7 @@ static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][38][64],
/** High Frequency Adjustment (14496-3 sp04 p217) and Mapping
* ( 14496 - 3 sp04 p217 )
*/
static void sbr_mapping ( AACContext * ac , SpectralBandReplication * sbr ,
static int sbr_mapping ( AACContext * ac , SpectralBandReplication * sbr ,
SBRData * ch_data , int e_a [ 2 ] )
{
int e , i , m ;
@ -1402,7 +1414,12 @@ static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr,
uint16_t * table = ch_data - > bs_freq_res [ e + 1 ] ? sbr - > f_tablehigh : sbr - > f_tablelow ;
int k ;
av_assert0 ( sbr - > kx [ 1 ] < = table [ 0 ] ) ;
if ( sbr - > kx [ 1 ] ! = table [ 0 ] ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " kx != f_table{high,low}[0]. "
" Derived frequency tables were not regenerated. \n " ) ;
sbr_turnoff ( sbr ) ;
return AVERROR_BUG ;
}
for ( i = 0 ; i < ilim ; i + + )
for ( m = table [ i ] ; m < table [ i + 1 ] ; m + + )
sbr - > e_origmapped [ e ] [ m - sbr - > kx [ 1 ] ] = ch_data - > env_facs [ e + 1 ] [ i ] ;
@ -1437,6 +1454,7 @@ static void sbr_mapping(AACContext *ac, SpectralBandReplication *sbr,
}
memcpy ( ch_data - > s_indexmapped [ 0 ] , ch_data - > s_indexmapped [ ch_data - > bs_num_env ] , sizeof ( ch_data - > s_indexmapped [ 0 ] ) ) ;
return 0 ;
}
/// Estimation of current envelope (14496-3 sp04 p218)
@ -1637,6 +1655,14 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
int downsampled = ac - > m4ac . ext_sample_rate < sbr - > sample_rate ;
int ch ;
int nch = ( id_aac = = TYPE_CPE ) ? 2 : 1 ;
int err ;
if ( ! sbr - > kx_and_m_pushed ) {
sbr - > kx [ 0 ] = sbr - > kx [ 1 ] ;
sbr - > m [ 0 ] = sbr - > m [ 1 ] ;
} else {
sbr - > kx_and_m_pushed = 0 ;
}
if ( sbr - > start ) {
sbr_dequant ( sbr , id_aac ) ;
@ -1647,6 +1673,7 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
( float * ) sbr - > qmf_filter_scratch ,
sbr - > data [ ch ] . W ) ;
sbr_lf_gen ( ac , sbr , sbr - > X_low , sbr - > data [ ch ] . W ) ;
sbr - > data [ ch ] . Ypos ^ = 1 ;
if ( sbr - > start ) {
sbr_hf_inverse_filter ( & sbr - > dsp , sbr - > alpha0 , sbr - > alpha1 , sbr - > X_low , sbr - > k [ 0 ] ) ;
sbr_chirp ( sbr , & sbr - > data [ ch ] ) ;
@ -1655,13 +1682,14 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
sbr - > data [ ch ] . bs_num_env ) ;
// hf_adj
sbr_mapping ( ac , sbr , & sbr - > data [ ch ] , sbr - > data [ ch ] . e_a ) ;
sbr_env_estimate ( sbr - > e_curr , sbr - > X_high , sbr , & sbr - > data [ ch ] ) ;
sbr_gain_calc ( ac , sbr , & sbr - > data [ ch ] , sbr - > data [ ch ] . e_a ) ;
sbr - > data [ ch ] . Ypos ^ = 1 ;
sbr_hf_assemble ( sbr - > data [ ch ] . Y [ sbr - > data [ ch ] . Ypos ] ,
sbr - > X_high , sbr , & sbr - > data [ ch ] ,
sbr - > data [ ch ] . e_a ) ;
err = sbr_mapping ( ac , sbr , & sbr - > data [ ch ] , sbr - > data [ ch ] . e_a ) ;
if ( ! err ) {
sbr_env_estimate ( sbr - > e_curr , sbr - > X_high , sbr , & sbr - > data [ ch ] ) ;
sbr_gain_calc ( ac , sbr , & sbr - > data [ ch ] , sbr - > data [ ch ] . e_a ) ;
sbr_hf_assemble ( sbr - > data [ ch ] . Y [ sbr - > data [ ch ] . Ypos ] ,
sbr - > X_high , sbr , & sbr - > data [ ch ] ,
sbr - > data [ ch ] . e_a ) ;
}
}
/* synthesis */