ethread_test.cc (21795B)
1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include <string> 13 #include <vector> 14 #include "gtest/gtest.h" 15 #include "test/codec_factory.h" 16 #include "test/encode_test_driver.h" 17 #include "test/md5_helper.h" 18 #include "test/util.h" 19 #include "test/y4m_video_source.h" 20 #include "test/yuv_video_source.h" 21 #include "av1/encoder/enc_enums.h" 22 #include "av1/encoder/firstpass.h" 23 24 namespace { 25 const unsigned int kCqLevel = 18; 26 27 #if !CONFIG_REALTIME_ONLY 28 const size_t kFirstPassStatsSz = sizeof(FIRSTPASS_STATS); 29 class AVxFirstPassEncoderThreadTest 30 : public ::libaom_test::CodecTestWith4Params<libaom_test::TestMode, int, 31 int, int>, 32 public ::libaom_test::EncoderTest { 33 protected: 34 AVxFirstPassEncoderThreadTest() 35 : EncoderTest(GET_PARAM(0)), encoder_initialized_(false), 36 encoding_mode_(GET_PARAM(1)), set_cpu_used_(GET_PARAM(2)), 37 tile_rows_(GET_PARAM(3)), tile_cols_(GET_PARAM(4)) { 38 init_flags_ = AOM_CODEC_USE_PSNR; 39 40 row_mt_ = 1; 41 firstpass_stats_.buf = nullptr; 42 firstpass_stats_.sz = 0; 43 } 44 ~AVxFirstPassEncoderThreadTest() override { free(firstpass_stats_.buf); } 45 46 void SetUp() override { 47 InitializeConfig(encoding_mode_); 48 49 cfg_.g_lag_in_frames = 35; 50 cfg_.rc_end_usage = AOM_VBR; 51 cfg_.rc_2pass_vbr_minsection_pct = 5; 52 cfg_.rc_2pass_vbr_maxsection_pct = 2000; 53 cfg_.rc_max_quantizer = 56; 54 cfg_.rc_min_quantizer = 0; 55 } 56 57 void BeginPassHook(unsigned int /*pass*/) override { 58 encoder_initialized_ = false; 59 abort_ = false; 60 } 61 62 void EndPassHook() override { 63 // For first pass stats test, only run first pass encoder. 64 if (cfg_.g_pass == AOM_RC_FIRST_PASS) abort_ = true; 65 } 66 67 void PreEncodeFrameHook(::libaom_test::VideoSource * /*video*/, 68 ::libaom_test::Encoder *encoder) override { 69 if (!encoder_initialized_) { 70 // Encode in 2-pass mode. 71 SetTileSize(encoder); 72 encoder->Control(AV1E_SET_ROW_MT, row_mt_); 73 encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); 74 encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); 75 encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); 76 encoder->Control(AOME_SET_ARNR_STRENGTH, 5); 77 encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 0); 78 79 encoder_initialized_ = true; 80 } 81 } 82 83 virtual void SetTileSize(libaom_test::Encoder *encoder) { 84 encoder->Control(AV1E_SET_TILE_COLUMNS, tile_cols_); 85 encoder->Control(AV1E_SET_TILE_ROWS, tile_rows_); 86 } 87 88 void StatsPktHook(const aom_codec_cx_pkt_t *pkt) override { 89 const uint8_t *const pkt_buf = 90 reinterpret_cast<uint8_t *>(pkt->data.twopass_stats.buf); 91 const size_t pkt_size = pkt->data.twopass_stats.sz; 92 93 // First pass stats size equals sizeof(FIRSTPASS_STATS) 94 EXPECT_EQ(pkt_size, kFirstPassStatsSz) 95 << "Error: First pass stats size doesn't equal kFirstPassStatsSz"; 96 97 firstpass_stats_.buf = 98 realloc(firstpass_stats_.buf, firstpass_stats_.sz + pkt_size); 99 ASSERT_NE(firstpass_stats_.buf, nullptr); 100 memcpy((uint8_t *)firstpass_stats_.buf + firstpass_stats_.sz, pkt_buf, 101 pkt_size); 102 firstpass_stats_.sz += pkt_size; 103 } 104 105 void DoTest(); 106 107 bool encoder_initialized_; 108 ::libaom_test::TestMode encoding_mode_; 109 int set_cpu_used_; 110 int tile_rows_; 111 int tile_cols_; 112 int row_mt_; 113 aom_fixed_buf_t firstpass_stats_; 114 }; 115 116 static void compare_fp_stats_md5(aom_fixed_buf_t *fp_stats) { 117 // fp_stats consists of 2 set of first pass encoding stats. These 2 set of 118 // stats are compared to check if the stats match. 119 uint8_t *stats1 = reinterpret_cast<uint8_t *>(fp_stats->buf); 120 uint8_t *stats2 = stats1 + fp_stats->sz / 2; 121 ::libaom_test::MD5 md5_row_mt_0, md5_row_mt_1; 122 123 md5_row_mt_0.Add(stats1, fp_stats->sz / 2); 124 const char *md5_row_mt_0_str = md5_row_mt_0.Get(); 125 126 md5_row_mt_1.Add(stats2, fp_stats->sz / 2); 127 const char *md5_row_mt_1_str = md5_row_mt_1.Get(); 128 129 // Check md5 match. 130 ASSERT_STREQ(md5_row_mt_0_str, md5_row_mt_1_str) 131 << "MD5 checksums don't match"; 132 } 133 134 void AVxFirstPassEncoderThreadTest::DoTest() { 135 ::libaom_test::Y4mVideoSource video("niklas_1280_720_30.y4m", 0, 60); 136 aom_fixed_buf_t firstpass_stats; 137 size_t single_run_sz; 138 139 cfg_.rc_target_bitrate = 1000; 140 141 // 5 encodes will be run: 142 // 1. row_mt_=0 and threads=1 143 // 2. row_mt_=1 and threads=1 144 // 3. row_mt_=1 and threads=2 145 // 4. row_mt_=1 and threads=4 146 // 5. row_mt_=1 and threads=8 147 148 // 4 comparisons will be made: 149 // 1. Between run 1 and run 2. 150 // 2. Between run 2 and run 3. 151 // 3. Between run 3 and run 4. 152 // 4. Between run 4 and run 5. 153 154 // Test row_mt_: 0 vs 1 at single thread case(threads = 1) 155 cfg_.g_threads = 1; 156 157 row_mt_ = 0; 158 init_flags_ = AOM_CODEC_USE_PSNR; 159 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 160 161 row_mt_ = 1; 162 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 163 164 firstpass_stats.buf = firstpass_stats_.buf; 165 firstpass_stats.sz = firstpass_stats_.sz; 166 single_run_sz = firstpass_stats_.sz / 2; 167 168 // Compare to check if using or not using row-mt are bit exact. 169 // Comparison 1 (between row_mt_=0 and row_mt_=1). 170 ASSERT_NO_FATAL_FAILURE(compare_fp_stats_md5(&firstpass_stats)); 171 172 // Test single thread vs multiple threads 173 row_mt_ = 1; 174 175 cfg_.g_threads = 2; 176 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 177 178 // offset to the 2nd and 3rd run. 179 firstpass_stats.buf = reinterpret_cast<void *>( 180 reinterpret_cast<uint8_t *>(firstpass_stats_.buf) + single_run_sz); 181 182 // Compare to check if single-thread and multi-thread stats are bit exact. 183 // Comparison 2 (between threads=1 and threads=2). 184 ASSERT_NO_FATAL_FAILURE(compare_fp_stats_md5(&firstpass_stats)); 185 186 cfg_.g_threads = 4; 187 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 188 189 // offset to the 3rd and 4th run 190 firstpass_stats.buf = reinterpret_cast<void *>( 191 reinterpret_cast<uint8_t *>(firstpass_stats_.buf) + single_run_sz * 2); 192 193 // Comparison 3 (between threads=2 and threads=4). 194 ASSERT_NO_FATAL_FAILURE(compare_fp_stats_md5(&firstpass_stats)); 195 196 cfg_.g_threads = 8; 197 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 198 199 // offset to the 4th and 5th run. 200 firstpass_stats.buf = reinterpret_cast<void *>( 201 reinterpret_cast<uint8_t *>(firstpass_stats_.buf) + single_run_sz * 3); 202 203 // Comparison 4 (between threads=4 and threads=8). 204 compare_fp_stats_md5(&firstpass_stats); 205 } 206 207 TEST_P(AVxFirstPassEncoderThreadTest, FirstPassStatsTest) { DoTest(); } 208 209 using AVxFirstPassEncoderThreadTestLarge = AVxFirstPassEncoderThreadTest; 210 211 TEST_P(AVxFirstPassEncoderThreadTestLarge, FirstPassStatsTest) { DoTest(); } 212 213 #endif // !CONFIG_REALTIME_ONLY 214 215 class AVxEncoderThreadTest 216 : public ::libaom_test::CodecTestWith5Params<libaom_test::TestMode, int, 217 int, int, int>, 218 public ::libaom_test::EncoderTest { 219 protected: 220 AVxEncoderThreadTest() 221 : EncoderTest(GET_PARAM(0)), encoder_initialized_(false), 222 encoding_mode_(GET_PARAM(1)), set_cpu_used_(GET_PARAM(2)), 223 tile_cols_(GET_PARAM(3)), tile_rows_(GET_PARAM(4)), 224 row_mt_(GET_PARAM(5)) { 225 init_flags_ = AOM_CODEC_USE_PSNR; 226 aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); 227 cfg.w = 1280; 228 cfg.h = 720; 229 cfg.allow_lowbitdepth = 1; 230 decoder_ = codec_->CreateDecoder(cfg, 0); 231 if (decoder_->IsAV1()) { 232 decoder_->Control(AV1_SET_DECODE_TILE_ROW, -1); 233 decoder_->Control(AV1_SET_DECODE_TILE_COL, -1); 234 } 235 236 size_enc_.clear(); 237 md5_dec_.clear(); 238 md5_enc_.clear(); 239 } 240 ~AVxEncoderThreadTest() override { delete decoder_; } 241 242 void SetUp() override { 243 InitializeConfig(encoding_mode_); 244 245 if (encoding_mode_ == ::libaom_test::kOnePassGood || 246 encoding_mode_ == ::libaom_test::kTwoPassGood) { 247 cfg_.g_lag_in_frames = 6; 248 cfg_.rc_2pass_vbr_minsection_pct = 5; 249 cfg_.rc_2pass_vbr_maxsection_pct = 2000; 250 } else if (encoding_mode_ == ::libaom_test::kRealTime) { 251 cfg_.g_error_resilient = 1; 252 } 253 cfg_.rc_max_quantizer = 56; 254 cfg_.rc_min_quantizer = 0; 255 } 256 257 void BeginPassHook(unsigned int /*pass*/) override { 258 encoder_initialized_ = false; 259 } 260 261 void PreEncodeFrameHook(::libaom_test::VideoSource * /*video*/, 262 ::libaom_test::Encoder *encoder) override { 263 if (!encoder_initialized_) { 264 SetTileSize(encoder); 265 encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); 266 encoder->Control(AV1E_SET_ROW_MT, row_mt_); 267 if (encoding_mode_ == ::libaom_test::kOnePassGood || 268 encoding_mode_ == ::libaom_test::kTwoPassGood) { 269 encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); 270 encoder->Control(AOME_SET_ARNR_MAXFRAMES, 5); 271 encoder->Control(AOME_SET_ARNR_STRENGTH, 5); 272 encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 0); 273 encoder->Control(AV1E_SET_MAX_GF_INTERVAL, 4); 274 // In row_mt_=0 case, the output of single thread (1 thread) will be 275 // compared with multi thread (4 thread) output (as per line no:340). 276 // Currently, Loop restoration stage is conditionally disabled for speed 277 // 5, 6 when num_workers > 1. Due to this, the match between single 278 // thread and multi thread output can not be achieved. Hence, testing 279 // this case alone with LR disabled. 280 // TODO(aomedia:3446): Remove the constraint on this test case once Loop 281 // restoration state is same in both single and multi thread path. 282 if (set_cpu_used_ >= 5 && row_mt_ == 0) 283 encoder->Control(AV1E_SET_ENABLE_RESTORATION, 0); 284 } else if (encoding_mode_ == ::libaom_test::kRealTime) { 285 encoder->Control(AOME_SET_ENABLEAUTOALTREF, 0); 286 encoder->Control(AV1E_SET_AQ_MODE, 3); 287 encoder->Control(AV1E_SET_COEFF_COST_UPD_FREQ, 2); 288 encoder->Control(AV1E_SET_MODE_COST_UPD_FREQ, 2); 289 encoder->Control(AV1E_SET_MV_COST_UPD_FREQ, 3); 290 encoder->Control(AV1E_SET_DV_COST_UPD_FREQ, 3); 291 } else { 292 encoder->Control(AOME_SET_CQ_LEVEL, kCqLevel); 293 } 294 encoder_initialized_ = true; 295 } 296 } 297 298 virtual void SetTileSize(libaom_test::Encoder *encoder) { 299 encoder->Control(AV1E_SET_TILE_COLUMNS, tile_cols_); 300 encoder->Control(AV1E_SET_TILE_ROWS, tile_rows_); 301 } 302 303 void FramePktHook(const aom_codec_cx_pkt_t *pkt) override { 304 size_enc_.push_back(pkt->data.frame.sz); 305 306 ::libaom_test::MD5 md5_enc; 307 md5_enc.Add(reinterpret_cast<uint8_t *>(pkt->data.frame.buf), 308 pkt->data.frame.sz); 309 md5_enc_.push_back(md5_enc.Get()); 310 311 const aom_codec_err_t res = decoder_->DecodeFrame( 312 reinterpret_cast<uint8_t *>(pkt->data.frame.buf), pkt->data.frame.sz); 313 if (res != AOM_CODEC_OK) { 314 abort_ = true; 315 ASSERT_EQ(AOM_CODEC_OK, res); 316 } 317 const aom_image_t *img = decoder_->GetDxData().Next(); 318 319 if (img) { 320 ::libaom_test::MD5 md5_res; 321 md5_res.Add(img); 322 md5_dec_.push_back(md5_res.Get()); 323 } 324 } 325 326 void DoTest() { 327 ::libaom_test::YUVVideoSource video( 328 "niklas_640_480_30.yuv", AOM_IMG_FMT_I420, 640, 480, 30, 1, 15, 26); 329 cfg_.rc_target_bitrate = 1000; 330 331 if (row_mt_ == 0) { 332 // Encode using single thread. 333 cfg_.g_threads = 1; 334 init_flags_ = AOM_CODEC_USE_PSNR; 335 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 336 std::vector<size_t> single_thr_size_enc; 337 std::vector<std::string> single_thr_md5_enc; 338 std::vector<std::string> single_thr_md5_dec; 339 single_thr_size_enc = size_enc_; 340 single_thr_md5_enc = md5_enc_; 341 single_thr_md5_dec = md5_dec_; 342 size_enc_.clear(); 343 md5_enc_.clear(); 344 md5_dec_.clear(); 345 346 // Encode using multiple threads. 347 cfg_.g_threads = 4; 348 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 349 std::vector<size_t> multi_thr_size_enc; 350 std::vector<std::string> multi_thr_md5_enc; 351 std::vector<std::string> multi_thr_md5_dec; 352 multi_thr_size_enc = size_enc_; 353 multi_thr_md5_enc = md5_enc_; 354 multi_thr_md5_dec = md5_dec_; 355 size_enc_.clear(); 356 md5_enc_.clear(); 357 md5_dec_.clear(); 358 359 // Check that the vectors are equal. 360 ASSERT_EQ(single_thr_size_enc, multi_thr_size_enc); 361 ASSERT_EQ(single_thr_md5_enc, multi_thr_md5_enc); 362 ASSERT_EQ(single_thr_md5_dec, multi_thr_md5_dec); 363 364 DoTestMaxThreads(&video, single_thr_size_enc, single_thr_md5_enc, 365 single_thr_md5_dec); 366 } else if (row_mt_ == 1) { 367 // Encode using multiple threads row-mt enabled. 368 cfg_.g_threads = 2; 369 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 370 std::vector<size_t> multi_thr2_row_mt_size_enc; 371 std::vector<std::string> multi_thr2_row_mt_md5_enc; 372 std::vector<std::string> multi_thr2_row_mt_md5_dec; 373 multi_thr2_row_mt_size_enc = size_enc_; 374 multi_thr2_row_mt_md5_enc = md5_enc_; 375 multi_thr2_row_mt_md5_dec = md5_dec_; 376 size_enc_.clear(); 377 md5_enc_.clear(); 378 md5_dec_.clear(); 379 380 // Disable threads=3 test for now to reduce the time so that the nightly 381 // test would not time out. 382 // cfg_.g_threads = 3; 383 // ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 384 // std::vector<size_t> multi_thr3_row_mt_size_enc; 385 // std::vector<std::string> multi_thr3_row_mt_md5_enc; 386 // std::vector<std::string> multi_thr3_row_mt_md5_dec; 387 // multi_thr3_row_mt_size_enc = size_enc_; 388 // multi_thr3_row_mt_md5_enc = md5_enc_; 389 // multi_thr3_row_mt_md5_dec = md5_dec_; 390 // size_enc_.clear(); 391 // md5_enc_.clear(); 392 // md5_dec_.clear(); 393 // Check that the vectors are equal. 394 // ASSERT_EQ(multi_thr3_row_mt_size_enc, multi_thr2_row_mt_size_enc); 395 // ASSERT_EQ(multi_thr3_row_mt_md5_enc, multi_thr2_row_mt_md5_enc); 396 // ASSERT_EQ(multi_thr3_row_mt_md5_dec, multi_thr2_row_mt_md5_dec); 397 398 cfg_.g_threads = 4; 399 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 400 std::vector<size_t> multi_thr4_row_mt_size_enc; 401 std::vector<std::string> multi_thr4_row_mt_md5_enc; 402 std::vector<std::string> multi_thr4_row_mt_md5_dec; 403 multi_thr4_row_mt_size_enc = size_enc_; 404 multi_thr4_row_mt_md5_enc = md5_enc_; 405 multi_thr4_row_mt_md5_dec = md5_dec_; 406 size_enc_.clear(); 407 md5_enc_.clear(); 408 md5_dec_.clear(); 409 410 // Check that the vectors are equal. 411 ASSERT_EQ(multi_thr4_row_mt_size_enc, multi_thr2_row_mt_size_enc); 412 ASSERT_EQ(multi_thr4_row_mt_md5_enc, multi_thr2_row_mt_md5_enc); 413 ASSERT_EQ(multi_thr4_row_mt_md5_dec, multi_thr2_row_mt_md5_dec); 414 415 DoTestMaxThreads(&video, multi_thr2_row_mt_size_enc, 416 multi_thr2_row_mt_md5_enc, multi_thr2_row_mt_md5_dec); 417 } 418 } 419 420 virtual void DoTestMaxThreads(::libaom_test::YUVVideoSource *video, 421 const std::vector<size_t> ref_size_enc, 422 const std::vector<std::string> ref_md5_enc, 423 const std::vector<std::string> ref_md5_dec) { 424 cfg_.g_threads = MAX_NUM_THREADS; 425 ASSERT_NO_FATAL_FAILURE(RunLoop(video)); 426 std::vector<size_t> multi_thr_max_row_mt_size_enc; 427 std::vector<std::string> multi_thr_max_row_mt_md5_enc; 428 std::vector<std::string> multi_thr_max_row_mt_md5_dec; 429 multi_thr_max_row_mt_size_enc = size_enc_; 430 multi_thr_max_row_mt_md5_enc = md5_enc_; 431 multi_thr_max_row_mt_md5_dec = md5_dec_; 432 size_enc_.clear(); 433 md5_enc_.clear(); 434 md5_dec_.clear(); 435 436 // Check that the vectors are equal. 437 ASSERT_EQ(ref_size_enc, multi_thr_max_row_mt_size_enc); 438 ASSERT_EQ(ref_md5_enc, multi_thr_max_row_mt_md5_enc); 439 ASSERT_EQ(ref_md5_dec, multi_thr_max_row_mt_md5_dec); 440 } 441 442 bool encoder_initialized_; 443 ::libaom_test::TestMode encoding_mode_; 444 int set_cpu_used_; 445 int tile_cols_; 446 int tile_rows_; 447 int row_mt_; 448 ::libaom_test::Decoder *decoder_; 449 std::vector<size_t> size_enc_; 450 std::vector<std::string> md5_enc_; 451 std::vector<std::string> md5_dec_; 452 }; 453 454 class AVxEncoderThreadRTTest : public AVxEncoderThreadTest {}; 455 456 TEST_P(AVxEncoderThreadRTTest, EncoderResultTest) { 457 cfg_.large_scale_tile = 0; 458 decoder_->Control(AV1_SET_TILE_MODE, 0); 459 DoTest(); 460 } 461 462 // For real time mode, test speed 5, 6, 7, 8, 9, 10. 463 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadRTTest, 464 ::testing::Values(::libaom_test::kRealTime), 465 ::testing::Values(5, 6, 7, 8, 9, 10), 466 ::testing::Values(0, 2), ::testing::Values(0, 2), 467 ::testing::Values(0, 1)); 468 469 #if !CONFIG_REALTIME_ONLY 470 471 // The AVxEncoderThreadTestLarge takes up ~14% of total run-time of the 472 // Valgrind long tests. Exclude it; the smaller tests are still run. 473 #if !defined(AOM_VALGRIND_BUILD) 474 class AVxEncoderThreadTestLarge : public AVxEncoderThreadTest {}; 475 476 TEST_P(AVxEncoderThreadTestLarge, EncoderResultTest) { 477 cfg_.large_scale_tile = 0; 478 decoder_->Control(AV1_SET_TILE_MODE, 0); 479 DoTest(); 480 } 481 482 // Test cpu_used 0, 1, 3 and 5. 483 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadTestLarge, 484 ::testing::Values(::libaom_test::kTwoPassGood, 485 ::libaom_test::kOnePassGood), 486 ::testing::Values(0, 1, 3, 5), 487 ::testing::Values(1, 6), ::testing::Values(1, 6), 488 ::testing::Values(0, 1)); 489 #endif // !defined(AOM_VALGRIND_BUILD) 490 491 TEST_P(AVxEncoderThreadTest, EncoderResultTest) { 492 cfg_.large_scale_tile = 0; 493 decoder_->Control(AV1_SET_TILE_MODE, 0); 494 DoTest(); 495 } 496 497 class AVxEncoderThreadAllIntraTest : public AVxEncoderThreadTest {}; 498 499 TEST_P(AVxEncoderThreadAllIntraTest, EncoderResultTest) { 500 cfg_.large_scale_tile = 0; 501 decoder_->Control(AV1_SET_TILE_MODE, 0); 502 DoTest(); 503 } 504 505 class AVxEncoderThreadAllIntraTestLarge : public AVxEncoderThreadTest {}; 506 507 TEST_P(AVxEncoderThreadAllIntraTestLarge, EncoderResultTest) { 508 cfg_.large_scale_tile = 0; 509 decoder_->Control(AV1_SET_TILE_MODE, 0); 510 DoTest(); 511 } 512 513 // first pass stats test 514 AV1_INSTANTIATE_TEST_SUITE(AVxFirstPassEncoderThreadTest, 515 ::testing::Values(::libaom_test::kTwoPassGood), 516 ::testing::Values(4), ::testing::Range(0, 2), 517 ::testing::Range(1, 3)); 518 519 AV1_INSTANTIATE_TEST_SUITE(AVxFirstPassEncoderThreadTestLarge, 520 ::testing::Values(::libaom_test::kTwoPassGood), 521 ::testing::Values(0, 2), ::testing::Range(0, 2), 522 ::testing::Range(1, 3)); 523 524 // Only test cpu_used 2 here. 525 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadTest, 526 ::testing::Values(::libaom_test::kTwoPassGood), 527 ::testing::Values(2), ::testing::Values(0, 2), 528 ::testing::Values(0, 2), ::testing::Values(0, 1)); 529 530 // For all intra mode, test speed 0, 2, 4, 6, 8. 531 // Only test cpu_used 6 here. 532 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadAllIntraTest, 533 ::testing::Values(::libaom_test::kAllIntra), 534 ::testing::Values(6), ::testing::Values(0, 2), 535 ::testing::Values(0, 2), ::testing::Values(0, 1)); 536 537 // Test cpu_used 0, 2, 4 and 8. 538 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadAllIntraTestLarge, 539 ::testing::Values(::libaom_test::kAllIntra), 540 ::testing::Values(0, 2, 4, 8), 541 ::testing::Values(1, 6), ::testing::Values(1, 6), 542 ::testing::Values(0, 1)); 543 #endif // !CONFIG_REALTIME_ONLY 544 545 class AVxEncoderThreadLSTest : public AVxEncoderThreadTest { 546 void SetTileSize(libaom_test::Encoder *encoder) override { 547 encoder->Control(AV1E_SET_TILE_COLUMNS, tile_cols_); 548 encoder->Control(AV1E_SET_TILE_ROWS, tile_rows_); 549 } 550 551 void DoTestMaxThreads(::libaom_test::YUVVideoSource *video, 552 const std::vector<size_t> ref_size_enc, 553 const std::vector<std::string> ref_md5_enc, 554 const std::vector<std::string> ref_md5_dec) override { 555 (void)video; 556 (void)ref_size_enc; 557 (void)ref_md5_enc; 558 (void)ref_md5_dec; 559 } 560 }; 561 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AVxEncoderThreadLSTest); 562 563 TEST_P(AVxEncoderThreadLSTest, EncoderResultTest) { 564 cfg_.large_scale_tile = 1; 565 decoder_->Control(AV1_SET_TILE_MODE, 1); 566 decoder_->Control(AV1D_EXT_TILE_DEBUG, 1); 567 DoTest(); 568 } 569 570 // AVxEncoderThreadLSTestLarge takes up about 2% of total run-time of 571 // the Valgrind long tests. Since we already run AVxEncoderThreadLSTest, 572 // skip this one for Valgrind. 573 #if !CONFIG_REALTIME_ONLY && !defined(AOM_VALGRIND_BUILD) 574 class AVxEncoderThreadLSTestLarge : public AVxEncoderThreadLSTest {}; 575 576 TEST_P(AVxEncoderThreadLSTestLarge, EncoderResultTest) { 577 cfg_.large_scale_tile = 1; 578 decoder_->Control(AV1_SET_TILE_MODE, 1); 579 decoder_->Control(AV1D_EXT_TILE_DEBUG, 1); 580 DoTest(); 581 } 582 583 AV1_INSTANTIATE_TEST_SUITE(AVxEncoderThreadLSTestLarge, 584 ::testing::Values(::libaom_test::kTwoPassGood, 585 ::libaom_test::kOnePassGood), 586 ::testing::Values(1, 3), ::testing::Values(0, 6), 587 ::testing::Values(0, 6), ::testing::Values(1)); 588 #endif // !CONFIG_REALTIME_ONLY && !defined(AOM_VALGRIND_BUILD) 589 } // namespace