@ -57,6 +57,9 @@ struct PayloadContext {
int nb_au_headers ;
int au_headers_length_bytes ;
int cur_au_index ;
uint8_t buf [ RTP_MAX_PACKET_LENGTH ] ;
int buf_pos , buf_size ;
} ;
typedef struct {
@ -149,18 +152,11 @@ static int rtp_parse_mp4_au(PayloadContext *data, const uint8_t *buf, int len)
data - > au_headers_allocated = data - > nb_au_headers ;
}
/* XXX: We handle multiple AU Section as only one (need to fix this for interleaving)
In my test , the FAAD decoder does not behave correctly when sending each AU one by one
but does when sending the whole as one big packet . . . */
data - > au_headers [ 0 ] . size = 0 ;
data - > au_headers [ 0 ] . index = 0 ;
for ( i = 0 ; i < data - > nb_au_headers ; + + i ) {
data - > au_headers [ 0 ] . size + = get_bits_long ( & getbitcontext , data - > sizelength ) ;
data - > au_headers [ 0 ] . index = get_bits_long ( & getbitcontext , data - > indexlength ) ;
data - > au_headers [ i ] . size = get_bits_long ( & getbitcontext , data - > sizelength ) ;
data - > au_headers [ i ] . index = get_bits_long ( & getbitcontext , data - > indexlength ) ;
}
data - > nb_au_headers = 1 ;
return 0 ;
}
@ -172,21 +168,44 @@ static int aac_parse_packet(AVFormatContext *ctx, PayloadContext *data,
int flags )
{
int ret ;
if ( ! buf ) {
if ( data - > cur_au_index > data - > nb_au_headers )
return AVERROR_INVALIDDATA ;
if ( data - > buf_size - data - > buf_pos < data - > au_headers [ data - > cur_au_index ] . size )
return AVERROR_INVALIDDATA ;
if ( ( ret = av_new_packet ( pkt , data - > au_headers [ data - > cur_au_index ] . size ) ) < 0 )
return ret ;
memcpy ( pkt - > data , & data - > buf [ data - > buf_pos ] , data - > au_headers [ data - > cur_au_index ] . size ) ;
data - > buf_pos + = data - > au_headers [ data - > cur_au_index ] . size ;
pkt - > stream_index = st - > index ;
data - > cur_au_index + + ;
return data - > cur_au_index < data - > nb_au_headers ;
}
if ( rtp_parse_mp4_au ( data , buf , len ) )
return - 1 ;
buf + = data - > au_headers_length_bytes + 2 ;
len - = data - > au_headers_length_bytes + 2 ;
/* XXX: Fixme we only handle the case where rtp_parse_mp4_au define
one au_header */
if ( len < data - > au_headers [ 0 ] . size )
return AVERROR_INVALIDDATA ;
if ( ( ret = av_new_packet ( pkt , data - > au_headers [ 0 ] . size ) ) < 0 )
return ret ;
memcpy ( pkt - > data , buf , data - > au_headers [ 0 ] . size ) ;
len - = data - > au_headers [ 0 ] . size ;
buf + = data - > au_headers [ 0 ] . size ;
pkt - > stream_index = st - > index ;
if ( len > 0 & & data - > nb_au_headers > 1 ) {
data - > buf_size = FFMIN ( len , sizeof ( data - > buf ) ) ;
memcpy ( data - > buf , buf , data - > buf_size ) ;
data - > cur_au_index = 1 ;
data - > buf_pos = 0 ;
return 1 ;
}
return 0 ;
}