From 24b7f2a2d10d2e62b54bd2cea97fe29492cced75 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Mon, 3 Mar 2025 18:28:13 +0100
Subject: [PATCH 15/77] avcodec/mpeg12enc: Merge ff_mpeg1_encode_init() into
 ordinary init

Everything except setting the dc_scale_tables can be done
before calling ff_mpv_encode_init(); setting the dc_scale_tables
unfortunately still has to be performed via a (now inlined)
callback performed by ff_mpv_encode_init() as it relies
on intra_dc_precision having been sanitized.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/mpeg12enc.c | 58 +++++++++++++++++++-----------------------
 libavcodec/mpeg12enc.h |  9 ++++++-
 2 files changed, 34 insertions(+), 33 deletions(-)

diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index 730e0411c7..c1e6cc84db 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -46,7 +46,6 @@
 #include "mpeg12vlc.h"
 #include "mpegutils.h"
 #include "mpegvideo.h"
-#include "mpegvideodata.h"
 #include "mpegvideoenc.h"
 #include "profiles.h"
 #include "rl.h"
@@ -1000,36 +999,6 @@ static av_cold void mpeg12_encode_init_static(void)
             fcode_tab[mv + MAX_MV] = f_code;
 }
 
-av_cold void ff_mpeg1_encode_init(MpegEncContext *s)
-{
-    static AVOnce init_static_once = AV_ONCE_INIT;
-
-    s->y_dc_scale_table =
-    s->c_dc_scale_table = ff_mpeg12_dc_scale_table[s->intra_dc_precision];
-
-    s->me.mv_penalty = mv_penalty;
-    s->fcode_tab     = fcode_tab + MAX_MV;
-    if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
-        s->min_qcoeff = -255;
-        s->max_qcoeff = 255;
-    } else {
-        s->min_qcoeff = -2047;
-        s->max_qcoeff = 2047;
-        s->mpeg_quant = 1;
-    }
-    if (s->intra_vlc_format) {
-        s->intra_ac_vlc_length      =
-        s->intra_ac_vlc_last_length = uni_mpeg2_ac_vlc_len;
-    } else {
-        s->intra_ac_vlc_length      =
-        s->intra_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
-    }
-    s->inter_ac_vlc_length      =
-    s->inter_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
-
-    ff_thread_once(&init_static_once, mpeg12_encode_init_static);
-}
-
 static av_cold int find_frame_rate_index(AVCodecContext *avctx, MPEG12EncContext *mpeg12)
 {
     AVRational bestq = (AVRational) {0, 0};
@@ -1070,7 +1039,10 @@ static av_cold int find_frame_rate_index(AVCodecContext *avctx, MPEG12EncContext
 
 static av_cold int encode_init(AVCodecContext *avctx)
 {
+    static AVOnce init_static_once = AV_ONCE_INIT;
     MPEG12EncContext *const mpeg12 = avctx->priv_data;
+    MPVMainEncContext *const m = &mpeg12->mpeg;
+    MpegEncContext    *const s = &m->s;
     int ret;
     int max_size = avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO ? 16383 : 4095;
 
@@ -1093,7 +1065,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
         }
     }
 
-    if (mpeg12->mpeg.s.q_scale_type == 1) {
+    if (s->q_scale_type == 1) {
         if (avctx->qmax > 28) {
             av_log(avctx, AV_LOG_ERROR,
                    "non linear quant only supports qmax <= 28 currently\n");
@@ -1132,6 +1104,26 @@ static av_cold int encode_init(AVCodecContext *avctx)
         }
     }
 
+    s->me.mv_penalty = mv_penalty;
+    s->fcode_tab     = fcode_tab + MAX_MV;
+    if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
+        s->min_qcoeff = -255;
+        s->max_qcoeff = 255;
+    } else {
+        s->min_qcoeff = -2047;
+        s->max_qcoeff = 2047;
+        s->mpeg_quant = 1;
+    }
+    if (s->intra_vlc_format) {
+        s->intra_ac_vlc_length      =
+        s->intra_ac_vlc_last_length = uni_mpeg2_ac_vlc_len;
+    } else {
+        s->intra_ac_vlc_length      =
+        s->intra_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
+    }
+    s->inter_ac_vlc_length      =
+    s->inter_ac_vlc_last_length = uni_mpeg1_ac_vlc_len;
+
     ret = ff_mpv_encode_init(avctx);
     if (ret < 0)
         return ret;
@@ -1176,6 +1168,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
         mpeg12->timecode_frame_start = 0; // default is -1
     }
 
+    ff_thread_once(&init_static_once, mpeg12_encode_init_static);
+
     return 0;
 }
 
diff --git a/libavcodec/mpeg12enc.h b/libavcodec/mpeg12enc.h
index 0b35af8a30..908971905d 100644
--- a/libavcodec/mpeg12enc.h
+++ b/libavcodec/mpeg12enc.h
@@ -25,11 +25,18 @@
 #include <stdint.h>
 
 #include "mpegvideo.h"
+#include "mpegvideodata.h"
 
 void ff_mpeg1_encode_picture_header(MpegEncContext *s);
 void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64],
                         int motion_x, int motion_y);
-void ff_mpeg1_encode_init(MpegEncContext *s);
 void ff_mpeg1_encode_slice_header(MpegEncContext *s);
 
+// Must not be called before intra_dc_precision has been sanitized in ff_mpv_encode_init()
+static inline void ff_mpeg1_encode_init(MpegEncContext *s)
+{
+    s->y_dc_scale_table =
+    s->c_dc_scale_table = ff_mpeg12_dc_scale_table[s->intra_dc_precision];
+}
+
 #endif /* AVCODEC_MPEG12ENC_H */
-- 
2.45.2