]> granicus.if.org Git - libvpx/commitdiff
Stabilize the encoder buffer from going too negative.
authorMarco <marpan@chromium.org>
Thu, 1 Oct 2015 01:27:49 +0000 (18:27 -0700)
committerMarco <marpan@chromium.org>
Fri, 2 Oct 2015 18:07:59 +0000 (11:07 -0700)
For screen-content mode, with frame dropper off, put a limit
on how low encoder buffer can go.

Under hard slide changes, the buffer level can go too low and then
take long time to come back up (in particular when frame-dropping
is not used), which will affect the active_worst and target frame size.

Change-Id: Ie9fca097e05cd71141f978ec687f852daf9de332

vp9/encoder/vp9_ratectrl.c

index 4fe5561112e65c87f8839a888a6fbed534884b25..2146b4fda02ea52f139c42a0e581b2f5b629dfac 100644 (file)
@@ -271,6 +271,13 @@ static void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) {
 
   // Clip the buffer level to the maximum specified buffer size.
   rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
+
+  // For screen-content mode, and if frame-dropper is off, don't let buffer
+  // level go below threshold, given here as -rc->maximum_ buffer_size.
+  if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
+      cpi->oxcf.drop_frames_water_mark == 0)
+    rc->bits_off_target = VPXMAX(rc->bits_off_target, -rc->maximum_buffer_size);
+
   rc->buffer_level = rc->bits_off_target;
 
   if (is_one_pass_cbr_svc(cpi)) {