Move refresh_*_frame flags to EncodeFrameParams

refresh_*_frame flags are used to tell the low-level encoder which
reference frame buffers should be refreshed by this frame.  This patch
moves these flags to EncodeFrameParams to make it clear that they are
set by the high-level strategy code and passed to the low-level encoder
as parameters.  The flags are copied to their original locations by
av1_encode().

The primary uses of these in the low-level encoder are:
* By get_refresh_frame_flags() to calculate refresh_frame_flags
* By update_reference_frames() to determine reference buffer assignments
I plan to move these two to high-level strategy imminently so that
refresh_frame_flags and reference buffer assignments are parameters
passed to the low-level encoder.  A variety of other things also have
behaviour depending on these flags, which should probably be changed
to be explicit parameters in EncodeFrameParams.

This forms part of wider restructuring and refactoring in order to
achieve a clean API separation at the entry to the low-level encoder and
to make the high-level encoding strategy easier to modify.

BUG=aomedia:2244

Change-Id: I71825ab43a0510c5b87a083749b29dbc7a41cc4e
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index e4952db..bd6e65b 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -32,6 +32,7 @@
 #include "av1/encoder/tpl_model.h"
 
 void av1_configure_buffer_updates(AV1_COMP *const cpi,
+                                  EncodeFrameParams *const frame_params,
                                   const FRAME_UPDATE_TYPE type,
                                   int force_refresh_all) {
   // NOTE(weitinglin): Should we define another function to take care of
@@ -45,102 +46,102 @@
 
   switch (type) {
     case KF_UPDATE:
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 1;
-      cpi->refresh_bwd_ref_frame = 1;
-      cpi->refresh_alt2_ref_frame = 1;
-      cpi->refresh_alt_ref_frame = 1;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 1;
+      frame_params->refresh_bwd_ref_frame = 1;
+      frame_params->refresh_alt2_ref_frame = 1;
+      frame_params->refresh_alt_ref_frame = 1;
       break;
 
     case LF_UPDATE:
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 0;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 0;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
       break;
 
     case GF_UPDATE:
       // TODO(zoeliu): To further investigate whether 'refresh_last_frame' is
       //               needed.
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 1;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 1;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
       break;
 
     case OVERLAY_UPDATE:
-      cpi->refresh_last_frame = 0;
-      cpi->refresh_golden_frame = 1;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 0;
+      frame_params->refresh_golden_frame = 1;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
 
       cpi->rc.is_src_frame_alt_ref = 1;
       break;
 
     case ARF_UPDATE:
-      cpi->refresh_last_frame = 0;
-      cpi->refresh_golden_frame = 0;
+      frame_params->refresh_last_frame = 0;
+      frame_params->refresh_golden_frame = 0;
       // NOTE: BWDREF does not get updated along with ALTREF_FRAME.
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 1;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 1;
       break;
 
     case BRF_UPDATE:
-      cpi->refresh_last_frame = 0;
-      cpi->refresh_golden_frame = 0;
-      cpi->refresh_bwd_ref_frame = 1;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 0;
+      frame_params->refresh_golden_frame = 0;
+      frame_params->refresh_bwd_ref_frame = 1;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
 
       cpi->rc.is_bwd_ref_frame = 1;
       break;
 
     case LAST_BIPRED_UPDATE:
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 0;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 0;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
 
       cpi->rc.is_last_bipred_frame = 1;
       break;
 
     case BIPRED_UPDATE:
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 0;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 0;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
 
       cpi->rc.is_bipred_frame = 1;
       break;
 
     case INTNL_OVERLAY_UPDATE:
-      cpi->refresh_last_frame = 1;
-      cpi->refresh_golden_frame = 0;
-      cpi->refresh_bwd_ref_frame = 0;
-      cpi->refresh_alt2_ref_frame = 0;
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_last_frame = 1;
+      frame_params->refresh_golden_frame = 0;
+      frame_params->refresh_bwd_ref_frame = 0;
+      frame_params->refresh_alt2_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
 
       cpi->rc.is_src_frame_alt_ref = 1;
       cpi->rc.is_src_frame_ext_arf = 1;
       break;
 
     case INTNL_ARF_UPDATE:
-      cpi->refresh_last_frame = 0;
-      cpi->refresh_golden_frame = 0;
+      frame_params->refresh_last_frame = 0;
+      frame_params->refresh_golden_frame = 0;
       if (cpi->new_bwdref_update_rule == 1 && cpi->oxcf.pass == 2) {
-        cpi->refresh_bwd_ref_frame = 1;
-        cpi->refresh_alt2_ref_frame = 0;
+        frame_params->refresh_bwd_ref_frame = 1;
+        frame_params->refresh_alt2_ref_frame = 0;
       } else {
-        cpi->refresh_bwd_ref_frame = 0;
-        cpi->refresh_alt2_ref_frame = 1;
+        frame_params->refresh_bwd_ref_frame = 0;
+        frame_params->refresh_alt2_ref_frame = 1;
       }
-      cpi->refresh_alt_ref_frame = 0;
+      frame_params->refresh_alt_ref_frame = 0;
       break;
 
     default: assert(0); break;
@@ -148,19 +149,19 @@
 
   if (cpi->ext_refresh_frame_flags_pending &&
       (cpi->oxcf.pass == 0 || cpi->oxcf.pass == 2)) {
-    cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
-    cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
-    cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
-    cpi->refresh_bwd_ref_frame = cpi->ext_refresh_bwd_ref_frame;
-    cpi->refresh_alt2_ref_frame = cpi->ext_refresh_alt2_ref_frame;
+    frame_params->refresh_last_frame = cpi->ext_refresh_last_frame;
+    frame_params->refresh_golden_frame = cpi->ext_refresh_golden_frame;
+    frame_params->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
+    frame_params->refresh_bwd_ref_frame = cpi->ext_refresh_bwd_ref_frame;
+    frame_params->refresh_alt2_ref_frame = cpi->ext_refresh_alt2_ref_frame;
   }
 
   if (force_refresh_all) {
-    cpi->refresh_last_frame = 1;
-    cpi->refresh_golden_frame = 1;
-    cpi->refresh_bwd_ref_frame = 1;
-    cpi->refresh_alt2_ref_frame = 1;
-    cpi->refresh_alt_ref_frame = 1;
+    frame_params->refresh_last_frame = 1;
+    frame_params->refresh_golden_frame = 1;
+    frame_params->refresh_bwd_ref_frame = 1;
+    frame_params->refresh_alt2_ref_frame = 1;
+    frame_params->refresh_alt_ref_frame = 1;
   }
 }
 
@@ -379,13 +380,13 @@
     return REGULAR_FRAME;
   else if (gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE)
     return EXT_ARF_FRAME;
-  else if (cpi->refresh_alt_ref_frame)
+  else if (frame_params->refresh_alt_ref_frame)
     return ARF_FRAME;
   else if (cpi->rc.is_src_frame_alt_ref)
     return OVERLAY_FRAME;
-  else if (cpi->refresh_golden_frame)
+  else if (frame_params->refresh_golden_frame)
     return GLD_FRAME;
-  else if (cpi->refresh_bwd_ref_frame)
+  else if (frame_params->refresh_bwd_ref_frame)
     return BRF_FRAME;
   else
     return REGULAR_FRAME;
@@ -836,7 +837,7 @@
     cm->min_qmlevel = cpi->oxcf.qm_minlevel;
     cm->max_qmlevel = cpi->oxcf.qm_maxlevel;
     if (cpi->twopass.gf_group.index == 1 && cpi->oxcf.enable_tpl_model) {
-      av1_configure_buffer_updates(cpi, frame_update_type, 0);
+      av1_configure_buffer_updates(cpi, &frame_params, frame_update_type, 0);
       av1_set_frame_size(cpi, cm->width, cm->height);
       av1_tpl_setup_stats(cpi, &frame_input);
     }
@@ -877,7 +878,8 @@
        frame_params.frame_type == S_FRAME) &&
       !cm->show_existing_frame;
 
