MPADSPContext mpadsp;
AVFloatDSPContext *fdsp;
AVFrame *frame;
+ uint32_t crc;
} MPADecodeContext;
#define HEADER_SIZE 4
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;
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,
}
}
+ 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++) {
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);
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++) {
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: