]> granicus.if.org Git - libvpx/commitdiff
Clip buffer level to the maximum buffer size in CBR
authorAdrian Grange <agrange@google.com>
Thu, 17 Nov 2011 23:57:37 +0000 (15:57 -0800)
committerAdrian Grange <agrange@google.com>
Thu, 17 Nov 2011 23:57:37 +0000 (15:57 -0800)
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
vp8/encoder/ratectrl.c

index e5212acf60388728378c5f95d6ff471146b86372..84202daaa9009c04b1b42d3be387823ebf99e4e7 100644 (file)
@@ -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;
index c893b8d62f074ad14980ba9d8195391ef5236c45..63d08935cc4902a71b034733eeedbefceeac713b 100644 (file)
@@ -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