[FFmpeg-devel] [PATCH 36/41] avcodec/mpegvideo: Move encoder-only base-arrays to MPVMainEncContext

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


Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/mpegvideo.h     | 10 --------
 libavcodec/mpegvideo_enc.c | 48 +++++++++++++++++++-------------------
 libavcodec/mpegvideoenc.h  | 11 +++++++++
 libavcodec/ratecontrol.c   |  4 ++--
 4 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index ed62175db5..201ca81621 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -203,14 +203,7 @@ typedef struct MPVContext {
     H263DSPContext h263dsp;
     int f_code;                 ///< forward MV resolution
     int b_code;                 ///< backward MV resolution for B-frames (MPEG-4)
-    int16_t (*p_mv_table_base)[2];
-    int16_t (*b_forw_mv_table_base)[2];
-    int16_t (*b_back_mv_table_base)[2];
-    int16_t (*b_bidir_forw_mv_table_base)[2];
-    int16_t (*b_bidir_back_mv_table_base)[2];
-    int16_t (*b_direct_mv_table_base)[2];
     int16_t (*p_field_mv_table_base)[2];
-    int16_t (*b_field_mv_table_base)[2];
     int16_t (*p_mv_table)[2];            ///< MV table (1MV per MB) P-frame encoding
     int16_t (*b_forw_mv_table)[2];       ///< MV table (1MV per MB) forward mode B-frame encoding
     int16_t (*b_back_mv_table)[2];       ///< MV table (1MV per MB) backward mode B-frame encoding
@@ -475,9 +468,6 @@ typedef struct MPVContext {
 
     int vbv_ignore_qmax;
 
-    /* temp buffers for rate control */
-    float *cplx_tab, *bits_tab;
-
     /* flag to indicate a reinitialization is required, e.g. after
      * a frame size change */
     int context_reinit;
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 0204b4dacd..892115b68f 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -821,26 +821,26 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
     /* Allocate MV tables; the MV and MB tables will be copied
      * to slice contexts by ff_update_duplicate_context().  */
     mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
-    if (!FF_ALLOCZ_TYPED_ARRAY(s->p_mv_table_base,            mv_table_size) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->b_forw_mv_table_base,       mv_table_size) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->b_back_mv_table_base,       mv_table_size) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->b_bidir_forw_mv_table_base, mv_table_size) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->b_bidir_back_mv_table_base, mv_table_size) ||
-        !FF_ALLOCZ_TYPED_ARRAY(s->b_direct_mv_table_base,     mv_table_size))
+    if (!FF_ALLOCZ_TYPED_ARRAY(m->p_mv_table_base,            mv_table_size) ||
+        !FF_ALLOCZ_TYPED_ARRAY(m->b_forw_mv_table_base,       mv_table_size) ||
+        !FF_ALLOCZ_TYPED_ARRAY(m->b_back_mv_table_base,       mv_table_size) ||
+        !FF_ALLOCZ_TYPED_ARRAY(m->b_bidir_forw_mv_table_base, mv_table_size) ||
+        !FF_ALLOCZ_TYPED_ARRAY(m->b_bidir_back_mv_table_base, mv_table_size) ||
+        !FF_ALLOCZ_TYPED_ARRAY(m->b_direct_mv_table_base,     mv_table_size))
         return AVERROR(ENOMEM);
-    s->p_mv_table            = s->p_mv_table_base + s->mb_stride + 1;
-    s->b_forw_mv_table       = s->b_forw_mv_table_base + s->mb_stride + 1;
-    s->b_back_mv_table       = s->b_back_mv_table_base + s->mb_stride + 1;
-    s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
-    s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base + s->mb_stride + 1;
-    s->b_direct_mv_table     = s->b_direct_mv_table_base + s->mb_stride + 1;
+    s->p_mv_table            = m->p_mv_table_base + s->mb_stride + 1;
+    s->b_forw_mv_table       = m->b_forw_mv_table_base + s->mb_stride + 1;
+    s->b_back_mv_table       = m->b_back_mv_table_base + s->mb_stride + 1;
+    s->b_bidir_forw_mv_table = m->b_bidir_forw_mv_table_base + s->mb_stride + 1;
+    s->b_bidir_back_mv_table = m->b_bidir_back_mv_table_base + s->mb_stride + 1;
+    s->b_direct_mv_table     = m->b_direct_mv_table_base + s->mb_stride + 1;
 
     /* Allocate MB type table */
     mb_array_size = s->mb_height * s->mb_stride;
     if (!FF_ALLOCZ_TYPED_ARRAY(s->mb_type,      mb_array_size) ||
         !FF_ALLOCZ_TYPED_ARRAY(s->lambda_table, mb_array_size) ||
-        !FF_ALLOC_TYPED_ARRAY (s->cplx_tab,     mb_array_size) ||
-        !FF_ALLOC_TYPED_ARRAY (s->bits_tab,     mb_array_size))
+        !FF_ALLOC_TYPED_ARRAY (m->cplx_tab,     mb_array_size) ||
+        !FF_ALLOC_TYPED_ARRAY (m->bits_tab,     mb_array_size))
         return AVERROR(ENOMEM);
 
 #define ALLOCZ_ARRAYS(p, mult, numb) ((p) = av_calloc(numb, mult * sizeof(*(p))))
