From: Adrian Grange Date: Wed, 16 Nov 2011 00:39:53 +0000 (-0800) Subject: Added clipping of the buffer level to maximum_buffer_size X-Git-Tag: v1.3.0~1217^2~386 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b1c2990a98f090d91ab3ca5c6c1e1ce7ee1a701;p=libvpx Added clipping of the buffer level to maximum_buffer_size The buffer level was not being capped at the maximum decode buffer size specified by the user. In CBR mode this resulted in large files being generated immediately after a dramatic reduction in the data rate target. This fix should prevent this from happening. Change-Id: Iaf01c9fb037cf51515217a5834d6ee4fbb0cb853 --- diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index faa36d66a..bf155e250 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3490,6 +3490,9 @@ static void encode_frame_to_data_rate { cpi->decimation_count --; cpi->bits_off_target += cpi->av_per_frame_bandwidth; + if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) + cpi->bits_off_target = cpi->oxcf.maximum_buffer_size; + cm->current_video_frame++; cpi->frames_since_key++; @@ -4321,6 +4324,10 @@ static void encode_frame_to_data_rate else cpi->bits_off_target += cpi->av_per_frame_bandwidth - cpi->projected_frame_size; + // Clip the buffer level to the maximum specified buffer size + if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) + cpi->bits_off_target = cpi->oxcf.maximum_buffer_size; + // Rolling monitors of whether we are over or underspending used to help regulate min and Max Q in two pass. cpi->rolling_target_bits = ((cpi->rolling_target_bits * 3) + cpi->this_frame_target + 2) / 4; cpi->rolling_actual_bits = ((cpi->rolling_actual_bits * 3) + cpi->projected_frame_size + 2) / 4; diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c index f3dccfd05..a0a3db1c4 100644 --- a/vp8/encoder/ratectrl.c +++ b/vp8/encoder/ratectrl.c @@ -1029,6 +1029,8 @@ static void calc_pframe_target_size(VP8_COMP *cpi) { // Update the buffer level variable. cpi->bits_off_target += cpi->av_per_frame_bandwidth; + if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) + cpi->bits_off_target = cpi->oxcf.maximum_buffer_size; cpi->buffer_level = cpi->bits_off_target; } else