@ -149,13 +149,13 @@ static av_cold int che_configure(AACContext *ac,
ff_aac_sbr_ctx_init ( ac , & ac - > che [ type ] [ id ] - > sbr ) ;
}
if ( type ! = TYPE_CCE ) {
if ( * channels > = MAX_CHANNELS - ( type = = TYPE_CPE | | ( type = = TYPE_SCE & & ac - > m4ac . ps = = 1 ) ) ) {
if ( * channels > = MAX_CHANNELS - ( type = = TYPE_CPE | | ( type = = TYPE_SCE & & ac - > oc [ 1 ] . m4ac . ps = = 1 ) ) ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " Too many channels \n " ) ;
return AVERROR_INVALIDDATA ;
}
ac - > output_data [ ( * channels ) + + ] = ac - > che [ type ] [ id ] - > ch [ 0 ] . ret ;
if ( type = = TYPE_CPE | |
( type = = TYPE_SCE & & ac - > m4ac . ps = = 1 ) ) {
( type = = TYPE_SCE & & ac - > oc [ 1 ] . m4ac . ps = = 1 ) ) {
ac - > output_data [ ( * channels ) + + ] = ac - > che [ type ] [ id ] - > ch [ 1 ] . ret ;
}
}
@ -354,12 +354,39 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
return layout ;
}
/**
* Save current output configuration if and only if it has been locked .
*/
static void push_output_configuration ( AACContext * ac ) {
if ( ac - > oc [ 1 ] . status = = OC_LOCKED ) {
ac - > oc [ 0 ] = ac - > oc [ 1 ] ;
}
ac - > oc [ 1 ] . status = OC_NONE ;
}
/**
* Restore the previous output configuration if and only if the current
* configuration is unlocked .
*/
static void pop_output_configuration ( AACContext * ac ) {
if ( ac - > oc [ 1 ] . status ! = OC_LOCKED ) {
if ( ac - > oc [ 0 ] . status = = OC_LOCKED ) {
ac - > oc [ 1 ] = ac - > oc [ 0 ] ;
ac - > avctx - > channels = ac - > oc [ 1 ] . channels ;
ac - > avctx - > channel_layout = ac - > oc [ 1 ] . channel_layout ;
} else {
ac - > avctx - > channels = 0 ;
ac - > avctx - > channel_layout = 0 ;
}
}
}
/**
* Configure output channel order based on the current program configuration element .
*
* @ return Returns error status . 0 - OK , ! 0 - error
*/
static av_cold int output_configure ( AACContext * ac ,
static int output_configure ( AACContext * ac ,
uint8_t layout_map [ MAX_ELEM_ID * 4 ] [ 3 ] , int tags ,
int channel_config , enum OCStatus oc_type )
{
@ -367,9 +394,9 @@ static av_cold int output_configure(AACContext *ac,
int i , channels = 0 , ret ;
uint64_t layout = 0 ;
if ( ac - > layout_map ! = layout_map ) {
memcpy ( ac - > layout_map , layout_map , tags * sizeof ( layout_map [ 0 ] ) ) ;
ac - > layout_map_tags = tags ;
if ( ac - > oc [ 1 ] . layout_map ! = layout_map ) {
memcpy ( ac - > oc [ 1 ] . layout_map , layout_map , tags * sizeof ( layout_map [ 0 ] ) ) ;
ac - > oc [ 1 ] . layout_map_tags = tags ;
}
// Try to sniff a reasonable channel order, otherwise output the
@ -389,8 +416,9 @@ static av_cold int output_configure(AACContext *ac,
memcpy ( ac - > tag_che_map , ac - > che , 4 * MAX_ELEM_ID * sizeof ( ac - > che [ 0 ] [ 0 ] ) ) ;
if ( layout ) avctx - > channel_layout = layout ;
avctx - > channels = channels ;
ac - > output_configured = oc_type ;
ac - > oc [ 1 ] . channel_layout = layout ;
avctx - > channels = ac - > oc [ 1 ] . channels = channels ;
ac - > oc [ 1 ] . status = oc_type ;
return 0 ;
}
@ -418,7 +446,7 @@ static void flush(AVCodecContext *avctx)
*
* @ return Returns error status . 0 - OK , ! 0 - error
*/
static av_cold int set_default_channel_config ( AVCodecContext * avctx ,
static int set_default_channel_config ( AVCodecContext * avctx ,
uint8_t ( * layout_map ) [ 3 ] ,
int * tags ,
int channel_config )
@ -436,13 +464,14 @@ static av_cold int set_default_channel_config(AVCodecContext *avctx,
static ChannelElement * get_che ( AACContext * ac , int type , int elem_id )
{
// For PCE based channel configurations map the channels solely based on tags.
if ( ! ac - > m4ac . chan_config ) {
if ( ! ac - > oc [ 1 ] . m4ac . chan_config ) {
return ac - > tag_che_map [ type ] [ elem_id ] ;
}
// Allow single CPE stereo files to be signalled with mono configuration.
if ( ! ac - > tags_mapped & & type = = TYPE_CPE & & ac - > m4ac . chan_config = = 1 ) {
if ( ! ac - > tags_mapped & & type = = TYPE_CPE & & ac - > oc [ 1 ] . m4ac . chan_config = = 1 ) {
uint8_t layout_map [ MAX_ELEM_ID * 4 ] [ 3 ] ;
int layout_map_tags ;
push_output_configuration ( ac ) ;
if ( set_default_channel_config ( ac - > avctx , layout_map , & layout_map_tags ,
2 ) < 0 )
@ -451,10 +480,25 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
2 , OC_TRIAL_FRAME ) < 0 )
return NULL ;
ac - > m4ac . chan_config = 2 ;
ac - > oc [ 1 ] . m4ac . chan_config = 2 ;
}
// And vice-versa
if ( ! ac - > tags_mapped & & type = = TYPE_SCE & & ac - > oc [ 1 ] . m4ac . chan_config = = 2 ) {
uint8_t layout_map [ MAX_ELEM_ID * 4 ] [ 3 ] ;
int layout_map_tags ;
push_output_configuration ( ac ) ;
if ( set_default_channel_config ( ac - > avctx , layout_map , & layout_map_tags ,
1 ) < 0 )
return NULL ;
if ( output_configure ( ac , layout_map , layout_map_tags ,
1 , OC_TRIAL_FRAME ) < 0 )
return NULL ;
ac - > oc [ 1 ] . m4ac . chan_config = 1 ;
}
// For indexed channel configurations map the channels solely based on position.
switch ( ac - > m4ac . chan_config ) {
switch ( ac - > oc [ 1 ] . m4ac . chan_config ) {
case 7 :
if ( ac - > tags_mapped = = 3 & & type = = TYPE_CPE ) {
ac - > tags_mapped + + ;
@ -464,7 +508,7 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
/* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1]
instead of SCE [ 0 ] CPE [ 0 ] CPE [ 1 ] LFE [ 0 ] . If we seem to have
encountered such a stream , transfer the LFE [ 0 ] element to the SCE [ 1 ] ' s mapping */
if ( ac - > tags_mapped = = tags_per_config [ ac - > m4ac . chan_config ] - 1 & & ( type = = TYPE_LFE | | type = = TYPE_SCE ) ) {
if ( ac - > tags_mapped = = tags_per_config [ ac - > oc [ 1 ] . m4ac . chan_config ] - 1 & & ( type = = TYPE_LFE | | type = = TYPE_SCE ) ) {
ac - > tags_mapped + + ;
return ac - > tag_che_map [ type ] [ elem_id ] = ac - > che [ TYPE_LFE ] [ 0 ] ;
}
@ -474,16 +518,16 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
return ac - > tag_che_map [ TYPE_CPE ] [ elem_id ] = ac - > che [ TYPE_CPE ] [ 1 ] ;
}
case 4 :
if ( ac - > tags_mapped = = 2 & & ac - > m4ac . chan_config = = 4 & & type = = TYPE_SCE ) {
if ( ac - > tags_mapped = = 2 & & ac - > oc [ 1 ] . m4ac . chan_config = = 4 & & type = = TYPE_SCE ) {
ac - > tags_mapped + + ;
return ac - > tag_che_map [ TYPE_SCE ] [ elem_id ] = ac - > che [ TYPE_SCE ] [ 1 ] ;
}
case 3 :
case 2 :
if ( ac - > tags_mapped = = ( ac - > m4ac . chan_config ! = 2 ) & & type = = TYPE_CPE ) {
if ( ac - > tags_mapped = = ( ac - > oc [ 1 ] . m4ac . chan_config ! = 2 ) & & type = = TYPE_CPE ) {
ac - > tags_mapped + + ;
return ac - > tag_che_map [ TYPE_CPE ] [ elem_id ] = ac - > che [ TYPE_CPE ] [ 0 ] ;
} else if ( ac - > m4ac . chan_config = = 2 ) {
} else if ( ac - > oc [ 1 ] . m4ac . chan_config = = 2 ) {
return NULL ;
}
case 1 :
@ -783,10 +827,10 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
float output_scale_factor ;
ac - > avctx = avctx ;
ac - > m4ac . sample_rate = avctx - > sample_rate ;
ac - > oc [ 1 ] . m4ac . sample_rate = avctx - > sample_rate ;
if ( avctx - > extradata_size > 0 ) {
if ( decode_audio_specific_config ( ac , ac - > avctx , & ac - > m4ac ,
if ( decode_audio_specific_config ( ac , ac - > avctx , & ac - > oc [ 1 ] . m4ac ,
avctx - > extradata ,
avctx - > extradata_size * 8 , 1 ) < 0 )
return - 1 ;
@ -796,10 +840,10 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
int layout_map_tags ;
sr = sample_rate_idx ( avctx - > sample_rate ) ;
ac - > m4ac . sampling_index = sr ;
ac - > m4ac . channels = avctx - > channels ;
ac - > m4ac . sbr = - 1 ;
ac - > m4ac . ps = - 1 ;
ac - > oc [ 1 ] . m4ac . sampling_index = sr ;
ac - > oc [ 1 ] . m4ac . channels = avctx - > channels ;
ac - > oc [ 1 ] . m4ac . sbr = - 1 ;
ac - > oc [ 1 ] . m4ac . ps = - 1 ;
for ( i = 0 ; i < FF_ARRAY_ELEMS ( ff_mpeg4audio_channels ) ; i + + )
if ( ff_mpeg4audio_channels [ i ] = = avctx - > channels )
@ -807,14 +851,14 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
if ( i = = FF_ARRAY_ELEMS ( ff_mpeg4audio_channels ) ) {
i = 0 ;
}
ac - > m4ac . chan_config = i ;
ac - > oc [ 1 ] . m4ac . chan_config = i ;
if ( ac - > m4ac . chan_config ) {
if ( ac - > oc [ 1 ] . m4ac . chan_config ) {
int ret = set_default_channel_config ( avctx , layout_map ,
& layout_map_tags , ac - > m4ac . chan_config ) ;
& layout_map_tags , ac - > oc [ 1 ] . m4ac . chan_config ) ;
if ( ! ret )
output_configure ( ac , layout_map , layout_map_tags ,
ac - > m4ac . chan_config , OC_GLOBAL_HDR ) ;
ac - > oc [ 1 ] . m4ac . chan_config , OC_GLOBAL_HDR ) ;
else if ( avctx - > err_recognition & AV_EF_EXPLODE )
return AVERROR_INVALIDDATA ;
}
@ -902,7 +946,7 @@ static int decode_prediction(AACContext *ac, IndividualChannelStream *ics,
return - 1 ;
}
}
for ( sfb = 0 ; sfb < FFMIN ( ics - > max_sfb , ff_aac_pred_sfb_max [ ac - > m4ac . sampling_index ] ) ; sfb + + ) {
for ( sfb = 0 ; sfb < FFMIN ( ics - > max_sfb , ff_aac_pred_sfb_max [ ac - > oc [ 1 ] . m4ac . sampling_index ] ) ; sfb + + ) {
ics - > prediction_used [ sfb ] = get_bits1 ( gb ) ;
}
return 0 ;
@ -950,24 +994,24 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
}
}
ics - > num_windows = 8 ;
ics - > swb_offset = ff_swb_offset_128 [ ac - > m4ac . sampling_index ] ;
ics - > num_swb = ff_aac_num_swb_128 [ ac - > m4ac . sampling_index ] ;
ics - > tns_max_bands = ff_tns_max_bands_128 [ ac - > m4ac . sampling_index ] ;
ics - > swb_offset = ff_swb_offset_128 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > num_swb = ff_aac_num_swb_128 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > tns_max_bands = ff_tns_max_bands_128 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > predictor_present = 0 ;
} else {
ics - > max_sfb = get_bits ( gb , 6 ) ;
ics - > num_windows = 1 ;
ics - > swb_offset = ff_swb_offset_1024 [ ac - > m4ac . sampling_index ] ;
ics - > num_swb = ff_aac_num_swb_1024 [ ac - > m4ac . sampling_index ] ;
ics - > tns_max_bands = ff_tns_max_bands_1024 [ ac - > m4ac . sampling_index ] ;
ics - > swb_offset = ff_swb_offset_1024 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > num_swb = ff_aac_num_swb_1024 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > tns_max_bands = ff_tns_max_bands_1024 [ ac - > oc [ 1 ] . m4ac . sampling_index ] ;
ics - > predictor_present = get_bits1 ( gb ) ;
ics - > predictor_reset_group = 0 ;
if ( ics - > predictor_present ) {
if ( ac - > m4ac . object_type = = AOT_AAC_MAIN ) {
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_MAIN ) {
if ( decode_prediction ( ac , ics , gb ) ) {
goto fail ;
}
} else if ( ac - > m4ac . object_type = = AOT_AAC_LC ) {
} else if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_LC ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " Prediction is not allowed in AAC-LC. \n " ) ;
goto fail ;
} else {
@ -1141,7 +1185,7 @@ static int decode_tns(AACContext *ac, TemporalNoiseShaping *tns,
{
int w , filt , i , coef_len , coef_res , coef_compress ;
const int is8 = ics - > window_sequence [ 0 ] = = EIGHT_SHORT_SEQUENCE ;
const int tns_max_order = is8 ? 7 : ac - > m4ac . object_type = = AOT_AAC_MAIN ? 20 : 12 ;
const int tns_max_order = is8 ? 7 : ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_MAIN ? 20 : 12 ;
for ( w = 0 ; w < ics - > num_windows ; w + + ) {
if ( ( tns - > n_filt [ w ] = get_bits ( gb , 2 - is8 ) ) ) {
coef_res = get_bits1 ( gb ) ;
@ -1552,7 +1596,7 @@ static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
}
if ( sce - > ics . window_sequence [ 0 ] ! = EIGHT_SHORT_SEQUENCE ) {
for ( sfb = 0 ; sfb < ff_aac_pred_sfb_max [ ac - > m4ac . sampling_index ] ; sfb + + ) {
for ( sfb = 0 ; sfb < ff_aac_pred_sfb_max [ ac - > oc [ 1 ] . m4ac . sampling_index ] ; sfb + + ) {
for ( k = sce - > ics . swb_offset [ sfb ] ; k < sce - > ics . swb_offset [ sfb + 1 ] ; k + + ) {
predict ( & sce - > predictor_state [ k ] , & sce - > coeffs [ k ] ,
sce - > ics . predictor_present & & sce - > ics . prediction_used [ sfb ] ) ;
@ -1621,7 +1665,7 @@ static int decode_ics(AACContext *ac, SingleChannelElement *sce,
if ( decode_spectrum_and_dequant ( ac , out , gb , sce - > sf , pulse_present , & pulse , ics , sce - > band_type ) < 0 )
return - 1 ;
if ( ac - > m4ac . object_type = = AOT_AAC_MAIN & & ! common_window )
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_MAIN & & ! common_window )
apply_prediction ( ac , sce ) ;
return 0 ;
@ -1711,7 +1755,7 @@ static int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe)
i = cpe - > ch [ 1 ] . ics . use_kb_window [ 0 ] ;
cpe - > ch [ 1 ] . ics = cpe - > ch [ 0 ] . ics ;
cpe - > ch [ 1 ] . ics . use_kb_window [ 1 ] = i ;
if ( cpe - > ch [ 1 ] . ics . predictor_present & & ( ac - > m4ac . object_type ! = AOT_AAC_MAIN ) )
if ( cpe - > ch [ 1 ] . ics . predictor_present & & ( ac - > oc [ 1 ] . m4ac . object_type ! = AOT_AAC_MAIN ) )
if ( ( cpe - > ch [ 1 ] . ics . ltp . present = get_bits ( gb , 1 ) ) )
decode_ltp ( ac , & cpe - > ch [ 1 ] . ics . ltp , gb , cpe - > ch [ 1 ] . ics . max_sfb ) ;
ms_present = get_bits ( gb , 2 ) ;
@ -1729,7 +1773,7 @@ static int decode_cpe(AACContext *ac, GetBitContext *gb, ChannelElement *cpe)
if ( common_window ) {
if ( ms_present )
apply_mid_side_stereo ( ac , cpe ) ;
if ( ac - > m4ac . object_type = = AOT_AAC_MAIN ) {
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_MAIN ) {
apply_prediction ( ac , & cpe - > ch [ 0 ] ) ;
apply_prediction ( ac , & cpe - > ch [ 1 ] ) ;
}
@ -1910,21 +1954,21 @@ static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
if ( ! che ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " SBR was found before the first channel element. \n " ) ;
return res ;
} else if ( ! ac - > m4ac . sbr ) {
} else if ( ! ac - > oc [ 1 ] . m4ac . sbr ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " SBR signaled to be not-present but was found in the bitstream. \n " ) ;
skip_bits_long ( gb , 8 * cnt - 4 ) ;
return res ;
} else if ( ac - > m4ac . sbr = = - 1 & & ac - > output_configured = = OC_LOCKED ) {
} else if ( ac - > oc [ 1 ] . m4ac . sbr = = - 1 & & ac - > oc [ 1 ] . status = = OC_LOCKED ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " Implicit SBR was found with a first occurrence after the first frame. \n " ) ;
skip_bits_long ( gb , 8 * cnt - 4 ) ;
return res ;
} else if ( ac - > m4ac . ps = = - 1 & & ac - > output_configured < OC_LOCKED & & ac - > avctx - > channels = = 1 ) {
ac - > m4ac . sbr = 1 ;
ac - > m4ac . ps = 1 ;
output_configure ( ac , ac - > layout_map , ac - > layout_map_tags ,
ac - > m4ac . chan_config , ac - > output_configured ) ;
} else if ( ac - > oc [ 1 ] . m4ac . ps = = - 1 & & ac - > oc [ 1 ] . status < OC_LOCKED & & ac - > avctx - > channels = = 1 ) {
ac - > oc [ 1 ] . m4ac . sbr = 1 ;
ac - > oc [ 1 ] . m4ac . ps = 1 ;
output_configure ( ac , ac - > oc [ 1 ] . layout_map , ac - > oc [ 1 ] . layout_map_tags ,
ac - > oc [ 1 ] . m4ac . chan_config , ac - > oc [ 1 ] . status ) ;
} else {
ac - > m4ac . sbr = 1 ;
ac - > oc [ 1 ] . m4ac . sbr = 1 ;
}
res = ff_decode_sbr_extension ( ac , & che - > sbr , gb , crc_flag , cnt , elem_type ) ;
break ;
@ -2170,7 +2214,7 @@ static void apply_dependent_coupling(AACContext *ac,
float * dest = target - > coeffs ;
const float * src = cce - > ch [ 0 ] . coeffs ;
int g , i , group , k , idx = 0 ;
if ( ac - > m4ac . object_type = = AOT_AAC_LTP ) {
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_LTP ) {
av_log ( ac - > avctx , AV_LOG_ERROR ,
" Dependent coupling is not supported together with LTP \n " ) ;
return ;
@ -2205,7 +2249,7 @@ static void apply_independent_coupling(AACContext *ac,
const float gain = cce - > coup . gain [ index ] [ 0 ] ;
const float * src = cce - > ch [ 0 ] . ret ;
float * dest = target - > ret ;
const int len = 1024 < < ( ac - > m4ac . sbr = = 1 ) ;
const int len = 1024 < < ( ac - > oc [ 1 ] . m4ac . sbr = = 1 ) ;
for ( i = 0 ; i < len ; i + + )
dest [ i ] + = gain * src [ i ] ;
@ -2258,7 +2302,7 @@ static void spectral_to_sample(AACContext *ac)
if ( che ) {
if ( type < = TYPE_CPE )
apply_channel_coupling ( ac , che , type , i , BEFORE_TNS , apply_dependent_coupling ) ;
if ( ac - > m4ac . object_type = = AOT_AAC_LTP ) {
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_LTP ) {
if ( che - > ch [ 0 ] . ics . predictor_present ) {
if ( che - > ch [ 0 ] . ics . ltp . present )
apply_ltp ( ac , & che - > ch [ 0 ] ) ;
@ -2274,14 +2318,14 @@ static void spectral_to_sample(AACContext *ac)
apply_channel_coupling ( ac , che , type , i , BETWEEN_TNS_AND_IMDCT , apply_dependent_coupling ) ;
if ( type ! = TYPE_CCE | | che - > coup . coupling_point = = AFTER_IMDCT ) {
imdct_and_windowing ( ac , & che - > ch [ 0 ] ) ;
if ( ac - > m4ac . object_type = = AOT_AAC_LTP )
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_LTP )
update_ltp ( ac , & che - > ch [ 0 ] ) ;
if ( type = = TYPE_CPE ) {
imdct_and_windowing ( ac , & che - > ch [ 1 ] ) ;
if ( ac - > m4ac . object_type = = AOT_AAC_LTP )
if ( ac - > oc [ 1 ] . m4ac . object_type = = AOT_AAC_LTP )
update_ltp ( ac , & che - > ch [ 1 ] ) ;
}
if ( ac - > m4ac . sbr > 0 ) {
if ( ac - > oc [ 1 ] . m4ac . sbr > 0 ) {
ff_sbr_apply ( ac , & che - > sbr , type , che - > ch [ 0 ] . ret , che - > ch [ 1 ] . ret ) ;
}
}
@ -2301,33 +2345,33 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
size = avpriv_aac_parse_header ( gb , & hdr_info ) ;
if ( size > 0 ) {
if ( ! ac - > warned_num_aac_frames & & hdr_info . num_aac_frames ! = 1 ) {
// This is 2 for "VLB " audio in NSV files.
// See samples/nsv/vlb_audio.
av_log_missing_feature ( ac - > avctx , " More than one AAC RDB per ADTS frame is " , 0 ) ;
ac - > warned_num_aac_frames = 1 ;
}
push_output_configuration ( ac ) ;
if ( hdr_info . chan_config ) {
ac - > m4ac . chan_config = hdr_info . chan_config ;
ac - > oc [ 1 ] . m4ac . chan_config = hdr_info . chan_config ;
if ( set_default_channel_config ( ac - > avctx , layout_map ,
& layout_map_tags , hdr_info . chan_config ) )
return - 7 ;
if ( output_configure ( ac , layout_map , layout_map_tags ,
hdr_info . chan_config ,
FFMAX ( ac - > output_configured , OC_TRIAL_FRAME ) ) )
FFMAX ( ac - > oc [ 1 ] . status , OC_TRIAL_FRAME ) ) )
return - 7 ;
} else if ( ac - > output_configured ! = OC_LOCKED ) {
ac - > m4ac . chan_config = 0 ;
ac - > output_configured = OC_NONE ;
}
if ( ac - > output_configured ! = OC_LOCKED ) {
ac - > m4ac . sbr = - 1 ;
ac - > m4ac . ps = - 1 ;
ac - > m4ac . sample_rate = hdr_info . sample_rate ;
ac - > m4ac . sampling_index = hdr_info . sampling_index ;
ac - > m4ac . object_type = hdr_info . object_type ;
} else {
ac - > oc [ 1 ] . m4ac . chan_config = 0 ;
}
if ( ! ac - > avctx - > sample_rate )
ac - > avctx - > sample_rate = hdr_info . sample_rate ;
if ( ! ac - > warned_num_aac_frames & & hdr_info . num_aac_frames ! = 1 ) {
// This is 2 for "VLB " audio in NSV files.
// See samples/nsv/vlb_audio.
av_log_missing_feature ( ac - > avctx , " More than one AAC RDB per ADTS frame is " , 0 ) ;
ac - > warned_num_aac_frames = 1 ;
ac - > oc [ 1 ] . m4ac . sample_rate = hdr_info . sample_rate ;
ac - > oc [ 1 ] . m4ac . sampling_index = hdr_info . sampling_index ;
ac - > oc [ 1 ] . m4ac . object_type = hdr_info . object_type ;
if ( ac - > oc [ 0 ] . status ! = OC_LOCKED | |
ac - > oc [ 0 ] . m4ac . chan_config ! = hdr_info . chan_config | |
ac - > oc [ 0 ] . m4ac . sample_rate ! = hdr_info . sample_rate ) {
ac - > oc [ 1 ] . m4ac . sbr = - 1 ;
ac - > oc [ 1 ] . m4ac . ps = - 1 ;
}
if ( ! hdr_info . crc_absent )
skip_bits ( gb , 16 ) ;
@ -2342,16 +2386,18 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
ChannelElement * che = NULL , * che_prev = NULL ;
enum RawDataBlockType elem_type , elem_type_prev = TYPE_END ;
int err , elem_id ;
int samples = 0 , multiplier , audio_found = 0 ;
int samples = 0 , multiplier , audio_found = 0 , pce_found = 0 ;
if ( show_bits ( gb , 12 ) = = 0xfff ) {
if ( parse_adts_frame_header ( ac , gb ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Error decoding AAC frame header. \n " ) ;
return - 1 ;
err = - 1 ;
goto fail ;
}
if ( ac - > m4ac . sampling_index > 12 ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " invalid sampling rate index %d \n " , ac - > m4ac . sampling_index ) ;
return - 1 ;
if ( ac - > oc [ 1 ] . m4ac . sampling_index > 12 ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " invalid sampling rate index %d \n " , ac - > oc [ 1 ] . m4ac . sampling_index ) ;
err = - 1 ;
goto fail ;
}
}
@ -2364,7 +2410,8 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
if ( ! ( che = get_che ( ac , elem_type , elem_id ) ) ) {
av_log ( ac - > avctx , AV_LOG_ERROR , " channel element %d.%d is not allocated \n " ,
elem_type , elem_id ) ;
return - 1 ;
err = - 1 ;
goto fail ;
}
samples = 1024 ;
}
@ -2397,17 +2444,20 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
case TYPE_PCE : {
uint8_t layout_map [ MAX_ELEM_ID * 4 ] [ 3 ] ;
int tags ;
tags = decode_pce ( avctx , & ac - > m4ac , layout_map , gb ) ;
push_output_configuration ( ac ) ;
tags = decode_pce ( avctx , & ac - > oc [ 1 ] . m4ac , layout_map , gb ) ;
if ( tags < 0 ) {
err = tags ;
break ;
}
if ( ac - > output_configured > OC_TRIAL_PCE )
if ( pce_found ) {
av_log ( avctx , AV_LOG_INFO ,
" Evaluating a further program_config_element. \n " ) ;
}
err = output_configure ( ac , layout_map , tags , 0 , OC_TRIAL_PCE ) ;
if ( ! err )
ac - > m4ac . chan_config = 0 ;
ac - > oc [ 1 ] . m4ac . chan_config = 0 ;
pce_found = 1 ;
break ;
}
@ -2416,7 +2466,8 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
elem_id + = get_bits ( gb , 8 ) - 1 ;
if ( get_bits_left ( gb ) < 8 * elem_id ) {
av_log ( avctx , AV_LOG_ERROR , overread_err ) ;
return - 1 ;
err = - 1 ;
goto fail ;
}
while ( elem_id > 0 )
elem_id - = decode_extension_payload ( ac , gb , elem_id , che_prev , elem_type_prev ) ;
@ -2432,29 +2483,27 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
elem_type_prev = elem_type ;
if ( err )
return err ;
goto fail ;
if ( get_bits_left ( gb ) < 3 ) {
av_log ( avctx , AV_LOG_ERROR , overread_err ) ;
return - 1 ;
err = - 1 ;
goto fail ;
}
}
spectral_to_sample ( ac ) ;
multiplier = ( ac - > m4ac . sbr = = 1 ) ? ac - > m4ac . ext_sample_rate > ac - > m4ac . sample_rate : 0 ;
multiplier = ( ac - > oc [ 1 ] . m4ac . sbr = = 1 ) ? ac - > oc [ 1 ] . m4ac . ext_sample_rate > ac - > oc [ 1 ] . m4ac . sample_rate : 0 ;
samples < < = multiplier ;
if ( ac - > output_configured < OC_LOCKED ) {
avctx - > sample_rate = ac - > m4ac . sample_rate < < multiplier ;
avctx - > frame_size = samples ;
}
if ( samples ) {
/* get output buffer */
ac - > frame . nb_samples = samples ;
if ( ( err = avctx - > get_buffer ( avctx , & ac - > frame ) ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
return err ;
err = - 1 ;
goto fail ;
}
if ( avctx - > sample_fmt = = AV_SAMPLE_FMT_FLT )
@ -2470,10 +2519,16 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
}
* got_frame_ptr = ! ! samples ;
if ( ac - > output_configured & & audio_found )
ac - > output_configured = OC_LOCKED ;
if ( ac - > oc [ 1 ] . status & & audio_found ) {
avctx - > sample_rate = ac - > oc [ 1 ] . m4ac . sample_rate < < multiplier ;
avctx - > frame_size = samples ;
ac - > oc [ 1 ] . status = OC_LOCKED ;
}
return 0 ;
fail :
pop_output_configuration ( ac ) ;
return err ;
}
static int aac_decode_frame ( AVCodecContext * avctx , void * data ,
@ -2499,10 +2554,13 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
return AVERROR ( ENOMEM ) ;
avctx - > extradata_size = new_extradata_size ;
memcpy ( avctx - > extradata , new_extradata , new_extradata_size ) ;
if ( decode_audio_specific_config ( ac , ac - > avctx , & ac - > m4ac ,
push_output_configuration ( ac ) ;
if ( decode_audio_specific_config ( ac , ac - > avctx , & ac - > oc [ 1 ] . m4ac ,
avctx - > extradata ,
avctx - > extradata_size * 8 , 1 ) < 0 )
avctx - > extradata_size * 8 , 1 ) < 0 ) {
pop_output_configuration ( ac ) ;
return AVERROR_INVALIDDATA ;
}
}
init_get_bits ( & gb , buf , buf_size * 8 ) ;
@ -2562,7 +2620,7 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
{
AACContext * ac = & latmctx - > aac_ctx ;
AVCodecContext * avctx = ac - > avctx ;
MPEG4AudioConfig m4ac = { 0 } ;
MPEG4AudioConfig m4ac = { 0 } ;
int config_start_bit = get_bits_count ( gb ) ;
int sync_extension = 0 ;
int bits_consumed , esize ;
@ -2587,8 +2645,8 @@ static int latm_decode_audio_specific_config(struct LATMContext *latmctx,
if ( bits_consumed < 0 )
return AVERROR_INVALIDDATA ;
if ( ac - > m4ac . sample_rate ! = m4ac . sample_rate | |
ac - > m4ac . chan_config ! = m4ac . chan_config ) {
if ( ac - > oc [ 1 ] . m4ac . sample_rate ! = m4ac . sample_rate | |
ac - > oc [ 1 ] . m4ac . chan_config ! = m4ac . chan_config ) {
av_log ( avctx , AV_LOG_INFO , " audio config changed \n " ) ;
latmctx - > initialized = 0 ;
@ -2769,10 +2827,13 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out,
* got_frame_ptr = 0 ;
return avpkt - > size ;
} else {
push_output_configuration ( & latmctx - > aac_ctx ) ;
if ( ( err = decode_audio_specific_config (
& latmctx - > aac_ctx , avctx , & latmctx - > aac_ctx . m4ac ,
avctx - > extradata , avctx - > extradata_size * 8 , 1 ) ) < 0 )
& latmctx - > aac_ctx , avctx , & latmctx - > aac_ctx . oc [ 1 ] . m4ac ,
avctx - > extradata , avctx - > extradata_size * 8 , 1 ) ) < 0 ) {
pop_output_configuration ( & latmctx - > aac_ctx ) ;
return err ;
}
latmctx - > initialized = 1 ;
}
}