[FFmpeg-devel] [PATCH 38/41] avcodec/mpegvideo_enc: Avoid allocations for q_int(er|ra)_matrix tables

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sun Jan 30 08:27:46 EET 2022


Do this by making them part of an MPVMainEncContext; the MPVEncContexts
still retain their pointers to access them.
(These tables are quite big, so that putting them in the MpegEncContext
would have been very wasteful for all the decoders using said structure.
But this is no longer a problem: MPVMainEncContext is only used by
encoders and allows to directly share the tables when slice-threading
is in use.)

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/mpegvideo_enc.c | 24 ++++++++----------------
 libavcodec/mpegvideoenc.h  |  7 +++++++
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 7b55e9c17d..01ed41a2e7 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -869,12 +869,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
     }
 
     if (!(avctx->stats_out = av_mallocz(256))               ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_intra_matrix,          32) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_chroma_intra_matrix,   32) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_inter_matrix,          32) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_intra_matrix16,        32) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_chroma_intra_matrix16, 32) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->q_inter_matrix16,        32) ||
         !FF_ALLOCZ_TYPED_ARRAY(s->reordered_input_picture, MAX_PICTURE_COUNT))
         return AVERROR(ENOMEM);
 
@@ -936,6 +930,11 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
             s->inter_matrix[j] = avctx->inter_matrix[i];
     }
 
+    s->q_inter_matrix   = m->q_inter_matrix;
+    s->q_intra_matrix   = m->q_intra_matrix;
+    s->q_inter_matrix16 = m->q_inter_matrix16;
+    s->q_intra_matrix16 = m->q_intra_matrix16;
+
     /* precompute matrix */
     /* for mjpeg, we do include qscale in the matrix */
     if (s->out_format != FMT_MJPEG) {
@@ -945,10 +944,11 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
         ff_convert_matrix(s, s->q_inter_matrix, s->q_inter_matrix16,
                           s->inter_matrix, s->inter_quant_bias, avctx->qmin,
                           31, 0);
-        av_freep(&s->q_chroma_intra_matrix);
-        av_freep(&s->q_chroma_intra_matrix16);
         s->q_chroma_intra_matrix   = s->q_intra_matrix;
         s->q_chroma_intra_matrix16 = s->q_intra_matrix16;
+    } else {
+        s->q_chroma_intra_matrix   = m->q_chroma_intra_matrix;
+        s->q_chroma_intra_matrix16 = m->q_chroma_intra_matrix16;
     }
 
     if ((ret = ff_rate_control_init(m)) < 0)
@@ -1013,14 +1013,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
     av_freep(&m->cplx_tab);
     av_freep(&m->bits_tab);
 
-    if(s->q_chroma_intra_matrix   != s->q_intra_matrix  ) av_freep(&s->q_chroma_intra_matrix);
-    if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
-    s->q_chroma_intra_matrix=   NULL;
-    s->q_chroma_intra_matrix16= NULL;
-    av_freep(&s->q_intra_matrix);
-    av_freep(&s->q_inter_matrix);
-    av_freep(&s->q_intra_matrix16);
-    av_freep(&s->q_inter_matrix16);
     av_freep(&s->reordered_input_picture);
     av_freep(&s->dct_offset);
 
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index 23381a31ca..bc69c6ea53 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -98,6 +98,13 @@ typedef struct MPVMainEncContext {
     int16_t (*b_bidir_back_mv_table_base)[2];
     int16_t (*b_direct_mv_table_base)[2];
     int16_t (*b_field_mv_table_base)[2];
+
+    int q_inter_matrix[32][64];
+    int q_intra_matrix[32][64];
+    int q_chroma_intra_matrix[32][64];
+    uint16_t q_inter_matrix16[32][2][64];
+    uint16_t q_intra_matrix16[32][2][64];
+    uint16_t q_chroma_intra_matrix16[32][2][64];
 } MPVMainEncContext;
 
 /* mpegvideo_enc common options */
-- 
2.32.0



More information about the ffmpeg-devel mailing list