Use the explicit control to decide ref buffer update
BUG=aomedia:3079
Change-Id: I9255f406195decca5629337742a72affbba14daa
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 865b186..83bba72 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -51,11 +51,10 @@
void av1_configure_buffer_updates(
AV1_COMP *const cpi, RefreshFrameFlagsInfo *const refresh_frame_flags,
- const FRAME_UPDATE_TYPE type, const FRAME_TYPE frame_type,
+ const FRAME_UPDATE_TYPE type, const REFBUF_STATE refbuf_state,
int force_refresh_all) {
// NOTE(weitinglin): Should we define another function to take care of
// cpi->rc.is_$Source_Type to make this function as it is in the comment?
-
const ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags =
&cpi->ext_flags.refresh_frame;
cpi->rc.is_src_frame_alt_ref = 0;
@@ -74,23 +73,21 @@
break;
case OVERLAY_UPDATE:
- if (frame_type == KEY_FRAME && cpi->rc.frames_to_key == 0) {
+ if (refbuf_state == REFBUF_RESET)
set_refresh_frame_flags(refresh_frame_flags, true, true, true);
- } else {
+ else
set_refresh_frame_flags(refresh_frame_flags, true, false, false);
- }
+
cpi->rc.is_src_frame_alt_ref = 1;
break;
case ARF_UPDATE:
// NOTE: BWDREF does not get updated along with ALTREF_FRAME.
- if (frame_type == KEY_FRAME && !cpi->no_show_fwd_kf) {
- // TODO(bohanli): consider moving this to force_refresh_all?
- // This is Keyframe as arf
+ if (refbuf_state == REFBUF_RESET)
set_refresh_frame_flags(refresh_frame_flags, true, true, true);
- } else {
+ else
set_refresh_frame_flags(refresh_frame_flags, false, false, true);
- }
+
break;
case INTNL_OVERLAY_UPDATE:
@@ -1650,9 +1647,9 @@
frame_params.frame_type == S_FRAME) &&
!frame_params.show_existing_frame;
- av1_configure_buffer_updates(cpi, &frame_params.refresh_frame,
- frame_update_type, frame_params.frame_type,
- force_refresh_all);
+ av1_configure_buffer_updates(
+ cpi, &frame_params.refresh_frame, frame_update_type,
+ gf_group->refbuf_state[cpi->gf_frame_index], force_refresh_all);
if (!is_stat_generation_stage(cpi)) {
const RefCntBuffer *ref_frames[INTER_REFS_PER_FRAME];
diff --git a/av1/encoder/encode_strategy.h b/av1/encoder/encode_strategy.h
index 1df9857..4f6d9bd 100644
--- a/av1/encoder/encode_strategy.h
+++ b/av1/encoder/encode_strategy.h
@@ -64,7 +64,7 @@
// refresh_*_frame flags to be set, because we refresh all buffers in this case.
void av1_configure_buffer_updates(
AV1_COMP *const cpi, RefreshFrameFlagsInfo *const refresh_frame_flags,
- const FRAME_UPDATE_TYPE type, const FRAME_TYPE frame_type,
+ const FRAME_UPDATE_TYPE type, const REFBUF_STATE refbuf_state,
int force_refresh_all);
int av1_get_refresh_frame_flags(const AV1_COMP *const cpi,
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index 554d913..702f2ef 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -1580,7 +1580,7 @@
cm->current_frame.frame_type = gf_group->frame_type[gf_index];
av1_configure_buffer_updates(cpi, &this_frame_params.refresh_frame,
gf_group->update_type[gf_index],
- cm->current_frame.frame_type, 0);
+ gf_group->refbuf_state[gf_index], 0);
memcpy(&cpi->refresh_frame, &this_frame_params.refresh_frame,
sizeof(cpi->refresh_frame));
@@ -1660,7 +1660,7 @@
av1_configure_buffer_updates(cpi, &this_frame_params.refresh_frame,
gf_group->update_type[cpi->gf_frame_index],
- frame_params->frame_type, 0);
+ gf_group->update_type[cpi->gf_frame_index], 0);
cm->current_frame.frame_type = frame_params->frame_type;
cm->show_frame = frame_params->show_frame;