From a28b4480676c75333b84f95f450c6e2d1efe9e64 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Sat, 15 Mar 2025 07:25:15 +0100 Subject: [PATCH 40/77] avcodec/mpegvideoenc: Add bit_rate to MPVMainEncContext Use it instead of the MpegEncContext field which will be removed soon. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/mpeg12enc.c | 2 +- libavcodec/mpegvideo_enc.c | 2 +- libavcodec/mpegvideoenc.h | 1 + libavcodec/msmpeg4enc.c | 15 ++++++++++----- libavcodec/ratecontrol.c | 16 ++++++++-------- libavcodec/snowenc.c | 2 +- libavcodec/wmv2enc.c | 4 ++-- 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 43addcfda9..ae87f28d66 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -198,7 +198,7 @@ static void mpeg1_encode_sequence_header(MPEG12EncContext *mpeg12) else /* VBV calculation: Scaled so that a VCD has the proper * VBV size of 40 kilobytes */ - vbv_buffer_size = av_rescale_rnd(s->bit_rate, 20, 1151929 / 2, AV_ROUND_ZERO) * 8 * 1024; + vbv_buffer_size = av_rescale_rnd(mpeg12->mpeg.bit_rate, 20, 1151929 / 2, AV_ROUND_ZERO) * 8 * 1024; vbv_buffer_size = (vbv_buffer_size + 16383) / 16384; put_sbits(&s->pb, 18, v); diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index cb1cf972d8..116c974098 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -449,7 +449,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) avctx->bits_per_raw_sample = av_clip(avctx->bits_per_raw_sample, 0, 8); - s->bit_rate = avctx->bit_rate; + m->bit_rate = avctx->bit_rate; s->width = avctx->width; s->height = avctx->height; if (avctx->gop_size > 600 && diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h index 18741e9c22..57b91d169a 100644 --- a/libavcodec/mpegvideoenc.h +++ b/libavcodec/mpegvideoenc.h @@ -87,6 +87,7 @@ typedef struct MPVMainEncContext { int (*encode_picture_header)(struct MPVMainEncContext *m); /* bit rate control */ + int64_t bit_rate; int64_t total_bits; int frame_bits; ///< bits used for the current frame int header_bits; diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c index 9e58a91a80..e5501e5e32 100644 --- a/libavcodec/msmpeg4enc.c +++ b/libavcodec/msmpeg4enc.c @@ -30,6 +30,8 @@ #include <stdint.h> #include <string.h> +#define NO_SLICE_THREADING_HERE + #include "libavutil/attributes.h" #include "libavutil/avutil.h" #include "libavutil/thread.h" @@ -222,8 +224,10 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) s->use_skip_mb_code = 1; /* only if P-frame */ s->per_mb_rl_table = 0; if (s->msmpeg4_version == MSMP4_WMV1) - s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P); - ff_dlog(s->avctx, "%d %"PRId64" %d %d %d\n", s->pict_type, s->bit_rate, + s->inter_intra_pred = s->width * s->height < 320*240 && + m->bit_rate <= II_BITRATE && + s->pict_type == AV_PICTURE_TYPE_P; + ff_dlog(s->avctx, "%d %"PRId64" %d %d %d\n", s->pict_type, m->bit_rate, s->inter_intra_pred, s->width, s->height); if (s->pict_type == AV_PICTURE_TYPE_I) { @@ -232,7 +236,7 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) if (s->msmpeg4_version == MSMP4_WMV1) { ff_msmpeg4_encode_ext_header(s); - if(s->bit_rate>MBAC_BITRATE) + if (m->bit_rate > MBAC_BITRATE) put_bits(&s->pb, 1, s->per_mb_rl_table); } @@ -247,7 +251,7 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) } else { put_bits(&s->pb, 1, s->use_skip_mb_code); - if (s->msmpeg4_version == MSMP4_WMV1 && s->bit_rate > MBAC_BITRATE) + if (s->msmpeg4_version == MSMP4_WMV1 && m->bit_rate > MBAC_BITRATE) put_bits(&s->pb, 1, s->per_mb_rl_table); if (s->msmpeg4_version > MSMP4_V2) { @@ -268,6 +272,7 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m) void ff_msmpeg4_encode_ext_header(MpegEncContext * s) { + const MPVMainEncContext *const m = slice_to_mainenc(s); unsigned fps; if (s->avctx->framerate.num > 0 && s->avctx->framerate.den > 0) @@ -284,7 +289,7 @@ FF_ENABLE_DEPRECATION_WARNINGS put_bits(&s->pb, 5, FFMIN(fps, 31)); //yes 29.97 -> 29 - put_bits(&s->pb, 11, FFMIN(s->bit_rate / 1024, 2047)); + put_bits(&s->pb, 11, FFMIN(m->bit_rate / 1024, 2047)); if (s->msmpeg4_version >= MSMP4_V3) put_bits(&s->pb, 1, s->flipflop_rounding); diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 20e3ccabf8..0d2bf8fb30 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -347,7 +347,7 @@ static int init_pass2(MPVMainEncContext *const m) double complexity[5] = { 0 }; // approximate bits at quant=1 uint64_t const_bits[5] = { 0 }; // quantizer independent bits uint64_t all_const_bits; - uint64_t all_available_bits = av_rescale_q(s->bit_rate, + uint64_t all_available_bits = av_rescale_q(m->bit_rate, (AVRational){rcc->num_entries,1}, fps); double rate_factor = 0; @@ -477,8 +477,8 @@ static int init_pass2(MPVMainEncContext *const m) av_assert0(toobig <= 40); av_log(s->avctx, AV_LOG_DEBUG, "[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n", - s->bit_rate, - (int64_t)(expected_bits / ((double)all_available_bits / s->bit_rate))); + m->bit_rate, + (int64_t)(expected_bits / ((double)all_available_bits / m->bit_rate))); av_log(s->avctx, AV_LOG_DEBUG, "[lavc rc] estimated target average qp: %.3f\n", (float)qscale_sum / rcc->num_entries); @@ -696,7 +696,7 @@ av_cold int ff_rate_control_init(MPVMainEncContext *const m) get_qscale(m, &rce, rcc->pass1_wanted_bits / rcc->pass1_rc_eq_output_sum, i); // FIXME misbehaves a little for variable fps - rcc->pass1_wanted_bits += s->bit_rate / get_fps(s->avctx); + rcc->pass1_wanted_bits += m->bit_rate / get_fps(s->avctx); } } } @@ -971,9 +971,9 @@ float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run) dts_pic = s->last_pic.ptr; if (!dts_pic || dts_pic->f->pts == AV_NOPTS_VALUE) - wanted_bits_double = s->bit_rate * (double)picture_number / fps; + wanted_bits_double = m->bit_rate * (double)picture_number / fps; else - wanted_bits_double = s->bit_rate * (double)dts_pic->f->pts / fps; + wanted_bits_double = m->bit_rate * (double)dts_pic->f->pts / fps; if (wanted_bits_double > INT64_MAX) { av_log(s->avctx, AV_LOG_WARNING, "Bits exceed 64bit range\n"); wanted_bits = INT64_MAX; @@ -1047,7 +1047,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run) q = modify_qscale(m, rce, q, picture_number); - rcc->pass1_wanted_bits += s->bit_rate / fps; + rcc->pass1_wanted_bits += m->bit_rate / fps; av_assert0(q > 0.0); } @@ -1061,7 +1061,7 @@ float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run) wanted_bits / 1000, m->total_bits / 1000, br_compensation, short_term_q, m->frame_bits, m->mb_var_sum, m->mc_mb_var_sum, - s->bit_rate / 1000, (int)fps); + m->bit_rate / 1000, (int)fps); } if (q < qmin) diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c index e074e878d6..b4a329158f 100644 --- a/libavcodec/snowenc.c +++ b/libavcodec/snowenc.c @@ -227,7 +227,7 @@ static av_cold int encode_init(AVCodecContext *avctx) s->version=0; mpv->avctx = avctx; - mpv->bit_rate= avctx->bit_rate; + enc->m.bit_rate = avctx->bit_rate; enc->m.lmin = avctx->mb_lmin; enc->m.lmax = avctx->mb_lmax; mpv->mb_num = (avctx->width * avctx->height + 255) / 256; // For ratecontrol diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c index 3ab3e75722..6eda38d05f 100644 --- a/libavcodec/wmv2enc.c +++ b/libavcodec/wmv2enc.c @@ -55,7 +55,7 @@ static int encode_ext_header(WMV2EncContext *w) init_put_bits(&pb, s->avctx->extradata, WMV2_EXTRADATA_SIZE); put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); // yes 29.97 -> 29 - put_bits(&pb, 11, FFMIN(s->bit_rate / 1024, 2047)); + put_bits(&pb, 11, FFMIN(w->msmpeg4.m.bit_rate / 1024, 2047)); put_bits(&pb, 1, w->mspel_bit = 1); put_bits(&pb, 1, s->loop_filter); @@ -135,7 +135,7 @@ static int wmv2_encode_picture_header(MPVMainEncContext *const m) put_bits(&s->pb, 1, s->dc_table_index); put_bits(&s->pb, 1, s->mv_table_index); - s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE); + s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && m->bit_rate <= II_BITRATE); } s->esc3_level_length = 0; s->esc3_run_length = 0; -- 2.45.2