Add CONFIG_SIMPLE_BWD_ADAPT experiment.

Use just one tile for CDF backwards update.

Enable by default.

Change-Id: I0c89f87c16e5b24894f8cd3151efc5ad5aaecb49
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index fbfff1b..7d8dde1 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5352,12 +5352,12 @@
 }
 #endif  // DUMP_RECON_FRAMES
 
-static void make_update_tile_list_enc(AV1_COMP *cpi, const int tile_rows,
-                                      const int tile_cols,
+static void make_update_tile_list_enc(AV1_COMP *cpi, const int start_tile,
+                                      const int num_tiles,
                                       FRAME_CONTEXT *ec_ctxs[]) {
   int i;
-  for (i = 0; i < tile_rows * tile_cols; ++i)
-    ec_ctxs[i] = &cpi->tile_data[i].tctx;
+  for (i = start_tile; i < start_tile + num_tiles; ++i)
+    ec_ctxs[i - start_tile] = &cpi->tile_data[i].tctx;
 }
 
 static void encode_frame_to_data_rate(AV1_COMP *cpi, size_t *size,
@@ -5366,11 +5366,16 @@
   AV1_COMMON *const cm = &cpi->common;
   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
   struct segmentation *const seg = &cm->seg;
-  FRAME_CONTEXT **tile_ctxs = aom_malloc(cm->tile_rows * cm->tile_cols *
-                                         sizeof(&cpi->tile_data[0].tctx));
-  aom_cdf_prob **cdf_ptrs =
-      aom_malloc(cm->tile_rows * cm->tile_cols *
-                 sizeof(&cpi->tile_data[0].tctx.partition_cdf[0][0]));
+#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(&cpi->tile_data[0].tctx));
+  aom_cdf_prob **cdf_ptrs = aom_malloc(
+      num_bwd_ctxs * sizeof(&cpi->tile_data[0].tctx.partition_cdf[0][0]));
 #if CONFIG_XIPHRC
   int frame_type;
   int drop_this_frame = 0;
@@ -5691,14 +5696,17 @@
     av1_adapt_coef_probs(cm);
 #endif  // CONFIG_LV_MAP
     av1_adapt_intra_frame_probs(cm);
-    make_update_tile_list_enc(cpi, cm->tile_rows, cm->tile_cols, tile_ctxs);
+#if CONFIG_SIMPLE_BWD_ADAPT
+    make_update_tile_list_enc(cpi, cm->largest_tile_id, 1, tile_ctxs);
+#else
+    make_update_tile_list_enc(cpi, 0, num_bwd_ctxs, tile_ctxs);
+#endif
     av1_average_tile_coef_cdfs(cpi->common.fc, tile_ctxs, cdf_ptrs,
-                               cm->tile_rows * cm->tile_cols);
+                               num_bwd_ctxs);
     av1_average_tile_intra_cdfs(cpi->common.fc, tile_ctxs, cdf_ptrs,
-                                cm->tile_rows * cm->tile_cols);
+                                num_bwd_ctxs);
 #if CONFIG_PVQ
-    av1_average_tile_pvq_cdfs(cpi->common.fc, tile_ctxs,
-                              cm->tile_rows * cm->tile_cols);
+    av1_average_tile_pvq_cdfs(cpi->common.fc, tile_ctxs, num_bwd_ctxs);
 #endif  // CONFIG_PVQ
 #if CONFIG_ADAPT_SCAN
     av1_adapt_scan_order(cm);
@@ -5710,9 +5718,9 @@
       av1_adapt_inter_frame_probs(cm);
       av1_adapt_mv_probs(cm, cm->allow_high_precision_mv);
       av1_average_tile_inter_cdfs(&cpi->common, cpi->common.fc, tile_ctxs,
-                                  cdf_ptrs, cm->tile_rows * cm->tile_cols);
+                                  cdf_ptrs, num_bwd_ctxs);
       av1_average_tile_mv_cdfs(cpi->common.fc, tile_ctxs, cdf_ptrs,
-                               cm->tile_rows * cm->tile_cols);
+                               num_bwd_ctxs);
     }
   }