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