diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 5a1cf1f9f5cac1415b4408854988d5cf7127f542..644e77aacadacd7cc392c5e68d21d5c474247387 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -4525,6 +4525,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;
@@ -4552,6 +4556,10 @@ static void encode_frame_to_data_rate
 
             lc->bits_off_target += bits_off_for_this_layer;
 
+            // Clip buffer level to maximum buffer size for the layer
+            if (lc->bits_off_target > lc->maximum_buffer_size)
+                lc->bits_off_target = lc->maximum_buffer_size;
+
             lc->total_actual_bits += cpi->projected_frame_size;
             lc->total_target_vs_actual += bits_off_for_this_layer;
             lc->buffer_level = lc->bits_off_target;