]> granicus.if.org Git - libvpx/commitdiff
1 pass VBR mode bug fix.
authorpaulwilkins <paulwilkins@google.com>
Tue, 15 Dec 2015 10:27:51 +0000 (10:27 +0000)
committerpaulwilkins <paulwilkins@google.com>
Tue, 15 Dec 2015 10:27:51 +0000 (10:27 +0000)
The one pass VBR mode selects a Q range based on a
moving average of recent Q values. This calculation
should have been excluding arf overlay frames as these
are usually coded at the highest allowed value. Their
inclusion skews the average and can cause it to drift
upwards even when the clip as a whole is undershooting.

As such it can undermine correct adaptation of the allowed
Q range especially for easy content.

Change-Id: I7d10fe4227262376aa2dc2a7aec0f1fd82bf11f9

vp9/encoder/vp9_ratectrl.c

index 8ab51cd20e23c226e19f857b15ca1f08675328b0..22b0f8c1b57a3cec0468345c8541b0ad301a63be 100644 (file)
@@ -1313,9 +1313,9 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
       }
     }
   } else {
-    if (rc->is_src_frame_alt_ref ||
-        !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) ||
-        (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) {
+    if ((cpi->use_svc && oxcf->rc_mode == VPX_CBR) ||
+        (!rc->is_src_frame_alt_ref &&
+         !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
       rc->last_q[INTER_FRAME] = qindex;
       rc->avg_frame_qindex[INTER_FRAME] =
         ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2);