From effd974b16d4ac8bdb2415b25ba39b09a0e280bf Mon Sep 17 00:00:00 2001 From: paulwilkins Date: Thu, 16 Apr 2015 11:24:38 +0100 Subject: [PATCH] Limit arf interval for low fpf clips. This patch limits the maximum arf interval length to approximately half a second. In some low fps animations in particular the existing code was selecting an overly long interval which was hurting visual quality. For a sample problem test clip (360P animation , 15fps, ~200Kbit/s) this change also improved metrics by >0.5 db. There may be some clips where this hurts metrics a little, but the worst case impact visually is likely to be less than having an interval that is much too long. On more normal material at 24 fps or higher, the impact is likely to be nil/minimal. Change-Id: Id8b57413931a670c861213ea91d7cc596375a297 --- vp9/encoder/vp9_firstpass.c | 2 ++ vp9/encoder/vp9_ratectrl.c | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index bf9e50047..8103abc83 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1852,6 +1852,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { active_max_gf_interval = 12 + MIN(4, (int_lbq / 6)); if (active_max_gf_interval > rc->max_gf_interval) active_max_gf_interval = rc->max_gf_interval; + if (active_max_gf_interval < active_min_gf_interval) + active_max_gf_interval = active_min_gf_interval; } } diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 7783f7bdc..8713caa73 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -1612,8 +1612,11 @@ int vp9_compute_qdelta_by_rate(const RATE_CONTROL *rc, FRAME_TYPE frame_type, void vp9_rc_set_gf_max_interval(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 Maximum gf/arf interval. + rc->max_gf_interval = + MIN(16, (int)(cpi->framerate / 2.0)); + // 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;