From eb15fe85e088ff7788a39cb0998ece58afd692c2 Mon Sep 17 00:00:00 2001 From: Adrian Grange <agrange@google.com> Date: Thu, 17 Nov 2011 15:57:37 -0800 Subject: [PATCH] Clip buffer level to the maximum buffer size in CBR The buffer level was able to increase indefinitely rather than being clipped to the maximum buffer size specified by the user. This change checks the buffrer level and prevents it from going beyond the upper limit of the buffer. Change-Id: Ifff55f79d3c018e4d3d77e554b11ada543cc1654 --- vp8/encoder/onyx_if.c | 9 +++++++++ vp8/encoder/ratectrl.c | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index e5212acf60..84202daaa9 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3771,6 +3771,11 @@ static void encode_frame_to_data_rate { cpi->decimation_count --; cpi->bits_off_target += cpi->av_per_frame_bandwidth; + + // Clip the buffer level at the maximum buffer size + 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++; @@ -4614,6 +4619,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 at the maximum 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 c893b8d62f..63d08935cc 100644 --- a/vp8/encoder/ratectrl.c +++ b/vp8/encoder/ratectrl.c @@ -1028,6 +1028,11 @@ static void calc_pframe_target_size(VP8_COMP *cpi) { // Update the buffer level variable. cpi->bits_off_target += cpi->av_per_frame_bandwidth; + + // Clip the buffer level at the maximum buffer size + 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 -- GitLab