-  av1_configure_buffer_updates(cpi, frame_update_type, force_refresh_all);
+  av1_configure_buffer_updates(cpi, &frame_params, frame_update_type,
+                               force_refresh_all);
 
   if (oxcf->pass == 0 || oxcf->pass == 2) {
     // Work out which reference frame slots may be used.
diff --git a/av1/encoder/encode_strategy.h b/av1/encoder/encode_strategy.h
index da09de1..6830e44 100644
--- a/av1/encoder/encode_strategy.h
+++ b/av1/encoder/encode_strategy.h
@@ -35,6 +35,7 @@
 // force_refresh_all is used when we have a KEY_FRAME or S_FRAME.  It forces all
 // refresh_*_frame flags to be set, because we refresh all buffers in this case.
 void av1_configure_buffer_updates(AV1_COMP *const cpi,
+                                  EncodeFrameParams *const frame_params,
                                   const FRAME_UPDATE_TYPE type,
                                   int force_refresh_all);
 
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 6a76ba2..67f0293 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5471,6 +5471,12 @@
   cpi->ref_frame_flags = frame_params->ref_frame_flags;
   cpi->speed = frame_params->speed;
 
+  cpi->refresh_last_frame = frame_params->refresh_last_frame;
+  cpi->refresh_golden_frame = frame_params->refresh_golden_frame;
+  cpi->refresh_bwd_ref_frame = frame_params->refresh_bwd_ref_frame;
+  cpi->refresh_alt2_ref_frame = frame_params->refresh_alt2_ref_frame;
+  cpi->refresh_alt_ref_frame = frame_params->refresh_alt_ref_frame;
+
   if (current_frame->frame_type == KEY_FRAME && cm->show_frame)
     current_frame->frame_number = 0;
 
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index f65b024..02d5fac 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -928,9 +928,16 @@
   int order_offset;
   int show_frame;
 
-  // This is a bitmask of which reference slots can be used in this frame
+  // Bitmask of which reference buffers may be referenced by this frame
   int ref_frame_flags;
 
+  // Flags which determine which reference buffers are refreshed by this frame
+  int refresh_last_frame;
+  int refresh_golden_frame;
+  int refresh_bwd_ref_frame;
+  int refresh_alt2_ref_frame;
+  int refresh_alt_ref_frame;
+
   // Speed level to use for this frame: Bigger number means faster.
   int speed;
 
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index eca6911..eeeb094 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -1308,7 +1308,8 @@
   }
 }
 
