@ -37,9 +37,6 @@ static const char* liba52name = "liba52.so.0";
* released under the GPL license .
*/
typedef struct AC3DecodeState {
uint8_t inbuf [ 4096 ] ; /* input buffer */
uint8_t * inbuf_ptr ;
int frame_size ;
int flags ;
int channels ;
a52_state_t * state ;
@ -114,8 +111,6 @@ static int a52_decode_init(AVCodecContext *avctx)
# endif
s - > state = s - > a52_init ( 0 ) ; /* later use CPU flags */
s - > samples = s - > a52_samples ( s - > state ) ;
s - > inbuf_ptr = s - > inbuf ;
s - > frame_size = 0 ;
/* allow downmixing to stereo or mono */
if ( avctx - > channels > 0 & & avctx - > request_channels > 0 & &
@ -150,7 +145,6 @@ static int a52_decode_frame(AVCodecContext *avctx,
uint8_t * buf , int buf_size )
{
AC3DecodeState * s = avctx - > priv_data ;
uint8_t * buf_ptr ;
int flags , i , len ;
int sample_rate , bit_rate ;
short * out_samples = data ;
@ -161,26 +155,19 @@ static int a52_decode_frame(AVCodecContext *avctx,
* data_size = 0 ;
buf_ptr = buf ;
while ( buf_size > 0 ) {
len = s - > inbuf_ptr - s - > inbuf ;
if ( s - > frame_size = = 0 ) {
/* no header seen : find one. We need at least 7 bytes to parse it */
len = HEADER_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 ;
if ( ( s - > inbuf_ptr - s - > inbuf ) = = HEADER_SIZE ) {
len = s - > a52_syncinfo ( s - > inbuf , & s - > flags , & sample_rate , & bit_rate ) ;
if ( buf_size < HEADER_SIZE ) {
av_log ( avctx , AV_LOG_ERROR , " Error decoding frame, not enough bytes for header \n " ) ;
return - 1 ;
}
len = s - > a52_syncinfo ( buf , & s - > flags , & sample_rate , & bit_rate ) ;
if ( len = = 0 ) {
/* no sync found : move by one byte (inefficient, but simple!) */
memcpy ( s - > inbuf , s - > inbuf + 1 , HEADER_SIZE - 1 ) ;
s - > inbuf_ptr - - ;
} else {
s - > frame_size = len ;
av_log ( avctx , AV_LOG_ERROR , " Error decoding frame, no sync byte at begin \n " ) ;
return - 1 ;
}
if ( buf_size < len ) {
av_log ( avctx , AV_LOG_ERROR , " Error decoding frame, not enough bytes \n " ) ;
return - 1 ;
}
/* update codec info */
avctx - > sample_rate = sample_rate ;
s - > channels = ac3_channels [ s - > flags & 7 ] ;
@ -194,18 +181,6 @@ static int a52_decode_frame(AVCodecContext *avctx,
avctx - > channels = s - > channels ;
}
avctx - > bit_rate = bit_rate ;
}
}
} else if ( len < s - > 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 ;
} else {
flags = s - > flags ;
if ( avctx - > channels = = 1 )
flags = A52_MONO ;
@ -214,25 +189,18 @@ static int a52_decode_frame(AVCodecContext *avctx,
else
flags | = A52_ADJUST_LEVEL ;
level = 1 ;
if ( s - > a52_frame ( s - > state , s - > in buf, & flags , & level , 384 ) ) {
if ( s - > a52_frame ( s - > state , buf , & flags , & level , 384 ) ) {
fail :
av_log ( avctx , AV_LOG_ERROR , " Error decoding frame \n " ) ;
s - > inbuf_ptr = s - > inbuf ;
s - > frame_size = 0 ;
continue ;
return - 1 ;
}
for ( i = 0 ; i < 6 ; i + + ) {
if ( s - > a52_block ( s - > state ) )
goto fail ;
float_to_int ( s - > samples , out_samples + i * 256 * avctx - > channels , avctx - > channels ) ;
}
s - > inbuf_ptr = s - > inbuf ;
s - > frame_size = 0 ;
* data_size = 6 * avctx - > channels * 256 * sizeof ( int16_t ) ;
break ;
}
}
return buf_ptr - buf ;
return len ;
}
static int a52_decode_end ( AVCodecContext * avctx )