diff options
Diffstat (limited to 'test')
44 files changed, 707 insertions, 215 deletions
diff --git a/test/active_map_test.cc b/test/active_map_test.cc index 6377e725a..a9bb54090 100644 --- a/test/active_map_test.cc +++ b/test/active_map_test.cc @@ -83,9 +83,6 @@ TEST_P(ActiveMapTest, Test) { ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } -#define VP9_FACTORY \ - static_cast<const libvpx_test::CodecFactory *>(&libvpx_test::kVP9) - VP9_INSTANTIATE_TEST_CASE(ActiveMapTest, ::testing::Values(::libvpx_test::kRealTime), ::testing::Range(0, 6)); diff --git a/test/aq_segment_test.cc b/test/aq_segment_test.cc index 2f88b539b..1b9c94356 100644 --- a/test/aq_segment_test.cc +++ b/test/aq_segment_test.cc @@ -7,8 +7,6 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ -#include <climits> -#include <vector> #include "third_party/googletest/src/include/gtest/gtest.h" #include "test/codec_factory.h" #include "test/encode_test_driver.h" @@ -17,11 +15,12 @@ namespace { -class AqSegmentTest : public ::libvpx_test::EncoderTest, - public ::libvpx_test::CodecTestWith2Params< - libvpx_test::TestMode, int> { +class AqSegmentTest + : public ::libvpx_test::EncoderTest, + public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> { protected: AqSegmentTest() : EncoderTest(GET_PARAM(0)) {} + virtual ~AqSegmentTest() {} virtual void SetUp() { InitializeConfig(); @@ -39,10 +38,6 @@ class AqSegmentTest : public ::libvpx_test::EncoderTest, } } - virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { - if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { - } - } int set_cpu_used_; int aq_mode_; }; @@ -107,13 +102,8 @@ TEST_P(AqSegmentTest, TestNoMisMatchAQ3) { ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } -using std::tr1::make_tuple; - -#define VP9_FACTORY \ - static_cast<const libvpx_test::CodecFactory*> (&libvpx_test::kVP9) - VP9_INSTANTIATE_TEST_CASE(AqSegmentTest, ::testing::Values(::libvpx_test::kRealTime, ::libvpx_test::kOnePassGood), - ::testing::Range(3, 9)); + ::testing::Range(3, 9)); } // namespace diff --git a/test/convolve_test.cc b/test/convolve_test.cc index 6af2abb79..2fcb2df95 100644 --- a/test/convolve_test.cc +++ b/test/convolve_test.cc @@ -264,7 +264,7 @@ TEST_P(ConvolveTest, CopyHoriz) { uint8_t* const out = output(); DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0}; - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->h8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16, Width(), Height())); @@ -281,7 +281,7 @@ TEST_P(ConvolveTest, CopyVert) { uint8_t* const out = output(); DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0}; - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->v8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16, Width(), Height())); @@ -298,7 +298,7 @@ TEST_P(ConvolveTest, Copy2D) { uint8_t* const out = output(); DECLARE_ALIGNED(256, const int16_t, filter8[8]) = {0, 0, 0, 128, 0, 0, 0, 0}; - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->hv8_(in, kInputStride, out, kOutputStride, filter8, 16, filter8, 16, Width(), Height())); @@ -356,17 +356,17 @@ TEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) { Width(), Height()); if (filters == eighttap_smooth || (filter_x && filter_y)) - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->hv8_(in, kInputStride, out, kOutputStride, filters[filter_x], 16, filters[filter_y], 16, Width(), Height())); else if (filter_y) - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->v8_(in, kInputStride, out, kOutputStride, kInvalidFilter, 16, filters[filter_y], 16, Width(), Height())); else - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->h8_(in, kInputStride, out, kOutputStride, filters[filter_x], 16, kInvalidFilter, 16, Width(), Height())); @@ -414,17 +414,17 @@ TEST_P(ConvolveTest, MatchesReferenceAveragingSubpixelFilter) { Width(), Height()); if (filters == eighttap_smooth || (filter_x && filter_y)) - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->hv8_avg_(in, kInputStride, out, kOutputStride, filters[filter_x], 16, filters[filter_y], 16, Width(), Height())); else if (filter_y) - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->v8_avg_(in, kInputStride, out, kOutputStride, filters[filter_x], 16, filters[filter_y], 16, Width(), Height())); else - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( UUT_->h8_avg_(in, kInputStride, out, kOutputStride, filters[filter_x], 16, filters[filter_y], 16, Width(), Height())); @@ -494,9 +494,10 @@ TEST_P(ConvolveTest, ChangeFilterWorks) { */ /* Test the horizontal filter. */ - REGISTER_STATE_CHECK(UUT_->h8_(in, kInputStride, out, kOutputStride, - kChangeFilters[kInitialSubPelOffset], - kInputPixelStep, NULL, 0, Width(), Height())); + ASM_REGISTER_STATE_CHECK( + UUT_->h8_(in, kInputStride, out, kOutputStride, + kChangeFilters[kInitialSubPelOffset], + kInputPixelStep, NULL, 0, Width(), Height())); for (int x = 0; x < Width(); ++x) { const int kFilterPeriodAdjust = (x >> 3) << 3; @@ -508,9 +509,10 @@ TEST_P(ConvolveTest, ChangeFilterWorks) { } /* Test the vertical filter. */ - REGISTER_STATE_CHECK(UUT_->v8_(in, kInputStride, out, kOutputStride, - NULL, 0, kChangeFilters[kInitialSubPelOffset], - kInputPixelStep, Width(), Height())); + ASM_REGISTER_STATE_CHECK( + UUT_->v8_(in, kInputStride, out, kOutputStride, + NULL, 0, kChangeFilters[kInitialSubPelOffset], + kInputPixelStep, Width(), Height())); for (int y = 0; y < Height(); ++y) { const int kFilterPeriodAdjust = (y >> 3) << 3; @@ -522,12 +524,11 @@ TEST_P(ConvolveTest, ChangeFilterWorks) { } /* Test the horizontal and vertical filters in combination. */ - REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride, - kChangeFilters[kInitialSubPelOffset], - kInputPixelStep, - kChangeFilters[kInitialSubPelOffset], - kInputPixelStep, - Width(), Height())); + ASM_REGISTER_STATE_CHECK( + UUT_->hv8_(in, kInputStride, out, kOutputStride, + kChangeFilters[kInitialSubPelOffset], kInputPixelStep, + kChangeFilters[kInitialSubPelOffset], kInputPixelStep, + Width(), Height())); for (int y = 0; y < Height(); ++y) { const int kFilterPeriodAdjustY = (y >> 3) << 3; @@ -560,10 +561,10 @@ TEST_P(ConvolveTest, CheckScalingFiltering) { for (int frac = 0; frac < 16; ++frac) { for (int step = 1; step <= 32; ++step) { /* Test the horizontal and vertical filters in combination. */ - REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride, - eighttap[frac], step, - eighttap[frac], step, - Width(), Height())); + ASM_REGISTER_STATE_CHECK(UUT_->hv8_(in, kInputStride, out, kOutputStride, + eighttap[frac], step, + eighttap[frac], step, + Width(), Height())); CheckGuardBlocks(); diff --git a/test/cpu_speed_test.cc b/test/cpu_speed_test.cc index 961a0b858..4477bf02d 100644 --- a/test/cpu_speed_test.cc +++ b/test/cpu_speed_test.cc @@ -7,8 +7,6 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ -#include <climits> -#include <vector> #include "third_party/googletest/src/include/gtest/gtest.h" #include "test/codec_factory.h" #include "test/encode_test_driver.h" @@ -20,9 +18,9 @@ namespace { const int kMaxPSNR = 100; -class CpuSpeedTest : public ::libvpx_test::EncoderTest, - public ::libvpx_test::CodecTestWith2Params< - libvpx_test::TestMode, int> { +class CpuSpeedTest + : public ::libvpx_test::EncoderTest, + public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> { protected: CpuSpeedTest() : EncoderTest(GET_PARAM(0)), @@ -60,11 +58,6 @@ class CpuSpeedTest : public ::libvpx_test::EncoderTest, } } - virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { - if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { - } - } - virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) { if (pkt->data.psnr.psnr[0] < min_psnr_) min_psnr_ = pkt->data.psnr.psnr[0]; @@ -126,11 +119,11 @@ TEST_P(CpuSpeedTest, TestEncodeHighBitrate) { ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } + TEST_P(CpuSpeedTest, TestLowBitrate) { // Validate that this clip encodes and decodes without a mismatch // when passing in a very high min q. This pushes the encoder to producing // lots of small partitions which might will test the other condition. - cfg_.rc_2pass_vbr_minsection_pct = 5; cfg_.rc_2pass_vbr_minsection_pct = 2000; cfg_.rc_target_bitrate = 200; @@ -142,14 +135,9 @@ TEST_P(CpuSpeedTest, TestLowBitrate) { ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } -using std::tr1::make_tuple; - -#define VP9_FACTORY \ - static_cast<const libvpx_test::CodecFactory*> (&libvpx_test::kVP9) - VP9_INSTANTIATE_TEST_CASE( CpuSpeedTest, ::testing::Values(::libvpx_test::kTwoPassGood, ::libvpx_test::kOnePassGood, ::libvpx_test::kRealTime), - ::testing::Range(0, 8)); + ::testing::Range(0, 9)); } // namespace diff --git a/test/dct16x16_test.cc b/test/dct16x16_test.cc index e6a20fb41..b7c2dcc81 100644 --- a/test/dct16x16_test.cc +++ b/test/dct16x16_test.cc @@ -311,9 +311,9 @@ class Trans16x16TestBase { test_input_block[j] = src[j] - dst[j]; } - REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, - test_temp_block, pitch_)); - REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, + test_temp_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); for (int j = 0; j < kNumCoeffs; ++j) { const uint32_t diff = dst[j] - src[j]; @@ -344,7 +344,7 @@ class Trans16x16TestBase { input_block[j] = rnd.Rand8() - rnd.Rand8(); fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); // The minimum quant value is 4. for (int j = 0; j < kNumCoeffs; ++j) @@ -375,8 +375,8 @@ class Trans16x16TestBase { } fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, - output_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, + output_block, pitch_)); // The minimum quant value is 4. for (int j = 0; j < kNumCoeffs; ++j) { @@ -421,7 +421,7 @@ class Trans16x16TestBase { for (int j = 1; j < kNumCoeffs; ++j) output_ref_block[j] = (output_ref_block[j] / ac_thred) * ac_thred; inv_txfm_ref(output_ref_block, ref, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunInvTxfm(output_ref_block, dst, pitch_)); + ASM_REGISTER_STATE_CHECK(RunInvTxfm(output_ref_block, dst, pitch_)); for (int j = 0; j < kNumCoeffs; ++j) EXPECT_EQ(ref[j], dst[j]); @@ -450,7 +450,7 @@ class Trans16x16TestBase { for (int j = 0; j < kNumCoeffs; ++j) coeff[j] = round(out_r[j]); - REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16)); + ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, 16)); for (int j = 0; j < kNumCoeffs; ++j) { const uint32_t diff = dst[j] - src[j]; diff --git a/test/dct32x32_test.cc b/test/dct32x32_test.cc index 501c69621..02250a97b 100644 --- a/test/dct32x32_test.cc +++ b/test/dct32x32_test.cc @@ -112,8 +112,8 @@ TEST_P(Trans32x32Test, AccuracyCheck) { test_input_block[j] = src[j] - dst[j]; } - REGISTER_STATE_CHECK(fwd_txfm_(test_input_block, test_temp_block, 32)); - REGISTER_STATE_CHECK(inv_txfm_(test_temp_block, dst, 32)); + ASM_REGISTER_STATE_CHECK(fwd_txfm_(test_input_block, test_temp_block, 32)); + ASM_REGISTER_STATE_CHECK(inv_txfm_(test_temp_block, dst, 32)); for (int j = 0; j < kNumCoeffs; ++j) { const uint32_t diff = dst[j] - src[j]; @@ -150,7 +150,7 @@ TEST_P(Trans32x32Test, CoeffCheck) { const int stride = 32; vp9_fdct32x32_c(input_block, output_ref_block, stride); - REGISTER_STATE_CHECK(fwd_txfm_(input_block, output_block, stride)); + ASM_REGISTER_STATE_CHECK(fwd_txfm_(input_block, output_block, stride)); if (version_ == 0) { for (int j = 0; j < kNumCoeffs; ++j) @@ -189,7 +189,8 @@ TEST_P(Trans32x32Test, MemCheck) { const int stride = 32; vp9_fdct32x32_c(input_extreme_block, output_ref_block, stride); - REGISTER_STATE_CHECK(fwd_txfm_(input_extreme_block, output_block, stride)); + ASM_REGISTER_STATE_CHECK( + fwd_txfm_(input_extreme_block, output_block, stride)); // The minimum quant value is 4. for (int j = 0; j < kNumCoeffs; ++j) { @@ -230,7 +231,7 @@ TEST_P(Trans32x32Test, InverseAccuracy) { reference_32x32_dct_2d(in, out_r); for (int j = 0; j < kNumCoeffs; ++j) coeff[j] = round(out_r[j]); - REGISTER_STATE_CHECK(inv_txfm_(coeff, dst, 32)); + ASM_REGISTER_STATE_CHECK(inv_txfm_(coeff, dst, 32)); for (int j = 0; j < kNumCoeffs; ++j) { const int diff = dst[j] - src[j]; const int error = diff * diff; diff --git a/test/decode_perf_test.cc b/test/decode_perf_test.cc index a43826180..9b423b353 100644 --- a/test/decode_perf_test.cc +++ b/test/decode_perf_test.cc @@ -47,7 +47,9 @@ const decode_perf_param_t kVP9DecodePerfVectors[] = { make_tuple("vp90-2-tos_426x178_tile_1x1_181kbps.webm", 1), make_tuple("vp90-2-tos_640x266_tile_1x2_336kbps.webm", 2), make_tuple("vp90-2-tos_854x356_tile_1x2_656kbps.webm", 2), + make_tuple("vp90-2-tos_854x356_tile_1x2_fpm_546kbps.webm", 2), make_tuple("vp90-2-tos_1280x534_tile_1x4_1306kbps.webm", 4), + make_tuple("vp90-2-tos_1280x534_tile_1x4_fpm_952kbps.webm", 4), make_tuple("vp90-2-tos_1920x800_tile_1x4_fpm_2335kbps.webm", 4), }; diff --git a/test/decode_test_driver.cc b/test/decode_test_driver.cc index 8bea4ccf9..a762b036e 100644 --- a/test/decode_test_driver.cc +++ b/test/decode_test_driver.cc @@ -32,15 +32,15 @@ vpx_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size, void *user_priv) { vpx_codec_err_t res_dec; InitOnce(); - REGISTER_STATE_CHECK( + API_REGISTER_STATE_CHECK( res_dec = vpx_codec_decode(&decoder_, cxdata, static_cast<unsigned int>(size), user_priv, 0)); return res_dec; } -void DecoderTest::RunLoop(CompressedVideoSource *video) { - vpx_codec_dec_cfg_t dec_cfg = {0}; +void DecoderTest::RunLoop(CompressedVideoSource *video, + const vpx_codec_dec_cfg_t &dec_cfg) { Decoder* const decoder = codec_->CreateDecoder(dec_cfg, 0); ASSERT_TRUE(decoder != NULL); const char *codec_name = decoder->GetDecoderName(); @@ -82,7 +82,12 @@ void DecoderTest::RunLoop(CompressedVideoSource *video) { while ((img = dec_iter.Next())) DecompressedFrameHook(*img, video->frame_number()); } - delete decoder; } + +void DecoderTest::RunLoop(CompressedVideoSource *video) { + vpx_codec_dec_cfg_t dec_cfg = {0}; + RunLoop(video, dec_cfg); +} + } // namespace libvpx_test diff --git a/test/decode_test_driver.h b/test/decode_test_driver.h index dd3593e1e..a3cfd3f52 100644 --- a/test/decode_test_driver.h +++ b/test/decode_test_driver.h @@ -119,6 +119,8 @@ class DecoderTest { public: // Main decoding loop virtual void RunLoop(CompressedVideoSource *video); + virtual void RunLoop(CompressedVideoSource *video, + const vpx_codec_dec_cfg_t &dec_cfg); // Hook to be called before decompressing every frame. virtual void PreDecodeFrameHook(const CompressedVideoSource& video, diff --git a/test/decode_to_md5.sh b/test/decode_to_md5.sh index 28e29c683..6cb7d0e6e 100755 --- a/test/decode_to_md5.sh +++ b/test/decode_to_md5.sh @@ -39,7 +39,8 @@ decode_to_md5() { return 1 fi - eval "${decoder}" "${input_file}" "${output_file}" ${devnull} + eval "${VPX_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ + ${devnull} [ -e "${output_file}" ] || return 1 diff --git a/test/decode_with_drops.sh b/test/decode_with_drops.sh index 12e17de38..9b2edb642 100755 --- a/test/decode_with_drops.sh +++ b/test/decode_with_drops.sh @@ -39,7 +39,8 @@ decode_with_drops() { return 1 fi - eval "${decoder}" "${input_file}" "${output_file}" "${drop_mode}" ${devnull} + eval "${VPX_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ + "${drop_mode}" ${devnull} [ -e "${output_file}" ] || return 1 } diff --git a/test/encode_test_driver.cc b/test/encode_test_driver.cc index 709831efe..da7e32b51 100644 --- a/test/encode_test_driver.cc +++ b/test/encode_test_driver.cc @@ -59,7 +59,7 @@ void Encoder::EncodeFrameInternal(const VideoSource &video, } // Encode the frame - REGISTER_STATE_CHECK( + API_REGISTER_STATE_CHECK( res = vpx_codec_encode(&encoder_, video.img(), video.pts(), video.duration(), frame_flags, deadline_)); @@ -177,7 +177,10 @@ void EncoderTest::RunLoop(VideoSource *video) { if (decoder && DoDecode()) { vpx_codec_err_t res_dec = decoder->DecodeFrame( (const uint8_t*)pkt->data.frame.buf, pkt->data.frame.sz); - ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); + + if (!HandleDecodeResult(res_dec, *video, decoder)) + break; + has_dxdata = true; } ASSERT_GE(pkt->data.frame.pts, last_pts_); diff --git a/test/encode_test_driver.h b/test/encode_test_driver.h index 9526068da..2270ce22f 100644 --- a/test/encode_test_driver.h +++ b/test/encode_test_driver.h @@ -221,6 +221,14 @@ class EncoderTest { virtual void DecompressedFrameHook(const vpx_image_t& img, vpx_codec_pts_t pts) {} + // Hook to be called to handle decode result. Return true to continue. + virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec, + const VideoSource& /* video */, + Decoder *decoder) { + EXPECT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError(); + return VPX_CODEC_OK == res_dec; + } + // Hook that can modify the encoder's output data virtual const vpx_codec_cx_pkt_t * MutateEncoderOutputHook( const vpx_codec_cx_pkt_t *pkt) { diff --git a/test/fdct4x4_test.cc b/test/fdct4x4_test.cc index ec233d3f3..ab636bf29 100644 --- a/test/fdct4x4_test.cc +++ b/test/fdct4x4_test.cc @@ -79,9 +79,9 @@ class Trans4x4TestBase { test_input_block[j] = src[j] - dst[j]; } - REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, - test_temp_block, pitch_)); - REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(test_input_block, + test_temp_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); for (int j = 0; j < kNumCoeffs; ++j) { const uint32_t diff = dst[j] - src[j]; @@ -114,7 +114,7 @@ class Trans4x4TestBase { input_block[j] = rnd.Rand8() - rnd.Rand8(); fwd_txfm_ref(input_block, output_ref_block, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, pitch_)); // The minimum quant value is 4. for (int j = 0; j < kNumCoeffs; ++j) @@ -145,8 +145,8 @@ class Trans4x4TestBase { } fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, - output_block, pitch_)); + ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_extreme_block, + output_block, pitch_)); // The minimum quant value is 4. for (int j = 0; j < kNumCoeffs; ++j) { @@ -175,7 +175,7 @@ class Trans4x4TestBase { fwd_txfm_ref(in, coeff, pitch_, tx_type_); - REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_)); + ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_)); for (int j = 0; j < kNumCoeffs; ++j) { const uint32_t diff = dst[j] - src[j]; diff --git a/test/fdct8x8_test.cc b/test/fdct8x8_test.cc index 146aa31c6..3e14c2493 100644 --- a/test/fdct8x8_test.cc +++ b/test/fdct8x8_test.cc @@ -68,7 +68,7 @@ class FwdTrans8x8TestBase { // Initialize a test block with input range [-255, 255]. for (int j = 0; j < 64; ++j) test_input_block[j] = rnd.Rand8() - rnd.Rand8(); - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunFwdTxfm(test_input_block, test_output_block, pitch_)); for (int j = 0; j < 64; ++j) { @@ -97,7 +97,7 @@ class FwdTrans8x8TestBase { // Initialize a test block with input range [-15, 15]. for (int j = 0; j < 64; ++j) test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4); - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunFwdTxfm(test_input_block, test_output_block, pitch_)); for (int j = 0; j < 64; ++j) { @@ -139,7 +139,7 @@ class FwdTrans8x8TestBase { test_input_block[j] = src[j] - dst[j]; } - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunFwdTxfm(test_input_block, test_temp_block, pitch_)); for (int j = 0; j < 64; ++j) { if (test_temp_block[j] > 0) { @@ -152,7 +152,7 @@ class FwdTrans8x8TestBase { test_temp_block[j] *= 4; } } - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunInvTxfm(test_temp_block, dst, pitch_)); for (int j = 0; j < 64; ++j) { @@ -202,11 +202,11 @@ class FwdTrans8x8TestBase { test_input_block[j] = src[j] - dst[j]; } - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunFwdTxfm(test_input_block, test_temp_block, pitch_)); - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( fwd_txfm_ref(test_input_block, ref_temp_block, pitch_, tx_type_)); - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( RunInvTxfm(test_temp_block, dst, pitch_)); for (int j = 0; j < 64; ++j) { diff --git a/test/frame_size_tests.cc b/test/frame_size_tests.cc new file mode 100644 index 000000000..d1ea0967f --- /dev/null +++ b/test/frame_size_tests.cc @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#include <climits> +#include <vector> +#include "third_party/googletest/src/include/gtest/gtest.h" +#include "test/codec_factory.h" +#include "test/encode_test_driver.h" +#include "test/i420_video_source.h" +#include "test/util.h" + +namespace { + +class VP9FrameSizeTestsLarge + : public ::libvpx_test::EncoderTest, + public ::testing::Test { + protected: + VP9FrameSizeTestsLarge() : EncoderTest(&::libvpx_test::kVP9), + expected_res_(VPX_CODEC_OK) {} + virtual ~VP9FrameSizeTestsLarge() {} + + virtual void SetUp() { + InitializeConfig(); + SetMode(::libvpx_test::kRealTime); + } + + virtual bool HandleDecodeResult(const vpx_codec_err_t res_dec, + const libvpx_test::VideoSource &video, + libvpx_test::Decoder *decoder) { + EXPECT_EQ(expected_res_, res_dec) + << "Expected " << expected_res_ + << "but got " << res_dec; + + return !::testing::Test::HasFailure(); + } + + virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, + ::libvpx_test::Encoder *encoder) { + if (video->frame() == 1) { + encoder->Control(VP8E_SET_CPUUSED, 7); + encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); + encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7); + encoder->Control(VP8E_SET_ARNR_STRENGTH, 5); + encoder->Control(VP8E_SET_ARNR_TYPE, 3); + } + } + + int expected_res_; +}; + +TEST_F(VP9FrameSizeTestsLarge, TestInvalidSizes) { + ::libvpx_test::RandomVideoSource video; + +#if CONFIG_SIZE_LIMIT + video.SetSize(DECODE_WIDTH_LIMIT + 16, DECODE_HEIGHT_LIMIT + 16); + video.set_limit(2); + expected_res_ = VPX_CODEC_CORRUPT_FRAME; + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); +#else + // If we are on a 32 bit platform we can't possibly allocate enough memory + // for the largest video frame size (64kx64k). This test checks that we + // properly return a memory error. + if (sizeof(size_t) == 4) { + video.SetSize(65535, 65535); + video.set_limit(2); + expected_res_ = VPX_CODEC_MEM_ERROR; + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); + } +#endif +} + +TEST_F(VP9FrameSizeTestsLarge, ValidSizes) { + ::libvpx_test::RandomVideoSource video; + +#if CONFIG_SIZE_LIMIT + video.SetSize(DECODE_WIDTH_LIMIT, DECODE_HEIGHT_LIMIT); + video.set_limit(2); + expected_res_ = VPX_CODEC_OK; + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); +#else + // This test produces a pretty large single frame allocation, (roughly + // 25 megabits). The encoder allocates a good number of these frames + // one for each lag in frames (for 2 pass), and then one for each possible + // reference buffer (8) - we can end up with up to 30 buffers of roughly this + // size or almost 1 gig of memory. + video.SetSize(4096, 4096); + video.set_limit(2); + expected_res_ = VPX_CODEC_OK; + ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); +#endif +} +} // namespace diff --git a/test/idct_test.cc b/test/idct_test.cc index 1bbf80a0a..c7f609d58 100644 --- a/test/idct_test.cc +++ b/test/idct_test.cc @@ -52,7 +52,7 @@ TEST_P(IDCTTest, TestGuardBlocks) { TEST_P(IDCTTest, TestAllZeros) { int i; - REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); + ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for (i = 0; i < 256; i++) if ((i & 0xF) < 4 && i < 64) @@ -65,7 +65,7 @@ TEST_P(IDCTTest, TestAllOnes) { int i; input[0] = 4; - REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); + ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for (i = 0; i < 256; i++) if ((i & 0xF) < 4 && i < 64) @@ -79,7 +79,7 @@ TEST_P(IDCTTest, TestAddOne) { for (i = 0; i < 256; i++) predict[i] = i; input[0] = 4; - REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); + ASM_REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16)); for (i = 0; i < 256; i++) if ((i & 0xF) < 4 && i < 64) @@ -93,7 +93,7 @@ TEST_P(IDCTTest, TestWithData) { for (i = 0; i < 16; i++) input[i] = i; - REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); + ASM_REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16)); for (i = 0; i < 256; i++) if ((i & 0xF) > 3 || i > 63) diff --git a/test/intrapred_test.cc b/test/intrapred_test.cc index cefe192fb..d93251dfe 100644 --- a/test/intrapred_test.cc +++ b/test/intrapred_test.cc @@ -261,10 +261,10 @@ class IntraPredYTest virtual void Predict(MB_PREDICTION_MODE mode) { mbptr_->mode_info_context->mbmi.mode = mode; - REGISTER_STATE_CHECK(pred_fn_(mbptr_, - data_ptr_[0] - kStride, - data_ptr_[0] - 1, kStride, - data_ptr_[0], kStride)); + ASM_REGISTER_STATE_CHECK(pred_fn_(mbptr_, + data_ptr_[0] - kStride, + data_ptr_[0] - 1, kStride, + data_ptr_[0], kStride)); } intra_pred_y_fn_t pred_fn_; diff --git a/test/invalid_file_test.cc b/test/invalid_file_test.cc index 8c830340e..9f37f5443 100644 --- a/test/invalid_file_test.cc +++ b/test/invalid_file_test.cc @@ -25,9 +25,18 @@ namespace { +struct DecodeParam { + int threads; + const char *filename; +}; + +std::ostream &operator<<(std::ostream &os, const DecodeParam &dp) { + return os << "threads: " << dp.threads << " file: " << dp.filename; +} + class InvalidFileTest : public ::libvpx_test::DecoderTest, - public ::libvpx_test::CodecTestWithParam<const char*> { + public ::libvpx_test::CodecTestWithParam<DecodeParam> { protected: InvalidFileTest() : DecoderTest(GET_PARAM(0)), res_file_(NULL) {} @@ -55,7 +64,8 @@ class InvalidFileTest // Check results match. EXPECT_EQ(expected_res_dec, res_dec) - << "Results don't match: frame number = " << video.frame_number(); + << "Results don't match: frame number = " << video.frame_number() + << ". (" << decoder->DecodeError() << ")"; return !HasFailure(); } @@ -65,8 +75,11 @@ class InvalidFileTest }; TEST_P(InvalidFileTest, ReturnCode) { - const std::string filename = GET_PARAM(1); libvpx_test::CompressedVideoSource *video = NULL; + const DecodeParam input = GET_PARAM(1); + vpx_codec_dec_cfg_t cfg = {0}; + cfg.threads = input.threads; + const std::string filename = input.filename; // Open compressed video file. if (filename.substr(filename.length() - 3, 3) == "ivf") { @@ -89,24 +102,30 @@ TEST_P(InvalidFileTest, ReturnCode) { OpenResFile(res_filename); // Decode frame, and check the md5 matching. - ASSERT_NO_FATAL_FAILURE(RunLoop(video)); + ASSERT_NO_FATAL_FAILURE(RunLoop(video, cfg)); delete video; } -const char *const kVP9InvalidFileTests[] = { - "invalid-vp90-01.webm", - "invalid-vp90-02.webm", - "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.ivf", - "invalid-vp90-03.webm", - "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf", - "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf", +const DecodeParam kVP9InvalidFileTests[] = { + {1, "invalid-vp90-01-v2.webm"}, + {1, "invalid-vp90-02-v2.webm"}, + {1, "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.ivf"}, + {1, "invalid-vp90-03-v2.webm"}, + {1, "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf"}, + {1, "invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf"}, }; -#define NELEMENTS(x) static_cast<int>(sizeof(x) / sizeof(x[0])) - VP9_INSTANTIATE_TEST_CASE(InvalidFileTest, - ::testing::ValuesIn(kVP9InvalidFileTests, - kVP9InvalidFileTests + - NELEMENTS(kVP9InvalidFileTests))); + ::testing::ValuesIn(kVP9InvalidFileTests)); + +const DecodeParam kMultiThreadedVP9InvalidFileTests[] = { + {4, "invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm"}, +}; +INSTANTIATE_TEST_CASE_P( + VP9MultiThreaded, InvalidFileTest, + ::testing::Combine( + ::testing::Values( + static_cast<const libvpx_test::CodecFactory*>(&libvpx_test::kVP9)), + ::testing::ValuesIn(kMultiThreadedVP9InvalidFileTests))); } // namespace diff --git a/test/md5_helper.h b/test/md5_helper.h index dd446f4f6..dc9558267 100644 --- a/test/md5_helper.h +++ b/test/md5_helper.h @@ -28,10 +28,11 @@ class MD5 { // plane, we never want to round down and thus skip a pixel so if // we are shifting by 1 (chroma_shift) we add 1 before doing the shift. // This works only for chroma_shift of 0 and 1. + const int bytes_per_sample = (img->fmt & VPX_IMG_FMT_HIGH) ? 2 : 1; const int h = plane ? (img->d_h + img->y_chroma_shift) >> img->y_chroma_shift : img->d_h; - const int w = plane ? (img->d_w + img->x_chroma_shift) >> - img->x_chroma_shift : img->d_w; + const int w = (plane ? (img->d_w + img->x_chroma_shift) >> + img->x_chroma_shift : img->d_w) * bytes_per_sample; for (int y = 0; y < h; ++y) { MD5Update(&md5_, buf, w); diff --git a/test/partial_idct_test.cc b/test/partial_idct_test.cc index f2171b200..fd24c7560 100644 --- a/test/partial_idct_test.cc +++ b/test/partial_idct_test.cc @@ -118,8 +118,8 @@ TEST_P(PartialIDctTest, RunQuantCheck) { = (output_ref_block[j] / 1828) * 1828; } - REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); - REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block1, dst2, size)); + ASM_REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); + ASM_REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block1, dst2, size)); for (int j = 0; j < block_size; ++j) { const int diff = dst1[j] - dst2[j]; @@ -182,8 +182,8 @@ TEST_P(PartialIDctTest, ResultsMatch) { memcpy(test_coef_block2, test_coef_block1, sizeof(*test_coef_block2) * block_size); - REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); - REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block2, dst2, size)); + ASM_REGISTER_STATE_CHECK(full_itxfm_(test_coef_block1, dst1, size)); + ASM_REGISTER_STATE_CHECK(partial_itxfm_(test_coef_block2, dst2, size)); for (int j = 0; j < block_size; ++j) { const int diff = dst1[j] - dst2[j]; diff --git a/test/postproc.sh b/test/postproc.sh index c9c4e5813..939a3e762 100755 --- a/test/postproc.sh +++ b/test/postproc.sh @@ -37,7 +37,8 @@ postproc() { return 1 fi - eval "${decoder}" "${input_file}" "${output_file}" ${devnull} + eval "${VPX_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ + ${devnull} [ -e "${output_file}" ] || return 1 } diff --git a/test/pp_filter_test.cc b/test/pp_filter_test.cc index 86c2b0e8d..1144083ad 100644 --- a/test/pp_filter_test.cc +++ b/test/pp_filter_test.cc @@ -80,8 +80,9 @@ TEST_P(VP8PostProcessingFilterTest, FilterOutputCheck) { // Initialize pixels in the output to 99. (void)vpx_memset(dst_image, 99, output_size); - REGISTER_STATE_CHECK(GetParam()(src_image_ptr, dst_image_ptr, input_stride, - output_stride, block_width, flimits, 16)); + ASM_REGISTER_STATE_CHECK( + GetParam()(src_image_ptr, dst_image_ptr, input_stride, + output_stride, block_width, flimits, 16)); static const uint8_t expected_data[block_height] = { 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4 diff --git a/test/register_state_check.h b/test/register_state_check.h index 1ee149b0c..8d4beea5f 100644 --- a/test/register_state_check.h +++ b/test/register_state_check.h @@ -13,6 +13,20 @@ #include "third_party/googletest/src/include/gtest/gtest.h" #include "./vpx_config.h" +#include "vpx/vpx_integer.h" + +// ASM_REGISTER_STATE_CHECK(asm_function) +// Minimally validates the environment pre & post function execution. This +// variant should be used with assembly functions which are not expected to +// fully restore the system state. See platform implementations of +// RegisterStateCheck for details. +// +// API_REGISTER_STATE_CHECK(api_function) +// Performs all the checks done by ASM_REGISTER_STATE_CHECK() and any +// additional checks to ensure the environment is in a consistent state pre & +// post function execution. This variant should be used with API functions. +// See platform implementations of RegisterStateCheckXXX for details. +// #if defined(_WIN64) @@ -35,11 +49,6 @@ namespace libvpx_test { // Compares the state of xmm[6-15] at construction with their state at // destruction. These registers should be preserved by the callee on // Windows x64. -// Usage: -// { -// RegisterStateCheck reg_check; -// FunctionToVerify(); -// } class RegisterStateCheck { public: RegisterStateCheck() { initialized_ = StoreRegisters(&pre_context_); } @@ -75,9 +84,9 @@ class RegisterStateCheck { CONTEXT pre_context_; }; -#define REGISTER_STATE_CHECK(statement) do { \ - libvpx_test::RegisterStateCheck reg_check; \ - statement; \ +#define ASM_REGISTER_STATE_CHECK(statement) do { \ + libvpx_test::RegisterStateCheck reg_check; \ + statement; \ } while (false) } // namespace libvpx_test @@ -85,8 +94,6 @@ class RegisterStateCheck { #elif defined(CONFIG_SHARED) && defined(HAVE_NEON_ASM) && defined(CONFIG_VP9) \ && !CONFIG_SHARED && HAVE_NEON_ASM && CONFIG_VP9 -#include "vpx/vpx_integer.h" - extern "C" { // Save the d8-d15 registers into store. void vp9_push_neon(int64_t *store); @@ -97,11 +104,6 @@ namespace libvpx_test { // Compares the state of d8-d15 at construction with their state at // destruction. These registers should be preserved by the callee on // arm platform. -// Usage: -// { -// RegisterStateCheck reg_check; -// FunctionToVerify(); -// } class RegisterStateCheck { public: RegisterStateCheck() { initialized_ = StoreRegisters(pre_store_); } @@ -129,9 +131,9 @@ class RegisterStateCheck { int64_t pre_store_[8]; }; -#define REGISTER_STATE_CHECK(statement) do { \ - libvpx_test::RegisterStateCheck reg_check; \ - statement; \ +#define ASM_REGISTER_STATE_CHECK(statement) do { \ + libvpx_test::RegisterStateCheck reg_check; \ + statement; \ } while (false) } // namespace libvpx_test @@ -141,10 +143,54 @@ class RegisterStateCheck { namespace libvpx_test { class RegisterStateCheck {}; -#define REGISTER_STATE_CHECK(statement) statement +#define ASM_REGISTER_STATE_CHECK(statement) statement } // namespace libvpx_test #endif // _WIN64 +#if ARCH_X86 || ARCH_X86_64 +#if defined(__GNUC__) + +namespace libvpx_test { + +// Checks the FPU tag word pre/post execution to ensure emms has been called. +class RegisterStateCheckMMX { + public: + RegisterStateCheckMMX() { + __asm__ volatile("fstenv %0" : "=rm"(pre_fpu_env_)); + } + ~RegisterStateCheckMMX() { EXPECT_TRUE(Check()); } + + private: + // Checks the FPU tag word pre/post execution, returning false if not cleared + // to 0xffff. + bool Check() const { + EXPECT_EQ(0xffff, pre_fpu_env_[4]) + << "FPU was in an inconsistent state prior to call"; + + uint16_t post_fpu_env[14]; + __asm__ volatile("fstenv %0" : "=rm"(post_fpu_env)); + EXPECT_EQ(0xffff, post_fpu_env[4]) + << "FPU was left in an inconsistent state after call"; + return !testing::Test::HasNonfatalFailure(); + } + + uint16_t pre_fpu_env_[14]; +}; + +#define API_REGISTER_STATE_CHECK(statement) do { \ + libvpx_test::RegisterStateCheckMMX reg_check; \ + ASM_REGISTER_STATE_CHECK(statement); \ +} while (false) + +} // namespace libvpx_test + +#endif // __GNUC__ +#endif // ARCH_X86 || ARCH_X86_64 + +#ifndef API_REGISTER_STATE_CHECK +#define API_REGISTER_STATE_CHECK ASM_REGISTER_STATE_CHECK +#endif + #endif // TEST_REGISTER_STATE_CHECK_H_ diff --git a/test/resize_util.sh b/test/resize_util.sh index ab3dfd151..5e472716d 100755 --- a/test/resize_util.sh +++ b/test/resize_util.sh @@ -38,7 +38,7 @@ resize_util() { return 1 fi - eval "${resizer}" "${YUV_RAW_INPUT}" \ + eval "${VPX_TEST_PREFIX}" "${resizer}" "${YUV_RAW_INPUT}" \ "${YUV_RAW_INPUT_WIDTH}x${YUV_RAW_INPUT_HEIGHT}" \ "${target_dimensions}" "${output_file}" ${frames_to_resize} \ ${devnull} diff --git a/test/sad_test.cc b/test/sad_test.cc index e9401ed5f..23dbd0565 100644 --- a/test/sad_test.cc +++ b/test/sad_test.cc @@ -149,9 +149,9 @@ class SADx4Test const uint8_t* refs[] = {GetReference(0), GetReference(1), GetReference(2), GetReference(3)}; - REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_, - refs, reference_stride_, - results)); + ASM_REGISTER_STATE_CHECK(GET_PARAM(2)(source_data_, source_stride_, + refs, reference_stride_, + results)); } void CheckSADs() { @@ -178,9 +178,9 @@ class SADTest unsigned int ret; const uint8_t* const reference = GetReference(block_idx); - REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_, - max_sad)); + ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, + reference, reference_stride_, + max_sad)); return ret; } @@ -210,8 +210,8 @@ class SADVP9Test unsigned int ret; const uint8_t* const reference = GetReference(block_idx); - REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_)); + ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, + reference, reference_stride_)); return ret; } diff --git a/test/simple_decoder.sh b/test/simple_decoder.sh index 0be48e6b7..7eeaf71b1 100755 --- a/test/simple_decoder.sh +++ b/test/simple_decoder.sh @@ -37,7 +37,8 @@ simple_decoder() { return 1 fi - eval "${decoder}" "${input_file}" "${output_file}" ${devnull} + eval "${VPX_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ + ${devnull} [ -e "${output_file}" ] || return 1 } diff --git a/test/simple_encoder.sh b/test/simple_encoder.sh index a0b0e132e..c4a628030 100755 --- a/test/simple_encoder.sh +++ b/test/simple_encoder.sh @@ -34,7 +34,7 @@ simple_encoder() { return 1 fi - eval "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ + eval "${VPX_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" 9999 \ ${devnull} diff --git a/test/sixtap_predict_test.cc b/test/sixtap_predict_test.cc index 0c600f402..ac7aa9947 100644 --- a/test/sixtap_predict_test.cc +++ b/test/sixtap_predict_test.cc @@ -143,8 +143,9 @@ TEST_P(SixtapPredictTest, TestWithPresetData) { uint8_t *src = const_cast<uint8_t*>(test_data); - REGISTER_STATE_CHECK(sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride, - 2, 2, dst_, kDstStride)); + ASM_REGISTER_STATE_CHECK( + sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride, + 2, 2, dst_, kDstStride)); for (int i = 0; i < height_; ++i) for (int j = 0; j < width_; ++j) @@ -169,7 +170,7 @@ TEST_P(SixtapPredictTest, TestWithRandomData) { xoffset, yoffset, dst_c_, kDstStride); // Run test. - REGISTER_STATE_CHECK( + ASM_REGISTER_STATE_CHECK( sixtap_predict_(&src_[kSrcStride * 2 + 2 + 1], kSrcStride, xoffset, yoffset, dst_, kDstStride)); diff --git a/test/subtract_test.cc b/test/subtract_test.cc index 63e999d6e..2db3dd785 100644 --- a/test/subtract_test.cc +++ b/test/subtract_test.cc @@ -82,7 +82,7 @@ TEST_P(SubtractBlockTest, SimpleSubtract) { predictor += kDiffPredStride; } - REGISTER_STATE_CHECK(GetParam()(&be, &bd, kDiffPredStride)); + ASM_REGISTER_STATE_CHECK(GetParam()(&be, &bd, kDiffPredStride)); base_src = *be.base_src; src_diff = be.src_diff; diff --git a/test/svc_test.cc b/test/svc_test.cc index 417790bff..e9cf38def 100644 --- a/test/svc_test.cc +++ b/test/svc_test.cc @@ -167,6 +167,24 @@ TEST_F(SvcTest, SetQuantizersOption) { codec_initialized_ = true; } +TEST_F(SvcTest, SetAutoAltRefOption) { + svc_.spatial_layers = 5; + vpx_codec_err_t res = vpx_svc_set_options(&svc_, "auto-alt-refs=none"); + EXPECT_EQ(VPX_CODEC_OK, res); + res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); + EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); + + res = vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1,1,0"); + EXPECT_EQ(VPX_CODEC_OK, res); + res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); + EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); + + vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0"); + res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); + EXPECT_EQ(VPX_CODEC_OK, res); + codec_initialized_ = true; +} + TEST_F(SvcTest, SetQuantizers) { vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,30"); EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); @@ -362,6 +380,7 @@ TEST_F(SvcTest, TwoPassEncode) { codec_enc_.g_pass = VPX_RC_FIRST_PASS; vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); vpx_svc_set_quantizers(&svc_, "40,30"); + vpx_svc_set_options(&svc_, "auto-alt-refs=1,1"); vpx_codec_err_t res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); @@ -410,6 +429,9 @@ TEST_F(SvcTest, TwoPassEncode) { vpx_codec_err_t res_dec; int frame_size; codec_enc_.g_pass = VPX_RC_LAST_PASS; + vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); + vpx_svc_set_quantizers(&svc_, "40,30"); + vpx_svc_set_options(&svc_, "auto-alt-refs=1,1"); codec_enc_.rc_twopass_stats_in.buf = &stats_buf[0]; codec_enc_.rc_twopass_stats_in.sz = stats_buf.size(); diff --git a/test/test-data.sha1 b/test/test-data.sha1 index af1815c4b..362d48530 100644 --- a/test/test-data.sha1 +++ b/test/test-data.sha1 @@ -6,6 +6,15 @@ d78e2fceba5ac942246503ec8366f879c4775ca5 invalid-vp90-02.webm 2dadee5306245fa5eeb0f99652d0e17afbcba96d invalid-vp90-02.webm.res df1a1453feb3c00d7d89746c7003b4163523bff3 invalid-vp90-03.webm 8fe6fd82bf537340f586f97a7ae31fb37ccda302 invalid-vp90-03.webm.res +a432f96ff0a787268e2f94a8092ab161a18d1b06 park_joy_90p_10_420.y4m +0b194cc312c3a2e84d156a221b0a5eb615dfddc5 park_joy_90p_10_422.y4m +ff0e0a21dc2adc95b8c1b37902713700655ced17 park_joy_90p_10_444.y4m +614c32ae1eca391e867c70d19974f0d62664dd99 park_joy_90p_12_420.y4m +c92825f1ea25c5c37855083a69faac6ac4641a9e park_joy_90p_12_422.y4m +b592189b885b6cc85db55cc98512a197d73d3b34 park_joy_90p_12_444.y4m +4e0eb61e76f0684188d9bc9f3ce61f6b6b77bb2c park_joy_90p_8_420.y4m +7a193ff7dfeb96ba5f82b2afd7afa9e1fe83d947 park_joy_90p_8_422.y4m +bdb7856e6bc93599bdda05c2e773a9f22b6c6d03 park_joy_90p_8_444.y4m b1f1c3ec79114b9a0651af24ce634afb44a9a419 rush_hour_444.y4m 5184c46ddca8b1fadd16742e8500115bc8f749da vp80-00-comprehensive-001.ivf 65bf1bbbced81b97bd030f376d1b7f61a224793f vp80-00-comprehensive-002.ivf @@ -564,10 +573,12 @@ eedb3c641e60dacbe082491a16df529a5c9187df vp90-2-sintel_426x182_tile_1x1_171kbps cb7e4955af183dff33bcba0c837f0922ab066400 vp90-2-sintel_640x272_tile_1x2_318kbps.webm 48613f9380e2580002f8a09d6e412ea4e89a52b9 vp90-2-sintel_854x364_tile_1x2_621kbps.webm 990a91f24dd284562d21d714ae773dff5452cad8 vp90-2-tos_1280x534_tile_1x4_1306kbps.webm +aa402217577a659cfc670157735b4b8e9aa670fe vp90-2-tos_1280x534_tile_1x4_fpm_952kbps.webm b6dd558c90bca466b4bcbd03b3371648186465a7 vp90-2-tos_1920x800_tile_1x4_fpm_2335kbps.webm 1a9c2914ba932a38f0a143efc1ad0e318e78888b vp90-2-tos_426x178_tile_1x1_181kbps.webm a3d2b09f24debad4747a1b3066f572be4273bced vp90-2-tos_640x266_tile_1x2_336kbps.webm c64b03b5c090e6888cb39685c31f00a6b79fa45c vp90-2-tos_854x356_tile_1x2_656kbps.webm +94b533dbcf94292001e27cc51fec87f9e8c90c0b vp90-2-tos_854x356_tile_1x2_fpm_546kbps.webm 0e7cd4135b231c9cea8d76c19f9e84b6fd77acec vp90-2-08-tile_1x8_frame_parallel.webm c9b6850af28579b031791066457f4cb40df6e1c7 vp90-2-08-tile_1x8_frame_parallel.webm.md5 e448b6e83490bca0f8d58b4f4b1126a17baf4b0c vp90-2-08-tile_1x8.webm @@ -644,6 +655,10 @@ e615575ded499ea1d992f3b38e3baa434509cdcd vp90-2-15-segkey.webm e3ab35d4316c5e81325c50f5236ceca4bc0d35df vp90-2-15-segkey.webm.md5 9b7ca2cac09d34c4a5d296c1900f93b1e2f69d0d vp90-2-15-segkey_adpq.webm 8f46ba5f785d0c2170591a153e0d0d146a7c8090 vp90-2-15-segkey_adpq.webm.md5 +698a6910a97486b833073ef0c0b18d75dce57ee8 vp90-2-16-intra-only.webm +5661b0168752969f055eec37b05fa9fa947dc7eb vp90-2-16-intra-only.webm.md5 +c01bb7938f9a9f25e0c37afdec2f2fb73b6cc7fa vp90-2-17-show-existing-frame.webm +cc75f351818b9a619818f5cc77b9bc013d0c1e11 vp90-2-17-show-existing-frame.webm.md5 0321d507ce62dedc8a51b4e9011f7a19aed9c3dc vp91-2-04-yuv444.webm 367e423dd41fdb49aa028574a2cfec5c2f325c5c vp91-2-04-yuv444.webm.md5 76024eb753cdac6a5e5703aaea189d35c3c30ac7 invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.ivf @@ -652,3 +667,11 @@ d3964f9dad9f60363c81b688324d95b4ec7c8038 invalid-vp90-2-00-quantizer-00.webm.iv 456d1493e52d32a5c30edf44a27debc1fa6b253a invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf.res c123d1f9f02fb4143abb5e271916e3a3080de8f6 invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf 456d1493e52d32a5c30edf44a27debc1fa6b253a invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf.res +fe346136b9b8c1e6f6084cc106485706915795e4 invalid-vp90-01-v2.webm +25751f5d3b05ff03f0719ad42cd625348eb8961e invalid-vp90-01-v2.webm.res +d78e2fceba5ac942246503ec8366f879c4775ca5 invalid-vp90-02-v2.webm +8e2eff4af87d2b561cce2365713269e301457ef3 invalid-vp90-02-v2.webm.res +df1a1453feb3c00d7d89746c7003b4163523bff3 invalid-vp90-03-v2.webm +25dd58c22d23f75304d7ce7f69f4e5b02ef9119a invalid-vp90-03-v2.webm.res +d637297561dd904eb2c97a9015deeb31c4a1e8d2 invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm +3a204bdbeaa3c6458b77bcebb8366d107267f55d invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm.res diff --git a/test/test.mk b/test/test.mk index f06e28e5f..bfd372bdb 100644 --- a/test/test.mk +++ b/test/test.mk @@ -15,7 +15,7 @@ LIBVPX_TEST_SRCS-yes += video_source.h ## ## Black box tests only use the public API. ## -LIBVPX_TEST_SRCS-$(CONFIG_DECODERS) += ../md5_utils.h ../md5_utils.c +LIBVPX_TEST_SRCS-yes += ../md5_utils.h ../md5_utils.c LIBVPX_TEST_SRCS-$(CONFIG_DECODERS) += ivf_video_source.h LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += ../y4minput.h ../y4minput.c LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += aq_segment_test.cc @@ -34,6 +34,7 @@ LIBVPX_TEST_SRCS-$(CONFIG_VP9_DECODER) += user_priv_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += active_map_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += borders_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += cpu_speed_test.cc +LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += frame_size_tests.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += resize_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += vp9_lossless_test.cc @@ -42,6 +43,9 @@ LIBVPX_TEST_SRCS-yes += decode_test_driver.h LIBVPX_TEST_SRCS-yes += encode_test_driver.cc LIBVPX_TEST_SRCS-yes += encode_test_driver.h +## Y4m parsing. +LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += y4m_test.cc ../y4menc.c ../y4menc.h + ## WebM Parsing ifeq ($(CONFIG_WEBM_IO), yes) LIBWEBM_PARSER_SRCS += ../third_party/libwebm/mkvparser.cpp @@ -134,6 +138,17 @@ endif # CONFIG_SHARED ## LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += hantro_collage_w352h288.yuv LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += hantro_odd.yuv + +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_420.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_422.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_444.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_420.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_422.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_444.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_420.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_422.y4m +LIBVPX_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_444.y4m + LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += rush_hour_444.y4m LIBVPX_TEST_DATA-$(CONFIG_VP9_ENCODER) += screendata.y4m @@ -757,22 +772,28 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-15-segkey.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-15-segkey.webm.md5 LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-15-segkey_adpq.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-15-segkey_adpq.webm.md5 +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-16-intra-only.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-16-intra-only.webm.md5 +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-17-show-existing-frame.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-17-show-existing-frame.webm.md5 LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp91-2-04-yuv444.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp91-2-04-yuv444.webm.md5 # Invalid files for testing libvpx error checking. -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01.webm -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01.webm.res -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02.webm -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02.webm.res -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-03.webm -LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-03.webm.res +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v2.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-01-v2.webm.res +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02-v2.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-02-v2.webm.res +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-03-v2.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-03-v2.webm.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.ivf LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-.ivf.res LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-00-quantizer-11.webm.ivf.s52984_r01-05_b6-z.ivf.res +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += invalid-vp90-2-08-tile_1x4_frame_parallel_all_key.webm.res ifeq ($(CONFIG_DECODE_PERF_TESTS),yes) # BBB VP9 streams @@ -809,7 +830,11 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ vp90-2-tos_854x356_tile_1x2_656kbps.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ + vp90-2-tos_854x356_tile_1x2_fpm_546kbps.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ vp90-2-tos_1280x534_tile_1x4_1306kbps.webm LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ + vp90-2-tos_1280x534_tile_1x4_fpm_952kbps.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += \ vp90-2-tos_1920x800_tile_1x4_fpm_2335kbps.webm endif # CONFIG_DECODE_PERF_TESTS diff --git a/test/test_vectors.cc b/test/test_vectors.cc index 41c9e2657..4ea4b9dab 100644 --- a/test/test_vectors.cc +++ b/test/test_vectors.cc @@ -180,6 +180,7 @@ const char *const kVP9TestVectors[] = { "vp90-2-14-resize-fp-tiles-8-16.webm", "vp90-2-14-resize-fp-tiles-8-1.webm", "vp90-2-14-resize-fp-tiles-8-2.webm", "vp90-2-14-resize-fp-tiles-8-4.webm", "vp90-2-15-segkey.webm", "vp90-2-15-segkey_adpq.webm", + "vp90-2-16-intra-only.webm", "vp90-2-17-show-existing-frame.webm", "vp91-2-04-yuv444.webm", }; const int kNumVP9TestVectors = NELEMENTS(kVP9TestVectors); diff --git a/test/tools_common.sh b/test/tools_common.sh index 7f32905f2..3e69c3687 100755 --- a/test/tools_common.sh +++ b/test/tools_common.sh @@ -16,6 +16,7 @@ VPX_TEST_TOOLS_COMMON_SH=included set -e devnull='> /dev/null 2>&1' +VPX_TEST_PREFIX="" elog() { echo "$@" 1>&2 @@ -204,9 +205,12 @@ vpxdec() { local decoder="${LIBVPX_BIN_PATH}/vpxdec${VPX_TEST_EXE_SUFFIX}" if [ -z "${pipe_input}" ]; then - eval "${decoder}" "$input" --summary --noblit "$@" ${devnull} + eval "${VPX_TEST_PREFIX}" "${decoder}" "$input" --summary --noblit "$@" \ + ${devnull} else - cat "${input}" | eval "${decoder}" - --summary --noblit "$@" ${devnull} + cat "${input}" \ + | eval "${VPX_TEST_PREFIX}" "${decoder}" - --summary --noblit "$@" \ + ${devnull} fi } @@ -252,16 +256,14 @@ vpxenc() { fi if [ -z "${pipe_input}" ]; then - eval "${encoder}" --codec=${codec} --width=${width} --height=${height} \ - --limit=${frames} ${use_ivf} ${extra_flags} --output="${output}" \ - "${input}" \ - ${devnull} + eval "${VPX_TEST_PREFIX}" "${encoder}" --codec=${codec} --width=${width} \ + --height=${height} --limit=${frames} ${use_ivf} ${extra_flags} \ + --output="${output}" "${input}" ${devnull} else cat "${input}" \ - | eval "${encoder}" --codec=${codec} --width=${width} \ - --height=${height} --limit=${frames} ${use_ivf} ${extra_flags} \ - --output="${output}" - \ - ${devnull} + | eval "${VPX_TEST_PREFIX}" "${encoder}" --codec=${codec} \ + --width=${width} --height=${height} --limit=${frames} ${use_ivf} \ + ${extra_flags} --output="${output}" - ${devnull} fi if [ ! -e "${output}" ]; then @@ -351,6 +353,9 @@ cat << EOF --help: Display this message and exit. --test-data-path <path to libvpx test data directory> --show-program-output: Shows output from all programs being tested. + --prefix: Allows for a user specified prefix to be inserted before all test + programs. Grants the ability, for example, to run test programs + within valgrind. --verbose: Verbose output. When the --bin-path option is not specified the script attempts to use @@ -400,6 +405,10 @@ while [ -n "$1" ]; do LIBVPX_TEST_DATA_PATH="$2" shift ;; + --prefix) + VPX_TEST_PREFIX="$2" + shift + ;; --verbose) VPX_TEST_VERBOSE_OUTPUT=yes ;; @@ -466,6 +475,7 @@ vlog "$(basename "${0%.*}") test configuration: VPX_TEST_EXE_SUFFIX=${VPX_TEST_EXE_SUFFIX} VPX_TEST_FILTER=${VPX_TEST_FILTER} VPX_TEST_OUTPUT_DIR=${VPX_TEST_OUTPUT_DIR} + VPX_TEST_PREFIX=${VPX_TEST_PREFIX} VPX_TEST_RAND=${VPX_TEST_RAND} VPX_TEST_RUN_DISABLED_TESTS=${VPX_TEST_RUN_DISABLED_TESTS} VPX_TEST_SHOW_PROGRAM_OUTPUT=${VPX_TEST_SHOW_PROGRAM_OUTPUT} diff --git a/test/twopass_encoder.sh b/test/twopass_encoder.sh index 95d49d6e8..1189e5131 100755 --- a/test/twopass_encoder.sh +++ b/test/twopass_encoder.sh @@ -34,7 +34,7 @@ twopass_encoder() { return 1 fi - eval "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ + eval "${VPX_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" \ ${devnull} diff --git a/test/variance_test.cc b/test/variance_test.cc index 998569516..546977069 100644 --- a/test/variance_test.cc +++ b/test/variance_test.cc @@ -124,7 +124,8 @@ void VarianceTest<VarianceFunctionType>::ZeroTest() { memset(ref_, j, block_size_); unsigned int sse; unsigned int var; - REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse)); + ASM_REGISTER_STATE_CHECK( + var = variance_(src_, width_, ref_, width_, &sse)); EXPECT_EQ(0u, var) << "src values: " << i << "ref values: " << j; } } @@ -139,7 +140,8 @@ void VarianceTest<VarianceFunctionType>::RefTest() { } unsigned int sse1, sse2; unsigned int var1; - REGISTER_STATE_CHECK(var1 = variance_(src_, width_, ref_, width_, &sse1)); + ASM_REGISTER_STATE_CHECK( + var1 = variance_(src_, width_, ref_, width_, &sse1)); const unsigned int var2 = variance_ref(src_, ref_, log2width_, log2height_, &sse2); EXPECT_EQ(sse1, sse2); @@ -155,7 +157,7 @@ void VarianceTest<VarianceFunctionType>::OneQuarterTest() { memset(ref_ + half, 0, half); unsigned int sse; unsigned int var; - REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse)); + ASM_REGISTER_STATE_CHECK(var = variance_(src_, width_, ref_, width_, &sse)); const unsigned int expected = block_size_ * 255 * 255 / 4; EXPECT_EQ(expected, var); } @@ -246,8 +248,8 @@ void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() { } unsigned int sse1, sse2; unsigned int var1; - REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y, - src_, width_, &sse1)); + ASM_REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y, + src_, width_, &sse1)); const unsigned int var2 = subpel_variance_ref(ref_, src_, log2width_, log2height_, x, y, &sse2); EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y; @@ -269,8 +271,9 @@ void SubpelVarianceTest<vp9_subp_avg_variance_fn_t>::RefTest() { } unsigned int sse1, sse2; unsigned int var1; - REGISTER_STATE_CHECK(var1 = subpel_variance_(ref_, width_ + 1, x, y, - src_, width_, &sse1, sec_)); + ASM_REGISTER_STATE_CHECK( + var1 = subpel_variance_(ref_, width_ + 1, x, y, + src_, width_, &sse1, sec_)); const unsigned int var2 = subpel_avg_variance_ref(ref_, src_, sec_, log2width_, log2height_, x, y, &sse2); diff --git a/test/video_source.h b/test/video_source.h index 6d1855ae3..f7e31d42a 100644 --- a/test/video_source.h +++ b/test/video_source.h @@ -50,6 +50,15 @@ static FILE *OpenTestDataFile(const std::string& file_name) { return fopen(path_to_source.c_str(), "rb"); } +static FILE *OpenTestOutFile(const std::string& file_name) { + const std::string path_to_source = GetDataPath() + "/" + file_name; + return fopen(path_to_source.c_str(), "wb"); +} + +static FILE *OpenTempOutFile() { + return tmpfile(); +} + // Abstract base class for test video sources, which provide a stream of // vpx_image_t images with associated timestamps and duration. class VideoSource { @@ -118,6 +127,10 @@ class DummyVideoSource : public VideoSource { virtual unsigned int limit() const { return limit_; } + void set_limit(unsigned int limit) { + limit_ = limit; + } + void SetSize(unsigned int width, unsigned int height) { if (width != width_ || height != height_) { vpx_img_free(img_); diff --git a/test/vp8cx_set_ref.sh b/test/vp8cx_set_ref.sh index ee1005678..5d760bcde 100755 --- a/test/vp8cx_set_ref.sh +++ b/test/vp8cx_set_ref.sh @@ -39,9 +39,9 @@ vpx_set_ref() { return 1 fi - eval "${encoder}" "${YUV_RAW_INPUT_WIDTH}" "${YUV_RAW_INPUT_HEIGHT}" \ - "${YUV_RAW_INPUT}" "${output_file}" "${ref_frame_num}" \ - ${devnull} + eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT_WIDTH}" \ + "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" \ + "${ref_frame_num}" ${devnull} [ -e "${output_file}" ] || return 1 } diff --git a/test/vp9_spatial_svc_encoder.sh b/test/vp9_spatial_svc_encoder.sh index 8c9d13072..a5728f677 100755 --- a/test/vp9_spatial_svc_encoder.sh +++ b/test/vp9_spatial_svc_encoder.sh @@ -39,10 +39,9 @@ vp9_spatial_svc_encoder() { return 1 fi - eval "${encoder}" -w "${YUV_RAW_INPUT_WIDTH}" -h "${YUV_RAW_INPUT_HEIGHT}" \ - -k "${max_kf}" -f "${frames_to_encode}" "$@" "${YUV_RAW_INPUT}" \ - "${output_file}" \ - ${devnull} + eval "${VPX_TEST_PREFIX}" "${encoder}" -w "${YUV_RAW_INPUT_WIDTH}" \ + -h "${YUV_RAW_INPUT_HEIGHT}" -k "${max_kf}" -f "${frames_to_encode}" \ + "$@" "${YUV_RAW_INPUT}" "${output_file}" ${devnull} [ -e "${output_file}" ] || return 1 } diff --git a/test/vp9_thread_test.cc b/test/vp9_thread_test.cc index 72719a698..d7fc4eedb 100644 --- a/test/vp9_thread_test.cc +++ b/test/vp9_thread_test.cc @@ -18,7 +18,7 @@ #if CONFIG_WEBM_IO #include "test/webm_video_source.h" #endif -#include "vp9/decoder/vp9_thread.h" +#include "vp9/common/vp9_thread.h" namespace { @@ -35,6 +35,15 @@ class VP9WorkerThreadTest : public ::testing::TestWithParam<bool> { vp9_get_worker_interface()->end(&worker_); } + void Run(VP9Worker* worker) { + const bool synchronous = GetParam(); + if (synchronous) { + vp9_get_worker_interface()->execute(worker); + } else { + vp9_get_worker_interface()->launch(worker); + } + } + VP9Worker worker_; }; @@ -57,12 +66,7 @@ TEST_P(VP9WorkerThreadTest, HookSuccess) { worker_.data1 = &hook_data; worker_.data2 = &return_value; - const bool synchronous = GetParam(); - if (synchronous) { - vp9_get_worker_interface()->execute(&worker_); - } else { - vp9_get_worker_interface()->launch(&worker_); - } + Run(&worker_); EXPECT_NE(vp9_get_worker_interface()->sync(&worker_), 0); EXPECT_FALSE(worker_.had_error); EXPECT_EQ(5, hook_data); @@ -81,12 +85,7 @@ TEST_P(VP9WorkerThreadTest, HookFailure) { worker_.data1 = &hook_data; worker_.data2 = &return_value; - const bool synchronous = GetParam(); - if (synchronous) { - vp9_get_worker_interface()->execute(&worker_); - } else { - vp9_get_worker_interface()->launch(&worker_); - } + Run(&worker_); EXPECT_FALSE(vp9_get_worker_interface()->sync(&worker_)); EXPECT_EQ(1, worker_.had_error); @@ -99,6 +98,39 @@ TEST_P(VP9WorkerThreadTest, HookFailure) { EXPECT_FALSE(worker_.had_error); } +TEST_P(VP9WorkerThreadTest, EndWithoutSync) { + // Create a large number of threads to increase the chances of detecting a + // race. Doing more work in the hook is no guarantee as any race would occur + // post hook execution in the main thread loop driver. + static const int kNumWorkers = 64; + VP9Worker workers[kNumWorkers]; + int hook_data[kNumWorkers]; + int return_value[kNumWorkers]; + + for (int n = 0; n < kNumWorkers; ++n) { + vp9_get_worker_interface()->init(&workers[n]); + return_value[n] = 1; // return successfully from the hook + workers[n].hook = ThreadHook; + workers[n].data1 = &hook_data[n]; + workers[n].data2 = &return_value[n]; + } + + for (int i = 0; i < 2; ++i) { + for (int n = 0; n < kNumWorkers; ++n) { + EXPECT_NE(vp9_get_worker_interface()->reset(&workers[n]), 0); + hook_data[n] = 0; + } + + for (int n = 0; n < kNumWorkers; ++n) { + Run(&workers[n]); + } + + for (int n = kNumWorkers - 1; n >= 0; --n) { + vp9_get_worker_interface()->end(&workers[n]); + } + } +} + TEST(VP9WorkerThreadTest, TestInterfaceAPI) { EXPECT_EQ(0, vp9_set_worker_interface(NULL)); EXPECT_TRUE(vp9_get_worker_interface() != NULL); diff --git a/test/vpx_temporal_svc_encoder.sh b/test/vpx_temporal_svc_encoder.sh index b2e968fa8..fcc8cb4ff 100755 --- a/test/vpx_temporal_svc_encoder.sh +++ b/test/vpx_temporal_svc_encoder.sh @@ -21,6 +21,10 @@ vpx_tsvc_encoder_verify_environment() { echo "Libvpx test data must exist in LIBVPX_TEST_DATA_PATH." return 1 fi + if [ "$(vpx_config_option_enabled CONFIG_TEMPORAL_DENOISING)" != "yes" ]; then + elog "Warning: Temporal denoising is disabled! Spatial denoising will be " \ + "used instead, which is probably not what you want for this test." + fi } # Runs vpx_temporal_svc_encoder using the codec specified by $1 and output file @@ -44,8 +48,8 @@ vpx_tsvc_encoder() { return 1 fi - eval "${encoder}" "${YUV_RAW_INPUT}" "${output_file}" "${codec}" \ - "${YUV_RAW_INPUT_WIDTH}" "${YUV_RAW_INPUT_HEIGHT}" \ + eval "${VPX_TEST_PREFIX}" "${encoder}" "${YUV_RAW_INPUT}" "${output_file}" \ + "${codec}" "${YUV_RAW_INPUT_WIDTH}" "${YUV_RAW_INPUT_HEIGHT}" \ "${timebase_num}" "${timebase_den}" "${speed}" "${frame_drop_thresh}" \ "$@" \ ${devnull} diff --git a/test/y4m_test.cc b/test/y4m_test.cc new file mode 100644 index 000000000..73ff68308 --- /dev/null +++ b/test/y4m_test.cc @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2012 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <string> +#include "test/md5_helper.h" +#include "test/util.h" +#include "test/y4m_video_source.h" +#include "third_party/googletest/src/include/gtest/gtest.h" +#include "./vpx_config.h" +#include "./y4menc.h" + +namespace { + +using std::string; + +static const unsigned int kWidth = 160; +static const unsigned int kHeight = 90; +static const unsigned int kFrames = 10; + +typedef struct { + const char *filename; + unsigned int bit_depth; + vpx_img_fmt format; + const char *md5raw; +} test_entry_type; + +const test_entry_type kY4mTestVectors[] = { + {"park_joy_90p_8_420.y4m", 8, VPX_IMG_FMT_I420, + "e5406275b9fc6bb3436c31d4a05c1cab"}, + {"park_joy_90p_8_422.y4m", 8, VPX_IMG_FMT_I422, + "284a47a47133b12884ec3a14e959a0b6"}, + {"park_joy_90p_8_444.y4m", 8, VPX_IMG_FMT_I444, + "90517ff33843d85de712fd4fe60dbed0"}, + {"park_joy_90p_10_420.y4m", 10, VPX_IMG_FMT_I42016, + "63f21f9f717d8b8631bd2288ee87137b"}, + {"park_joy_90p_10_422.y4m", 10, VPX_IMG_FMT_I42216, + "48ab51fb540aed07f7ff5af130c9b605"}, + {"park_joy_90p_10_444.y4m", 10, VPX_IMG_FMT_I44416, + "067bfd75aa85ff9bae91fa3e0edd1e3e"}, + {"park_joy_90p_12_420.y4m", 12, VPX_IMG_FMT_I42016, + "9e6d8f6508c6e55625f6b697bc461cef"}, + {"park_joy_90p_12_422.y4m", 12, VPX_IMG_FMT_I42216, + "b239c6b301c0b835485be349ca83a7e3"}, + {"park_joy_90p_12_444.y4m", 12, VPX_IMG_FMT_I44416, + "5a6481a550821dab6d0192f5c63845e9"}, +}; + +static void write_image_file(const vpx_image_t *img, FILE *file) { + int plane, y; + for (plane = 0; plane < 3; ++plane) { + const unsigned char *buf = img->planes[plane]; + const int stride = img->stride[plane]; + const int bytes_per_sample = (img->fmt & VPX_IMG_FMT_HIGH) ? 2 : 1; + const int h = (plane ? (img->d_h + img->y_chroma_shift) >> + img->y_chroma_shift : img->d_h); + const int w = (plane ? (img->d_w + img->x_chroma_shift) >> + img->x_chroma_shift : img->d_w); + for (y = 0; y < h; ++y) { + fwrite(buf, bytes_per_sample, w, file); + buf += stride; + } + } +} + +class Y4mVideoSourceTest + : public ::testing::TestWithParam<test_entry_type>, + public ::libvpx_test::Y4mVideoSource { + protected: + Y4mVideoSourceTest() : Y4mVideoSource("", 0, 0) {} + + virtual ~Y4mVideoSourceTest() { + CloseSource(); + } + + virtual void Init(const std::string &file_name, int limit) { + file_name_ = file_name; + start_ = 0; + limit_ = limit; + frame_ = 0; + Begin(); + } + + // Checks y4m header information + void HeaderChecks(unsigned int bit_depth, vpx_img_fmt_t fmt) { + ASSERT_TRUE(input_file_ != NULL); + ASSERT_EQ(y4m_.pic_w, (int)kWidth); + ASSERT_EQ(y4m_.pic_h, (int)kHeight); + ASSERT_EQ(img()->d_w, kWidth); + ASSERT_EQ(img()->d_h, kHeight); + ASSERT_EQ(y4m_.bit_depth, bit_depth); + ASSERT_EQ(y4m_.vpx_fmt, fmt); + if (fmt == VPX_IMG_FMT_I420 || fmt == VPX_IMG_FMT_I42016) { + ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 3 / 2); + ASSERT_EQ(img()->x_chroma_shift, 1U); + ASSERT_EQ(img()->y_chroma_shift, 1U); + } + if (fmt == VPX_IMG_FMT_I422 || fmt == VPX_IMG_FMT_I42216) { + ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 2); + ASSERT_EQ(img()->x_chroma_shift, 1U); + ASSERT_EQ(img()->y_chroma_shift, 0U); + } + if (fmt == VPX_IMG_FMT_I444 || fmt == VPX_IMG_FMT_I44416) { + ASSERT_EQ(y4m_.bps, (int)y4m_.bit_depth * 3); + ASSERT_EQ(img()->x_chroma_shift, 0U); + ASSERT_EQ(img()->y_chroma_shift, 0U); + } + } + + // Checks MD5 of the raw frame data + void Md5Check(const string &expected_md5) { + ASSERT_TRUE(input_file_ != NULL); + libvpx_test::MD5 md5; + for (unsigned int i = start_; i < limit_; i++) { + md5.Add(img()); + Next(); + } + ASSERT_EQ(string(md5.Get()), expected_md5); + } +}; + +TEST_P(Y4mVideoSourceTest, SourceTest) { + const test_entry_type t = GetParam(); + Init(t.filename, kFrames); + HeaderChecks(t.bit_depth, t.format); + Md5Check(t.md5raw); +} + +INSTANTIATE_TEST_CASE_P(C, Y4mVideoSourceTest, + ::testing::ValuesIn(kY4mTestVectors)); + +class Y4mVideoWriteTest + : public Y4mVideoSourceTest { + protected: + Y4mVideoWriteTest() : Y4mVideoSourceTest() {} + + virtual void ReplaceInputFp(FILE *input_file) { + CloseSource(); + frame_ = 0; + input_file_ = input_file; + rewind(input_file_); + ReadSourceToStart(); + } + + // Writes out a y4m file and then reads it back + void WriteY4mAndReadBack() { + ASSERT_TRUE(input_file_ != NULL); + char buf[Y4M_BUFFER_SIZE] = {0}; + const struct VpxRational framerate = {y4m_.fps_n, y4m_.fps_d}; + FILE *out_file = libvpx_test::OpenTempOutFile(); + ASSERT_TRUE(out_file != NULL); + y4m_write_file_header(buf, sizeof(buf), + kWidth, kHeight, + &framerate, y4m_.vpx_fmt, + y4m_.bit_depth); + fputs(buf, out_file); + for (unsigned int i = start_; i < limit_; i++) { + y4m_write_frame_header(buf, sizeof(buf)); + fputs(buf, out_file); + write_image_file(img(), out_file); + Next(); + } + ReplaceInputFp(out_file); + } + + virtual void Init(const std::string &file_name, int limit) { + Y4mVideoSourceTest::Init(file_name, limit); + WriteY4mAndReadBack(); + } +}; + +TEST_P(Y4mVideoWriteTest, WriteTest) { + const test_entry_type t = GetParam(); + Init(t.filename, kFrames); + HeaderChecks(t.bit_depth, t.format); + Md5Check(t.md5raw); +} + +INSTANTIATE_TEST_CASE_P(C, Y4mVideoWriteTest, + ::testing::ValuesIn(kY4mTestVectors)); +} // namespace diff --git a/test/y4m_video_source.h b/test/y4m_video_source.h index 74190432d..378e75bf8 100644 --- a/test/y4m_video_source.h +++ b/test/y4m_video_source.h @@ -38,24 +38,30 @@ class Y4mVideoSource : public VideoSource { CloseSource(); } - virtual void Begin() { + virtual void OpenSource() { CloseSource(); input_file_ = OpenTestDataFile(file_name_); ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: " - << file_name_; + << file_name_; + } - y4m_input_open(&y4m_, input_file_, NULL, 0, 0); + virtual void ReadSourceToStart() { + ASSERT_TRUE(input_file_ != NULL); + ASSERT_FALSE(y4m_input_open(&y4m_, input_file_, NULL, 0, 0)); framerate_numerator_ = y4m_.fps_n; framerate_denominator_ = y4m_.fps_d; - frame_ = 0; for (unsigned int i = 0; i < start_; i++) { - Next(); + Next(); } - FillFrame(); } + virtual void Begin() { + OpenSource(); + ReadSourceToStart(); + } + virtual void Next() { ++frame_; FillFrame(); |