[FFmpeg-cvslog] avcodec/mpegvideo_enc: Don't allocate B-frame bufs without B frames

Andreas Rheinhardt git at videolan.org
Wed Mar 26 06:10:15 EET 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sun Mar 16 09:18:41 2025 +0100| [9f43de06faa58d3863a12b64898dde930580b4cf] | committer: Andreas Rheinhardt

avcodec/mpegvideo_enc: Don't allocate B-frame bufs without B frames

(Checking in the same way for intra_only is not straightforward,
because at least p_mv_table is written to even in intra_only
mode.)

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9f43de06faa58d3863a12b64898dde930580b4cf
---

 libavcodec/mpegvideo_enc.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 2331bbbb06..680ce7d153 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -439,7 +439,7 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
                   "Need checks for potential overflow.");
     unsigned nb_slices = s->slice_context_count, mv_table_size;
     char *dct_error = NULL, *me_map;
-    int nb_mv_tables = 6;
+    int has_b_frames = !!m->max_b_frames, nb_mv_tables = 1 + 5 * has_b_frames;
     int16_t (*mv_table)[2];
 
     if (s->noise_reduction) {
@@ -458,8 +458,8 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
     mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
     if (s->codec_id == AV_CODEC_ID_MPEG4 ||
         (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
-        nb_mv_tables += 8;
-        if (!ALLOCZ_ARRAYS(s->p_field_select_table[0], 2 * (2 + 4), mv_table_size))
+        nb_mv_tables += 8 * has_b_frames;
+        if (!ALLOCZ_ARRAYS(s->p_field_select_table[0], 2 * (2 + 4 * has_b_frames), mv_table_size))
             return AVERROR(ENOMEM);
     }
 
@@ -482,17 +482,20 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
         me_map          += ME_MAP_ALLOC_SIZE;
 
         s2->p_mv_table            = tmp_mv_table;
+        if (has_b_frames) {
         s2->b_forw_mv_table       = tmp_mv_table += mv_table_size;
         s2->b_back_mv_table       = tmp_mv_table += mv_table_size;
         s2->b_bidir_forw_mv_table = tmp_mv_table += mv_table_size;
         s2->b_bidir_back_mv_table = tmp_mv_table += mv_table_size;
         s2->b_direct_mv_table     = tmp_mv_table += mv_table_size;
+        }
 
         if (s->p_field_select_table[0]) { // MPEG-4 or INTERLACED_ME above
             uint8_t *field_select = s->p_field_select_table[0];
             s2->p_field_select_table[0] = field_select;
             s2->p_field_select_table[1] = field_select += 2 * mv_table_size;
 
+            if (has_b_frames) {
             for (int j = 0; j < 2; j++) {
                 for (int k = 0; k < 2; k++) {
                     for (int l = 0; l < 2; l++)
@@ -500,6 +503,7 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
                     s2->b_field_select_table[j][k] = field_select += 2 * mv_table_size;
                 }
             }
+            }
         }
     }
 



More information about the ffmpeg-cvslog mailing list