diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c index 3ae73d3c8d..7f0088161a 100644 --- a/libavcodec/mpegaudiodec_template.c +++ b/libavcodec/mpegaudiodec_template.c @@ -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: