mpegaudiodec_template: add ability to check CRC

A lot of files have CRC included.
The CRC only covers 34 bytes at most from the frame but it should still be
enough for some amount of error detection.
This commit is contained in:
Lynne 2019-03-06 17:04:04 +00:00
parent 1cc8eecd38
commit e69f407b52
No known key found for this signature in database
GPG Key ID: A2FEA5F03F034464
1 changed files with 17 additions and 3 deletions

View File

@ -27,6 +27,7 @@
#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/crc.h"
#include "libavutil/float_dsp.h"
#include "libavutil/libm.h"
#include "avcodec.h"
@ -1565,9 +1566,22 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples,
init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8);
/* skip error protection field */
if (s->error_protection)
skip_bits(&s->gb, 16);
if (s->error_protection) {
uint16_t crc = get_bits(&s->gb, 16);
if (s->err_recognition & AV_EF_CRCCHECK) {
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;
}
}
}
switch(s->layer) {
case 1: