]> granicus.if.org Git - libvpx/commitdiff
vp9: Reset buffer level on large bitrate changes.
authorMarco <marpan@google.com>
Fri, 8 Dec 2017 01:24:41 +0000 (17:24 -0800)
committerMarco <marpan@google.com>
Tue, 19 Dec 2017 17:57:21 +0000 (09:57 -0800)
For a large change in the target avg_frame_bandwidth,
via the update in change_config()), reset the buffer_level
to optimal_level.

This fix prevents possible frame drops, where for example,
encoder suddenly goes from lower to higher bitrate.

Change-Id: I2f844c41d04c01240e85f574e59d2b9075c7eb6d

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_svc_layercontext.c

index 527aecbb96325d0b74d5a2f6f4b94cb985007c06..2ae59dd9812cd97aac4e82e96b919b3892f5d345 100644 (file)
@@ -1868,6 +1868,7 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
   // Check for resetting the rc flags (rc_1_frame, rc_2_frame) if the
   // configuration change has a large change in avg_frame_bandwidth.
   // For SVC check for resetting based on spatial layer average bandwidth.
+  // Also reset buffer level to optimal level.
   if (cm->current_video_frame > 0) {
     if (cpi->use_svc) {
       vp9_svc_check_reset_layer_rc_flag(cpi);
@@ -1876,6 +1877,8 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
           rc->avg_frame_bandwidth < (rc->last_avg_frame_bandwidth >> 1)) {
         rc->rc_1_frame = 0;
         rc->rc_2_frame = 0;
+        rc->bits_off_target = rc->optimal_buffer_level;
+        rc->buffer_level = rc->optimal_buffer_level;
       }
     }
   }
index 45a1d142dbb6430c386afc0a5c5108b234518e2c..2636bd9a580205cecdbc58a087ec71cc56b222a3 100644 (file)
@@ -881,6 +881,8 @@ void vp9_svc_check_reset_layer_rc_flag(VP9_COMP *const cpi) {
         RATE_CONTROL *lrc = &lc->rc;
         lrc->rc_1_frame = 0;
         lrc->rc_2_frame = 0;
+        lrc->bits_off_target = lrc->optimal_buffer_level;
+        lrc->buffer_level = lrc->optimal_buffer_level;
       }
     }
   }