mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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:
parent
1cc8eecd38
commit
e69f407b52
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user