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