Index: source/libvpx/vp9/encoder/vp9_ratectrl.c |
diff --git a/source/libvpx/vp9/encoder/vp9_ratectrl.c b/source/libvpx/vp9/encoder/vp9_ratectrl.c |
index 7783f7bdc0397079844f060901b77ff29cf95792..4c33ffd977b588d09c435097da67aa7c3da695cf 100644 |
--- a/source/libvpx/vp9/encoder/vp9_ratectrl.c |
+++ b/source/libvpx/vp9/encoder/vp9_ratectrl.c |
@@ -1609,11 +1609,21 @@ int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type, |
return target_index - qindex; |
} |
-void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, |
- RATE_CONTROL *const rc) { |
+#define MIN_GF_INTERVAL 4 |
+#define MAX_GF_INTERVAL 16 |
+void vp9_rc_set_gf_interval_range(const VP9_COMP *const cpi, |
+ RATE_CONTROL *const rc) { |
const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
- // Set Maximum gf/arf interval |
- rc->max_gf_interval = 16; |
+ |
+ // Set a minimum interval. |
+ rc->min_gf_interval = |
+ MIN(MAX_GF_INTERVAL, MAX(MIN_GF_INTERVAL, (int)(cpi->framerate * 0.125))); |
+ |
+ // Set Maximum gf/arf interval. |
+ rc->max_gf_interval = |
+ MIN(MAX_GF_INTERVAL, (int)(cpi->framerate * 0.75)); |
+ // Round up to next even number if odd. |
+ rc->max_gf_interval += (rc->max_gf_interval & 0x01); |
// Extended interval for genuinely static scenes |
rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2; |
@@ -1625,6 +1635,9 @@ void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, |
if (rc->max_gf_interval > rc->static_scene_max_gf_interval) |
rc->max_gf_interval = rc->static_scene_max_gf_interval; |
+ |
+ // Clamp min to max |
+ rc->min_gf_interval = MIN(rc->min_gf_interval, rc->max_gf_interval); |
} |
void vp9_rc_update_framerate(VP9_COMP *cpi) { |
@@ -1651,7 +1664,7 @@ void vp9_rc_update_framerate(VP9_COMP *cpi) { |
rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), |
vbr_max_bits); |
- vp9_rc_set_gf_max_interval(cpi, rc); |
+ vp9_rc_set_gf_interval_range(cpi, rc); |
} |
#define VBR_PCT_ADJUSTMENT_LIMIT 50 |