From ef6b85e9b82513df0a38b1065784d20451ecb2a1 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 10 Oct 2013 12:39:23 +0200 Subject: avcodec/proresdec2: propagate error codes Based-on: 44690dfa683f620c77e9f0e8e9bc5682608636b1 Signed-off-by: Michael Niedermayer --- libavcodec/proresdec2.c | 57 +++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 21 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/proresdec2.c b/libavcodec/proresdec2.c index 3fee85a5d7..b1affadaac 100644 --- a/libavcodec/proresdec2.c +++ b/libavcodec/proresdec2.c @@ -310,8 +310,8 @@ static av_always_inline void decode_dc_coeffs(GetBitContext *gb, int16_t *out, static const uint8_t run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C }; static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C }; -static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb, - int16_t *out, int blocks_per_slice) +static av_always_inline int decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb, + int16_t *out, int blocks_per_slice) { ProresContext *ctx = avctx->priv_data; int block_mask, sign; @@ -336,7 +336,7 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte pos += run + 1; if (pos >= max_coeffs) { av_log(avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", pos, max_coeffs); - return; + return AVERROR_INVALIDDATA; } DECODE_CODEWORD(level, lev_to_cb[FFMIN(level, 9)]); @@ -350,18 +350,20 @@ static av_always_inline void decode_ac_coeffs(AVCodecContext *avctx, GetBitConte } CLOSE_READER(re, gb); + return 0; } -static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, - uint16_t *dst, int dst_stride, - const uint8_t *buf, unsigned buf_size, - const int16_t *qmat) +static int decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, + uint16_t *dst, int dst_stride, + const uint8_t *buf, unsigned buf_size, + const int16_t *qmat) { ProresContext *ctx = avctx->priv_data; LOCAL_ALIGNED_16(int16_t, blocks, [8*4*64]); int16_t *block; GetBitContext gb; int i, blocks_per_slice = slice->mb_count<<2; + int ret; for (i = 0; i < blocks_per_slice; i++) ctx->dsp.clear_block(blocks+(i<<6)); @@ -369,7 +371,8 @@ static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, init_get_bits(&gb, buf, buf_size << 3); decode_dc_coeffs(&gb, blocks, blocks_per_slice); - decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice); + if ((ret = decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice)) < 0) + return ret; block = blocks; for (i = 0; i < slice->mb_count; i++) { @@ -380,18 +383,20 @@ static void decode_slice_luma(AVCodecContext *avctx, SliceContext *slice, block += 4*64; dst += 16; } + return 0; } -static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, - uint16_t *dst, int dst_stride, - const uint8_t *buf, unsigned buf_size, - const int16_t *qmat, int log2_blocks_per_mb) +static int decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, + uint16_t *dst, int dst_stride, + const uint8_t *buf, unsigned buf_size, + const int16_t *qmat, int log2_blocks_per_mb) { ProresContext *ctx = avctx->priv_data; LOCAL_ALIGNED_16(int16_t, blocks, [8*4*64]); int16_t *block; GetBitContext gb; int i, j, blocks_per_slice = slice->mb_count << log2_blocks_per_mb; + int ret; for (i = 0; i < blocks_per_slice; i++) ctx->dsp.clear_block(blocks+(i<<6)); @@ -399,7 +404,8 @@ static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, init_get_bits(&gb, buf, buf_size << 3); decode_dc_coeffs(&gb, blocks, blocks_per_slice); - decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice); + if ((ret = decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice)) < 0) + return ret; block = blocks; for (i = 0; i < slice->mb_count; i++) { @@ -410,6 +416,7 @@ static void decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice, dst += 8; } } + return 0; } static void unpack_alpha(GetBitContext *gb, uint16_t *dst, int num_coeffs, @@ -502,6 +509,7 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int int16_t qmat_luma_scaled[64]; int16_t qmat_chroma_scaled[64]; int mb_x_shift; + int ret; slice->ret = -1; //av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n", @@ -559,16 +567,23 @@ static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int dest_a += pic->linesize[3]; } - decode_slice_luma(avctx, slice, (uint16_t*)dest_y, luma_stride, - buf, y_data_size, qmat_luma_scaled); + ret = decode_slice_luma(avctx, slice, (uint16_t*)dest_y, luma_stride, + buf, y_data_size, qmat_luma_scaled); + if (ret < 0) + return ret; if (!(avctx->flags & CODEC_FLAG_GRAY)) { - decode_slice_chroma(avctx, slice, (uint16_t*)dest_u, chroma_stride, - buf + y_data_size, u_data_size, - qmat_chroma_scaled, log2_chroma_blocks_per_mb); - decode_slice_chroma(avctx, slice, (uint16_t*)dest_v, chroma_stride, - buf + y_data_size + u_data_size, v_data_size, - qmat_chroma_scaled, log2_chroma_blocks_per_mb); + ret = decode_slice_chroma(avctx, slice, (uint16_t*)dest_u, chroma_stride, + buf + y_data_size, u_data_size, + qmat_chroma_scaled, log2_chroma_blocks_per_mb); + if (ret < 0) + return ret; + + ret = decode_slice_chroma(avctx, slice, (uint16_t*)dest_v, chroma_stride, + buf + y_data_size + u_data_size, v_data_size, + qmat_chroma_scaled, log2_chroma_blocks_per_mb); + if (ret < 0) + return ret; } /* decode alpha plane if available */ if (ctx->alpha_info && pic->data[3] && a_data_size) -- cgit v1.2.3