From bf4c6a05f69628bf22f5755c34c3fde9de5f482e Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Fri, 7 Mar 2025 14:15:02 +0100 Subject: [PATCH 9/9] avcodec/eamad: Don't store transient macroblock indices in context Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/eamad.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/libavcodec/eamad.c b/libavcodec/eamad.c index 41a133c424..44dac46083 100644 --- a/libavcodec/eamad.c +++ b/libavcodec/eamad.c @@ -58,8 +58,6 @@ typedef struct MadContext { unsigned int bitstream_buf_size; DECLARE_ALIGNED(32, int16_t, block)[64]; uint16_t quant_matrix[64]; - int mb_x; - int mb_y; } MadContext; static av_cold int decode_init(AVCodecContext *avctx) @@ -148,11 +146,8 @@ static inline int decode_block_intra(MadContext *s, int16_t * block) break; } else if (level != 0) { i += run; - if (i > 63) { - av_log(s->avctx, AV_LOG_ERROR, - "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); + if (i > 63) return -1; - } j = scantable[i]; level = (level*quant_matrix[j]) >> 4; level = (level-1)|1; @@ -165,11 +160,8 @@ static inline int decode_block_intra(MadContext *s, int16_t * block) run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); i += run; - if (i > 63) { - av_log(s->avctx, AV_LOG_ERROR, - "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); + if (i > 63) return -1; - } j = scantable[i]; if (level < 0) { level = -level; @@ -200,7 +192,7 @@ static int decode_motion(GetBitContext *gb) return value; } -static int decode_mb(MadContext *s, AVFrame *frame, int inter) +static int decode_mb(MadContext *s, AVFrame *frame, int inter, int mb_x, int mb_y) { int mv_map = 0; int av_uninit(mv_x), av_uninit(mv_y); @@ -219,12 +211,15 @@ static int decode_mb(MadContext *s, AVFrame *frame, int inter) if (mv_map & (1<<j)) { // mv_x and mv_y are guarded by mv_map int add = 2*decode_motion(&s->gb); if (s->last_frame->data[0]) - comp_block(s, frame, s->mb_x, s->mb_y, j, mv_x, mv_y, add); + comp_block(s, frame, mb_x, mb_y, j, mv_x, mv_y, add); } else { s->bdsp.clear_block(s->block); - if(decode_block_intra(s, s->block) < 0) + if (decode_block_intra(s, s->block) < 0) { + av_log(s->avctx, AV_LOG_ERROR, + "ac-tex damaged at %d %d\n", mb_x, mb_y); return -1; - idct_put(s, frame, s->block, s->mb_x, s->mb_y, j); + } + idct_put(s, frame, s->block, mb_x, mb_y, j); } } return 0; @@ -308,9 +303,9 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame, memset((uint8_t*)s->bitstream_buf + bytestream2_get_bytes_left(&gb), 0, AV_INPUT_BUFFER_PADDING_SIZE); init_get_bits(&s->gb, s->bitstream_buf, 8*(bytestream2_get_bytes_left(&gb))); - for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++) - for (s->mb_x=0; s->mb_x < (avctx->width +15)/16; s->mb_x++) - if(decode_mb(s, frame, inter) < 0) + for (int mb_y = 0; mb_y < (avctx->height + 15) / 16; mb_y++) + for (int mb_x = 0; mb_x < (avctx->width + 15) / 16; mb_x++) + if (decode_mb(s, frame, inter, mb_x, mb_y) < 0) return AVERROR_INVALIDDATA; *got_frame = 1; -- 2.45.2