@ -1921,24 +1921,17 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
return size ;
}
static int aac_decode_frame ( AVCodecContext * avctx , void * data ,
int * data_size , AVPacket * avpkt )
static int aac_decode_frame_int ( AVCodecContext * avctx , void * data ,
int * data_size , GetBitContext * gb )
{
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
AACContext * ac = avctx - > priv_data ;
ChannelElement * che = NULL , * che_prev = NULL ;
GetBitContext gb ;
enum RawDataBlockType elem_type , elem_type_prev = TYPE_END ;
int err , elem_id , data_size_tmp ;
int buf_consumed ;
int samples = 0 , multiplier ;
int buf_offset ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
if ( show_bits ( & gb , 12 ) = = 0xfff ) {
if ( parse_adts_frame_header ( ac , & gb ) < 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 ;
}
@ -1950,8 +1943,8 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
ac - > tags_mapped = 0 ;
// parse
while ( ( elem_type = get_bits ( & gb , 3 ) ) ! = TYPE_END ) {
elem_id = get_bits ( & gb , 4 ) ;
while ( ( elem_type = get_bits ( gb , 3 ) ) ! = TYPE_END ) {
elem_id = get_bits ( gb , 4 ) ;
if ( elem_type < TYPE_DSE ) {
if ( ! ( che = get_che ( ac , elem_type , elem_id ) ) ) {
@ -1965,29 +1958,29 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
switch ( elem_type ) {
case TYPE_SCE :
err = decode_ics ( ac , & che - > ch [ 0 ] , & gb , 0 , 0 ) ;
err = decode_ics ( ac , & che - > ch [ 0 ] , gb , 0 , 0 ) ;
break ;
case TYPE_CPE :
err = decode_cpe ( ac , & gb , che ) ;
err = decode_cpe ( ac , gb , che ) ;
break ;
case TYPE_CCE :
err = decode_cce ( ac , & gb , che ) ;
err = decode_cce ( ac , gb , che ) ;
break ;
case TYPE_LFE :
err = decode_ics ( ac , & che - > ch [ 0 ] , & gb , 0 , 0 ) ;
err = decode_ics ( ac , & che - > ch [ 0 ] , gb , 0 , 0 ) ;
break ;
case TYPE_DSE :
err = skip_data_stream_element ( ac , & gb ) ;
err = skip_data_stream_element ( ac , gb ) ;
break ;
case TYPE_PCE : {
enum ChannelPosition new_che_pos [ 4 ] [ MAX_ELEM_ID ] ;
memset ( new_che_pos , 0 , 4 * MAX_ELEM_ID * sizeof ( new_che_pos [ 0 ] [ 0 ] ) ) ;
if ( ( err = decode_pce ( ac , new_che_pos , & gb ) ) )
if ( ( err = decode_pce ( ac , new_che_pos , gb ) ) )
break ;
if ( ac - > output_configured > OC_TRIAL_PCE )
av_log ( avctx , AV_LOG_ERROR ,
@ -1999,13 +1992,13 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
case TYPE_FIL :
if ( elem_id = = 15 )
elem_id + = get_bits ( & gb , 8 ) - 1 ;
if ( get_bits_left ( & gb ) < 8 * elem_id ) {
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 ;
}
while ( elem_id > 0 )
elem_id - = decode_extension_payload ( ac , & gb , elem_id , che_prev , elem_type_prev ) ;
elem_id - = decode_extension_payload ( ac , gb , elem_id , che_prev , elem_type_prev ) ;
err = 0 ; /* FIXME */
break ;
@ -2020,7 +2013,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
if ( err )
return err ;
if ( get_bits_left ( & gb ) < 3 ) {
if ( get_bits_left ( gb ) < 3 ) {
av_log ( avctx , AV_LOG_ERROR , overread_err ) ;
return - 1 ;
}
@ -2050,6 +2043,24 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
if ( ac - > output_configured )
ac - > output_configured = OC_LOCKED ;
return 0 ;
}
static int aac_decode_frame ( AVCodecContext * avctx , void * data ,
int * data_size , AVPacket * avpkt )
{
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
GetBitContext gb ;
int buf_consumed ;
int buf_offset ;
int err ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
if ( ( err = aac_decode_frame_int ( avctx , data , data_size , & gb ) ) < 0 )
return err ;
buf_consumed = ( get_bits_count ( & gb ) + 7 ) > > 3 ;
for ( buf_offset = buf_consumed ; buf_offset < buf_size ; buf_offset + + )
if ( buf [ buf_offset ] )