Correct offset of gf index when key frame filtering mode is 2
When an overlay frame is enabled for compensating the filtered key
frame, the gf_index of following inter frames will start from 2.
To fetch user specified configurations about ref frames, this patch
will map between the step index and gf_index based on an offset
derived from whether an overlay for filtered key frame is involved.
Change-Id: If5cf61ddb1ac02c0fda4b7664d048bf8b1f0c55c
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index cc3897d..9a19b28 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -49,8 +49,10 @@
const SubGOPStepCfg *get_subgop_step(const GF_GROUP *const gf_group,
int index) {
const SubGOPCfg *subgop_cfg = gf_group->subgop_cfg;
+ const int offset = gf_group->has_overlay_for_key_frame ? 2 : 1;
if (subgop_cfg == NULL) return NULL;
- return index == 0 ? gf_group->last_step_prev : &subgop_cfg->step[index - 1];
+ return index == 0 ? gf_group->last_step_prev
+ : &subgop_cfg->step[index - offset];
}
void av1_configure_buffer_updates(
@@ -774,6 +776,7 @@
if (gf_index < 0) return 0;
if (gf_group->subgop_cfg == NULL) return 0;
if (gf_index == 0) return gf_group->last_step_prev != NULL;
+ if (gf_index == 1) return !gf_group->has_overlay_for_key_frame;
return 1;
}
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 001a362..4e6584e 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -823,6 +823,7 @@
typedef struct {
/*!\cond */
unsigned char is_user_specified;
+ unsigned char has_overlay_for_key_frame;
unsigned char index;
FRAME_UPDATE_TYPE update_type[MAX_STATIC_GF_GROUP_LENGTH];
unsigned char arf_src_offset[MAX_STATIC_GF_GROUP_LENGTH];
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c
index 7fecbea..68e69be 100644
--- a/av1/encoder/gop_structure.c
+++ b/av1/encoder/gop_structure.c
@@ -201,6 +201,7 @@
if (first_frame_update_type == KF_UPDATE &&
cpi->oxcf.kf_cfg.enable_keyframe_filtering > 1) {
+ gf_group->has_overlay_for_key_frame = 1;
gf_group->update_type[frame_index] = ARF_UPDATE;
gf_group->arf_src_offset[frame_index] = 0;
gf_group->cur_frame_idx[frame_index] = cur_frame_index;
@@ -320,6 +321,7 @@
key_frame ? KF_UPDATE
: rc->source_alt_ref_active ? OVERLAY_UPDATE : GF_UPDATE;
gf_group->is_user_specified = 0;
+ gf_group->has_overlay_for_key_frame = 0;
gf_group->size = construct_multi_layer_gf_structure(
cpi, twopass, gf_group, rc, frame_info, rc->baseline_gf_interval,
first_frame_update_type);