[FFmpeg-devel] [PATCH] libvpxenc: avoid rollover in settings conversion

James Zern jzern
Sat Dec 11 21:12:25 CET 2010


When converting bitrate values to percentages or buffer sizes to
milliseconds as required for libvpx avoid rolling over integer values
by using 64-bit math.
In these cases output quality would have been adversely effected. As
an example '-vb 2.2M -maxrate 22M' will roll
rc_2pass_vbr_maxsection_pct (visible with -loglevel debug).
---
 libavcodec/libvpxenc.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)
-------------- next part --------------
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 4e16c72..d0838ba 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -244,17 +244,17 @@ static av_cold int vp8_init(AVCodecContext *avctx)
     //0-100 (0 => CBR, 100 => VBR)
     enccfg.rc_2pass_vbr_bias_pct           = round(avctx->qcompress * 100);
     enccfg.rc_2pass_vbr_minsection_pct     =
-        avctx->rc_min_rate * 100 / avctx->bit_rate;
+        avctx->rc_min_rate * 100LL / avctx->bit_rate;
     if (avctx->rc_max_rate)
         enccfg.rc_2pass_vbr_maxsection_pct =
-            avctx->rc_max_rate * 100 / avctx->bit_rate;
+            avctx->rc_max_rate * 100LL / avctx->bit_rate;
 
     if (avctx->rc_buffer_size)
         enccfg.rc_buf_sz         =
-            avctx->rc_buffer_size * 1000 / avctx->bit_rate;
+            avctx->rc_buffer_size * 1000LL / avctx->bit_rate;
     if (avctx->rc_initial_buffer_occupancy)
         enccfg.rc_buf_initial_sz =
-            avctx->rc_initial_buffer_occupancy * 1000 / avctx->bit_rate;
+            avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate;
     enccfg.rc_buf_optimal_sz     = enccfg.rc_buf_sz * 5 / 6;
 
     //_enc_init() will balk if kf_min_dist differs from max w/VPX_KF_AUTO



More information about the ffmpeg-devel mailing list