diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-04-20 14:47:24 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-04-20 15:37:23 +0200 |
commit | d7a4c43f1830a23f8acd71bea567f7908a99a539 (patch) | |
tree | b64cef538736abc332c9103b597912142d85007d /libavcodec/ffv1.c | |
parent | 975025488518129dcf157f9bb44001b1d7e462a9 (diff) | |
download | ffmpeg-d7a4c43f1830a23f8acd71bea567f7908a99a539.tar.gz |
ffv1: Add a CRC check to the global header with version 1.3
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/ffv1.c')
-rw-r--r-- | libavcodec/ffv1.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index 0a9147a0f4..860c00707b 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -35,6 +35,7 @@ #include "mathops.h" #include "libavutil/pixdesc.h" #include "libavutil/avassert.h" +#include "libavutil/crc.h" #ifdef __INTEL_COMPILER #undef av_flatten @@ -775,6 +776,7 @@ static int write_extra_header(FFV1Context *f){ uint8_t state[CONTEXT_SIZE]; int i, j, k; uint8_t state2[32][CONTEXT_SIZE]; + unsigned v; memset(state2, 128, sizeof(state2)); memset(state, 128, sizeof(state)); @@ -823,6 +825,9 @@ static int write_extra_header(FFV1Context *f){ } f->avctx->extradata_size= ff_rac_terminate(c); + v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size); + AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v); + f->avctx->extradata_size += 4; return 0; } @@ -1613,6 +1618,15 @@ static int read_extra_header(FFV1Context *f){ } } + if(f->version > 2){ + unsigned v; + v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size); + if(v){ + av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!\n", v); + return AVERROR_INVALIDDATA; + } + } + return 0; } @@ -1767,7 +1781,6 @@ static int read_header(FFV1Context *f){ p->context_count= context_count; } } - return 0; } |