Add CONFIG_SIMPLE_BWD_ADAPT experiment.

Use just one tile for CDF backwards update.

Enable by default.

Change-Id: I0c89f87c16e5b24894f8cd3151efc5ad5aaecb49
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 9596a69..002f4ef 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -3665,6 +3665,10 @@
   int tile_group_start_row = 0;
 #endif
 
+#if CONFIG_SIMPLE_BWD_ADAPT
+  size_t max_tile_size = 0;
+  cm->largest_tile_id = 0;
+#endif
   for (r = 0; r < tile_rows; ++r) {
     for (c = 0; c < tile_cols; ++c, ++tc) {
       TileBufferDec *const buf = &tile_buffers[r][c];
@@ -3700,6 +3704,12 @@
       cm->tile_group_start_row[r][c] = tile_group_start_row;
       cm->tile_group_start_col[r][c] = tile_group_start_col;
 #endif
+#if CONFIG_SIMPLE_BWD_ADAPT
+      if (buf->size > max_tile_size) {
+        max_tile_size = buf->size;
+        cm->largest_tile_id = r * tile_cols + c;
+      }
+#endif
     }
   }
 }
@@ -5461,11 +5471,11 @@
   return (BITSTREAM_PROFILE)profile;
 }
 
-static void make_update_tile_list_dec(AV1Decoder *pbi, int tile_rows,
-                                      int tile_cols, FRAME_CONTEXT *ec_ctxs[]) {
+static void make_update_tile_list_dec(AV1Decoder *pbi, int start_tile,
+                                      int num_tile, FRAME_CONTEXT *ec_ctxs[]) {
   int i;
-  for (i = 0; i < tile_rows * tile_cols; ++i)
-    ec_ctxs[i] = &pbi->tile_data[i].tctx;
+  for (i = start_tile; i < start_tile + num_tile; ++i)
+    ec_ctxs[i - start_tile] = &pbi->tile_data[i].tctx;
 }
 
 #if CONFIG_FRAME_SUPERRES
@@ -5766,12 +5776,21 @@
 
   if (!xd->corrupted) {
     if (cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) {
-      FRAME_CONTEXT **tile_ctxs = aom_malloc(cm->tile_rows * cm->tile_cols *
-                                             sizeof(&pbi->tile_data[0].tctx));
-      aom_cdf_prob **cdf_ptrs =
-          aom_malloc(cm->tile_rows * cm->tile_cols *
-                     sizeof(&pbi->tile_data[0].tctx.partition_cdf[0][0]));
-      make_update_tile_list_dec(pbi, cm->tile_rows, cm->tile_cols, tile_ctxs);
+#if CONFIG_SIMPLE_BWD_ADAPT
+      const int num_bwd_ctxs = 1;
+#else
+      const int num_bwd_ctxs = cm->tile_rows * cm->tile_cols;
+#endif
+      FRAME_CONTEXT **tile_ctxs =
+          aom_malloc(num_bwd_ctxs * sizeof(&pbi->tile_data[0].tctx));
+      aom_cdf_prob **cdf_ptrs = aom_malloc(
+          num_bwd_ctxs * sizeof(&pbi->tile_data[0].tctx.partition_cdf[0][0]));
+#if CONFIG_SIMPLE_BWD_ADAPT
+      make_update_tile_list_dec(pbi, cm->largest_tile_id, num_bwd_ctxs,
+                                tile_ctxs);
+#else
+      make_update_tile_list_dec(pbi, 0, num_bwd_ctxs, tile_ctxs);
+#endif
 #if CONFIG_LV_MAP
       av1_adapt_coef_probs(cm);
 #endif  // CONFIG_LV_MAP
@@ -5780,12 +5799,11 @@
 #endif
       av1_adapt_intra_frame_probs(cm);
       av1_average_tile_coef_cdfs(pbi->common.fc, tile_ctxs, cdf_ptrs,
-                                 cm->tile_rows * cm->tile_cols);
+                                 num_bwd_ctxs);
       av1_average_tile_intra_cdfs(pbi->common.fc, tile_ctxs, cdf_ptrs,
-                                  cm->tile_rows * cm->tile_cols);
+                                  num_bwd_ctxs);
 #if CONFIG_PVQ
-      av1_average_tile_pvq_cdfs(pbi->common.fc, tile_ctxs,
-                                cm->tile_rows * cm->tile_cols);
+      av1_average_tile_pvq_cdfs(pbi->common.fc, tile_ctxs, num_bwd_ctxs);
 #endif  // CONFIG_PVQ
 #if CONFIG_ADAPT_SCAN
       av1_adapt_scan_order(cm);
@@ -5797,9 +5815,9 @@
         av1_adapt_mv_probs(cm, cm->allow_high_precision_mv);
 #endif
         av1_average_tile_inter_cdfs(&pbi->common, pbi->common.fc, tile_ctxs,
-                                    cdf_ptrs, cm->tile_rows * cm->tile_cols);
+                                    cdf_ptrs, num_bwd_ctxs);
         av1_average_tile_mv_cdfs(pbi->common.fc, tile_ctxs, cdf_ptrs,
-                                 cm->tile_rows * cm->tile_cols);
+                                 num_bwd_ctxs);
       }
       aom_free(tile_ctxs);
       aom_free(cdf_ptrs);