From 100d33b5ec28f4535cbcc00061807f1095433c5e Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Wed, 19 Mar 2025 12:50:06 +0100
Subject: [PATCH 65/77] avcodec/mpegvideo_enc: Move lambda, lambda2 to
 MPVEncContext

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/h263enc.h       |  2 +-
 libavcodec/motion_est.c    | 24 +++++++++++-----------
 libavcodec/mpeg4videoenc.c |  2 +-
 libavcodec/mpegvideo.h     |  2 --
 libavcodec/mpegvideo_enc.c | 42 ++++++++++++++++++++------------------
 libavcodec/mpegvideoenc.h  |  2 ++
 libavcodec/snowenc.c       |  6 +++---
 libavcodec/svq1enc.c       |  6 +++---
 8 files changed, 44 insertions(+), 42 deletions(-)

diff --git a/libavcodec/h263enc.h b/libavcodec/h263enc.h
index 1f459a332c..63af3a576f 100644
--- a/libavcodec/h263enc.h
+++ b/libavcodec/h263enc.h
@@ -52,7 +52,7 @@ static inline int get_p_cbp(MPVEncContext *const s,
         int best_cbpc_score = INT_MAX;
         int cbpc = (-1), cbpy = (-1);
         const int offset = (s->c.mv_type == MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
-        const int lambda = s->c.lambda2 >> (FF_LAMBDA_SHIFT - 6);
+        const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
 
         for (int i = 0; i < 4; i++) {
             int score = ff_h263_inter_MCBPC_bits[i + offset] * lambda;
diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c
index 923bf5687b..b2b888237b 100644
--- a/libavcodec/motion_est.c
+++ b/libavcodec/motion_est.c
@@ -902,9 +902,9 @@ void ff_estimate_p_frame_motion(MPVEncContext *const s,
     av_assert0(s->c.linesize == c->stride);
     av_assert0(s->c.uvlinesize == c->uvstride);
 
-    c->penalty_factor     = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->me_cmp);
-    c->sub_penalty_factor = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->me_sub_cmp);
-    c->mb_penalty_factor  = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->mb_cmp);
+    c->penalty_factor     = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
+    c->sub_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
+    c->mb_penalty_factor  = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
     c->current_mv_penalty = c->mv_penalty[s->c.f_code] + MAX_DMV;
 
     get_limits(s, 16*mb_x, 16*mb_y, 0);
@@ -968,14 +968,14 @@ void ff_estimate_p_frame_motion(MPVEncContext *const s,
     c->mc_mb_var_sum_temp += (vard+128)>>8;
 
     if (c->avctx->mb_decision > FF_MB_DECISION_SIMPLE) {
-        int p_score = FFMIN(vard, varc - 500 + (s->c.lambda2 >> FF_LAMBDA_SHIFT)*100);
-        int i_score = varc - 500 + (s->c.lambda2 >> FF_LAMBDA_SHIFT)*20;
+        int p_score = FFMIN(vard, varc - 500 + (s->lambda2 >> FF_LAMBDA_SHIFT)*100);
+        int i_score = varc - 500 + (s->lambda2 >> FF_LAMBDA_SHIFT)*20;
         c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
 
         if (vard*2 + 200*256 > varc && !s->intra_penalty)
             mb_type|= CANDIDATE_MB_TYPE_INTRA;
         if (varc*2 + 200*256 > vard || s->c.qscale > 24){
-//        if (varc*2 + 200*256 + 50*(s->c.lambda2>>FF_LAMBDA_SHIFT) > vard){
+//        if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){
             mb_type|= CANDIDATE_MB_TYPE_INTER;
             c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16);
             if (s->mpv_flags & FF_MPV_FLAG_MV0)
@@ -1050,8 +1050,8 @@ void ff_estimate_p_frame_motion(MPVEncContext *const s,
             s->c.cur_pic.mb_type[mb_y*s->c.mb_stride + mb_x] = 0;
 
         {
-            int p_score = FFMIN(vard, varc-500+(s->c.lambda2>>FF_LAMBDA_SHIFT)*100);
-            int i_score = varc-500+(s->c.lambda2>>FF_LAMBDA_SHIFT)*20;
+            int p_score = FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100);
+            int i_score = varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
             c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
         }
     }
@@ -1071,7 +1071,7 @@ int ff_pre_estimate_p_frame_motion(MPVEncContext *const s,
 
     av_assert0(s->c.quarter_sample==0 || s->c.quarter_sample==1);
 
-    c->pre_penalty_factor = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->me_pre_cmp);
+    c->pre_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_pre_cmp);
     c->current_mv_penalty = c->mv_penalty[s->c.f_code] + MAX_DMV;
 
     get_limits(s, 16*mb_x, 16*mb_y, 0);
@@ -1510,9 +1510,9 @@ void ff_estimate_b_frame_motion(MPVEncContext *const s,
         return;
     }
 
-    c->penalty_factor    = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->me_cmp);
-    c->sub_penalty_factor= get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->me_sub_cmp);
-    c->mb_penalty_factor = get_penalty_factor(s->c.lambda, s->c.lambda2, c->avctx->mb_cmp);
+    c->penalty_factor    = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp);
+    c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp);
+    c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp);
 
     if (s->c.codec_id == AV_CODEC_ID_MPEG4)
         dmin= direct_search(s, mb_x, mb_y);
diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
index 9f933b517e..fefd94ee99 100644
--- a/libavcodec/mpeg4videoenc.c
+++ b/libavcodec/mpeg4videoenc.c
@@ -461,7 +461,7 @@ static inline int get_b_cbp(MPVEncContext *const s, int16_t block[6][64],
 
     if (s->mpv_flags & FF_MPV_FLAG_CBP_RD) {
         int score        = 0;
-        const int lambda = s->c.lambda2 >> (FF_LAMBDA_SHIFT - 6);
+        const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
 
         for (i = 0; i < 6; i++) {
             if (s->coded_score[i] < 0) {
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index adaa0cf2d0..5301338188 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -166,8 +166,6 @@ typedef struct MpegEncContext {
 
     int qscale;                 ///< QP
     int chroma_qscale;          ///< chroma QP
-    unsigned int lambda;        ///< Lagrange multiplier used in rate distortion
-    unsigned int lambda2;       ///< (lambda*lambda) >> FF_LAMBDA_SHIFT
     int pict_type;              ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
     int droppable;
 
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 7061ad0719..6c1d157b64 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -204,7 +204,7 @@ static inline void update_qscale(MPVMainEncContext *const m)
         int best = 1;
 
         for (i = 0 ; i<FF_ARRAY_ELEMS(ff_mpeg2_non_linear_qscale); i++) {
-            int diff = FFABS((ff_mpeg2_non_linear_qscale[i]<<(FF_LAMBDA_SHIFT + 6)) - (int)s->c.lambda * 139);
+            int diff = FFABS((ff_mpeg2_non_linear_qscale[i]<<(FF_LAMBDA_SHIFT + 6)) - (int)s->lambda * 139);
             if (ff_mpeg2_non_linear_qscale[i] < s->c.avctx->qmin ||
                 (ff_mpeg2_non_linear_qscale[i] > s->c.avctx->qmax && !m->vbv_ignore_qmax))
                 continue;
@@ -215,12 +215,12 @@ static inline void update_qscale(MPVMainEncContext *const m)
         }
         s->c.qscale = best;
     } else {
-        s->c.qscale = (s->c.lambda * 139 + FF_LAMBDA_SCALE * 64) >>
+        s->c.qscale = (s->lambda * 139 + FF_LAMBDA_SCALE * 64) >>
                     (FF_LAMBDA_SHIFT + 7);
         s->c.qscale = av_clip(s->c.qscale, s->c.avctx->qmin, m->vbv_ignore_qmax ? 31 : s->c.avctx->qmax);
     }
 
-    s->c.lambda2 = (s->c.lambda * s->c.lambda + FF_LAMBDA_SCALE / 2) >>
+    s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
                  FF_LAMBDA_SHIFT;
 }
 
@@ -261,8 +261,8 @@ static void update_duplicate_context_after_me(MPVEncContext *const dst,
     COPY(c.f_code);
     COPY(c.b_code);
     COPY(c.qscale);
-    COPY(c.lambda);
-    COPY(c.lambda2);
+    COPY(lambda);
+    COPY(lambda2);
     COPY(c.frame_pred_frame_dct); // FIXME don't set in encode_header
     COPY(c.progressive_frame);    // FIXME don't set in encode_header
     COPY(c.partitioned_frame);    // FIXME don't set in encode_header
@@ -1476,7 +1476,7 @@ static int skip_check(MPVMainEncContext *const m,
 
     if (score64 < m->frame_skip_threshold)
         return 1;
-    if (score64 < ((m->frame_skip_factor * (int64_t) s->c.lambda) >> 8))
+    if (score64 < ((m->frame_skip_factor * (int64_t) s->lambda) >> 8))
         return 1;
     return 0;
 }
@@ -1991,8 +1991,8 @@ vbv_retry:
             int min_step = hq ? 1 : (1<<(FF_LAMBDA_SHIFT + 7))/139;
 
             if (put_bits_count(&s->pb) > max_size &&
-                s->c.lambda < m->lmax) {
-                m->next_lambda = FFMAX(s->c.lambda + min_step, s->c.lambda *
+                s->lambda < m->lmax) {
+                m->next_lambda = FFMAX(s->lambda + min_step, s->lambda *
                                        (s->c.qscale + 1) / s->c.qscale);
                 if (s->adaptive_quant) {
                     for (int i = 0; i < s->c.mb_height * s->c.mb_stride; i++)
@@ -2297,8 +2297,8 @@ static av_always_inline void encode_mb_internal(MPVEncContext *const s,
         const int last_qp = s->c.qscale;
         const int mb_xy = mb_x + mb_y * s->c.mb_stride;
 
-        s->c.lambda = s->lambda_table[mb_xy];
-        s->c.lambda2 = (s->c.lambda * s->c.lambda + FF_LAMBDA_SCALE / 2) >>
+        s->lambda  = s->lambda_table[mb_xy];
+        s->lambda2 = (s->lambda * s->lambda + FF_LAMBDA_SCALE / 2) >>
                        FF_LAMBDA_SHIFT;
 
         if (!(s->mpv_flags & FF_MPV_FLAG_QP_RD)) {
@@ -2723,7 +2723,7 @@ static void encode_mb_hq(MPVEncContext *const s, MPVEncContext *const backup, MP
     if(s->c.avctx->mb_decision == FF_MB_DECISION_RD){
         mpv_reconstruct_mb(s, s->c.block);
 
-        score *= s->c.lambda2;
+        score *= s->lambda2;
         score += sse_mb(s) << FF_LAMBDA_SHIFT;
     }
 
@@ -3651,10 +3651,10 @@ static int estimate_qp(MPVMainEncContext *const m, int dry_run)
             break;
         }
 
-        s->c.lambda= s->lambda_table[0];
+        s->lambda = s->lambda_table[0];
         //FIXME broken
     }else
-        s->c.lambda = s->c.cur_pic.ptr->f->quality;
+        s->lambda = s->c.cur_pic.ptr->f->quality;
     update_qscale(m);
     return 0;
 }
@@ -3695,7 +3695,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
 
     s->c.me.scene_change_score=0;
 
-//    s->c.lambda= s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
+//    s->lambda = s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
 
     if (s->c.pict_type == AV_PICTURE_TYPE_I) {
         s->c.no_rounding = s->c.msmpeg4_version >= MSMP4_V3;
@@ -3710,9 +3710,9 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
         ff_get_2pass_fcode(m);
     } else if (!(s->c.avctx->flags & AV_CODEC_FLAG_QSCALE)) {
         if(s->c.pict_type==AV_PICTURE_TYPE_B)
-            s->c.lambda = m->last_lambda_for[s->c.pict_type];
+            s->lambda = m->last_lambda_for[s->c.pict_type];
         else
-            s->c.lambda = m->last_lambda_for[m->last_non_b_pict_type];
+            s->lambda = m->last_lambda_for[m->last_non_b_pict_type];
         update_qscale(m);
     }
 
@@ -3728,6 +3728,8 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
             ret = ff_update_duplicate_context(&slice->c, &s->c);
             if (ret < 0)
                 return ret;
+            slice->lambda  = s->lambda;
+            slice->lambda2 = s->lambda2;
         }
         slice->c.me.temp = slice->c.me.scratchpad = slice->c.sc.scratchpad_buf;
 
@@ -3740,8 +3742,8 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
 
     /* Estimate motion for every MB */
     if (s->c.pict_type != AV_PICTURE_TYPE_I) {
-        s->c.lambda  = (s->c.lambda  * m->me_penalty_compensation + 128) >> 8;
-        s->c.lambda2 = (s->c.lambda2 * (int64_t) m->me_penalty_compensation + 128) >> 8;
+        s->lambda  = (s->lambda  * m->me_penalty_compensation + 128) >> 8;
+        s->lambda2 = (s->lambda2 * (int64_t) m->me_penalty_compensation + 128) >> 8;
         if (s->c.pict_type != AV_PICTURE_TYPE_B) {
             if ((m->me_pre && m->last_non_b_pict_type == AV_PICTURE_TYPE_I) ||
                 m->me_pre == 2) {
@@ -3972,7 +3974,7 @@ static int dct_quantize_trellis_c(MPVEncContext *const s,
     int qmul, qadd, start_i, last_non_zero, i, dc;
     const int esc_length= s->ac_esc_length;
     const uint8_t *length, *last_length;
-    const int lambda= s->c.lambda2 >> (FF_LAMBDA_SHIFT - 6);
+    const int lambda = s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
     int mpeg2_qscale;
 
     s->fdsp.fdct(block);
@@ -4362,7 +4364,7 @@ static int dct_quantize_refine(MPVEncContext *const s, //FIXME breaks denoise?
         av_assert2(w<(1<<6));
         sum += w*w;
     }
-    lambda= sum*(uint64_t)s->c.lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
+    lambda = sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
 
     run=0;
     rle_index=0;
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index 1d124b1bd1..a2b544d70e 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -47,6 +47,8 @@ typedef struct MPVEncContext {
     /** bit output */
     PutBitContext pb;
 
+    unsigned int lambda;        ///< Lagrange multiplier used in rate distortion
+    unsigned int lambda2;       ///< (lambda*lambda) >> FF_LAMBDA_SHIFT
     int *lambda_table;
     int adaptive_quant;         ///< use adaptive quantization
     int dquant;                 ///< qscale difference to prev qscale
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index f9b10f7dab..269fc8a599 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -1873,9 +1873,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
         mpv->c.out_format      = FMT_H263;
         mpv->c.unrestricted_mv = 1;
 
-        mpv->c.lambda = enc->lambda;
-        mpv->c.qscale = (mpv->c.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
-        enc->lambda2  = mpv->c.lambda2 = (mpv->c.lambda*mpv->c.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
+        mpv->lambda   = enc->lambda;
+        mpv->c.qscale = (mpv->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
+        enc->lambda2  = mpv->lambda2 = (mpv->lambda*mpv->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
 
         mpv->c.qdsp = enc->qdsp; //move
         mpv->c.hdsp = s->hdsp;
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
index ddc94dffe5..6e5146d6a5 100644
--- a/libavcodec/svq1enc.c
+++ b/libavcodec/svq1enc.c
@@ -342,11 +342,11 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
         s2->me.scene_change_score         = 0;
         // s2->out_format                    = FMT_H263;
         // s2->unrestricted_mv               = 1;
-        s2->lambda                        = s->quality;
-        s2->qscale                        = s2->lambda * 139 +
+        s->m.lambda                       = s->quality;
+        s2->qscale                        = s->m.lambda * 139 +
                                              FF_LAMBDA_SCALE * 64 >>
                                              FF_LAMBDA_SHIFT + 7;
-        s2->lambda2                       = s2->lambda * s2->lambda +
+        s->m.lambda2                      = s->m.lambda * s->m.lambda +
                                              FF_LAMBDA_SCALE / 2 >>
                                              FF_LAMBDA_SHIFT;
 
-- 
2.45.2