Make EXT_TILE compatible with TILE_GROUPS

Added a 1-bit flag 'large_scale_tile'. If it is 0 that is the default value,
use normal tile coding in TILE_GROUPS. If it is 1, use large-scale tile
coding in EXT_TILE.

At large_scale_tile=1 case, if single-tile-decoding is required, then the
loopfilter is disabled.

Related API and unit tests were modified.

Change-Id: I3ba12dc3d80ccf1ab21543ab3b16c02282c34e3b
diff --git a/test/ethread_test.cc b/test/ethread_test.cc
index 2fe26a5..86eb322 100644
--- a/test/ethread_test.cc
+++ b/test/ethread_test.cc
@@ -32,7 +32,7 @@
     cfg.h = 720;
     cfg.allow_lowbitdepth = 1;
     decoder_ = codec_->CreateDecoder(cfg, 0);
-#if CONFIG_AV1 && CONFIG_EXT_TILE
+#if CONFIG_AV1
     if (decoder_->IsAV1()) {
       decoder_->Control(AV1_SET_DECODE_TILE_ROW, -1);
       decoder_->Control(AV1_SET_DECODE_TILE_COL, -1);
@@ -70,20 +70,7 @@
   virtual void PreEncodeFrameHook(::libaom_test::VideoSource * /*video*/,
                                   ::libaom_test::Encoder *encoder) {
     if (!encoder_initialized_) {
-#if CONFIG_AV1 && CONFIG_EXT_TILE
-      encoder->Control(AV1E_SET_TILE_COLUMNS, 1);
-      if (codec_ == &libaom_test::kAV1) {
-        // TODO(geza): Start using multiple tile rows when the multi-threaded
-        // encoder can handle them
-        encoder->Control(AV1E_SET_TILE_ROWS, 32);
-      } else {
-        encoder->Control(AV1E_SET_TILE_ROWS, 0);
-      }
-#else
-      // Encode 4 tile columns.
-      encoder->Control(AV1E_SET_TILE_COLUMNS, 2);
-      encoder->Control(AV1E_SET_TILE_ROWS, 0);
-#endif  // CONFIG_AV1 && CONFIG_EXT_TILE
+      SetTileSize(encoder);
 #if CONFIG_LOOPFILTERING_ACROSS_TILES
       encoder->Control(AV1E_SET_TILE_LOOPFILTER, 0);
 #endif  // CONFIG_LOOPFILTERING_ACROSS_TILES
@@ -101,6 +88,12 @@
     }
   }
 
+  virtual void SetTileSize(libaom_test::Encoder *encoder) {
+    // Encode 4 tile columns.
+    encoder->Control(AV1E_SET_TILE_COLUMNS, 2);
+    encoder->Control(AV1E_SET_TILE_ROWS, 0);
+  }
+
   virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) {
     size_enc_.push_back(pkt->data.frame.sz);
 
@@ -170,11 +163,21 @@
   std::vector<std::string> md5_dec_;
 };
 
-TEST_P(AVxEncoderThreadTest, EncoderResultTest) { DoTest(); }
+TEST_P(AVxEncoderThreadTest, EncoderResultTest) {
+#if CONFIG_AV1 && CONFIG_EXT_TILE
+  cfg_.large_scale_tile = 0;
+#endif  // CONFIG_AV1 && CONFIG_EXT_TILE
+  DoTest();
+}
 
 class AVxEncoderThreadTestLarge : public AVxEncoderThreadTest {};
 
-TEST_P(AVxEncoderThreadTestLarge, EncoderResultTest) { DoTest(); }
+TEST_P(AVxEncoderThreadTestLarge, EncoderResultTest) {
+#if CONFIG_AV1 && CONFIG_EXT_TILE
+  cfg_.large_scale_tile = 0;
+#endif  // CONFIG_AV1 && CONFIG_EXT_TILE
+  DoTest();
+}
 
 // For AV1, only test speed 0 to 3.
 AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadTest,
@@ -186,4 +189,36 @@
                           ::testing::Values(::libaom_test::kTwoPassGood,
                                             ::libaom_test::kOnePassGood),
                           ::testing::Range(0, 2));
+
+#if CONFIG_AV1 && CONFIG_EXT_TILE
+class AVxEncoderThreadLSTest : public AVxEncoderThreadTest {
+  virtual void SetTileSize(libaom_test::Encoder *encoder) {
+    encoder->Control(AV1E_SET_TILE_COLUMNS, 1);
+    // TODO(geza): Start using multiple tile rows when the multi-threaded
+    // encoder can handle them
+    encoder->Control(AV1E_SET_TILE_ROWS, 32);
+  }
+};
+
+TEST_P(AVxEncoderThreadLSTest, EncoderResultTest) {
+  cfg_.large_scale_tile = 1;
+  DoTest();
+}
+
+class AVxEncoderThreadLSTestLarge : public AVxEncoderThreadLSTest {};
+
+TEST_P(AVxEncoderThreadLSTestLarge, EncoderResultTest) {
+  cfg_.large_scale_tile = 1;
+  DoTest();
+}
+
+AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadLSTest,
+                          ::testing::Values(::libaom_test::kTwoPassGood,
+                                            ::libaom_test::kOnePassGood),
+                          ::testing::Range(2, 4));
+AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadLSTestLarge,
+                          ::testing::Values(::libaom_test::kTwoPassGood,
+                                            ::libaom_test::kOnePassGood),
+                          ::testing::Range(0, 2));
+#endif  // CONFIG_AV1 && CONFIG_EXT_TILE
 }  // namespace