Make ext_tile compatible with reference_buffer

In ext_tile experiment, when cm->large_scale_tile is 1, prev_frame_id can be
the same as current_frame_id, which is prohibited in reference_buffer
experiment and causes "CORRUPT_FRAME" error to be reported.

In this patch, enable/disable reference_buffer according to large_scale_tile
value, and thus make these 2 experiments compatible.

Change-Id: If64943acb91e7a7b859db4e2ac62581e9b53ef85
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 4faab1c..c95a8f2 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -224,6 +224,9 @@
     struct aom_read_bit_buffer rb = { data, data + data_sz, 0, NULL, NULL };
     const int frame_marker = aom_rb_read_literal(&rb, 2);
     const BITSTREAM_PROFILE profile = av1_read_profile(&rb);
+#if CONFIG_EXT_TILE
+    unsigned int large_scale_tile;
+#endif  // CONFIG_EXT_TILE
 
     if (frame_marker != AOM_FRAME_MARKER) return AOM_CODEC_UNSUP_BITSTREAM;
 
@@ -232,6 +235,10 @@
     if ((profile >= 2 && data_sz <= 1) || data_sz < 1)
       return AOM_CODEC_UNSUP_BITSTREAM;
 
+#if CONFIG_EXT_TILE
+    large_scale_tile = aom_rb_read_literal(&rb, 1);
+#endif  // CONFIG_EXT_TILE
+
     if (aom_rb_read_bit(&rb)) {     // show an existing frame
       aom_rb_read_literal(&rb, 3);  // Frame buffer to show.
       return AOM_CODEC_OK;
@@ -248,6 +255,9 @@
       int frame_id_len;
       SequenceHeader seq_params;
       read_sequence_header(&seq_params);
+#if CONFIG_EXT_TILE
+      if (large_scale_tile) seq_params.frame_id_numbers_present_flag = 0;
+#endif  // CONFIG_EXT_TILE
       if (seq_params.frame_id_numbers_present_flag) {
         frame_id_len = seq_params.frame_id_length_minus7 + 7;
         aom_rb_read_literal(&rb, frame_id_len);
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 50c7466..75ce9f7 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -3273,7 +3273,6 @@
                            struct aom_read_bit_buffer *const rb) {
   AV1_COMMON *const cm = &pbi->common;
 #if CONFIG_EXT_TILE
-  cm->large_scale_tile = aom_rb_read_literal(rb, 1);
   cm->single_tile_decoding = 0;
   if (cm->large_scale_tile) {
     struct loopfilter *lf = &cm->lf;
@@ -4422,6 +4421,13 @@
     aom_internal_error(&cm->error, AOM_CODEC_UNSUP_BITSTREAM,
                        "Unsupported bitstream profile");
 
+#if CONFIG_EXT_TILE
+  cm->large_scale_tile = aom_rb_read_literal(rb, 1);
+#if CONFIG_REFERENCE_BUFFER
+  if (cm->large_scale_tile) pbi->seq_params.frame_id_numbers_present_flag = 0;
+#endif  // CONFIG_REFERENCE_BUFFER
+#endif  // CONFIG_EXT_TILE
+
   cm->show_existing_frame = aom_rb_read_bit(rb);
 
   if (cm->show_existing_frame) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index c9996c6..bcb95d8 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -3561,7 +3561,6 @@
 static void write_tile_info(const AV1_COMMON *const cm,
                             struct aom_write_bit_buffer *wb) {
 #if CONFIG_EXT_TILE
-  aom_wb_write_literal(wb, cm->large_scale_tile, 1);
   if (cm->large_scale_tile) {
     const int tile_width =
         ALIGN_POWER_OF_TWO(cm->tile_width, cm->mib_size_log2) >>
@@ -4165,9 +4164,17 @@
 }
 
 #if CONFIG_REFERENCE_BUFFER
-void write_sequence_header(SequenceHeader *seq_params) {
+void write_sequence_header(
+#if CONFIG_EXT_TILE
+    AV1_COMMON *const cm,
+#endif  // CONFIG_EXT_TILE
+    SequenceHeader *seq_params) {
   /* Placeholder for actually writing to the bitstream */
-  seq_params->frame_id_numbers_present_flag = FRAME_ID_NUMBERS_PRESENT_FLAG;
+  seq_params->frame_id_numbers_present_flag =
+#if CONFIG_EXT_TILE
+      cm->large_scale_tile ? 0 :
+#endif  // CONFIG_EXT_TILE
+                           FRAME_ID_NUMBERS_PRESENT_FLAG;
   seq_params->frame_id_length_minus7 = FRAME_ID_LENGTH_MINUS7;
   seq_params->delta_frame_id_length_minus2 = DELTA_FRAME_ID_LENGTH_MINUS2;
 }
@@ -4206,13 +4213,21 @@
 
 #if CONFIG_REFERENCE_BUFFER
   /* TODO: Move outside frame loop or inside key-frame branch */
-  write_sequence_header(&cpi->seq_params);
+  write_sequence_header(
+#if CONFIG_EXT_TILE
+      cm,
+#endif  // CONFIG_EXT_TILE
+      &cpi->seq_params);
 #endif
 
   aom_wb_write_literal(wb, AOM_FRAME_MARKER, 2);
 
   write_profile(cm->profile, wb);
 
+#if CONFIG_EXT_TILE
+  aom_wb_write_literal(wb, cm->large_scale_tile, 1);
+#endif  // CONFIG_EXT_TILE
+
 #if CONFIG_EXT_REFS
   // NOTE: By default all coded frames to be used as a reference
   cm->is_reference_frame = 1;
diff --git a/av1/encoder/bitstream.h b/av1/encoder/bitstream.h
index fd23074..29c9303 100644
--- a/av1/encoder/bitstream.h
+++ b/av1/encoder/bitstream.h
@@ -19,7 +19,11 @@
 #include "av1/encoder/encoder.h"
 
 #if CONFIG_REFERENCE_BUFFER
-void write_sequence_header(SequenceHeader *seq_params);
+void write_sequence_header(
+#if CONFIG_EXT_TILE
+    AV1_COMMON *const cm,
+#endif  // CONFIG_EXT_TILE
+    SequenceHeader *seq_params);
 #endif
 
 void av1_pack_bitstream(AV1_COMP *const cpi, uint8_t *dest, size_t *size);
diff --git a/configure b/configure
index 99e9939..e8c5574 100755
--- a/configure
+++ b/configure
@@ -574,11 +574,6 @@
       disable_feature lgt
       enable_feature lowbitdepth
     fi
-    if enabled ext_tile; then
-      log_echo "ext_tile not compatible with reference_buffer, so"
-      log_echo "disabling reference_buffer"
-      disable_feature reference_buffer
-    fi
     if enabled var_tx_no_tx_mode && ! enabled var_tx; then
       log_echo "var_tx_no_tx_mode requires var_tx, so disabling var_tx_no_tx_mode"
       disable_feature var_tx_no_tx_mode