@ -85,13 +85,13 @@ static always_inline int MULH(int a, int b){
# define HEADER_SIZE 4
# define BACKSTEP_SIZE 512
# define EXTRABYTES 24
struct GranuleDef ;
typedef struct MPADecodeContext {
uint8_t inbuf1 [ 2 ] [ MPA_MAX_CODED_FRAME_SIZE + BACKSTEP_SIZE ] ; /* input buffer */
int inbuf_index ;
uint8_t * inbuf_ptr , * inbuf ;
DECLARE_ALIGNED_8 ( uint8_t , last_buf [ BACKSTEP_SIZE + EXTRABYTES + MPA_MAX_CODED_FRAME_SIZE ] ) ; //FIXME we dont need that much
int last_buf_size ;
int frame_size ;
int free_format_frame_size ; /* frame size in case of free format
( zero if currently unknown ) */
@ -104,6 +104,7 @@ typedef struct MPADecodeContext {
int bit_rate ;
int old_frame_size ;
GetBitContext gb ;
GetBitContext in_gb ;
int nb_channels ;
int mode ;
int mode_ext ;
@ -535,9 +536,6 @@ static int decode_init(AVCodecContext * avctx)
init = 1 ;
}
s - > inbuf_index = 0 ;
s - > inbuf = & s - > inbuf1 [ s - > inbuf_index ] [ BACKSTEP_SIZE ] ;
s - > inbuf_ptr = s - > inbuf ;
# ifdef DEBUG
s - > frame_count = 0 ;
# endif
@ -1585,29 +1583,6 @@ static int mp_decode_layer2(MPADecodeContext *s)
return 3 * 12 ;
}
/*
* Seek back in the stream for backstep bytes ( at most 511 bytes )
*/
static void seek_to_maindata ( MPADecodeContext * s , unsigned int backstep )
{
uint8_t * ptr ;
/* compute current position in stream */
ptr = ( uint8_t * ) ( s - > gb . buffer + ( get_bits_count ( & s - > gb ) > > 3 ) ) ;
/* copy old data before current one */
ptr - = backstep ;
memcpy ( ptr , s - > inbuf1 [ s - > inbuf_index ^ 1 ] +
BACKSTEP_SIZE + s - > old_frame_size - backstep , backstep ) ;
/* init get bits again */
init_get_bits ( & s - > gb , ptr , ( s - > frame_size + backstep ) * 8 ) ;
/* prepare next buffer */
s - > inbuf_index ^ = 1 ;
s - > inbuf = & s - > inbuf1 [ s - > inbuf_index ] [ BACKSTEP_SIZE ] ;
s - > old_frame_size = s - > frame_size ;
}
static inline void lsf_sf_expand ( int * slen ,
int sf , int n1 , int n2 , int n3 )
{
@ -1676,12 +1651,13 @@ static inline int get_bitsz(GetBitContext *s, int n)
}
static int huffman_decode ( MPADecodeContext * s , GranuleDef * g ,
int16_t * exponents , int end_pos )
int16_t * exponents , int end_pos2 )
{
int s_index ;
int i ;
int last_pos ;
int last_pos , bits_left ;
VLC * vlc ;
int end_pos = FFMIN ( end_pos2 , s - > gb . size_in_bits ) ;
/* low frequencies (called big values) */
s_index = 0 ;
@ -1705,9 +1681,22 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
/* read huffcode and compute each couple */
for ( ; j > 0 ; j - - ) {
int exponent , x , y , v ;
if ( get_bits_count ( & s - > gb ) > = end_pos )
break ;
int pos = get_bits_count ( & s - > gb ) ;
if ( pos > = end_pos ) {
// av_log(NULL, AV_LOG_ERROR, "pos: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);
if ( s - > in_gb . buffer & & pos > = s - > gb . size_in_bits ) {
s - > gb = s - > in_gb ;
s - > in_gb . buffer = NULL ;
assert ( ( get_bits_count ( & s - > gb ) & 7 ) = = 0 ) ;
skip_bits_long ( & s - > gb , pos - end_pos ) ;
end_pos = end_pos2 + get_bits_count ( & s - > gb ) - pos ;
pos = get_bits_count ( & s - > gb ) ;
}
// av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos);
if ( pos > = end_pos )
break ;
}
y = get_vlc2 ( & s - > gb , vlc - > table , 7 , 3 ) ;
if ( ! y ) {
@ -1768,14 +1757,25 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
int pos , code ;
pos = get_bits_count ( & s - > gb ) ;
if ( pos > = end_pos ) {
if ( pos > end_pos & & last_pos ) {
// av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index);
if ( s - > in_gb . buffer & & pos > = s - > gb . size_in_bits ) {
s - > gb = s - > in_gb ;
s - > in_gb . buffer = NULL ;
assert ( ( get_bits_count ( & s - > gb ) & 7 ) = = 0 ) ;
skip_bits_long ( & s - > gb , pos - end_pos ) ;
end_pos = end_pos2 + get_bits_count ( & s - > gb ) - pos ;
pos = get_bits_count ( & s - > gb ) ;
}
// av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index);
if ( pos > end_pos & & last_pos ) { //FIXME last_pos is messed if we switch buffers
/* some encoders generate an incorrect size for this
part . We must go back into the data */
s_index - = 4 ;
init_get_bits ( & s - > gb , s - > gb . buffer + 4 * ( last_pos > > 5 ) , s - > gb . size_in_bits - ( last_pos & ( ~ 31 ) ) ) ;
skip_bits ( & s - > gb , last_pos & 31 ) ;
skip_bits_long ( & s - > gb , last_pos - pos ) ;
av_log ( NULL , AV_LOG_ERROR , " overread, skip %d \n " , last_pos & 7 ) ;
}
break ;
if ( pos > = end_pos )
break ;
}
last_pos = pos ;
@ -1799,6 +1799,16 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
s_index + = 4 ;
}
memset ( & g - > sb_hybrid [ s_index ] , 0 , sizeof ( * g - > sb_hybrid ) * ( 576 - s_index ) ) ;
/* skip extension bits */
bits_left = end_pos - get_bits_count ( & s - > gb ) ;
//av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer);
if ( bits_left < 0 ) {
dprintf ( " bits_left=%d \n " , bits_left ) ;
return - 1 ;
}
skip_bits_long ( & s - > gb , bits_left ) ;
return 0 ;
}
@ -2184,7 +2194,7 @@ void sample_dump(int fnum, int32_t *tab, int n)
static int mp_decode_layer3 ( MPADecodeContext * s )
{
int nb_granules , main_data_begin , private_bits ;
int gr , ch , blocksplit_flag , i , j , k , n , bits_pos , bits_left ;
int gr , ch , blocksplit_flag , i , j , k , n , bits_pos ;
GranuleDef granules [ 2 ] [ 2 ] , * g ;
int16_t exponents [ 576 ] ;
@ -2308,9 +2318,18 @@ static int mp_decode_layer3(MPADecodeContext *s)
}
if ( ! s - > adu_mode ) {
const uint8_t * ptr = s - > gb . buffer + ( get_bits_count ( & s - > gb ) > > 3 ) ;
/* now we get bits from the main_data_begin offset */
dprintf ( " seekback: %d \n " , main_data_begin ) ;
seek_to_maindata ( s , main_data_begin ) ;
//av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);
if ( main_data_begin > s - > last_buf_size )
s - > last_buf_size = main_data_begin ;
memcpy ( s - > last_buf + s - > last_buf_size , ptr , EXTRABYTES ) ;
s - > in_gb = s - > gb ;
init_get_bits ( & s - > gb , s - > last_buf + s - > last_buf_size - main_data_begin , main_data_begin * 8 ) ;
/* prepare next buffer */
s - > old_frame_size = s - > frame_size ;
}
for ( gr = 0 ; gr < nb_granules ; gr + + ) {
@ -2452,19 +2471,6 @@ static int mp_decode_layer3(MPADecodeContext *s)
# if defined(DEBUG)
sample_dump ( 0 , g - > sb_hybrid , 576 ) ;
# endif
/* skip extension bits */
bits_left = g - > part2_3_length - ( get_bits_count ( & s - > gb ) - bits_pos ) ;
if ( bits_left < 0 ) {
dprintf ( " bits_left=%d \n " , bits_left ) ;
return - 1 ;
}
while ( bits_left > = 16 ) {
skip_bits ( & s - > gb , 16 ) ;
bits_left - = 16 ;
}
if ( bits_left > 0 )
skip_bits ( & s - > gb , bits_left ) ;
} /* ch */
if ( s - > nb_channels = = 2 )
@ -2491,13 +2497,12 @@ static int mp_decode_layer3(MPADecodeContext *s)
}
static int mp_decode_frame ( MPADecodeContext * s ,
OUT_INT * samples )
OUT_INT * samples , const uint8_t * buf , int buf_size )
{
int i , nb_frames , ch ;
OUT_INT * samples_ptr ;
init_get_bits ( & s - > gb , s - > inbuf + HEADER_SIZE ,
( s - > inbuf_ptr - s - > inbuf - HEADER_SIZE ) * 8 ) ;
init_get_bits ( & s - > gb , buf + HEADER_SIZE , ( buf_size - HEADER_SIZE ) * 8 ) ;
/* skip error protection field */
if ( s - > error_protection )
@ -2514,6 +2519,14 @@ static int mp_decode_frame(MPADecodeContext *s,
case 3 :
default :
nb_frames = mp_decode_layer3 ( s ) ;
if ( s - > in_gb . buffer )
s - > gb = s - > in_gb ;
align_get_bits ( & s - > gb ) ;
assert ( ( get_bits_count ( & s - > gb ) & 7 ) = = 0 ) ;
s - > last_buf_size = ( s - > gb . size_in_bits - get_bits_count ( & s - > gb ) ) > > 3 ;
memcpy ( s - > last_buf , s - > gb . buffer + ( get_bits_count ( & s - > gb ) > > 3 ) , s - > last_buf_size ) ;
break ;
}
# if defined(DEBUG)
@ -2550,159 +2563,58 @@ static int decode_frame(AVCodecContext * avctx,
{
MPADecodeContext * s = avctx - > priv_data ;
uint32_t header ;
uint8_t * buf_ptr ;
int len , out_size ;
int out_size ;
OUT_INT * out_samples = data ;
buf_ptr = buf ;
while ( buf_size > 0 ) {
len = s - > inbuf_ptr - s - > inbuf ;
if ( s - > frame_size = = 0 ) {
/* special case for next header for first frame in free
format case ( XXX : find a simpler method ) */
if ( s - > free_format_next_header ! = 0 ) {
s - > inbuf [ 0 ] = s - > free_format_next_header > > 24 ;
s - > inbuf [ 1 ] = s - > free_format_next_header > > 16 ;
s - > inbuf [ 2 ] = s - > free_format_next_header > > 8 ;
s - > inbuf [ 3 ] = s - > free_format_next_header ;
s - > inbuf_ptr = s - > inbuf + 4 ;
s - > free_format_next_header = 0 ;
goto got_header ;
}
/* no header seen : find one. We need at least HEADER_SIZE
bytes to parse it */
len = HEADER_SIZE - len ;
if ( len > buf_size )
len = buf_size ;
if ( len > 0 ) {
memcpy ( s - > inbuf_ptr , buf_ptr , len ) ;
buf_ptr + = len ;
buf_size - = len ;
s - > inbuf_ptr + = len ;
}
if ( ( s - > inbuf_ptr - s - > inbuf ) > = HEADER_SIZE ) {
got_header :
header = ( s - > inbuf [ 0 ] < < 24 ) | ( s - > inbuf [ 1 ] < < 16 ) |
( s - > inbuf [ 2 ] < < 8 ) | s - > inbuf [ 3 ] ;
if ( ff_mpa_check_header ( header ) < 0 ) {
/* no sync found : move by one byte (inefficient, but simple!) */
memmove ( s - > inbuf , s - > inbuf + 1 , s - > inbuf_ptr - s - > inbuf - 1 ) ;
s - > inbuf_ptr - - ;
dprintf ( " skip %x \n " , header ) ;
/* reset free format frame size to give a chance
to get a new bitrate */
s - > free_format_frame_size = 0 ;
} else {
if ( decode_header ( s , header ) = = 1 ) {
/* free format: prepare to compute frame size */
s - > frame_size = - 1 ;
}
/* update codec info */
avctx - > sample_rate = s - > sample_rate ;
avctx - > channels = s - > nb_channels ;
avctx - > bit_rate = s - > bit_rate ;
avctx - > sub_id = s - > layer ;
switch ( s - > layer ) {
case 1 :
avctx - > frame_size = 384 ;
break ;
case 2 :
avctx - > frame_size = 1152 ;
break ;
case 3 :
if ( s - > lsf )
avctx - > frame_size = 576 ;
else
avctx - > frame_size = 1152 ;
break ;
}
}
}
} else if ( s - > frame_size = = - 1 ) {
/* free format : find next sync to compute frame size */
len = MPA_MAX_CODED_FRAME_SIZE - len ;
if ( len > buf_size )
len = buf_size ;
if ( len = = 0 ) {
/* frame too long: resync */
s - > frame_size = 0 ;
memmove ( s - > inbuf , s - > inbuf + 1 , s - > inbuf_ptr - s - > inbuf - 1 ) ;
s - > inbuf_ptr - - ;
} else {
uint8_t * p , * pend ;
uint32_t header1 ;
int padding ;
memcpy ( s - > inbuf_ptr , buf_ptr , len ) ;
/* check for header */
p = s - > inbuf_ptr - 3 ;
pend = s - > inbuf_ptr + len - 4 ;
while ( p < = pend ) {
header = ( p [ 0 ] < < 24 ) | ( p [ 1 ] < < 16 ) |
( p [ 2 ] < < 8 ) | p [ 3 ] ;
header1 = ( s - > inbuf [ 0 ] < < 24 ) | ( s - > inbuf [ 1 ] < < 16 ) |
( s - > inbuf [ 2 ] < < 8 ) | s - > inbuf [ 3 ] ;
/* check with high probability that we have a
valid header */
if ( ( header & SAME_HEADER_MASK ) = =
( header1 & SAME_HEADER_MASK ) ) {
/* header found: update pointers */
len = ( p + 4 ) - s - > inbuf_ptr ;
buf_ptr + = len ;
buf_size - = len ;
s - > inbuf_ptr = p ;
/* compute frame size */
s - > free_format_next_header = header ;
s - > free_format_frame_size = s - > inbuf_ptr - s - > inbuf ;
padding = ( header1 > > 9 ) & 1 ;
if ( s - > layer = = 1 )
s - > free_format_frame_size - = padding * 4 ;
else
s - > free_format_frame_size - = padding ;
dprintf ( " free frame size=%d padding=%d \n " ,
s - > free_format_frame_size , padding ) ;
decode_header ( s , header1 ) ;
goto next_data ;
}
p + + ;
}
/* not found: simply increase pointers */
buf_ptr + = len ;
s - > inbuf_ptr + = len ;
buf_size - = len ;
}
} else if ( len < s - > frame_size ) {
if ( s - > frame_size > MPA_MAX_CODED_FRAME_SIZE )
s - > frame_size = MPA_MAX_CODED_FRAME_SIZE ;
len = s - > frame_size - len ;
if ( len > buf_size )
len = buf_size ;
memcpy ( s - > inbuf_ptr , buf_ptr , len ) ;
buf_ptr + = len ;
s - > inbuf_ptr + = len ;
buf_size - = len ;
}
next_data :
if ( s - > frame_size > 0 & &
( s - > inbuf_ptr - s - > inbuf ) > = s - > frame_size ) {
if ( avctx - > parse_only ) {
/* simply return the frame data */
* ( uint8_t * * ) data = s - > inbuf ;
out_size = s - > inbuf_ptr - s - > inbuf ;
} else {
out_size = mp_decode_frame ( s , out_samples ) ;
}
s - > inbuf_ptr = s - > inbuf ;
s - > frame_size = 0 ;
if ( out_size > = 0 )
* data_size = out_size ;
else
av_log ( avctx , AV_LOG_DEBUG , " Error while decoding mpeg audio frame \n " ) ; //FIXME return -1 / but also return the number of bytes consumed
break ;
}
retry :
if ( buf_size < HEADER_SIZE )
return - 1 ;
header = ( buf [ 0 ] < < 24 ) | ( buf [ 1 ] < < 16 ) | ( buf [ 2 ] < < 8 ) | buf [ 3 ] ;
if ( ff_mpa_check_header ( header ) < 0 ) {
buf + + ;
// buf_size--;
av_log ( avctx , AV_LOG_ERROR , " header missing skiping one byte \n " ) ;
goto retry ;
}
if ( decode_header ( s , header ) = = 1 ) {
/* free format: prepare to compute frame size */
s - > frame_size = - 1 ;
return - 1 ;
}
/* update codec info */
avctx - > sample_rate = s - > sample_rate ;
avctx - > channels = s - > nb_channels ;
avctx - > bit_rate = s - > bit_rate ;
avctx - > sub_id = s - > layer ;
switch ( s - > layer ) {
case 1 :
avctx - > frame_size = 384 ;
break ;
case 2 :
avctx - > frame_size = 1152 ;
break ;
case 3 :
if ( s - > lsf )
avctx - > frame_size = 576 ;
else
avctx - > frame_size = 1152 ;
break ;
}
if ( s - > frame_size < = 0 | | s - > frame_size < buf_size ) {
av_log ( avctx , AV_LOG_ERROR , " incomplete frame \n " ) ;
return - 1 ;
}
return buf_ptr - buf ;
out_size = mp_decode_frame ( s , out_samples , buf , buf_size ) ;
if ( out_size > = 0 )
* data_size = out_size ;
else
av_log ( avctx , AV_LOG_DEBUG , " Error while decoding mpeg audio frame \n " ) ; //FIXME return -1 / but also return the number of bytes consumed
s - > frame_size = 0 ;
return buf_size ;
}
@ -2727,12 +2639,8 @@ static int decode_frame_adu(AVCodecContext * avctx,
if ( len > MPA_MAX_CODED_FRAME_SIZE )
len = MPA_MAX_CODED_FRAME_SIZE ;
memcpy ( s - > inbuf , buf , len ) ;
s - > inbuf_ptr = s - > inbuf + len ;
// Get header and restore sync word
header = ( s - > inbuf [ 0 ] < < 24 ) | ( s - > inbuf [ 1 ] < < 16 ) |
( s - > inbuf [ 2 ] < < 8 ) | s - > inbuf [ 3 ] | 0xffe00000 ;
header = ( buf [ 0 ] < < 24 ) | ( buf [ 1 ] < < 16 ) | ( buf [ 2 ] < < 8 ) | buf [ 3 ] | 0xffe00000 ;
if ( ff_mpa_check_header ( header ) < 0 ) { // Bad header, discard frame
* data_size = 0 ;
@ -2749,11 +2657,9 @@ static int decode_frame_adu(AVCodecContext * avctx,
avctx - > frame_size = s - > frame_size = len ;
if ( avctx - > parse_only ) {
/* simply return the frame data */
* ( uint8_t * * ) data = s - > inbuf ;
out_size = s - > inbuf_ptr - s - > inbuf ;
out_size = buf_size ;
} else {
out_size = mp_decode_frame ( s , out_samples ) ;
out_size = mp_decode_frame ( s , out_samples , buf , buf_size ) ;
}
* data_size = out_size ;
@ -2816,8 +2722,6 @@ static int decode_init_mp3on4(AVCodecContext * avctx)
for ( i = 1 ; i < s - > frames ; i + + ) {
s - > mp3decctx [ i ] = av_mallocz ( sizeof ( MPADecodeContext ) ) ;
s - > mp3decctx [ i ] - > compute_antialias = s - > mp3decctx [ 0 ] - > compute_antialias ;
s - > mp3decctx [ i ] - > inbuf = & s - > mp3decctx [ i ] - > inbuf1 [ 0 ] [ BACKSTEP_SIZE ] ;
s - > mp3decctx [ i ] - > inbuf_ptr = s - > mp3decctx [ i ] - > inbuf ;
s - > mp3decctx [ i ] - > adu_mode = 1 ;
}
@ -2877,13 +2781,9 @@ static int decode_frame_mp3on4(AVCodecContext * avctx,
fsize = MPA_MAX_CODED_FRAME_SIZE ;
m = s - > mp3decctx [ fr ] ;
assert ( m ! = NULL ) ;
/* copy original to new */
m - > inbuf_ptr = m - > inbuf + fsize ;
memcpy ( m - > inbuf , start , fsize ) ;
// Get header
header = ( m - > inbuf [ 0 ] < < 24 ) | ( m - > inbuf [ 1 ] < < 16 ) |
( m - > inbuf [ 2 ] < < 8 ) | m - > inbuf [ 3 ] | 0xfff00000 ;
header = ( start [ 0 ] < < 24 ) | ( start [ 1 ] < < 16 ) | ( start [ 2 ] < < 8 ) | start [ 3 ] | 0xfff00000 ;
if ( ff_mpa_check_header ( header ) < 0 ) { // Bad header, discard block
* data_size = 0 ;
@ -2891,7 +2791,7 @@ static int decode_frame_mp3on4(AVCodecContext * avctx,
}
decode_header ( m , header ) ;
mp_decode_frame ( m , decoded_buf ) ;
mp_decode_frame ( m , decoded_buf , start , fsize ) ;
n = MPA_FRAME_SIZE * m - > nb_channels ;
out_size + = n * sizeof ( OUT_INT ) ;