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