@@ -848,7 +848,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
         (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) {
         int16_t (*tmp1)[2];
         uint8_t *tmp2;
-        if (!(tmp1 = ALLOCZ_ARRAYS(s->b_field_mv_table_base, 8, mv_table_size)) ||
+        if (!(tmp1 = ALLOCZ_ARRAYS(m->b_field_mv_table_base, 8, mv_table_size)) ||
             !(tmp2 = ALLOCZ_ARRAYS(s->b_field_select_table[0][0], 2 * 4, mv_table_size)) ||
             !ALLOCZ_ARRAYS(s->p_field_select_table[0], 2 * 2, mv_table_size))
             return AVERROR(ENOMEM);
@@ -993,21 +993,21 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
 
     av_freep(&avctx->stats_out);
 
-    av_freep(&s->p_mv_table_base);
-    av_freep(&s->b_forw_mv_table_base);
-    av_freep(&s->b_back_mv_table_base);
-    av_freep(&s->b_bidir_forw_mv_table_base);
-    av_freep(&s->b_bidir_back_mv_table_base);
-    av_freep(&s->b_direct_mv_table_base);
-    av_freep(&s->b_field_mv_table_base);
+    av_freep(&m->p_mv_table_base);
+    av_freep(&m->b_forw_mv_table_base);
+    av_freep(&m->b_back_mv_table_base);
+    av_freep(&m->b_bidir_forw_mv_table_base);
+    av_freep(&m->b_bidir_back_mv_table_base);
+    av_freep(&m->b_direct_mv_table_base);
+    av_freep(&m->b_field_mv_table_base);
     av_freep(&s->b_field_select_table[0][0]);
     av_freep(&s->p_field_select_table[0]);
 
     av_freep(&s->mb_type);
     av_freep(&s->lambda_table);
 
-    av_freep(&s->cplx_tab);
-    av_freep(&s->bits_tab);
+    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);
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index ada5935410..23381a31ca 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -82,11 +82,22 @@ typedef struct MPVMainEncContext {
 
     char *rc_eq;
 
+    /* temp buffers for rate control */
+    float *cplx_tab, *bits_tab;
+
     /* temporary frames used by b_frame_strategy == 2 */
     AVFrame *tmp_frames[MAX_B_FRAMES + 2];
     int b_frame_strategy;
     int b_sensitivity;
     int brd_scale;
+
+    int16_t (*p_mv_table_base)[2];
+    int16_t (*b_forw_mv_table_base)[2];
+    int16_t (*b_back_mv_table_base)[2];
+    int16_t (*b_bidir_forw_mv_table_base)[2];
+    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];
 } MPVMainEncContext;
 
 /* mpegvideo_enc common options */
diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c
index fa28e6d61d..bbaa9191a0 100644
--- a/libavcodec/ratecontrol.c
+++ b/libavcodec/ratecontrol.c
@@ -758,8 +758,8 @@ static void adaptive_quantization(MPVMainEncContext *m, double q)
     const float border_masking       = m->border_masking;
     float bits_sum                   = 0.0;
     float cplx_sum                   = 0.0;
-    float *cplx_tab                  = s->cplx_tab;
-    float *bits_tab                  = s->bits_tab;
+    float *cplx_tab                  = m->cplx_tab;
+    float *bits_tab                  = m->bits_tab;
     const int qmin                   = s->avctx->mb_lmin;
     const int qmax                   = s->avctx->mb_lmax;
     Picture *const pic               = &s->current_picture;
-- 
2.32.0



More information about the ffmpeg-devel mailing list