MAX_TILE experiment: add explicit tiles

This patch is designed to complete the CONFIG_MAX_TILE experiment.
It adds the following features:
- Explicit tiles of same width can be signalled with command line --tile_width
- Explicit tiles of same hieght can be signalled with command line --tile_height
- max_tile now works with the depenedent horizontal tiles experiment
- additional checking added to ensure maximum number of rows/columns <= 64
- one fix to the tile group code for when the number of tiles is not a power of two

Change-Id: I749a68fdb3dcdd8d1ced2b3558f3817e4b832c06
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index ebf2e68..1fe6cbf 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -4180,8 +4180,8 @@
     }
     // Write the final tile group size
     if (n_log2_tiles) {
-      aom_wb_overwrite_literal(&tg_params_wb, (1 << n_log2_tiles) - tile_count,
-                               n_log2_tiles);
+      aom_wb_overwrite_literal(
+          &tg_params_wb, (tile_cols * tile_rows) - tile_count, n_log2_tiles);
       aom_wb_overwrite_literal(&tg_params_wb, tile_count - 1, n_log2_tiles);
     }
     // Remux if possible. TODO (Thomas Davies): do this for more than one tile
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index fa4093e..9787097 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -866,16 +866,26 @@
 
 static void set_tile_info_max_tile(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
+  int i, start_sb;
 
   av1_get_tile_limits(cm);
-  // Configure uniform spaced tiles
-  // (API is not yet upgraded to general tiles)
-  cm->uniform_tile_spacing_flag = 1;
 
   // configure tile columns
-  if (cm->uniform_tile_spacing_flag) {
+  if (cpi->oxcf.tile_width == 0 || cpi->oxcf.tile_height == 0) {
+    cm->uniform_tile_spacing_flag = 1;
     cm->log2_tile_cols = AOMMAX(cpi->oxcf.tile_columns, cm->min_log2_tile_cols);
     cm->log2_tile_cols = AOMMIN(cm->log2_tile_cols, cm->max_log2_tile_cols);
+  } else {
+    int mi_cols = ALIGN_POWER_OF_TWO(cm->mi_cols, MAX_MIB_SIZE_LOG2);
+    int sb_cols = mi_cols >> MAX_MIB_SIZE_LOG2;
+    int size_sb = AOMMIN(cpi->oxcf.tile_width, MAX_TILE_WIDTH_SB);
+    cm->uniform_tile_spacing_flag = 0;
+    for (i = 0, start_sb = 0; start_sb < sb_cols && i < MAX_TILE_COLS; i++) {
+      cm->tile_col_start_sb[i] = start_sb;
+      start_sb += size_sb;
+    }
+    cm->tile_cols = i;
+    cm->tile_col_start_sb[i] = sb_cols;
   }
   av1_calculate_tile_cols(cm);
 
@@ -883,6 +893,16 @@
   if (cm->uniform_tile_spacing_flag) {
     cm->log2_tile_rows = AOMMAX(cpi->oxcf.tile_rows, cm->min_log2_tile_rows);
     cm->log2_tile_rows = AOMMIN(cm->log2_tile_rows, cm->max_log2_tile_rows);
+  } else {
+    int mi_rows = ALIGN_POWER_OF_TWO(cm->mi_rows, MAX_MIB_SIZE_LOG2);
+    int sb_rows = mi_rows >> MAX_MIB_SIZE_LOG2;
+    int size_sb = AOMMIN(cpi->oxcf.tile_height, cm->max_tile_height_sb);
+    for (i = 0, start_sb = 0; start_sb < sb_rows && i < MAX_TILE_ROWS; i++) {
+      cm->tile_row_start_sb[i] = start_sb;
+      start_sb += size_sb;
+    }
+    cm->tile_rows = i;
+    cm->tile_row_start_sb[i] = sb_rows;
   }
   av1_calculate_tile_rows(cm);
 }
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index df681fb..889d48a 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -269,6 +269,10 @@
 
   int tile_columns;
   int tile_rows;
+#if CONFIG_MAX_TILE
+  int tile_width;
+  int tile_height;
+#endif
 #if CONFIG_DEPENDENT_HORZTILES
   int dependent_horz_tiles;
 #endif