[FFmpeg-cvslog] avcodec/eamad: Don't store transient macroblock indices in context
Andreas Rheinhardt
git at videolan.org
Sun Mar 16 05:31:11 EET 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Fri Mar 7 14:15:02 2025 +0100| [b5be0c0aa9566448756ada8e3064904c225b0a1d] | committer: Andreas Rheinhardt
avcodec/eamad: Don't store transient macroblock indices in context
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b5be0c0aa9566448756ada8e3064904c225b0a1d
---
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;
More information about the ffmpeg-cvslog
mailing list