]> granicus.if.org Git - libvpx/commitdiff
vp9: 1 pass vbr: More even spacing for gf near key frame.
authorMarco <marpan@google.com>
Mon, 18 Apr 2016 17:51:07 +0000 (10:51 -0700)
committerMarco <marpan@google.com>
Mon, 18 Apr 2016 21:40:55 +0000 (14:40 -0700)
More even spacing near key frame and avoid gf on scene cut
if its close to key frame.

Small increase in metrics for ytlive set (which uses key-period=150).
(~0.2% gain)

Change only affects 1 pass vbr mode.

Change-Id: If1e5a59baf1e0befbaf998522fbc47d94ac5b5df

vp9/encoder/vp9_ratectrl.c

index 300080ba1bb112568c4058d27ffdc8672edae959..07a8344796df2592f9b64a1822b9bfb440ec6803 100644 (file)
@@ -1506,6 +1506,11 @@ void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) {
       rc->baseline_gf_interval =
           (rc->min_gf_interval + rc->max_gf_interval) / 2;
     }
+    // Reset the gf interval to make more equal spacing for up-coming key frame.
+    if ((rc->frames_to_key <= 7 * rc->baseline_gf_interval >> 2) &&
+        (rc->frames_to_key > rc->baseline_gf_interval)) {
+      rc->baseline_gf_interval = rc->frames_to_key >> 1;
+    }
     rc->frames_till_gf_update_due = rc->baseline_gf_interval;
     // NOTE: frames_till_gf_update_due must be <= frames_to_key.
     if (rc->frames_till_gf_update_due > rc->frames_to_key) {
@@ -2092,6 +2097,7 @@ void vp9_avg_source_sad(VP9_COMP *cpi) {
     // For VBR, under scene change/high content change, force golden refresh.
     if (cpi->oxcf.rc_mode == VPX_VBR &&
         rc->high_source_sad &&
+        rc->frames_to_key > 3 &&
         rc->count_last_scene_change > 4 &&
         cpi->ext_refresh_frame_flags_pending == 0) {
       int target;