-void av1_estimate_qp_gop(AV1_COMP *cpi) {
+void av1_estimate_qp_gop(AV1_COMP *cpi,
+                         struct EncodeFrameParams *const frame_params) {
   AV1_COMMON *const cm = &cpi->common;
   int gop_length = cpi->rc.baseline_gf_interval;
   int bottom_index, top_index;
@@ -1323,7 +1324,8 @@
     cpi->twopass.gf_group.index = idx;
     rc_set_frame_target(cpi, target_rate, cm->width, cm->height);
     av1_configure_buffer_updates(
-        cpi, cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index], 0);
+        cpi, frame_params,
+        cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index], 0);
     tpl_frame->base_qindex = rc_pick_q_and_bounds_two_pass(
         cpi, cm->width, cm->height, &bottom_index, &top_index, &arf_q);
     tpl_frame->base_qindex = AOMMAX(tpl_frame->base_qindex, 1);
@@ -1331,7 +1333,8 @@
   // Reset the actual index and frame update
   cpi->twopass.gf_group.index = gf_index;
   av1_configure_buffer_updates(
-      cpi, cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index], 0);
+      cpi, frame_params,
+      cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index], 0);
 }
 
 void av1_rc_postencode_update(AV1_COMP *cpi, uint64_t bytes_used) {
diff --git a/av1/encoder/ratectrl.h b/av1/encoder/ratectrl.h
index 3f2dfb1..69666c5 100644
--- a/av1/encoder/ratectrl.h
+++ b/av1/encoder/ratectrl.h
@@ -271,7 +271,8 @@
 
 int av1_resize_one_pass_cbr(struct AV1_COMP *cpi);
 
-void av1_estimate_qp_gop(struct AV1_COMP *cpi);
+void av1_estimate_qp_gop(struct AV1_COMP *cpi,
+                         struct EncodeFrameParams *const frame_params);
 
 #ifdef __cplusplus
 }  // extern "C"