Introduce adjust_num_frames_for_arf_filtering sf for speed 6

For temporal filtering, the number of frames required for
filtering is adjusted based on frame update type, q index,
arf-boost and a sf 'num_frames_used_in_tf'. This CL introduces
a sf 'adjust_num_frames_for_arf_filtering' to adjust the frame
count based on the noise level of the current frame. The
adjustment is done such that low-noise frame considers more
frames to provide a filtered frame which can be used for better
prediction and vice versa for high-noise frames. Currently, the
sf is enabled only for speed 6.

     Instruction Count        BD-Rate Loss(%)
cpu    Reduction(%)    avg.psnr   ovr.psnr    ssim
 6        1.795       -0.1979    -0.1324     -0.2099

STATS_CHANGED

Change-Id: I010554b3cd0a15dee83af9a3572243137b67cec7
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 594ecb7..3e37288 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -886,7 +886,6 @@
     sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH_LVL4;
 
     sf->hl_sf.recode_tolerance = 55;
-    if (!is_480p_or_larger) sf->hl_sf.num_frames_used_in_tf = 3;
   }
 }
 
@@ -1246,6 +1245,8 @@
   if (speed >= 6) {
     sf->hl_sf.disable_extra_sc_testing = 1;
     sf->hl_sf.second_alt_ref_filtering = 0;
+    sf->hl_sf.adjust_num_frames_for_arf_filtering =
+        allow_screen_content_tools ? 0 : 1;
 
     sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 3;
     sf->inter_sf.selective_ref_frame = 6;
@@ -1868,7 +1869,7 @@
   hl_sf->superres_auto_search_type = SUPERRES_AUTO_ALL;
   hl_sf->disable_extra_sc_testing = 0;
   hl_sf->second_alt_ref_filtering = 1;
-  hl_sf->num_frames_used_in_tf = INT_MAX;
+  hl_sf->adjust_num_frames_for_arf_filtering = 0;
   hl_sf->accurate_bit_estimate = 0;
   hl_sf->weight_calc_level_in_tf = 0;
 }
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 910e191..2392a35 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -432,10 +432,10 @@
   int second_alt_ref_filtering;
 
   /*!
-   * Number of frames to be used in temporal filtering controlled based on noise
-   * levels and arf-q.
+   * The number of frames to be used during temporal filtering of an ARF frame
+   * is adjusted based on noise level of the current frame.
    */
-  int num_frames_used_in_tf;
+  int adjust_num_frames_for_arf_filtering;
 
   /*!
    * Decide the bit estimation approach used in qindex decision.
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 76897e8..91a0c78 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -1051,6 +1051,18 @@
     adjust_num = 0;
   } else if ((update_type == KF_UPDATE) && q <= 10) {
     adjust_num = 0;
+  } else if (cpi->sf.hl_sf.adjust_num_frames_for_arf_filtering &&
+             update_type != KF_UPDATE) {
+    // Adjust number of frames to be considered for filtering based on noise
+    // level of the current frame. For low-noise frame, use more frames to
+    // filter such that the filtered frame can provide better predictions for
+    // subsequent frames and vice versa.
+    if (noise_levels[AOM_PLANE_Y] < 0.5)
+      adjust_num = 4;
+    else if (noise_levels[AOM_PLANE_Y] < 1.0)
+      adjust_num = 2;
+    else
+      adjust_num = 0;
   }
   num_frames = AOMMIN(num_frames + adjust_num, lookahead_depth);
 
@@ -1066,10 +1078,6 @@
     num_frames = AOMMIN(num_frames, gfu_boost / 150);
     num_frames += !(num_frames & 1);  // Make the number odd.
 
-    // Limit the number of frames if noise levels are low and high quantizers.
-    if (noise_levels[AOM_PLANE_Y] < 1.9 && cpi->ppi->p_rc.arf_q > 40)
-      num_frames = AOMMIN(num_frames, cpi->sf.hl_sf.num_frames_used_in_tf);
-
     // Only use 2 neighbours for the second ARF.
     if (update_type == INTNL_ARF_UPDATE) num_frames = AOMMIN(num_frames, 3);
     if (AOMMIN(max_after, max_before) >= num_frames / 2) {