From eb9c96a82f95ec621dbaa7477fd74573c95e07cd Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 18 Jun 2024 15:48:21 +0200 Subject: [PATCH] avcodec/ratecontrol: Try to keep fps as a rational Signed-off-by: Michael Niedermayer --- libavcodec/ratecontrol.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 609d47faeb..df27639ca7 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -56,20 +56,25 @@ void ff_write_pass1_stats(MpegEncContext *s) s->header_bits); } -static double get_fps(AVCodecContext *avctx) +static AVRational get_fpsQ(AVCodecContext *avctx) { if (avctx->framerate.num > 0 && avctx->framerate.den > 0) - return av_q2d(avctx->framerate); + return avctx->framerate; FF_DISABLE_DEPRECATION_WARNINGS - return 1.0 / av_q2d(avctx->time_base) #if FF_API_TICKS_PER_FRAME - / FFMAX(avctx->ticks_per_frame, 1) + return av_div_q((AVRational){1, FFMAX(avctx->ticks_per_frame, 1)}, avctx->time_base); +#else + return av_inv_q(avctx->time_base); #endif - ; FF_ENABLE_DEPRECATION_WARNINGS } +static double get_fps(AVCodecContext *avctx) +{ + return av_q2d(get_fpsQ(avctx)); +} + static inline double qp2bits(const RateControlEntry *rce, double qp) { if (qp <= 0.0) { @@ -332,12 +337,13 @@ static int init_pass2(MpegEncContext *s) RateControlContext *rcc = &s->rc_context; AVCodecContext *a = s->avctx; int i, toobig; - double fps = get_fps(s->avctx); + AVRational fps = get_fpsQ(s->avctx); 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 = (uint64_t)(s->bit_rate * - (double)rcc->num_entries / fps); + uint64_t all_available_bits = av_rescale_q(s->bit_rate, + (AVRational){rcc->num_entries,1}, + fps); double rate_factor = 0; double step; const int filter_size = (int)(a->qblur * 4) | 1;