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;