Introduce adaptive filter search speed feature

It skips the interpolation filter evaluation based on reference frames
interpolation filter count.

For speed = 2, 3, and 4 presets, BD-rate impact is seen by 0.01%,
0.02% and 0% (as per AWCY runs) with encode time reduction of
1.0%, 0.9% and 0.76% (averaged across multiple test cases).

STATS_CHANGED

Change-Id: I6339f448079f78b756170d816893e4c37fcf7a27
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 135e3f4..5a5cffd 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5092,6 +5092,36 @@
            cpi->refresh_last_frame);
 }
 
+static int setup_interp_filter_search_mask(AV1_COMP *cpi) {
+  InterpFilters ifilter;
+  int ref_total[REF_FRAMES] = { 0 };
+  MV_REFERENCE_FRAME ref;
+  int mask = 0;
+  int arf_idx = ALTREF_FRAME;
+  if (cpi->common.last_frame_type == KEY_FRAME || cpi->refresh_alt_ref_frame)
+    return mask;
+  for (ref = LAST_FRAME; ref <= ALTREF_FRAME; ++ref)
+    for (ifilter = EIGHTTAP_REGULAR; ifilter <= MULTITAP_SHARP; ++ifilter)
+      ref_total[ref] += cpi->interp_filter_selected[ref][ifilter];
+
+  for (ifilter = EIGHTTAP_REGULAR; ifilter <= MULTITAP_SHARP; ++ifilter) {
+    if ((ref_total[LAST_FRAME] &&
+         cpi->interp_filter_selected[LAST_FRAME][ifilter] * 30 <=
+             ref_total[LAST_FRAME]) &&
+        (((cpi->interp_filter_selected[LAST2_FRAME][ifilter] * 20) +
+          (cpi->interp_filter_selected[LAST3_FRAME][ifilter] * 20) +
+          (cpi->interp_filter_selected[GOLDEN_FRAME][ifilter] * 20) +
+          (cpi->interp_filter_selected[BWDREF_FRAME][ifilter] * 10) +
+          (cpi->interp_filter_selected[ALTREF2_FRAME][ifilter] * 10) +
+          (cpi->interp_filter_selected[arf_idx][ifilter] * 10)) <
+         (ref_total[LAST2_FRAME] + ref_total[LAST3_FRAME] +
+          ref_total[GOLDEN_FRAME] + ref_total[BWDREF_FRAME] +
+          ref_total[ALTREF2_FRAME] + ref_total[ALTREF_FRAME])))
+      mask |= 1 << ifilter;
+  }
+  return mask;
+}
+
 static int encode_frame_to_data_rate(AV1_COMP *cpi, size_t *size, uint8_t *dest,
                                      int skip_adapt,
                                      unsigned int *frame_flags) {
@@ -5126,6 +5156,10 @@
   if (current_frame->frame_type == KEY_FRAME && cm->show_frame)
     current_frame->frame_number = 0;
 
+  cm->last_frame_type = current_frame->frame_type;
+  if (cpi->oxcf.pass == 2 && cpi->sf.adaptive_interp_filter_search)
+    cpi->sf.interp_filter_search_mask = setup_interp_filter_search_mask(cpi);
+
   // NOTE:
   // (1) Move the setup of the ref_frame_flags upfront as it would be
   //     determined by the current frame properties;
@@ -5420,6 +5454,7 @@
     cpi->frame_flags |= FRAMEFLAGS_BWDREF;
   else
     cpi->frame_flags &= ~FRAMEFLAGS_BWDREF;
+  cm->last_frame_type = current_frame->frame_type;
 
   av1_rc_postencode_update(cpi, *size);