diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index e5212acf60388728378c5f95d6ff471146b86372..84202daaa9009c04b1b42d3be387823ebf99e4e7 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 c893b8d62f074ad14980ba9d8195391ef5236c45..63d08935cc4902a71b034733eeedbefceeac713b 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