diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-02-10 18:51:57 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-10 15:54:08 -0500 |
commit | c388558d317f6bf8718ec3d22f4bf3540109dfe3 (patch) | |
tree | 404fb30ce32b1b6ef2aaee7456ccaa5145ad4e39 | |
parent | eeb9e61a518f6b3a1a85dd44e44d55e395e015f6 (diff) | |
download | ffmpeg-c388558d317f6bf8718ec3d22f4bf3540109dfe3.tar.gz |
wavpack: allow user to disable CRC checking
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Justin Ruggles <justin.ruggles@gmail.com>
-rw-r--r-- | libavcodec/wavpack.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 1098873d7c..31604f51fc 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -500,6 +500,21 @@ static void wv_reset_saved_context(WavpackFrameContext *s) s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF; } +static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc, + uint32_t crc_extra_bits) +{ + if (crc != s->CRC) { + av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); + return AVERROR_INVALIDDATA; + } + if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) { + av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); + return AVERROR_INVALIDDATA; + } + + return 0; +} + static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type) { @@ -610,14 +625,9 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, } while (!last && count < s->samples); wv_reset_saved_context(s); - if (crc != s->CRC) { - av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); - return -1; - } - if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) { - av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); - return -1; - } + if ((s->avctx->err_recognition & AV_EF_CRCCHECK) && + wv_check_crc(s, crc, crc_extra_bits)) + return AVERROR_INVALIDDATA; return count * 2; } @@ -680,14 +690,9 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, } while (!last && count < s->samples); wv_reset_saved_context(s); - if (crc != s->CRC) { - av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); - return -1; - } - if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) { - av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); - return -1; - } + if ((s->avctx->err_recognition & AV_EF_CRCCHECK) && + wv_check_crc(s, crc, crc_extra_bits)) + return AVERROR_INVALIDDATA; return count; } |