You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +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:
@@ -27,6 +27,7 @@
|
|||||||
#include "libavutil/attributes.h"
|
#include "libavutil/attributes.h"
|
||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/channel_layout.h"
|
#include "libavutil/channel_layout.h"
|
||||||
|
#include "libavutil/crc.h"
|
||||||
#include "libavutil/float_dsp.h"
|
#include "libavutil/float_dsp.h"
|
||||||
#include "libavutil/libm.h"
|
#include "libavutil/libm.h"
|
||||||
#include "avcodec.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);
|
init_get_bits(&s->gb, buf + HEADER_SIZE, (buf_size - HEADER_SIZE) * 8);
|
||||||
|
|
||||||
/* skip error protection field */
|
if (s->error_protection) {
|
||||||
if (s->error_protection)
|
uint16_t crc = get_bits(&s->gb, 16);
|
||||||
skip_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) {
|
switch(s->layer) {
|
||||||
case 1:
|
case 1:
|
||||||
|
Reference in New Issue
Block a user