Make low-delay mode work correctly with lag 0.
We allow num_lap_buffers = 0 when lag-in-frames = 0 to make this case
work correctly.
Earlier, this case was setting GF interval to be 1 always, ignoring user
specified min/max GF intervals.
Now, GF intervals will be set to user-specified max GF interval instead.
Low-Delay 150 frame results (before vs after):
----------------------------------------------
lowres2: -8.495
midres2: -8.409
objective-1-fast: -11.381
This also allows the low-delay subgop config with pyramid-like levels
to work correctly.
Low-Delay 150 frame results (before vs after with --subgop-config-str=ld):
--------------------------------------------------------------------------
lowres2: -9.131
midres2: -8.918
objective-1-fast: -13.355
STATS_CHANGED
BUG=aomedia:2821
Change-Id: Ifbff4874ce644921ea3898a3136564041a2d79f3
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 6d63966..3d0c77c 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -2197,7 +2197,7 @@
// Enable look ahead - enabled for AOM_Q, AOM_CQ, AOM_VBR
*num_lap_buffers = priv->cfg.g_lag_in_frames;
*num_lap_buffers =
- clamp(*num_lap_buffers, 1,
+ clamp(*num_lap_buffers, 0,
AOMMIN(MAX_LAP_BUFFERS, priv->oxcf.kf_cfg.key_freq_max +
SCENE_CUT_KEY_TEST_INTERVAL));
if ((int)priv->cfg.g_lag_in_frames - (*num_lap_buffers) >=
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index 603bf08..d58c49f 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -1941,38 +1941,29 @@
void av1_rc_set_gf_interval_range(const AV1_COMP *const cpi,
RATE_CONTROL *const rc) {
const AV1EncoderConfig *const oxcf = &cpi->oxcf;
+ rc->max_gf_interval = oxcf->gf_cfg.max_gf_interval;
+ rc->min_gf_interval = oxcf->gf_cfg.min_gf_interval;
+ if (rc->min_gf_interval == 0)
+ rc->min_gf_interval = av1_rc_get_default_min_gf_interval(
+ oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height, cpi->framerate);
+ if (rc->max_gf_interval == 0)
+ rc->max_gf_interval =
+ av1_rc_get_default_max_gf_interval(cpi->framerate, rc->min_gf_interval);
+ /*
+ * Extended max interval for genuinely static scenes like slide shows.
+ * The no.of.stats available in the case of LAP is limited,
+ * hence setting to max_gf_interval.
+ */
+ if (cpi->lap_enabled)
+ rc->static_scene_max_gf_interval = rc->max_gf_interval + 1;
+ else
+ rc->static_scene_max_gf_interval = MAX_STATIC_GF_GROUP_LENGTH;
- // Special case code for 1 pass fixed Q mode tests
- if ((has_no_stats_stage(cpi)) && (oxcf->rc_cfg.mode == AOM_Q)) {
- rc->max_gf_interval = FIXED_GF_INTERVAL;
- rc->min_gf_interval = FIXED_GF_INTERVAL;
- rc->static_scene_max_gf_interval = FIXED_GF_INTERVAL;
- } else {
- // Set Maximum gf/arf interval
- rc->max_gf_interval = oxcf->gf_cfg.max_gf_interval;
- rc->min_gf_interval = oxcf->gf_cfg.min_gf_interval;
- if (rc->min_gf_interval == 0)
- rc->min_gf_interval = av1_rc_get_default_min_gf_interval(
- oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height, cpi->framerate);
- if (rc->max_gf_interval == 0)
- rc->max_gf_interval = av1_rc_get_default_max_gf_interval(
- cpi->framerate, rc->min_gf_interval);
- /*
- * Extended max interval for genuinely static scenes like slide shows.
- * The no.of.stats available in the case of LAP is limited,
- * hence setting to max_gf_interval.
- */
- if (cpi->lap_enabled)
- rc->static_scene_max_gf_interval = rc->max_gf_interval + 1;
- else
- rc->static_scene_max_gf_interval = MAX_STATIC_GF_GROUP_LENGTH;
+ if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
+ rc->max_gf_interval = rc->static_scene_max_gf_interval;
- 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 = AOMMIN(rc->min_gf_interval, rc->max_gf_interval);
- }
+ // Clamp min to max
+ rc->min_gf_interval = AOMMIN(rc->min_gf_interval, rc->max_gf_interval);
}
void av1_rc_update_framerate(AV1_COMP *cpi, int width, int height) {