Add more unit tests for frame size change and multi-threads
Support different usages and thread changes.
BUG=aomedia:3491
BUG=aomedia:3496
Change-Id: I16e2281a46bf82cd6dee9364baca9aec9c65e72a
(cherry picked from commit 998ab196d87f748a07042bb71a701a9058a33f02)
diff --git a/test/resize_test.cc b/test/resize_test.cc
index 3f56d9d..437b8e0 100644
--- a/test/resize_test.cc
+++ b/test/resize_test.cc
@@ -1007,93 +1007,83 @@
EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc));
}
-#if !CONFIG_REALTIME_ONLY
-TEST(ResizeSimpleTest, TemporarySmallerFrameSizeMultiThread) {
- constexpr int kWidth = 512;
- constexpr int kHeight = 512;
- constexpr int kFirstWidth = 256;
- constexpr int kFirstHeight = 256;
- // Buffer of zero samples.
- constexpr size_t kBufferSize = 3 * kWidth * kHeight;
- std::vector<unsigned char> buffer(kBufferSize, static_cast<unsigned char>(0));
+const int kUsages[] =
+#if CONFIG_REALTIME_ONLY
+ { AOM_USAGE_REALTIME };
+#else
+ { AOM_USAGE_GOOD_QUALITY, AOM_USAGE_REALTIME, AOM_USAGE_ALL_INTRA };
+#endif
- aom_image_t img1;
- EXPECT_EQ(&img1, aom_img_wrap(&img1, AOM_IMG_FMT_I420, kFirstWidth,
- kFirstHeight, 1, buffer.data()));
+const int kNumThreads[] = { 2, 4, 8 };
- aom_image_t img2;
- EXPECT_EQ(&img2, aom_img_wrap(&img2, AOM_IMG_FMT_I420, kWidth, kHeight, 1,
- buffer.data()));
+class FrameSizeChangeTest
+ : public ::libaom_test::CodecTestWith3Params<int, int, int> {
+ protected:
+ FrameSizeChangeTest() {}
+ ~FrameSizeChangeTest() override = default;
- aom_codec_iface_t *iface = aom_codec_av1_cx();
- aom_codec_enc_cfg_t cfg;
- EXPECT_EQ(AOM_CODEC_OK,
- aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY));
- cfg.g_threads = 4;
- cfg.g_lag_in_frames = 1;
- cfg.g_w = kFirstWidth;
- cfg.g_h = kFirstHeight;
- cfg.g_forced_max_frame_width = kWidth;
- cfg.g_forced_max_frame_height = kHeight;
- aom_codec_ctx_t enc;
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, iface, &cfg, 0));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_control(&enc, AOME_SET_CPUUSED, 6));
+ void DoTest(int change_thread) {
+ usage_ = GET_PARAM(1);
+ cpu_used_ = GET_PARAM(2);
+ threads_ = GET_PARAM(3);
+ constexpr int kWidth = 512;
+ constexpr int kHeight = 512;
+ constexpr int kFirstWidth = 256;
+ constexpr int kFirstHeight = 256;
+ // Buffer of zero samples.
+ constexpr size_t kBufferSize = 3 * kWidth * kHeight;
+ std::vector<unsigned char> buffer(kBufferSize,
+ static_cast<unsigned char>(0));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img1, 0, 1, 0));
+ aom_image_t img1;
+ EXPECT_EQ(&img1, aom_img_wrap(&img1, AOM_IMG_FMT_I420, kFirstWidth,
+ kFirstHeight, 1, buffer.data()));
- cfg.g_w = kWidth;
- cfg.g_h = kHeight;
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_set(&enc, &cfg));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img2, 1, 1, 0));
+ aom_image_t img2;
+ EXPECT_EQ(&img2, aom_img_wrap(&img2, AOM_IMG_FMT_I420, kWidth, kHeight, 1,
+ buffer.data()));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, nullptr, 0, 0, 0));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc));
-}
+ aom_codec_iface_t *iface = aom_codec_av1_cx();
+ aom_codec_enc_cfg_t cfg;
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_default(iface, &cfg, usage_));
+ cfg.g_threads = threads_;
+ cfg.g_lag_in_frames = usage_ == AOM_USAGE_ALL_INTRA ? 0 : 1;
+ cfg.g_w = kFirstWidth;
+ cfg.g_h = kFirstHeight;
+ cfg.g_forced_max_frame_width = kWidth;
+ cfg.g_forced_max_frame_height = kHeight;
+ aom_codec_ctx_t enc;
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, iface, &cfg, 0));
+ EXPECT_EQ(AOM_CODEC_OK,
+ aom_codec_control(&enc, AOME_SET_CPUUSED, cpu_used_));
-// This test differs from "TemporarySmallerFrameSizeMultiThread" in that
-// it changes the number of threads from 4 to 2 before coding the second frame.
-TEST(ResizeSimpleTest, TemporarySmallerFrameSizeMultiThread2) {
- constexpr int kWidth = 512;
- constexpr int kHeight = 512;
- constexpr int kFirstWidth = 256;
- constexpr int kFirstHeight = 256;
- // Buffer of zero samples.
- constexpr size_t kBufferSize = 3 * kWidth * kHeight;
- std::vector<unsigned char> buffer(kBufferSize, static_cast<unsigned char>(0));
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img1, 0, 1, 0));
- aom_image_t img1;
- EXPECT_EQ(&img1, aom_img_wrap(&img1, AOM_IMG_FMT_I420, kFirstWidth,
- kFirstHeight, 1, buffer.data()));
+ if (change_thread == 1) {
+ cfg.g_threads = AOMMAX(1, threads_ / 2);
+ } else if (change_thread == 2) {
+ cfg.g_threads = threads_ * 2;
+ }
+ cfg.g_w = kWidth;
+ cfg.g_h = kHeight;
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_set(&enc, &cfg));
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img2, 1, 1, 0));
- aom_image_t img2;
- EXPECT_EQ(&img2, aom_img_wrap(&img2, AOM_IMG_FMT_I420, kWidth, kHeight, 1,
- buffer.data()));
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, nullptr, 0, 0, 0));
+ EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc));
+ }
- aom_codec_iface_t *iface = aom_codec_av1_cx();
- aom_codec_enc_cfg_t cfg;
- EXPECT_EQ(AOM_CODEC_OK,
- aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_GOOD_QUALITY));
- cfg.g_threads = 4;
- cfg.g_lag_in_frames = 1;
- cfg.g_w = kFirstWidth;
- cfg.g_h = kFirstHeight;
- cfg.g_forced_max_frame_width = kWidth;
- cfg.g_forced_max_frame_height = kHeight;
- aom_codec_ctx_t enc;
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, iface, &cfg, 0));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_control(&enc, AOME_SET_CPUUSED, 6));
+ int cpu_used_;
+ int threads_;
+ int usage_;
+};
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img1, 0, 1, 0));
+TEST_P(FrameSizeChangeTest, FixedThreads) { DoTest(0); }
+TEST_P(FrameSizeChangeTest, DecreasingThreads) { DoTest(1); }
+TEST_P(FrameSizeChangeTest, IncreasingThreads) { DoTest(2); }
- cfg.g_threads = 2;
- cfg.g_w = kWidth;
- cfg.g_h = kHeight;
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_set(&enc, &cfg));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, &img2, 1, 1, 0));
-
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, nullptr, 0, 0, 0));
- EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc));
-}
-#endif // !CONFIG_REALTIME_ONLY
+AV1_INSTANTIATE_TEST_SUITE(FrameSizeChangeTest, ::testing::ValuesIn(kUsages),
+ ::testing::Range(6, 7),
+ ::testing::ValuesIn(kNumThreads));
} // namespace