@ -89,6 +89,7 @@ typedef struct MPADecodeContext {
MPADSPContext mpadsp ;
AVFloatDSPContext * fdsp ;
AVFrame * frame ;
uint32_t crc ;
} MPADecodeContext ;
# define HEADER_SIZE 4
@ -500,12 +501,43 @@ static void imdct12(INTFLOAT *out, SUINTFLOAT *in)
out [ 11 ] = in0 + in5 ;
}
static int handle_crc ( MPADecodeContext * s , int sec_len )
{
if ( s - > error_protection & & ( s - > err_recognition & AV_EF_CRCCHECK ) ) {
const uint8_t * buf = s - > gb . buffer - HEADER_SIZE ;
int sec_byte_len = sec_len > > 3 ;
int sec_rem_bits = sec_len & 7 ;
const AVCRC * crc_tab = av_crc_get_table ( AV_CRC_16_ANSI ) ;
uint8_t tmp_buf [ 4 ] ;
uint32_t crc_val = av_crc ( crc_tab , UINT16_MAX , & buf [ 2 ] , 2 ) ;
crc_val = av_crc ( crc_tab , crc_val , & buf [ 6 ] , sec_byte_len ) ;
AV_WB32 ( tmp_buf ,
( ( buf [ 6 + sec_byte_len ] & ( 0xFF00 > > sec_rem_bits ) ) < < 24 ) +
( ( s - > crc < < 16 ) > > sec_rem_bits ) ) ;
crc_val = av_crc ( crc_tab , crc_val , tmp_buf , 3 ) ;
if ( crc_val ) {
av_log ( s - > avctx , AV_LOG_ERROR , " CRC mismatch %X! \n " , crc_val ) ;
if ( s - > err_recognition & AV_EF_EXPLODE )
return AVERROR_INVALIDDATA ;
}
}
return 0 ;
}
/* return the number of decoded frames */
static int mp_decode_layer1 ( MPADecodeContext * s )
{
int bound , i , v , n , ch , j , mant ;
uint8_t allocation [ MPA_MAX_CHANNELS ] [ SBLIMIT ] ;
uint8_t scale_factors [ MPA_MAX_CHANNELS ] [ SBLIMIT ] ;
int ret ;
ret = handle_crc ( s , ( s - > nb_channels = = 1 ) ? 8 * 16 : 8 * 32 ) ;
if ( ret < 0 )
return ret ;
if ( s - > mode = = MPA_JSTEREO )
bound = ( s - > mode_ext + 1 ) * 4 ;
@ -575,6 +607,7 @@ static int mp_decode_layer2(MPADecodeContext *s)
unsigned char scale_code [ MPA_MAX_CHANNELS ] [ SBLIMIT ] ;
unsigned char scale_factors [ MPA_MAX_CHANNELS ] [ SBLIMIT ] [ 3 ] , * sf ;
int scale , qindex , bits , steps , k , l , m , b ;
int ret ;
/* select decoding table */
table = ff_mpa_l2_select_table ( s - > bit_rate / 1000 , s - > nb_channels ,
@ -617,6 +650,10 @@ static int mp_decode_layer2(MPADecodeContext *s)
}
}
ret = handle_crc ( s , get_bits_count ( & s - > gb ) - 16 ) ;
if ( ret < 0 )
return ret ;
/* scale factors */
for ( i = 0 ; i < sblimit ; i + + ) {
for ( ch = 0 ; ch < s - > nb_channels ; ch + + ) {
@ -1310,13 +1347,16 @@ static int mp_decode_layer3(MPADecodeContext *s)
int gr , ch , blocksplit_flag , i , j , k , n , bits_pos ;
GranuleDef * g ;
int16_t exponents [ 576 ] ; //FIXME try INTFLOAT
int ret ;
/* read side info */
if ( s - > lsf ) {
ret = handle_crc ( s , ( ( s - > nb_channels = = 1 ) ? 8 * 9 : 8 * 17 ) ) ;
main_data_begin = get_bits ( & s - > gb , 8 ) ;
skip_bits ( & s - > gb , s - > nb_channels ) ;
nb_granules = 1 ;
} else {
ret = handle_crc ( s , ( ( s - > nb_channels = = 1 ) ? 8 * 17 : 8 * 32 ) ) ;
main_data_begin = get_bits ( & s - > gb , 9 ) ;
if ( s - > nb_channels = = 2 )
skip_bits ( & s - > gb , 3 ) ;
@ -1328,6 +1368,8 @@ static int mp_decode_layer3(MPADecodeContext *s)
s - > granules [ ch ] [ 1 ] . scfsi = get_bits ( & s - > gb , 4 ) ;
}
}
if ( ret < 0 )
return ret ;
for ( gr = 0 ; gr < nb_granules ; gr + + ) {
for ( ch = 0 ; ch < s - > nb_channels ; ch + + ) {
@ -1565,23 +1607,8 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples,
OUT_INT * samples_ptr ;
init_get_bits ( & s - > gb , buf + HEADER_SIZE , ( buf_size - HEADER_SIZE ) * 8 ) ;
if ( s - > error_protection ) {
uint16_t crc = get_bits ( & s - > gb , 16 ) ;
if ( s - > err_recognition & AV_EF_CRCCHECK & & s - > layer = = 3 ) {
const int sec_len = s - > lsf ? ( ( s - > nb_channels = = 1 ) ? 9 : 17 ) :
( ( s - > nb_channels = = 1 ) ? 17 : 32 ) ;
const AVCRC * crc_tab = av_crc_get_table ( AV_CRC_16_ANSI ) ;
uint32_t crc_cal = av_crc ( crc_tab , UINT16_MAX , & buf [ 2 ] , 2 ) ;
crc_cal = av_crc ( crc_tab , crc_cal , & buf [ 6 ] , sec_len ) ;
if ( av_bswap16 ( crc ) ^ crc_cal ) {
av_log ( s - > avctx , AV_LOG_ERROR , " CRC mismatch! \n " ) ;
if ( s - > err_recognition & AV_EF_EXPLODE )
return AVERROR_INVALIDDATA ;
}
}
}
if ( s - > error_protection )
s - > crc = get_bits ( & s - > gb , 16 ) ;
switch ( s - > layer ) {
case 1 :