Having a very low "lag_in_frames" value could cause the encoder to create
incorrect / corrupt ARF groups including displayed frames that update the
ARF buffer and false overlay frames that are coded at low rate but are not
actually overlays of a real ARF frame.
This is linked to a reported unit test "slow down" where the chosen parameters
(lag of 3 frames) gave rise to such "broken" ARF group(s).
See also BUG=webm:1454
Change-Id: If52d0236243ed5552537d1ea9ed3fed8c867232c
}
#endif
+#define MIN_LOOKAHEAD_FOR_ARFS 4
static INLINE int is_altref_enabled(const VP9_COMP *const cpi) {
return !(cpi->oxcf.mode == REALTIME && cpi->oxcf.rc_mode == VPX_CBR) &&
- cpi->oxcf.lag_in_frames > 0 &&
+ cpi->oxcf.lag_in_frames >= MIN_LOOKAHEAD_FOR_ARFS &&
(cpi->oxcf.enable_auto_arf &&
(!is_two_pass_svc(cpi) ||
cpi->oxcf.ss_enable_auto_arf[cpi->svc.spatial_layer_id]));
(MAX_LAG_BUFFERS - 1));
}
+ // For formation of valid ARF groups lag_in _frames should be 0 or greater
+ // than the max_gf_interval + 2
+ if (cfg->g_lag_in_frames > 0 && extra_cfg->max_gf_interval > 0 &&
+ cfg->g_lag_in_frames < extra_cfg->max_gf_interval + 2) {
+ ERROR("Set lag in frames to 0 (low delay) or >= (max-gf-interval + 2)");
+ }
+
if (cfg->rc_resize_allowed == 1) {
RANGE_CHECK(cfg, rc_scaled_width, 0, cfg->g_w);
RANGE_CHECK(cfg, rc_scaled_height, 0, cfg->g_h);