From 101ed72c2f330163a2e25377b1725cc34852315d Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Fri, 3 May 2024 18:04:49 +0200 Subject: [PATCH] avcodec/h263, mpeg(picture|video): Only allocate mbskip_table for MPEG-4 It is the only user of said table and doing so is especially important given that this buffer is zeroed every time. Signed-off-by: Andreas Rheinhardt --- libavcodec/h263.c | 3 ++- libavcodec/mpegpicture.c | 3 ++- libavcodec/mpegvideo.c | 19 +++++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 3edf810bcc..b4cf5ee0de 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -56,7 +56,8 @@ void ff_h263_update_motion_val(MpegEncContext * s){ const int wrap = s->b8_stride; const int xy = s->block_index[0]; - s->current_picture.mbskip_table[mb_xy] = s->mb_skipped; + if (s->current_picture.mbskip_table) + s->current_picture.mbskip_table[mb_xy] = s->mb_skipped; if(s->mv_type != MV_TYPE_8X8){ int motion_x, motion_y; diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c index ad6157f0c1..ca265da9fc 100644 --- a/libavcodec/mpegpicture.c +++ b/libavcodec/mpegpicture.c @@ -138,10 +138,11 @@ static int alloc_picture_tables(BufferPoolContext *pools, Picture *pic, if (!pic->name ## buf_suffix idx_suffix) \ return AVERROR(ENOMEM); \ } while (0) - GET_BUFFER(mbskip_table,,); GET_BUFFER(qscale_table, _base,); GET_BUFFER(mb_type, _base,); if (pools->motion_val_pool) { + if (pools->mbskip_table_pool) + GET_BUFFER(mbskip_table,,); for (int i = 0; i < 2; i++) { GET_BUFFER(ref_index,, [i]); GET_BUFFER(motion_val, _base, [i]); diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index eab4451e1e..5c6ec7db55 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -594,6 +594,12 @@ int ff_mpv_init_context_frame(MpegEncContext *s) s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed? +#define ALLOC_POOL(name, size, flags) do { \ + pools->name ##_pool = ff_refstruct_pool_alloc((size), (flags)); \ + if (!pools->name ##_pool) \ + return AVERROR(ENOMEM); \ +} while (0) + if (s->codec_id == AV_CODEC_ID_MPEG4 || (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) { /* interlaced direct mode decoding tables */ @@ -608,12 +614,16 @@ int ff_mpv_init_context_frame(MpegEncContext *s) tmp += mv_table_size; } } - if (s->codec_id == AV_CODEC_ID_MPEG4 && !s->encoding) { + if (s->codec_id == AV_CODEC_ID_MPEG4) { + ALLOC_POOL(mbskip_table, mb_array_size + 2, + FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME); + if (!s->encoding) { /* cbp, pred_dir */ if (!(s->cbp_table = av_mallocz(mb_array_size)) || !(s->pred_dir_table = av_mallocz(mb_array_size))) return AVERROR(ENOMEM); } + } } if (s->msmpeg4_version >= 3) { @@ -642,13 +652,6 @@ int ff_mpv_init_context_frame(MpegEncContext *s) return AVERROR(ENOMEM); memset(s->mbintra_table, 1, mb_array_size); -#define ALLOC_POOL(name, size, flags) do { \ - pools->name ##_pool = ff_refstruct_pool_alloc((size), (flags)); \ - if (!pools->name ##_pool) \ - return AVERROR(ENOMEM); \ -} while (0) - - ALLOC_POOL(mbskip_table, mb_array_size + 2, FF_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME); ALLOC_POOL(qscale_table, mv_table_size, 0); ALLOC_POOL(mb_type, mv_table_size * sizeof(uint32_t), 0);