1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

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>
This commit is contained in:
Andreas Rheinhardt
2025-03-15 07:25:15 +01:00
parent bceeb35857
commit 9f469e244e
7 changed files with 24 additions and 18 deletions

View File

@ -198,7 +198,7 @@ static void mpeg1_encode_sequence_header(MPEG12EncContext *mpeg12)
else else
/* VBV calculation: Scaled so that a VCD has the proper /* VBV calculation: Scaled so that a VCD has the proper
* VBV size of 40 kilobytes */ * 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; vbv_buffer_size = (vbv_buffer_size + 16383) / 16384;
put_sbits(&s->pb, 18, v); put_sbits(&s->pb, 18, v);

View File

@ -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); 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->width = avctx->width;
s->height = avctx->height; s->height = avctx->height;
if (avctx->gop_size > 600 && if (avctx->gop_size > 600 &&

View File

@ -87,6 +87,7 @@ typedef struct MPVMainEncContext {
int (*encode_picture_header)(struct MPVMainEncContext *m); int (*encode_picture_header)(struct MPVMainEncContext *m);
/* bit rate control */ /* bit rate control */
int64_t bit_rate;
int64_t total_bits; int64_t total_bits;
int frame_bits; ///< bits used for the current frame int frame_bits; ///< bits used for the current frame
int header_bits; int header_bits;

View File

@ -30,6 +30,8 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#define NO_SLICE_THREADING_HERE
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#include "libavutil/thread.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->use_skip_mb_code = 1; /* only if P-frame */
s->per_mb_rl_table = 0; s->per_mb_rl_table = 0;
if (s->msmpeg4_version == MSMP4_WMV1) 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); s->inter_intra_pred = s->width * s->height < 320*240 &&
ff_dlog(s->avctx, "%d %"PRId64" %d %d %d\n", s->pict_type, s->bit_rate, 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); s->inter_intra_pred, s->width, s->height);
if (s->pict_type == AV_PICTURE_TYPE_I) { 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) { if (s->msmpeg4_version == MSMP4_WMV1) {
ff_msmpeg4_encode_ext_header(s); 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); put_bits(&s->pb, 1, s->per_mb_rl_table);
} }
@ -247,7 +251,7 @@ static int msmpeg4_encode_picture_header(MPVMainEncContext *const m)
} else { } else {
put_bits(&s->pb, 1, s->use_skip_mb_code); 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); put_bits(&s->pb, 1, s->per_mb_rl_table);
if (s->msmpeg4_version > MSMP4_V2) { 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) void ff_msmpeg4_encode_ext_header(MpegEncContext * s)
{ {
const MPVMainEncContext *const m = slice_to_mainenc(s);
unsigned fps; unsigned fps;
if (s->avctx->framerate.num > 0 && s->avctx->framerate.den > 0) 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, 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) if (s->msmpeg4_version >= MSMP4_V3)
put_bits(&s->pb, 1, s->flipflop_rounding); put_bits(&s->pb, 1, s->flipflop_rounding);

View File

@ -347,7 +347,7 @@ static int init_pass2(MPVMainEncContext *const m)
double complexity[5] = { 0 }; // approximate bits at quant=1 double complexity[5] = { 0 }; // approximate bits at quant=1
uint64_t const_bits[5] = { 0 }; // quantizer independent bits uint64_t const_bits[5] = { 0 }; // quantizer independent bits
uint64_t all_const_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}, (AVRational){rcc->num_entries,1},
fps); fps);
double rate_factor = 0; double rate_factor = 0;
@ -477,8 +477,8 @@ static int init_pass2(MPVMainEncContext *const m)
av_assert0(toobig <= 40); av_assert0(toobig <= 40);
av_log(s->avctx, AV_LOG_DEBUG, av_log(s->avctx, AV_LOG_DEBUG,
"[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n", "[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n",
s->bit_rate, m->bit_rate,
(int64_t)(expected_bits / ((double)all_available_bits / s->bit_rate))); (int64_t)(expected_bits / ((double)all_available_bits / m->bit_rate)));
av_log(s->avctx, AV_LOG_DEBUG, av_log(s->avctx, AV_LOG_DEBUG,
"[lavc rc] estimated target average qp: %.3f\n", "[lavc rc] estimated target average qp: %.3f\n",
(float)qscale_sum / rcc->num_entries); (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); get_qscale(m, &rce, rcc->pass1_wanted_bits / rcc->pass1_rc_eq_output_sum, i);
// FIXME misbehaves a little for variable fps // 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; dts_pic = s->last_pic.ptr;
if (!dts_pic || dts_pic->f->pts == AV_NOPTS_VALUE) 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 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) { if (wanted_bits_double > INT64_MAX) {
av_log(s->avctx, AV_LOG_WARNING, "Bits exceed 64bit range\n"); av_log(s->avctx, AV_LOG_WARNING, "Bits exceed 64bit range\n");
wanted_bits = INT64_MAX; 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); 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); 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, wanted_bits / 1000, m->total_bits / 1000,
br_compensation, short_term_q, m->frame_bits, br_compensation, short_term_q, m->frame_bits,
m->mb_var_sum, m->mc_mb_var_sum, m->mb_var_sum, m->mc_mb_var_sum,
s->bit_rate / 1000, (int)fps); m->bit_rate / 1000, (int)fps);
} }
if (q < qmin) if (q < qmin)

View File

@ -227,7 +227,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
s->version=0; s->version=0;
mpv->avctx = avctx; mpv->avctx = avctx;
mpv->bit_rate= avctx->bit_rate; enc->m.bit_rate = avctx->bit_rate;
enc->m.lmin = avctx->mb_lmin; enc->m.lmin = avctx->mb_lmin;
enc->m.lmax = avctx->mb_lmax; enc->m.lmax = avctx->mb_lmax;
mpv->mb_num = (avctx->width * avctx->height + 255) / 256; // For ratecontrol mpv->mb_num = (avctx->width * avctx->height + 255) / 256; // For ratecontrol

View File

@ -55,7 +55,7 @@ static int encode_ext_header(WMV2EncContext *w)
init_put_bits(&pb, s->avctx->extradata, WMV2_EXTRADATA_SIZE); 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, 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, w->mspel_bit = 1);
put_bits(&pb, 1, s->loop_filter); 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->dc_table_index);
put_bits(&s->pb, 1, s->mv_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_level_length = 0;
s->esc3_run_length = 0; s->esc3_run_length = 0;