diff options
author | Matt A. Tobin <email@mattatobin.com> | 2020-04-07 23:30:51 -0400 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-04-14 13:26:42 +0200 |
commit | 277f2116b6660e9bbe7f5d67524be57eceb49b8b (patch) | |
tree | 4595f7cc71418f71b9a97dfaeb03a30aa60f336a /third_party/aom/test | |
parent | d270404436f6e84ffa3b92af537ac721bf10d66e (diff) | |
download | UXP-277f2116b6660e9bbe7f5d67524be57eceb49b8b.tar UXP-277f2116b6660e9bbe7f5d67524be57eceb49b8b.tar.gz UXP-277f2116b6660e9bbe7f5d67524be57eceb49b8b.tar.lz UXP-277f2116b6660e9bbe7f5d67524be57eceb49b8b.tar.xz UXP-277f2116b6660e9bbe7f5d67524be57eceb49b8b.zip |
Move aom source to a sub-directory under media/libaom
There is no damned reason to treat this differently than any other media lib given its license and there never was.
Diffstat (limited to 'third_party/aom/test')
159 files changed, 0 insertions, 42085 deletions
diff --git a/third_party/aom/test/accounting_test.cc b/third_party/aom/test/accounting_test.cc deleted file mode 100644 index 8b5c8af13..000000000 --- a/third_party/aom/test/accounting_test.cc +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/acm_random.h" -#include "aom/aom_integer.h" -#include "aom_dsp/bitreader.h" -#include "aom_dsp/bitwriter.h" - -using libaom_test::ACMRandom; - -TEST(AV1, TestAccounting) { - const int kBufferSize = 10000; - const int kSymbols = 1024; - aom_writer bw; - uint8_t bw_buffer[kBufferSize]; - aom_start_encode(&bw, bw_buffer); - for (int i = 0; i < kSymbols; i++) { - aom_write(&bw, 0, 32); - aom_write(&bw, 0, 32); - aom_write(&bw, 0, 32); - } - aom_stop_encode(&bw); - aom_reader br; - aom_reader_init(&br, bw_buffer, bw.pos); - - Accounting accounting; - aom_accounting_init(&accounting); - br.accounting = &accounting; - for (int i = 0; i < kSymbols; i++) { - aom_read(&br, 32, "A"); - } - // Consecutive symbols that are the same are coalesced. - GTEST_ASSERT_EQ(accounting.syms.num_syms, 1); - GTEST_ASSERT_EQ(accounting.syms.syms[0].samples, (unsigned int)kSymbols); - - aom_accounting_reset(&accounting); - GTEST_ASSERT_EQ(accounting.syms.num_syms, 0); - - // Should record 2 * kSymbols accounting symbols. - aom_reader_init(&br, bw_buffer, bw.pos); - br.accounting = &accounting; - for (int i = 0; i < kSymbols; i++) { - aom_read(&br, 32, "A"); - aom_read(&br, 32, "B"); - aom_read(&br, 32, "B"); - } - GTEST_ASSERT_EQ(accounting.syms.num_syms, kSymbols * 2); - uint32_t tell_frac = aom_reader_tell_frac(&br); - for (int i = 0; i < accounting.syms.num_syms; i++) { - tell_frac -= accounting.syms.syms[i].bits; - } - GTEST_ASSERT_EQ(tell_frac, 0U); - - GTEST_ASSERT_EQ(aom_accounting_dictionary_lookup(&accounting, "A"), - aom_accounting_dictionary_lookup(&accounting, "A")); - - // Check for collisions. The current aom_accounting_hash function returns - // the same hash code for AB and BA. - GTEST_ASSERT_NE(aom_accounting_dictionary_lookup(&accounting, "AB"), - aom_accounting_dictionary_lookup(&accounting, "BA")); -} diff --git a/third_party/aom/test/acm_random.h b/third_party/aom/test/acm_random.h deleted file mode 100644 index 0a8317fd5..000000000 --- a/third_party/aom/test/acm_random.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_ACM_RANDOM_H_ -#define AOM_TEST_ACM_RANDOM_H_ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "aom/aom_integer.h" - -namespace libaom_test { - -class ACMRandom { - public: - ACMRandom() : random_(DeterministicSeed()) {} - - explicit ACMRandom(int seed) : random_(seed) {} - - void Reset(int seed) { random_.Reseed(seed); } - - uint32_t Rand31(void) { - return random_.Generate(testing::internal::Random::kMaxRange); - } - - uint16_t Rand16(void) { - const uint32_t value = - random_.Generate(testing::internal::Random::kMaxRange); - return (value >> 15) & 0xffff; - } - - int16_t Rand15Signed(void) { - const uint32_t value = - random_.Generate(testing::internal::Random::kMaxRange); - return (value >> 17) & 0xffff; - } - - uint16_t Rand12(void) { - const uint32_t value = - random_.Generate(testing::internal::Random::kMaxRange); - // There's a bit more entropy in the upper bits of this implementation. - return (value >> 19) & 0xfff; - } - - int16_t Rand9Signed(void) { - // Use 9 bits: values between 255 (0x0FF) and -256 (0x100). - const uint32_t value = random_.Generate(512); - return static_cast<int16_t>(value) - 256; - } - - uint8_t Rand8(void) { - const uint32_t value = - random_.Generate(testing::internal::Random::kMaxRange); - // There's a bit more entropy in the upper bits of this implementation. - return (value >> 23) & 0xff; - } - - uint8_t Rand8Extremes(void) { - // Returns a random value near 0 or near 255, to better exercise - // saturation behavior. - const uint8_t r = Rand8(); - return r < 128 ? r << 4 : r >> 4; - } - - int PseudoUniform(int range) { return random_.Generate(range); } - - int operator()(int n) { return PseudoUniform(n); } - - static int DeterministicSeed(void) { return 0xbaba; } - - private: - testing::internal::Random random_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_ACM_RANDOM_H_ diff --git a/third_party/aom/test/active_map_test.cc b/third_party/aom/test/active_map_test.cc deleted file mode 100644 index a2b0546ed..000000000 --- a/third_party/aom/test/active_map_test.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <climits> -#include <vector> -#include "third_party/googletest/src/googletest/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 ActiveMapTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - static const int kWidth = 208; - static const int kHeight = 144; - - ActiveMapTest() : EncoderTest(GET_PARAM(0)) {} - virtual ~ActiveMapTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - cpu_used_ = GET_PARAM(2); - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, cpu_used_); - } else if (video->frame() == 3) { - aom_active_map_t map = aom_active_map_t(); - /* clang-format off */ - uint8_t active_map[9 * 13] = { - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, - }; - /* clang-format on */ - map.cols = (kWidth + 15) / 16; - map.rows = (kHeight + 15) / 16; - ASSERT_EQ(map.cols, 13u); - ASSERT_EQ(map.rows, 9u); - map.active_map = active_map; - encoder->Control(AOME_SET_ACTIVEMAP, &map); - } else if (video->frame() == 15) { - aom_active_map_t map = aom_active_map_t(); - map.cols = (kWidth + 15) / 16; - map.rows = (kHeight + 15) / 16; - map.active_map = NULL; - encoder->Control(AOME_SET_ACTIVEMAP, &map); - } - } - - void DoTest() { - // Validate that this non multiple of 64 wide clip encodes - cfg_.g_lag_in_frames = 0; - cfg_.rc_target_bitrate = 400; - cfg_.rc_resize_mode = 0; - cfg_.g_pass = AOM_RC_ONE_PASS; - cfg_.rc_end_usage = AOM_CBR; - cfg_.kf_max_dist = 90000; - ::libaom_test::I420VideoSource video("hantro_odd.yuv", kWidth, kHeight, 30, - 1, 0, 20); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } - - int cpu_used_; -}; - -TEST_P(ActiveMapTest, Test) { DoTest(); } - -class ActiveMapTestLarge : public ActiveMapTest {}; - -TEST_P(ActiveMapTestLarge, Test) { DoTest(); } - -AV1_INSTANTIATE_TEST_CASE(ActiveMapTestLarge, - ::testing::Values(::libaom_test::kRealTime), - ::testing::Range(0, 5)); - -AV1_INSTANTIATE_TEST_CASE(ActiveMapTest, - ::testing::Values(::libaom_test::kRealTime), - ::testing::Range(5, 9)); - -} // namespace diff --git a/third_party/aom/test/altref_test.cc b/third_party/aom/test/altref_test.cc deleted file mode 100644 index dabb1475a..000000000 --- a/third_party/aom/test/altref_test.cc +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/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 AltRefForcedKeyTestLarge - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - AltRefForcedKeyTestLarge() - : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), - cpu_used_(GET_PARAM(2)), forced_kf_frame_num_(1), frame_num_(0) {} - virtual ~AltRefForcedKeyTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - cfg_.rc_end_usage = AOM_VBR; - cfg_.g_threads = 0; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - encoder->Control(AOME_SET_CPUUSED, cpu_used_); - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); -#if CONFIG_AV1_ENCODER - // override test default for tile columns if necessary. - if (GET_PARAM(0) == &libaom_test::kAV1) { - encoder->Control(AV1E_SET_TILE_COLUMNS, 6); - } -#endif - } - frame_flags_ = - (video->frame() == forced_kf_frame_num_) ? AOM_EFLAG_FORCE_KF : 0; - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - if (frame_num_ == forced_kf_frame_num_) { - ASSERT_TRUE(!!(pkt->data.frame.flags & AOM_FRAME_IS_KEY)) - << "Frame #" << frame_num_ << " isn't a keyframe!"; - } - ++frame_num_; - } - - ::libaom_test::TestMode encoding_mode_; - int cpu_used_; - unsigned int forced_kf_frame_num_; - unsigned int frame_num_; -}; - -TEST_P(AltRefForcedKeyTestLarge, Frame1IsKey) { - const aom_rational timebase = { 1, 30 }; - const int lag_values[] = { 3, 15, 25, -1 }; - - forced_kf_frame_num_ = 1; - for (int i = 0; lag_values[i] != -1; ++i) { - frame_num_ = 0; - cfg_.g_lag_in_frames = lag_values[i]; - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 30); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } -} - -TEST_P(AltRefForcedKeyTestLarge, ForcedFrameIsKey) { - const aom_rational timebase = { 1, 30 }; - const int lag_values[] = { 3, 15, 25, -1 }; - - for (int i = 0; lag_values[i] != -1; ++i) { - frame_num_ = 0; - forced_kf_frame_num_ = lag_values[i] - 1; - cfg_.g_lag_in_frames = lag_values[i]; - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 30); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } -} - -AV1_INSTANTIATE_TEST_CASE(AltRefForcedKeyTestLarge, - ::testing::Values(::libaom_test::kOnePassGood), - ::testing::Values(2, 5)); - -} // namespace diff --git a/third_party/aom/test/aom_integer_test.cc b/third_party/aom/test/aom_integer_test.cc deleted file mode 100644 index fe88a54e9..000000000 --- a/third_party/aom/test/aom_integer_test.cc +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "aom/aom_integer.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { -const uint64_t kMaximumLeb128CodedSize = 8; -const uint8_t kLeb128PadByte = 0x80; // Binary: 10000000 -const uint64_t kMaximumLeb128Value = UINT32_MAX; -const uint32_t kSizeTestNumValues = 6; -const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = { - 1, 1, 2, 3, 4, 5 -}; -const uint64_t kSizeTestInputs[kSizeTestNumValues] = { - 0, 0x7f, 0x3fff, 0x1fffff, 0xffffff, 0x10000000 -}; - -const uint8_t kOutOfRangeLeb128Value[5] = { 0x80, 0x80, 0x80, 0x80, - 0x10 }; // UINT32_MAX + 1 -} // namespace - -TEST(AomLeb128, DecodeTest) { - const size_t num_leb128_bytes = 3; - const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 }; - const uint64_t expected_value = 0x98765; // 624485 - const size_t expected_length = 3; - uint64_t value = ~0ULL; // make sure value is cleared by the function - size_t length; - ASSERT_EQ( - aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value, &length), 0); - ASSERT_EQ(expected_value, value); - ASSERT_EQ(expected_length, length); - - // Make sure the decoder stops on the last marked LEB128 byte. - aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes + 1, &value, &length); - ASSERT_EQ(expected_value, value); - ASSERT_EQ(expected_length, length); -} - -TEST(AomLeb128, EncodeTest) { - const uint32_t test_value = 0x98765; // 624485 - const uint8_t expected_bytes[3] = { 0xE5, 0x8E, 0x26 }; - const size_t kWriteBufferSize = 4; - uint8_t write_buffer[kWriteBufferSize] = { 0 }; - size_t bytes_written = 0; - ASSERT_EQ(aom_uleb_encode(test_value, kWriteBufferSize, &write_buffer[0], - &bytes_written), - 0); - ASSERT_EQ(bytes_written, 3u); - for (size_t i = 0; i < bytes_written; ++i) { - ASSERT_EQ(write_buffer[i], expected_bytes[i]); - } -} - -TEST(AomLeb128, EncodeDecodeTest) { - const uint32_t value = 0x98765; // 624485 - const size_t kWriteBufferSize = 4; - uint8_t write_buffer[kWriteBufferSize] = { 0 }; - size_t bytes_written = 0; - ASSERT_EQ(aom_uleb_encode(value, kWriteBufferSize, &write_buffer[0], - &bytes_written), - 0); - ASSERT_EQ(bytes_written, 3u); - uint64_t decoded_value; - size_t decoded_length; - aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value, - &decoded_length); - ASSERT_EQ(value, decoded_value); - ASSERT_EQ(bytes_written, decoded_length); -} - -TEST(AomLeb128, FixedSizeEncodeTest) { - const uint32_t test_value = 0x123; - const uint8_t expected_bytes[4] = { 0xa3, 0x82, 0x80, 0x00 }; - const size_t kWriteBufferSize = 4; - uint8_t write_buffer[kWriteBufferSize] = { 0 }; - size_t bytes_written = 0; - ASSERT_EQ(0, aom_uleb_encode_fixed_size(test_value, kWriteBufferSize, - kWriteBufferSize, &write_buffer[0], - &bytes_written)); - ASSERT_EQ(kWriteBufferSize, bytes_written); - for (size_t i = 0; i < bytes_written; ++i) { - ASSERT_EQ(write_buffer[i], expected_bytes[i]); - } -} - -TEST(AomLeb128, FixedSizeEncodeDecodeTest) { - const uint32_t value = 0x1; - const size_t kWriteBufferSize = 4; - uint8_t write_buffer[kWriteBufferSize] = { 0 }; - size_t bytes_written = 0; - ASSERT_EQ( - aom_uleb_encode_fixed_size(value, kWriteBufferSize, kWriteBufferSize, - &write_buffer[0], &bytes_written), - 0); - ASSERT_EQ(bytes_written, 4u); - uint64_t decoded_value; - size_t decoded_length; - aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value, - &decoded_length); - ASSERT_EQ(value, decoded_value); - ASSERT_EQ(bytes_written, decoded_length); -} - -TEST(AomLeb128, SizeTest) { - for (size_t i = 0; i < kSizeTestNumValues; ++i) { - ASSERT_EQ(kSizeTestExpectedSizes[i], - aom_uleb_size_in_bytes(kSizeTestInputs[i])); - } -} - -TEST(AomLeb128, DecodeFailTest) { - // Input buffer containing what would be a valid 9 byte LEB128 encoded - // unsigned integer. - const uint8_t kAllPadBytesBuffer[kMaximumLeb128CodedSize + 1] = { - kLeb128PadByte, kLeb128PadByte, kLeb128PadByte, - kLeb128PadByte, kLeb128PadByte, kLeb128PadByte, - kLeb128PadByte, kLeb128PadByte, 0 - }; - uint64_t decoded_value; - - // Test that decode fails when result would be valid 9 byte integer. - ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize + 1, - &decoded_value, NULL), - -1); - - // Test that encoded value missing terminator byte within available buffer - // range causes decode error. - ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize, - &decoded_value, NULL), - -1); - - // Test that LEB128 input that decodes to a value larger than 32-bits fails. - size_t value_size = 0; - ASSERT_EQ(aom_uleb_decode(&kOutOfRangeLeb128Value[0], - sizeof(kOutOfRangeLeb128Value), &decoded_value, - &value_size), - -1); -} - -TEST(AomLeb128, EncodeFailTest) { - const size_t kWriteBufferSize = 4; - const uint32_t kValidTestValue = 1; - uint8_t write_buffer[kWriteBufferSize] = { 0 }; - size_t coded_size = 0; - ASSERT_EQ( - aom_uleb_encode(kValidTestValue, kWriteBufferSize, NULL, &coded_size), - -1); - ASSERT_EQ(aom_uleb_encode(kValidTestValue, kWriteBufferSize, &write_buffer[0], - NULL), - -1); - - const uint32_t kValueOutOfRangeForBuffer = 0xFFFFFFFF; - ASSERT_EQ(aom_uleb_encode(kValueOutOfRangeForBuffer, kWriteBufferSize, - &write_buffer[0], &coded_size), - -1); - - const uint64_t kValueOutOfRange = kMaximumLeb128Value + 1; - ASSERT_EQ(aom_uleb_encode(kValueOutOfRange, kWriteBufferSize, - &write_buffer[0], &coded_size), - -1); - - const size_t kPadSizeOutOfRange = 5; - ASSERT_EQ(aom_uleb_encode_fixed_size(kValidTestValue, kWriteBufferSize, - kPadSizeOutOfRange, &write_buffer[0], - &coded_size), - -1); -} diff --git a/third_party/aom/test/aomcx_set_ref.sh b/third_party/aom/test/aomcx_set_ref.sh deleted file mode 100755 index f51b73c58..000000000 --- a/third_party/aom/test/aomcx_set_ref.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom aom_cx_set_ref example. To add new tests to this -## file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to aom_cx_set_ref_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: $YUV_RAW_INPUT is required. -aom_cx_set_ref_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi -} - -# Runs aom_cx_set_ref and updates the reference frame before encoding frame 90. -# $1 is the codec name, which aom_cx_set_ref does not support at present: It's -# currently used only to name the output file. -# TODO(tomfinegan): Pass the codec param once the example is updated to support -# AV1. -aom_set_ref() { - local encoder="${LIBAOM_BIN_PATH}/aom_cx_set_ref${AOM_TEST_EXE_SUFFIX}" - local codec="$1" - local output_file="${AOM_TEST_OUTPUT_DIR}/aom_cx_set_ref_${codec}.ivf" - local ref_frame_num=4 - local limit=10 - if [ ! -x "${encoder}" ]; then - elog "${encoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ - "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" \ - "${ref_frame_num}" "${limit}" ${devnull} - - [ -e "${output_file}" ] || return 1 -} - -aom_cx_set_ref_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - aom_set_ref av1 || return 1 - fi -} - -aom_cx_set_ref_tests="aom_cx_set_ref_av1" - -run_tests aom_cx_set_ref_verify_environment "${aom_cx_set_ref_tests}" - diff --git a/third_party/aom/test/aomdec.sh b/third_party/aom/test/aomdec.sh deleted file mode 100755 index 927142287..000000000 --- a/third_party/aom/test/aomdec.sh +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests aomdec. To add new tests to this file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to aomdec_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: Make sure input is available. -aomdec_verify_environment() { - if [ "$(av1_encode_available)" != "yes" ] ; then - if [ ! -e "${AV1_IVF_FILE}" ] || \ - [ ! -e "${AV1_OBU_ANNEXB_FILE}" ] || \ - [ ! -e "${AV1_OBU_SEC5_FILE}" ] || \ - [ ! -e "${AV1_WEBM_FILE}" ]; then - elog "Libaom test data must exist before running this test script when " \ - " encoding is disabled. " - return 1 - fi - fi - if [ -z "$(aom_tool_path aomdec)" ]; then - elog "aomdec not found. It must exist in LIBAOM_BIN_PATH or its parent." - return 1 - fi -} - -# Wrapper function for running aomdec with pipe input. Requires that -# LIBAOM_BIN_PATH points to the directory containing aomdec. $1 is used as the -# input file path and shifted away. All remaining parameters are passed through -# to aomdec. -aomdec_pipe() { - local input="$1" - shift - if [ ! -e "${input}" ]; then - elog "Input file ($input) missing in aomdec_pipe()" - return 1 - fi - cat "${file}" | aomdec - "$@" ${devnull} -} - - -# Wrapper function for running aomdec. Requires that LIBAOM_BIN_PATH points to -# the directory containing aomdec. $1 one is used as the input file path and -# shifted away. All remaining parameters are passed through to aomdec. -aomdec() { - local decoder="$(aom_tool_path aomdec)" - local input="$1" - shift - eval "${AOM_TEST_PREFIX}" "${decoder}" "$input" "$@" ${devnull} -} - -aomdec_can_decode_av1() { - if [ "$(av1_decode_available)" = "yes" ]; then - echo yes - fi -} - -aomdec_av1_ivf() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="${AV1_IVF_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --ivf - fi - aomdec "${AV1_IVF_FILE}" --summary --noblit - fi -} - -aomdec_av1_ivf_error_resilient() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="av1.error-resilient.ivf" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --ivf --error-resilient=1 - fi - aomdec "${file}" --summary --noblit - fi -} - -aomdec_av1_ivf_multithread() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="${AV1_IVF_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --ivf - fi - for threads in 2 3 4 5 6 7 8; do - aomdec "${file}" --summary --noblit --threads=$threads - done - fi -} - -aomdec_aom_ivf_pipe_input() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="${AV1_IVF_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --ivf - fi - aomdec_pipe "${AV1_IVF_FILE}" --summary --noblit - fi -} - -aomdec_av1_obu_annexb() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="${AV1_OBU_ANNEXB_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --obu --annexb=1 - fi - aomdec "${file}" --summary --noblit --annexb - fi -} - -aomdec_av1_obu_section5() { - if [ "$(aomdec_can_decode_av1)" = "yes" ]; then - local file="${AV1_OBU_SEC5_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" --obu - fi - aomdec "${file}" --summary --noblit - fi -} - -aomdec_av1_webm() { - if [ "$(aomdec_can_decode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - local file="${AV1_WEBM_FILE}" - if [ ! -e "${file}" ]; then - encode_yuv_raw_input_av1 "${file}" - fi - aomdec "${AV1_WEBM_FILE}" --summary --noblit - fi -} - -aomdec_tests="aomdec_av1_ivf - aomdec_av1_ivf_error_resilient - aomdec_av1_ivf_multithread - aomdec_aom_ivf_pipe_input - aomdec_av1_obu_annexb - aomdec_av1_obu_section5 - aomdec_av1_webm" - -run_tests aomdec_verify_environment "${aomdec_tests}" diff --git a/third_party/aom/test/aomenc.sh b/third_party/aom/test/aomenc.sh deleted file mode 100755 index b030397a3..000000000 --- a/third_party/aom/test/aomenc.sh +++ /dev/null @@ -1,269 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests aomenc using hantro_collage_w352h288.yuv as input. To add -## new tests to this file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to aomenc_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: Make sure input is available. -aomenc_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - elog "The file ${YUV_RAW_INPUT##*/} must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - if [ ! -e "${Y4M_NOSQ_PAR_INPUT}" ]; then - elog "The file ${Y4M_NOSQ_PAR_INPUT##*/} must exist in" - elog "LIBAOM_TEST_DATA_PATH." - return 1 - fi - fi - if [ -z "$(aom_tool_path aomenc)" ]; then - elog "aomenc not found. It must exist in LIBAOM_BIN_PATH or its parent." - return 1 - fi -} - -aomenc_can_encode_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - echo yes - fi -} - -aomenc_can_encode_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - echo yes - fi -} - -# Utilities that echo aomenc input file parameters. -y4m_input_non_square_par() { - echo ""${Y4M_NOSQ_PAR_INPUT}"" -} - -y4m_input_720p() { - echo ""${Y4M_720P_INPUT}"" -} - -# Wrapper function for running aomenc with pipe input. Requires that -# LIBAOM_BIN_PATH points to the directory containing aomenc. $1 is used as the -# input file path and shifted away. All remaining parameters are passed through -# to aomenc. -aomenc_pipe() { - local encoder="$(aom_tool_path aomenc)" - local input="$1" - shift - cat "${input}" | eval "${AOM_TEST_PREFIX}" "${encoder}" - \ - --test-decode=fatal \ - "$@" ${devnull} -} - -# Wrapper function for running aomenc. Requires that LIBAOM_BIN_PATH points to -# the directory containing aomenc. $1 one is used as the input file path and -# shifted away. All remaining parameters are passed through to aomenc. -aomenc() { - local encoder="$(aom_tool_path aomenc)" - local input="$1" - shift - eval "${AOM_TEST_PREFIX}" "${encoder}" "${input}" \ - --test-decode=fatal \ - "$@" ${devnull} -} - -aomenc_av1_ivf() { - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - local output="${AV1_IVF_FILE}" - if [ -e "${AV1_IVF_FILE}" ]; then - output="${AOM_TEST_OUTPUT_DIR}/av1_test.ivf" - fi - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --ivf \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_obu_annexb() { - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - local output="${AV1_OBU_ANNEXB_FILE}" - if [ -e "${AV1_OBU_ANNEXB_FILE}" ]; then - output="${AOM_TEST_OUTPUT_DIR}/av1_test.annexb.obu" - fi - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --obu \ - --annexb=1 \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_obu_section5() { - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - local output="${AV1_OBU_SEC5_FILE}" - if [ -e "${AV1_OBU_SEC5_FILE}" ]; then - output="${AOM_TEST_OUTPUT_DIR}/av1_test.section5.obu" - fi - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --obu \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_webm() { - if [ "$(aomenc_can_encode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - local output="${AV1_WEBM_FILE}" - if [ -e "${AV1_WEBM_FILE}" ]; then - output="${AOM_TEST_OUTPUT_DIR}/av1_test.webm" - fi - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_webm_1pass() { - if [ "$(aomenc_can_encode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - local output="${AOM_TEST_OUTPUT_DIR}/av1_test.webm" - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --passes=1 \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_ivf_lossless() { - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - local output="${AOM_TEST_OUTPUT_DIR}/av1_lossless.ivf" - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --ivf \ - --output="${output}" \ - --lossless=1 - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_ivf_minq0_maxq0() { - if [ "$(aomenc_can_encode_av1)" = "yes" ]; then - local output="${AOM_TEST_OUTPUT_DIR}/av1_lossless_minq0_maxq0.ivf" - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --ivf \ - --output="${output}" \ - --min-q=0 \ - --max-q=0 - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_webm_lag5_frames10() { - if [ "$(aomenc_can_encode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - local lag_total_frames=10 - local lag_frames=5 - local output="${AOM_TEST_OUTPUT_DIR}/av1_lag5_frames10.webm" - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --limit=${lag_total_frames} \ - --lag-in-frames=${lag_frames} \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -# TODO(fgalligan): Test that DisplayWidth is different than video width. -aomenc_av1_webm_non_square_par() { - if [ "$(aomenc_can_encode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - local output="${AOM_TEST_OUTPUT_DIR}/av1_non_square_par.webm" - aomenc $(y4m_input_non_square_par) \ - $(aomenc_encode_test_fast_params) \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -aomenc_av1_webm_cdf_update_mode() { - if [ "$(aomenc_can_encode_av1)" = "yes" ] && \ - [ "$(webm_io_available)" = "yes" ]; then - for mode in 0 1 2; do - local output="${AOM_TEST_OUTPUT_DIR}/cdf_mode_${mode}.webm" - aomenc $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --cdf-update-mode=${mode} \ - --output="${output}" - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - done - fi -} - -aomenc_tests="aomenc_av1_ivf - aomenc_av1_obu_annexb - aomenc_av1_obu_section5 - aomenc_av1_webm - aomenc_av1_webm_1pass - aomenc_av1_ivf_lossless - aomenc_av1_ivf_minq0_maxq0 - aomenc_av1_webm_lag5_frames10 - aomenc_av1_webm_non_square_par - aomenc_av1_webm_cdf_update_mode" - -run_tests aomenc_verify_environment "${aomenc_tests}" diff --git a/third_party/aom/test/aq_segment_test.cc b/third_party/aom/test/aq_segment_test.cc deleted file mode 100644 index bbb5027d4..000000000 --- a/third_party/aom/test/aq_segment_test.cc +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "config/aom_config.h" - -#include "third_party/googletest/src/googletest/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 AqSegmentTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - AqSegmentTest() : EncoderTest(GET_PARAM(0)) {} - virtual ~AqSegmentTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - set_cpu_used_ = GET_PARAM(2); - aq_mode_ = 0; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - encoder->Control(AV1E_SET_AQ_MODE, aq_mode_); - encoder->Control(AV1E_SET_DELTAQ_MODE, deltaq_mode_); - encoder->Control(AOME_SET_MAX_INTRA_BITRATE_PCT, 100); - } - } - - void DoTest(int aq_mode) { - aq_mode_ = aq_mode; - deltaq_mode_ = 0; - cfg_.kf_max_dist = 12; - cfg_.rc_min_quantizer = 8; - cfg_.rc_max_quantizer = 56; - cfg_.rc_end_usage = AOM_CBR; - cfg_.g_lag_in_frames = 6; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 500; - cfg_.rc_buf_sz = 1000; - cfg_.rc_target_bitrate = 300; - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, - 288, 30, 1, 0, 15); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } - - int set_cpu_used_; - int aq_mode_; - int deltaq_mode_; -}; - -// Validate that this AQ segmentation mode (AQ=1, variance_ap) -// encodes and decodes without a mismatch. -TEST_P(AqSegmentTest, TestNoMisMatchAQ1) { DoTest(1); } - -// Validate that this AQ segmentation mode (AQ=2, complexity_aq) -// encodes and decodes without a mismatch. -TEST_P(AqSegmentTest, TestNoMisMatchAQ2) { DoTest(2); } - -// Validate that this AQ segmentation mode (AQ=3, cyclic_refresh_aq) -// encodes and decodes without a mismatch. -TEST_P(AqSegmentTest, TestNoMisMatchAQ3) { DoTest(3); } - -class AqSegmentTestLarge : public AqSegmentTest {}; - -TEST_P(AqSegmentTestLarge, TestNoMisMatchAQ1) { DoTest(1); } - -TEST_P(AqSegmentTestLarge, TestNoMisMatchAQ2) { DoTest(2); } - -TEST_P(AqSegmentTestLarge, TestNoMisMatchAQ3) { DoTest(3); } - -// Validate that this delta q mode -// encodes and decodes without a mismatch. -TEST_P(AqSegmentTest, TestNoMisMatchExtDeltaQ) { - cfg_.rc_end_usage = AOM_CQ; - aq_mode_ = 0; - deltaq_mode_ = 2; - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 15); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -AV1_INSTANTIATE_TEST_CASE(AqSegmentTest, - ::testing::Values(::libaom_test::kRealTime, - ::libaom_test::kOnePassGood), - ::testing::Range(5, 9)); -AV1_INSTANTIATE_TEST_CASE(AqSegmentTestLarge, - ::testing::Values(::libaom_test::kRealTime, - ::libaom_test::kOnePassGood), - ::testing::Range(3, 5)); -} // namespace diff --git a/third_party/aom/test/arf_freq_test.cc b/third_party/aom/test/arf_freq_test.cc deleted file mode 100644 index 083f4022f..000000000 --- a/third_party/aom/test/arf_freq_test.cc +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/util.h" -#include "test/y4m_video_source.h" -#include "test/yuv_video_source.h" -#include "av1/encoder/ratectrl.h" - -namespace { - -const unsigned int kFrames = 100; -const int kBitrate = 500; - -#define ARF_NOT_SEEN 1000001 -#define ARF_SEEN_ONCE 1000000 - -typedef struct { - const char *filename; - unsigned int width; - unsigned int height; - unsigned int framerate_num; - unsigned int framerate_den; - unsigned int input_bit_depth; - aom_img_fmt fmt; - aom_bit_depth_t bit_depth; - unsigned int profile; -} TestVideoParam; - -typedef struct { - libaom_test::TestMode mode; - int cpu_used; -} TestEncodeParam; - -const TestVideoParam kTestVectors[] = { - // artificially increase framerate to trigger default check - { "hantro_collage_w352h288.yuv", 352, 288, 5000, 1, 8, AOM_IMG_FMT_I420, - AOM_BITS_8, 0 }, - { "hantro_collage_w352h288.yuv", 352, 288, 30, 1, 8, AOM_IMG_FMT_I420, - AOM_BITS_8, 0 }, - { "rush_hour_444.y4m", 352, 288, 30, 1, 8, AOM_IMG_FMT_I444, AOM_BITS_8, 1 }, - // Add list of profile 2/3 test videos here ... -}; - -const TestEncodeParam kEncodeVectors[] = { - { ::libaom_test::kOnePassGood, 2 }, { ::libaom_test::kOnePassGood, 5 }, - { ::libaom_test::kTwoPassGood, 1 }, { ::libaom_test::kTwoPassGood, 2 }, - { ::libaom_test::kTwoPassGood, 5 }, { ::libaom_test::kRealTime, 5 }, -}; - -const int kMinArfVectors[] = { - // NOTE: 0 refers to the default built-in logic in: - // av1_rc_get_default_min_gf_interval(...) - 0, 4, 8, 12, 15 -}; - -int is_extension_y4m(const char *filename) { - const char *dot = strrchr(filename, '.'); - if (!dot || dot == filename) - return 0; - else - return !strcmp(dot, ".y4m"); -} - -class ArfFreqTestLarge - : public ::libaom_test::CodecTestWith3Params<TestVideoParam, - TestEncodeParam, int>, - public ::libaom_test::EncoderTest { - protected: - ArfFreqTestLarge() - : EncoderTest(GET_PARAM(0)), test_video_param_(GET_PARAM(1)), - test_encode_param_(GET_PARAM(2)), min_arf_requested_(GET_PARAM(3)) {} - - virtual ~ArfFreqTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(test_encode_param_.mode); - if (test_encode_param_.mode != ::libaom_test::kRealTime) { - cfg_.g_lag_in_frames = 25; - cfg_.rc_end_usage = AOM_VBR; - } else { - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_CBR; - cfg_.rc_buf_sz = 1000; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - } - } - - virtual void BeginPassHook(unsigned int) { - min_run_ = ARF_NOT_SEEN; - run_of_visible_frames_ = 0; - } - - int GetNumFramesInPkt(const aom_codec_cx_pkt_t *pkt) { - const uint8_t *buffer = reinterpret_cast<uint8_t *>(pkt->data.frame.buf); - const uint8_t marker = buffer[pkt->data.frame.sz - 1]; - const int mag = ((marker >> 3) & 3) + 1; - int frames = (marker & 0x7) + 1; - const unsigned int index_sz = 2 + mag * frames; - // Check for superframe or not. - // Assume superframe has only one visible frame, the rest being - // invisible. If superframe index is not found, then there is only - // one frame. - if (!((marker & 0xe0) == 0xc0 && pkt->data.frame.sz >= index_sz && - buffer[pkt->data.frame.sz - index_sz] == marker)) { - frames = 1; - } - return frames; - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - if (pkt->kind != AOM_CODEC_CX_FRAME_PKT) return; - const int frames = GetNumFramesInPkt(pkt); - if (frames == 1) { - run_of_visible_frames_++; - } else if (frames == 2) { - if (min_run_ == ARF_NOT_SEEN) { - min_run_ = ARF_SEEN_ONCE; - } else if (min_run_ == ARF_SEEN_ONCE || - run_of_visible_frames_ < min_run_) { - min_run_ = run_of_visible_frames_; - } - run_of_visible_frames_ = 1; - } else { - min_run_ = 0; - run_of_visible_frames_ = 1; - } - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AV1E_SET_TILE_COLUMNS, 4); - encoder->Control(AOME_SET_CPUUSED, test_encode_param_.cpu_used); - encoder->Control(AV1E_SET_MIN_GF_INTERVAL, min_arf_requested_); - if (test_encode_param_.mode != ::libaom_test::kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - } - - int GetMinVisibleRun() const { return min_run_; } - - int GetMinArfDistanceRequested() const { - if (min_arf_requested_) - return min_arf_requested_; - else - return av1_rc_get_default_min_gf_interval( - test_video_param_.width, test_video_param_.height, - (double)test_video_param_.framerate_num / - test_video_param_.framerate_den); - } - - TestVideoParam test_video_param_; - TestEncodeParam test_encode_param_; - - private: - int min_arf_requested_; - int min_run_; - int run_of_visible_frames_; -}; - -TEST_P(ArfFreqTestLarge, MinArfFreqTest) { - cfg_.rc_target_bitrate = kBitrate; - cfg_.g_error_resilient = 0; - cfg_.g_profile = test_video_param_.profile; - cfg_.g_input_bit_depth = test_video_param_.input_bit_depth; - cfg_.g_bit_depth = test_video_param_.bit_depth; - init_flags_ = AOM_CODEC_USE_PSNR; - if (cfg_.g_bit_depth > 8) init_flags_ |= AOM_CODEC_USE_HIGHBITDEPTH; - - testing::internal::scoped_ptr<libaom_test::VideoSource> video; - if (is_extension_y4m(test_video_param_.filename)) { - video.reset(new libaom_test::Y4mVideoSource(test_video_param_.filename, 0, - kFrames)); - } else { - video.reset(new libaom_test::YUVVideoSource( - test_video_param_.filename, test_video_param_.fmt, - test_video_param_.width, test_video_param_.height, - test_video_param_.framerate_num, test_video_param_.framerate_den, 0, - kFrames)); - } - - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); - const int min_run = GetMinVisibleRun(); - const int min_arf_dist_requested = GetMinArfDistanceRequested(); - if (min_run != ARF_NOT_SEEN && min_run != ARF_SEEN_ONCE) { - const int min_arf_dist = min_run + 1; - EXPECT_GE(min_arf_dist, min_arf_dist_requested); - } -} - -#if CONFIG_AV1_ENCODER -// TODO(angiebird): 25-29 fail in high bitdepth mode. -// TODO(zoeliu): This ArfFreqTest does not work with BWDREF_FRAME, as -// BWDREF_FRAME is also a non-show frame, and the minimum run between two -// consecutive BWDREF_FRAME's may vary between 1 and any arbitrary positive -// number as long as it does not exceed the gf_group interval. -INSTANTIATE_TEST_CASE_P( - DISABLED_AV1, ArfFreqTestLarge, - ::testing::Combine( - ::testing::Values( - static_cast<const libaom_test::CodecFactory *>(&libaom_test::kAV1)), - ::testing::ValuesIn(kTestVectors), ::testing::ValuesIn(kEncodeVectors), - ::testing::ValuesIn(kMinArfVectors))); -#endif // CONFIG_AV1_ENCODER -} // namespace diff --git a/third_party/aom/test/av1_config_test.cc b/third_party/aom/test/av1_config_test.cc deleted file mode 100644 index e2f2c5390..000000000 --- a/third_party/aom/test/av1_config_test.cc +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include <string.h> - -#include "common/av1_config.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -// -// Input buffers containing exactly one Sequence Header OBU. -// -// Each buffer is named according to the OBU storage format (Annex-B vs Low -// Overhead Bitstream Format) and the type of Sequence Header OBU ("Full" -// Sequence Header OBUs vs Sequence Header OBUs with the -// reduced_still_image_flag set). -// -const uint8_t kAnnexBFullSequenceHeaderObu[] = { - 0x0c, 0x08, 0x00, 0x00, 0x00, 0x04, 0x45, 0x7e, 0x3e, 0xff, 0xfc, 0xc0, 0x20 -}; -const uint8_t kAnnexBReducedStillImageSequenceHeaderObu[] = { - 0x08, 0x08, 0x18, 0x22, 0x2b, 0xf1, 0xfe, 0xc0, 0x20 -}; - -const uint8_t kLobfFullSequenceHeaderObu[] = { - 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x45, 0x7e, 0x3e, 0xff, 0xfc, 0xc0, 0x20 -}; - -const uint8_t kLobfReducedStillImageSequenceHeaderObu[] = { - 0x0a, 0x07, 0x18, 0x22, 0x2b, 0xf1, 0xfe, 0xc0, 0x20 -}; - -const uint8_t kAv1cAllZero[] = { 0, 0, 0, 0 }; - -// The size of AV1 config when no configOBUs are present at the end of the -// configuration structure. -const size_t kAv1cNoConfigObusSize = 4; - -bool VerifyAv1c(const uint8_t *const obu_buffer, size_t obu_buffer_length, - bool is_annexb) { - Av1Config av1_config; - memset(&av1_config, 0, sizeof(av1_config)); - bool parse_ok = get_av1config_from_obu(obu_buffer, obu_buffer_length, - is_annexb, &av1_config) == 0; - if (parse_ok) { - EXPECT_EQ(1, av1_config.marker); - EXPECT_EQ(1, av1_config.version); - EXPECT_EQ(0, av1_config.seq_profile); - EXPECT_EQ(0, av1_config.seq_level_idx_0); - EXPECT_EQ(0, av1_config.seq_tier_0); - EXPECT_EQ(0, av1_config.high_bitdepth); - EXPECT_EQ(0, av1_config.twelve_bit); - EXPECT_EQ(0, av1_config.monochrome); - EXPECT_EQ(1, av1_config.chroma_subsampling_x); - EXPECT_EQ(1, av1_config.chroma_subsampling_y); - EXPECT_EQ(0, av1_config.chroma_sample_position); - EXPECT_EQ(0, av1_config.initial_presentation_delay_present); - EXPECT_EQ(0, av1_config.initial_presentation_delay_minus_one); - } - return parse_ok && ::testing::Test::HasFailure() == false; -} - -TEST(Av1Config, ObuInvalidInputs) { - Av1Config av1_config; - memset(&av1_config, 0, sizeof(av1_config)); - ASSERT_EQ(-1, get_av1config_from_obu(NULL, 0, 0, NULL)); - ASSERT_EQ(-1, - get_av1config_from_obu(&kLobfFullSequenceHeaderObu[0], 0, 0, NULL)); - ASSERT_EQ( - -1, get_av1config_from_obu(&kLobfFullSequenceHeaderObu[0], - sizeof(kLobfFullSequenceHeaderObu), 0, NULL)); - ASSERT_EQ(-1, get_av1config_from_obu(NULL, sizeof(kLobfFullSequenceHeaderObu), - 0, NULL)); - ASSERT_EQ(-1, get_av1config_from_obu(&kLobfFullSequenceHeaderObu[0], 0, 0, - &av1_config)); -} - -TEST(Av1Config, ReadInvalidInputs) { - Av1Config av1_config; - memset(&av1_config, 0, sizeof(av1_config)); - size_t bytes_read = 0; - ASSERT_EQ(-1, read_av1config(NULL, 0, NULL, NULL)); - ASSERT_EQ(-1, read_av1config(NULL, 4, NULL, NULL)); - ASSERT_EQ(-1, read_av1config(&kAv1cAllZero[0], 0, NULL, NULL)); - ASSERT_EQ(-1, read_av1config(&kAv1cAllZero[0], 4, &bytes_read, NULL)); - ASSERT_EQ(-1, read_av1config(NULL, 4, &bytes_read, &av1_config)); -} - -TEST(Av1Config, WriteInvalidInputs) { - Av1Config av1_config; - memset(&av1_config, 0, sizeof(av1_config)); - size_t bytes_written = 0; - uint8_t av1c_buffer[4] = { 0 }; - ASSERT_EQ(-1, write_av1config(NULL, 0, NULL, NULL)); - ASSERT_EQ(-1, write_av1config(&av1_config, 0, NULL, NULL)); - ASSERT_EQ(-1, write_av1config(&av1_config, 0, &bytes_written, NULL)); - - ASSERT_EQ(-1, - write_av1config(&av1_config, 0, &bytes_written, &av1c_buffer[0])); - ASSERT_EQ(-1, write_av1config(&av1_config, 4, &bytes_written, NULL)); -} - -TEST(Av1Config, GetAv1ConfigFromLobfObu) { - // Test parsing of a Sequence Header OBU with the reduced_still_picture_header - // unset-- aka a full Sequence Header OBU. - ASSERT_TRUE(VerifyAv1c(kLobfFullSequenceHeaderObu, - sizeof(kLobfFullSequenceHeaderObu), false)); - - // Test parsing of a reduced still image Sequence Header OBU. - ASSERT_TRUE(VerifyAv1c(kLobfReducedStillImageSequenceHeaderObu, - sizeof(kLobfReducedStillImageSequenceHeaderObu), - false)); -} - -TEST(Av1Config, GetAv1ConfigFromAnnexBObu) { - // Test parsing of a Sequence Header OBU with the reduced_still_picture_header - // unset-- aka a full Sequence Header OBU. - ASSERT_TRUE(VerifyAv1c(kAnnexBFullSequenceHeaderObu, - sizeof(kAnnexBFullSequenceHeaderObu), true)); - - // Test parsing of a reduced still image Sequence Header OBU. - ASSERT_TRUE(VerifyAv1c(kAnnexBReducedStillImageSequenceHeaderObu, - sizeof(kAnnexBReducedStillImageSequenceHeaderObu), - true)); -} - -TEST(Av1Config, ReadWriteConfig) { - Av1Config av1_config; - memset(&av1_config, 0, sizeof(av1_config)); - - // Test writing out the AV1 config. - size_t bytes_written = 0; - uint8_t av1c_buffer[4] = { 0 }; - ASSERT_EQ(0, write_av1config(&av1_config, sizeof(av1c_buffer), &bytes_written, - &av1c_buffer[0])); - ASSERT_EQ(kAv1cNoConfigObusSize, bytes_written); - for (size_t i = 0; i < kAv1cNoConfigObusSize; ++i) { - ASSERT_EQ(kAv1cAllZero[i], av1c_buffer[i]) - << "Mismatch in output Av1Config at offset=" << i; - } - - // Test reading the AV1 config. - size_t bytes_read = 0; - ASSERT_EQ(0, read_av1config(&kAv1cAllZero[0], sizeof(kAv1cAllZero), - &bytes_read, &av1_config)); - ASSERT_EQ(kAv1cNoConfigObusSize, bytes_read); - ASSERT_EQ(0, write_av1config(&av1_config, sizeof(av1c_buffer), &bytes_written, - &av1c_buffer[0])); - for (size_t i = 0; i < kAv1cNoConfigObusSize; ++i) { - ASSERT_EQ(kAv1cAllZero[i], av1c_buffer[i]) - << "Mismatch in output Av1Config at offset=" << i; - } -} - -} // namespace diff --git a/third_party/aom/test/av1_convolve_2d_test.cc b/third_party/aom/test/av1_convolve_2d_test.cc deleted file mode 100644 index 03286260e..000000000 --- a/third_party/aom/test/av1_convolve_2d_test.cc +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/av1_convolve_2d_test_util.h" - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; -using libaom_test::AV1Convolve2D::AV1Convolve2DSrTest; -using libaom_test::AV1Convolve2D::AV1JntConvolve2DTest; -using libaom_test::AV1HighbdConvolve2D::AV1HighbdConvolve2DSrTest; -using libaom_test::AV1HighbdConvolve2D::AV1HighbdJntConvolve2DTest; -namespace { - -TEST_P(AV1Convolve2DSrTest, DISABLED_Speed) { RunSpeedTest(GET_PARAM(0)); } - -TEST_P(AV1Convolve2DSrTest, CheckOutput) { RunCheckOutput(GET_PARAM(0)); } - -INSTANTIATE_TEST_CASE_P( - C_COPY, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_2d_copy_sr_c, 0, 0)); -INSTANTIATE_TEST_CASE_P( - C_X, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_x_sr_c, 1, 0)); -INSTANTIATE_TEST_CASE_P( - C_Y, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_y_sr_c, 0, 1)); -INSTANTIATE_TEST_CASE_P( - C, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_2d_sr_c, 1, 1)); -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2_COPY, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_convolve_2d_copy_sr_sse2, 0, 0)); -INSTANTIATE_TEST_CASE_P( - SSE2_X, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_x_sr_sse2, 1, 0)); -INSTANTIATE_TEST_CASE_P( - SSE2_Y, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_y_sr_sse2, 0, 1)); -INSTANTIATE_TEST_CASE_P( - SSE2, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_2d_sr_sse2, 1, 1)); -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2_COPY, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_convolve_2d_copy_sr_avx2, 0, 0)); -INSTANTIATE_TEST_CASE_P( - AVX2_X, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_x_sr_avx2, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - AVX2_Y, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_y_sr_avx2, 0, 1)); - -INSTANTIATE_TEST_CASE_P( - AVX2, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_2d_sr_avx2, 1, 1)); -#endif // HAVE_AVX2 -#endif // HAVE_SSE2 - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON_X, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_x_sr_neon, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - NEON_Y, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_y_sr_neon, 0, 1)); - -INSTANTIATE_TEST_CASE_P( - NEON, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams(av1_convolve_2d_sr_neon, 1, 1)); - -INSTANTIATE_TEST_CASE_P(NEON_COPY, AV1Convolve2DSrTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_convolve_2d_copy_sr_neon, 0, 0)); -#endif // HAVE_NEON - -TEST_P(AV1JntConvolve2DTest, CheckOutput) { RunCheckOutput(GET_PARAM(0)); } -TEST_P(AV1JntConvolve2DTest, DISABLED_Speed) { RunSpeedTest(GET_PARAM(0)); } - -INSTANTIATE_TEST_CASE_P( - C_COPY, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_2d_copy_c, 0, 0)); - -INSTANTIATE_TEST_CASE_P( - C_X, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_x_c, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - C_Y, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_y_c, 0, 1)); - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2_COPY, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_jnt_convolve_2d_copy_sse2, 0, 0)); -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE2_X, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_x_sse2, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - SSE2_Y, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_y_sse2, 0, 1)); - -INSTANTIATE_TEST_CASE_P( - SSSE3, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_2d_ssse3, 1, 1)); - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2_COPY, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_jnt_convolve_2d_copy_avx2, 0, 0)); -INSTANTIATE_TEST_CASE_P( - AVX2_X, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_x_avx2, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - AVX2_Y, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_y_avx2, 0, 1)); - -INSTANTIATE_TEST_CASE_P( - AVX2, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_2d_avx2, 1, 1)); -#endif // HAVE_AVX2 -#endif // HAVE_SSE4_1 -#endif // HAVE_SSE2 -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON_COPY, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams( - av1_jnt_convolve_2d_copy_neon, 0, 0)); - -INSTANTIATE_TEST_CASE_P( - NEON, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_2d_neon, 1, 1)); -INSTANTIATE_TEST_CASE_P( - NEON_X, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_x_neon, 1, 0)); - -INSTANTIATE_TEST_CASE_P( - NEON_Y, AV1JntConvolve2DTest, - libaom_test::AV1Convolve2D::BuildParams(av1_jnt_convolve_y_neon, 0, 1)); -#endif // HAVE_NEON - -TEST_P(AV1HighbdConvolve2DSrTest, CheckOutput) { RunCheckOutput(GET_PARAM(1)); } -TEST_P(AV1HighbdConvolve2DSrTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(1)); -} - -INSTANTIATE_TEST_CASE_P(C_X, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_x_sr_c, 1, 0)); - -INSTANTIATE_TEST_CASE_P(C_Y, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_y_sr_c, 0, 1)); - -INSTANTIATE_TEST_CASE_P(C_COPY, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_2d_copy_sr_c, 0, 0)); -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2_COPY, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_2d_copy_sr_sse2, 0, 0)); -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P(SSSE3, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_2d_sr_ssse3, 1, 1)); -INSTANTIATE_TEST_CASE_P(SSSE3_X, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_x_sr_ssse3, 1, 0)); -INSTANTIATE_TEST_CASE_P(SSSE3_Y, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_y_sr_ssse3, 0, 1)); -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_2d_sr_avx2, 1, 1)); -INSTANTIATE_TEST_CASE_P(AVX2_X, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_x_sr_avx2, 1, 0)); -INSTANTIATE_TEST_CASE_P(AVX2_Y, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_y_sr_avx2, 0, 1)); -INSTANTIATE_TEST_CASE_P(AVX2_COPY, AV1HighbdConvolve2DSrTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_convolve_2d_copy_sr_avx2, 0, 0)); -#endif // HAVE_AVX2 -#endif // HAVE_SSSE3 -#endif // HAVE_SSE2 -TEST_P(AV1HighbdJntConvolve2DTest, CheckOutput) { - RunCheckOutput(GET_PARAM(1)); -} - -TEST_P(AV1HighbdJntConvolve2DTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(1)); -} - -INSTANTIATE_TEST_CASE_P(C_X, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_x_c, 1, 0)); - -INSTANTIATE_TEST_CASE_P(C_Y, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_y_c, 0, 1)); - -INSTANTIATE_TEST_CASE_P(C_COPY, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_2d_copy_c, 0, 0)); -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1_COPY, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_2d_copy_sse4_1, 0, 0)); -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_2d_sse4_1, 1, 1)); -INSTANTIATE_TEST_CASE_P(SSE4_1_X, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_x_sse4_1, 1, 0)); -INSTANTIATE_TEST_CASE_P(SSE4_1_Y, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_y_sse4_1, 0, 1)); -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2_COPY, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_2d_copy_avx2, 0, 0)); -INSTANTIATE_TEST_CASE_P(AVX2, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_2d_avx2, 1, 1)); -INSTANTIATE_TEST_CASE_P(AVX2_X, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_x_avx2, 1, 0)); -INSTANTIATE_TEST_CASE_P(AVX2_Y, AV1HighbdJntConvolve2DTest, - libaom_test::AV1HighbdConvolve2D::BuildParams( - av1_highbd_jnt_convolve_y_avx2, 0, 1)); -#endif // HAVE_AVX2 -#endif // HAVE_SSE4_1 -} // namespace diff --git a/third_party/aom/test/av1_convolve_2d_test_util.cc b/third_party/aom/test/av1_convolve_2d_test_util.cc deleted file mode 100644 index 409fd23e1..000000000 --- a/third_party/aom/test/av1_convolve_2d_test_util.cc +++ /dev/null @@ -1,705 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "test/av1_convolve_2d_test_util.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/common_data.h" -#include "av1/common/convolve.h" - -using ::testing::make_tuple; -using ::testing::tuple; - -namespace libaom_test { - -const int kMaxSize = 128 + 32; // padding -namespace AV1Convolve2D { - -::testing::internal::ParamGenerator<Convolve2DParam> BuildParams( - convolve_2d_func filter, int has_subx, int has_suby) { - return ::testing::Combine(::testing::Values(filter), - ::testing::Values(has_subx), - ::testing::Values(has_suby), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -AV1Convolve2DSrTest::~AV1Convolve2DSrTest() {} -void AV1Convolve2DSrTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1Convolve2DSrTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1Convolve2DSrTest::RunCheckOutput(convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int has_subx = GET_PARAM(1); - const int has_suby = GET_PARAM(2); - const int block_idx = GET_PARAM(3); - int hfilter, vfilter, subx, suby; - uint8_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, uint8_t, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, output2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - for (int i = 0; i < MAX_SB_SQUARE; ++i) - output[i] = output2[i] = rnd_.Rand31(); - - // Make sure that sizes 2xN and Nx2 are also tested for chroma. - const int num_sizes = - (block_size_wide[block_idx] == 4 || block_size_high[block_idx] == 4) ? 2 - : 1; - for (int shift = 0; shift < num_sizes; ++shift) { // luma and chroma - const int out_w = block_size_wide[block_idx] >> shift; - const int out_h = block_size_high[block_idx] >> shift; - for (hfilter = EIGHTTAP_REGULAR; hfilter < INTERP_FILTERS_ALL; ++hfilter) { - for (vfilter = EIGHTTAP_REGULAR; vfilter < INTERP_FILTERS_ALL; - ++vfilter) { - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - for (int do_average = 0; do_average < 1; ++do_average) { - ConvolveParams conv_params1 = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, 8); - ConvolveParams conv_params2 = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, 8); - - const int subx_range = has_subx ? 16 : 1; - const int suby_range = has_suby ? 16 : 1; - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_convolve_2d_sr_c(input + offset_r * w + offset_c, w, output, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params1); - test_impl(input + offset_r * w + offset_c, w, output2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2); - - if (memcmp(output, output2, sizeof(output))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output[idx], output2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - } - } - } - } - } - } - } -} - -void AV1Convolve2DSrTest::RunSpeedTest(convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int has_subx = GET_PARAM(1); - const int has_suby = GET_PARAM(2); - const int block_idx = GET_PARAM(3); - - uint8_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, uint8_t, output[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - - int hfilter = EIGHTTAP_REGULAR, vfilter = EIGHTTAP_REGULAR; - int subx = 0, suby = 0; - - const int do_average = 0; - ConvolveParams conv_params2 = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, 8); - - // Make sure that sizes 2xN and Nx2 are also tested for chroma. - const int num_sizes = - (block_size_wide[block_idx] == 4 || block_size_high[block_idx] == 4) ? 2 - : 1; - for (int shift = 0; shift < num_sizes; ++shift) { // luma and chroma - const int out_w = block_size_wide[block_idx] >> shift; - const int out_h = block_size_high[block_idx] >> shift; - const int num_loops = 1000000000 / (out_w + out_h); - - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - test_impl(input, w, output, MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("%d,%d convolve %3dx%-3d: %7.2f us\n", has_subx, has_suby, out_w, - out_h, 1000.0 * elapsed_time / num_loops); - } -} - -AV1JntConvolve2DTest::~AV1JntConvolve2DTest() {} -void AV1JntConvolve2DTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1JntConvolve2DTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1JntConvolve2DTest::RunCheckOutput(convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int has_subx = GET_PARAM(1); - const int has_suby = GET_PARAM(2); - const int block_idx = GET_PARAM(3); - int hfilter, vfilter, subx, suby; - uint8_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output2[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, output8_1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, output8_2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - output1[i] = output2[i] = rnd_.Rand16(); - output8_1[i] = output8_2[i] = rnd_.Rand8(); - } - - const int out_w = block_size_wide[block_idx]; - const int out_h = block_size_high[block_idx]; - for (hfilter = EIGHTTAP_REGULAR; hfilter < INTERP_FILTERS_ALL; ++hfilter) { - for (vfilter = EIGHTTAP_REGULAR; vfilter < INTERP_FILTERS_ALL; ++vfilter) { - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - for (int do_average = 0; do_average <= 1; ++do_average) { - ConvolveParams conv_params1 = - get_conv_params_no_round(do_average, 0, output1, MAX_SB_SIZE, 1, 8); - ConvolveParams conv_params2 = - get_conv_params_no_round(do_average, 0, output2, MAX_SB_SIZE, 1, 8); - - // Test special case where jnt_comp_avg is not used - conv_params1.use_jnt_comp_avg = 0; - conv_params2.use_jnt_comp_avg = 0; - - const int subx_range = has_subx ? 16 : 1; - const int suby_range = has_suby ? 16 : 1; - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_jnt_convolve_2d_c(input + offset_r * w + offset_c, w, output8_1, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params1); - test_impl(input + offset_r * w + offset_c, w, output8_2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2); - - for (int i = 0; i < out_h; ++i) { - for (int j = 0; j < out_w; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output1[idx], output2[idx]) - << "Mismatch at unit tests for av1_jnt_convolve_2d\n" - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx << ")"; - } - } - - if (memcmp(output8_1, output8_2, sizeof(output8_1))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output8_1[idx], output8_2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - } - } - } - - // Test different combination of fwd and bck offset weights - for (int k = 0; k < 2; ++k) { - for (int l = 0; l < 4; ++l) { - conv_params1.use_jnt_comp_avg = 1; - conv_params2.use_jnt_comp_avg = 1; - conv_params1.fwd_offset = quant_dist_lookup_table[k][l][0]; - conv_params1.bck_offset = quant_dist_lookup_table[k][l][1]; - conv_params2.fwd_offset = quant_dist_lookup_table[k][l][0]; - conv_params2.bck_offset = quant_dist_lookup_table[k][l][1]; - - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_jnt_convolve_2d_c(input + offset_r * w + offset_c, w, - output8_1, MAX_SB_SIZE, out_w, out_h, - filter_params_x, filter_params_y, subx, - suby, &conv_params1); - test_impl(input + offset_r * w + offset_c, w, output8_2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2); - - for (int i = 0; i < out_h; ++i) { - for (int j = 0; j < out_w; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output1[idx], output2[idx]) - << "Mismatch at unit tests for " - "av1_jnt_convolve_2d\n" - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - if (memcmp(output8_1, output8_2, sizeof(output8_1))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output8_1[idx], output8_2[idx]) - << out_w << "x" << out_h - << " Pixel mismatch at index " << idx << " = (" << i - << ", " << j << "), sub pixel offset = (" << suby - << ", " << subx << ")"; - } - } - } - } - } - } - } - } - } - } -} - -void AV1JntConvolve2DTest::RunSpeedTest(convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int has_subx = GET_PARAM(1); - const int has_suby = GET_PARAM(2); - const int block_idx = GET_PARAM(3); - - int subx = 0, suby = 0; - uint8_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, output8[MAX_SB_SQUARE]); - int hfilter = EIGHTTAP_REGULAR, vfilter = EIGHTTAP_REGULAR; - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - output[i] = rnd_.Rand16(); - output8[i] = rnd_.Rand8(); - } - - const int out_w = block_size_wide[block_idx]; - const int out_h = block_size_high[block_idx]; - const int num_loops = 1000000000 / (out_w + out_h); - const int do_average = 0; - - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - - ConvolveParams conv_params = - get_conv_params_no_round(do_average, 0, output, MAX_SB_SIZE, 1, 8); - - conv_params.use_jnt_comp_avg = 0; - - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - test_impl(input + offset_r * w + offset_c, w, output8, MAX_SB_SIZE, out_w, - out_h, filter_params_x, filter_params_y, subx, suby, - &conv_params); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("%d,%d convolve %3dx%-3d: %7.2f us\n", has_subx, has_suby, out_w, - out_h, 1000.0 * elapsed_time / num_loops); -} -} // namespace AV1Convolve2D - -namespace AV1HighbdConvolve2D { -::testing::internal::ParamGenerator<HighbdConvolve2DParam> BuildParams( - highbd_convolve_2d_func filter, int has_subx, int has_suby) { - return ::testing::Combine( - ::testing::Range(8, 13, 2), ::testing::Values(filter), - ::testing::Values(has_subx), ::testing::Values(has_suby), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -AV1HighbdConvolve2DSrTest::~AV1HighbdConvolve2DSrTest() {} -void AV1HighbdConvolve2DSrTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1HighbdConvolve2DSrTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1HighbdConvolve2DSrTest::RunSpeedTest( - highbd_convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int bd = GET_PARAM(0); - const int has_subx = GET_PARAM(2); - const int has_suby = GET_PARAM(3); - const int block_idx = GET_PARAM(4); - int hfilter, vfilter, subx, suby; - uint16_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, uint16_t, output[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) - input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - - hfilter = EIGHTTAP_REGULAR; - vfilter = EIGHTTAP_REGULAR; - int do_average = 0; - - const int offset_r = 3; - const int offset_c = 3; - subx = 0; - suby = 0; - - ConvolveParams conv_params = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, bd); - - // Make sure that sizes 2xN and Nx2 are also tested for chroma. - const int num_sizes = - (block_size_wide[block_idx] == 4 || block_size_high[block_idx] == 4) ? 2 - : 1; - - for (int shift = 0; shift < num_sizes; ++shift) { // luma and chroma - const int out_w = block_size_wide[block_idx] >> shift; - const int out_h = block_size_high[block_idx] >> shift; - const int num_loops = 1000000000 / (out_w + out_h); - - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < num_loops; ++i) - test_impl(input + offset_r * w + offset_c, w, output, MAX_SB_SIZE, out_w, - out_h, filter_params_x, filter_params_y, subx, suby, - &conv_params, bd); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("%d,%d convolve %3dx%-3d: %7.2f us\n", has_subx, has_suby, out_w, - out_h, 1000.0 * elapsed_time / num_loops); - } -} - -void AV1HighbdConvolve2DSrTest::RunCheckOutput( - highbd_convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int bd = GET_PARAM(0); - const int has_subx = GET_PARAM(2); - const int has_suby = GET_PARAM(3); - const int block_idx = GET_PARAM(4); - int hfilter, vfilter, subx, suby; - uint16_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, uint16_t, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, output2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) - input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - for (int i = 0; i < MAX_SB_SQUARE; ++i) - output[i] = output2[i] = rnd_.Rand31(); - - // Make sure that sizes 2xN and Nx2 are also tested for chroma. - const int num_sizes = - (block_size_wide[block_idx] == 4 || block_size_high[block_idx] == 4) ? 2 - : 1; - for (int shift = 0; shift < num_sizes; ++shift) { // luma and chroma - const int out_w = block_size_wide[block_idx] >> shift; - const int out_h = block_size_high[block_idx] >> shift; - for (hfilter = EIGHTTAP_REGULAR; hfilter < INTERP_FILTERS_ALL; ++hfilter) { - for (vfilter = EIGHTTAP_REGULAR; vfilter < INTERP_FILTERS_ALL; - ++vfilter) { - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - for (int do_average = 0; do_average < 1; ++do_average) { - ConvolveParams conv_params1 = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, bd); - ConvolveParams conv_params2 = - get_conv_params_no_round(do_average, 0, NULL, 0, 0, bd); - - const int subx_range = has_subx ? 16 : 1; - const int suby_range = has_suby ? 16 : 1; - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_highbd_convolve_2d_sr_c(input + offset_r * w + offset_c, w, - output, MAX_SB_SIZE, out_w, out_h, - filter_params_x, filter_params_y, - subx, suby, &conv_params1, bd); - test_impl(input + offset_r * w + offset_c, w, output2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2, bd); - - if (memcmp(output, output2, sizeof(output))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output[idx], output2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - } - } - } - } - } - } - } -} - -AV1HighbdJntConvolve2DTest::~AV1HighbdJntConvolve2DTest() {} -void AV1HighbdJntConvolve2DTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1HighbdJntConvolve2DTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1HighbdJntConvolve2DTest::RunSpeedTest( - highbd_convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int bd = GET_PARAM(0); - const int block_idx = GET_PARAM(4); - int hfilter, vfilter, subx, suby; - uint16_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, output16[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) - input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - for (int i = 0; i < MAX_SB_SQUARE; ++i) output[i] = rnd_.Rand16(); - hfilter = EIGHTTAP_REGULAR; - vfilter = EIGHTTAP_REGULAR; - int do_average = 0; - const int out_w = block_size_wide[block_idx]; - const int out_h = block_size_high[block_idx]; - - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - - ConvolveParams conv_params = - get_conv_params_no_round(do_average, 0, output, MAX_SB_SIZE, 1, bd); - - // Test special case where jnt_comp_avg is not used - conv_params.use_jnt_comp_avg = 0; - - subx = 0; - suby = 0; - // Choose random locations within the source block - const int offset_r = 3; - const int offset_c = 3; - - const int num_loops = 1000000000 / (out_w + out_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < num_loops; ++i) - test_impl(input + offset_r * w + offset_c, w, output16, MAX_SB_SIZE, out_w, - out_h, filter_params_x, filter_params_y, subx, suby, &conv_params, - bd); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("convolve %3dx%-3d: %7.2f us\n", out_w, out_h, - 1000.0 * elapsed_time / num_loops); -} - -void AV1HighbdJntConvolve2DTest::RunCheckOutput( - highbd_convolve_2d_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int bd = GET_PARAM(0); - const int has_subx = GET_PARAM(2); - const int has_suby = GET_PARAM(3); - const int block_idx = GET_PARAM(4); - int hfilter, vfilter, subx, suby; - uint16_t input[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, CONV_BUF_TYPE, output2[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, output16_1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, output16_2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) - input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - output1[i] = output2[i] = rnd_.Rand16(); - output16_1[i] = output16_2[i] = rnd_.Rand16(); - } - - const int out_w = block_size_wide[block_idx]; - const int out_h = block_size_high[block_idx]; - for (hfilter = EIGHTTAP_REGULAR; hfilter < INTERP_FILTERS_ALL; ++hfilter) { - for (vfilter = EIGHTTAP_REGULAR; vfilter < INTERP_FILTERS_ALL; ++vfilter) { - const InterpFilterParams *filter_params_x = - av1_get_interp_filter_params_with_block_size((InterpFilter)hfilter, - out_w); - const InterpFilterParams *filter_params_y = - av1_get_interp_filter_params_with_block_size((InterpFilter)vfilter, - out_h); - for (int do_average = 0; do_average <= 1; ++do_average) { - ConvolveParams conv_params1 = get_conv_params_no_round( - do_average, 0, output1, MAX_SB_SIZE, 1, bd); - ConvolveParams conv_params2 = get_conv_params_no_round( - do_average, 0, output2, MAX_SB_SIZE, 1, bd); - - // Test special case where jnt_comp_avg is not used - conv_params1.use_jnt_comp_avg = 0; - conv_params2.use_jnt_comp_avg = 0; - - const int subx_range = has_subx ? 16 : 1; - const int suby_range = has_suby ? 16 : 1; - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_highbd_jnt_convolve_2d_c(input + offset_r * w + offset_c, w, - output16_1, MAX_SB_SIZE, out_w, out_h, - filter_params_x, filter_params_y, subx, - suby, &conv_params1, bd); - test_impl(input + offset_r * w + offset_c, w, output16_2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2, bd); - - for (int i = 0; i < out_h; ++i) { - for (int j = 0; j < out_w; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output1[idx], output2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx << ")"; - } - } - - if (memcmp(output16_1, output16_2, sizeof(output16_1))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output16_1[idx], output16_2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - } - } - } - - // Test different combination of fwd and bck offset weights - for (int k = 0; k < 2; ++k) { - for (int l = 0; l < 4; ++l) { - conv_params1.use_jnt_comp_avg = 1; - conv_params2.use_jnt_comp_avg = 1; - conv_params1.fwd_offset = quant_dist_lookup_table[k][l][0]; - conv_params1.bck_offset = quant_dist_lookup_table[k][l][1]; - conv_params2.fwd_offset = quant_dist_lookup_table[k][l][0]; - conv_params2.bck_offset = quant_dist_lookup_table[k][l][1]; - - const int subx_range = has_subx ? 16 : 1; - const int suby_range = has_suby ? 16 : 1; - for (subx = 0; subx < subx_range; ++subx) { - for (suby = 0; suby < suby_range; ++suby) { - // Choose random locations within the source block - const int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_highbd_jnt_convolve_2d_c( - input + offset_r * w + offset_c, w, output16_1, MAX_SB_SIZE, - out_w, out_h, filter_params_x, filter_params_y, subx, suby, - &conv_params1, bd); - test_impl(input + offset_r * w + offset_c, w, output16_2, - MAX_SB_SIZE, out_w, out_h, filter_params_x, - filter_params_y, subx, suby, &conv_params2, bd); - - for (int i = 0; i < out_h; ++i) { - for (int j = 0; j < out_w; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output1[idx], output2[idx]) - << out_w << "x" << out_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << suby << ", " << subx - << ")"; - } - } - - if (memcmp(output16_1, output16_2, sizeof(output16_1))) { - for (int i = 0; i < MAX_SB_SIZE; ++i) { - for (int j = 0; j < MAX_SB_SIZE; ++j) { - int idx = i * MAX_SB_SIZE + j; - ASSERT_EQ(output16_1[idx], output16_2[idx]) - << out_w << "x" << out_h - << " Pixel mismatch at index " << idx << " = (" << i - << ", " << j << "), sub pixel offset = (" << suby - << ", " << subx << ")"; - } - } - } - } - } - } - } - } - } - } -} -} // namespace AV1HighbdConvolve2D -} // namespace libaom_test diff --git a/third_party/aom/test/av1_convolve_2d_test_util.h b/third_party/aom/test/av1_convolve_2d_test_util.h deleted file mode 100644 index e0eb58410..000000000 --- a/third_party/aom/test/av1_convolve_2d_test_util.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_AV1_CONVOLVE_2D_TEST_UTIL_H_ -#define AOM_TEST_AV1_CONVOLVE_2D_TEST_UTIL_H_ - -#include "config/av1_rtcd.h" -#include "config/aom_dsp_rtcd.h" - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/util.h" - -#include "test/clear_system_state.h" -#include "test/register_state_check.h" - -namespace libaom_test { - -namespace AV1Convolve2D { - -typedef void (*convolve_2d_func)(const uint8_t *src, int src_stride, - uint8_t *dst, int dst_stride, int w, int h, - const InterpFilterParams *filter_params_x, - const InterpFilterParams *filter_params_y, - const int subpel_x_q4, const int subpel_y_q4, - ConvolveParams *conv_params); - -typedef ::testing::tuple<convolve_2d_func, int, int, BLOCK_SIZE> - Convolve2DParam; - -::testing::internal::ParamGenerator<Convolve2DParam> BuildParams( - convolve_2d_func filter, int subx_exist, int suby_exist); - -class AV1Convolve2DSrTest : public ::testing::TestWithParam<Convolve2DParam> { - public: - virtual ~AV1Convolve2DSrTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(convolve_2d_func test_impl); - void RunSpeedTest(convolve_2d_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -class AV1JntConvolve2DTest : public ::testing::TestWithParam<Convolve2DParam> { - public: - virtual ~AV1JntConvolve2DTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(convolve_2d_func test_impl); - void RunSpeedTest(convolve_2d_func test_impl); - - libaom_test::ACMRandom rnd_; -}; -} // namespace AV1Convolve2D - -namespace AV1HighbdConvolve2D { -typedef void (*highbd_convolve_2d_func)( - const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride, int w, - int h, const InterpFilterParams *filter_params_x, - const InterpFilterParams *filter_params_y, const int subpel_x_q4, - const int subpel_y_q4, ConvolveParams *conv_params, int bd); - -typedef ::testing::tuple<int, highbd_convolve_2d_func, int, int, BLOCK_SIZE> - HighbdConvolve2DParam; - -::testing::internal::ParamGenerator<HighbdConvolve2DParam> BuildParams( - highbd_convolve_2d_func filter, int subx_exist, int suby_exist); - -class AV1HighbdConvolve2DSrTest - : public ::testing::TestWithParam<HighbdConvolve2DParam> { - public: - virtual ~AV1HighbdConvolve2DSrTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(highbd_convolve_2d_func test_impl); - void RunSpeedTest(highbd_convolve_2d_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -class AV1HighbdJntConvolve2DTest - : public ::testing::TestWithParam<HighbdConvolve2DParam> { - public: - virtual ~AV1HighbdJntConvolve2DTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(highbd_convolve_2d_func test_impl); - void RunSpeedTest(highbd_convolve_2d_func test_impl); - - libaom_test::ACMRandom rnd_; -}; -} // namespace AV1HighbdConvolve2D - -} // namespace libaom_test - -#endif // AOM_TEST_AV1_CONVOLVE_2D_TEST_UTIL_H_ diff --git a/third_party/aom/test/av1_convolve_scale_test.cc b/third_party/aom/test/av1_convolve_scale_test.cc deleted file mode 100644 index 3b1698eeb..000000000 --- a/third_party/aom/test/av1_convolve_scale_test.cc +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <vector> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -#include "av1/common/common_data.h" - -namespace { -const int kTestIters = 10; -const int kPerfIters = 1000; - -const int kVPad = 32; -const int kHPad = 32; -const int kXStepQn = 16; -const int kYStepQn = 20; - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; - -enum NTaps { EIGHT_TAP, TEN_TAP, TWELVE_TAP }; -int NTapsToInt(NTaps ntaps) { return 8 + static_cast<int>(ntaps) * 2; } - -// A 16-bit filter with a configurable number of taps. -class TestFilter { - public: - void set(NTaps ntaps, bool backwards); - - InterpFilterParams params_; - - private: - std::vector<int16_t> coeffs_; -}; - -void TestFilter::set(NTaps ntaps, bool backwards) { - const int n = NTapsToInt(ntaps); - assert(n >= 8 && n <= 12); - - // The filter has n * SUBPEL_SHIFTS proper elements and an extra 8 bogus - // elements at the end so that convolutions can read off the end safely. - coeffs_.resize(n * SUBPEL_SHIFTS + 8); - - // The coefficients are pretty much arbitrary, but convolutions shouldn't - // over or underflow. For the first filter (subpels = 0), we use an - // increasing or decreasing ramp (depending on the backwards parameter). We - // don't want any zero coefficients, so we make it have an x-intercept at -1 - // or n. To ensure absence of under/overflow, we normalise the area under the - // ramp to be I = 1 << FILTER_BITS (so that convolving a constant function - // gives the identity). - // - // When increasing, the function has the form: - // - // f(x) = A * (x + 1) - // - // Summing and rearranging for A gives A = 2 * I / (n * (n + 1)). If the - // filter is reversed, we have the same A but with formula - // - // g(x) = A * (n - x) - const int I = 1 << FILTER_BITS; - const float A = 2.f * I / (n * (n + 1.f)); - for (int i = 0; i < n; ++i) { - coeffs_[i] = static_cast<int16_t>(A * (backwards ? (n - i) : (i + 1))); - } - - // For the other filters, make them slightly different by swapping two - // columns. Filter k will have the columns (k % n) and (7 * k) % n swapped. - const size_t filter_size = sizeof(coeffs_[0] * n); - int16_t *const filter0 = &coeffs_[0]; - for (int k = 1; k < SUBPEL_SHIFTS; ++k) { - int16_t *filterk = &coeffs_[k * n]; - memcpy(filterk, filter0, filter_size); - - const int idx0 = k % n; - const int idx1 = (7 * k) % n; - - const int16_t tmp = filterk[idx0]; - filterk[idx0] = filterk[idx1]; - filterk[idx1] = tmp; - } - - // Finally, write some rubbish at the end to make sure we don't use it. - for (int i = 0; i < 8; ++i) coeffs_[n * SUBPEL_SHIFTS + i] = 123 + i; - - // Fill in params - params_.filter_ptr = &coeffs_[0]; - params_.taps = n; - // These are ignored by the functions being tested. Set them to whatever. - params_.subpel_shifts = SUBPEL_SHIFTS; - params_.interp_filter = EIGHTTAP_REGULAR; -} - -template <typename SrcPixel> -class TestImage { - public: - TestImage(int w, int h, int bd) : w_(w), h_(h), bd_(bd) { - assert(bd < 16); - assert(bd <= 8 * static_cast<int>(sizeof(SrcPixel))); - - // Pad width by 2*kHPad and then round up to the next multiple of 16 - // to get src_stride_. Add another 16 for dst_stride_ (to make sure - // something goes wrong if we use the wrong one) - src_stride_ = (w_ + 2 * kHPad + 15) & ~15; - dst_stride_ = src_stride_ + 16; - - // Allocate image data - src_data_.resize(2 * src_block_size()); - dst_data_.resize(2 * dst_block_size()); - dst_16_data_.resize(2 * dst_block_size()); - } - - void Initialize(ACMRandom *rnd); - void Check() const; - - int src_stride() const { return src_stride_; } - int dst_stride() const { return dst_stride_; } - - int src_block_size() const { return (h_ + 2 * kVPad) * src_stride(); } - int dst_block_size() const { return (h_ + 2 * kVPad) * dst_stride(); } - - const SrcPixel *GetSrcData(bool ref, bool borders) const { - const SrcPixel *block = &src_data_[ref ? 0 : src_block_size()]; - return borders ? block : block + kHPad + src_stride_ * kVPad; - } - - SrcPixel *GetDstData(bool ref, bool borders) { - SrcPixel *block = &dst_data_[ref ? 0 : dst_block_size()]; - return borders ? block : block + kHPad + dst_stride_ * kVPad; - } - - CONV_BUF_TYPE *GetDst16Data(bool ref, bool borders) { - CONV_BUF_TYPE *block = &dst_16_data_[ref ? 0 : dst_block_size()]; - return borders ? block : block + kHPad + dst_stride_ * kVPad; - } - - private: - int w_, h_, bd_; - int src_stride_, dst_stride_; - - std::vector<SrcPixel> src_data_; - std::vector<SrcPixel> dst_data_; - std::vector<CONV_BUF_TYPE> dst_16_data_; -}; - -template <typename Pixel> -void FillEdge(ACMRandom *rnd, int num_pixels, int bd, bool trash, Pixel *data) { - if (!trash) { - memset(data, 0, sizeof(*data) * num_pixels); - return; - } - const Pixel mask = (1 << bd) - 1; - for (int i = 0; i < num_pixels; ++i) data[i] = rnd->Rand16() & mask; -} - -template <typename Pixel> -void PrepBuffers(ACMRandom *rnd, int w, int h, int stride, int bd, - bool trash_edges, Pixel *data) { - assert(rnd); - const Pixel mask = (1 << bd) - 1; - - // Fill in the first buffer with random data - // Top border - FillEdge(rnd, stride * kVPad, bd, trash_edges, data); - for (int r = 0; r < h; ++r) { - Pixel *row_data = data + (kVPad + r) * stride; - // Left border, contents, right border - FillEdge(rnd, kHPad, bd, trash_edges, row_data); - for (int c = 0; c < w; ++c) row_data[kHPad + c] = rnd->Rand16() & mask; - FillEdge(rnd, kHPad, bd, trash_edges, row_data + kHPad + w); - } - // Bottom border - FillEdge(rnd, stride * kVPad, bd, trash_edges, data + stride * (kVPad + h)); - - const int bpp = sizeof(*data); - const int block_elts = stride * (h + 2 * kVPad); - const int block_size = bpp * block_elts; - - // Now copy that to the second buffer - memcpy(data + block_elts, data, block_size); -} - -template <typename SrcPixel> -void TestImage<SrcPixel>::Initialize(ACMRandom *rnd) { - PrepBuffers(rnd, w_, h_, src_stride_, bd_, false, &src_data_[0]); - PrepBuffers(rnd, w_, h_, dst_stride_, bd_, true, &dst_data_[0]); - PrepBuffers(rnd, w_, h_, dst_stride_, bd_, true, &dst_16_data_[0]); -} - -template <typename SrcPixel> -void TestImage<SrcPixel>::Check() const { - // If memcmp returns 0, there's nothing to do. - const int num_pixels = dst_block_size(); - const SrcPixel *ref_dst = &dst_data_[0]; - const SrcPixel *tst_dst = &dst_data_[num_pixels]; - - const CONV_BUF_TYPE *ref_16_dst = &dst_16_data_[0]; - const CONV_BUF_TYPE *tst_16_dst = &dst_16_data_[num_pixels]; - - if (0 == memcmp(ref_dst, tst_dst, sizeof(*ref_dst) * num_pixels)) { - if (0 == memcmp(ref_16_dst, tst_16_dst, sizeof(*ref_16_dst) * num_pixels)) - return; - } - // Otherwise, iterate through the buffer looking for differences (including - // the edges) - const int stride = dst_stride_; - for (int r = 0; r < h_ + 2 * kVPad; ++r) { - for (int c = 0; c < w_ + 2 * kHPad; ++c) { - const int32_t ref_value = ref_dst[r * stride + c]; - const int32_t tst_value = tst_dst[r * stride + c]; - - EXPECT_EQ(tst_value, ref_value) - << "Error at row: " << (r - kVPad) << ", col: " << (c - kHPad); - } - } - - for (int r = 0; r < h_ + 2 * kVPad; ++r) { - for (int c = 0; c < w_ + 2 * kHPad; ++c) { - const int32_t ref_value = ref_16_dst[r * stride + c]; - const int32_t tst_value = tst_16_dst[r * stride + c]; - - EXPECT_EQ(tst_value, ref_value) - << "Error in 16 bit buffer " - << "Error at row: " << (r - kVPad) << ", col: " << (c - kHPad); - } - } -} - -typedef tuple<int, int> BlockDimension; - -struct BaseParams { - BaseParams(BlockDimension dims, NTaps ntaps_x, NTaps ntaps_y, bool avg) - : dims(dims), ntaps_x(ntaps_x), ntaps_y(ntaps_y), avg(avg) {} - - BlockDimension dims; - NTaps ntaps_x, ntaps_y; - bool avg; -}; - -template <typename SrcPixel> -class ConvolveScaleTestBase : public ::testing::Test { - public: - ConvolveScaleTestBase() : image_(NULL) {} - virtual ~ConvolveScaleTestBase() { delete image_; } - virtual void TearDown() { libaom_test::ClearSystemState(); } - - // Implemented by subclasses (SetUp depends on the parameters passed - // in and RunOne depends on the function to be tested. These can't - // be templated for low/high bit depths because they have different - // numbers of parameters) - virtual void SetUp() = 0; - virtual void RunOne(bool ref) = 0; - - protected: - void SetParams(const BaseParams ¶ms, int bd) { - width_ = ::testing::get<0>(params.dims); - height_ = ::testing::get<1>(params.dims); - ntaps_x_ = params.ntaps_x; - ntaps_y_ = params.ntaps_y; - bd_ = bd; - avg_ = params.avg; - - filter_x_.set(ntaps_x_, false); - filter_y_.set(ntaps_y_, true); - convolve_params_ = - get_conv_params_no_round(avg_ != false, 0, NULL, 0, 1, bd); - - delete image_; - image_ = new TestImage<SrcPixel>(width_, height_, bd_); - } - - void SetConvParamOffset(int i, int j, int is_compound, int do_average, - int use_jnt_comp_avg) { - if (i == -1 && j == -1) { - convolve_params_.use_jnt_comp_avg = use_jnt_comp_avg; - convolve_params_.is_compound = is_compound; - convolve_params_.do_average = do_average; - } else { - convolve_params_.use_jnt_comp_avg = use_jnt_comp_avg; - convolve_params_.fwd_offset = quant_dist_lookup_table[i][j][0]; - convolve_params_.bck_offset = quant_dist_lookup_table[i][j][1]; - convolve_params_.is_compound = is_compound; - convolve_params_.do_average = do_average; - } - } - - void Run() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int i = 0; i < kTestIters; ++i) { - int is_compound = 0; - SetConvParamOffset(-1, -1, is_compound, 0, 0); - Prep(&rnd); - RunOne(true); - RunOne(false); - image_->Check(); - - is_compound = 1; - for (int do_average = 0; do_average < 2; do_average++) { - for (int use_jnt_comp_avg = 0; use_jnt_comp_avg < 2; - use_jnt_comp_avg++) { - for (int j = 0; j < 2; ++j) { - for (int k = 0; k < 4; ++k) { - SetConvParamOffset(j, k, is_compound, do_average, - use_jnt_comp_avg); - Prep(&rnd); - RunOne(true); - RunOne(false); - image_->Check(); - } - } - } - } - } - } - - void SpeedTest() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - Prep(&rnd); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (int i = 0; i < kPerfIters; ++i) RunOne(true); - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (int i = 0; i < kPerfIters; ++i) RunOne(false); - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: CDEFSpeedTest, SIMD slower than C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - } - - static int RandomSubpel(ACMRandom *rnd) { - const uint8_t subpel_mode = rnd->Rand8(); - if ((subpel_mode & 7) == 0) { - return 0; - } else if ((subpel_mode & 7) == 1) { - return SCALE_SUBPEL_SHIFTS - 1; - } else { - return 1 + rnd->PseudoUniform(SCALE_SUBPEL_SHIFTS - 2); - } - } - - void Prep(ACMRandom *rnd) { - assert(rnd); - - // Choose subpel_x_ and subpel_y_. They should be less than - // SCALE_SUBPEL_SHIFTS; we also want to add extra weight to "interesting" - // values: 0 and SCALE_SUBPEL_SHIFTS - 1 - subpel_x_ = RandomSubpel(rnd); - subpel_y_ = RandomSubpel(rnd); - - image_->Initialize(rnd); - } - - int width_, height_, bd_; - NTaps ntaps_x_, ntaps_y_; - bool avg_; - int subpel_x_, subpel_y_; - TestFilter filter_x_, filter_y_; - TestImage<SrcPixel> *image_; - ConvolveParams convolve_params_; -}; - -typedef tuple<int, int> BlockDimension; - -typedef void (*LowbdConvolveFunc)(const uint8_t *src, int src_stride, - uint8_t *dst, int dst_stride, int w, int h, - const InterpFilterParams *filter_params_x, - const InterpFilterParams *filter_params_y, - const int subpel_x_qn, const int x_step_qn, - const int subpel_y_qn, const int y_step_qn, - ConvolveParams *conv_params); - -// Test parameter list: -// <tst_fun, dims, ntaps_x, ntaps_y, avg> -typedef tuple<LowbdConvolveFunc, BlockDimension, NTaps, NTaps, bool> - LowBDParams; - -class LowBDConvolveScaleTest - : public ConvolveScaleTestBase<uint8_t>, - public ::testing::WithParamInterface<LowBDParams> { - public: - virtual ~LowBDConvolveScaleTest() {} - - void SetUp() { - tst_fun_ = GET_PARAM(0); - - const BlockDimension &block = GET_PARAM(1); - const NTaps ntaps_x = GET_PARAM(2); - const NTaps ntaps_y = GET_PARAM(3); - const int bd = 8; - const bool avg = GET_PARAM(4); - - SetParams(BaseParams(block, ntaps_x, ntaps_y, avg), bd); - } - - void RunOne(bool ref) { - const uint8_t *src = image_->GetSrcData(ref, false); - uint8_t *dst = image_->GetDstData(ref, false); - convolve_params_.dst = image_->GetDst16Data(ref, false); - const int src_stride = image_->src_stride(); - const int dst_stride = image_->dst_stride(); - if (ref) { - av1_convolve_2d_scale_c(src, src_stride, dst, dst_stride, width_, height_, - &filter_x_.params_, &filter_y_.params_, subpel_x_, - kXStepQn, subpel_y_, kYStepQn, &convolve_params_); - } else { - tst_fun_(src, src_stride, dst, dst_stride, width_, height_, - &filter_x_.params_, &filter_y_.params_, subpel_x_, kXStepQn, - subpel_y_, kYStepQn, &convolve_params_); - } - } - - private: - LowbdConvolveFunc tst_fun_; -}; - -const BlockDimension kBlockDim[] = { - make_tuple(2, 2), make_tuple(2, 4), make_tuple(4, 4), - make_tuple(4, 8), make_tuple(8, 4), make_tuple(8, 8), - make_tuple(8, 16), make_tuple(16, 8), make_tuple(16, 16), - make_tuple(16, 32), make_tuple(32, 16), make_tuple(32, 32), - make_tuple(32, 64), make_tuple(64, 32), make_tuple(64, 64), - make_tuple(64, 128), make_tuple(128, 64), make_tuple(128, 128), -}; - -const NTaps kNTaps[] = { EIGHT_TAP }; - -TEST_P(LowBDConvolveScaleTest, Check) { Run(); } -TEST_P(LowBDConvolveScaleTest, DISABLED_Speed) { SpeedTest(); } - -INSTANTIATE_TEST_CASE_P( - SSE4_1, LowBDConvolveScaleTest, - ::testing::Combine(::testing::Values(av1_convolve_2d_scale_sse4_1), - ::testing::ValuesIn(kBlockDim), - ::testing::ValuesIn(kNTaps), ::testing::ValuesIn(kNTaps), - ::testing::Bool())); - -typedef void (*HighbdConvolveFunc)(const uint16_t *src, int src_stride, - uint16_t *dst, int dst_stride, int w, int h, - const InterpFilterParams *filter_params_x, - const InterpFilterParams *filter_params_y, - const int subpel_x_qn, const int x_step_qn, - const int subpel_y_qn, const int y_step_qn, - ConvolveParams *conv_params, int bd); - -// Test parameter list: -// <tst_fun, dims, ntaps_x, ntaps_y, avg, bd> -typedef tuple<HighbdConvolveFunc, BlockDimension, NTaps, NTaps, bool, int> - HighBDParams; - -class HighBDConvolveScaleTest - : public ConvolveScaleTestBase<uint16_t>, - public ::testing::WithParamInterface<HighBDParams> { - public: - virtual ~HighBDConvolveScaleTest() {} - - void SetUp() { - tst_fun_ = GET_PARAM(0); - - const BlockDimension &block = GET_PARAM(1); - const NTaps ntaps_x = GET_PARAM(2); - const NTaps ntaps_y = GET_PARAM(3); - const bool avg = GET_PARAM(4); - const int bd = GET_PARAM(5); - - SetParams(BaseParams(block, ntaps_x, ntaps_y, avg), bd); - } - - void RunOne(bool ref) { - const uint16_t *src = image_->GetSrcData(ref, false); - uint16_t *dst = image_->GetDstData(ref, false); - convolve_params_.dst = image_->GetDst16Data(ref, false); - const int src_stride = image_->src_stride(); - const int dst_stride = image_->dst_stride(); - - if (ref) { - av1_highbd_convolve_2d_scale_c( - src, src_stride, dst, dst_stride, width_, height_, &filter_x_.params_, - &filter_y_.params_, subpel_x_, kXStepQn, subpel_y_, kYStepQn, - &convolve_params_, bd_); - } else { - tst_fun_(src, src_stride, dst, dst_stride, width_, height_, - &filter_x_.params_, &filter_y_.params_, subpel_x_, kXStepQn, - subpel_y_, kYStepQn, &convolve_params_, bd_); - } - } - - private: - HighbdConvolveFunc tst_fun_; -}; - -const int kBDs[] = { 8, 10, 12 }; - -TEST_P(HighBDConvolveScaleTest, Check) { Run(); } -TEST_P(HighBDConvolveScaleTest, DISABLED_Speed) { SpeedTest(); } - -INSTANTIATE_TEST_CASE_P( - SSE4_1, HighBDConvolveScaleTest, - ::testing::Combine(::testing::Values(av1_highbd_convolve_2d_scale_sse4_1), - ::testing::ValuesIn(kBlockDim), - ::testing::ValuesIn(kNTaps), ::testing::ValuesIn(kNTaps), - ::testing::Bool(), ::testing::ValuesIn(kBDs))); -} // namespace diff --git a/third_party/aom/test/av1_encoder_parms_get_to_decoder.cc b/third_party/aom/test/av1_encoder_parms_get_to_decoder.cc deleted file mode 100644 index e8470e5d5..000000000 --- a/third_party/aom/test/av1_encoder_parms_get_to_decoder.cc +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/util.h" -#include "test/y4m_video_source.h" - -#include "aom/aom_decoder.h" -#include "av1/decoder/decoder.h" - -namespace { - -const int kMaxPsnr = 100; - -struct ParamPassingTestVideo { - const char *name; - uint32_t width; - uint32_t height; - uint32_t bitrate; - int frames; -}; - -const ParamPassingTestVideo kAV1ParamPassingTestVector = { - "niklas_1280_720_30.y4m", 1280, 720, 600, 3 -}; - -struct EncodeParameters { - int32_t lossless; - aom_color_primaries_t color_primaries; - aom_transfer_characteristics_t transfer_characteristics; - aom_matrix_coefficients_t matrix_coefficients; - aom_color_range_t color_range; - aom_chroma_sample_position_t chroma_sample_position; - int32_t render_size[2]; -}; - -const EncodeParameters kAV1EncodeParameterSet[] = { - { 1, - AOM_CICP_CP_BT_709, - AOM_CICP_TC_BT_709, - AOM_CICP_MC_BT_709, - AOM_CR_STUDIO_RANGE, - AOM_CSP_UNKNOWN, - { 0, 0 } }, - { 0, - AOM_CICP_CP_BT_470_M, - AOM_CICP_TC_BT_470_M, - AOM_CICP_MC_BT_470_B_G, - AOM_CR_FULL_RANGE, - AOM_CSP_VERTICAL, - { 0, 0 } }, - { 1, - AOM_CICP_CP_BT_601, - AOM_CICP_TC_BT_601, - AOM_CICP_MC_BT_601, - AOM_CR_STUDIO_RANGE, - AOM_CSP_COLOCATED, - { 0, 0 } }, - { 0, - AOM_CICP_CP_BT_2020, - AOM_CICP_TC_BT_2020_10_BIT, - AOM_CICP_MC_BT_2020_NCL, - AOM_CR_FULL_RANGE, - AOM_CSP_RESERVED, - { 640, 480 } }, -}; - -class AVxEncoderParmsGetToDecoder - : public ::libaom_test::EncoderTest, - public ::libaom_test::CodecTestWithParam<EncodeParameters> { - protected: - AVxEncoderParmsGetToDecoder() - : EncoderTest(GET_PARAM(0)), encode_parms(GET_PARAM(1)) {} - - virtual ~AVxEncoderParmsGetToDecoder() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(::libaom_test::kTwoPassGood); - cfg_.g_lag_in_frames = 25; - test_video_ = kAV1ParamPassingTestVector; - cfg_.rc_target_bitrate = test_video_.bitrate; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_COLOR_PRIMARIES, encode_parms.color_primaries); - encoder->Control(AV1E_SET_TRANSFER_CHARACTERISTICS, - encode_parms.transfer_characteristics); - encoder->Control(AV1E_SET_MATRIX_COEFFICIENTS, - encode_parms.matrix_coefficients); - encoder->Control(AV1E_SET_COLOR_RANGE, encode_parms.color_range); - encoder->Control(AV1E_SET_CHROMA_SAMPLE_POSITION, - encode_parms.chroma_sample_position); - encoder->Control(AV1E_SET_LOSSLESS, encode_parms.lossless); - if (encode_parms.render_size[0] > 0 && encode_parms.render_size[1] > 0) { - encoder->Control(AV1E_SET_RENDER_SIZE, encode_parms.render_size); - } - } - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - (void)pts; - if (encode_parms.render_size[0] > 0 && encode_parms.render_size[1] > 0) { - EXPECT_EQ(encode_parms.render_size[0], (int)img.r_w); - EXPECT_EQ(encode_parms.render_size[1], (int)img.r_h); - } - EXPECT_EQ(encode_parms.color_primaries, img.cp); - EXPECT_EQ(encode_parms.transfer_characteristics, img.tc); - EXPECT_EQ(encode_parms.matrix_coefficients, img.mc); - EXPECT_EQ(encode_parms.color_range, img.range); - EXPECT_EQ(encode_parms.chroma_sample_position, img.csp); - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (encode_parms.lossless) { - EXPECT_EQ(kMaxPsnr, pkt->data.psnr.psnr[0]); - } - } - - virtual bool HandleDecodeResult(const aom_codec_err_t res_dec, - libaom_test::Decoder *decoder) { - EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); - return AOM_CODEC_OK == res_dec; - } - - ParamPassingTestVideo test_video_; - - private: - EncodeParameters encode_parms; -}; - -TEST_P(AVxEncoderParmsGetToDecoder, BitstreamParms) { - init_flags_ = AOM_CODEC_USE_PSNR; - - testing::internal::scoped_ptr<libaom_test::VideoSource> video( - new libaom_test::Y4mVideoSource(test_video_.name, 0, test_video_.frames)); - ASSERT_TRUE(video.get() != NULL); - - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); -} - -AV1_INSTANTIATE_TEST_CASE(AVxEncoderParmsGetToDecoder, - ::testing::ValuesIn(kAV1EncodeParameterSet)); -} // namespace diff --git a/third_party/aom/test/av1_ext_tile_test.cc b/third_party/aom/test/av1_ext_tile_test.cc deleted file mode 100644 index 424d2f065..000000000 --- a/third_party/aom/test/av1_ext_tile_test.cc +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <assert.h> -#include <string> -#include <vector> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/md5_helper.h" -#include "test/util.h" - -namespace { -// The number of frames to be encoded/decoded -const int kLimit = 8; -// Skip 1 frame to check the frame decoding independency. -const int kSkip = 5; -const int kTileSize = 1; -const int kTIleSizeInPixels = (kTileSize << 6); -// Fake width and height so that they can be multiples of the tile size. -const int kImgWidth = 704; -const int kImgHeight = 576; - -// This test tests large scale tile coding case. Non-large-scale tile coding -// is tested by the tile_independence test. -class AV1ExtTileTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - AV1ExtTileTest() - : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), - set_cpu_used_(GET_PARAM(2)) { - init_flags_ = AOM_CODEC_USE_PSNR; - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.w = kImgWidth; - cfg.h = kImgHeight; - cfg.allow_lowbitdepth = 1; - - decoder_ = codec_->CreateDecoder(cfg, 0); - decoder_->Control(AV1_SET_TILE_MODE, 1); - decoder_->Control(AV1D_EXT_TILE_DEBUG, 1); - decoder_->Control(AV1_SET_DECODE_TILE_ROW, -1); - decoder_->Control(AV1_SET_DECODE_TILE_COL, -1); - - // Allocate buffer to store tile image. - aom_img_alloc(&tile_img_, AOM_IMG_FMT_I420, kImgWidth, kImgHeight, 32); - - md5_.clear(); - tile_md5_.clear(); - } - - virtual ~AV1ExtTileTest() { - aom_img_free(&tile_img_); - delete decoder_; - } - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_VBR; - cfg_.g_error_resilient = 1; - - cfg_.rc_max_quantizer = 56; - cfg_.rc_min_quantizer = 0; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - // Encode setting - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 0); - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - - // TODO(yunqingwang): test single_tile_decoding = 0. - encoder->Control(AV1E_SET_SINGLE_TILE_DECODING, 1); - // Always use 64x64 max partition. - encoder->Control(AV1E_SET_SUPERBLOCK_SIZE, AOM_SUPERBLOCK_SIZE_64X64); - // Set tile_columns and tile_rows to MAX values, which guarantees the tile - // size of 64 x 64 pixels(i.e. 1 SB) for <= 4k resolution. - encoder->Control(AV1E_SET_TILE_COLUMNS, 6); - encoder->Control(AV1E_SET_TILE_ROWS, 6); - } - - if (video->frame() == 1) { - frame_flags_ = - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF; - } - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - // Skip 1 already decoded frame to be consistent with the decoder in this - // test. - if (pts == (aom_codec_pts_t)kSkip) return; - - // Calculate MD5 as the reference. - ::libaom_test::MD5 md5_res; - md5_res.Add(&img); - md5_.push_back(md5_res.Get()); - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - // Skip decoding 1 frame. - if (pkt->data.frame.pts == (aom_codec_pts_t)kSkip) return; - - bool IsLastFrame = (pkt->data.frame.pts == (aom_codec_pts_t)(kLimit - 1)); - - // Decode the first (kLimit - 1) frames as whole frame, and decode the last - // frame in single tiles. - for (int r = 0; r < kImgHeight / kTIleSizeInPixels; ++r) { - for (int c = 0; c < kImgWidth / kTIleSizeInPixels; ++c) { - if (!IsLastFrame) { - decoder_->Control(AV1_SET_DECODE_TILE_ROW, -1); - decoder_->Control(AV1_SET_DECODE_TILE_COL, -1); - } else { - decoder_->Control(AV1_SET_DECODE_TILE_ROW, r); - decoder_->Control(AV1_SET_DECODE_TILE_COL, c); - } - - const aom_codec_err_t res = decoder_->DecodeFrame( - reinterpret_cast<uint8_t *>(pkt->data.frame.buf), - pkt->data.frame.sz); - if (res != AOM_CODEC_OK) { - abort_ = true; - ASSERT_EQ(AOM_CODEC_OK, res); - } - const aom_image_t *img = decoder_->GetDxData().Next(); - - if (!IsLastFrame) { - if (img) { - ::libaom_test::MD5 md5_res; - md5_res.Add(img); - tile_md5_.push_back(md5_res.Get()); - } - break; - } - - const int kMaxMBPlane = 3; - for (int plane = 0; plane < kMaxMBPlane; ++plane) { - const int shift = (plane == 0) ? 0 : 1; - int tile_height = kTIleSizeInPixels >> shift; - int tile_width = kTIleSizeInPixels >> shift; - - for (int tr = 0; tr < tile_height; ++tr) { - memcpy(tile_img_.planes[plane] + - tile_img_.stride[plane] * (r * tile_height + tr) + - c * tile_width, - img->planes[plane] + img->stride[plane] * tr, tile_width); - } - } - } - - if (!IsLastFrame) break; - } - - if (IsLastFrame) { - ::libaom_test::MD5 md5_res; - md5_res.Add(&tile_img_); - tile_md5_.push_back(md5_res.Get()); - } - } - - void TestRoundTrip() { - ::libaom_test::I420VideoSource video( - "hantro_collage_w352h288.yuv", kImgWidth, kImgHeight, 30, 1, 0, kLimit); - cfg_.rc_target_bitrate = 500; - cfg_.g_error_resilient = AOM_ERROR_RESILIENT_DEFAULT; - cfg_.large_scale_tile = 1; - cfg_.g_lag_in_frames = 0; - cfg_.g_threads = 1; - - // Tile encoding - init_flags_ = AOM_CODEC_USE_PSNR; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - // Compare to check if two vectors are equal. - ASSERT_EQ(md5_, tile_md5_); - } - - ::libaom_test::TestMode encoding_mode_; - int set_cpu_used_; - ::libaom_test::Decoder *decoder_; - aom_image_t tile_img_; - std::vector<std::string> md5_; - std::vector<std::string> tile_md5_; -}; - -TEST_P(AV1ExtTileTest, DecoderResultTest) { TestRoundTrip(); } - -AV1_INSTANTIATE_TEST_CASE( - // Now only test 2-pass mode. - AV1ExtTileTest, ::testing::Values(::libaom_test::kTwoPassGood), - ::testing::Range(1, 4)); - -class AV1ExtTileTestLarge : public AV1ExtTileTest {}; - -TEST_P(AV1ExtTileTestLarge, DecoderResultTest) { TestRoundTrip(); } - -AV1_INSTANTIATE_TEST_CASE( - // Now only test 2-pass mode. - AV1ExtTileTestLarge, ::testing::Values(::libaom_test::kTwoPassGood), - ::testing::Range(0, 1)); -} // namespace diff --git a/third_party/aom/test/av1_fwd_txfm1d_test.cc b/third_party/aom/test/av1_fwd_txfm1d_test.cc deleted file mode 100644 index 49a666879..000000000 --- a/third_party/aom/test/av1_fwd_txfm1d_test.cc +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "av1/encoder/av1_fwd_txfm1d.h" -#include "test/av1_txfm_test.h" - -using libaom_test::ACMRandom; -using libaom_test::TYPE_ADST; -using libaom_test::TYPE_DCT; -using libaom_test::TYPE_IDTX; -using libaom_test::TYPE_TXFM; -using libaom_test::input_base; -using libaom_test::reference_hybrid_1d; - -namespace { -const int txfm_type_num = 3; -const TYPE_TXFM txfm_type_ls[txfm_type_num] = { TYPE_DCT, TYPE_ADST, - TYPE_IDTX }; - -const int txfm_size_num = 5; - -const int txfm_size_ls[] = { 4, 8, 16, 32, 64 }; - -const TxfmFunc fwd_txfm_func_ls[][txfm_type_num] = { - { av1_fdct4_new, av1_fadst4_new, av1_fidentity4_c }, - { av1_fdct8_new, av1_fadst8_new, av1_fidentity8_c }, - { av1_fdct16_new, av1_fadst16_new, av1_fidentity16_c }, - { av1_fdct32_new, NULL, av1_fidentity32_c }, - { av1_fdct64_new, NULL, NULL }, -}; - -// the maximum stage number of fwd/inv 1d dct/adst txfm is 12 -const int8_t cos_bit = 14; -const int8_t range_bit[12] = { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 }; - -TEST(av1_fwd_txfm1d, round_shift) { - EXPECT_EQ(round_shift(7, 1), 4); - EXPECT_EQ(round_shift(-7, 1), -3); - - EXPECT_EQ(round_shift(7, 2), 2); - EXPECT_EQ(round_shift(-7, 2), -2); - - EXPECT_EQ(round_shift(8, 2), 2); - EXPECT_EQ(round_shift(-8, 2), -2); -} - -TEST(av1_fwd_txfm1d, av1_cospi_arr_data) { - for (int i = 0; i < 7; i++) { - for (int j = 0; j < 64; j++) { - EXPECT_EQ(av1_cospi_arr_data[i][j], - (int32_t)round(cos(M_PI * j / 128) * (1 << (cos_bit_min + i)))); - } - } -} - -TEST(av1_fwd_txfm1d, accuracy) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int si = 0; si < txfm_size_num; ++si) { - int txfm_size = txfm_size_ls[si]; - int32_t *input = new int32_t[txfm_size]; - int32_t *output = new int32_t[txfm_size]; - double *ref_input = new double[txfm_size]; - double *ref_output = new double[txfm_size]; - - for (int ti = 0; ti < txfm_type_num; ++ti) { - TYPE_TXFM txfm_type = txfm_type_ls[ti]; - TxfmFunc fwd_txfm_func = fwd_txfm_func_ls[si][ti]; - int max_error = 7; - - const int count_test_block = 5000; - if (fwd_txfm_func != NULL) { - for (int ti = 0; ti < count_test_block; ++ti) { - for (int ni = 0; ni < txfm_size; ++ni) { - input[ni] = rnd.Rand16() % input_base - rnd.Rand16() % input_base; - ref_input[ni] = static_cast<double>(input[ni]); - } - - fwd_txfm_func(input, output, cos_bit, range_bit); - reference_hybrid_1d(ref_input, ref_output, txfm_size, txfm_type); - - for (int ni = 0; ni < txfm_size; ++ni) { - ASSERT_LE( - abs(output[ni] - static_cast<int32_t>(round(ref_output[ni]))), - max_error) - << "tx size = " << txfm_size << ", tx type = " << txfm_type; - } - } - } - } - - delete[] input; - delete[] output; - delete[] ref_input; - delete[] ref_output; - } -} -} // namespace diff --git a/third_party/aom/test/av1_fwd_txfm2d_test.cc b/third_party/aom/test/av1_fwd_txfm2d_test.cc deleted file mode 100644 index 75f20536b..000000000 --- a/third_party/aom/test/av1_fwd_txfm2d_test.cc +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <vector> - -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/util.h" -#include "test/av1_txfm_test.h" -#include "av1/common/av1_txfm.h" -#include "av1/encoder/hybrid_fwd_txfm.h" - -using libaom_test::ACMRandom; -using libaom_test::TYPE_TXFM; -using libaom_test::bd; -using libaom_test::compute_avg_abs_error; -using libaom_test::input_base; - -using std::vector; - -namespace { -// tx_type_, tx_size_, max_error_, max_avg_error_ -typedef ::testing::tuple<TX_TYPE, TX_SIZE, double, double> AV1FwdTxfm2dParam; - -class AV1FwdTxfm2d : public ::testing::TestWithParam<AV1FwdTxfm2dParam> { - public: - virtual void SetUp() { - tx_type_ = GET_PARAM(0); - tx_size_ = GET_PARAM(1); - max_error_ = GET_PARAM(2); - max_avg_error_ = GET_PARAM(3); - count_ = 500; - TXFM_2D_FLIP_CFG fwd_txfm_flip_cfg; - av1_get_fwd_txfm_cfg(tx_type_, tx_size_, &fwd_txfm_flip_cfg); - amplify_factor_ = libaom_test::get_amplification_factor(tx_type_, tx_size_); - tx_width_ = tx_size_wide[fwd_txfm_flip_cfg.tx_size]; - tx_height_ = tx_size_high[fwd_txfm_flip_cfg.tx_size]; - ud_flip_ = fwd_txfm_flip_cfg.ud_flip; - lr_flip_ = fwd_txfm_flip_cfg.lr_flip; - - fwd_txfm_ = libaom_test::fwd_txfm_func_ls[tx_size_]; - txfm2d_size_ = tx_width_ * tx_height_; - input_ = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(input_[0]) * txfm2d_size_)); - output_ = reinterpret_cast<int32_t *>( - aom_memalign(16, sizeof(output_[0]) * txfm2d_size_)); - ref_input_ = reinterpret_cast<double *>( - aom_memalign(16, sizeof(ref_input_[0]) * txfm2d_size_)); - ref_output_ = reinterpret_cast<double *>( - aom_memalign(16, sizeof(ref_output_[0]) * txfm2d_size_)); - } - - void RunFwdAccuracyCheck() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - double avg_abs_error = 0; - for (int ci = 0; ci < count_; ci++) { - for (int ni = 0; ni < txfm2d_size_; ++ni) { - input_[ni] = rnd.Rand16() % input_base; - ref_input_[ni] = static_cast<double>(input_[ni]); - output_[ni] = 0; - ref_output_[ni] = 0; - } - - fwd_txfm_(input_, output_, tx_width_, tx_type_, bd); - - if (lr_flip_ && ud_flip_) { - libaom_test::fliplrud(ref_input_, tx_width_, tx_height_, tx_width_); - } else if (lr_flip_) { - libaom_test::fliplr(ref_input_, tx_width_, tx_height_, tx_width_); - } else if (ud_flip_) { - libaom_test::flipud(ref_input_, tx_width_, tx_height_, tx_width_); - } - - libaom_test::reference_hybrid_2d(ref_input_, ref_output_, tx_type_, - tx_size_); - - double actual_max_error = 0; - for (int ni = 0; ni < txfm2d_size_; ++ni) { - ref_output_[ni] = round(ref_output_[ni]); - const double this_error = - fabs(output_[ni] - ref_output_[ni]) / amplify_factor_; - actual_max_error = AOMMAX(actual_max_error, this_error); - } - EXPECT_GE(max_error_, actual_max_error) - << "tx_size = " << tx_size_ << ", tx_type = " << tx_type_; - if (actual_max_error > max_error_) { // exit early. - break; - } - - avg_abs_error += compute_avg_abs_error<int32_t, double>( - output_, ref_output_, txfm2d_size_); - } - - avg_abs_error /= amplify_factor_; - avg_abs_error /= count_; - EXPECT_GE(max_avg_error_, avg_abs_error) - << "tx_size = " << tx_size_ << ", tx_type = " << tx_type_; - } - - virtual void TearDown() { - aom_free(input_); - aom_free(output_); - aom_free(ref_input_); - aom_free(ref_output_); - } - - private: - double max_error_; - double max_avg_error_; - int count_; - double amplify_factor_; - TX_TYPE tx_type_; - TX_SIZE tx_size_; - int tx_width_; - int tx_height_; - int txfm2d_size_; - FwdTxfm2dFunc fwd_txfm_; - int16_t *input_; - int32_t *output_; - double *ref_input_; - double *ref_output_; - int ud_flip_; // flip upside down - int lr_flip_; // flip left to right -}; - -static double avg_error_ls[TX_SIZES_ALL] = { - 0.5, // 4x4 transform - 0.5, // 8x8 transform - 1.2, // 16x16 transform - 6.1, // 32x32 transform - 3.4, // 64x64 transform - 0.57, // 4x8 transform - 0.68, // 8x4 transform - 0.92, // 8x16 transform - 1.1, // 16x8 transform - 4.1, // 16x32 transform - 6, // 32x16 transform - 3.5, // 32x64 transform - 5.7, // 64x32 transform - 0.6, // 4x16 transform - 0.9, // 16x4 transform - 1.2, // 8x32 transform - 1.7, // 32x8 transform - 2.0, // 16x64 transform - 4.7, // 64x16 transform -}; - -static double max_error_ls[TX_SIZES_ALL] = { - 3, // 4x4 transform - 5, // 8x8 transform - 11, // 16x16 transform - 70, // 32x32 transform - 64, // 64x64 transform - 3.9, // 4x8 transform - 4.3, // 8x4 transform - 12, // 8x16 transform - 12, // 16x8 transform - 32, // 16x32 transform - 46, // 32x16 transform - 136, // 32x64 transform - 136, // 64x32 transform - 5, // 4x16 transform - 6, // 16x4 transform - 21, // 8x32 transform - 13, // 32x8 transform - 30, // 16x64 transform - 36, // 64x16 transform -}; - -vector<AV1FwdTxfm2dParam> GetTxfm2dParamList() { - vector<AV1FwdTxfm2dParam> param_list; - for (int s = 0; s < TX_SIZES; ++s) { - const double max_error = max_error_ls[s]; - const double avg_error = avg_error_ls[s]; - for (int t = 0; t < TX_TYPES; ++t) { - const TX_TYPE tx_type = static_cast<TX_TYPE>(t); - const TX_SIZE tx_size = static_cast<TX_SIZE>(s); - if (libaom_test::IsTxSizeTypeValid(tx_size, tx_type)) { - param_list.push_back( - AV1FwdTxfm2dParam(tx_type, tx_size, max_error, avg_error)); - } - } - } - return param_list; -} - -INSTANTIATE_TEST_CASE_P(C, AV1FwdTxfm2d, - ::testing::ValuesIn(GetTxfm2dParamList())); - -TEST_P(AV1FwdTxfm2d, RunFwdAccuracyCheck) { RunFwdAccuracyCheck(); } - -TEST(AV1FwdTxfm2d, CfgTest) { - for (int bd_idx = 0; bd_idx < BD_NUM; ++bd_idx) { - int bd = libaom_test::bd_arr[bd_idx]; - int8_t low_range = libaom_test::low_range_arr[bd_idx]; - int8_t high_range = libaom_test::high_range_arr[bd_idx]; - for (int tx_size = 0; tx_size < TX_SIZES_ALL; ++tx_size) { - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(tx_size), - static_cast<TX_TYPE>(tx_type)) == - false) { - continue; - } - TXFM_2D_FLIP_CFG cfg; - av1_get_fwd_txfm_cfg(static_cast<TX_TYPE>(tx_type), - static_cast<TX_SIZE>(tx_size), &cfg); - int8_t stage_range_col[MAX_TXFM_STAGE_NUM]; - int8_t stage_range_row[MAX_TXFM_STAGE_NUM]; - av1_gen_fwd_stage_range(stage_range_col, stage_range_row, &cfg, bd); - libaom_test::txfm_stage_range_check(stage_range_col, cfg.stage_num_col, - cfg.cos_bit_col, low_range, - high_range); - libaom_test::txfm_stage_range_check(stage_range_row, cfg.stage_num_row, - cfg.cos_bit_row, low_range, - high_range); - } - } - } -} - -typedef void (*lowbd_fwd_txfm_func)(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param); - -void AV1FwdTxfm2dMatchTest(TX_SIZE tx_size, lowbd_fwd_txfm_func target_func) { - const int bd = 8; - TxfmParam param; - memset(¶m, 0, sizeof(param)); - const int rows = tx_size_high[tx_size]; - const int cols = tx_size_wide[tx_size]; - // printf("%d x %d\n", cols, rows); - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid( - tx_size, static_cast<TX_TYPE>(tx_type)) == false) { - continue; - } - - FwdTxfm2dFunc ref_func = libaom_test::fwd_txfm_func_ls[tx_size]; - if (ref_func != NULL) { - DECLARE_ALIGNED(32, int16_t, input[64 * 64]) = { 0 }; - DECLARE_ALIGNED(32, int32_t, output[64 * 64]); - DECLARE_ALIGNED(32, int32_t, ref_output[64 * 64]); - int input_stride = 64; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int cnt = 0; cnt < 500; ++cnt) { - if (cnt == 0) { - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - input[r * input_stride + c] = (1 << bd) - 1; - } - } - } else { - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - input[r * input_stride + c] = rnd.Rand16() % (1 << bd); - } - } - } - param.tx_type = (TX_TYPE)tx_type; - param.tx_size = (TX_SIZE)tx_size; - param.tx_set_type = EXT_TX_SET_ALL16; - param.bd = bd; - ref_func(input, ref_output, input_stride, (TX_TYPE)tx_type, bd); - target_func(input, output, input_stride, ¶m); - const int check_rows = AOMMIN(32, rows); - const int check_cols = AOMMIN(32, rows * cols / check_rows); - for (int r = 0; r < check_rows; ++r) { - for (int c = 0; c < check_cols; ++c) { - ASSERT_EQ(ref_output[r * check_cols + c], - output[r * check_cols + c]) - << "[" << r << "," << c << "] cnt:" << cnt - << " tx_size: " << tx_size << " tx_type: " << tx_type; - } - } - } - } - } -} - -typedef ::testing::tuple<TX_SIZE, lowbd_fwd_txfm_func> LbdFwdTxfm2dParam; - -class AV1FwdTxfm2dTest : public ::testing::TestWithParam<LbdFwdTxfm2dParam> {}; - -TEST_P(AV1FwdTxfm2dTest, match) { - AV1FwdTxfm2dMatchTest(GET_PARAM(0), GET_PARAM(1)); -} - -using ::testing::Combine; -using ::testing::Values; -using ::testing::ValuesIn; - -#if HAVE_SSE2 -static TX_SIZE fwd_txfm_for_sse2[] = { - TX_4X4, - TX_8X8, - TX_16X16, - TX_32X32, - // TX_64X64, - TX_4X8, - TX_8X4, - TX_8X16, - TX_16X8, - TX_16X32, - TX_32X16, - // TX_32X64, - // TX_64X32, - TX_4X16, - TX_16X4, - TX_8X32, - TX_32X8, - TX_16X64, - TX_64X16, -}; - -INSTANTIATE_TEST_CASE_P(SSE2, AV1FwdTxfm2dTest, - Combine(ValuesIn(fwd_txfm_for_sse2), - Values(av1_lowbd_fwd_txfm_sse2))); -#endif // HAVE_SSE2 - -#if HAVE_SSE4_1 -static TX_SIZE fwd_txfm_for_sse41[] = { - TX_4X4, - TX_64X64, - TX_32X64, - TX_64X32, -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1FwdTxfm2dTest, - Combine(ValuesIn(fwd_txfm_for_sse41), - Values(av1_lowbd_fwd_txfm_sse4_1))); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -static TX_SIZE fwd_txfm_for_avx2[] = { - TX_4X4, TX_8X8, TX_16X16, TX_32X32, TX_64X64, TX_4X8, TX_8X4, - TX_8X16, TX_16X8, TX_16X32, TX_32X16, TX_32X64, TX_64X32, TX_4X16, - TX_16X4, TX_8X32, TX_32X8, TX_16X64, TX_64X16, -}; - -INSTANTIATE_TEST_CASE_P(AVX2, AV1FwdTxfm2dTest, - Combine(ValuesIn(fwd_txfm_for_avx2), - Values(av1_lowbd_fwd_txfm_avx2))); -#endif // HAVE_AVX2 - -typedef void (*Highbd_fwd_txfm_func)(const int16_t *src_diff, tran_low_t *coeff, - int diff_stride, TxfmParam *txfm_param); - -void AV1HighbdFwdTxfm2dMatchTest(TX_SIZE tx_size, - Highbd_fwd_txfm_func target_func) { - const int bd_ar[2] = { 10, 12 }; - TxfmParam param; - memset(¶m, 0, sizeof(param)); - const int rows = tx_size_high[tx_size]; - const int cols = tx_size_wide[tx_size]; - for (int i = 0; i < 2; ++i) { - const int bd = bd_ar[i]; - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid( - tx_size, static_cast<TX_TYPE>(tx_type)) == false) { - continue; - } - - FwdTxfm2dFunc ref_func = libaom_test::fwd_txfm_func_ls[tx_size]; - if (ref_func != NULL) { - DECLARE_ALIGNED(32, int16_t, input[64 * 64]) = { 0 }; - DECLARE_ALIGNED(32, int32_t, output[64 * 64]); - DECLARE_ALIGNED(32, int32_t, ref_output[64 * 64]); - int input_stride = 64; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int cnt = 0; cnt < 500; ++cnt) { - if (cnt == 0) { - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - input[r * input_stride + c] = (1 << bd) - 1; - } - } - } else { - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - input[r * input_stride + c] = rnd.Rand16() % (1 << bd); - } - } - } - param.tx_type = (TX_TYPE)tx_type; - param.tx_size = (TX_SIZE)tx_size; - param.tx_set_type = EXT_TX_SET_ALL16; - param.bd = bd; - - ref_func(input, ref_output, input_stride, (TX_TYPE)tx_type, bd); - target_func(input, output, input_stride, ¶m); - const int check_rows = AOMMIN(32, rows); - const int check_cols = AOMMIN(32, rows * cols / check_rows); - for (int r = 0; r < check_rows; ++r) { - for (int c = 0; c < check_cols; ++c) { - ASSERT_EQ(ref_output[r * check_cols + c], - output[r * check_cols + c]) - << "[" << r << "," << c << "] cnt:" << cnt - << " tx_size: " << tx_size << " tx_type: " << tx_type; - } - } - } - } - } - } -} - -void AV1HighbdFwdTxfm2dSpeedTest(TX_SIZE tx_size, - Highbd_fwd_txfm_func target_func) { - const int bd_ar[2] = { 10, 12 }; - TxfmParam param; - memset(¶m, 0, sizeof(param)); - const int rows = tx_size_high[tx_size]; - const int cols = tx_size_wide[tx_size]; - const int num_loops = 1000000 / (rows * cols); - - for (int i = 0; i < 2; ++i) { - const int bd = bd_ar[i]; - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid( - tx_size, static_cast<TX_TYPE>(tx_type)) == false) { - continue; - } - - FwdTxfm2dFunc ref_func = libaom_test::fwd_txfm_func_ls[tx_size]; - if (ref_func != NULL) { - DECLARE_ALIGNED(32, int16_t, input[64 * 64]) = { 0 }; - DECLARE_ALIGNED(32, int32_t, output[64 * 64]); - DECLARE_ALIGNED(32, int32_t, ref_output[64 * 64]); - int input_stride = 64; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - input[r * input_stride + c] = rnd.Rand16() % (1 << bd); - } - } - - param.tx_type = (TX_TYPE)tx_type; - param.tx_size = (TX_SIZE)tx_size; - param.tx_set_type = EXT_TX_SET_ALL16; - param.bd = bd; - - aom_usec_timer ref_timer, test_timer; - - aom_usec_timer_start(&ref_timer); - for (int i = 0; i < num_loops; ++i) { - ref_func(input, ref_output, input_stride, (TX_TYPE)tx_type, bd); - } - aom_usec_timer_mark(&ref_timer); - const int elapsed_time_c = - static_cast<int>(aom_usec_timer_elapsed(&ref_timer)); - - aom_usec_timer_start(&test_timer); - for (int i = 0; i < num_loops; ++i) { - target_func(input, output, input_stride, ¶m); - } - aom_usec_timer_mark(&test_timer); - const int elapsed_time_simd = - static_cast<int>(aom_usec_timer_elapsed(&test_timer)); - - printf( - "txfm_size[%d] \t txfm_type[%d] \t c_time=%d \t simd_time=%d \t " - "gain=%d \n", - tx_size, tx_type, elapsed_time_c, elapsed_time_simd, - (elapsed_time_c / elapsed_time_simd)); - } - } - } -} - -typedef ::testing::tuple<TX_SIZE, Highbd_fwd_txfm_func> HighbdFwdTxfm2dParam; - -class AV1HighbdFwdTxfm2dTest - : public ::testing::TestWithParam<HighbdFwdTxfm2dParam> {}; - -TEST_P(AV1HighbdFwdTxfm2dTest, match) { - AV1HighbdFwdTxfm2dMatchTest(GET_PARAM(0), GET_PARAM(1)); -} - -TEST_P(AV1HighbdFwdTxfm2dTest, DISABLED_Speed) { - AV1HighbdFwdTxfm2dSpeedTest(GET_PARAM(0), GET_PARAM(1)); -} - -using ::testing::Combine; -using ::testing::Values; -using ::testing::ValuesIn; - -#if HAVE_SSE4_1 -static TX_SIZE Highbd_fwd_txfm_for_sse4_1[] = { - TX_4X4, TX_8X8, TX_16X16, TX_32X32, TX_64X64, TX_4X8, TX_8X4, - TX_8X16, TX_16X8, TX_16X32, TX_32X16, TX_32X64, TX_64X32, TX_4X16, - TX_16X4, TX_8X32, TX_32X8, TX_16X64, TX_64X16, -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1HighbdFwdTxfm2dTest, - Combine(ValuesIn(Highbd_fwd_txfm_for_sse4_1), - Values(av1_highbd_fwd_txfm))); -#endif // HAVE_SSE4_1 - -} // namespace diff --git a/third_party/aom/test/av1_highbd_iht_test.cc b/third_party/aom/test/av1_highbd_iht_test.cc deleted file mode 100644 index 2d6490c2a..000000000 --- a/third_party/aom/test/av1_highbd_iht_test.cc +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/av1_txfm_test.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/enums.h" -#include "av1/common/scan.h" -#include "aom_dsp/aom_dsp_common.h" -#include "aom_ports/mem.h" - -namespace { - -using ::testing::tuple; -using libaom_test::ACMRandom; - -typedef void (*HbdHtFunc)(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd); - -typedef void (*IHbdHtFunc)(const int32_t *coeff, uint16_t *output, int stride, - TX_TYPE tx_type, int bd); - -// Test parameter argument list: -// <transform reference function, -// optimized inverse transform function, -// inverse transform reference function, -// num_coeffs, -// tx_type, -// bit_depth> -typedef tuple<HbdHtFunc, IHbdHtFunc, IHbdHtFunc, int, TX_TYPE, int> IHbdHtParam; - -class AV1HighbdInvHTNxN : public ::testing::TestWithParam<IHbdHtParam> { - public: - virtual ~AV1HighbdInvHTNxN() {} - - virtual void SetUp() { - txfm_ref_ = GET_PARAM(0); - inv_txfm_ = GET_PARAM(1); - inv_txfm_ref_ = GET_PARAM(2); - num_coeffs_ = GET_PARAM(3); - tx_type_ = GET_PARAM(4); - bit_depth_ = GET_PARAM(5); - - input_ = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(input_[0]) * num_coeffs_)); - - // Note: - // Inverse transform input buffer is 32-byte aligned - // Refer to <root>/av1/encoder/context_tree.c, function, - // void alloc_mode_context(). - coeffs_ = reinterpret_cast<int32_t *>( - aom_memalign(32, sizeof(coeffs_[0]) * num_coeffs_)); - output_ = reinterpret_cast<uint16_t *>( - aom_memalign(32, sizeof(output_[0]) * num_coeffs_)); - output_ref_ = reinterpret_cast<uint16_t *>( - aom_memalign(32, sizeof(output_ref_[0]) * num_coeffs_)); - } - - virtual void TearDown() { - aom_free(input_); - aom_free(coeffs_); - aom_free(output_); - aom_free(output_ref_); - libaom_test::ClearSystemState(); - } - - protected: - void RunBitexactCheck(); - - private: - int GetStride() const { - if (16 == num_coeffs_) { - return 4; - } else if (64 == num_coeffs_) { - return 8; - } else if (256 == num_coeffs_) { - return 16; - } else if (1024 == num_coeffs_) { - return 32; - } else if (4096 == num_coeffs_) { - return 64; - } else { - return 0; - } - } - - HbdHtFunc txfm_ref_; - IHbdHtFunc inv_txfm_; - IHbdHtFunc inv_txfm_ref_; - int num_coeffs_; - TX_TYPE tx_type_; - int bit_depth_; - - int16_t *input_; - int32_t *coeffs_; - uint16_t *output_; - uint16_t *output_ref_; -}; - -void AV1HighbdInvHTNxN::RunBitexactCheck() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int stride = GetStride(); - const int num_tests = 20000; - const uint16_t mask = (1 << bit_depth_) - 1; - - for (int i = 0; i < num_tests; ++i) { - for (int j = 0; j < num_coeffs_; ++j) { - input_[j] = (rnd.Rand16() & mask) - (rnd.Rand16() & mask); - output_ref_[j] = rnd.Rand16() & mask; - output_[j] = output_ref_[j]; - } - - txfm_ref_(input_, coeffs_, stride, tx_type_, bit_depth_); - inv_txfm_ref_(coeffs_, output_ref_, stride, tx_type_, bit_depth_); - ASM_REGISTER_STATE_CHECK( - inv_txfm_(coeffs_, output_, stride, tx_type_, bit_depth_)); - - for (int j = 0; j < num_coeffs_; ++j) { - EXPECT_EQ(output_ref_[j], output_[j]) - << "Not bit-exact result at index: " << j << " At test block: " << i; - } - } -} - -TEST_P(AV1HighbdInvHTNxN, InvTransResultCheck) { RunBitexactCheck(); } - -using ::testing::make_tuple; - -#if HAVE_SSE4_1 -#define PARAM_LIST_4X4 \ - &av1_fwd_txfm2d_4x4_c, &av1_inv_txfm2d_add_4x4_sse4_1, \ - &av1_inv_txfm2d_add_4x4_c, 16 - -const IHbdHtParam kArrayIhtParam[] = { - // 4x4 - make_tuple(PARAM_LIST_4X4, DCT_DCT, 10), - make_tuple(PARAM_LIST_4X4, DCT_DCT, 12), - make_tuple(PARAM_LIST_4X4, ADST_DCT, 10), - make_tuple(PARAM_LIST_4X4, ADST_DCT, 12), - make_tuple(PARAM_LIST_4X4, DCT_ADST, 10), - make_tuple(PARAM_LIST_4X4, DCT_ADST, 12), - make_tuple(PARAM_LIST_4X4, ADST_ADST, 10), - make_tuple(PARAM_LIST_4X4, ADST_ADST, 12), - make_tuple(PARAM_LIST_4X4, FLIPADST_DCT, 10), - make_tuple(PARAM_LIST_4X4, FLIPADST_DCT, 12), - make_tuple(PARAM_LIST_4X4, DCT_FLIPADST, 10), - make_tuple(PARAM_LIST_4X4, DCT_FLIPADST, 12), - make_tuple(PARAM_LIST_4X4, FLIPADST_FLIPADST, 10), - make_tuple(PARAM_LIST_4X4, FLIPADST_FLIPADST, 12), - make_tuple(PARAM_LIST_4X4, ADST_FLIPADST, 10), - make_tuple(PARAM_LIST_4X4, ADST_FLIPADST, 12), - make_tuple(PARAM_LIST_4X4, FLIPADST_ADST, 10), - make_tuple(PARAM_LIST_4X4, FLIPADST_ADST, 12), -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1HighbdInvHTNxN, - ::testing::ValuesIn(kArrayIhtParam)); -#endif // HAVE_SSE4_1 - -typedef void (*HighbdInvTxfm2dFunc)(const int32_t *input, uint8_t *output, - int stride, const TxfmParam *txfm_param); - -typedef ::testing::tuple<const HighbdInvTxfm2dFunc> AV1HighbdInvTxfm2dParam; -class AV1HighbdInvTxfm2d - : public ::testing::TestWithParam<AV1HighbdInvTxfm2dParam> { - public: - virtual void SetUp() { target_func_ = GET_PARAM(0); } - void RunAV1InvTxfm2dTest(TX_TYPE tx_type, TX_SIZE tx_size, int run_times, - int bit_depth); - - private: - HighbdInvTxfm2dFunc target_func_; -}; - -void AV1HighbdInvTxfm2d::RunAV1InvTxfm2dTest(TX_TYPE tx_type_, TX_SIZE tx_size_, - int run_times, int bit_depth_) { - FwdTxfm2dFunc fwd_func_ = libaom_test::fwd_txfm_func_ls[tx_size_]; - TxfmParam txfm_param; - const int BLK_WIDTH = 64; - const int BLK_SIZE = BLK_WIDTH * BLK_WIDTH; - DECLARE_ALIGNED(16, int16_t, input[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(32, int32_t, inv_input[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(32, uint16_t, output[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(32, uint16_t, ref_output[BLK_SIZE]) = { 0 }; - int stride = BLK_WIDTH; - int rows = tx_size_high[tx_size_]; - int cols = tx_size_wide[tx_size_]; - const int rows_nonezero = AOMMIN(32, rows); - const int cols_nonezero = AOMMIN(32, cols); - const uint16_t mask = (1 << bit_depth_) - 1; - run_times /= (rows * cols); - run_times = AOMMAX(1, run_times); - const SCAN_ORDER *scan_order = get_default_scan(tx_size_, tx_type_); - const int16_t *scan = scan_order->scan; - const int16_t eobmax = rows_nonezero * cols_nonezero; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - int randTimes = run_times == 1 ? (eobmax) : 1; - - txfm_param.tx_type = tx_type_; - txfm_param.tx_size = tx_size_; - txfm_param.lossless = 0; - txfm_param.bd = bit_depth_; - txfm_param.is_hbd = 1; - txfm_param.tx_set_type = EXT_TX_SET_ALL16; - - for (int cnt = 0; cnt < randTimes; ++cnt) { - for (int r = 0; r < BLK_WIDTH; ++r) { - for (int c = 0; c < BLK_WIDTH; ++c) { - input[r * cols + c] = (rnd.Rand16() & mask) - (rnd.Rand16() & mask); - output[r * stride + c] = rnd.Rand16() & mask; - - ref_output[r * stride + c] = output[r * stride + c]; - } - } - fwd_func_(input, inv_input, stride, tx_type_, bit_depth_); - - // produce eob input by setting high freq coeffs to zero - const int eob = AOMMIN(cnt + 1, eobmax); - for (int i = eob; i < eobmax; i++) { - inv_input[scan[i]] = 0; - } - txfm_param.eob = eob; - aom_usec_timer ref_timer, test_timer; - - aom_usec_timer_start(&ref_timer); - for (int i = 0; i < run_times; ++i) { - av1_highbd_inv_txfm_add_c(inv_input, CONVERT_TO_BYTEPTR(ref_output), - stride, &txfm_param); - } - aom_usec_timer_mark(&ref_timer); - const int elapsed_time_c = - static_cast<int>(aom_usec_timer_elapsed(&ref_timer)); - - aom_usec_timer_start(&test_timer); - for (int i = 0; i < run_times; ++i) { - target_func_(inv_input, CONVERT_TO_BYTEPTR(output), stride, &txfm_param); - } - aom_usec_timer_mark(&test_timer); - const int elapsed_time_simd = - static_cast<int>(aom_usec_timer_elapsed(&test_timer)); - if (run_times > 10) { - printf( - "txfm_size[%d] \t txfm_type[%d] \t c_time=%d \t simd_time=%d \t " - "gain=%d \n", - tx_size_, tx_type_, elapsed_time_c, elapsed_time_simd, - (elapsed_time_c / elapsed_time_simd)); - } else { - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - ASSERT_EQ(ref_output[r * stride + c], output[r * stride + c]) - << "[" << r << "," << c << "] " << cnt - << " tx_size: " << static_cast<int>(tx_size_) - << " tx_type: " << tx_type_ << " eob " << eob; - } - } - } - } -} - -TEST_P(AV1HighbdInvTxfm2d, match) { - int bitdepth_ar[2] = { 10, 12 }; - for (int k = 0; k < 2; ++k) { - int bd = bitdepth_ar[k]; - for (int j = 0; j < (int)(TX_SIZES_ALL); ++j) { - for (int i = 0; i < (int)TX_TYPES; ++i) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(j), - static_cast<TX_TYPE>(i))) { - RunAV1InvTxfm2dTest(static_cast<TX_TYPE>(i), static_cast<TX_SIZE>(j), - 1, bd); - } - } - } - } -} - -TEST_P(AV1HighbdInvTxfm2d, DISABLED_Speed) { - int bitdepth_ar[2] = { 10, 12 }; - for (int k = 0; k < 2; ++k) { - int bd = bitdepth_ar[k]; - for (int j = 0; j < (int)(TX_SIZES_ALL); ++j) { - for (int i = 0; i < (int)TX_TYPES; ++i) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(j), - static_cast<TX_TYPE>(i))) { - RunAV1InvTxfm2dTest(static_cast<TX_TYPE>(i), static_cast<TX_SIZE>(j), - 1000000, bd); - } - } - } - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1HighbdInvTxfm2d, - ::testing::Values(av1_highbd_inv_txfm_add_sse4_1)); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AV1HighbdInvTxfm2d, - ::testing::Values(av1_highbd_inv_txfm_add_avx2)); -#endif -} // namespace diff --git a/third_party/aom/test/av1_horz_only_frame_superres_test.cc b/third_party/aom/test/av1_horz_only_frame_superres_test.cc deleted file mode 100644 index fd77ef35d..000000000 --- a/third_party/aom/test/av1_horz_only_frame_superres_test.cc +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <vector> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/convolve.h" -#include "av1/common/resize.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -namespace { -const int kTestIters = 10; -const int kPerfIters = 1000; - -const int kVPad = 32; -const int kHPad = 32; - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; - -template <typename Pixel> -class TestImage { - public: - TestImage(int w_src, int h, int superres_denom, int x0, int bd) - : w_src_(w_src), h_(h), superres_denom_(superres_denom), x0_(x0), - bd_(bd) { - assert(bd < 16); - assert(bd <= 8 * static_cast<int>(sizeof(Pixel))); - assert(9 <= superres_denom && superres_denom <= 16); - assert(SCALE_NUMERATOR == 8); - assert(0 <= x0_ && x0_ <= RS_SCALE_SUBPEL_MASK); - - w_dst_ = w_src_; - av1_calculate_unscaled_superres_size(&w_dst_, NULL, superres_denom); - - src_stride_ = ALIGN_POWER_OF_TWO(w_src_ + 2 * kHPad, 4); - dst_stride_ = ALIGN_POWER_OF_TWO(w_dst_ + 2 * kHPad, 4); - - // Allocate image data - src_data_.resize(2 * src_block_size()); - dst_data_.resize(2 * dst_block_size()); - } - - void Initialize(ACMRandom *rnd); - void Check() const; - - int src_stride() const { return src_stride_; } - int dst_stride() const { return dst_stride_; } - - int src_block_size() const { return (h_ + 2 * kVPad) * src_stride(); } - int dst_block_size() const { return (h_ + 2 * kVPad) * dst_stride(); } - - int src_width() const { return w_src_; } - int dst_width() const { return w_dst_; } - int height() const { return h_; } - int x0() const { return x0_; } - - const Pixel *GetSrcData(bool ref, bool borders) const { - const Pixel *block = &src_data_[ref ? 0 : src_block_size()]; - return borders ? block : block + kHPad + src_stride_ * kVPad; - } - - Pixel *GetDstData(bool ref, bool borders) { - Pixel *block = &dst_data_[ref ? 0 : dst_block_size()]; - return borders ? block : block + kHPad + dst_stride_ * kVPad; - } - - private: - int w_src_, w_dst_, h_, superres_denom_, x0_, bd_; - int src_stride_, dst_stride_; - - std::vector<Pixel> src_data_; - std::vector<Pixel> dst_data_; -}; - -template <typename Pixel> -void FillEdge(ACMRandom *rnd, int num_pixels, int bd, bool trash, Pixel *data) { - if (!trash) { - memset(data, 0, sizeof(*data) * num_pixels); - return; - } - const Pixel mask = (1 << bd) - 1; - for (int i = 0; i < num_pixels; ++i) data[i] = rnd->Rand16() & mask; -} - -template <typename Pixel> -void PrepBuffers(ACMRandom *rnd, int w, int h, int stride, int bd, - bool trash_edges, Pixel *data) { - assert(rnd); - const Pixel mask = (1 << bd) - 1; - - // Fill in the first buffer with random data - // Top border - FillEdge(rnd, stride * kVPad, bd, trash_edges, data); - for (int r = 0; r < h; ++r) { - Pixel *row_data = data + (kVPad + r) * stride; - // Left border, contents, right border - FillEdge(rnd, kHPad, bd, trash_edges, row_data); - for (int c = 0; c < w; ++c) row_data[kHPad + c] = rnd->Rand16() & mask; - FillEdge(rnd, kHPad, bd, trash_edges, row_data + kHPad + w); - } - // Bottom border - FillEdge(rnd, stride * kVPad, bd, trash_edges, data + stride * (kVPad + h)); - - const int bpp = sizeof(*data); - const int block_elts = stride * (h + 2 * kVPad); - const int block_size = bpp * block_elts; - - // Now copy that to the second buffer - memcpy(data + block_elts, data, block_size); -} - -template <typename Pixel> -void TestImage<Pixel>::Initialize(ACMRandom *rnd) { - PrepBuffers(rnd, w_src_, h_, src_stride_, bd_, false, &src_data_[0]); - PrepBuffers(rnd, w_dst_, h_, dst_stride_, bd_, true, &dst_data_[0]); -} - -template <typename Pixel> -void TestImage<Pixel>::Check() const { - const int num_pixels = dst_block_size(); - const Pixel *ref_dst = &dst_data_[0]; - const Pixel *tst_dst = &dst_data_[num_pixels]; - - // If memcmp returns 0, there's nothing to do. - if (0 == memcmp(ref_dst, tst_dst, sizeof(*ref_dst) * num_pixels)) return; - - // Otherwise, iterate through the buffer looking for differences, *ignoring - // the edges* - const int stride = dst_stride_; - for (int r = kVPad; r < h_ + kVPad; ++r) { - for (int c = kVPad; c < w_dst_ + kHPad; ++c) { - const int32_t ref_value = ref_dst[r * stride + c]; - const int32_t tst_value = tst_dst[r * stride + c]; - - EXPECT_EQ(tst_value, ref_value) - << "Error at row: " << (r - kVPad) << ", col: " << (c - kHPad) - << ", superres_denom: " << superres_denom_ << ", height: " << h_ - << ", src_width: " << w_src_ << ", dst_width: " << w_dst_ - << ", x0: " << x0_; - } - } -} - -template <typename Pixel> -class ConvolveHorizRSTestBase : public ::testing::Test { - public: - ConvolveHorizRSTestBase() : image_(NULL) {} - virtual ~ConvolveHorizRSTestBase() {} - virtual void TearDown() { libaom_test::ClearSystemState(); } - - // Implemented by subclasses (SetUp depends on the parameters passed - // in and RunOne depends on the function to be tested. These can't - // be templated for low/high bit depths because they have different - // numbers of parameters) - virtual void SetUp() = 0; - virtual void RunOne(bool ref) = 0; - - protected: - void SetBitDepth(int bd) { bd_ = bd; } - - void CorrectnessTest() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int i = 0; i < kTestIters; ++i) { - for (int superres_denom = 9; superres_denom <= 16; superres_denom++) { - // Get a random height between 512 and 767 - int height = rnd.Rand8() + 512; - - // Get a random src width between 128 and 383 - int width_src = rnd.Rand8() + 128; - - // x0 is normally calculated by get_upscale_convolve_x0 in - // av1/common/resize.c. However, this test should work for - // any value of x0 between 0 and RS_SCALE_SUBPEL_MASK - // (inclusive), so we choose one at random. - int x0 = rnd.Rand16() % (RS_SCALE_SUBPEL_MASK + 1); - - image_ = - new TestImage<Pixel>(width_src, height, superres_denom, x0, bd_); - - Prep(&rnd); - RunOne(true); - RunOne(false); - image_->Check(); - - delete image_; - } - } - } - - void SpeedTest() { - // Pick some specific parameters to test - int height = 767; - int width_src = 129; - int superres_denom = 13; - int x0 = RS_SCALE_SUBPEL_MASK >> 1; - - image_ = new TestImage<Pixel>(width_src, height, superres_denom, x0, bd_); - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - Prep(&rnd); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (int i = 0; i < kPerfIters; ++i) RunOne(true); - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (int i = 0; i < kPerfIters; ++i) RunOne(false); - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: ConvolveHorizRSTest (Speed Test), SIMD slower than C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - } - - void Prep(ACMRandom *rnd) { - assert(rnd); - image_->Initialize(rnd); - } - - int bd_; - TestImage<Pixel> *image_; -}; - -typedef void (*LowBDConvolveHorizRsFunc)(const uint8_t *src, int src_stride, - uint8_t *dst, int dst_stride, int w, - int h, const int16_t *x_filters, - const int x0_qn, const int x_step_qn); - -// Test parameter list: -// <tst_fun_> -typedef tuple<LowBDConvolveHorizRsFunc> LowBDParams; - -class LowBDConvolveHorizRSTest - : public ConvolveHorizRSTestBase<uint8_t>, - public ::testing::WithParamInterface<LowBDParams> { - public: - virtual ~LowBDConvolveHorizRSTest() {} - - void SetUp() { - tst_fun_ = GET_PARAM(0); - const int bd = 8; - SetBitDepth(bd); - } - - void RunOne(bool ref) { - const uint8_t *src = image_->GetSrcData(ref, false); - uint8_t *dst = image_->GetDstData(ref, false); - const int src_stride = image_->src_stride(); - const int dst_stride = image_->dst_stride(); - const int width_src = image_->src_width(); - const int width_dst = image_->dst_width(); - const int height = image_->height(); - const int x0_qn = image_->x0(); - - const int32_t x_step_qn = - av1_get_upscale_convolve_step(width_src, width_dst); - - if (ref) { - av1_convolve_horiz_rs_c(src, src_stride, dst, dst_stride, width_dst, - height, &av1_resize_filter_normative[0][0], x0_qn, - x_step_qn); - } else { - tst_fun_(src, src_stride, dst, dst_stride, width_dst, height, - &av1_resize_filter_normative[0][0], x0_qn, x_step_qn); - } - } - - private: - LowBDConvolveHorizRsFunc tst_fun_; -}; - -TEST_P(LowBDConvolveHorizRSTest, Correctness) { CorrectnessTest(); } -TEST_P(LowBDConvolveHorizRSTest, DISABLED_Speed) { SpeedTest(); } - -INSTANTIATE_TEST_CASE_P(SSE4_1, LowBDConvolveHorizRSTest, - ::testing::Values(av1_convolve_horiz_rs_sse4_1)); - -typedef void (*HighBDConvolveHorizRsFunc)(const uint16_t *src, int src_stride, - uint16_t *dst, int dst_stride, int w, - int h, const int16_t *x_filters, - const int x0_qn, const int x_step_qn, - int bd); - -// Test parameter list: -// <tst_fun_, bd_> -typedef tuple<HighBDConvolveHorizRsFunc, int> HighBDParams; - -class HighBDConvolveHorizRSTest - : public ConvolveHorizRSTestBase<uint16_t>, - public ::testing::WithParamInterface<HighBDParams> { - public: - virtual ~HighBDConvolveHorizRSTest() {} - - void SetUp() { - tst_fun_ = GET_PARAM(0); - const int bd = GET_PARAM(1); - SetBitDepth(bd); - } - - void RunOne(bool ref) { - const uint16_t *src = image_->GetSrcData(ref, false); - uint16_t *dst = image_->GetDstData(ref, false); - const int src_stride = image_->src_stride(); - const int dst_stride = image_->dst_stride(); - const int width_src = image_->src_width(); - const int width_dst = image_->dst_width(); - const int height = image_->height(); - const int x0_qn = image_->x0(); - - const int32_t x_step_qn = - av1_get_upscale_convolve_step(width_src, width_dst); - - if (ref) { - av1_highbd_convolve_horiz_rs_c( - src, src_stride, dst, dst_stride, width_dst, height, - &av1_resize_filter_normative[0][0], x0_qn, x_step_qn, bd_); - } else { - tst_fun_(src, src_stride, dst, dst_stride, width_dst, height, - &av1_resize_filter_normative[0][0], x0_qn, x_step_qn, bd_); - } - } - - private: - HighBDConvolveHorizRsFunc tst_fun_; -}; - -const int kBDs[] = { 8, 10, 12 }; - -TEST_P(HighBDConvolveHorizRSTest, Correctness) { CorrectnessTest(); } -TEST_P(HighBDConvolveHorizRSTest, DISABLED_Speed) { SpeedTest(); } - -INSTANTIATE_TEST_CASE_P( - SSE4_1, HighBDConvolveHorizRSTest, - ::testing::Combine(::testing::Values(av1_highbd_convolve_horiz_rs_sse4_1), - ::testing::ValuesIn(kBDs))); - -} // namespace diff --git a/third_party/aom/test/av1_inv_txfm1d_test.cc b/third_party/aom/test/av1_inv_txfm1d_test.cc deleted file mode 100644 index bf3a44ed1..000000000 --- a/third_party/aom/test/av1_inv_txfm1d_test.cc +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> - -#include "test/av1_txfm_test.h" -#include "test/util.h" -#include "av1/common/av1_inv_txfm1d.h" -#include "av1/encoder/av1_fwd_txfm1d.h" - -using libaom_test::ACMRandom; -using libaom_test::input_base; - -namespace { -const int txfm_type_num = 2; -const int txfm_size_ls[] = { 4, 8, 16, 32, 64 }; - -const TxfmFunc fwd_txfm_func_ls[][txfm_type_num] = { - { av1_fdct4_new, av1_fadst4_new }, - { av1_fdct8_new, av1_fadst8_new }, - { av1_fdct16_new, av1_fadst16_new }, - { av1_fdct32_new, NULL }, - { av1_fdct64_new, NULL }, -}; - -const TxfmFunc inv_txfm_func_ls[][txfm_type_num] = { - { av1_idct4_new, av1_iadst4_new }, - { av1_idct8_new, av1_iadst8_new }, - { av1_idct16_new, av1_iadst16_new }, - { av1_idct32_new, NULL }, - { av1_idct64_new, NULL }, -}; - -// the maximum stage number of fwd/inv 1d dct/adst txfm is 12 -const int8_t cos_bit = 13; -const int8_t range_bit[12] = { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20 }; - -void reference_idct_1d_int(const int32_t *in, int32_t *out, int size) { - double input[64]; - for (int i = 0; i < size; ++i) input[i] = in[i]; - - double output[64]; - libaom_test::reference_idct_1d(input, output, size); - - for (int i = 0; i < size; ++i) { - ASSERT_GE(output[i], INT32_MIN); - ASSERT_LE(output[i], INT32_MAX); - out[i] = static_cast<int32_t>(round(output[i])); - } -} - -void random_matrix(int32_t *dst, int len, ACMRandom *rnd) { - const int bits = 16; - const int maxVal = (1 << (bits - 1)) - 1; - const int minVal = -(1 << (bits - 1)); - for (int i = 0; i < len; ++i) { - if (rnd->Rand8() % 10) - dst[i] = minVal + rnd->Rand16() % (1 << bits); - else - dst[i] = rnd->Rand8() % 2 ? minVal : maxVal; - } -} - -TEST(av1_inv_txfm1d, InvAccuracyCheck) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int count_test_block = 20000; - const int max_error[] = { 6, 10, 19, 31, 40 }; - ASSERT_EQ(NELEMENTS(max_error), TX_SIZES); - ASSERT_EQ(NELEMENTS(inv_txfm_func_ls), TX_SIZES); - for (int k = 0; k < count_test_block; ++k) { - // choose a random transform to test - const TX_SIZE tx_size = static_cast<TX_SIZE>(rnd.Rand8() % TX_SIZES); - const int tx_size_pix = txfm_size_ls[tx_size]; - const TxfmFunc inv_txfm_func = inv_txfm_func_ls[tx_size][0]; - - int32_t input[64]; - random_matrix(input, tx_size_pix, &rnd); - - // 64x64 transform assumes last 32 values are zero. - memset(input + 32, 0, 32 * sizeof(input[0])); - - int32_t ref_output[64]; - reference_idct_1d_int(input, ref_output, tx_size_pix); - - int32_t output[64]; - inv_txfm_func(input, output, cos_bit, range_bit); - - for (int i = 0; i < tx_size_pix; ++i) { - EXPECT_LE(abs(output[i] - ref_output[i]), max_error[tx_size]) - << "tx_size = " << tx_size << ", i = " << i - << ", output[i] = " << output[i] - << ", ref_output[i] = " << ref_output[i]; - } - } -} - -static INLINE int get_max_bit(int x) { - int max_bit = -1; - while (x) { - x = x >> 1; - max_bit++; - } - return max_bit; -} - -TEST(av1_inv_txfm1d, get_max_bit) { - int max_bit = get_max_bit(8); - EXPECT_EQ(max_bit, 3); -} - -TEST(av1_inv_txfm1d, round_trip) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int si = 0; si < NELEMENTS(fwd_txfm_func_ls); ++si) { - int txfm_size = txfm_size_ls[si]; - - for (int ti = 0; ti < txfm_type_num; ++ti) { - TxfmFunc fwd_txfm_func = fwd_txfm_func_ls[si][ti]; - TxfmFunc inv_txfm_func = inv_txfm_func_ls[si][ti]; - int max_error = 2; - - if (!fwd_txfm_func) continue; - - const int count_test_block = 5000; - for (int ci = 0; ci < count_test_block; ++ci) { - int32_t input[64]; - int32_t output[64]; - int32_t round_trip_output[64]; - - ASSERT_LE(txfm_size, NELEMENTS(input)); - - for (int ni = 0; ni < txfm_size; ++ni) { - input[ni] = rnd.Rand16() % input_base - rnd.Rand16() % input_base; - } - - fwd_txfm_func(input, output, cos_bit, range_bit); - inv_txfm_func(output, round_trip_output, cos_bit, range_bit); - - for (int ni = 0; ni < txfm_size; ++ni) { - int node_err = - abs(input[ni] - round_shift(round_trip_output[ni], - get_max_bit(txfm_size) - 1)); - EXPECT_LE(node_err, max_error); - } - } - } - } -} - -} // namespace diff --git a/third_party/aom/test/av1_inv_txfm2d_test.cc b/third_party/aom/test/av1_inv_txfm2d_test.cc deleted file mode 100644 index 11e231ba6..000000000 --- a/third_party/aom/test/av1_inv_txfm2d_test.cc +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <vector> - -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/av1_inv_txfm1d_cfg.h" -#include "av1/common/scan.h" -#include "test/acm_random.h" -#include "test/av1_txfm_test.h" -#include "test/util.h" - -using libaom_test::ACMRandom; -using libaom_test::InvTxfm2dFunc; -using libaom_test::LbdInvTxfm2dFunc; -using libaom_test::bd; -using libaom_test::compute_avg_abs_error; -using libaom_test::input_base; - -using ::testing::Combine; -using ::testing::Range; -using ::testing::Values; - -using std::vector; - -namespace { - -// AV1InvTxfm2dParam argument list: -// tx_type_, tx_size_, max_error_, max_avg_error_ -typedef ::testing::tuple<TX_TYPE, TX_SIZE, int, double> AV1InvTxfm2dParam; - -class AV1InvTxfm2d : public ::testing::TestWithParam<AV1InvTxfm2dParam> { - public: - virtual void SetUp() { - tx_type_ = GET_PARAM(0); - tx_size_ = GET_PARAM(1); - max_error_ = GET_PARAM(2); - max_avg_error_ = GET_PARAM(3); - } - - void RunRoundtripCheck() { - int tx_w = tx_size_wide[tx_size_]; - int tx_h = tx_size_high[tx_size_]; - int txfm2d_size = tx_w * tx_h; - const FwdTxfm2dFunc fwd_txfm_func = libaom_test::fwd_txfm_func_ls[tx_size_]; - const InvTxfm2dFunc inv_txfm_func = libaom_test::inv_txfm_func_ls[tx_size_]; - double avg_abs_error = 0; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - const int count = 500; - - for (int ci = 0; ci < count; ci++) { - DECLARE_ALIGNED(16, int16_t, input[64 * 64]) = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(input)); - - for (int ni = 0; ni < txfm2d_size; ++ni) { - if (ci == 0) { - int extreme_input = input_base - 1; - input[ni] = extreme_input; // extreme case - } else { - input[ni] = rnd.Rand16() % input_base; - } - } - - DECLARE_ALIGNED(16, uint16_t, expected[64 * 64]) = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(expected)); - if (TxfmUsesApproximation()) { - // Compare reference forward HT + inverse HT vs forward HT + inverse HT. - double ref_input[64 * 64]; - ASSERT_LE(txfm2d_size, NELEMENTS(ref_input)); - for (int ni = 0; ni < txfm2d_size; ++ni) { - ref_input[ni] = input[ni]; - } - double ref_coeffs[64 * 64] = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(ref_coeffs)); - ASSERT_EQ(tx_type_, DCT_DCT); - libaom_test::reference_hybrid_2d(ref_input, ref_coeffs, tx_type_, - tx_size_); - DECLARE_ALIGNED(16, int32_t, ref_coeffs_int[64 * 64]) = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(ref_coeffs_int)); - for (int ni = 0; ni < txfm2d_size; ++ni) { - ref_coeffs_int[ni] = (int32_t)round(ref_coeffs[ni]); - } - inv_txfm_func(ref_coeffs_int, expected, tx_w, tx_type_, bd); - } else { - // Compare original input vs forward HT + inverse HT. - for (int ni = 0; ni < txfm2d_size; ++ni) { - expected[ni] = input[ni]; - } - } - - DECLARE_ALIGNED(16, int32_t, coeffs[64 * 64]) = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(coeffs)); - fwd_txfm_func(input, coeffs, tx_w, tx_type_, bd); - - DECLARE_ALIGNED(16, uint16_t, actual[64 * 64]) = { 0 }; - ASSERT_LE(txfm2d_size, NELEMENTS(actual)); - inv_txfm_func(coeffs, actual, tx_w, tx_type_, bd); - - double actual_max_error = 0; - for (int ni = 0; ni < txfm2d_size; ++ni) { - const double this_error = abs(expected[ni] - actual[ni]); - actual_max_error = AOMMAX(actual_max_error, this_error); - } - EXPECT_GE(max_error_, actual_max_error) - << " tx_w: " << tx_w << " tx_h " << tx_h << " tx_type: " << tx_type_; - if (actual_max_error > max_error_) { // exit early. - break; - } - avg_abs_error += compute_avg_abs_error<uint16_t, uint16_t>( - expected, actual, txfm2d_size); - } - - avg_abs_error /= count; - EXPECT_GE(max_avg_error_, avg_abs_error) - << " tx_w: " << tx_w << " tx_h " << tx_h << " tx_type: " << tx_type_; - } - - private: - bool TxfmUsesApproximation() { - if (tx_size_wide[tx_size_] == 64 || tx_size_high[tx_size_] == 64) { - return true; - } - return false; - } - - int max_error_; - double max_avg_error_; - TX_TYPE tx_type_; - TX_SIZE tx_size_; -}; - -static int max_error_ls[TX_SIZES_ALL] = { - 2, // 4x4 transform - 2, // 8x8 transform - 2, // 16x16 transform - 4, // 32x32 transform - 3, // 64x64 transform - 2, // 4x8 transform - 2, // 8x4 transform - 2, // 8x16 transform - 2, // 16x8 transform - 3, // 16x32 transform - 3, // 32x16 transform - 5, // 32x64 transform - 5, // 64x32 transform - 2, // 4x16 transform - 2, // 16x4 transform - 2, // 8x32 transform - 2, // 32x8 transform - 3, // 16x64 transform - 3, // 64x16 transform -}; - -static double avg_error_ls[TX_SIZES_ALL] = { - 0.002, // 4x4 transform - 0.05, // 8x8 transform - 0.07, // 16x16 transform - 0.4, // 32x32 transform - 0.3, // 64x64 transform - 0.02, // 4x8 transform - 0.02, // 8x4 transform - 0.04, // 8x16 transform - 0.07, // 16x8 transform - 0.4, // 16x32 transform - 0.5, // 32x16 transform - 0.38, // 32x64 transform - 0.39, // 64x32 transform - 0.2, // 4x16 transform - 0.2, // 16x4 transform - 0.2, // 8x32 transform - 0.2, // 32x8 transform - 0.38, // 16x64 transform - 0.38, // 64x16 transform -}; - -vector<AV1InvTxfm2dParam> GetInvTxfm2dParamList() { - vector<AV1InvTxfm2dParam> param_list; - for (int s = 0; s < TX_SIZES; ++s) { - const int max_error = max_error_ls[s]; - const double avg_error = avg_error_ls[s]; - for (int t = 0; t < TX_TYPES; ++t) { - const TX_TYPE tx_type = static_cast<TX_TYPE>(t); - const TX_SIZE tx_size = static_cast<TX_SIZE>(s); - if (libaom_test::IsTxSizeTypeValid(tx_size, tx_type)) { - param_list.push_back( - AV1InvTxfm2dParam(tx_type, tx_size, max_error, avg_error)); - } - } - } - return param_list; -} - -INSTANTIATE_TEST_CASE_P(C, AV1InvTxfm2d, - ::testing::ValuesIn(GetInvTxfm2dParamList())); - -TEST_P(AV1InvTxfm2d, RunRoundtripCheck) { RunRoundtripCheck(); } - -TEST(AV1InvTxfm2d, CfgTest) { - for (int bd_idx = 0; bd_idx < BD_NUM; ++bd_idx) { - int bd = libaom_test::bd_arr[bd_idx]; - int8_t low_range = libaom_test::low_range_arr[bd_idx]; - int8_t high_range = libaom_test::high_range_arr[bd_idx]; - for (int tx_size = 0; tx_size < TX_SIZES_ALL; ++tx_size) { - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(tx_size), - static_cast<TX_TYPE>(tx_type)) == - false) { - continue; - } - TXFM_2D_FLIP_CFG cfg; - av1_get_inv_txfm_cfg(static_cast<TX_TYPE>(tx_type), - static_cast<TX_SIZE>(tx_size), &cfg); - int8_t stage_range_col[MAX_TXFM_STAGE_NUM]; - int8_t stage_range_row[MAX_TXFM_STAGE_NUM]; - av1_gen_inv_stage_range(stage_range_col, stage_range_row, &cfg, - (TX_SIZE)tx_size, bd); - libaom_test::txfm_stage_range_check(stage_range_col, cfg.stage_num_col, - cfg.cos_bit_col, low_range, - high_range); - libaom_test::txfm_stage_range_check(stage_range_row, cfg.stage_num_row, - cfg.cos_bit_row, low_range, - high_range); - } - } - } -} - -typedef ::testing::tuple<const LbdInvTxfm2dFunc> AV1LbdInvTxfm2dParam; -class AV1LbdInvTxfm2d : public ::testing::TestWithParam<AV1LbdInvTxfm2dParam> { - public: - virtual void SetUp() { target_func_ = GET_PARAM(0); } - void RunAV1InvTxfm2dTest(TX_TYPE tx_type, TX_SIZE tx_size, int run_times); - - private: - LbdInvTxfm2dFunc target_func_; -}; - -void AV1LbdInvTxfm2d::RunAV1InvTxfm2dTest(TX_TYPE tx_type, TX_SIZE tx_size, - int run_times) { - FwdTxfm2dFunc fwd_func_ = libaom_test::fwd_txfm_func_ls[tx_size]; - InvTxfm2dFunc ref_func_ = libaom_test::inv_txfm_func_ls[tx_size]; - if (fwd_func_ == NULL || ref_func_ == NULL || target_func_ == NULL) { - return; - } - const int bd = 8; - const int BLK_WIDTH = 64; - const int BLK_SIZE = BLK_WIDTH * BLK_WIDTH; - DECLARE_ALIGNED(16, int16_t, input[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(32, int32_t, inv_input[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(16, uint8_t, output[BLK_SIZE]) = { 0 }; - DECLARE_ALIGNED(16, uint16_t, ref_output[BLK_SIZE]) = { 0 }; - int stride = BLK_WIDTH; - int rows = tx_size_high[tx_size]; - int cols = tx_size_wide[tx_size]; - const int rows_nonezero = AOMMIN(32, rows); - const int cols_nonezero = AOMMIN(32, cols); - run_times /= (rows * cols); - run_times = AOMMAX(1, run_times); - const SCAN_ORDER *scan_order = get_default_scan(tx_size, tx_type); - const int16_t *scan = scan_order->scan; - const int16_t eobmax = rows_nonezero * cols_nonezero; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - int randTimes = run_times == 1 ? (eobmax + 500) : 1; - for (int cnt = 0; cnt < randTimes; ++cnt) { - const int16_t max_in = (1 << (bd)) - 1; - for (int r = 0; r < BLK_WIDTH; ++r) { - for (int c = 0; c < BLK_WIDTH; ++c) { - input[r * cols + c] = (cnt == 0) ? max_in : rnd.Rand8Extremes(); - output[r * stride + c] = (cnt == 0) ? 128 : rnd.Rand8(); - ref_output[r * stride + c] = output[r * stride + c]; - } - } - fwd_func_(input, inv_input, stride, tx_type, bd); - - // produce eob input by setting high freq coeffs to zero - const int eob = AOMMIN(cnt + 1, eobmax); - for (int i = eob; i < eobmax; i++) { - inv_input[scan[i]] = 0; - } - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - ref_func_(inv_input, ref_output, stride, tx_type, bd); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - target_func_(inv_input, output, stride, tx_type, tx_size, eob); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 10) { - printf("txfm[%d] %3dx%-3d:%7.2f/%7.2fns", tx_type, cols, rows, time1, - time2); - printf("(%3.2f)\n", time1 / time2); - } - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - uint8_t ref_value = static_cast<uint8_t>(ref_output[r * stride + c]); - ASSERT_EQ(ref_value, output[r * stride + c]) - << "[" << r << "," << c << "] " << cnt - << " tx_size: " << static_cast<int>(tx_size) - << " tx_type: " << tx_type << " eob " << eob; - } - } - } -} - -TEST_P(AV1LbdInvTxfm2d, match) { - for (int j = 0; j < (int)(TX_SIZES_ALL); ++j) { - for (int i = 0; i < (int)TX_TYPES; ++i) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(j), - static_cast<TX_TYPE>(i))) { - RunAV1InvTxfm2dTest(static_cast<TX_TYPE>(i), static_cast<TX_SIZE>(j), - 1); - } - } - } -} - -TEST_P(AV1LbdInvTxfm2d, DISABLED_Speed) { - for (int j = 0; j < (int)(TX_SIZES_ALL); ++j) { - for (int i = 0; i < (int)TX_TYPES; ++i) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(j), - static_cast<TX_TYPE>(i))) { - RunAV1InvTxfm2dTest(static_cast<TX_TYPE>(i), static_cast<TX_SIZE>(j), - 10000000); - } - } - } -} - -#if HAVE_SSSE3 -#if defined(_MSC_VER) || defined(__SSSE3__) -#include "av1/common/x86/av1_inv_txfm_ssse3.h" -INSTANTIATE_TEST_CASE_P(SSSE3, AV1LbdInvTxfm2d, - ::testing::Values(av1_lowbd_inv_txfm2d_add_ssse3)); -#endif // _MSC_VER || __SSSE3__ -#endif // HAVE_SSSE3 - -#if HAVE_AVX2 -extern "C" void av1_lowbd_inv_txfm2d_add_avx2(const int32_t *input, - uint8_t *output, int stride, - TX_TYPE tx_type, TX_SIZE tx_size, - int eob); - -INSTANTIATE_TEST_CASE_P(AVX2, AV1LbdInvTxfm2d, - ::testing::Values(av1_lowbd_inv_txfm2d_add_avx2)); -#endif // HAVE_AVX2 - -#if HAVE_NEON - -extern "C" void av1_lowbd_inv_txfm2d_add_neon(const int32_t *input, - uint8_t *output, int stride, - TX_TYPE tx_type, TX_SIZE tx_size, - int eob); - -INSTANTIATE_TEST_CASE_P(NEON, AV1LbdInvTxfm2d, - ::testing::Values(av1_lowbd_inv_txfm2d_add_neon)); -#endif // HAVE_NEON - -} // namespace diff --git a/third_party/aom/test/av1_quantize_test.cc b/third_party/aom/test/av1_quantize_test.cc deleted file mode 100644 index aaf093918..000000000 --- a/third_party/aom/test/av1_quantize_test.cc +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include <stdlib.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "av1/common/scan.h" - -namespace { - -typedef void (*QuantizeFpFunc)( - const tran_low_t *coeff_ptr, intptr_t count, const int16_t *zbin_ptr, - const int16_t *round_ptr, const int16_t *quant_ptr, - const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, - tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, - const int16_t *scan, const int16_t *iscan, int log_scale); - -struct QuantizeFuncParams { - QuantizeFuncParams(QuantizeFpFunc qF = NULL, QuantizeFpFunc qRefF = NULL, - int count = 16) - : qFunc(qF), qFuncRef(qRefF), coeffCount(count) {} - QuantizeFpFunc qFunc; - QuantizeFpFunc qFuncRef; - int coeffCount; -}; - -using libaom_test::ACMRandom; - -const int numTests = 1000; -const int maxSize = 1024; -const int roundFactorRange = 127; -const int dequantRange = 32768; -const int coeffRange = (1 << 20) - 1; - -class AV1QuantizeTest : public ::testing::TestWithParam<QuantizeFuncParams> { - public: - void RunQuantizeTest() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, tran_low_t, coeff_ptr[maxSize]); - DECLARE_ALIGNED(16, int16_t, zbin_ptr[8]); - DECLARE_ALIGNED(16, int16_t, round_ptr[8]); - DECLARE_ALIGNED(16, int16_t, quant_ptr[8]); - DECLARE_ALIGNED(16, int16_t, quant_shift_ptr[8]); - DECLARE_ALIGNED(16, tran_low_t, qcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, dqcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, ref_qcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, ref_dqcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, int16_t, dequant_ptr[8]); - uint16_t eob; - uint16_t ref_eob; - int err_count_total = 0; - int first_failure = -1; - int count = params_.coeffCount; - const TX_SIZE txSize = getTxSize(count); - int log_scale = (txSize == TX_32X32); - QuantizeFpFunc quanFunc = params_.qFunc; - QuantizeFpFunc quanFuncRef = params_.qFuncRef; - - const SCAN_ORDER scanOrder = av1_default_scan_orders[txSize]; - for (int i = 0; i < numTests; i++) { - int err_count = 0; - ref_eob = eob = -1; - for (int j = 0; j < count; j++) { - coeff_ptr[j] = rnd(coeffRange); - } - - for (int j = 0; j < 2; j++) { - zbin_ptr[j] = rnd.Rand16(); - quant_shift_ptr[j] = rnd.Rand16(); - // int16_t positive - dequant_ptr[j] = abs(rnd(dequantRange)); - quant_ptr[j] = (1 << 16) / dequant_ptr[j]; - round_ptr[j] = (abs(rnd(roundFactorRange)) * dequant_ptr[j]) >> 7; - } - for (int j = 2; j < 8; ++j) { - zbin_ptr[j] = zbin_ptr[1]; - quant_shift_ptr[j] = quant_shift_ptr[1]; - dequant_ptr[j] = dequant_ptr[1]; - quant_ptr[j] = quant_ptr[1]; - round_ptr[j] = round_ptr[1]; - } - quanFuncRef(coeff_ptr, count, zbin_ptr, round_ptr, quant_ptr, - quant_shift_ptr, ref_qcoeff_ptr, ref_dqcoeff_ptr, dequant_ptr, - &ref_eob, scanOrder.scan, scanOrder.iscan, log_scale); - - ASM_REGISTER_STATE_CHECK( - quanFunc(coeff_ptr, count, zbin_ptr, round_ptr, quant_ptr, - quant_shift_ptr, qcoeff_ptr, dqcoeff_ptr, dequant_ptr, &eob, - scanOrder.scan, scanOrder.iscan, log_scale)); - - for (int j = 0; j < count; ++j) { - err_count += (ref_qcoeff_ptr[j] != qcoeff_ptr[j]) | - (ref_dqcoeff_ptr[j] != dqcoeff_ptr[j]); - ASSERT_EQ(ref_qcoeff_ptr[j], qcoeff_ptr[j]) - << "qcoeff error: i = " << i << " j = " << j << "\n"; - EXPECT_EQ(ref_dqcoeff_ptr[j], dqcoeff_ptr[j]) - << "dqcoeff error: i = " << i << " j = " << j << "\n"; - } - EXPECT_EQ(ref_eob, eob) << "eob error: " - << "i = " << i << "\n"; - err_count += (ref_eob != eob); - if (err_count && !err_count_total) { - first_failure = i; - } - err_count_total += err_count; - } - EXPECT_EQ(0, err_count_total) - << "Error: Quantization Test, C output doesn't match SSE2 output. " - << "First failed at test case " << first_failure; - } - - void RunEobTest() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, tran_low_t, coeff_ptr[maxSize]); - DECLARE_ALIGNED(16, int16_t, zbin_ptr[8]); - DECLARE_ALIGNED(16, int16_t, round_ptr[8]); - DECLARE_ALIGNED(16, int16_t, quant_ptr[8]); - DECLARE_ALIGNED(16, int16_t, quant_shift_ptr[8]); - DECLARE_ALIGNED(16, tran_low_t, qcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, dqcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, ref_qcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, tran_low_t, ref_dqcoeff_ptr[maxSize]); - DECLARE_ALIGNED(16, int16_t, dequant_ptr[8]); - uint16_t eob; - uint16_t ref_eob; - int count = params_.coeffCount; - const TX_SIZE txSize = getTxSize(count); - int log_scale = (txSize == TX_32X32); - QuantizeFpFunc quanFunc = params_.qFunc; - QuantizeFpFunc quanFuncRef = params_.qFuncRef; - const SCAN_ORDER scanOrder = av1_default_scan_orders[txSize]; - - for (int i = 0; i < numTests; i++) { - ref_eob = eob = -1; - for (int j = 0; j < count; j++) { - coeff_ptr[j] = 0; - } - - coeff_ptr[rnd(count)] = rnd(coeffRange); - coeff_ptr[rnd(count)] = rnd(coeffRange); - coeff_ptr[rnd(count)] = rnd(coeffRange); - - for (int j = 0; j < 2; j++) { - zbin_ptr[j] = rnd.Rand16(); - quant_shift_ptr[j] = rnd.Rand16(); - // int16_t positive - dequant_ptr[j] = abs(rnd(dequantRange)); - quant_ptr[j] = (1 << 16) / dequant_ptr[j]; - round_ptr[j] = (abs(rnd(roundFactorRange)) * dequant_ptr[j]) >> 7; - } - for (int j = 2; j < 8; ++j) { - zbin_ptr[j] = zbin_ptr[1]; - quant_shift_ptr[j] = quant_shift_ptr[1]; - dequant_ptr[j] = dequant_ptr[1]; - quant_ptr[j] = quant_ptr[1]; - round_ptr[j] = round_ptr[1]; - } - - quanFuncRef(coeff_ptr, count, zbin_ptr, round_ptr, quant_ptr, - quant_shift_ptr, ref_qcoeff_ptr, ref_dqcoeff_ptr, dequant_ptr, - &ref_eob, scanOrder.scan, scanOrder.iscan, log_scale); - - ASM_REGISTER_STATE_CHECK( - quanFunc(coeff_ptr, count, zbin_ptr, round_ptr, quant_ptr, - quant_shift_ptr, qcoeff_ptr, dqcoeff_ptr, dequant_ptr, &eob, - scanOrder.scan, scanOrder.iscan, log_scale)); - EXPECT_EQ(ref_eob, eob) << "eob error: " - << "i = " << i << "\n"; - } - } - - virtual void SetUp() { params_ = GetParam(); } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - virtual ~AV1QuantizeTest() {} - - private: - TX_SIZE getTxSize(int count) { - switch (count) { - case 16: return TX_4X4; - case 64: return TX_8X8; - case 256: return TX_16X16; - case 1024: return TX_32X32; - default: return TX_4X4; - } - } - - QuantizeFuncParams params_; -}; - -TEST_P(AV1QuantizeTest, BitExactCheck) { RunQuantizeTest(); } -TEST_P(AV1QuantizeTest, EobVerify) { RunEobTest(); } - -#if HAVE_SSE4_1 -const QuantizeFuncParams qfps[4] = { - QuantizeFuncParams(&av1_highbd_quantize_fp_sse4_1, &av1_highbd_quantize_fp_c, - 16), - QuantizeFuncParams(&av1_highbd_quantize_fp_sse4_1, &av1_highbd_quantize_fp_c, - 64), - QuantizeFuncParams(&av1_highbd_quantize_fp_sse4_1, &av1_highbd_quantize_fp_c, - 256), - QuantizeFuncParams(&av1_highbd_quantize_fp_sse4_1, &av1_highbd_quantize_fp_c, - 1024), -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1QuantizeTest, ::testing::ValuesIn(qfps)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -const QuantizeFuncParams qfps_avx2[4] = { - QuantizeFuncParams(&av1_highbd_quantize_fp_avx2, &av1_highbd_quantize_fp_c, - 16), - QuantizeFuncParams(&av1_highbd_quantize_fp_avx2, &av1_highbd_quantize_fp_c, - 64), - QuantizeFuncParams(&av1_highbd_quantize_fp_avx2, &av1_highbd_quantize_fp_c, - 256), - QuantizeFuncParams(&av1_highbd_quantize_fp_avx2, &av1_highbd_quantize_fp_c, - 1024), -}; - -INSTANTIATE_TEST_CASE_P(AVX2, AV1QuantizeTest, ::testing::ValuesIn(qfps_avx2)); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/av1_round_shift_array_test.cc b/third_party/aom/test/av1_round_shift_array_test.cc deleted file mode 100644 index 181a39460..000000000 --- a/third_party/aom/test/av1_round_shift_array_test.cc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> - -#include "config/aom_dsp_rtcd.h" - -#include "aom_mem/aom_mem.h" -#include "aom_ports/aom_timer.h" -#include "aom_ports/mem.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace AV1CompRoundShift { - -typedef void (*comp_round_shift_array_func)(int32_t *arr, int size, int bit); - -#if HAVE_SSE4_1 || HAVE_NEON -const int kValidBitCheck[] = { - -4, -3, -2, -1, 0, 1, 2, 3, 4, -}; -#endif // HAVE_SSE4_1 || HAVE_NEON - -typedef ::testing::tuple<comp_round_shift_array_func, BLOCK_SIZE, int> - CompRoundShiftParam; - -class AV1CompRoundShiftTest - : public ::testing::TestWithParam<CompRoundShiftParam> { - public: - ~AV1CompRoundShiftTest(); - - void SetUp() { rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed()); } - void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunCheckOutput(comp_round_shift_array_func test_impl, BLOCK_SIZE bsize, - int bit); - void RunSpeedTest(comp_round_shift_array_func test_impl, BLOCK_SIZE bsize, - int bit); - - libaom_test::ACMRandom rnd_; -}; - -AV1CompRoundShiftTest::~AV1CompRoundShiftTest() { ; } - -void AV1CompRoundShiftTest::RunCheckOutput( - comp_round_shift_array_func test_impl, BLOCK_SIZE bsize, int bit) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - const int blk_wd = 64; - DECLARE_ALIGNED(32, int32_t, pred_[blk_wd]); - DECLARE_ALIGNED(32, int32_t, ref_buffer_[blk_wd]); - for (int i = 0; i < (blk_wd); ++i) { - ref_buffer_[i] = pred_[i] = rnd_.Rand31() / 16; - } - av1_round_shift_array_c(ref_buffer_, w, bit); - test_impl(pred_, w, bit); - for (int x = 0; x < w; ++x) { - ASSERT_EQ(ref_buffer_[x], pred_[x]) << w << "x" << h << "mismatch @" - << "(" << x << ")"; - } -} - -void AV1CompRoundShiftTest::RunSpeedTest(comp_round_shift_array_func test_impl, - BLOCK_SIZE bsize, int bit) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - const int blk_wd = 64; - DECLARE_ALIGNED(32, int32_t, ref_buffer_[blk_wd]); - for (int i = 0; i < (blk_wd); ++i) { - ref_buffer_[i] = rnd_.Rand31(); - } - - const int num_loops = 1000000000 / (w + h); - comp_round_shift_array_func funcs[2] = { av1_round_shift_array_c, test_impl }; - double elapsed_time[2] = { 0 }; - for (int i = 0; i < 2; ++i) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - comp_round_shift_array_func func = funcs[i]; - for (int j = 0; j < num_loops; ++j) { - func(ref_buffer_, w, bit); - } - aom_usec_timer_mark(&timer); - double time = static_cast<double>(aom_usec_timer_elapsed(&timer)); - elapsed_time[i] = 1000.0 * time / num_loops; - } - printf("av1_round_shift_array %3dx%-3d: bit : %d %7.2f/%7.2fns", w, h, bit, - elapsed_time[0], elapsed_time[1]); - printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]); -} - -TEST_P(AV1CompRoundShiftTest, CheckOutput) { - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), GET_PARAM(2)); -} - -TEST_P(AV1CompRoundShiftTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0), GET_PARAM(1), GET_PARAM(2)); -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, AV1CompRoundShiftTest, - ::testing::Combine(::testing::Values(&av1_round_shift_array_sse4_1), - ::testing::ValuesIn(txsize_to_bsize), - ::testing::ValuesIn(kValidBitCheck))); -#endif - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON, AV1CompRoundShiftTest, - ::testing::Combine(::testing::Values(&av1_round_shift_array_neon), - ::testing::ValuesIn(txsize_to_bsize), - ::testing::ValuesIn(kValidBitCheck))); -#endif - -}; // namespace AV1CompRoundShift diff --git a/third_party/aom/test/av1_txfm_test.cc b/third_party/aom/test/av1_txfm_test.cc deleted file mode 100644 index d5b0ce325..000000000 --- a/third_party/aom/test/av1_txfm_test.cc +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <stdio.h> -#include "test/av1_txfm_test.h" - -namespace libaom_test { - -int get_txfm1d_size(TX_SIZE tx_size) { return tx_size_wide[tx_size]; } - -void get_txfm1d_type(TX_TYPE txfm2d_type, TYPE_TXFM *type0, TYPE_TXFM *type1) { - switch (txfm2d_type) { - case DCT_DCT: - *type0 = TYPE_DCT; - *type1 = TYPE_DCT; - break; - case ADST_DCT: - *type0 = TYPE_ADST; - *type1 = TYPE_DCT; - break; - case DCT_ADST: - *type0 = TYPE_DCT; - *type1 = TYPE_ADST; - break; - case ADST_ADST: - *type0 = TYPE_ADST; - *type1 = TYPE_ADST; - break; - case FLIPADST_DCT: - *type0 = TYPE_ADST; - *type1 = TYPE_DCT; - break; - case DCT_FLIPADST: - *type0 = TYPE_DCT; - *type1 = TYPE_ADST; - break; - case FLIPADST_FLIPADST: - *type0 = TYPE_ADST; - *type1 = TYPE_ADST; - break; - case ADST_FLIPADST: - *type0 = TYPE_ADST; - *type1 = TYPE_ADST; - break; - case FLIPADST_ADST: - *type0 = TYPE_ADST; - *type1 = TYPE_ADST; - break; - case IDTX: - *type0 = TYPE_IDTX; - *type1 = TYPE_IDTX; - break; - case H_DCT: - *type0 = TYPE_IDTX; - *type1 = TYPE_DCT; - break; - case V_DCT: - *type0 = TYPE_DCT; - *type1 = TYPE_IDTX; - break; - case H_ADST: - *type0 = TYPE_IDTX; - *type1 = TYPE_ADST; - break; - case V_ADST: - *type0 = TYPE_ADST; - *type1 = TYPE_IDTX; - break; - case H_FLIPADST: - *type0 = TYPE_IDTX; - *type1 = TYPE_ADST; - break; - case V_FLIPADST: - *type0 = TYPE_ADST; - *type1 = TYPE_IDTX; - break; - default: - *type0 = TYPE_DCT; - *type1 = TYPE_DCT; - assert(0); - break; - } -} - -double Sqrt2 = pow(2, 0.5); -double invSqrt2 = 1 / pow(2, 0.5); - -double dct_matrix(double n, double k, int size) { - return cos(M_PI * (2 * n + 1) * k / (2 * size)); -} - -void reference_dct_1d(const double *in, double *out, int size) { - for (int k = 0; k < size; ++k) { - out[k] = 0; - for (int n = 0; n < size; ++n) { - out[k] += in[n] * dct_matrix(n, k, size); - } - if (k == 0) out[k] = out[k] * invSqrt2; - } -} - -void reference_idct_1d(const double *in, double *out, int size) { - for (int k = 0; k < size; ++k) { - out[k] = 0; - for (int n = 0; n < size; ++n) { - if (n == 0) - out[k] += invSqrt2 * in[n] * dct_matrix(k, n, size); - else - out[k] += in[n] * dct_matrix(k, n, size); - } - } -} - -// TODO(any): Copied from the old 'fadst4' (same as the new 'av1_fadst4_new' -// function). Should be replaced by a proper reference function that takes -// 'double' input & output. -static void fadst4_new(const tran_low_t *input, tran_low_t *output) { - tran_high_t x0, x1, x2, x3; - tran_high_t s0, s1, s2, s3, s4, s5, s6, s7; - - x0 = input[0]; - x1 = input[1]; - x2 = input[2]; - x3 = input[3]; - - if (!(x0 | x1 | x2 | x3)) { - output[0] = output[1] = output[2] = output[3] = 0; - return; - } - - s0 = sinpi_1_9 * x0; - s1 = sinpi_4_9 * x0; - s2 = sinpi_2_9 * x1; - s3 = sinpi_1_9 * x1; - s4 = sinpi_3_9 * x2; - s5 = sinpi_4_9 * x3; - s6 = sinpi_2_9 * x3; - s7 = x0 + x1 - x3; - - x0 = s0 + s2 + s5; - x1 = sinpi_3_9 * s7; - x2 = s1 - s3 + s6; - x3 = s4; - - s0 = x0 + x3; - s1 = x1; - s2 = x2 - x3; - s3 = x2 - x0 + x3; - - // 1-D transform scaling factor is sqrt(2). - output[0] = (tran_low_t)fdct_round_shift(s0); - output[1] = (tran_low_t)fdct_round_shift(s1); - output[2] = (tran_low_t)fdct_round_shift(s2); - output[3] = (tran_low_t)fdct_round_shift(s3); -} - -void reference_adst_1d(const double *in, double *out, int size) { - if (size == 4) { // Special case. - tran_low_t int_input[4]; - for (int i = 0; i < 4; ++i) { - int_input[i] = static_cast<tran_low_t>(round(in[i])); - } - tran_low_t int_output[4]; - fadst4_new(int_input, int_output); - for (int i = 0; i < 4; ++i) { - out[i] = int_output[i]; - } - return; - } - - for (int k = 0; k < size; ++k) { - out[k] = 0; - for (int n = 0; n < size; ++n) { - out[k] += in[n] * sin(M_PI * (2 * n + 1) * (2 * k + 1) / (4 * size)); - } - } -} - -void reference_idtx_1d(const double *in, double *out, int size) { - double scale = 0; - if (size == 4) - scale = Sqrt2; - else if (size == 8) - scale = 2; - else if (size == 16) - scale = 2 * Sqrt2; - else if (size == 32) - scale = 4; - else if (size == 64) - scale = 4 * Sqrt2; - for (int k = 0; k < size; ++k) { - out[k] = in[k] * scale; - } -} - -void reference_hybrid_1d(double *in, double *out, int size, int type) { - if (type == TYPE_DCT) - reference_dct_1d(in, out, size); - else if (type == TYPE_ADST) - reference_adst_1d(in, out, size); - else - reference_idtx_1d(in, out, size); -} - -double get_amplification_factor(TX_TYPE tx_type, TX_SIZE tx_size) { - TXFM_2D_FLIP_CFG fwd_txfm_flip_cfg; - av1_get_fwd_txfm_cfg(tx_type, tx_size, &fwd_txfm_flip_cfg); - const int tx_width = tx_size_wide[fwd_txfm_flip_cfg.tx_size]; - const int tx_height = tx_size_high[fwd_txfm_flip_cfg.tx_size]; - const int8_t *shift = fwd_txfm_flip_cfg.shift; - const int amplify_bit = shift[0] + shift[1] + shift[2]; - double amplify_factor = - amplify_bit >= 0 ? (1 << amplify_bit) : (1.0 / (1 << -amplify_bit)); - - // For rectangular transforms, we need to multiply by an extra factor. - const int rect_type = get_rect_tx_log_ratio(tx_width, tx_height); - if (abs(rect_type) == 1) { - amplify_factor *= pow(2, 0.5); - } - return amplify_factor; -} - -void reference_hybrid_2d(double *in, double *out, TX_TYPE tx_type, - TX_SIZE tx_size) { - // Get transform type and size of each dimension. - TYPE_TXFM type0; - TYPE_TXFM type1; - get_txfm1d_type(tx_type, &type0, &type1); - const int tx_width = tx_size_wide[tx_size]; - const int tx_height = tx_size_high[tx_size]; - - double *const temp_in = new double[AOMMAX(tx_width, tx_height)]; - double *const temp_out = new double[AOMMAX(tx_width, tx_height)]; - double *const out_interm = new double[tx_width * tx_height]; - const int stride = tx_width; - - // Transform columns. - for (int c = 0; c < tx_width; ++c) { - for (int r = 0; r < tx_height; ++r) { - temp_in[r] = in[r * stride + c]; - } - reference_hybrid_1d(temp_in, temp_out, tx_height, type0); - for (int r = 0; r < tx_height; ++r) { - out_interm[r * stride + c] = temp_out[r]; - } - } - - // Transform rows. - for (int r = 0; r < tx_height; ++r) { - reference_hybrid_1d(out_interm + r * stride, out + r * stride, tx_width, - type1); - } - - delete[] temp_in; - delete[] temp_out; - delete[] out_interm; - - // These transforms use an approximate 2D DCT transform, by only keeping the - // top-left quarter of the coefficients, and repacking them in the first - // quarter indices. - // TODO(urvang): Refactor this code. - if (tx_width == 64 && tx_height == 64) { // tx_size == TX_64X64 - // Zero out top-right 32x32 area. - for (int row = 0; row < 32; ++row) { - memset(out + row * 64 + 32, 0, 32 * sizeof(*out)); - } - // Zero out the bottom 64x32 area. - memset(out + 32 * 64, 0, 32 * 64 * sizeof(*out)); - // Re-pack non-zero coeffs in the first 32x32 indices. - for (int row = 1; row < 32; ++row) { - memcpy(out + row * 32, out + row * 64, 32 * sizeof(*out)); - } - } else if (tx_width == 32 && tx_height == 64) { // tx_size == TX_32X64 - // Zero out the bottom 32x32 area. - memset(out + 32 * 32, 0, 32 * 32 * sizeof(*out)); - // Note: no repacking needed here. - } else if (tx_width == 64 && tx_height == 32) { // tx_size == TX_64X32 - // Zero out right 32x32 area. - for (int row = 0; row < 32; ++row) { - memset(out + row * 64 + 32, 0, 32 * sizeof(*out)); - } - // Re-pack non-zero coeffs in the first 32x32 indices. - for (int row = 1; row < 32; ++row) { - memcpy(out + row * 32, out + row * 64, 32 * sizeof(*out)); - } - } else if (tx_width == 16 && tx_height == 64) { // tx_size == TX_16X64 - // Zero out the bottom 16x32 area. - memset(out + 16 * 32, 0, 16 * 32 * sizeof(*out)); - // Note: no repacking needed here. - } else if (tx_width == 64 && tx_height == 16) { // tx_size == TX_64X16 - // Zero out right 32x16 area. - for (int row = 0; row < 16; ++row) { - memset(out + row * 64 + 32, 0, 32 * sizeof(*out)); - } - // Re-pack non-zero coeffs in the first 32x16 indices. - for (int row = 1; row < 16; ++row) { - memcpy(out + row * 32, out + row * 64, 32 * sizeof(*out)); - } - } - - // Apply appropriate scale. - const double amplify_factor = get_amplification_factor(tx_type, tx_size); - for (int c = 0; c < tx_width; ++c) { - for (int r = 0; r < tx_height; ++r) { - out[r * stride + c] *= amplify_factor; - } - } -} - -template <typename Type> -void fliplr(Type *dest, int width, int height, int stride) { - for (int r = 0; r < height; ++r) { - for (int c = 0; c < width / 2; ++c) { - const Type tmp = dest[r * stride + c]; - dest[r * stride + c] = dest[r * stride + width - 1 - c]; - dest[r * stride + width - 1 - c] = tmp; - } - } -} - -template <typename Type> -void flipud(Type *dest, int width, int height, int stride) { - for (int c = 0; c < width; ++c) { - for (int r = 0; r < height / 2; ++r) { - const Type tmp = dest[r * stride + c]; - dest[r * stride + c] = dest[(height - 1 - r) * stride + c]; - dest[(height - 1 - r) * stride + c] = tmp; - } - } -} - -template <typename Type> -void fliplrud(Type *dest, int width, int height, int stride) { - for (int r = 0; r < height / 2; ++r) { - for (int c = 0; c < width; ++c) { - const Type tmp = dest[r * stride + c]; - dest[r * stride + c] = dest[(height - 1 - r) * stride + width - 1 - c]; - dest[(height - 1 - r) * stride + width - 1 - c] = tmp; - } - } -} - -template void fliplr<double>(double *dest, int width, int height, int stride); -template void flipud<double>(double *dest, int width, int height, int stride); -template void fliplrud<double>(double *dest, int width, int height, int stride); - -int bd_arr[BD_NUM] = { 8, 10, 12 }; - -int8_t low_range_arr[BD_NUM] = { 18, 32, 32 }; -int8_t high_range_arr[BD_NUM] = { 32, 32, 32 }; - -void txfm_stage_range_check(const int8_t *stage_range, int stage_num, - int8_t cos_bit, int low_range, int high_range) { - for (int i = 0; i < stage_num; ++i) { - EXPECT_LE(stage_range[i], low_range); - ASSERT_LE(stage_range[i] + cos_bit, high_range) << "stage = " << i; - } - for (int i = 0; i < stage_num - 1; ++i) { - // make sure there is no overflow while doing half_btf() - ASSERT_LE(stage_range[i + 1] + cos_bit, high_range) << "stage = " << i; - } -} -} // namespace libaom_test diff --git a/third_party/aom/test/av1_txfm_test.h b/third_party/aom/test/av1_txfm_test.h deleted file mode 100644 index a18164741..000000000 --- a/third_party/aom/test/av1_txfm_test.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_AV1_TXFM_TEST_H_ -#define AOM_TEST_AV1_TXFM_TEST_H_ - -#include <stdio.h> -#include <stdlib.h> -#ifdef _MSC_VER -#define _USE_MATH_DEFINES -#endif -#include <math.h> - -#include "config/av1_rtcd.h" - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/acm_random.h" -#include "av1/common/av1_txfm.h" -#include "av1/common/blockd.h" -#include "av1/common/enums.h" - -namespace libaom_test { -typedef enum { - TYPE_DCT = 0, - TYPE_ADST, - TYPE_IDTX, - TYPE_IDCT, - TYPE_IADST, - TYPE_LAST -} TYPE_TXFM; - -int get_txfm1d_size(TX_SIZE tx_size); - -void get_txfm1d_type(TX_TYPE txfm2d_type, TYPE_TXFM *type0, TYPE_TXFM *type1); - -void reference_dct_1d(const double *in, double *out, int size); -void reference_idct_1d(const double *in, double *out, int size); - -void reference_adst_1d(const double *in, double *out, int size); - -void reference_hybrid_1d(double *in, double *out, int size, int type); - -double get_amplification_factor(TX_TYPE tx_type, TX_SIZE tx_size); - -void reference_hybrid_2d(double *in, double *out, TX_TYPE tx_type, - TX_SIZE tx_size); -template <typename Type1, typename Type2> -static double compute_avg_abs_error(const Type1 *a, const Type2 *b, - const int size) { - double error = 0; - for (int i = 0; i < size; i++) { - error += fabs(static_cast<double>(a[i]) - static_cast<double>(b[i])); - } - error = error / size; - return error; -} - -template <typename Type> -void fliplr(Type *dest, int width, int height, int stride); - -template <typename Type> -void flipud(Type *dest, int width, int height, int stride); - -template <typename Type> -void fliplrud(Type *dest, int width, int height, int stride); - -typedef void (*TxfmFunc)(const int32_t *in, int32_t *out, const int8_t cos_bit, - const int8_t *range_bit); - -typedef void (*InvTxfm2dFunc)(const int32_t *, uint16_t *, int, TX_TYPE, int); -typedef void (*LbdInvTxfm2dFunc)(const int32_t *, uint8_t *, int, TX_TYPE, - TX_SIZE, int); - -static const int bd = 10; -static const int input_base = (1 << bd); - -static INLINE bool IsTxSizeTypeValid(TX_SIZE tx_size, TX_TYPE tx_type) { - const TX_SIZE tx_size_sqr_up = txsize_sqr_up_map[tx_size]; - TxSetType tx_set_type; - if (tx_size_sqr_up > TX_32X32) { - tx_set_type = EXT_TX_SET_DCTONLY; - } else if (tx_size_sqr_up == TX_32X32) { - tx_set_type = EXT_TX_SET_DCT_IDTX; - } else { - tx_set_type = EXT_TX_SET_ALL16; - } - return av1_ext_tx_used[tx_set_type][tx_type] != 0; -} - -#if CONFIG_AV1_ENCODER - -static const FwdTxfm2dFunc fwd_txfm_func_ls[TX_SIZES_ALL] = { - av1_fwd_txfm2d_4x4_c, av1_fwd_txfm2d_8x8_c, av1_fwd_txfm2d_16x16_c, - av1_fwd_txfm2d_32x32_c, av1_fwd_txfm2d_64x64_c, av1_fwd_txfm2d_4x8_c, - av1_fwd_txfm2d_8x4_c, av1_fwd_txfm2d_8x16_c, av1_fwd_txfm2d_16x8_c, - av1_fwd_txfm2d_16x32_c, av1_fwd_txfm2d_32x16_c, av1_fwd_txfm2d_32x64_c, - av1_fwd_txfm2d_64x32_c, av1_fwd_txfm2d_4x16_c, av1_fwd_txfm2d_16x4_c, - av1_fwd_txfm2d_8x32_c, av1_fwd_txfm2d_32x8_c, av1_fwd_txfm2d_16x64_c, - av1_fwd_txfm2d_64x16_c, -}; -#endif - -static const InvTxfm2dFunc inv_txfm_func_ls[TX_SIZES_ALL] = { - av1_inv_txfm2d_add_4x4_c, av1_inv_txfm2d_add_8x8_c, - av1_inv_txfm2d_add_16x16_c, av1_inv_txfm2d_add_32x32_c, - av1_inv_txfm2d_add_64x64_c, av1_inv_txfm2d_add_4x8_c, - av1_inv_txfm2d_add_8x4_c, av1_inv_txfm2d_add_8x16_c, - av1_inv_txfm2d_add_16x8_c, av1_inv_txfm2d_add_16x32_c, - av1_inv_txfm2d_add_32x16_c, av1_inv_txfm2d_add_32x64_c, - av1_inv_txfm2d_add_64x32_c, av1_inv_txfm2d_add_4x16_c, - av1_inv_txfm2d_add_16x4_c, av1_inv_txfm2d_add_8x32_c, - av1_inv_txfm2d_add_32x8_c, av1_inv_txfm2d_add_16x64_c, - av1_inv_txfm2d_add_64x16_c, -}; - -#define BD_NUM 3 - -extern int bd_arr[]; -extern int8_t low_range_arr[]; -extern int8_t high_range_arr[]; - -void txfm_stage_range_check(const int8_t *stage_range, int stage_num, - const int8_t cos_bit, int low_range, - int high_range); -} // namespace libaom_test -#endif // AOM_TEST_AV1_TXFM_TEST_H_ diff --git a/third_party/aom/test/av1_wedge_utils_test.cc b/third_party/aom/test/av1_wedge_utils_test.cc deleted file mode 100644 index e8fbe69a4..000000000 --- a/third_party/aom/test/av1_wedge_utils_test.cc +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" -#include "config/av1_rtcd.h" - -#include "aom_dsp/aom_dsp_common.h" - -#include "av1/common/enums.h" - -#include "test/acm_random.h" -#include "test/function_equivalence_test.h" -#include "test/register_state_check.h" - -#define WEDGE_WEIGHT_BITS 6 -#define MAX_MASK_VALUE (1 << (WEDGE_WEIGHT_BITS)) - -using libaom_test::ACMRandom; -using libaom_test::FunctionEquivalenceTest; - -namespace { - -static const int16_t kInt13Max = (1 << 12) - 1; - -////////////////////////////////////////////////////////////////////////////// -// av1_wedge_sse_from_residuals - functionality -////////////////////////////////////////////////////////////////////////////// - -class WedgeUtilsSSEFuncTest : public testing::Test { - protected: - WedgeUtilsSSEFuncTest() : rng_(ACMRandom::DeterministicSeed()) {} - - static const int kIterations = 1000; - - ACMRandom rng_; -}; - -static void equiv_blend_residuals(int16_t *r, const int16_t *r0, - const int16_t *r1, const uint8_t *m, int N) { - for (int i = 0; i < N; i++) { - const int32_t m0 = m[i]; - const int32_t m1 = MAX_MASK_VALUE - m0; - const int16_t R = m0 * r0[i] + m1 * r1[i]; - // Note that this rounding is designed to match the result - // you would get when actually blending the 2 predictors and computing - // the residuals. - r[i] = ROUND_POWER_OF_TWO(R - 1, WEDGE_WEIGHT_BITS); - } -} - -static uint64_t equiv_sse_from_residuals(const int16_t *r0, const int16_t *r1, - const uint8_t *m, int N) { - uint64_t acc = 0; - for (int i = 0; i < N; i++) { - const int32_t m0 = m[i]; - const int32_t m1 = MAX_MASK_VALUE - m0; - const int16_t R = m0 * r0[i] + m1 * r1[i]; - const int32_t r = ROUND_POWER_OF_TWO(R - 1, WEDGE_WEIGHT_BITS); - acc += r * r; - } - return acc; -} - -TEST_F(WedgeUtilsSSEFuncTest, ResidualBlendingEquiv) { - DECLARE_ALIGNED(32, uint8_t, s[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, p0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, p1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, p[MAX_SB_SQUARE]); - - DECLARE_ALIGNED(32, int16_t, r0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r_ref[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r_tst[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - s[i] = rng_.Rand8(); - m[i] = rng_(MAX_MASK_VALUE + 1); - } - - const int w = 1 << (rng_(MAX_SB_SIZE_LOG2 + 1 - 3) + 3); - const int h = 1 << (rng_(MAX_SB_SIZE_LOG2 + 1 - 3) + 3); - const int N = w * h; - - for (int j = 0; j < N; j++) { - p0[j] = clamp(s[j] + rng_(33) - 16, 0, UINT8_MAX); - p1[j] = clamp(s[j] + rng_(33) - 16, 0, UINT8_MAX); - } - - aom_blend_a64_mask(p, w, p0, w, p1, w, m, w, w, h, 0, 0); - - aom_subtract_block(h, w, r0, w, s, w, p0, w); - aom_subtract_block(h, w, r1, w, s, w, p1, w); - - aom_subtract_block(h, w, r_ref, w, s, w, p, w); - equiv_blend_residuals(r_tst, r0, r1, m, N); - - for (int i = 0; i < N; ++i) ASSERT_EQ(r_ref[i], r_tst[i]); - - uint64_t ref_sse = aom_sum_squares_i16(r_ref, N); - uint64_t tst_sse = equiv_sse_from_residuals(r0, r1, m, N); - - ASSERT_EQ(ref_sse, tst_sse); - } -} - -static uint64_t sse_from_residuals(const int16_t *r0, const int16_t *r1, - const uint8_t *m, int N) { - uint64_t acc = 0; - for (int i = 0; i < N; i++) { - const int32_t m0 = m[i]; - const int32_t m1 = MAX_MASK_VALUE - m0; - const int32_t r = m0 * r0[i] + m1 * r1[i]; - acc += r * r; - } - return ROUND_POWER_OF_TWO(acc, 2 * WEDGE_WEIGHT_BITS); -} - -TEST_F(WedgeUtilsSSEFuncTest, ResidualBlendingMethod) { - DECLARE_ALIGNED(32, int16_t, r0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, d[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r1[i] = rng_(2 * INT8_MAX - 2 * INT8_MIN + 1) + 2 * INT8_MIN; - d[i] = rng_(2 * INT8_MAX - 2 * INT8_MIN + 1) + 2 * INT8_MIN; - m[i] = rng_(MAX_MASK_VALUE + 1); - } - - const int N = 64 * (rng_(MAX_SB_SQUARE / 64) + 1); - - for (int i = 0; i < N; i++) r0[i] = r1[i] + d[i]; - - const uint64_t ref_res = sse_from_residuals(r0, r1, m, N); - const uint64_t tst_res = av1_wedge_sse_from_residuals(r1, d, m, N); - - ASSERT_EQ(ref_res, tst_res); - } -} - -////////////////////////////////////////////////////////////////////////////// -// av1_wedge_sse_from_residuals - optimizations -////////////////////////////////////////////////////////////////////////////// - -typedef uint64_t (*FSSE)(const int16_t *r1, const int16_t *d, const uint8_t *m, - int N); -typedef libaom_test::FuncParam<FSSE> TestFuncsFSSE; - -class WedgeUtilsSSEOptTest : public FunctionEquivalenceTest<FSSE> { - protected: - static const int kIterations = 10000; -}; - -TEST_P(WedgeUtilsSSEOptTest, RandomValues) { - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, d[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r1[i] = rng_(2 * kInt13Max + 1) - kInt13Max; - d[i] = rng_(2 * kInt13Max + 1) - kInt13Max; - m[i] = rng_(MAX_MASK_VALUE + 1); - } - - const int N = 64 * (rng_(MAX_SB_SQUARE / 64) + 1); - - const uint64_t ref_res = params_.ref_func(r1, d, m, N); - uint64_t tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(r1, d, m, N)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -TEST_P(WedgeUtilsSSEOptTest, ExtremeValues) { - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, d[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - if (rng_(2)) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) r1[i] = kInt13Max; - } else { - for (int i = 0; i < MAX_SB_SQUARE; ++i) r1[i] = -kInt13Max; - } - - if (rng_(2)) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) d[i] = kInt13Max; - } else { - for (int i = 0; i < MAX_SB_SQUARE; ++i) d[i] = -kInt13Max; - } - - for (int i = 0; i < MAX_SB_SQUARE; ++i) m[i] = MAX_MASK_VALUE; - - const int N = 64 * (rng_(MAX_SB_SQUARE / 64) + 1); - - const uint64_t ref_res = params_.ref_func(r1, d, m, N); - uint64_t tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(r1, d, m, N)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -////////////////////////////////////////////////////////////////////////////// -// av1_wedge_sign_from_residuals -////////////////////////////////////////////////////////////////////////////// - -typedef int (*FSign)(const int16_t *ds, const uint8_t *m, int N, int64_t limit); -typedef libaom_test::FuncParam<FSign> TestFuncsFSign; - -class WedgeUtilsSignOptTest : public FunctionEquivalenceTest<FSign> { - protected: - static const int kIterations = 10000; - static const int kMaxSize = 8196; // Size limited by SIMD implementation. -}; - -TEST_P(WedgeUtilsSignOptTest, RandomValues) { - DECLARE_ALIGNED(32, int16_t, r0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, ds[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r0[i] = rng_(2 * kInt13Max + 1) - kInt13Max; - r1[i] = rng_(2 * kInt13Max + 1) - kInt13Max; - m[i] = rng_(MAX_MASK_VALUE + 1); - } - - const int maxN = AOMMIN(kMaxSize, MAX_SB_SQUARE); - const int N = 64 * (rng_(maxN / 64 - 1) + 1); - - int64_t limit; - limit = (int64_t)aom_sum_squares_i16(r0, N); - limit -= (int64_t)aom_sum_squares_i16(r1, N); - limit *= (1 << WEDGE_WEIGHT_BITS) / 2; - - for (int i = 0; i < N; i++) - ds[i] = clamp(r0[i] * r0[i] - r1[i] * r1[i], INT16_MIN, INT16_MAX); - - const int ref_res = params_.ref_func(ds, m, N, limit); - int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(ds, m, N, limit)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -TEST_P(WedgeUtilsSignOptTest, ExtremeValues) { - DECLARE_ALIGNED(32, int16_t, r0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, r1[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, ds[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint8_t, m[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - switch (rng_(4)) { - case 0: - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r0[i] = 0; - r1[i] = kInt13Max; - } - break; - case 1: - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r0[i] = kInt13Max; - r1[i] = 0; - } - break; - case 2: - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r0[i] = 0; - r1[i] = -kInt13Max; - } - break; - default: - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - r0[i] = -kInt13Max; - r1[i] = 0; - } - break; - } - - for (int i = 0; i < MAX_SB_SQUARE; ++i) m[i] = MAX_MASK_VALUE; - - const int maxN = AOMMIN(kMaxSize, MAX_SB_SQUARE); - const int N = 64 * (rng_(maxN / 64 - 1) + 1); - - int64_t limit; - limit = (int64_t)aom_sum_squares_i16(r0, N); - limit -= (int64_t)aom_sum_squares_i16(r1, N); - limit *= (1 << WEDGE_WEIGHT_BITS) / 2; - - for (int i = 0; i < N; i++) - ds[i] = clamp(r0[i] * r0[i] - r1[i] * r1[i], INT16_MIN, INT16_MAX); - - const int ref_res = params_.ref_func(ds, m, N, limit); - int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(ds, m, N, limit)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -////////////////////////////////////////////////////////////////////////////// -// av1_wedge_compute_delta_squares -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FDS)(int16_t *d, const int16_t *a, const int16_t *b, int N); -typedef libaom_test::FuncParam<FDS> TestFuncsFDS; - -class WedgeUtilsDeltaSquaresOptTest : public FunctionEquivalenceTest<FDS> { - protected: - static const int kIterations = 10000; -}; - -TEST_P(WedgeUtilsDeltaSquaresOptTest, RandomValues) { - DECLARE_ALIGNED(32, int16_t, a[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, b[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, d_ref[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int16_t, d_tst[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - a[i] = rng_.Rand16(); - b[i] = rng_(2 * INT16_MAX + 1) - INT16_MAX; - } - - const int N = 64 * (rng_(MAX_SB_SQUARE / 64) + 1); - - memset(&d_ref, INT16_MAX, sizeof(d_ref)); - memset(&d_tst, INT16_MAX, sizeof(d_tst)); - - params_.ref_func(d_ref, a, b, N); - ASM_REGISTER_STATE_CHECK(params_.tst_func(d_tst, a, b, N)); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) ASSERT_EQ(d_ref[i], d_tst[i]); - } -} - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, WedgeUtilsSSEOptTest, - ::testing::Values(TestFuncsFSSE(av1_wedge_sse_from_residuals_c, - av1_wedge_sse_from_residuals_sse2))); - -INSTANTIATE_TEST_CASE_P( - SSE2, WedgeUtilsSignOptTest, - ::testing::Values(TestFuncsFSign(av1_wedge_sign_from_residuals_c, - av1_wedge_sign_from_residuals_sse2))); - -INSTANTIATE_TEST_CASE_P( - SSE2, WedgeUtilsDeltaSquaresOptTest, - ::testing::Values(TestFuncsFDS(av1_wedge_compute_delta_squares_c, - av1_wedge_compute_delta_squares_sse2))); -#endif // HAVE_SSE2 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, WedgeUtilsSSEOptTest, - ::testing::Values(TestFuncsFSSE(av1_wedge_sse_from_residuals_sse2, - av1_wedge_sse_from_residuals_avx2))); - -INSTANTIATE_TEST_CASE_P( - AVX2, WedgeUtilsSignOptTest, - ::testing::Values(TestFuncsFSign(av1_wedge_sign_from_residuals_sse2, - av1_wedge_sign_from_residuals_avx2))); - -INSTANTIATE_TEST_CASE_P( - AVX2, WedgeUtilsDeltaSquaresOptTest, - ::testing::Values(TestFuncsFDS(av1_wedge_compute_delta_squares_sse2, - av1_wedge_compute_delta_squares_avx2))); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/best_encode.sh b/third_party/aom/test/best_encode.sh deleted file mode 100755 index fe31a01cb..000000000 --- a/third_party/aom/test/best_encode.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2016, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and -# the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -# was not distributed with this source code in the LICENSE file, you can -# obtain it at www.aomedia.org/license/software. If the Alliance for Open -# Media Patent License 1.0 was not distributed with this source code in the -# PATENTS file, you can obtain it at www.aomedia.org/license/patent. -# -# Author: jimbankoski@google.com (Jim Bankoski) - -if [[ $# -ne 2 ]]; then - echo "Encodes a file using best known settings (slow!)" - echo " Usage: be [FILE] [BITRATE]" - echo " Example: be akiyo_cif.y4m 200" - exit -fi - -f=$1 # file is first parameter -b=$2 # bitrate is second parameter - -if [[ -e $f.fpf ]]; then - # First-pass file found, do second pass only - aomenc \ - $f \ - -o $f-$b.av1.webm \ - -p 2 \ - --pass=2 \ - --fpf=$f.fpf \ - --best \ - --cpu-used=0 \ - --target-bitrate=$b \ - --auto-alt-ref=1 \ - -v \ - --minsection-pct=0 \ - --maxsection-pct=800 \ - --lag-in-frames=25 \ - --kf-min-dist=0 \ - --kf-max-dist=99999 \ - --static-thresh=0 \ - --min-q=0 \ - --max-q=63 \ - --drop-frame=0 \ - --bias-pct=50 \ - --minsection-pct=0 \ - --maxsection-pct=800 \ - --psnr \ - --arnr-maxframes=7 \ - --arnr-strength=3 \ - --arnr-type=3 -else - # No first-pass file found, do 2-pass encode - aomenc \ - $f \ - -o $f-$b.av1.webm \ - -p 2 \ - --pass=1 \ - --fpf=$f.fpf \ - --best \ - --cpu-used=0 \ - --target-bitrate=$b \ - --auto-alt-ref=1 \ - -v \ - --minsection-pct=0 \ - --maxsection-pct=800 \ - --lag-in-frames=25 \ - --kf-min-dist=0 \ - --kf-max-dist=99999 \ - --static-thresh=0 \ - --min-q=0 \ - --max-q=63 \ - --drop-frame=0 - - aomenc \ - $f \ - -o $f-$b.av1.webm \ - -p 2 \ - --pass=2 \ - --fpf=$f.fpf \ - --best \ - --cpu-used=0 \ - --target-bitrate=$b \ - --auto-alt-ref=1 \ - -v \ - --minsection-pct=0 \ - --maxsection-pct=800 \ - --lag-in-frames=25 \ - --kf-min-dist=0 \ - --kf-max-dist=99999 \ - --static-thresh=0 \ - --min-q=0 \ - --max-q=63 \ - --drop-frame=0 \ - --bias-pct=50 \ - --minsection-pct=0 \ - --maxsection-pct=800 \ - --psnr \ - --arnr-maxframes=7 \ - --arnr-strength=3 \ - --arnr-type=3 -fi diff --git a/third_party/aom/test/binary_codes_test.cc b/third_party/aom/test/binary_codes_test.cc deleted file mode 100644 index 45660cf85..000000000 --- a/third_party/aom/test/binary_codes_test.cc +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "test/acm_random.h" -#include "aom/aom_integer.h" -#include "aom_dsp/bitreader.h" -#include "aom_dsp/bitwriter.h" -#include "aom_dsp/binary_codes_reader.h" -#include "aom_dsp/binary_codes_writer.h" - -#define ACCT_STR __func__ - -using libaom_test::ACMRandom; - -namespace { - -// Test for Finite subexponential code with reference -TEST(AV1, TestPrimitiveRefsubexpfin) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int kBufferSize = 65536; - aom_writer bw; - uint8_t bw_buffer[kBufferSize]; - const uint16_t kRanges = 8; - const uint16_t kSubexpParams = 6; - const uint16_t kReferences = 8; - const uint16_t kValues = 16; - uint16_t enc_values[kRanges][kSubexpParams][kReferences][kValues][4]; - const uint16_t range_vals[kRanges] = { 1, 13, 64, 120, 230, 420, 1100, 8000 }; - aom_start_encode(&bw, bw_buffer); - for (int n = 0; n < kRanges; ++n) { - const uint16_t range = range_vals[n]; - for (int k = 0; k < kSubexpParams; ++k) { - for (int r = 0; r < kReferences; ++r) { - const uint16_t ref = rnd(range); - for (int v = 0; v < kValues; ++v) { - const uint16_t value = rnd(range); - enc_values[n][k][r][v][0] = range; - enc_values[n][k][r][v][1] = k; - enc_values[n][k][r][v][2] = ref; - enc_values[n][k][r][v][3] = value; - aom_write_primitive_refsubexpfin(&bw, range, k, ref, value); - } - } - } - } - aom_stop_encode(&bw); - aom_reader br; - aom_reader_init(&br, bw_buffer, bw.pos); - GTEST_ASSERT_GE(aom_reader_tell(&br), 0u); - GTEST_ASSERT_LE(aom_reader_tell(&br), 1u); - for (int n = 0; n < kRanges; ++n) { - for (int k = 0; k < kSubexpParams; ++k) { - for (int r = 0; r < kReferences; ++r) { - for (int v = 0; v < kValues; ++v) { - const uint16_t range = enc_values[n][k][r][v][0]; - assert(k == enc_values[n][k][r][v][1]); - const uint16_t ref = enc_values[n][k][r][v][2]; - const uint16_t value = - aom_read_primitive_refsubexpfin(&br, range, k, ref, ACCT_STR); - GTEST_ASSERT_EQ(value, enc_values[n][k][r][v][3]); - } - } - } - } -} -// TODO(debargha): Adds tests for other primitives -} // namespace diff --git a/third_party/aom/test/blend_a64_mask_1d_test.cc b/third_party/aom/test/blend_a64_mask_1d_test.cc deleted file mode 100644 index f8844eef8..000000000 --- a/third_party/aom/test/blend_a64_mask_1d_test.cc +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/register_state_check.h" -#include "test/function_equivalence_test.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" -#include "config/av1_rtcd.h" - -#include "aom/aom_integer.h" - -#include "av1/common/enums.h" - -#include "aom_dsp/blend.h" - -using libaom_test::FunctionEquivalenceTest; - -namespace { - -template <typename F, typename T> -class BlendA64Mask1DTest : public FunctionEquivalenceTest<F> { - public: - static const int kIterations = 10000; - static const int kMaxWidth = MAX_SB_SIZE * 5; // * 5 to cover longer strides - static const int kMaxHeight = MAX_SB_SIZE; - static const int kBufSize = kMaxWidth * kMaxHeight; - static const int kMaxMaskWidth = 2 * MAX_SB_SIZE; - static const int kMaxMaskSize = kMaxMaskWidth; - - virtual ~BlendA64Mask1DTest() {} - - virtual void Execute(const T *p_src0, const T *p_src1) = 0; - - void Common() { - w_ = 2 << this->rng_(MAX_SB_SIZE_LOG2); - h_ = 2 << this->rng_(MAX_SB_SIZE_LOG2); - - dst_offset_ = this->rng_(33); - dst_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - src0_offset_ = this->rng_(33); - src0_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - src1_offset_ = this->rng_(33); - src1_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - T *p_src0; - T *p_src1; - - switch (this->rng_(3)) { - case 0: // Separate sources - p_src0 = src0_; - p_src1 = src1_; - break; - case 1: // src0 == dst - p_src0 = dst_tst_; - src0_stride_ = dst_stride_; - src0_offset_ = dst_offset_; - p_src1 = src1_; - break; - case 2: // src1 == dst - p_src0 = src0_; - p_src1 = dst_tst_; - src1_stride_ = dst_stride_; - src1_offset_ = dst_offset_; - break; - default: FAIL(); - } - - Execute(p_src0, p_src1); - - for (int r = 0; r < h_; ++r) { - for (int c = 0; c < w_; ++c) { - ASSERT_EQ(dst_ref_[dst_offset_ + r * dst_stride_ + c], - dst_tst_[dst_offset_ + r * dst_stride_ + c]); - } - } - } - - T dst_ref_[kBufSize]; - T dst_tst_[kBufSize]; - uint32_t dst_stride_; - uint32_t dst_offset_; - - T src0_[kBufSize]; - uint32_t src0_stride_; - uint32_t src0_offset_; - - T src1_[kBufSize]; - uint32_t src1_stride_; - uint32_t src1_offset_; - - uint8_t mask_[kMaxMaskSize]; - - int w_; - int h_; -}; - -////////////////////////////////////////////////////////////////////////////// -// 8 bit version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*F8B)(uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, - uint32_t src1_stride, const uint8_t *mask, int w, int h); -typedef libaom_test::FuncParam<F8B> TestFuncs; - -class BlendA64Mask1DTest8B : public BlendA64Mask1DTest<F8B, uint8_t> { - protected: - void Execute(const uint8_t *p_src0, const uint8_t *p_src1) { - params_.ref_func(dst_ref_ + dst_offset_, dst_stride_, p_src0 + src0_offset_, - src0_stride_, p_src1 + src1_offset_, src1_stride_, mask_, - w_, h_); - ASM_REGISTER_STATE_CHECK(params_.tst_func( - dst_tst_ + dst_offset_, dst_stride_, p_src0 + src0_offset_, - src0_stride_, p_src1 + src1_offset_, src1_stride_, mask_, w_, h_)); - } -}; - -TEST_P(BlendA64Mask1DTest8B, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_.Rand8(); - dst_tst_[i] = rng_.Rand8(); - - src0_[i] = rng_.Rand8(); - src1_[i] = rng_.Rand8(); - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - Common(); - } -} - -TEST_P(BlendA64Mask1DTest8B, ExtremeValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(2) + 254; - dst_tst_[i] = rng_(2) + 254; - src0_[i] = rng_(2) + 254; - src1_[i] = rng_(2) + 254; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(2) + AOM_BLEND_A64_MAX_ALPHA - 1; - - Common(); - } -} - -static void blend_a64_hmask_ref(uint8_t *dst, uint32_t dst_stride, - const uint8_t *src0, uint32_t src0_stride, - const uint8_t *src1, uint32_t src1_stride, - const uint8_t *mask, int w, int h) { - uint8_t mask2d[BlendA64Mask1DTest8B::kMaxMaskSize] - [BlendA64Mask1DTest8B::kMaxMaskSize]; - - for (int row = 0; row < h; ++row) - for (int col = 0; col < w; ++col) mask2d[row][col] = mask[col]; - - aom_blend_a64_mask_c(dst, dst_stride, src0, src0_stride, src1, src1_stride, - &mask2d[0][0], BlendA64Mask1DTest8B::kMaxMaskSize, w, h, - 0, 0); -} - -static void blend_a64_vmask_ref(uint8_t *dst, uint32_t dst_stride, - const uint8_t *src0, uint32_t src0_stride, - const uint8_t *src1, uint32_t src1_stride, - const uint8_t *mask, int w, int h) { - uint8_t mask2d[BlendA64Mask1DTest8B::kMaxMaskSize] - [BlendA64Mask1DTest8B::kMaxMaskSize]; - - for (int row = 0; row < h; ++row) - for (int col = 0; col < w; ++col) mask2d[row][col] = mask[row]; - - aom_blend_a64_mask_c(dst, dst_stride, src0, src0_stride, src1, src1_stride, - &mask2d[0][0], BlendA64Mask1DTest8B::kMaxMaskSize, w, h, - 0, 0); -} - -INSTANTIATE_TEST_CASE_P( - C, BlendA64Mask1DTest8B, - ::testing::Values(TestFuncs(blend_a64_hmask_ref, aom_blend_a64_hmask_c), - TestFuncs(blend_a64_vmask_ref, aom_blend_a64_vmask_c))); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, BlendA64Mask1DTest8B, - ::testing::Values( - TestFuncs(blend_a64_hmask_ref, aom_blend_a64_hmask_sse4_1), - TestFuncs(blend_a64_vmask_ref, aom_blend_a64_vmask_sse4_1))); -#endif // HAVE_SSE4_1 - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, BlendA64Mask1DTest8B, - ::testing::Values(TestFuncs(blend_a64_hmask_ref, - aom_blend_a64_hmask_neon), - TestFuncs(blend_a64_vmask_ref, - aom_blend_a64_vmask_neon))); -#endif // HAVE_NEON - -////////////////////////////////////////////////////////////////////////////// -// High bit-depth version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FHBD)(uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, - uint32_t src1_stride, const uint8_t *mask, int w, int h, - int bd); -typedef libaom_test::FuncParam<FHBD> TestFuncsHBD; - -class BlendA64Mask1DTestHBD : public BlendA64Mask1DTest<FHBD, uint16_t> { - protected: - void Execute(const uint16_t *p_src0, const uint16_t *p_src1) { - params_.ref_func(CONVERT_TO_BYTEPTR(dst_ref_ + dst_offset_), dst_stride_, - CONVERT_TO_BYTEPTR(p_src0 + src0_offset_), src0_stride_, - CONVERT_TO_BYTEPTR(p_src1 + src1_offset_), src1_stride_, - mask_, w_, h_, bit_depth_); - ASM_REGISTER_STATE_CHECK(params_.tst_func( - CONVERT_TO_BYTEPTR(dst_tst_ + dst_offset_), dst_stride_, - CONVERT_TO_BYTEPTR(p_src0 + src0_offset_), src0_stride_, - CONVERT_TO_BYTEPTR(p_src1 + src1_offset_), src1_stride_, mask_, w_, h_, - bit_depth_)); - } - - int bit_depth_; -}; - -TEST_P(BlendA64Mask1DTestHBD, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - - const int hi = 1 << bit_depth_; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(hi); - dst_tst_[i] = rng_(hi); - src0_[i] = rng_(hi); - src1_[i] = rng_(hi); - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - Common(); - } -} - -TEST_P(BlendA64Mask1DTestHBD, ExtremeValues) { - for (int iter = 0; iter < 1000 && !HasFatalFailure(); ++iter) { - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - - const int hi = 1 << bit_depth_; - const int lo = hi - 2; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(hi - lo) + lo; - dst_tst_[i] = rng_(hi - lo) + lo; - src0_[i] = rng_(hi - lo) + lo; - src1_[i] = rng_(hi - lo) + lo; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(2) + AOM_BLEND_A64_MAX_ALPHA - 1; - - Common(); - } -} - -static void highbd_blend_a64_hmask_ref( - uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, uint32_t src1_stride, - const uint8_t *mask, int w, int h, int bd) { - uint8_t mask2d[BlendA64Mask1DTestHBD::kMaxMaskSize] - [BlendA64Mask1DTestHBD::kMaxMaskSize]; - - for (int row = 0; row < h; ++row) - for (int col = 0; col < w; ++col) mask2d[row][col] = mask[col]; - - aom_highbd_blend_a64_mask_c( - dst, dst_stride, src0, src0_stride, src1, src1_stride, &mask2d[0][0], - BlendA64Mask1DTestHBD::kMaxMaskSize, w, h, 0, 0, bd); -} - -static void highbd_blend_a64_vmask_ref( - uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, uint32_t src1_stride, - const uint8_t *mask, int w, int h, int bd) { - uint8_t mask2d[BlendA64Mask1DTestHBD::kMaxMaskSize] - [BlendA64Mask1DTestHBD::kMaxMaskSize]; - - for (int row = 0; row < h; ++row) - for (int col = 0; col < w; ++col) mask2d[row][col] = mask[row]; - - aom_highbd_blend_a64_mask_c( - dst, dst_stride, src0, src0_stride, src1, src1_stride, &mask2d[0][0], - BlendA64Mask1DTestHBD::kMaxMaskSize, w, h, 0, 0, bd); -} - -INSTANTIATE_TEST_CASE_P( - C, BlendA64Mask1DTestHBD, - ::testing::Values(TestFuncsHBD(highbd_blend_a64_hmask_ref, - aom_highbd_blend_a64_hmask_c), - TestFuncsHBD(highbd_blend_a64_vmask_ref, - aom_highbd_blend_a64_vmask_c))); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, BlendA64Mask1DTestHBD, - ::testing::Values(TestFuncsHBD(highbd_blend_a64_hmask_ref, - aom_highbd_blend_a64_hmask_sse4_1), - TestFuncsHBD(highbd_blend_a64_vmask_ref, - aom_highbd_blend_a64_vmask_sse4_1))); -#endif // HAVE_SSE4_1 -} // namespace diff --git a/third_party/aom/test/blend_a64_mask_test.cc b/third_party/aom/test/blend_a64_mask_test.cc deleted file mode 100644 index 66ca6fc5f..000000000 --- a/third_party/aom/test/blend_a64_mask_test.cc +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/register_state_check.h" -#include "test/function_equivalence_test.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" -#include "config/av1_rtcd.h" - -#include "aom/aom_integer.h" - -#include "av1/common/enums.h" - -#include "aom_dsp/blend.h" - -using libaom_test::FunctionEquivalenceTest; - -namespace { - -template <typename BlendA64Func, typename SrcPixel, typename DstPixel> -class BlendA64MaskTest : public FunctionEquivalenceTest<BlendA64Func> { - protected: - static const int kIterations = 10000; - static const int kMaxWidth = MAX_SB_SIZE * 5; // * 5 to cover longer strides - static const int kMaxHeight = MAX_SB_SIZE; - static const int kBufSize = kMaxWidth * kMaxHeight; - static const int kMaxMaskWidth = 2 * MAX_SB_SIZE; - static const int kMaxMaskSize = kMaxMaskWidth * kMaxMaskWidth; - - virtual ~BlendA64MaskTest() {} - - virtual void Execute(const SrcPixel *p_src0, const SrcPixel *p_src1, - int run_times) = 0; - - template <typename Pixel> - void GetSources(Pixel **src0, Pixel **src1, Pixel * /*dst*/, int run_times) { - if (run_times > 1) { - *src0 = src0_; - *src1 = src1_; - return; - } - switch (this->rng_(3)) { - case 0: // Separate sources - *src0 = src0_; - *src1 = src1_; - break; - case 1: // src0 == dst - *src0 = dst_tst_; - src0_stride_ = dst_stride_; - src0_offset_ = dst_offset_; - *src1 = src1_; - break; - case 2: // src1 == dst - *src0 = src0_; - *src1 = dst_tst_; - src1_stride_ = dst_stride_; - src1_offset_ = dst_offset_; - break; - default: FAIL(); - } - } - - void GetSources(uint16_t **src0, uint16_t **src1, uint8_t * /*dst*/, - int /*run_times*/) { - *src0 = src0_; - *src1 = src1_; - } - - uint8_t Rand1() { return this->rng_.Rand8() & 1; } - - void RunOneTest(int block_size, int subx, int suby, int run_times) { - w_ = block_size_wide[block_size]; - h_ = block_size_high[block_size]; - run_times = run_times > 1 ? run_times / w_ : 1; - subx_ = subx; - suby_ = suby; - - dst_offset_ = this->rng_(33); - dst_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - src0_offset_ = this->rng_(33); - src0_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - src1_offset_ = this->rng_(33); - src1_stride_ = this->rng_(kMaxWidth + 1 - w_) + w_; - - mask_stride_ = - this->rng_(kMaxWidth + 1 - w_ * (subx_ ? 2 : 1)) + w_ * (subx_ ? 2 : 1); - - SrcPixel *p_src0; - SrcPixel *p_src1; - - p_src0 = src0_; - p_src1 = src1_; - - GetSources(&p_src0, &p_src1, &dst_ref_[0], run_times); - - Execute(p_src0, p_src1, run_times); - - for (int r = 0; r < h_; ++r) { - for (int c = 0; c < w_; ++c) { - ASSERT_EQ(dst_ref_[dst_offset_ + r * dst_stride_ + c], - dst_tst_[dst_offset_ + r * dst_stride_ + c]) - << w_ << "x" << h_ << " subx " << subx_ << " suby " << suby_ - << " r: " << r << " c: " << c; - } - } - } - - void RunTest(int block_size, int run_times) { - subx_ = Rand1(); - suby_ = Rand1(); - RunOneTest(block_size, subx_, suby_, run_times); - } - - DstPixel dst_ref_[kBufSize]; - DstPixel dst_tst_[kBufSize]; - uint32_t dst_stride_; - uint32_t dst_offset_; - - SrcPixel src0_[kBufSize]; - uint32_t src0_stride_; - uint32_t src0_offset_; - - SrcPixel src1_[kBufSize]; - uint32_t src1_stride_; - uint32_t src1_offset_; - - uint8_t mask_[kMaxMaskSize]; - size_t mask_stride_; - - int w_; - int h_; - - int suby_; - int subx_; -}; - -////////////////////////////////////////////////////////////////////////////// -// 8 bit version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*F8B)(uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, - uint32_t src1_stride, const uint8_t *mask, - uint32_t mask_stride, int w, int h, int subx, int suby); -typedef libaom_test::FuncParam<F8B> TestFuncs; - -class BlendA64MaskTest8B : public BlendA64MaskTest<F8B, uint8_t, uint8_t> { - protected: - void Execute(const uint8_t *p_src0, const uint8_t *p_src1, int run_times) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.ref_func(dst_ref_ + dst_offset_, dst_stride_, - p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.tst_func(dst_tst_ + dst_offset_, dst_stride_, - p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 1) { - printf("%3dx%-3d subx %d suby %d :%7.2f/%7.2fns", w_, h_, subx_, suby_, - time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - } -}; - -TEST_P(BlendA64MaskTest8B, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_.Rand8(); - dst_tst_[i] = rng_.Rand8(); - - src0_[i] = rng_.Rand8(); - src1_[i] = rng_.Rand8(); - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - RunTest(bsize, 1); - } -} - -TEST_P(BlendA64MaskTest8B, ExtremeValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(2) + 254; - dst_tst_[i] = rng_(2) + 254; - src0_[i] = rng_(2) + 254; - src1_[i] = rng_(2) + 254; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(2) + AOM_BLEND_A64_MAX_ALPHA - 1; - - RunTest(bsize, 1); - } -} -TEST_P(BlendA64MaskTest8B, DISABLED_Speed) { - const int kRunTimes = 10000000; - for (int bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) { - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_.Rand8(); - dst_tst_[i] = rng_.Rand8(); - - src0_[i] = rng_.Rand8(); - src1_[i] = rng_.Rand8(); - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - RunOneTest(bsize, 1, 1, kRunTimes); - RunOneTest(bsize, 1, 0, kRunTimes); - RunOneTest(bsize, 0, 1, kRunTimes); - RunOneTest(bsize, 0, 0, kRunTimes); - } -} -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, BlendA64MaskTest8B, - ::testing::Values(TestFuncs( - aom_blend_a64_mask_c, aom_blend_a64_mask_sse4_1))); -#endif // HAVE_AVX2 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, BlendA64MaskTest8B, - ::testing::Values(TestFuncs(aom_blend_a64_mask_sse4_1, - aom_blend_a64_mask_avx2))); -#endif // HAVE_SSE4_1 - -////////////////////////////////////////////////////////////////////////////// -// 8 bit _d16 version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*F8B_D16)(uint8_t *dst, uint32_t dst_stride, const uint16_t *src0, - uint32_t src0_stride, const uint16_t *src1, - uint32_t src1_stride, const uint8_t *mask, - uint32_t mask_stride, int w, int h, int subx, int suby, - ConvolveParams *conv_params); -typedef libaom_test::FuncParam<F8B_D16> TestFuncs_d16; - -class BlendA64MaskTest8B_d16 - : public BlendA64MaskTest<F8B_D16, uint16_t, uint8_t> { - protected: - // max number of bits used by the source - static const int kSrcMaxBitsMask = 0x3fff; - - void Execute(const uint16_t *p_src0, const uint16_t *p_src1, int run_times) { - ConvolveParams conv_params; - conv_params.round_0 = ROUND0_BITS; - conv_params.round_1 = COMPOUND_ROUND1_BITS; - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.ref_func(dst_ref_ + dst_offset_, dst_stride_, - p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_, &conv_params); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.tst_func(dst_tst_ + dst_offset_, dst_stride_, - p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_, &conv_params); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 1) { - printf("%3dx%-3d subx %d suby %d :%7.2f/%7.2fns", w_, h_, subx_, suby_, - time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - } -}; - -TEST_P(BlendA64MaskTest8B_d16, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_.Rand8(); - dst_tst_[i] = rng_.Rand8(); - - src0_[i] = rng_.Rand16() & kSrcMaxBitsMask; - src1_[i] = rng_.Rand16() & kSrcMaxBitsMask; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - RunTest(bsize, 1); - } -} - -TEST_P(BlendA64MaskTest8B_d16, ExtremeValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = 255; - dst_tst_[i] = 255; - - src0_[i] = kSrcMaxBitsMask; - src1_[i] = kSrcMaxBitsMask; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = AOM_BLEND_A64_MAX_ALPHA - 1; - - RunTest(bsize, 1); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, BlendA64MaskTest8B_d16, - ::testing::Values(TestFuncs_d16(aom_lowbd_blend_a64_d16_mask_c, - aom_lowbd_blend_a64_d16_mask_sse4_1))); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, BlendA64MaskTest8B_d16, - ::testing::Values(TestFuncs_d16(aom_lowbd_blend_a64_d16_mask_c, - aom_lowbd_blend_a64_d16_mask_avx2))); -#endif // HAVE_AVX2 - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON, BlendA64MaskTest8B_d16, - ::testing::Values(TestFuncs_d16(aom_lowbd_blend_a64_d16_mask_c, - aom_lowbd_blend_a64_d16_mask_neon))); -#endif // HAVE_NEON - -////////////////////////////////////////////////////////////////////////////// -// High bit-depth version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FHBD)(uint8_t *dst, uint32_t dst_stride, const uint8_t *src0, - uint32_t src0_stride, const uint8_t *src1, - uint32_t src1_stride, const uint8_t *mask, - uint32_t mask_stride, int w, int h, int subx, int suby, - int bd); -typedef libaom_test::FuncParam<FHBD> TestFuncsHBD; - -class BlendA64MaskTestHBD : public BlendA64MaskTest<FHBD, uint16_t, uint16_t> { - protected: - void Execute(const uint16_t *p_src0, const uint16_t *p_src1, int run_times) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.ref_func(CONVERT_TO_BYTEPTR(dst_ref_ + dst_offset_), dst_stride_, - CONVERT_TO_BYTEPTR(p_src0 + src0_offset_), src0_stride_, - CONVERT_TO_BYTEPTR(p_src1 + src1_offset_), src1_stride_, - mask_, kMaxMaskWidth, w_, h_, subx_, suby_, bit_depth_); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.tst_func(CONVERT_TO_BYTEPTR(dst_tst_ + dst_offset_), dst_stride_, - CONVERT_TO_BYTEPTR(p_src0 + src0_offset_), src0_stride_, - CONVERT_TO_BYTEPTR(p_src1 + src1_offset_), src1_stride_, - mask_, kMaxMaskWidth, w_, h_, subx_, suby_, bit_depth_); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 1) { - printf("%3dx%-3d subx %d suby %d :%7.2f/%7.2fns", w_, h_, subx_, suby_, - time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - } - - int bit_depth_; -}; - -TEST_P(BlendA64MaskTestHBD, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - - const int hi = 1 << bit_depth_; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(hi); - dst_tst_[i] = rng_(hi); - src0_[i] = rng_(hi); - src1_[i] = rng_(hi); - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - RunTest(bsize, 1); - } -} - -TEST_P(BlendA64MaskTestHBD, ExtremeValues) { - for (int iter = 0; iter < 1000 && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - - const int hi = 1 << bit_depth_; - const int lo = hi - 2; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_(hi - lo) + lo; - dst_tst_[i] = rng_(hi - lo) + lo; - src0_[i] = rng_(hi - lo) + lo; - src1_[i] = rng_(hi - lo) + lo; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(2) + AOM_BLEND_A64_MAX_ALPHA - 1; - - RunTest(bsize, 1); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, BlendA64MaskTestHBD, - ::testing::Values(TestFuncsHBD(aom_highbd_blend_a64_mask_c, - aom_highbd_blend_a64_mask_sse4_1))); -#endif // HAVE_SSE4_1 - -////////////////////////////////////////////////////////////////////////////// -// HBD _d16 version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FHBD_D16)(uint8_t *dst, uint32_t dst_stride, - const CONV_BUF_TYPE *src0, uint32_t src0_stride, - const CONV_BUF_TYPE *src1, uint32_t src1_stride, - const uint8_t *mask, uint32_t mask_stride, int w, - int h, int subx, int suby, ConvolveParams *conv_params, - const int bd); -typedef libaom_test::FuncParam<FHBD_D16> TestFuncsHBD_d16; - -class BlendA64MaskTestHBD_d16 - : public BlendA64MaskTest<FHBD_D16, uint16_t, uint16_t> { - protected: - // max number of bits used by the source - static const int kSrcMaxBitsMask = (1 << 14) - 1; - static const int kSrcMaxBitsMaskHBD = (1 << 16) - 1; - - void Execute(const uint16_t *p_src0, const uint16_t *p_src1, int run_times) { - ConvolveParams conv_params; - conv_params.round_0 = (bit_depth_ == 12) ? ROUND0_BITS + 2 : ROUND0_BITS; - conv_params.round_1 = COMPOUND_ROUND1_BITS; - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.ref_func(CONVERT_TO_BYTEPTR(dst_ref_ + dst_offset_), dst_stride_, - p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_, &conv_params, - bit_depth_); - } - if (params_.tst_func) { - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - params_.tst_func(CONVERT_TO_BYTEPTR(dst_tst_ + dst_offset_), - dst_stride_, p_src0 + src0_offset_, src0_stride_, - p_src1 + src1_offset_, src1_stride_, mask_, - kMaxMaskWidth, w_, h_, subx_, suby_, &conv_params, - bit_depth_); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 1) { - printf("%3dx%-3d subx %d suby %d :%7.2f/%7.2fns", w_, h_, subx_, suby_, - time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - } - } - - int bit_depth_; - int src_max_bits_mask_; -}; - -TEST_P(BlendA64MaskTestHBD_d16, RandomValues) { - if (params_.tst_func == NULL) return; - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - int bsize = rng_.Rand8() % BLOCK_SIZES_ALL; - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - src_max_bits_mask_ = - (bit_depth_ == 8) ? kSrcMaxBitsMask : kSrcMaxBitsMaskHBD; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = rng_.Rand8(); - dst_tst_[i] = rng_.Rand8(); - - src0_[i] = rng_.Rand16() & src_max_bits_mask_; - src1_[i] = rng_.Rand16() & src_max_bits_mask_; - } - - for (int i = 0; i < kMaxMaskSize; ++i) - mask_[i] = rng_(AOM_BLEND_A64_MAX_ALPHA + 1); - - RunTest(bsize, 1); - } -} -// TODO (Scott LaVarnway), fix this test -TEST_P(BlendA64MaskTestHBD_d16, DISABLED_SaturatedValues) { - for (int bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) { - for (bit_depth_ = 8; bit_depth_ <= 12; bit_depth_ += 2) { - src_max_bits_mask_ = - (bit_depth_ == 8) ? kSrcMaxBitsMask : kSrcMaxBitsMaskHBD; - - for (int i = 0; i < kBufSize; ++i) { - dst_ref_[i] = 0; - dst_tst_[i] = (1 << bit_depth_) - 1; - - src0_[i] = src_max_bits_mask_; - src1_[i] = src_max_bits_mask_; - } - - for (int i = 0; i < kMaxMaskSize; ++i) mask_[i] = AOM_BLEND_A64_MAX_ALPHA; - - RunTest(bsize, 1); - } - } -} - -INSTANTIATE_TEST_CASE_P( - C, BlendA64MaskTestHBD_d16, - ::testing::Values(TestFuncsHBD_d16(aom_highbd_blend_a64_d16_mask_c, NULL))); - -// TODO(slavarnway): Enable the following in the avx2 commit. (56501) -#if 0 -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - SSE4_1, BlendA64MaskTestHBD, - ::testing::Values(TestFuncsHBD(aom_highbd_blend_a64_mask_c, - aom_highbd_blend_a64_mask_avx2))); -#endif // HAVE_AVX2 -#endif -} // namespace diff --git a/third_party/aom/test/blockd_test.cc b/third_party/aom/test/blockd_test.cc deleted file mode 100644 index ab624007c..000000000 --- a/third_party/aom/test/blockd_test.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "av1/common/blockd.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -// Verify the optimized implementation of get_partition_subsize() produces the -// same results as the Partition_Subsize lookup table in the spec. -TEST(BlockdTest, GetPartitionSubsize) { - // The Partition_Subsize table in the spec (Section 9.3. Conversion tables). - /* clang-format off */ - static const BLOCK_SIZE kPartitionSubsize[10][BLOCK_SIZES_ALL] = { - { - BLOCK_4X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X128, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_128X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X128, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X4, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X8, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - }, { - BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X16, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X32, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X64, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, - BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID - } - }; - /* clang-format on */ - - for (int partition = 0; partition < 10; partition++) { - for (int bsize = BLOCK_4X4; bsize < BLOCK_SIZES_ALL; bsize++) { - EXPECT_EQ(kPartitionSubsize[partition][bsize], - get_partition_subsize(static_cast<BLOCK_SIZE>(bsize), - static_cast<PARTITION_TYPE>(partition))); - } - } -} diff --git a/third_party/aom/test/boolcoder_test.cc b/third_party/aom/test/boolcoder_test.cc deleted file mode 100644 index 680ec1877..000000000 --- a/third_party/aom/test/boolcoder_test.cc +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/acm_random.h" -#include "aom/aom_integer.h" -#include "aom_dsp/bitreader.h" -#include "aom_dsp/bitwriter.h" - -using libaom_test::ACMRandom; - -namespace { -const int num_tests = 10; -} // namespace - -TEST(AV1, TestBitIO) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int n = 0; n < num_tests; ++n) { - for (int method = 0; method <= 7; ++method) { // we generate various proba - const int kBitsToTest = 1000; - uint8_t probas[kBitsToTest]; - - for (int i = 0; i < kBitsToTest; ++i) { - const int parity = i & 1; - /* clang-format off */ - probas[i] = - (method == 0) ? 0 : (method == 1) ? 255 : - (method == 2) ? 128 : - (method == 3) ? rnd.Rand8() : - (method == 4) ? (parity ? 0 : 255) : - // alternate between low and high proba: - (method == 5) ? (parity ? rnd(128) : 255 - rnd(128)) : - (method == 6) ? - (parity ? rnd(64) : 255 - rnd(64)) : - (parity ? rnd(32) : 255 - rnd(32)); - /* clang-format on */ - } - for (int bit_method = 0; bit_method <= 3; ++bit_method) { - const int random_seed = 6432; - const int kBufferSize = 10000; - ACMRandom bit_rnd(random_seed); - aom_writer bw; - uint8_t bw_buffer[kBufferSize]; - aom_start_encode(&bw, bw_buffer); - - int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0; - for (int i = 0; i < kBitsToTest; ++i) { - if (bit_method == 2) { - bit = (i & 1); - } else if (bit_method == 3) { - bit = bit_rnd(2); - } - aom_write(&bw, bit, static_cast<int>(probas[i])); - } - - aom_stop_encode(&bw); - - aom_reader br; - aom_reader_init(&br, bw_buffer, bw.pos); - bit_rnd.Reset(random_seed); - for (int i = 0; i < kBitsToTest; ++i) { - if (bit_method == 2) { - bit = (i & 1); - } else if (bit_method == 3) { - bit = bit_rnd(2); - } - GTEST_ASSERT_EQ(aom_read(&br, probas[i], NULL), bit) - << "pos: " << i << " / " << kBitsToTest - << " bit_method: " << bit_method << " method: " << method; - } - } - } - } -} - -#define FRAC_DIFF_TOTAL_ERROR 0.18 - -TEST(AV1, TestTell) { - const int kBufferSize = 10000; - aom_writer bw; - uint8_t bw_buffer[kBufferSize]; - const int kSymbols = 1024; - // Coders are noisier at low probabilities, so we start at p = 4. - for (int p = 4; p < 256; p++) { - double probability = p / 256.; - aom_start_encode(&bw, bw_buffer); - for (int i = 0; i < kSymbols; i++) { - aom_write(&bw, 0, p); - } - aom_stop_encode(&bw); - aom_reader br; - aom_reader_init(&br, bw_buffer, bw.pos); - uint32_t last_tell = aom_reader_tell(&br); - uint32_t last_tell_frac = aom_reader_tell_frac(&br); - double frac_diff_total = 0; - GTEST_ASSERT_GE(aom_reader_tell(&br), 0u); - GTEST_ASSERT_LE(aom_reader_tell(&br), 1u); - ASSERT_FALSE(aom_reader_has_overflowed(&br)); - for (int i = 0; i < kSymbols; i++) { - aom_read(&br, p, NULL); - uint32_t tell = aom_reader_tell(&br); - uint32_t tell_frac = aom_reader_tell_frac(&br); - GTEST_ASSERT_GE(tell, last_tell) - << "tell: " << tell << ", last_tell: " << last_tell; - GTEST_ASSERT_GE(tell_frac, last_tell_frac) - << "tell_frac: " << tell_frac - << ", last_tell_frac: " << last_tell_frac; - // Frac tell should round up to tell. - GTEST_ASSERT_EQ(tell, (tell_frac + 7) >> 3); - last_tell = tell; - frac_diff_total += - fabs(((tell_frac - last_tell_frac) / 8.0) + log2(probability)); - last_tell_frac = tell_frac; - } - const uint32_t expected = (uint32_t)(-kSymbols * log2(probability)); - // Last tell should be close to the expected value. - GTEST_ASSERT_LE(last_tell, expected + 20) << " last_tell: " << last_tell; - // The average frac_diff error should be pretty small. - GTEST_ASSERT_LE(frac_diff_total / kSymbols, FRAC_DIFF_TOTAL_ERROR) - << " frac_diff_total: " << frac_diff_total; - ASSERT_FALSE(aom_reader_has_overflowed(&br)); - } -} - -TEST(AV1, TestHasOverflowed) { - const int kBufferSize = 10000; - aom_writer bw; - uint8_t bw_buffer[kBufferSize]; - const int kSymbols = 1024; - // Coders are noisier at low probabilities, so we start at p = 4. - for (int p = 4; p < 256; p++) { - aom_start_encode(&bw, bw_buffer); - for (int i = 0; i < kSymbols; i++) { - aom_write(&bw, 1, p); - } - aom_stop_encode(&bw); - aom_reader br; - aom_reader_init(&br, bw_buffer, bw.pos); - ASSERT_FALSE(aom_reader_has_overflowed(&br)); - for (int i = 0; i < kSymbols; i++) { - GTEST_ASSERT_EQ(aom_read(&br, p, NULL), 1); - ASSERT_FALSE(aom_reader_has_overflowed(&br)); - } - // In the worst case, the encoder uses just a tiny fraction of the last - // byte in the buffer. So to guarantee that aom_reader_has_overflowed() - // returns true, we have to consume very nearly 8 additional bits of data. - // In the worse case, one of the bits in that byte will be 1, and the rest - // will be zero. Once we are past that 1 bit, when the probability of - // reading zero symbol from aom_read() is high, each additional symbol read - // will consume very little additional data (in the case that p == 255, - // approximately -log_2(255/256) ~= 0.0056 bits). In that case it would - // take around 178 calls to consume more than 8 bits. That is only an upper - // bound. In practice we are not guaranteed to hit the worse case and can - // get away with 174 calls. - for (int i = 0; i < 174; i++) { - aom_read(&br, p, NULL); - } - ASSERT_TRUE(aom_reader_has_overflowed(&br)); - } -} diff --git a/third_party/aom/test/borders_test.cc b/third_party/aom/test/borders_test.cc deleted file mode 100644 index 893237ef3..000000000 --- a/third_party/aom/test/borders_test.cc +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <climits> -#include <vector> -#include "third_party/googletest/src/googletest/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 BordersTestLarge - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - BordersTestLarge() : EncoderTest(GET_PARAM(0)) {} - virtual ~BordersTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, 1); - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - if (pkt->data.frame.flags & AOM_FRAME_IS_KEY) { - } - } -}; - -TEST_P(BordersTestLarge, TestEncodeHighBitrate) { - // Validate that this non multiple of 64 wide clip encodes and decodes - // without a mismatch when passing in a very low max q. This pushes - // the encoder to producing lots of big partitions which will likely - // extend into the border and test the border condition. - cfg_.g_lag_in_frames = 25; - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 2000; - cfg_.rc_max_quantizer = 10; - - ::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, - 10); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} -TEST_P(BordersTestLarge, 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_.g_lag_in_frames = 25; - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 200; - cfg_.rc_min_quantizer = 40; - - ::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, - 10); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -AV1_INSTANTIATE_TEST_CASE(BordersTestLarge, - ::testing::Values(::libaom_test::kTwoPassGood)); -} // namespace diff --git a/third_party/aom/test/cdef_test.cc b/third_party/aom/test/cdef_test.cc deleted file mode 100644 index becc07291..000000000 --- a/third_party/aom/test/cdef_test.cc +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdlib> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/cdef_block.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -using libaom_test::ACMRandom; - -namespace { - -typedef ::testing::tuple<cdef_filter_block_func, cdef_filter_block_func, - BLOCK_SIZE, int, int> - cdef_dir_param_t; - -class CDEFBlockTest : public ::testing::TestWithParam<cdef_dir_param_t> { - public: - virtual ~CDEFBlockTest() {} - virtual void SetUp() { - cdef = GET_PARAM(0); - ref_cdef = GET_PARAM(1); - bsize = GET_PARAM(2); - boundary = GET_PARAM(3); - depth = GET_PARAM(4); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - int bsize; - int boundary; - int depth; - cdef_filter_block_func cdef; - cdef_filter_block_func ref_cdef; -}; - -typedef CDEFBlockTest CDEFSpeedTest; - -void test_cdef(int bsize, int iterations, cdef_filter_block_func cdef, - cdef_filter_block_func ref_cdef, int boundary, int depth) { - const int size = 8; - const int ysize = size + 2 * CDEF_VBORDER; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint16_t, s[ysize * CDEF_BSTRIDE]); - DECLARE_ALIGNED(16, static uint16_t, d[size * size]); - DECLARE_ALIGNED(16, static uint16_t, ref_d[size * size]); - memset(ref_d, 0, sizeof(ref_d)); - memset(d, 0, sizeof(d)); - - int error = 0, pristrength = 0, secstrength, dir; - int pridamping, secdamping, bits, level, count, - errdepth = 0, errpristrength = 0, errsecstrength = 0, errboundary = 0, - errpridamping = 0, errsecdamping = 0; - unsigned int pos = 0; - - const unsigned int max_pos = size * size >> static_cast<int>(depth == 8); - for (pridamping = 3 + depth - 8; pridamping < 7 - 3 * !!boundary + depth - 8; - pridamping++) { - for (secdamping = 3 + depth - 8; - secdamping < 7 - 3 * !!boundary + depth - 8; secdamping++) { - for (count = 0; count < iterations; count++) { - for (level = 0; level < (1 << depth) && !error; - level += (2 + 6 * !!boundary) << (depth - 8)) { - for (bits = 1; bits <= depth && !error; bits += 1 + 3 * !!boundary) { - for (unsigned int i = 0; i < sizeof(s) / sizeof(*s); i++) - s[i] = clamp((rnd.Rand16() & ((1 << bits) - 1)) + level, 0, - (1 << depth) - 1); - if (boundary) { - if (boundary & 1) { // Left - for (int i = 0; i < ysize; i++) - for (int j = 0; j < CDEF_HBORDER; j++) - s[i * CDEF_BSTRIDE + j] = CDEF_VERY_LARGE; - } - if (boundary & 2) { // Right - for (int i = 0; i < ysize; i++) - for (int j = CDEF_HBORDER + size; j < CDEF_BSTRIDE; j++) - s[i * CDEF_BSTRIDE + j] = CDEF_VERY_LARGE; - } - if (boundary & 4) { // Above - for (int i = 0; i < CDEF_VBORDER; i++) - for (int j = 0; j < CDEF_BSTRIDE; j++) - s[i * CDEF_BSTRIDE + j] = CDEF_VERY_LARGE; - } - if (boundary & 8) { // Below - for (int i = CDEF_VBORDER + size; i < ysize; i++) - for (int j = 0; j < CDEF_BSTRIDE; j++) - s[i * CDEF_BSTRIDE + j] = CDEF_VERY_LARGE; - } - } - for (dir = 0; dir < 8; dir++) { - for (pristrength = 0; pristrength <= 19 << (depth - 8) && !error; - pristrength += (1 + 4 * !!boundary) << (depth - 8)) { - if (pristrength == 16) pristrength = 19; - for (secstrength = 0; secstrength <= 4 << (depth - 8) && !error; - secstrength += 1 << (depth - 8)) { - if (secstrength == 3 << (depth - 8)) continue; - ref_cdef(depth == 8 ? (uint8_t *)ref_d : 0, ref_d, size, - s + CDEF_HBORDER + CDEF_VBORDER * CDEF_BSTRIDE, - pristrength, secstrength, dir, pridamping, - secdamping, bsize, (1 << depth) - 1, depth - 8); - // If cdef and ref_cdef are the same, we're just testing - // speed - if (cdef != ref_cdef) - ASM_REGISTER_STATE_CHECK( - cdef(depth == 8 ? (uint8_t *)d : 0, d, size, - s + CDEF_HBORDER + CDEF_VBORDER * CDEF_BSTRIDE, - pristrength, secstrength, dir, pridamping, - secdamping, bsize, (1 << depth) - 1, depth - 8)); - if (ref_cdef != cdef) { - for (pos = 0; pos < max_pos && !error; pos++) { - error = ref_d[pos] != d[pos]; - errdepth = depth; - errpristrength = pristrength; - errsecstrength = secstrength; - errboundary = boundary; - errpridamping = pridamping; - errsecdamping = secdamping; - } - } - } - } - } - } - } - } - } - } - - pos--; - EXPECT_EQ(0, error) << "Error: CDEFBlockTest, SIMD and C mismatch." - << std::endl - << "First error at " << pos % size << "," << pos / size - << " (" << (int16_t)ref_d[pos] << " : " << (int16_t)d[pos] - << ") " << std::endl - << "pristrength: " << errpristrength << std::endl - << "pridamping: " << errpridamping << std::endl - << "secstrength: " << errsecstrength << std::endl - << "secdamping: " << errsecdamping << std::endl - << "depth: " << errdepth << std::endl - << "size: " << bsize << std::endl - << "boundary: " << errboundary << std::endl - << std::endl; -} - -void test_cdef_speed(int bsize, int iterations, cdef_filter_block_func cdef, - cdef_filter_block_func ref_cdef, int boundary, int depth) { - aom_usec_timer ref_timer; - aom_usec_timer timer; - - aom_usec_timer_start(&ref_timer); - test_cdef(bsize, iterations, ref_cdef, ref_cdef, boundary, depth); - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer_start(&timer); - test_cdef(bsize, iterations, cdef, cdef, boundary, depth); - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - - EXPECT_GT(ref_elapsed_time, elapsed_time) - << "Error: CDEFSpeedTest, SIMD slower than C." << std::endl - << "C time: " << ref_elapsed_time << " us" << std::endl - << "SIMD time: " << elapsed_time << " us" << std::endl; -} - -typedef int (*find_dir_t)(const uint16_t *img, int stride, int32_t *var, - int coeff_shift); - -typedef ::testing::tuple<find_dir_t, find_dir_t> find_dir_param_t; - -class CDEFFindDirTest : public ::testing::TestWithParam<find_dir_param_t> { - public: - virtual ~CDEFFindDirTest() {} - virtual void SetUp() { - finddir = GET_PARAM(0); - ref_finddir = GET_PARAM(1); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - find_dir_t finddir; - find_dir_t ref_finddir; -}; - -typedef CDEFFindDirTest CDEFFindDirSpeedTest; - -void test_finddir(int (*finddir)(const uint16_t *img, int stride, int32_t *var, - int coeff_shift), - int (*ref_finddir)(const uint16_t *img, int stride, - int32_t *var, int coeff_shift)) { - const int size = 8; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint16_t, s[size * size]); - - int error = 0; - int depth, bits, level, count, errdepth = 0; - int ref_res = 0, res = 0; - int32_t ref_var = 0, var = 0; - - for (depth = 8; depth <= 12 && !error; depth += 2) { - for (count = 0; count < 512 && !error; count++) { - for (level = 0; level < (1 << depth) && !error; - level += 1 << (depth - 8)) { - for (bits = 1; bits <= depth && !error; bits++) { - for (unsigned int i = 0; i < sizeof(s) / sizeof(*s); i++) - s[i] = clamp((rnd.Rand16() & ((1 << bits) - 1)) + level, 0, - (1 << depth) - 1); - for (int c = 0; c < 1 + 9 * (finddir == ref_finddir); c++) - ref_res = ref_finddir(s, size, &ref_var, depth - 8); - if (finddir != ref_finddir) - ASM_REGISTER_STATE_CHECK(res = finddir(s, size, &var, depth - 8)); - if (ref_finddir != finddir) { - if (res != ref_res || var != ref_var) error = 1; - errdepth = depth; - } - } - } - } - } - - EXPECT_EQ(0, error) << "Error: CDEFFindDirTest, SIMD and C mismatch." - << std::endl - << "return: " << res << " : " << ref_res << std::endl - << "var: " << var << " : " << ref_var << std::endl - << "depth: " << errdepth << std::endl - << std::endl; -} - -void test_finddir_speed(int (*finddir)(const uint16_t *img, int stride, - int32_t *var, int coeff_shift), - int (*ref_finddir)(const uint16_t *img, int stride, - int32_t *var, int coeff_shift)) { - aom_usec_timer ref_timer; - aom_usec_timer timer; - - aom_usec_timer_start(&ref_timer); - test_finddir(ref_finddir, ref_finddir); - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer_start(&timer); - test_finddir(finddir, finddir); - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - - EXPECT_GT(ref_elapsed_time, elapsed_time) - << "Error: CDEFFindDirSpeedTest, SIMD slower than C." << std::endl - << "C time: " << ref_elapsed_time << " us" << std::endl - << "SIMD time: " << elapsed_time << " us" << std::endl; -} - -TEST_P(CDEFBlockTest, TestSIMDNoMismatch) { - test_cdef(bsize, 1, cdef, ref_cdef, boundary, depth); -} - -TEST_P(CDEFSpeedTest, DISABLED_TestSpeed) { - test_cdef_speed(bsize, 4, cdef, ref_cdef, boundary, depth); -} - -TEST_P(CDEFFindDirTest, TestSIMDNoMismatch) { - test_finddir(finddir, ref_finddir); -} - -TEST_P(CDEFFindDirSpeedTest, DISABLED_TestSpeed) { - test_finddir_speed(finddir, ref_finddir); -} - -using ::testing::make_tuple; - -// VS compiling for 32 bit targets does not support vector types in -// structs as arguments, which makes the v256 type of the intrinsics -// hard to support, so optimizations for this target are disabled. -#if defined(_WIN64) || !defined(_MSC_VER) || defined(__clang__) -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, CDEFBlockTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_sse2), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSE2, CDEFFindDirTest, - ::testing::Values(make_tuple(&cdef_find_dir_sse2, - &cdef_find_dir_c))); -#endif -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, CDEFBlockTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_ssse3), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSSE3, CDEFFindDirTest, - ::testing::Values(make_tuple(&cdef_find_dir_ssse3, - &cdef_find_dir_c))); -#endif - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, CDEFBlockTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_sse4_1), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSE4_1, CDEFFindDirTest, - ::testing::Values(make_tuple(&cdef_find_dir_sse4_1, - &cdef_find_dir_c))); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, CDEFBlockTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_avx2), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(AVX2, CDEFFindDirTest, - ::testing::Values(make_tuple(&cdef_find_dir_avx2, - &cdef_find_dir_c))); -#endif - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON, CDEFBlockTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_neon), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(NEON, CDEFFindDirTest, - ::testing::Values(make_tuple(&cdef_find_dir_neon, - &cdef_find_dir_c))); -#endif - -// Test speed for all supported architectures -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, CDEFSpeedTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_sse2), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSE2, CDEFFindDirSpeedTest, - ::testing::Values(make_tuple(&cdef_find_dir_sse2, - &cdef_find_dir_c))); -#endif - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, CDEFSpeedTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_ssse3), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSSE3, CDEFFindDirSpeedTest, - ::testing::Values(make_tuple(&cdef_find_dir_ssse3, - &cdef_find_dir_c))); -#endif - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, CDEFSpeedTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_sse4_1), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(SSE4_1, CDEFFindDirSpeedTest, - ::testing::Values(make_tuple(&cdef_find_dir_sse4_1, - &cdef_find_dir_c))); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, CDEFSpeedTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_avx2), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(AVX2, CDEFFindDirSpeedTest, - ::testing::Values(make_tuple(&cdef_find_dir_avx2, - &cdef_find_dir_c))); -#endif - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON, CDEFSpeedTest, - ::testing::Combine(::testing::Values(&cdef_filter_block_neon), - ::testing::Values(&cdef_filter_block_c), - ::testing::Values(BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, - BLOCK_8X8), - ::testing::Range(0, 16), ::testing::Range(8, 13, 2))); -INSTANTIATE_TEST_CASE_P(NEON, CDEFFindDirSpeedTest, - ::testing::Values(make_tuple(&cdef_find_dir_neon, - &cdef_find_dir_c))); -#endif - -#endif // defined(_WIN64) || !defined(_MSC_VER) -} // namespace diff --git a/third_party/aom/test/cfl_test.cc b/third_party/aom/test/cfl_test.cc deleted file mode 100644 index e4d438d6a..000000000 --- a/third_party/aom/test/cfl_test.cc +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "test/util.h" -#include "test/acm_random.h" - -using ::testing::make_tuple; - -using libaom_test::ACMRandom; - -#define NUM_ITERATIONS (100) -#define NUM_ITERATIONS_SPEED (INT16_MAX) - -#define ALL_CFL_TX_SIZES(function) \ - make_tuple(TX_4X4, &function), make_tuple(TX_4X8, &function), \ - make_tuple(TX_4X16, &function), make_tuple(TX_8X4, &function), \ - make_tuple(TX_8X8, &function), make_tuple(TX_8X16, &function), \ - make_tuple(TX_8X32, &function), make_tuple(TX_16X4, &function), \ - make_tuple(TX_16X8, &function), make_tuple(TX_16X16, &function), \ - make_tuple(TX_16X32, &function), make_tuple(TX_32X8, &function), \ - make_tuple(TX_32X16, &function), make_tuple(TX_32X32, &function) - -#define ALL_CFL_TX_SIZES_SUBSAMPLE(fun420, fun422, fun444) \ - make_tuple(TX_4X4, &fun420, &fun422, &fun444), \ - make_tuple(TX_4X8, &fun420, &fun422, &fun444), \ - make_tuple(TX_4X16, &fun420, &fun422, &fun444), \ - make_tuple(TX_8X4, &fun420, &fun422, &fun444), \ - make_tuple(TX_8X8, &fun420, &fun422, &fun444), \ - make_tuple(TX_8X16, &fun420, &fun422, &fun444), \ - make_tuple(TX_8X32, &fun420, &fun422, &fun444), \ - make_tuple(TX_16X4, &fun420, &fun422, &fun444), \ - make_tuple(TX_16X8, &fun420, &fun422, &fun444), \ - make_tuple(TX_16X16, &fun420, &fun422, &fun444), \ - make_tuple(TX_16X32, &fun420, &fun422, &fun444), \ - make_tuple(TX_32X8, &fun420, &fun422, &fun444), \ - make_tuple(TX_32X16, &fun420, &fun422, &fun444), \ - make_tuple(TX_32X32, &fun420, &fun422, &fun444) - -namespace { - -template <typename A> -static void assert_eq(const A *a, const A *b, int width, int height) { - for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i++) { - ASSERT_EQ(a[j * CFL_BUF_LINE + i], b[j * CFL_BUF_LINE + i]); - } - } -} - -static void assertFaster(int ref_elapsed_time, int elapsed_time) { - EXPECT_GT(ref_elapsed_time, elapsed_time) - << "Error: CFLSubtractSpeedTest, SIMD slower than C." << std::endl - << "C time: " << ref_elapsed_time << " us" << std::endl - << "SIMD time: " << elapsed_time << " us" << std::endl; -} - -static void printSpeed(int ref_elapsed_time, int elapsed_time, int width, - int height) { - std::cout.precision(2); - std::cout << "[ ] " << width << "x" << height - << ": C time = " << ref_elapsed_time - << " us, SIMD time = " << elapsed_time << " us" - << " (~" << ref_elapsed_time / (double)elapsed_time << "x) " - << std::endl; -} - -class CFLTest { - public: - virtual ~CFLTest() {} - void init(TX_SIZE tx) { - tx_size = tx; - width = tx_size_wide[tx_size]; - height = tx_size_high[tx_size]; - rnd(ACMRandom::DeterministicSeed()); - } - - protected: - TX_SIZE tx_size; - int width; - int height; - ACMRandom rnd; -}; - -template <typename I> -class CFLTestWithData : public CFLTest { - public: - virtual ~CFLTestWithData() {} - - protected: - I data[CFL_BUF_SQUARE]; - I data_ref[CFL_BUF_SQUARE]; - void randData(I (ACMRandom::*random)()) { - for (int j = 0; j < this->height; j++) { - for (int i = 0; i < this->width; i++) { - const I d = (this->rnd.*random)(); - data[j * CFL_BUF_LINE + i] = d; - data_ref[j * CFL_BUF_LINE + i] = d; - } - } - } -}; - -template <typename I> -class CFLTestWithAlignedData : public CFLTest { - public: - CFLTestWithAlignedData() { - chroma_pels_ref = - reinterpret_cast<I *>(aom_memalign(32, sizeof(I) * CFL_BUF_SQUARE)); - chroma_pels = - reinterpret_cast<I *>(aom_memalign(32, sizeof(I) * CFL_BUF_SQUARE)); - sub_luma_pels_ref = reinterpret_cast<int16_t *>( - aom_memalign(32, sizeof(int16_t) * CFL_BUF_SQUARE)); - sub_luma_pels = reinterpret_cast<int16_t *>( - aom_memalign(32, sizeof(int16_t) * CFL_BUF_SQUARE)); - memset(chroma_pels_ref, 0, sizeof(I) * CFL_BUF_SQUARE); - memset(chroma_pels, 0, sizeof(I) * CFL_BUF_SQUARE); - memset(sub_luma_pels_ref, 0, sizeof(int16_t) * CFL_BUF_SQUARE); - memset(sub_luma_pels, 0, sizeof(int16_t) * CFL_BUF_SQUARE); - } - ~CFLTestWithAlignedData() { - aom_free(chroma_pels_ref); - aom_free(sub_luma_pels_ref); - aom_free(chroma_pels); - aom_free(sub_luma_pels); - } - - protected: - I *chroma_pels_ref; - I *chroma_pels; - int16_t *sub_luma_pels_ref; - int16_t *sub_luma_pels; - int alpha_q3; - I dc; - void randData(int bd) { - alpha_q3 = this->rnd(33) - 16; - dc = this->rnd(1 << bd); - for (int j = 0; j < this->height; j++) { - for (int i = 0; i < this->width; i++) { - chroma_pels[j * CFL_BUF_LINE + i] = dc; - chroma_pels_ref[j * CFL_BUF_LINE + i] = dc; - sub_luma_pels_ref[j * CFL_BUF_LINE + i] = - sub_luma_pels[j * CFL_BUF_LINE + i] = this->rnd(1 << (bd + 3)); - } - } - } -}; - -typedef cfl_subtract_average_fn (*sub_avg_fn)(TX_SIZE tx_size); -typedef ::testing::tuple<TX_SIZE, sub_avg_fn> sub_avg_param; -class CFLSubAvgTest : public ::testing::TestWithParam<sub_avg_param>, - public CFLTestWithData<int16_t> { - public: - virtual void SetUp() { - CFLTest::init(::testing::get<0>(this->GetParam())); - sub_avg = ::testing::get<1>(this->GetParam())(tx_size); - sub_avg_ref = get_subtract_average_fn_c(tx_size); - } - virtual ~CFLSubAvgTest() {} - - protected: - cfl_subtract_average_fn sub_avg; - cfl_subtract_average_fn sub_avg_ref; -}; - -TEST_P(CFLSubAvgTest, SubAvgTest) { - for (int it = 0; it < NUM_ITERATIONS; it++) { - randData(&ACMRandom::Rand15Signed); - sub_avg((uint16_t *)data, data); - sub_avg_ref((uint16_t *)data_ref, data_ref); - assert_eq<int16_t>(data, data_ref, width, height); - } -} - -TEST_P(CFLSubAvgTest, DISABLED_SubAvgSpeedTest) { - aom_usec_timer ref_timer; - aom_usec_timer timer; - randData(&ACMRandom::Rand15Signed); - aom_usec_timer_start(&ref_timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - sub_avg_ref((uint16_t *)data_ref, data_ref); - } - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - aom_usec_timer_start(&timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - sub_avg((uint16_t *)data, data); - } - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - printSpeed(ref_elapsed_time, elapsed_time, width, height); - assertFaster(ref_elapsed_time, elapsed_time); -} - -template <typename S, typename T, typename I> -class CFLSubsampleTest : public ::testing::TestWithParam<S>, - public CFLTestWithData<I> { - public: - virtual void SetUp() { - CFLTest::init(::testing::get<0>(this->GetParam())); - fun_420 = ::testing::get<1>(this->GetParam())(this->tx_size); - fun_422 = ::testing::get<2>(this->GetParam())(this->tx_size); - fun_444 = ::testing::get<3>(this->GetParam())(this->tx_size); - } - - protected: - T fun_420; - T fun_422; - T fun_444; - T fun_420_ref; - T fun_422_ref; - T fun_444_ref; - - void subsampleTest(T fun, T fun_ref, int sub_width, int sub_height, - I (ACMRandom::*random)()) { - uint16_t sub_luma_pels[CFL_BUF_SQUARE]; - uint16_t sub_luma_pels_ref[CFL_BUF_SQUARE]; - - for (int it = 0; it < NUM_ITERATIONS; it++) { - CFLTestWithData<I>::randData(random); - fun(this->data, CFL_BUF_LINE, sub_luma_pels); - fun_ref(this->data_ref, CFL_BUF_LINE, sub_luma_pels_ref); - assert_eq<uint16_t>(sub_luma_pels, sub_luma_pels_ref, sub_width, - sub_height); - } - } - - void subsampleSpeedTest(T fun, T fun_ref, I (ACMRandom::*random)()) { - uint16_t sub_luma_pels[CFL_BUF_SQUARE]; - uint16_t sub_luma_pels_ref[CFL_BUF_SQUARE]; - aom_usec_timer ref_timer; - aom_usec_timer timer; - - CFLTestWithData<I>::randData(random); - aom_usec_timer_start(&ref_timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - fun_ref(this->data_ref, CFL_BUF_LINE, sub_luma_pels); - } - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - aom_usec_timer_start(&timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - fun(this->data, CFL_BUF_LINE, sub_luma_pels_ref); - } - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - printSpeed(ref_elapsed_time, elapsed_time, this->width, this->height); - assertFaster(ref_elapsed_time, elapsed_time); - } -}; - -typedef cfl_subsample_lbd_fn (*get_subsample_lbd_fn)(TX_SIZE tx_size); -typedef ::testing::tuple<TX_SIZE, get_subsample_lbd_fn, get_subsample_lbd_fn, - get_subsample_lbd_fn> - subsample_lbd_param; -class CFLSubsampleLBDTest - : public CFLSubsampleTest<subsample_lbd_param, cfl_subsample_lbd_fn, - uint8_t> { - public: - virtual ~CFLSubsampleLBDTest() {} - virtual void SetUp() { - CFLSubsampleTest::SetUp(); - fun_420_ref = cfl_get_luma_subsampling_420_lbd_c(tx_size); - fun_422_ref = cfl_get_luma_subsampling_422_lbd_c(tx_size); - fun_444_ref = cfl_get_luma_subsampling_444_lbd_c(tx_size); - } -}; - -TEST_P(CFLSubsampleLBDTest, SubsampleLBD420Test) { - subsampleTest(fun_420, fun_420_ref, width >> 1, height >> 1, - &ACMRandom::Rand8); -} - -TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD420SpeedTest) { - subsampleSpeedTest(fun_420, fun_420_ref, &ACMRandom::Rand8); -} - -TEST_P(CFLSubsampleLBDTest, SubsampleLBD422Test) { - subsampleTest(fun_422, fun_422_ref, width >> 1, height, &ACMRandom::Rand8); -} - -TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD422SpeedTest) { - subsampleSpeedTest(fun_422, fun_422_ref, &ACMRandom::Rand8); -} - -TEST_P(CFLSubsampleLBDTest, SubsampleLBD444Test) { - subsampleTest(fun_444, fun_444_ref, width, height, &ACMRandom::Rand8); -} - -TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD444SpeedTest) { - subsampleSpeedTest(fun_444, fun_444_ref, &ACMRandom::Rand8); -} - -typedef cfl_subsample_hbd_fn (*get_subsample_hbd_fn)(TX_SIZE tx_size); -typedef ::testing::tuple<TX_SIZE, get_subsample_hbd_fn, get_subsample_hbd_fn, - get_subsample_hbd_fn> - subsample_hbd_param; -class CFLSubsampleHBDTest - : public CFLSubsampleTest<subsample_hbd_param, cfl_subsample_hbd_fn, - uint16_t> { - public: - virtual ~CFLSubsampleHBDTest() {} - virtual void SetUp() { - CFLSubsampleTest::SetUp(); - fun_420_ref = cfl_get_luma_subsampling_420_hbd_c(tx_size); - fun_422_ref = cfl_get_luma_subsampling_422_hbd_c(tx_size); - fun_444_ref = cfl_get_luma_subsampling_444_hbd_c(tx_size); - } -}; - -TEST_P(CFLSubsampleHBDTest, SubsampleHBD420Test) { - subsampleTest(fun_420, fun_420_ref, width >> 1, height >> 1, - &ACMRandom::Rand12); -} - -TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD420SpeedTest) { - subsampleSpeedTest(fun_420, fun_420_ref, &ACMRandom::Rand12); -} - -TEST_P(CFLSubsampleHBDTest, SubsampleHBD422Test) { - subsampleTest(fun_422, fun_422_ref, width >> 1, height, &ACMRandom::Rand12); -} - -TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD422SpeedTest) { - subsampleSpeedTest(fun_422, fun_422_ref, &ACMRandom::Rand12); -} - -TEST_P(CFLSubsampleHBDTest, SubsampleHBD444Test) { - subsampleTest(fun_444, fun_444_ref, width, height, &ACMRandom::Rand12); -} - -TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD444SpeedTest) { - subsampleSpeedTest(fun_444, fun_444_ref, &ACMRandom::Rand12); -} - -typedef cfl_predict_lbd_fn (*get_predict_fn)(TX_SIZE tx_size); -typedef ::testing::tuple<TX_SIZE, get_predict_fn> predict_param; -class CFLPredictTest : public ::testing::TestWithParam<predict_param>, - public CFLTestWithAlignedData<uint8_t> { - public: - virtual void SetUp() { - CFLTest::init(::testing::get<0>(this->GetParam())); - predict = ::testing::get<1>(this->GetParam())(tx_size); - predict_ref = get_predict_lbd_fn_c(tx_size); - } - virtual ~CFLPredictTest() {} - - protected: - cfl_predict_lbd_fn predict; - cfl_predict_lbd_fn predict_ref; -}; - -TEST_P(CFLPredictTest, PredictTest) { - for (int it = 0; it < NUM_ITERATIONS; it++) { - randData(8); - predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3); - predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3); - assert_eq<uint8_t>(chroma_pels, chroma_pels_ref, width, height); - } -} -TEST_P(CFLPredictTest, DISABLED_PredictSpeedTest) { - aom_usec_timer ref_timer; - aom_usec_timer timer; - randData(8); - aom_usec_timer_start(&ref_timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3); - } - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer_start(&timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3); - } - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - printSpeed(ref_elapsed_time, elapsed_time, width, height); - assertFaster(ref_elapsed_time, elapsed_time); -} - -typedef cfl_predict_hbd_fn (*get_predict_fn_hbd)(TX_SIZE tx_size); -typedef ::testing::tuple<TX_SIZE, get_predict_fn_hbd> predict_param_hbd; -class CFLPredictHBDTest : public ::testing::TestWithParam<predict_param_hbd>, - public CFLTestWithAlignedData<uint16_t> { - public: - virtual void SetUp() { - CFLTest::init(::testing::get<0>(this->GetParam())); - predict = ::testing::get<1>(this->GetParam())(tx_size); - predict_ref = get_predict_hbd_fn_c(tx_size); - } - virtual ~CFLPredictHBDTest() {} - - protected: - cfl_predict_hbd_fn predict; - cfl_predict_hbd_fn predict_ref; -}; - -TEST_P(CFLPredictHBDTest, PredictHBDTest) { - int bd = 12; - for (int it = 0; it < NUM_ITERATIONS; it++) { - randData(bd); - predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3, bd); - predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3, bd); - assert_eq<uint16_t>(chroma_pels, chroma_pels_ref, width, height); - } -} -TEST_P(CFLPredictHBDTest, DISABLED_PredictHBDSpeedTest) { - aom_usec_timer ref_timer; - aom_usec_timer timer; - const int bd = 12; - randData(bd); - aom_usec_timer_start(&ref_timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3, bd); - } - aom_usec_timer_mark(&ref_timer); - int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer_start(&timer); - for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) { - predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3, bd); - } - aom_usec_timer_mark(&timer); - int elapsed_time = (int)aom_usec_timer_elapsed(&timer); - printSpeed(ref_elapsed_time, elapsed_time, width, height); - assertFaster(ref_elapsed_time, elapsed_time); -} - -#if HAVE_SSE2 -const sub_avg_param sub_avg_sizes_sse2[] = { ALL_CFL_TX_SIZES( - get_subtract_average_fn_sse2) }; - -INSTANTIATE_TEST_CASE_P(SSE2, CFLSubAvgTest, - ::testing::ValuesIn(sub_avg_sizes_sse2)); - -#endif - -#if HAVE_SSSE3 -const subsample_lbd_param subsample_lbd_sizes_ssse3[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_ssse3, - cfl_get_luma_subsampling_422_lbd_ssse3, - cfl_get_luma_subsampling_444_lbd_ssse3) -}; - -const subsample_hbd_param subsample_hbd_sizes_ssse3[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_ssse3, - cfl_get_luma_subsampling_422_hbd_ssse3, - cfl_get_luma_subsampling_444_hbd_ssse3) -}; - -const predict_param predict_sizes_ssse3[] = { ALL_CFL_TX_SIZES( - get_predict_lbd_fn_ssse3) }; - -const predict_param_hbd predict_sizes_hbd_ssse3[] = { ALL_CFL_TX_SIZES( - get_predict_hbd_fn_ssse3) }; - -INSTANTIATE_TEST_CASE_P(SSSE3, CFLSubsampleLBDTest, - ::testing::ValuesIn(subsample_lbd_sizes_ssse3)); - -INSTANTIATE_TEST_CASE_P(SSSE3, CFLSubsampleHBDTest, - ::testing::ValuesIn(subsample_hbd_sizes_ssse3)); - -INSTANTIATE_TEST_CASE_P(SSSE3, CFLPredictTest, - ::testing::ValuesIn(predict_sizes_ssse3)); - -INSTANTIATE_TEST_CASE_P(SSSE3, CFLPredictHBDTest, - ::testing::ValuesIn(predict_sizes_hbd_ssse3)); -#endif - -#if HAVE_AVX2 -const sub_avg_param sub_avg_sizes_avx2[] = { ALL_CFL_TX_SIZES( - get_subtract_average_fn_avx2) }; - -const subsample_lbd_param subsample_lbd_sizes_avx2[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_avx2, - cfl_get_luma_subsampling_422_lbd_avx2, - cfl_get_luma_subsampling_444_lbd_avx2) -}; - -const subsample_hbd_param subsample_hbd_sizes_avx2[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_avx2, - cfl_get_luma_subsampling_422_hbd_avx2, - cfl_get_luma_subsampling_444_hbd_avx2) -}; - -const predict_param predict_sizes_avx2[] = { ALL_CFL_TX_SIZES( - get_predict_lbd_fn_avx2) }; - -const predict_param_hbd predict_sizes_hbd_avx2[] = { ALL_CFL_TX_SIZES( - get_predict_hbd_fn_avx2) }; - -INSTANTIATE_TEST_CASE_P(AVX2, CFLSubAvgTest, - ::testing::ValuesIn(sub_avg_sizes_avx2)); - -INSTANTIATE_TEST_CASE_P(AVX2, CFLSubsampleLBDTest, - ::testing::ValuesIn(subsample_lbd_sizes_avx2)); - -INSTANTIATE_TEST_CASE_P(AVX2, CFLSubsampleHBDTest, - ::testing::ValuesIn(subsample_hbd_sizes_avx2)); - -INSTANTIATE_TEST_CASE_P(AVX2, CFLPredictTest, - ::testing::ValuesIn(predict_sizes_avx2)); - -INSTANTIATE_TEST_CASE_P(AVX2, CFLPredictHBDTest, - ::testing::ValuesIn(predict_sizes_hbd_avx2)); -#endif - -#if HAVE_NEON - -const sub_avg_param sub_avg_sizes_neon[] = { ALL_CFL_TX_SIZES( - get_subtract_average_fn_neon) }; - -const subsample_lbd_param subsample_lbd_sizes_neon[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_neon, - cfl_get_luma_subsampling_422_lbd_neon, - cfl_get_luma_subsampling_444_lbd_neon) -}; - -const subsample_hbd_param subsample_hbd_sizes_neon[] = { - ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_neon, - cfl_get_luma_subsampling_422_hbd_neon, - cfl_get_luma_subsampling_444_hbd_neon) -}; - -const predict_param predict_sizes_neon[] = { ALL_CFL_TX_SIZES( - get_predict_lbd_fn_neon) }; - -const predict_param_hbd predict_sizes_hbd_neon[] = { ALL_CFL_TX_SIZES( - get_predict_hbd_fn_neon) }; - -INSTANTIATE_TEST_CASE_P(NEON, CFLSubAvgTest, - ::testing::ValuesIn(sub_avg_sizes_neon)); - -INSTANTIATE_TEST_CASE_P(NEON, CFLSubsampleLBDTest, - ::testing::ValuesIn(subsample_lbd_sizes_neon)); - -INSTANTIATE_TEST_CASE_P(NEON, CFLSubsampleHBDTest, - ::testing::ValuesIn(subsample_hbd_sizes_neon)); - -INSTANTIATE_TEST_CASE_P(NEON, CFLPredictTest, - ::testing::ValuesIn(predict_sizes_neon)); - -INSTANTIATE_TEST_CASE_P(NEON, CFLPredictHBDTest, - ::testing::ValuesIn(predict_sizes_hbd_neon)); -#endif - -#if HAVE_VSX -const sub_avg_param sub_avg_sizes_vsx[] = { ALL_CFL_TX_SIZES( - get_subtract_average_fn_vsx) }; - -INSTANTIATE_TEST_CASE_P(VSX, CFLSubAvgTest, - ::testing::ValuesIn(sub_avg_sizes_vsx)); -#endif -} // namespace diff --git a/third_party/aom/test/clear_system_state.h b/third_party/aom/test/clear_system_state.h deleted file mode 100644 index d38ff5dd5..000000000 --- a/third_party/aom/test/clear_system_state.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_CLEAR_SYSTEM_STATE_H_ -#define AOM_TEST_CLEAR_SYSTEM_STATE_H_ - -#include "config/aom_config.h" - -#if ARCH_X86 || ARCH_X86_64 -#include "aom_ports/x86.h" -#endif - -namespace libaom_test { - -// Reset system to a known state. This function should be used for all non-API -// test cases. -inline void ClearSystemState() { -#if ARCH_X86 || ARCH_X86_64 - aom_reset_mmx_state(); -#endif -} - -} // namespace libaom_test -#endif // AOM_TEST_CLEAR_SYSTEM_STATE_H_ diff --git a/third_party/aom/test/codec_factory.h b/third_party/aom/test/codec_factory.h deleted file mode 100644 index dd99110ee..000000000 --- a/third_party/aom/test/codec_factory.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_CODEC_FACTORY_H_ -#define AOM_TEST_CODEC_FACTORY_H_ - -#include "config/aom_config.h" - -#include "aom/aom_decoder.h" -#include "aom/aom_encoder.h" -#if CONFIG_AV1_ENCODER -#include "aom/aomcx.h" -#endif -#if CONFIG_AV1_DECODER -#include "aom/aomdx.h" -#endif - -#include "test/decode_test_driver.h" -#include "test/encode_test_driver.h" -namespace libaom_test { - -const int kCodecFactoryParam = 0; - -class CodecFactory { - public: - CodecFactory() {} - - virtual ~CodecFactory() {} - - virtual Decoder *CreateDecoder(aom_codec_dec_cfg_t cfg) const = 0; - - virtual Decoder *CreateDecoder(aom_codec_dec_cfg_t cfg, - const aom_codec_flags_t flags) const = 0; - - virtual Encoder *CreateEncoder(aom_codec_enc_cfg_t cfg, - const unsigned long init_flags, - TwopassStatsStore *stats) const = 0; - - virtual aom_codec_err_t DefaultEncoderConfig(aom_codec_enc_cfg_t *cfg, - int usage) const = 0; -}; - -/* Provide CodecTestWith<n>Params classes for a variable number of parameters - * to avoid having to include a pointer to the CodecFactory in every test - * definition. - */ -template <class T1> -class CodecTestWithParam - : public ::testing::TestWithParam< - ::testing::tuple<const libaom_test::CodecFactory *, T1> > {}; - -template <class T1, class T2> -class CodecTestWith2Params - : public ::testing::TestWithParam< - ::testing::tuple<const libaom_test::CodecFactory *, T1, T2> > {}; - -template <class T1, class T2, class T3> -class CodecTestWith3Params - : public ::testing::TestWithParam< - ::testing::tuple<const libaom_test::CodecFactory *, T1, T2, T3> > {}; - -template <class T1, class T2, class T3, class T4> -class CodecTestWith4Params - : public ::testing::TestWithParam< ::testing::tuple< - const libaom_test::CodecFactory *, T1, T2, T3, T4> > {}; - -template <class T1, class T2, class T3, class T4, class T5> -class CodecTestWith5Params - : public ::testing::TestWithParam< ::testing::tuple< - const libaom_test::CodecFactory *, T1, T2, T3, T4, T5> > {}; - -/* - * AV1 Codec Definitions - */ -class AV1Decoder : public Decoder { - public: - explicit AV1Decoder(aom_codec_dec_cfg_t cfg) : Decoder(cfg) {} - - AV1Decoder(aom_codec_dec_cfg_t cfg, const aom_codec_flags_t flag) - : Decoder(cfg, flag) {} - - protected: - virtual aom_codec_iface_t *CodecInterface() const { -#if CONFIG_AV1_DECODER - return aom_codec_av1_dx(); -#else - return NULL; -#endif - } -}; - -class AV1Encoder : public Encoder { - public: - AV1Encoder(aom_codec_enc_cfg_t cfg, const uint32_t init_flags, - TwopassStatsStore *stats) - : Encoder(cfg, init_flags, stats) {} - - protected: - virtual aom_codec_iface_t *CodecInterface() const { -#if CONFIG_AV1_ENCODER - return aom_codec_av1_cx(); -#else - return NULL; -#endif - } -}; - -class AV1CodecFactory : public CodecFactory { - public: - AV1CodecFactory() : CodecFactory() {} - - virtual Decoder *CreateDecoder(aom_codec_dec_cfg_t cfg) const { - return CreateDecoder(cfg, 0); - } - - virtual Decoder *CreateDecoder(aom_codec_dec_cfg_t cfg, - const aom_codec_flags_t flags) const { -#if CONFIG_AV1_DECODER - return new AV1Decoder(cfg, flags); -#else - (void)cfg; - (void)flags; - return NULL; -#endif - } - - virtual Encoder *CreateEncoder(aom_codec_enc_cfg_t cfg, - const unsigned long init_flags, - TwopassStatsStore *stats) const { -#if CONFIG_AV1_ENCODER - return new AV1Encoder(cfg, init_flags, stats); -#else - (void)cfg; - (void)init_flags; - (void)stats; - return NULL; -#endif - } - - virtual aom_codec_err_t DefaultEncoderConfig(aom_codec_enc_cfg_t *cfg, - int usage) const { -#if CONFIG_AV1_ENCODER - return aom_codec_enc_config_default(aom_codec_av1_cx(), cfg, usage); -#else - (void)cfg; - (void)usage; - return AOM_CODEC_INCAPABLE; -#endif - } -}; - -const libaom_test::AV1CodecFactory kAV1; - -#define AV1_INSTANTIATE_TEST_CASE(test, ...) \ - INSTANTIATE_TEST_CASE_P( \ - AV1, test, \ - ::testing::Combine( \ - ::testing::Values(static_cast<const libaom_test::CodecFactory *>( \ - &libaom_test::kAV1)), \ - __VA_ARGS__)) - -} // namespace libaom_test -#endif // AOM_TEST_CODEC_FACTORY_H_ diff --git a/third_party/aom/test/coding_path_sync.cc b/third_party/aom/test/coding_path_sync.cc deleted file mode 100644 index 6735236cc..000000000 --- a/third_party/aom/test/coding_path_sync.cc +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <vector> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" - -#include "config/aom_config.h" - -#include "aom_ports/mem.h" // ROUND_POWER_OF_TWO -#include "aom/aomcx.h" -#include "aom/aomdx.h" -#include "aom/aom_encoder.h" -#include "aom/aom_decoder.h" - -using libaom_test::ACMRandom; -namespace { - -class CompressedSource { - public: - explicit CompressedSource(int seed) : rnd_(seed), frame_count_(0) { - aom_codec_iface_t *algo = aom_codec_av1_cx(); - - aom_codec_enc_cfg_t cfg; - aom_codec_enc_config_default(algo, &cfg, 0); - - // force the quantizer, to reduce the sensitivity on encoding choices. - // e.g, we don't want this test to break when the rate control is modified. - { - const int max_q = cfg.rc_max_quantizer; - const int min_q = cfg.rc_min_quantizer; - const int q = rnd_.PseudoUniform(max_q - min_q + 1) + min_q; - - cfg.rc_end_usage = AOM_Q; - cfg.rc_max_quantizer = q; - cfg.rc_min_quantizer = q; - } - - // choose the picture size - { - width_ = rnd_.PseudoUniform(kWidth - 8) + 8; - height_ = rnd_.PseudoUniform(kHeight - 8) + 8; - } - - // choose the chroma subsampling - { - const aom_img_fmt_t fmts[] = { - AOM_IMG_FMT_I420, - AOM_IMG_FMT_I422, - AOM_IMG_FMT_I444, - }; - - format_ = fmts[rnd_.PseudoUniform(NELEMENTS(fmts))]; - } - - cfg.g_w = width_; - cfg.g_h = height_; - cfg.g_lag_in_frames = 0; - if (format_ == AOM_IMG_FMT_I420) - cfg.g_profile = 0; - else if (format_ == AOM_IMG_FMT_I444) - cfg.g_profile = 1; - else if (format_ == AOM_IMG_FMT_I422) - cfg.g_profile = 2; - - aom_codec_enc_init(&enc_, algo, &cfg, 0); - } - - ~CompressedSource() { aom_codec_destroy(&enc_); } - - const aom_codec_cx_pkt_t *ReadFrame() { - uint8_t buf[kWidth * kHeight * 3] = { 0 }; - - // render regular pattern - const int period = rnd_.Rand8() % 32 + 1; - const int phase = rnd_.Rand8() % period; - - const int val_a = rnd_.Rand8(); - const int val_b = rnd_.Rand8(); - - for (int i = 0; i < (int)sizeof buf; ++i) - buf[i] = (i + phase) % period < period / 2 ? val_a : val_b; - - aom_image_t img; - aom_img_wrap(&img, format_, width_, height_, 0, buf); - aom_codec_encode(&enc_, &img, frame_count_++, 1, 0); - - aom_codec_iter_t iter = NULL; - - const aom_codec_cx_pkt_t *pkt = NULL; - - do { - pkt = aom_codec_get_cx_data(&enc_, &iter); - } while (pkt && pkt->kind != AOM_CODEC_CX_FRAME_PKT); - - return pkt; - } - - private: - static const int kWidth = 128; - static const int kHeight = 128; - - ACMRandom rnd_; - aom_img_fmt_t format_; - aom_codec_ctx_t enc_; - int frame_count_; - int width_, height_; -}; - -// lowers an aom_image_t to a easily comparable/printable form -std::vector<int16_t> Serialize(const aom_image_t *img) { - std::vector<int16_t> bytes; - bytes.reserve(img->d_w * img->d_h * 3); - for (int plane = 0; plane < 3; ++plane) { - const int w = aom_img_plane_width(img, plane); - const int h = aom_img_plane_height(img, plane); - - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - unsigned char *row = img->planes[plane] + r * img->stride[plane]; - if (img->fmt & AOM_IMG_FMT_HIGHBITDEPTH) - bytes.push_back(row[c * 2]); - else - bytes.push_back(row[c]); - } - } - } - - return bytes; -} - -class Decoder { - public: - explicit Decoder(int allowLowbitdepth) { - aom_codec_iface_t *algo = aom_codec_av1_dx(); - - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.allow_lowbitdepth = allowLowbitdepth; - - aom_codec_dec_init(&dec_, algo, &cfg, 0); - } - - ~Decoder() { aom_codec_destroy(&dec_); } - - std::vector<int16_t> decode(const aom_codec_cx_pkt_t *pkt) { - aom_codec_decode(&dec_, static_cast<uint8_t *>(pkt->data.frame.buf), - pkt->data.frame.sz, NULL); - - aom_codec_iter_t iter = NULL; - return Serialize(aom_codec_get_frame(&dec_, &iter)); - } - - private: - aom_codec_ctx_t dec_; -}; - -// Try to reveal a mismatch between LBD and HBD coding paths. -TEST(CodingPathSync, SearchForHbdLbdMismatch) { - const int count_tests = 10; - for (int i = 0; i < count_tests; ++i) { - Decoder dec_hbd(0); - Decoder dec_lbd(1); - - CompressedSource enc(i); - - for (int k = 0; k < 3; ++k) { - const aom_codec_cx_pkt_t *frame = enc.ReadFrame(); - - std::vector<int16_t> lbd_yuv = dec_lbd.decode(frame); - std::vector<int16_t> hbd_yuv = dec_hbd.decode(frame); - - ASSERT_EQ(lbd_yuv, hbd_yuv); - } - } -} - -TEST(CodingPathSyncLarge, SearchForHbdLbdMismatchLarge) { - const int count_tests = 100; - const int seed = 1234; - for (int i = 0; i < count_tests; ++i) { - Decoder dec_hbd(0); - Decoder dec_lbd(1); - - CompressedSource enc(seed + i); - - for (int k = 0; k < 5; ++k) { - const aom_codec_cx_pkt_t *frame = enc.ReadFrame(); - - std::vector<int16_t> lbd_yuv = dec_lbd.decode(frame); - std::vector<int16_t> hbd_yuv = dec_hbd.decode(frame); - - ASSERT_EQ(lbd_yuv, hbd_yuv); - } - } -} - -} // namespace diff --git a/third_party/aom/test/comp_avg_pred_test.cc b/third_party/aom/test/comp_avg_pred_test.cc deleted file mode 100644 index 9ad8973f0..000000000 --- a/third_party/aom/test/comp_avg_pred_test.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "test/comp_avg_pred_test.h" - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; -using libaom_test::AV1JNTCOMPAVG::AV1HighBDJNTCOMPAVGTest; -using libaom_test::AV1JNTCOMPAVG::AV1HighBDJNTCOMPAVGUPSAMPLEDTest; -using libaom_test::AV1JNTCOMPAVG::AV1JNTCOMPAVGTest; -using libaom_test::AV1JNTCOMPAVG::AV1JNTCOMPAVGUPSAMPLEDTest; - -namespace { - -TEST_P(AV1JNTCOMPAVGTest, DISABLED_Speed) { RunSpeedTest(GET_PARAM(0)); } - -TEST_P(AV1JNTCOMPAVGTest, CheckOutput) { RunCheckOutput(GET_PARAM(0)); } - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, AV1JNTCOMPAVGTest, - libaom_test::AV1JNTCOMPAVG::BuildParams(aom_jnt_comp_avg_pred_ssse3)); -#endif - -TEST_P(AV1JNTCOMPAVGUPSAMPLEDTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0)); -} - -TEST_P(AV1JNTCOMPAVGUPSAMPLEDTest, CheckOutput) { - RunCheckOutput(GET_PARAM(0)); -} - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P(SSSE3, AV1JNTCOMPAVGUPSAMPLEDTest, - libaom_test::AV1JNTCOMPAVG::BuildParams( - aom_jnt_comp_avg_upsampled_pred_ssse3)); -#endif - -TEST_P(AV1HighBDJNTCOMPAVGTest, DISABLED_Speed) { RunSpeedTest(GET_PARAM(1)); } - -TEST_P(AV1HighBDJNTCOMPAVGTest, CheckOutput) { RunCheckOutput(GET_PARAM(1)); } - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, AV1HighBDJNTCOMPAVGTest, - libaom_test::AV1JNTCOMPAVG::BuildParams( - aom_highbd_jnt_comp_avg_pred_sse2, 1)); -#endif - -TEST_P(AV1HighBDJNTCOMPAVGUPSAMPLEDTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(1)); -} - -TEST_P(AV1HighBDJNTCOMPAVGUPSAMPLEDTest, CheckOutput) { - RunCheckOutput(GET_PARAM(1)); -} - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, AV1HighBDJNTCOMPAVGUPSAMPLEDTest, - libaom_test::AV1JNTCOMPAVG::BuildParams( - aom_highbd_jnt_comp_avg_upsampled_pred_sse2)); -#endif - -} // namespace diff --git a/third_party/aom/test/comp_avg_pred_test.h b/third_party/aom/test/comp_avg_pred_test.h deleted file mode 100644 index 9661dd9f5..000000000 --- a/third_party/aom/test/comp_avg_pred_test.h +++ /dev/null @@ -1,555 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_COMP_AVG_PRED_TEST_H_ -#define AOM_TEST_COMP_AVG_PRED_TEST_H_ - -#include "config/aom_dsp_rtcd.h" - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/util.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "av1/common/common_data.h" -#include "aom_ports/aom_timer.h" - -namespace libaom_test { -const int kMaxSize = 128 + 32; // padding - -namespace AV1JNTCOMPAVG { - -typedef void (*jntcompavg_func)(uint8_t *comp_pred, const uint8_t *pred, - int width, int height, const uint8_t *ref, - int ref_stride, - const JNT_COMP_PARAMS *jcp_param); - -typedef void (*jntcompavgupsampled_func)( - MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col, - const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width, - int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref, - int ref_stride, const JNT_COMP_PARAMS *jcp_param, int subpel_search); - -typedef void (*highbdjntcompavgupsampled_func)( - MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col, - const MV *const mv, uint8_t *comp_pred8, const uint8_t *pred8, int width, - int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref8, - int ref_stride, int bd, const JNT_COMP_PARAMS *jcp_param, - int subpel_search); - -typedef ::testing::tuple<jntcompavg_func, BLOCK_SIZE> JNTCOMPAVGParam; - -typedef ::testing::tuple<jntcompavgupsampled_func, BLOCK_SIZE> - JNTCOMPAVGUPSAMPLEDParam; - -typedef ::testing::tuple<int, jntcompavg_func, BLOCK_SIZE> - HighbdJNTCOMPAVGParam; - -typedef ::testing::tuple<int, highbdjntcompavgupsampled_func, BLOCK_SIZE> - HighbdJNTCOMPAVGUPSAMPLEDParam; - -::testing::internal::ParamGenerator<JNTCOMPAVGParam> BuildParams( - jntcompavg_func filter) { - return ::testing::Combine(::testing::Values(filter), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -::testing::internal::ParamGenerator<JNTCOMPAVGUPSAMPLEDParam> BuildParams( - jntcompavgupsampled_func filter) { - return ::testing::Combine(::testing::Values(filter), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -::testing::internal::ParamGenerator<HighbdJNTCOMPAVGParam> BuildParams( - jntcompavg_func filter, int is_hbd) { - (void)is_hbd; - return ::testing::Combine(::testing::Range(8, 13, 2), - ::testing::Values(filter), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -::testing::internal::ParamGenerator<HighbdJNTCOMPAVGUPSAMPLEDParam> BuildParams( - highbdjntcompavgupsampled_func filter) { - return ::testing::Combine(::testing::Range(8, 13, 2), - ::testing::Values(filter), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} - -class AV1JNTCOMPAVGTest : public ::testing::TestWithParam<JNTCOMPAVGParam> { - public: - ~AV1JNTCOMPAVGTest() {} - void SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunCheckOutput(jntcompavg_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(1); - - uint8_t pred8[kMaxSize * kMaxSize]; - uint8_t ref8[kMaxSize * kMaxSize]; - uint8_t output[kMaxSize * kMaxSize]; - uint8_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand8(); - ref8[i * w + j] = rnd_.Rand8(); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - for (int ii = 0; ii < 2; ii++) { - for (int jj = 0; jj < 4; jj++) { - jnt_comp_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - - const int offset_r = 3 + rnd_.PseudoUniform(h - in_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - in_w - 7); - aom_jnt_comp_avg_pred_c(output, pred8 + offset_r * w + offset_c, in_w, - in_h, ref8 + offset_r * w + offset_c, in_w, - &jnt_comp_params); - test_impl(output2, pred8 + offset_r * w + offset_c, in_w, in_h, - ref8 + offset_r * w + offset_c, in_w, &jnt_comp_params); - - for (int i = 0; i < in_h; ++i) { - for (int j = 0; j < in_w; ++j) { - int idx = i * in_w + j; - ASSERT_EQ(output[idx], output2[idx]) - << "Mismatch at unit tests for AV1JNTCOMPAVGTest\n" - << in_w << "x" << in_h << " Pixel mismatch at index " << idx - << " = (" << i << ", " << j << ")"; - } - } - } - } - } - void RunSpeedTest(jntcompavg_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(1); - - uint8_t pred8[kMaxSize * kMaxSize]; - uint8_t ref8[kMaxSize * kMaxSize]; - uint8_t output[kMaxSize * kMaxSize]; - uint8_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand8(); - ref8[i * w + j] = rnd_.Rand8(); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - jnt_comp_params.fwd_offset = quant_dist_lookup_table[0][0][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[0][0][1]; - - const int num_loops = 1000000000 / (in_w + in_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - aom_jnt_comp_avg_pred_c(output, pred8, in_w, in_h, ref8, in_w, - &jnt_comp_params); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("jntcompavg c_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time / num_loops); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - - for (int i = 0; i < num_loops; ++i) - test_impl(output2, pred8, in_w, in_h, ref8, in_w, &jnt_comp_params); - - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("jntcompavg test_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time1 / num_loops); - } - - libaom_test::ACMRandom rnd_; -}; // class AV1JNTCOMPAVGTest - -class AV1JNTCOMPAVGUPSAMPLEDTest - : public ::testing::TestWithParam<JNTCOMPAVGUPSAMPLEDParam> { - public: - ~AV1JNTCOMPAVGUPSAMPLEDTest() {} - void SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunCheckOutput(jntcompavgupsampled_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(1); - - uint8_t pred8[kMaxSize * kMaxSize]; - uint8_t ref8[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(16, uint8_t, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, output2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand8(); - ref8[i * w + j] = rnd_.Rand8(); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - int sub_x_q3, sub_y_q3; - int subpel_search; - for (subpel_search = 1; subpel_search <= 2; ++subpel_search) { - for (sub_x_q3 = 0; sub_x_q3 < 8; ++sub_x_q3) { - for (sub_y_q3 = 0; sub_y_q3 < 8; ++sub_y_q3) { - for (int ii = 0; ii < 2; ii++) { - for (int jj = 0; jj < 4; jj++) { - jnt_comp_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - - const int offset_r = 3 + rnd_.PseudoUniform(h - in_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - in_w - 7); - - aom_jnt_comp_avg_upsampled_pred_c( - NULL, NULL, 0, 0, NULL, output, - pred8 + offset_r * w + offset_c, in_w, in_h, sub_x_q3, - sub_y_q3, ref8 + offset_r * w + offset_c, in_w, - &jnt_comp_params, subpel_search); - test_impl(NULL, NULL, 0, 0, NULL, output2, - pred8 + offset_r * w + offset_c, in_w, in_h, sub_x_q3, - sub_y_q3, ref8 + offset_r * w + offset_c, in_w, - &jnt_comp_params, subpel_search); - - for (int i = 0; i < in_h; ++i) { - for (int j = 0; j < in_w; ++j) { - int idx = i * in_w + j; - ASSERT_EQ(output[idx], output2[idx]) - << "Mismatch at unit tests for " - "AV1JNTCOMPAVGUPSAMPLEDTest\n" - << in_w << "x" << in_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << sub_y_q3 << ", " - << sub_x_q3 << ")"; - } - } - } - } - } - } - } - } - void RunSpeedTest(jntcompavgupsampled_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(1); - - uint8_t pred8[kMaxSize * kMaxSize]; - uint8_t ref8[kMaxSize * kMaxSize]; - DECLARE_ALIGNED(16, uint8_t, output[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, output2[MAX_SB_SQUARE]); - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand8(); - ref8[i * w + j] = rnd_.Rand8(); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - jnt_comp_params.fwd_offset = quant_dist_lookup_table[0][0][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[0][0][1]; - - int sub_x_q3 = 0; - int sub_y_q3 = 0; - - const int num_loops = 1000000000 / (in_w + in_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - int subpel_search = 2; // set to 1 to test 4-tap filter. - - for (int i = 0; i < num_loops; ++i) - aom_jnt_comp_avg_upsampled_pred_c(NULL, NULL, 0, 0, NULL, output, pred8, - in_w, in_h, sub_x_q3, sub_y_q3, ref8, - in_w, &jnt_comp_params, subpel_search); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("jntcompavgupsampled c_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time / num_loops); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - - for (int i = 0; i < num_loops; ++i) - test_impl(NULL, NULL, 0, 0, NULL, output2, pred8, in_w, in_h, sub_x_q3, - sub_y_q3, ref8, in_w, &jnt_comp_params, subpel_search); - - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("jntcompavgupsampled test_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time1 / num_loops); - } - - libaom_test::ACMRandom rnd_; -}; // class AV1JNTCOMPAVGUPSAMPLEDTest - -class AV1HighBDJNTCOMPAVGTest - : public ::testing::TestWithParam<HighbdJNTCOMPAVGParam> { - public: - ~AV1HighBDJNTCOMPAVGTest() {} - void SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - - void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunCheckOutput(jntcompavg_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - uint16_t pred8[kMaxSize * kMaxSize]; - uint16_t ref8[kMaxSize * kMaxSize]; - uint16_t output[kMaxSize * kMaxSize]; - uint16_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - ref8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - for (int ii = 0; ii < 2; ii++) { - for (int jj = 0; jj < 4; jj++) { - jnt_comp_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - - const int offset_r = 3 + rnd_.PseudoUniform(h - in_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - in_w - 7); - aom_highbd_jnt_comp_avg_pred_c( - CONVERT_TO_BYTEPTR(output), - CONVERT_TO_BYTEPTR(pred8) + offset_r * w + offset_c, in_w, in_h, - CONVERT_TO_BYTEPTR(ref8) + offset_r * w + offset_c, in_w, - &jnt_comp_params); - test_impl(CONVERT_TO_BYTEPTR(output2), - CONVERT_TO_BYTEPTR(pred8) + offset_r * w + offset_c, in_w, - in_h, CONVERT_TO_BYTEPTR(ref8) + offset_r * w + offset_c, - in_w, &jnt_comp_params); - - for (int i = 0; i < in_h; ++i) { - for (int j = 0; j < in_w; ++j) { - int idx = i * in_w + j; - ASSERT_EQ(output[idx], output2[idx]) - << "Mismatch at unit tests for AV1HighBDJNTCOMPAVGTest\n" - << in_w << "x" << in_h << " Pixel mismatch at index " << idx - << " = (" << i << ", " << j << ")"; - } - } - } - } - } - void RunSpeedTest(jntcompavg_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - uint16_t pred8[kMaxSize * kMaxSize]; - uint16_t ref8[kMaxSize * kMaxSize]; - uint16_t output[kMaxSize * kMaxSize]; - uint16_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - ref8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - jnt_comp_params.fwd_offset = quant_dist_lookup_table[0][0][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[0][0][1]; - - const int num_loops = 1000000000 / (in_w + in_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - aom_highbd_jnt_comp_avg_pred_c( - CONVERT_TO_BYTEPTR(output), CONVERT_TO_BYTEPTR(pred8), in_w, in_h, - CONVERT_TO_BYTEPTR(ref8), in_w, &jnt_comp_params); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("highbdjntcompavg c_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time / num_loops); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - - for (int i = 0; i < num_loops; ++i) - test_impl(CONVERT_TO_BYTEPTR(output2), CONVERT_TO_BYTEPTR(pred8), in_w, - in_h, CONVERT_TO_BYTEPTR(ref8), in_w, &jnt_comp_params); - - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("highbdjntcompavg test_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time1 / num_loops); - } - - libaom_test::ACMRandom rnd_; -}; // class AV1HighBDJNTCOMPAVGTest - -class AV1HighBDJNTCOMPAVGUPSAMPLEDTest - : public ::testing::TestWithParam<HighbdJNTCOMPAVGUPSAMPLEDParam> { - public: - ~AV1HighBDJNTCOMPAVGUPSAMPLEDTest() {} - void SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunCheckOutput(highbdjntcompavgupsampled_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - uint16_t pred8[kMaxSize * kMaxSize]; - uint16_t ref8[kMaxSize * kMaxSize]; - uint16_t output[kMaxSize * kMaxSize]; - uint16_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - ref8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - int sub_x_q3, sub_y_q3; - int subpel_search; - for (subpel_search = 1; subpel_search <= 2; ++subpel_search) { - for (sub_x_q3 = 0; sub_x_q3 < 8; ++sub_x_q3) { - for (sub_y_q3 = 0; sub_y_q3 < 8; ++sub_y_q3) { - for (int ii = 0; ii < 2; ii++) { - for (int jj = 0; jj < 4; jj++) { - jnt_comp_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - - const int offset_r = 3 + rnd_.PseudoUniform(h - in_h - 7); - const int offset_c = 3 + rnd_.PseudoUniform(w - in_w - 7); - - aom_highbd_jnt_comp_avg_upsampled_pred_c( - NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(output), - CONVERT_TO_BYTEPTR(pred8) + offset_r * w + offset_c, in_w, - in_h, sub_x_q3, sub_y_q3, - CONVERT_TO_BYTEPTR(ref8) + offset_r * w + offset_c, in_w, bd, - &jnt_comp_params, subpel_search); - test_impl(NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(output2), - CONVERT_TO_BYTEPTR(pred8) + offset_r * w + offset_c, - in_w, in_h, sub_x_q3, sub_y_q3, - CONVERT_TO_BYTEPTR(ref8) + offset_r * w + offset_c, - in_w, bd, &jnt_comp_params, subpel_search); - - for (int i = 0; i < in_h; ++i) { - for (int j = 0; j < in_w; ++j) { - int idx = i * in_w + j; - ASSERT_EQ(output[idx], output2[idx]) - << "Mismatch at unit tests for " - "AV1HighBDJNTCOMPAVGUPSAMPLEDTest\n" - << in_w << "x" << in_h << " Pixel mismatch at index " - << idx << " = (" << i << ", " << j - << "), sub pixel offset = (" << sub_y_q3 << ", " - << sub_x_q3 << ")"; - } - } - } - } - } - } - } - } - void RunSpeedTest(highbdjntcompavgupsampled_func test_impl) { - const int w = kMaxSize, h = kMaxSize; - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - uint16_t pred8[kMaxSize * kMaxSize]; - uint16_t ref8[kMaxSize * kMaxSize]; - uint16_t output[kMaxSize * kMaxSize]; - uint16_t output2[kMaxSize * kMaxSize]; - - for (int i = 0; i < h; ++i) - for (int j = 0; j < w; ++j) { - pred8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - ref8[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - } - const int in_w = block_size_wide[block_idx]; - const int in_h = block_size_high[block_idx]; - - JNT_COMP_PARAMS jnt_comp_params; - jnt_comp_params.use_jnt_comp_avg = 1; - - jnt_comp_params.fwd_offset = quant_dist_lookup_table[0][0][0]; - jnt_comp_params.bck_offset = quant_dist_lookup_table[0][0][1]; - int sub_x_q3 = 0; - int sub_y_q3 = 0; - const int num_loops = 1000000000 / (in_w + in_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - int subpel_search = 2; // set to 1 to test 4-tap filter. - for (int i = 0; i < num_loops; ++i) - aom_highbd_jnt_comp_avg_upsampled_pred_c( - NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(output), - CONVERT_TO_BYTEPTR(pred8), in_w, in_h, sub_x_q3, sub_y_q3, - CONVERT_TO_BYTEPTR(ref8), in_w, bd, &jnt_comp_params, subpel_search); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("highbdjntcompavgupsampled c_code %3dx%-3d: %7.2f us\n", in_w, in_h, - 1000.0 * elapsed_time / num_loops); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - - for (int i = 0; i < num_loops; ++i) - test_impl(NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(output2), - CONVERT_TO_BYTEPTR(pred8), in_w, in_h, sub_x_q3, sub_y_q3, - CONVERT_TO_BYTEPTR(ref8), in_w, bd, &jnt_comp_params, - subpel_search); - - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("highbdjntcompavgupsampled test_code %3dx%-3d: %7.2f us\n", in_w, - in_h, 1000.0 * elapsed_time1 / num_loops); - } - - libaom_test::ACMRandom rnd_; -}; // class AV1HighBDJNTCOMPAVGUPSAMPLEDTest - -} // namespace AV1JNTCOMPAVG -} // namespace libaom_test - -#endif // AOM_TEST_COMP_AVG_PRED_TEST_H_ diff --git a/third_party/aom/test/comp_mask_variance_test.cc b/third_party/aom/test/comp_mask_variance_test.cc deleted file mode 100644 index 34be2aa6d..000000000 --- a/third_party/aom/test/comp_mask_variance_test.cc +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdlib> -#include <new> - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_codec.h" -#include "aom/aom_integer.h" -#include "aom_dsp/variance.h" -#include "aom_mem/aom_mem.h" -#include "aom_ports/aom_timer.h" -#include "aom_ports/mem.h" -#include "av1/common/reconinter.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace AV1CompMaskVariance { -typedef void (*comp_mask_pred_func)(uint8_t *comp_pred, const uint8_t *pred, - int width, int height, const uint8_t *ref, - int ref_stride, const uint8_t *mask, - int mask_stride, int invert_mask); - -#if HAVE_SSSE3 || HAVE_AV2 -const BLOCK_SIZE kValidBlockSize[] = { - BLOCK_8X8, BLOCK_8X16, BLOCK_8X32, BLOCK_16X8, BLOCK_16X16, - BLOCK_16X32, BLOCK_32X8, BLOCK_32X16, BLOCK_32X32, -}; -#endif -typedef ::testing::tuple<comp_mask_pred_func, BLOCK_SIZE> CompMaskPredParam; - -class AV1CompMaskVarianceTest - : public ::testing::TestWithParam<CompMaskPredParam> { - public: - ~AV1CompMaskVarianceTest(); - void SetUp(); - - void TearDown(); - - protected: - void RunCheckOutput(comp_mask_pred_func test_impl, BLOCK_SIZE bsize, int inv); - void RunSpeedTest(comp_mask_pred_func test_impl, BLOCK_SIZE bsize); - bool CheckResult(int width, int height) { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - const int idx = y * width + x; - if (comp_pred1_[idx] != comp_pred2_[idx]) { - printf("%dx%d mismatch @%d(%d,%d) ", width, height, idx, y, x); - printf("%d != %d ", comp_pred1_[idx], comp_pred2_[idx]); - return false; - } - } - } - return true; - } - - libaom_test::ACMRandom rnd_; - uint8_t *comp_pred1_; - uint8_t *comp_pred2_; - uint8_t *pred_; - uint8_t *ref_buffer_; - uint8_t *ref_; -}; - -AV1CompMaskVarianceTest::~AV1CompMaskVarianceTest() { ; } - -void AV1CompMaskVarianceTest::SetUp() { - rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed()); - av1_init_wedge_masks(); - comp_pred1_ = (uint8_t *)aom_memalign(16, MAX_SB_SQUARE); - comp_pred2_ = (uint8_t *)aom_memalign(16, MAX_SB_SQUARE); - pred_ = (uint8_t *)aom_memalign(16, MAX_SB_SQUARE); - ref_buffer_ = (uint8_t *)aom_memalign(16, MAX_SB_SQUARE + (8 * MAX_SB_SIZE)); - ref_ = ref_buffer_ + (8 * MAX_SB_SIZE); - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pred_[i] = rnd_.Rand8(); - } - for (int i = 0; i < MAX_SB_SQUARE + (8 * MAX_SB_SIZE); ++i) { - ref_buffer_[i] = rnd_.Rand8(); - } -} - -void AV1CompMaskVarianceTest::TearDown() { - aom_free(comp_pred1_); - aom_free(comp_pred2_); - aom_free(pred_); - aom_free(ref_buffer_); - libaom_test::ClearSystemState(); -} - -void AV1CompMaskVarianceTest::RunCheckOutput(comp_mask_pred_func test_impl, - BLOCK_SIZE bsize, int inv) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - for (int wedge_index = 0; wedge_index < wedge_types; ++wedge_index) { - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - aom_comp_mask_pred_c(comp_pred1_, pred_, w, h, ref_, MAX_SB_SIZE, mask, w, - inv); - test_impl(comp_pred2_, pred_, w, h, ref_, MAX_SB_SIZE, mask, w, inv); - - ASSERT_EQ(CheckResult(w, h), true) - << " wedge " << wedge_index << " inv " << inv; - } -} - -void AV1CompMaskVarianceTest::RunSpeedTest(comp_mask_pred_func test_impl, - BLOCK_SIZE bsize) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - int wedge_index = wedge_types / 2; - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - const int num_loops = 1000000000 / (w + h); - - comp_mask_pred_func funcs[2] = { aom_comp_mask_pred_c, test_impl }; - double elapsed_time[2] = { 0 }; - for (int i = 0; i < 2; ++i) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - comp_mask_pred_func func = funcs[i]; - for (int j = 0; j < num_loops; ++j) { - func(comp_pred1_, pred_, w, h, ref_, MAX_SB_SIZE, mask, w, 0); - } - aom_usec_timer_mark(&timer); - double time = static_cast<double>(aom_usec_timer_elapsed(&timer)); - elapsed_time[i] = 1000.0 * time / num_loops; - } - printf("compMask %3dx%-3d: %7.2f/%7.2fns", w, h, elapsed_time[0], - elapsed_time[1]); - printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]); -} - -TEST_P(AV1CompMaskVarianceTest, CheckOutput) { - // inv = 0, 1 - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 0); - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 1); -} - -TEST_P(AV1CompMaskVarianceTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0), GET_PARAM(1)); -} - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, AV1CompMaskVarianceTest, - ::testing::Combine(::testing::Values(&aom_comp_mask_pred_ssse3), - ::testing::ValuesIn(kValidBlockSize))); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, AV1CompMaskVarianceTest, - ::testing::Combine(::testing::Values(&aom_comp_mask_pred_avx2), - ::testing::ValuesIn(kValidBlockSize))); -#endif - -#ifndef aom_comp_mask_pred -// can't run this test if aom_comp_mask_pred is defined to aom_comp_mask_pred_c -class AV1CompMaskUpVarianceTest : public AV1CompMaskVarianceTest { - public: - ~AV1CompMaskUpVarianceTest(); - - protected: - void RunCheckOutput(comp_mask_pred_func test_impl, BLOCK_SIZE bsize, int inv); - void RunSpeedTest(comp_mask_pred_func test_impl, BLOCK_SIZE bsize, - int havSub); -}; - -AV1CompMaskUpVarianceTest::~AV1CompMaskUpVarianceTest() { ; } - -void AV1CompMaskUpVarianceTest::RunCheckOutput(comp_mask_pred_func test_impl, - BLOCK_SIZE bsize, int inv) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - int subpel_search; - for (subpel_search = 1; subpel_search <= 2; ++subpel_search) { - // loop through subx and suby - for (int sub = 0; sub < 8 * 8; ++sub) { - int subx = sub & 0x7; - int suby = (sub >> 3); - for (int wedge_index = 0; wedge_index < wedge_types; ++wedge_index) { - const uint8_t *mask = - av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - // ref - aom_comp_mask_upsampled_pred_c( - NULL, NULL, 0, 0, NULL, comp_pred1_, pred_, w, h, subx, suby, ref_, - MAX_SB_SIZE, mask, w, inv, subpel_search); - - aom_comp_mask_pred = test_impl; // test - aom_comp_mask_upsampled_pred(NULL, NULL, 0, 0, NULL, comp_pred2_, pred_, - w, h, subx, suby, ref_, MAX_SB_SIZE, mask, - w, inv, subpel_search); - ASSERT_EQ(CheckResult(w, h), true) - << " wedge " << wedge_index << " inv " << inv << "sub (" << subx - << "," << suby << ")"; - } - } - } -} - -void AV1CompMaskUpVarianceTest::RunSpeedTest(comp_mask_pred_func test_impl, - BLOCK_SIZE bsize, int havSub) { - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - const int subx = havSub ? 3 : 0; - const int suby = havSub ? 4 : 0; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - int wedge_index = wedge_types / 2; - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - const int num_loops = 1000000000 / (w + h); - comp_mask_pred_func funcs[2] = { &aom_comp_mask_pred_c, test_impl }; - double elapsed_time[2] = { 0 }; - int subpel_search = 2; // set to 1 to test 4-tap filter. - for (int i = 0; i < 2; ++i) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - aom_comp_mask_pred = funcs[i]; - for (int j = 0; j < num_loops; ++j) { - aom_comp_mask_upsampled_pred(NULL, NULL, 0, 0, NULL, comp_pred1_, pred_, - w, h, subx, suby, ref_, MAX_SB_SIZE, mask, w, - 0, subpel_search); - } - aom_usec_timer_mark(&timer); - double time = static_cast<double>(aom_usec_timer_elapsed(&timer)); - elapsed_time[i] = 1000.0 * time / num_loops; - } - printf("CompMaskUp[%d] %3dx%-3d:%7.2f/%7.2fns", havSub, w, h, elapsed_time[0], - elapsed_time[1]); - printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]); -} - -TEST_P(AV1CompMaskUpVarianceTest, CheckOutput) { - // inv mask = 0, 1 - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 0); - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 1); -} - -TEST_P(AV1CompMaskUpVarianceTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 1); -} - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, AV1CompMaskUpVarianceTest, - ::testing::Combine(::testing::Values(&aom_comp_mask_pred_ssse3), - ::testing::ValuesIn(kValidBlockSize))); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, AV1CompMaskUpVarianceTest, - ::testing::Combine(::testing::Values(&aom_comp_mask_pred_avx2), - ::testing::ValuesIn(kValidBlockSize))); -#endif - -#endif // ifndef aom_comp_mask_pred - -typedef void (*highbd_comp_mask_pred_func)(uint8_t *comp_pred8, - const uint8_t *pred8, int width, - int height, const uint8_t *ref8, - int ref_stride, const uint8_t *mask, - int mask_stride, int invert_mask); - -typedef ::testing::tuple<highbd_comp_mask_pred_func, BLOCK_SIZE, int> - HighbdCompMaskPredParam; - -class AV1HighbdCompMaskVarianceTest - : public ::testing::TestWithParam<HighbdCompMaskPredParam> { - public: - ~AV1HighbdCompMaskVarianceTest(); - void SetUp(); - - void TearDown(); - - protected: - void RunCheckOutput(highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, - int inv); - void RunSpeedTest(highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize); - bool CheckResult(int width, int height) { - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - const int idx = y * width + x; - if (comp_pred1_[idx] != comp_pred2_[idx]) { - printf("%dx%d mismatch @%d(%d,%d) ", width, height, idx, y, x); - printf("%d != %d ", comp_pred1_[idx], comp_pred2_[idx]); - return false; - } - } - } - return true; - } - - libaom_test::ACMRandom rnd_; - uint16_t *comp_pred1_; - uint16_t *comp_pred2_; - uint16_t *pred_; - uint16_t *ref_buffer_; - uint16_t *ref_; -}; - -AV1HighbdCompMaskVarianceTest::~AV1HighbdCompMaskVarianceTest() { ; } - -void AV1HighbdCompMaskVarianceTest::SetUp() { - rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed()); - av1_init_wedge_masks(); - - comp_pred1_ = - (uint16_t *)aom_memalign(16, MAX_SB_SQUARE * sizeof(*comp_pred1_)); - comp_pred2_ = - (uint16_t *)aom_memalign(16, MAX_SB_SQUARE * sizeof(*comp_pred2_)); - pred_ = (uint16_t *)aom_memalign(16, MAX_SB_SQUARE * sizeof(*pred_)); - ref_buffer_ = (uint16_t *)aom_memalign( - 16, (MAX_SB_SQUARE + (8 * MAX_SB_SIZE)) * sizeof(*ref_buffer_)); - ref_ = ref_buffer_ + (8 * MAX_SB_SIZE); -} - -void AV1HighbdCompMaskVarianceTest::TearDown() { - aom_free(comp_pred1_); - aom_free(comp_pred2_); - aom_free(pred_); - aom_free(ref_buffer_); - libaom_test::ClearSystemState(); -} - -void AV1HighbdCompMaskVarianceTest::RunCheckOutput( - highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, int inv) { - int bd_ = GET_PARAM(2); - - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pred_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - for (int i = 0; i < MAX_SB_SQUARE + (8 * MAX_SB_SIZE); ++i) { - ref_buffer_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - - for (int wedge_index = 0; wedge_index < wedge_types; ++wedge_index) { - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - aom_highbd_comp_mask_pred_c( - CONVERT_TO_BYTEPTR(comp_pred1_), CONVERT_TO_BYTEPTR(pred_), w, h, - CONVERT_TO_BYTEPTR(ref_), MAX_SB_SIZE, mask, w, inv); - - test_impl(CONVERT_TO_BYTEPTR(comp_pred2_), CONVERT_TO_BYTEPTR(pred_), w, h, - CONVERT_TO_BYTEPTR(ref_), MAX_SB_SIZE, mask, w, inv); - - ASSERT_EQ(CheckResult(w, h), true) - << " wedge " << wedge_index << " inv " << inv; - } -} - -void AV1HighbdCompMaskVarianceTest::RunSpeedTest( - highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize) { - int bd_ = GET_PARAM(2); - - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - int wedge_index = wedge_types / 2; - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pred_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - for (int i = 0; i < MAX_SB_SQUARE + (8 * MAX_SB_SIZE); ++i) { - ref_buffer_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - const int num_loops = 1000000000 / (w + h); - - highbd_comp_mask_pred_func funcs[2] = { aom_highbd_comp_mask_pred_c, - test_impl }; - double elapsed_time[2] = { 0 }; - for (int i = 0; i < 2; ++i) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - highbd_comp_mask_pred_func func = funcs[i]; - for (int j = 0; j < num_loops; ++j) { - func(CONVERT_TO_BYTEPTR(comp_pred1_), CONVERT_TO_BYTEPTR(pred_), w, h, - CONVERT_TO_BYTEPTR(ref_), MAX_SB_SIZE, mask, w, 0); - } - aom_usec_timer_mark(&timer); - double time = static_cast<double>(aom_usec_timer_elapsed(&timer)); - elapsed_time[i] = 1000.0 * time / num_loops; - } - printf("compMask %3dx%-3d: %7.2f/%7.2fns", w, h, elapsed_time[0], - elapsed_time[1]); - printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]); -} - -TEST_P(AV1HighbdCompMaskVarianceTest, CheckOutput) { - // inv = 0, 1 - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 0); - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 1); -} - -TEST_P(AV1HighbdCompMaskVarianceTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0), GET_PARAM(1)); -} - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, AV1HighbdCompMaskVarianceTest, - ::testing::Combine(::testing::Values(&aom_highbd_comp_mask_pred_avx2), - ::testing::ValuesIn(kValidBlockSize), - ::testing::Range(8, 13, 2))); -#endif - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, AV1HighbdCompMaskVarianceTest, - ::testing::Combine(::testing::Values(&aom_highbd_comp_mask_pred_sse2), - ::testing::ValuesIn(kValidBlockSize), - ::testing::Range(8, 13, 2))); -#endif - -#ifndef aom_highbd_comp_mask_pred -// can't run this test if aom_highbd_comp_mask_pred is defined to -// aom_highbd_comp_mask_pred_c -class AV1HighbdCompMaskUpVarianceTest : public AV1HighbdCompMaskVarianceTest { - public: - ~AV1HighbdCompMaskUpVarianceTest(); - - protected: - void RunCheckOutput(highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, - int inv); - void RunSpeedTest(highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, - int havSub); -}; - -AV1HighbdCompMaskUpVarianceTest::~AV1HighbdCompMaskUpVarianceTest() { ; } - -void AV1HighbdCompMaskUpVarianceTest::RunCheckOutput( - highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, int inv) { - int bd_ = GET_PARAM(2); - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pred_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - for (int i = 0; i < MAX_SB_SQUARE + (8 * MAX_SB_SIZE); ++i) { - ref_buffer_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - - int subpel_search; - for (subpel_search = 1; subpel_search <= 2; ++subpel_search) { - // loop through subx and suby - for (int sub = 0; sub < 8 * 8; ++sub) { - int subx = sub & 0x7; - int suby = (sub >> 3); - for (int wedge_index = 0; wedge_index < wedge_types; ++wedge_index) { - const uint8_t *mask = - av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - aom_highbd_comp_mask_pred = aom_highbd_comp_mask_pred_c; // ref - aom_highbd_comp_mask_upsampled_pred( - NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(comp_pred1_), - CONVERT_TO_BYTEPTR(pred_), w, h, subx, suby, - CONVERT_TO_BYTEPTR(ref_), MAX_SB_SIZE, mask, w, inv, bd_, - subpel_search); - - aom_highbd_comp_mask_pred = test_impl; // test - aom_highbd_comp_mask_upsampled_pred( - NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(comp_pred2_), - CONVERT_TO_BYTEPTR(pred_), w, h, subx, suby, - CONVERT_TO_BYTEPTR(ref_), MAX_SB_SIZE, mask, w, inv, bd_, - subpel_search); - ASSERT_EQ(CheckResult(w, h), true) - << " wedge " << wedge_index << " inv " << inv << "sub (" << subx - << "," << suby << ")"; - } - } - } -} - -void AV1HighbdCompMaskUpVarianceTest::RunSpeedTest( - highbd_comp_mask_pred_func test_impl, BLOCK_SIZE bsize, int havSub) { - int bd_ = GET_PARAM(2); - const int w = block_size_wide[bsize]; - const int h = block_size_high[bsize]; - const int subx = havSub ? 3 : 0; - const int suby = havSub ? 4 : 0; - - int wedge_types = (1 << get_wedge_bits_lookup(bsize)); - int wedge_index = wedge_types / 2; - const uint8_t *mask = av1_get_contiguous_soft_mask(wedge_index, 1, bsize); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pred_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - for (int i = 0; i < MAX_SB_SQUARE + (8 * MAX_SB_SIZE); ++i) { - ref_buffer_[i] = rnd_.Rand16() & ((1 << bd_) - 1); - } - - const int num_loops = 1000000000 / (w + h); - highbd_comp_mask_pred_func funcs[2] = { &aom_highbd_comp_mask_pred_c, - test_impl }; - double elapsed_time[2] = { 0 }; - for (int i = 0; i < 2; ++i) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - aom_highbd_comp_mask_pred = funcs[i]; - int subpel_search = 2; // set to 1 to test 4-tap filter. - for (int j = 0; j < num_loops; ++j) { - aom_highbd_comp_mask_upsampled_pred( - NULL, NULL, 0, 0, NULL, CONVERT_TO_BYTEPTR(comp_pred1_), - CONVERT_TO_BYTEPTR(pred_), w, h, subx, suby, CONVERT_TO_BYTEPTR(ref_), - MAX_SB_SIZE, mask, w, 0, bd_, subpel_search); - } - aom_usec_timer_mark(&timer); - double time = static_cast<double>(aom_usec_timer_elapsed(&timer)); - elapsed_time[i] = 1000.0 * time / num_loops; - } - printf("CompMaskUp[%d] %3dx%-3d:%7.2f/%7.2fns", havSub, w, h, elapsed_time[0], - elapsed_time[1]); - printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]); -} - -TEST_P(AV1HighbdCompMaskUpVarianceTest, CheckOutput) { - // inv mask = 0, 1 - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 0); - RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 1); -} - -TEST_P(AV1HighbdCompMaskUpVarianceTest, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 1); -} - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, AV1HighbdCompMaskUpVarianceTest, - ::testing::Combine(::testing::Values(&aom_highbd_comp_mask_pred_avx2), - ::testing::ValuesIn(kValidBlockSize), - ::testing::Range(8, 13, 2))); -#endif - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, AV1HighbdCompMaskUpVarianceTest, - ::testing::Combine(::testing::Values(&aom_highbd_comp_mask_pred_sse2), - ::testing::ValuesIn(kValidBlockSize), - ::testing::Range(8, 13, 2))); -#endif - -#endif // ifndef aom_highbd_comp_mask_pred -} // namespace AV1CompMaskVariance diff --git a/third_party/aom/test/convolve_round_test.cc b/third_party/aom/test/convolve_round_test.cc deleted file mode 100644 index 2f801e7d4..000000000 --- a/third_party/aom/test/convolve_round_test.cc +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <assert.h> - -#include "config/av1_rtcd.h" - -#include "aom/aom_integer.h" -#include "aom_ports/aom_timer.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -using libaom_test::ACMRandom; - -namespace { -#define CONVOLVE_ROUNDING_PARAM \ - const int32_t *src, int src_stride, uint8_t *dst, int dst_stride, int w, \ - int h, int bits - -typedef void (*ConvolveRoundFunc)(CONVOLVE_ROUNDING_PARAM); - -typedef void (*ConvolveRoundFuncHbd)(CONVOLVE_ROUNDING_PARAM, int bd); - -template <ConvolveRoundFuncHbd fn> -void highbd_convolve_rounding_8(CONVOLVE_ROUNDING_PARAM) { - const int bd = 8; - fn(src, src_stride, dst, dst_stride, w, h, bits, bd); -} - -template <ConvolveRoundFuncHbd fn> -void highbd_convolve_rounding_10(CONVOLVE_ROUNDING_PARAM) { - const int bd = 10; - fn(src, src_stride, dst, dst_stride, w, h, bits, bd); -} - -template <ConvolveRoundFuncHbd fn> -void highbd_convolve_rounding_12(CONVOLVE_ROUNDING_PARAM) { - const int bd = 12; - fn(src, src_stride, dst, dst_stride, w, h, bits, bd); -} - -typedef enum { LOWBITDEPTH_TEST, HIGHBITDEPTH_TEST } DataPathType; - -using ::testing::tuple; - -typedef tuple<ConvolveRoundFunc, ConvolveRoundFunc, DataPathType> - ConvolveRoundParam; - -const int kTestNum = 5000; - -class ConvolveRoundTest : public ::testing::TestWithParam<ConvolveRoundParam> { - protected: - ConvolveRoundTest() - : func_ref_(GET_PARAM(0)), func_(GET_PARAM(1)), data_path_(GET_PARAM(2)) { - } - virtual ~ConvolveRoundTest() {} - - virtual void SetUp() { - const size_t block_size = 128 * 128; - src_ = reinterpret_cast<int32_t *>( - aom_memalign(16, block_size * sizeof(*src_))); - dst_ref_ = reinterpret_cast<uint16_t *>( - aom_memalign(16, block_size * sizeof(*dst_ref_))); - dst_ = reinterpret_cast<uint16_t *>( - aom_memalign(16, block_size * sizeof(*dst_))); - } - - virtual void TearDown() { - aom_free(src_); - aom_free(dst_ref_); - aom_free(dst_); - } - - void ConvolveRoundingRun() { - int test_num = 0; - const int src_stride = 128; - const int dst_stride = 128; - int bits = 13; - uint8_t *dst = 0; - uint8_t *dst_ref = 0; - - if (data_path_ == LOWBITDEPTH_TEST) { - dst = reinterpret_cast<uint8_t *>(dst_); - dst_ref = reinterpret_cast<uint8_t *>(dst_ref_); - } else if (data_path_ == HIGHBITDEPTH_TEST) { - dst = CONVERT_TO_BYTEPTR(dst_); - dst_ref = CONVERT_TO_BYTEPTR(dst_ref_); - } else { - assert(0); - } - - while (test_num < kTestNum) { - int block_size = test_num % BLOCK_SIZES_ALL; - int w = block_size_wide[block_size]; - int h = block_size_high[block_size]; - - if (test_num % 2 == 0) - bits -= 1; - else - bits += 1; - - GenerateBufferWithRandom(src_, src_stride, bits, w, h); - - func_ref_(src_, src_stride, dst_ref, dst_stride, w, h, bits); - ASM_REGISTER_STATE_CHECK( - func_(src_, src_stride, dst, dst_stride, w, h, bits)); - - if (data_path_ == LOWBITDEPTH_TEST) { - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - ASSERT_EQ(dst_ref[r * dst_stride + c], dst[r * dst_stride + c]) - << "Mismatch at r: " << r << " c: " << c << " w: " << w - << " h: " << h << " test: " << test_num; - } - } - } else { - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - ASSERT_EQ(dst_ref_[r * dst_stride + c], dst_[r * dst_stride + c]) - << "Mismatch at r: " << r << " c: " << c << " w: " << w - << " h: " << h << " test: " << test_num; - } - } - } - - test_num++; - } - } - - void GenerateBufferWithRandom(int32_t *src, int src_stride, int bits, int w, - int h) { - int32_t number; - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - number = static_cast<int32_t>(rand_.Rand31()); - number %= 1 << (bits + 9); - src[r * src_stride + c] = number; - } - } - } - - ACMRandom rand_; - int32_t *src_; - uint16_t *dst_ref_; - uint16_t *dst_; - - ConvolveRoundFunc func_ref_; - ConvolveRoundFunc func_; - DataPathType data_path_; -}; - -TEST_P(ConvolveRoundTest, BitExactCheck) { ConvolveRoundingRun(); } - -using ::testing::make_tuple; -#if HAVE_AVX2 -const ConvolveRoundParam kConvRndParamArray[] = { - make_tuple(&av1_convolve_rounding_c, &av1_convolve_rounding_avx2, - LOWBITDEPTH_TEST), - make_tuple(&highbd_convolve_rounding_8<av1_highbd_convolve_rounding_c>, - &highbd_convolve_rounding_8<av1_highbd_convolve_rounding_avx2>, - HIGHBITDEPTH_TEST), - make_tuple(&highbd_convolve_rounding_10<av1_highbd_convolve_rounding_c>, - &highbd_convolve_rounding_10<av1_highbd_convolve_rounding_avx2>, - HIGHBITDEPTH_TEST), - make_tuple(&highbd_convolve_rounding_12<av1_highbd_convolve_rounding_c>, - &highbd_convolve_rounding_12<av1_highbd_convolve_rounding_avx2>, - HIGHBITDEPTH_TEST) -}; -INSTANTIATE_TEST_CASE_P(AVX2, ConvolveRoundTest, - ::testing::ValuesIn(kConvRndParamArray)); -#endif // HAVE_AVX2 -} // namespace diff --git a/third_party/aom/test/convolve_test.cc b/third_party/aom/test/convolve_test.cc deleted file mode 100644 index de3f47628..000000000 --- a/third_party/aom/test/convolve_test.cc +++ /dev/null @@ -1,856 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom_dsp/aom_dsp_common.h" -#include "aom_dsp/aom_filter.h" -#include "aom_mem/aom_mem.h" -#include "aom_ports/aom_timer.h" -#include "aom_ports/mem.h" -#include "av1/common/filter.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -namespace { - -static const unsigned int kMaxDimension = MAX_SB_SIZE; - -typedef void (*ConvolveFunc)(const uint8_t *src, ptrdiff_t src_stride, - uint8_t *dst, ptrdiff_t dst_stride, - const int16_t *filter_x, int filter_x_stride, - const int16_t *filter_y, int filter_y_stride, - int w, int h); - -struct ConvolveFunctions { - ConvolveFunctions(ConvolveFunc copy, ConvolveFunc h8, ConvolveFunc v8, int bd) - : copy_(copy), h8_(h8), v8_(v8), use_highbd_(bd) {} - - ConvolveFunc copy_; - ConvolveFunc h8_; - ConvolveFunc v8_; - int use_highbd_; // 0 if high bitdepth not used, else the actual bit depth. -}; - -typedef ::testing::tuple<int, int, const ConvolveFunctions *> ConvolveParam; - -#define ALL_SIZES_64(convolve_fn) \ - make_tuple(4, 4, &convolve_fn), make_tuple(8, 4, &convolve_fn), \ - make_tuple(4, 8, &convolve_fn), make_tuple(8, 8, &convolve_fn), \ - make_tuple(16, 8, &convolve_fn), make_tuple(8, 16, &convolve_fn), \ - make_tuple(16, 16, &convolve_fn), make_tuple(32, 16, &convolve_fn), \ - make_tuple(16, 32, &convolve_fn), make_tuple(32, 32, &convolve_fn), \ - make_tuple(64, 32, &convolve_fn), make_tuple(32, 64, &convolve_fn), \ - make_tuple(64, 64, &convolve_fn) - -#define ALL_SIZES(convolve_fn) \ - make_tuple(128, 64, &convolve_fn), make_tuple(64, 128, &convolve_fn), \ - make_tuple(128, 128, &convolve_fn), ALL_SIZES_64(convolve_fn) - -// Reference 8-tap subpixel filter, slightly modified to fit into this test. -#define AV1_FILTER_WEIGHT 128 -#define AV1_FILTER_SHIFT 7 -uint8_t clip_pixel(int x) { return x < 0 ? 0 : x > 255 ? 255 : x; } - -void filter_block2d_8_c(const uint8_t *src_ptr, unsigned int src_stride, - const int16_t *HFilter, const int16_t *VFilter, - uint8_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, unsigned int output_height) { - // Between passes, we use an intermediate buffer whose height is extended to - // have enough horizontally filtered values as input for the vertical pass. - // This buffer is allocated to be big enough for the largest block type we - // support. - const int kInterp_Extend = 4; - const unsigned int intermediate_height = - (kInterp_Extend - 1) + output_height + kInterp_Extend; - unsigned int i, j; - - assert(intermediate_height > 7); - - // Size of intermediate_buffer is max_intermediate_height * filter_max_width, - // where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height - // + kInterp_Extend - // = 3 + 16 + 4 - // = 23 - // and filter_max_width = 16 - // - uint8_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension]; - const int intermediate_next_stride = - 1 - static_cast<int>(intermediate_height * output_width); - - // Horizontal pass (src -> transposed intermediate). - uint8_t *output_ptr = intermediate_buffer; - const int src_next_row_stride = src_stride - output_width; - src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1); - for (i = 0; i < intermediate_height; ++i) { - for (j = 0; j < output_width; ++j) { - // Apply filter... - const int temp = (src_ptr[0] * HFilter[0]) + (src_ptr[1] * HFilter[1]) + - (src_ptr[2] * HFilter[2]) + (src_ptr[3] * HFilter[3]) + - (src_ptr[4] * HFilter[4]) + (src_ptr[5] * HFilter[5]) + - (src_ptr[6] * HFilter[6]) + (src_ptr[7] * HFilter[7]) + - (AV1_FILTER_WEIGHT >> 1); // Rounding - - // Normalize back to 0-255... - *output_ptr = clip_pixel(temp >> AV1_FILTER_SHIFT); - ++src_ptr; - output_ptr += intermediate_height; - } - src_ptr += src_next_row_stride; - output_ptr += intermediate_next_stride; - } - - // Vertical pass (transposed intermediate -> dst). - src_ptr = intermediate_buffer; - const int dst_next_row_stride = dst_stride - output_width; - for (i = 0; i < output_height; ++i) { - for (j = 0; j < output_width; ++j) { - // Apply filter... - const int temp = (src_ptr[0] * VFilter[0]) + (src_ptr[1] * VFilter[1]) + - (src_ptr[2] * VFilter[2]) + (src_ptr[3] * VFilter[3]) + - (src_ptr[4] * VFilter[4]) + (src_ptr[5] * VFilter[5]) + - (src_ptr[6] * VFilter[6]) + (src_ptr[7] * VFilter[7]) + - (AV1_FILTER_WEIGHT >> 1); // Rounding - - // Normalize back to 0-255... - *dst_ptr++ = clip_pixel(temp >> AV1_FILTER_SHIFT); - src_ptr += intermediate_height; - } - src_ptr += intermediate_next_stride; - dst_ptr += dst_next_row_stride; - } -} - -void block2d_average_c(uint8_t *src, unsigned int src_stride, - uint8_t *output_ptr, unsigned int output_stride, - unsigned int output_width, unsigned int output_height) { - unsigned int i, j; - for (i = 0; i < output_height; ++i) { - for (j = 0; j < output_width; ++j) { - output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1; - } - output_ptr += output_stride; - } -} - -void filter_average_block2d_8_c(const uint8_t *src_ptr, - const unsigned int src_stride, - const int16_t *HFilter, const int16_t *VFilter, - uint8_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, - unsigned int output_height) { - uint8_t tmp[kMaxDimension * kMaxDimension]; - - assert(output_width <= kMaxDimension); - assert(output_height <= kMaxDimension); - filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, kMaxDimension, - output_width, output_height); - block2d_average_c(tmp, kMaxDimension, dst_ptr, dst_stride, output_width, - output_height); -} - -void highbd_filter_block2d_8_c(const uint16_t *src_ptr, - const unsigned int src_stride, - const int16_t *HFilter, const int16_t *VFilter, - uint16_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, - unsigned int output_height, int bd) { - // Between passes, we use an intermediate buffer whose height is extended to - // have enough horizontally filtered values as input for the vertical pass. - // This buffer is allocated to be big enough for the largest block type we - // support. - const int kInterp_Extend = 4; - const unsigned int intermediate_height = - (kInterp_Extend - 1) + output_height + kInterp_Extend; - - /* Size of intermediate_buffer is max_intermediate_height * filter_max_width, - * where max_intermediate_height = (kInterp_Extend - 1) + filter_max_height - * + kInterp_Extend - * = 3 + 16 + 4 - * = 23 - * and filter_max_width = 16 - */ - uint16_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension] = { 0 }; - const int intermediate_next_stride = - 1 - static_cast<int>(intermediate_height * output_width); - - // Horizontal pass (src -> transposed intermediate). - { - uint16_t *output_ptr = intermediate_buffer; - const int src_next_row_stride = src_stride - output_width; - unsigned int i, j; - src_ptr -= (kInterp_Extend - 1) * src_stride + (kInterp_Extend - 1); - for (i = 0; i < intermediate_height; ++i) { - for (j = 0; j < output_width; ++j) { - // Apply filter... - const int temp = (src_ptr[0] * HFilter[0]) + (src_ptr[1] * HFilter[1]) + - (src_ptr[2] * HFilter[2]) + (src_ptr[3] * HFilter[3]) + - (src_ptr[4] * HFilter[4]) + (src_ptr[5] * HFilter[5]) + - (src_ptr[6] * HFilter[6]) + (src_ptr[7] * HFilter[7]) + - (AV1_FILTER_WEIGHT >> 1); // Rounding - - // Normalize back to 0-255... - *output_ptr = clip_pixel_highbd(temp >> AV1_FILTER_SHIFT, bd); - ++src_ptr; - output_ptr += intermediate_height; - } - src_ptr += src_next_row_stride; - output_ptr += intermediate_next_stride; - } - } - - // Vertical pass (transposed intermediate -> dst). - { - const uint16_t *interm_ptr = intermediate_buffer; - const int dst_next_row_stride = dst_stride - output_width; - unsigned int i, j; - for (i = 0; i < output_height; ++i) { - for (j = 0; j < output_width; ++j) { - // Apply filter... - const int temp = - (interm_ptr[0] * VFilter[0]) + (interm_ptr[1] * VFilter[1]) + - (interm_ptr[2] * VFilter[2]) + (interm_ptr[3] * VFilter[3]) + - (interm_ptr[4] * VFilter[4]) + (interm_ptr[5] * VFilter[5]) + - (interm_ptr[6] * VFilter[6]) + (interm_ptr[7] * VFilter[7]) + - (AV1_FILTER_WEIGHT >> 1); // Rounding - - // Normalize back to 0-255... - *dst_ptr++ = clip_pixel_highbd(temp >> AV1_FILTER_SHIFT, bd); - interm_ptr += intermediate_height; - } - interm_ptr += intermediate_next_stride; - dst_ptr += dst_next_row_stride; - } - } -} - -void highbd_block2d_average_c(uint16_t *src, unsigned int src_stride, - uint16_t *output_ptr, unsigned int output_stride, - unsigned int output_width, - unsigned int output_height) { - unsigned int i, j; - for (i = 0; i < output_height; ++i) { - for (j = 0; j < output_width; ++j) { - output_ptr[j] = (output_ptr[j] + src[i * src_stride + j] + 1) >> 1; - } - output_ptr += output_stride; - } -} - -void highbd_filter_average_block2d_8_c( - const uint16_t *src_ptr, unsigned int src_stride, const int16_t *HFilter, - const int16_t *VFilter, uint16_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, unsigned int output_height, int bd) { - uint16_t tmp[kMaxDimension * kMaxDimension]; - - assert(output_width <= kMaxDimension); - assert(output_height <= kMaxDimension); - highbd_filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, tmp, - kMaxDimension, output_width, output_height, bd); - highbd_block2d_average_c(tmp, kMaxDimension, dst_ptr, dst_stride, - output_width, output_height); -} - -class ConvolveTest : public ::testing::TestWithParam<ConvolveParam> { - public: - static void SetUpTestCase() { - // Force input_ to be unaligned, output to be 16 byte aligned. - input_ = reinterpret_cast<uint8_t *>( - aom_memalign(kDataAlignment, kInputBufferSize + 1)) + - 1; - output_ = reinterpret_cast<uint8_t *>( - aom_memalign(kDataAlignment, kOutputBufferSize)); - output_ref_ = reinterpret_cast<uint8_t *>( - aom_memalign(kDataAlignment, kOutputBufferSize)); - input16_ = reinterpret_cast<uint16_t *>(aom_memalign( - kDataAlignment, (kInputBufferSize + 1) * sizeof(uint16_t))) + - 1; - output16_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t))); - output16_ref_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, (kOutputBufferSize) * sizeof(uint16_t))); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - static void TearDownTestCase() { - aom_free(input_ - 1); - input_ = NULL; - aom_free(output_); - output_ = NULL; - aom_free(output_ref_); - output_ref_ = NULL; - aom_free(input16_ - 1); - input16_ = NULL; - aom_free(output16_); - output16_ = NULL; - aom_free(output16_ref_); - output16_ref_ = NULL; - } - - protected: - static const int kDataAlignment = 16; - static const int kOuterBlockSize = 4 * kMaxDimension; - static const int kInputStride = kOuterBlockSize; - static const int kOutputStride = kOuterBlockSize; - static const int kInputBufferSize = kOuterBlockSize * kOuterBlockSize; - static const int kOutputBufferSize = kOuterBlockSize * kOuterBlockSize; - - int Width() const { return GET_PARAM(0); } - int Height() const { return GET_PARAM(1); } - int BorderLeft() const { - const int center = (kOuterBlockSize - Width()) / 2; - return (center + (kDataAlignment - 1)) & ~(kDataAlignment - 1); - } - int BorderTop() const { return (kOuterBlockSize - Height()) / 2; } - - bool IsIndexInBorder(int i) { - return (i < BorderTop() * kOuterBlockSize || - i >= (BorderTop() + Height()) * kOuterBlockSize || - i % kOuterBlockSize < BorderLeft() || - i % kOuterBlockSize >= (BorderLeft() + Width())); - } - - virtual void SetUp() { - UUT_ = GET_PARAM(2); - if (UUT_->use_highbd_ != 0) - mask_ = (1 << UUT_->use_highbd_) - 1; - else - mask_ = 255; - /* Set up guard blocks for an inner block centered in the outer block */ - for (int i = 0; i < kOutputBufferSize; ++i) { - if (IsIndexInBorder(i)) { - output_[i] = 255; - output16_[i] = mask_; - } else { - output_[i] = 0; - output16_[i] = 0; - } - } - - ::libaom_test::ACMRandom prng; - for (int i = 0; i < kInputBufferSize; ++i) { - if (i & 1) { - input_[i] = 255; - input16_[i] = mask_; - } else { - input_[i] = prng.Rand8Extremes(); - input16_[i] = prng.Rand16() & mask_; - } - } - } - - void SetConstantInput(int value) { - memset(input_, value, kInputBufferSize); - aom_memset16(input16_, value, kInputBufferSize); - } - - void CopyOutputToRef() { - memcpy(output_ref_, output_, kOutputBufferSize); - // Copy 16-bit pixels values. The effective number of bytes is double. - memcpy(output16_ref_, output16_, sizeof(output16_[0]) * kOutputBufferSize); - } - - void CheckGuardBlocks() { - for (int i = 0; i < kOutputBufferSize; ++i) { - if (IsIndexInBorder(i)) { - EXPECT_EQ(255, output_[i]); - } - } - } - - uint8_t *input() const { - const int offset = BorderTop() * kOuterBlockSize + BorderLeft(); - if (UUT_->use_highbd_ == 0) { - return input_ + offset; - } else { - return CONVERT_TO_BYTEPTR(input16_) + offset; - } - } - - uint8_t *output() const { - const int offset = BorderTop() * kOuterBlockSize + BorderLeft(); - if (UUT_->use_highbd_ == 0) { - return output_ + offset; - } else { - return CONVERT_TO_BYTEPTR(output16_) + offset; - } - } - - uint8_t *output_ref() const { - const int offset = BorderTop() * kOuterBlockSize + BorderLeft(); - if (UUT_->use_highbd_ == 0) { - return output_ref_ + offset; - } else { - return CONVERT_TO_BYTEPTR(output16_ref_) + offset; - } - } - - uint16_t lookup(uint8_t *list, int index) const { - if (UUT_->use_highbd_ == 0) { - return list[index]; - } else { - return CONVERT_TO_SHORTPTR(list)[index]; - } - } - - void assign_val(uint8_t *list, int index, uint16_t val) const { - if (UUT_->use_highbd_ == 0) { - list[index] = (uint8_t)val; - } else { - CONVERT_TO_SHORTPTR(list)[index] = val; - } - } - - void wrapper_filter_average_block2d_8_c( - const uint8_t *src_ptr, unsigned int src_stride, const int16_t *HFilter, - const int16_t *VFilter, uint8_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, unsigned int output_height) { - if (UUT_->use_highbd_ == 0) { - filter_average_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr, - dst_stride, output_width, output_height); - } else { - highbd_filter_average_block2d_8_c( - CONVERT_TO_SHORTPTR(src_ptr), src_stride, HFilter, VFilter, - CONVERT_TO_SHORTPTR(dst_ptr), dst_stride, output_width, output_height, - UUT_->use_highbd_); - } - } - - void wrapper_filter_block2d_8_c( - const uint8_t *src_ptr, unsigned int src_stride, const int16_t *HFilter, - const int16_t *VFilter, uint8_t *dst_ptr, unsigned int dst_stride, - unsigned int output_width, unsigned int output_height) { - if (UUT_->use_highbd_ == 0) { - filter_block2d_8_c(src_ptr, src_stride, HFilter, VFilter, dst_ptr, - dst_stride, output_width, output_height); - } else { - highbd_filter_block2d_8_c(CONVERT_TO_SHORTPTR(src_ptr), src_stride, - HFilter, VFilter, CONVERT_TO_SHORTPTR(dst_ptr), - dst_stride, output_width, output_height, - UUT_->use_highbd_); - } - } - - const ConvolveFunctions *UUT_; - static uint8_t *input_; - static uint8_t *output_; - static uint8_t *output_ref_; - static uint16_t *input16_; - static uint16_t *output16_; - static uint16_t *output16_ref_; - int mask_; -}; - -uint8_t *ConvolveTest::input_ = NULL; -uint8_t *ConvolveTest::output_ = NULL; -uint8_t *ConvolveTest::output_ref_ = NULL; -uint16_t *ConvolveTest::input16_ = NULL; -uint16_t *ConvolveTest::output16_ = NULL; -uint16_t *ConvolveTest::output16_ref_ = NULL; - -TEST_P(ConvolveTest, GuardBlocks) { CheckGuardBlocks(); } - -TEST_P(ConvolveTest, Copy) { - uint8_t *const in = input(); - uint8_t *const out = output(); - - ASM_REGISTER_STATE_CHECK(UUT_->copy_(in, kInputStride, out, kOutputStride, - NULL, 0, NULL, 0, Width(), Height())); - - CheckGuardBlocks(); - - for (int y = 0; y < Height(); ++y) - for (int x = 0; x < Width(); ++x) - ASSERT_EQ(lookup(out, y * kOutputStride + x), - lookup(in, y * kInputStride + x)) - << "(" << x << "," << y << ")"; -} - -const int kNumFilterBanks = SWITCHABLE_FILTERS; -const int kNumFilters = 16; - -TEST(ConvolveTest, FiltersWontSaturateWhenAddedPairwise) { - for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) { - const InterpFilter filter = (InterpFilter)filter_bank; - const InterpKernel *filters = - (const InterpKernel *)av1_get_interp_filter_kernel(filter); - const InterpFilterParams *filter_params = - av1_get_interp_filter_params_with_block_size(filter, 8); - if (filter_params->taps != SUBPEL_TAPS) continue; - for (int i = 0; i < kNumFilters; i++) { - const int p0 = filters[i][0] + filters[i][1]; - const int p1 = filters[i][2] + filters[i][3]; - const int p2 = filters[i][4] + filters[i][5]; - const int p3 = filters[i][6] + filters[i][7]; - EXPECT_LE(p0, 128); - EXPECT_LE(p1, 128); - EXPECT_LE(p2, 128); - EXPECT_LE(p3, 128); - EXPECT_LE(p0 + p3, 128); - EXPECT_LE(p0 + p3 + p1, 128); - EXPECT_LE(p0 + p3 + p1 + p2, 128); - EXPECT_EQ(p0 + p1 + p2 + p3, 128); - } - } -} - -const int16_t kInvalidFilter[8] = { 0 }; - -TEST_P(ConvolveTest, MatchesReferenceSubpixelFilter) { - uint8_t *const in = input(); - uint8_t *const out = output(); - uint8_t ref8[kOutputStride * kMaxDimension]; - uint16_t ref16[kOutputStride * kMaxDimension]; - uint8_t *ref; - if (UUT_->use_highbd_ == 0) { - ref = ref8; - } else { - ref = CONVERT_TO_BYTEPTR(ref16); - } - - for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) { - const InterpFilter filter = (InterpFilter)filter_bank; - const InterpKernel *filters = - (const InterpKernel *)av1_get_interp_filter_kernel(filter); - const InterpFilterParams *filter_params = - av1_get_interp_filter_params_with_block_size(filter, 8); - if (filter_params->taps != SUBPEL_TAPS) continue; - - for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) { - for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) { - wrapper_filter_block2d_8_c(in, kInputStride, filters[filter_x], - filters[filter_y], ref, kOutputStride, - Width(), Height()); - - if (filter_x && filter_y) - continue; - else if (filter_y) - ASM_REGISTER_STATE_CHECK( - UUT_->v8_(in, kInputStride, out, kOutputStride, kInvalidFilter, - 16, filters[filter_y], 16, Width(), Height())); - else if (filter_x) - ASM_REGISTER_STATE_CHECK( - UUT_->h8_(in, kInputStride, out, kOutputStride, filters[filter_x], - 16, kInvalidFilter, 16, Width(), Height())); - else - ASM_REGISTER_STATE_CHECK( - UUT_->copy_(in, kInputStride, out, kOutputStride, kInvalidFilter, - 0, kInvalidFilter, 0, Width(), Height())); - - CheckGuardBlocks(); - - for (int y = 0; y < Height(); ++y) - for (int x = 0; x < Width(); ++x) - ASSERT_EQ(lookup(ref, y * kOutputStride + x), - lookup(out, y * kOutputStride + x)) - << "mismatch at (" << x << "," << y << "), " - << "filters (" << filter_bank << "," << filter_x << "," - << filter_y << ")"; - } - } - } -} - -TEST_P(ConvolveTest, FilterExtremes) { - uint8_t *const in = input(); - uint8_t *const out = output(); - uint8_t ref8[kOutputStride * kMaxDimension]; - uint16_t ref16[kOutputStride * kMaxDimension]; - uint8_t *ref; - if (UUT_->use_highbd_ == 0) { - ref = ref8; - } else { - ref = CONVERT_TO_BYTEPTR(ref16); - } - - // Populate ref and out with some random data - ::libaom_test::ACMRandom prng; - for (int y = 0; y < Height(); ++y) { - for (int x = 0; x < Width(); ++x) { - uint16_t r; - if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) { - r = prng.Rand8Extremes(); - } else { - r = prng.Rand16() & mask_; - } - assign_val(out, y * kOutputStride + x, r); - assign_val(ref, y * kOutputStride + x, r); - } - } - - for (int axis = 0; axis < 2; axis++) { - int seed_val = 0; - while (seed_val < 256) { - for (int y = 0; y < 8; ++y) { - for (int x = 0; x < 8; ++x) { - assign_val(in, y * kOutputStride + x - SUBPEL_TAPS / 2 + 1, - ((seed_val >> (axis ? y : x)) & 1) * mask_); - if (axis) seed_val++; - } - if (axis) - seed_val -= 8; - else - seed_val++; - } - if (axis) seed_val += 8; - - for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) { - const InterpFilter filter = (InterpFilter)filter_bank; - const InterpKernel *filters = - (const InterpKernel *)av1_get_interp_filter_kernel(filter); - const InterpFilterParams *filter_params = - av1_get_interp_filter_params_with_block_size(filter, 8); - if (filter_params->taps != SUBPEL_TAPS) continue; - for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) { - for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) { - wrapper_filter_block2d_8_c(in, kInputStride, filters[filter_x], - filters[filter_y], ref, kOutputStride, - Width(), Height()); - if (filter_x && filter_y) - continue; - else if (filter_y) - ASM_REGISTER_STATE_CHECK(UUT_->v8_( - in, kInputStride, out, kOutputStride, kInvalidFilter, 16, - filters[filter_y], 16, Width(), Height())); - else if (filter_x) - ASM_REGISTER_STATE_CHECK(UUT_->h8_( - in, kInputStride, out, kOutputStride, filters[filter_x], 16, - kInvalidFilter, 16, Width(), Height())); - else - ASM_REGISTER_STATE_CHECK(UUT_->copy_( - in, kInputStride, out, kOutputStride, kInvalidFilter, 0, - kInvalidFilter, 0, Width(), Height())); - - for (int y = 0; y < Height(); ++y) - for (int x = 0; x < Width(); ++x) - ASSERT_EQ(lookup(ref, y * kOutputStride + x), - lookup(out, y * kOutputStride + x)) - << "mismatch at (" << x << "," << y << "), " - << "filters (" << filter_bank << "," << filter_x << "," - << filter_y << ")"; - } - } - } - } - } -} - -TEST_P(ConvolveTest, DISABLED_Copy_Speed) { - const uint8_t *const in = input(); - uint8_t *const out = output(); - const int kNumTests = 5000000; - const int width = Width(); - const int height = Height(); - aom_usec_timer timer; - - aom_usec_timer_start(&timer); - for (int n = 0; n < kNumTests; ++n) { - UUT_->copy_(in, kInputStride, out, kOutputStride, NULL, 0, NULL, 0, width, - height); - } - aom_usec_timer_mark(&timer); - - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("convolve_copy_%dx%d_%d: %d us\n", width, height, - UUT_->use_highbd_ ? UUT_->use_highbd_ : 8, elapsed_time); -} - -TEST_P(ConvolveTest, DISABLED_Speed) { - uint8_t *const in = input(); - uint8_t *const out = output(); - uint8_t ref8[kOutputStride * kMaxDimension]; - uint16_t ref16[kOutputStride * kMaxDimension]; - uint8_t *ref; - if (UUT_->use_highbd_ == 0) { - ref = ref8; - } else { - ref = CONVERT_TO_BYTEPTR(ref16); - } - - // Populate ref and out with some random data - ::libaom_test::ACMRandom prng; - for (int y = 0; y < Height(); ++y) { - for (int x = 0; x < Width(); ++x) { - uint16_t r; - if (UUT_->use_highbd_ == 0 || UUT_->use_highbd_ == 8) { - r = prng.Rand8Extremes(); - } else { - r = prng.Rand16() & mask_; - } - assign_val(out, y * kOutputStride + x, r); - assign_val(ref, y * kOutputStride + x, r); - } - } - - const InterpFilter filter = (InterpFilter)1; - const InterpKernel *filters = - (const InterpKernel *)av1_get_interp_filter_kernel(filter); - wrapper_filter_average_block2d_8_c(in, kInputStride, filters[1], filters[1], - out, kOutputStride, Width(), Height()); - - aom_usec_timer timer; - int tests_num = 1000; - - aom_usec_timer_start(&timer); - while (tests_num > 0) { - for (int filter_bank = 0; filter_bank < kNumFilterBanks; ++filter_bank) { - const InterpFilter filter = (InterpFilter)filter_bank; - const InterpKernel *filters = - (const InterpKernel *)av1_get_interp_filter_kernel(filter); - const InterpFilterParams *filter_params = - av1_get_interp_filter_params_with_block_size(filter, 8); - if (filter_params->taps != SUBPEL_TAPS) continue; - - for (int filter_x = 0; filter_x < kNumFilters; ++filter_x) { - for (int filter_y = 0; filter_y < kNumFilters; ++filter_y) { - if (filter_x && filter_y) continue; - if (filter_y) - ASM_REGISTER_STATE_CHECK( - UUT_->v8_(in, kInputStride, out, kOutputStride, kInvalidFilter, - 16, filters[filter_y], 16, Width(), Height())); - else if (filter_x) - ASM_REGISTER_STATE_CHECK(UUT_->h8_( - in, kInputStride, out, kOutputStride, filters[filter_x], 16, - kInvalidFilter, 16, Width(), Height())); - } - } - } - tests_num--; - } - aom_usec_timer_mark(&timer); - - const int elapsed_time = - static_cast<int>(aom_usec_timer_elapsed(&timer) / 1000); - printf("%dx%d (bitdepth %d) time: %5d ms\n", Width(), Height(), - UUT_->use_highbd_, elapsed_time); -} - -using ::testing::make_tuple; - -#define WRAP(func, bd) \ - static void wrap_##func##_##bd( \ - const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, \ - ptrdiff_t dst_stride, const int16_t *filter_x, int filter_x_stride, \ - const int16_t *filter_y, int filter_y_stride, int w, int h) { \ - aom_highbd_##func(src, src_stride, dst, dst_stride, filter_x, \ - filter_x_stride, filter_y, filter_y_stride, w, h, bd); \ - } -#if HAVE_SSE2 && ARCH_X86_64 -WRAP(convolve_copy_sse2, 8) -WRAP(convolve_copy_sse2, 10) -WRAP(convolve_copy_sse2, 12) -WRAP(convolve8_horiz_sse2, 8) -WRAP(convolve8_vert_sse2, 8) -WRAP(convolve8_horiz_sse2, 10) -WRAP(convolve8_vert_sse2, 10) -WRAP(convolve8_horiz_sse2, 12) -WRAP(convolve8_vert_sse2, 12) -#endif // HAVE_SSE2 && ARCH_X86_64 - -WRAP(convolve_copy_c, 8) -WRAP(convolve8_horiz_c, 8) -WRAP(convolve8_vert_c, 8) -WRAP(convolve_copy_c, 10) -WRAP(convolve8_horiz_c, 10) -WRAP(convolve8_vert_c, 10) -WRAP(convolve_copy_c, 12) -WRAP(convolve8_horiz_c, 12) -WRAP(convolve8_vert_c, 12) - -#if HAVE_AVX2 -WRAP(convolve_copy_avx2, 8) -WRAP(convolve8_horiz_avx2, 8) -WRAP(convolve8_vert_avx2, 8) - -WRAP(convolve_copy_avx2, 10) -WRAP(convolve8_horiz_avx2, 10) -WRAP(convolve8_vert_avx2, 10) - -WRAP(convolve_copy_avx2, 12) -WRAP(convolve8_horiz_avx2, 12) -WRAP(convolve8_vert_avx2, 12) -#endif // HAVE_AVX2 - -#undef WRAP - -const ConvolveFunctions convolve8_c(wrap_convolve_copy_c_8, - wrap_convolve8_horiz_c_8, - wrap_convolve8_vert_c_8, 8); -const ConvolveFunctions convolve10_c(wrap_convolve_copy_c_10, - wrap_convolve8_horiz_c_10, - wrap_convolve8_vert_c_10, 10); -const ConvolveFunctions convolve12_c(wrap_convolve_copy_c_12, - wrap_convolve8_horiz_c_12, - wrap_convolve8_vert_c_12, 12); -const ConvolveParam kArrayConvolve_c[] = { - ALL_SIZES(convolve8_c), ALL_SIZES(convolve10_c), ALL_SIZES(convolve12_c) -}; - -INSTANTIATE_TEST_CASE_P(C, ConvolveTest, ::testing::ValuesIn(kArrayConvolve_c)); - -#if HAVE_SSE2 && ARCH_X86_64 -const ConvolveFunctions convolve8_sse2(wrap_convolve_copy_sse2_8, - wrap_convolve8_horiz_sse2_8, - wrap_convolve8_vert_sse2_8, 8); -const ConvolveFunctions convolve10_sse2(wrap_convolve_copy_sse2_10, - wrap_convolve8_horiz_sse2_10, - wrap_convolve8_vert_sse2_10, 10); -const ConvolveFunctions convolve12_sse2(wrap_convolve_copy_sse2_12, - wrap_convolve8_horiz_sse2_12, - wrap_convolve8_vert_sse2_12, 12); -const ConvolveParam kArrayConvolve_sse2[] = { ALL_SIZES(convolve8_sse2), - ALL_SIZES(convolve10_sse2), - ALL_SIZES(convolve12_sse2) }; -INSTANTIATE_TEST_CASE_P(SSE2, ConvolveTest, - ::testing::ValuesIn(kArrayConvolve_sse2)); -#endif - -#if HAVE_SSSE3 -const ConvolveFunctions convolve8_ssse3(aom_convolve_copy_c, - aom_convolve8_horiz_ssse3, - aom_convolve8_vert_ssse3, 0); - -const ConvolveParam kArrayConvolve8_ssse3[] = { ALL_SIZES(convolve8_ssse3) }; -INSTANTIATE_TEST_CASE_P(SSSE3, ConvolveTest, - ::testing::ValuesIn(kArrayConvolve8_ssse3)); -#endif - -#if HAVE_AVX2 -const ConvolveFunctions convolve8_avx2(aom_convolve_copy_c, - aom_convolve8_horiz_avx2, - aom_convolve8_vert_avx2, 0); - -const ConvolveFunctions wrap_convolve8_avx2(wrap_convolve_copy_avx2_8, - wrap_convolve8_horiz_avx2_8, - wrap_convolve8_vert_avx2_8, 8); -const ConvolveFunctions wrap_convolve10_avx2(wrap_convolve_copy_avx2_10, - wrap_convolve8_horiz_avx2_10, - wrap_convolve8_vert_avx2_10, 10); -const ConvolveFunctions wrap_convolve12_avx2(wrap_convolve_copy_avx2_12, - wrap_convolve8_horiz_avx2_12, - wrap_convolve8_vert_avx2_12, 12); -const ConvolveParam kArray_Convolve8_avx2[] = { - ALL_SIZES_64(wrap_convolve8_avx2), ALL_SIZES_64(wrap_convolve10_avx2), - ALL_SIZES_64(wrap_convolve12_avx2), ALL_SIZES(convolve8_avx2) -}; -INSTANTIATE_TEST_CASE_P(AVX2, ConvolveTest, - ::testing::ValuesIn(kArray_Convolve8_avx2)); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/corner_match_test.cc b/third_party/aom/test/corner_match_test.cc deleted file mode 100644 index 58e3139c5..000000000 --- a/third_party/aom/test/corner_match_test.cc +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include "config/av1_rtcd.h" - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/util.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" - -#include "av1/encoder/corner_match.h" - -namespace test_libaom { - -namespace AV1CornerMatch { - -using libaom_test::ACMRandom; - -using ::testing::make_tuple; -using ::testing::tuple; -typedef tuple<int> CornerMatchParam; - -class AV1CornerMatchTest : public ::testing::TestWithParam<CornerMatchParam> { - public: - virtual ~AV1CornerMatchTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(); - - libaom_test::ACMRandom rnd_; -}; - -AV1CornerMatchTest::~AV1CornerMatchTest() {} -void AV1CornerMatchTest::SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } -void AV1CornerMatchTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1CornerMatchTest::RunCheckOutput() { - const int w = 128, h = 128; - const int num_iters = 10000; - int i, j; - - uint8_t *input1 = new uint8_t[w * h]; - uint8_t *input2 = new uint8_t[w * h]; - - // Test the two extreme cases: - // i) Random data, should have correlation close to 0 - // ii) Linearly related data + noise, should have correlation close to 1 - int mode = GET_PARAM(0); - if (mode == 0) { - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) { - input1[i * w + j] = rnd_.Rand8(); - input2[i * w + j] = rnd_.Rand8(); - } - } else if (mode == 1) { - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) { - int v = rnd_.Rand8(); - input1[i * w + j] = v; - input2[i * w + j] = (v / 2) + (rnd_.Rand8() & 15); - } - } - - for (i = 0; i < num_iters; ++i) { - int x1 = MATCH_SZ_BY2 + rnd_.PseudoUniform(w - 2 * MATCH_SZ_BY2); - int y1 = MATCH_SZ_BY2 + rnd_.PseudoUniform(h - 2 * MATCH_SZ_BY2); - int x2 = MATCH_SZ_BY2 + rnd_.PseudoUniform(w - 2 * MATCH_SZ_BY2); - int y2 = MATCH_SZ_BY2 + rnd_.PseudoUniform(h - 2 * MATCH_SZ_BY2); - - double res_c = - compute_cross_correlation_c(input1, w, x1, y1, input2, w, x2, y2); - double res_sse4 = - compute_cross_correlation_sse4_1(input1, w, x1, y1, input2, w, x2, y2); - - ASSERT_EQ(res_sse4, res_c); - } - - delete[] input1; - delete[] input2; -} - -TEST_P(AV1CornerMatchTest, CheckOutput) { RunCheckOutput(); } - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1CornerMatchTest, - ::testing::Values(make_tuple(0), make_tuple(1))); - -} // namespace AV1CornerMatch - -} // namespace test_libaom diff --git a/third_party/aom/test/cpu_speed_test.cc b/third_party/aom/test/cpu_speed_test.cc deleted file mode 100644 index 8ea3e6965..000000000 --- a/third_party/aom/test/cpu_speed_test.cc +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/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" -#include "test/y4m_video_source.h" - -namespace { - -const int kMaxPSNR = 100; - -class CpuSpeedTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - CpuSpeedTest() - : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), - set_cpu_used_(GET_PARAM(2)), min_psnr_(kMaxPSNR), - tune_content_(AOM_CONTENT_DEFAULT) {} - virtual ~CpuSpeedTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - cfg_.g_lag_in_frames = 25; - cfg_.rc_end_usage = AOM_VBR; - } else { - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_CBR; - } - } - - virtual void BeginPassHook(unsigned int /*pass*/) { min_psnr_ = kMaxPSNR; } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - encoder->Control(AV1E_SET_TUNE_CONTENT, tune_content_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (pkt->data.psnr.psnr[0] < min_psnr_) min_psnr_ = pkt->data.psnr.psnr[0]; - } - - void TestQ0(); - void TestScreencastQ0(); - void TestTuneScreen(); - void TestEncodeHighBitrate(); - void TestLowBitrate(); - - ::libaom_test::TestMode encoding_mode_; - int set_cpu_used_; - double min_psnr_; - int tune_content_; -}; - -void CpuSpeedTest::TestQ0() { - // Validate that this non multiple of 64 wide clip encodes and decodes - // without a mismatch when passing in a very low max q. This pushes - // the encoder to producing lots of big partitions which will likely - // extend into the border and test the border condition. - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 400; - cfg_.rc_max_quantizer = 0; - cfg_.rc_min_quantizer = 0; - - ::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, - 10); - - init_flags_ = AOM_CODEC_USE_PSNR; - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - EXPECT_GE(min_psnr_, kMaxPSNR); -} - -void CpuSpeedTest::TestScreencastQ0() { - ::libaom_test::Y4mVideoSource video("screendata.y4m", 0, 3); - cfg_.g_timebase = video.timebase(); - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 400; - cfg_.rc_max_quantizer = 0; - cfg_.rc_min_quantizer = 0; - - init_flags_ = AOM_CODEC_USE_PSNR; - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - EXPECT_GE(min_psnr_, kMaxPSNR); -} - -void CpuSpeedTest::TestTuneScreen() { - ::libaom_test::Y4mVideoSource video("screendata.y4m", 0, 3); - cfg_.g_timebase = video.timebase(); - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_minsection_pct = 2000; - cfg_.rc_target_bitrate = 2000; - cfg_.rc_max_quantizer = 63; - cfg_.rc_min_quantizer = 0; - tune_content_ = AOM_CONTENT_SCREEN; - - init_flags_ = AOM_CODEC_USE_PSNR; - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -void CpuSpeedTest::TestEncodeHighBitrate() { - // Validate that this non multiple of 64 wide clip encodes and decodes - // without a mismatch when passing in a very low max q. This pushes - // the encoder to producing lots of big partitions which will likely - // extend into the border and test the border condition. - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 12000; - cfg_.rc_max_quantizer = 10; - cfg_.rc_min_quantizer = 0; - - ::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, - 10); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -void 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_maxsection_pct = 2000; - cfg_.rc_target_bitrate = 200; - cfg_.rc_min_quantizer = 40; - - ::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, - 10); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -TEST_P(CpuSpeedTest, TestQ0) { TestQ0(); } -TEST_P(CpuSpeedTest, TestScreencastQ0) { TestScreencastQ0(); } -TEST_P(CpuSpeedTest, TestTuneScreen) { TestTuneScreen(); } -TEST_P(CpuSpeedTest, TestEncodeHighBitrate) { TestEncodeHighBitrate(); } -TEST_P(CpuSpeedTest, TestLowBitrate) { TestLowBitrate(); } - -class CpuSpeedTestLarge : public CpuSpeedTest {}; - -TEST_P(CpuSpeedTestLarge, TestQ0) { TestQ0(); } -TEST_P(CpuSpeedTestLarge, TestScreencastQ0) { TestScreencastQ0(); } -TEST_P(CpuSpeedTestLarge, TestTuneScreen) { TestTuneScreen(); } -TEST_P(CpuSpeedTestLarge, TestEncodeHighBitrate) { TestEncodeHighBitrate(); } -TEST_P(CpuSpeedTestLarge, TestLowBitrate) { TestLowBitrate(); } - -AV1_INSTANTIATE_TEST_CASE(CpuSpeedTest, - ::testing::Values(::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood), - ::testing::Range(1, 3)); -AV1_INSTANTIATE_TEST_CASE(CpuSpeedTestLarge, - ::testing::Values(::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood), - ::testing::Range(0, 1)); -} // namespace diff --git a/third_party/aom/test/datarate_test.cc b/third_party/aom/test/datarate_test.cc deleted file mode 100644 index 1588d3cc1..000000000 --- a/third_party/aom/test/datarate_test.cc +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "config/aom_config.h" - -#include "third_party/googletest/src/googletest/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" -#include "test/y4m_video_source.h" -#include "aom/aom_codec.h" - -namespace { - -class DatarateTestLarge - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - public: - DatarateTestLarge() : EncoderTest(GET_PARAM(0)) {} - - protected: - virtual ~DatarateTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - set_cpu_used_ = GET_PARAM(2); - ResetModel(); - } - - virtual void ResetModel() { - last_pts_ = 0; - bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz; - frame_number_ = 0; - tot_frame_number_ = 0; - first_drop_ = 0; - num_drops_ = 0; - // Denoiser is off by default. - denoiser_on_ = 0; - bits_total_ = 0; - denoiser_offon_test_ = 0; - denoiser_offon_period_ = -1; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - - if (denoiser_offon_test_) { - ASSERT_GT(denoiser_offon_period_, 0) - << "denoiser_offon_period_ is not positive."; - if ((video->frame() + 1) % denoiser_offon_period_ == 0) { - // Flip denoiser_on_ periodically - denoiser_on_ ^= 1; - } - } - - encoder->Control(AV1E_SET_NOISE_SENSITIVITY, denoiser_on_); - - const aom_rational_t tb = video->timebase(); - timebase_ = static_cast<double>(tb.num) / tb.den; - duration_ = 0; - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - // Time since last timestamp = duration. - aom_codec_pts_t duration = pkt->data.frame.pts - last_pts_; - - if (duration > 1) { - // If first drop not set and we have a drop set it to this time. - if (!first_drop_) first_drop_ = last_pts_ + 1; - // Update the number of frame drops. - num_drops_ += static_cast<int>(duration - 1); - // Update counter for total number of frames (#frames input to encoder). - // Needed for setting the proper layer_id below. - tot_frame_number_ += static_cast<int>(duration - 1); - } - - // Add to the buffer the bits we'd expect from a constant bitrate server. - bits_in_buffer_model_ += static_cast<int64_t>( - duration * timebase_ * cfg_.rc_target_bitrate * 1000); - - // Buffer should not go negative. - ASSERT_GE(bits_in_buffer_model_, 0) - << "Buffer Underrun at frame " << pkt->data.frame.pts; - - const size_t frame_size_in_bits = pkt->data.frame.sz * 8; - - // Update the total encoded bits. - bits_total_ += frame_size_in_bits; - - // Update the most recent pts. - last_pts_ = pkt->data.frame.pts; - ++frame_number_; - ++tot_frame_number_; - } - - virtual void EndPassHook(void) { - duration_ = (last_pts_ + 1) * timebase_; - // Effective file datarate: - effective_datarate_ = (bits_total_ / 1000.0) / duration_; - } - - aom_codec_pts_t last_pts_; - double timebase_; - int frame_number_; // Counter for number of non-dropped/encoded frames. - int tot_frame_number_; // Counter for total number of input frames. - int64_t bits_total_; - double duration_; - double effective_datarate_; - int set_cpu_used_; - int64_t bits_in_buffer_model_; - aom_codec_pts_t first_drop_; - int num_drops_; - int denoiser_on_; - int denoiser_offon_test_; - int denoiser_offon_period_; -}; - -// Check basic rate targeting for VBR mode. -TEST_P(DatarateTestLarge, BasicRateTargetingVBR) { - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 63; - cfg_.g_error_resilient = 0; - cfg_.rc_end_usage = AOM_VBR; - cfg_.g_lag_in_frames = 0; - - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 140); - for (int i = 400; i <= 800; i += 400) { - cfg_.rc_target_bitrate = i; - ResetModel(); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.75) - << " The datarate for the file is lower than target by too much!"; - ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.25) - << " The datarate for the file is greater than target by too much!"; - } -} - -// Check basic rate targeting for CBR, -TEST_P(DatarateTestLarge, BasicRateTargeting) { - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 500; - cfg_.rc_buf_sz = 1000; - cfg_.rc_dropframe_thresh = 1; - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 63; - cfg_.rc_end_usage = AOM_CBR; - cfg_.g_lag_in_frames = 0; - - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 140); - for (int i = 150; i < 800; i += 400) { - cfg_.rc_target_bitrate = i; - ResetModel(); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85) - << " The datarate for the file is lower than target by too much!"; - ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.15) - << " The datarate for the file is greater than target by too much!"; - } -} - -// Check basic rate targeting for CBR. -TEST_P(DatarateTestLarge, BasicRateTargeting444) { - ::libaom_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 140); - - cfg_.g_profile = 1; - cfg_.g_timebase = video.timebase(); - - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 500; - cfg_.rc_buf_sz = 1000; - cfg_.rc_dropframe_thresh = 1; - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 63; - cfg_.rc_end_usage = AOM_CBR; - - for (int i = 250; i < 900; i += 400) { - cfg_.rc_target_bitrate = i; - ResetModel(); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(static_cast<double>(cfg_.rc_target_bitrate), - effective_datarate_ * 0.85) - << " The datarate for the file exceeds the target by too much!"; - ASSERT_LE(static_cast<double>(cfg_.rc_target_bitrate), - effective_datarate_ * 1.15) - << " The datarate for the file missed the target!" - << cfg_.rc_target_bitrate << " " << effective_datarate_; - } -} - -// Check that (1) the first dropped frame gets earlier and earlier -// as the drop frame threshold is increased, and (2) that the total number of -// frame drops does not decrease as we increase frame drop threshold. -// Use a lower qp-max to force some frame drops. -TEST_P(DatarateTestLarge, ChangingDropFrameThresh) { - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 500; - cfg_.rc_buf_sz = 1000; - cfg_.rc_undershoot_pct = 20; - cfg_.rc_undershoot_pct = 20; - cfg_.rc_dropframe_thresh = 10; - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 50; - cfg_.rc_end_usage = AOM_CBR; - cfg_.rc_target_bitrate = 200; - cfg_.g_lag_in_frames = 0; - cfg_.g_error_resilient = 1; - // TODO(marpan): Investigate datarate target failures with a smaller keyframe - // interval (128). - cfg_.kf_max_dist = 9999; - - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 100); - - const int kDropFrameThreshTestStep = 30; - aom_codec_pts_t last_drop = 140; - int last_num_drops = 0; - for (int i = 40; i < 100; i += kDropFrameThreshTestStep) { - cfg_.rc_dropframe_thresh = i; - ResetModel(); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85) - << " The datarate for the file is lower than target by too much!"; - ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.15) - << " The datarate for the file is greater than target by too much!"; - ASSERT_LE(first_drop_, last_drop) - << " The first dropped frame for drop_thresh " << i - << " > first dropped frame for drop_thresh " - << i - kDropFrameThreshTestStep; - ASSERT_GE(num_drops_, last_num_drops * 0.85) - << " The number of dropped frames for drop_thresh " << i - << " < number of dropped frames for drop_thresh " - << i - kDropFrameThreshTestStep; - last_drop = first_drop_; - last_num_drops = num_drops_; - } -} - -AV1_INSTANTIATE_TEST_CASE(DatarateTestLarge, - ::testing::Values(::libaom_test::kOnePassGood, - ::libaom_test::kRealTime), - ::testing::Values(2, 5)); -} // namespace diff --git a/third_party/aom/test/decode_api_test.cc b/third_party/aom/test/decode_api_test.cc deleted file mode 100644 index c1beacee1..000000000 --- a/third_party/aom/test/decode_api_test.cc +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "test/util.h" -#include "aom/aomdx.h" -#include "aom/aom_decoder.h" - -namespace { - -TEST(DecodeAPI, InvalidParams) { - static const aom_codec_iface_t *kCodecs[] = { -#if CONFIG_AV1_DECODER - aom_codec_av1_dx(), -#endif - }; - uint8_t buf[1] = { 0 }; - aom_codec_ctx_t dec; - - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_dec_init(NULL, NULL, NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_dec_init(&dec, NULL, NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_decode(NULL, NULL, 0, NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_decode(NULL, buf, 0, NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_decode(NULL, buf, NELEMENTS(buf), NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_decode(NULL, NULL, NELEMENTS(buf), NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_destroy(NULL)); - EXPECT_TRUE(aom_codec_error(NULL) != NULL); - - for (int i = 0; i < NELEMENTS(kCodecs); ++i) { - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_dec_init(NULL, kCodecs[i], NULL, 0)); - - EXPECT_EQ(AOM_CODEC_OK, aom_codec_dec_init(&dec, kCodecs[i], NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_decode(&dec, NULL, NELEMENTS(buf), NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_decode(&dec, buf, 0, NULL)); - - EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&dec)); - } -} - -} // namespace diff --git a/third_party/aom/test/decode_multithreaded_test.cc b/third_party/aom/test/decode_multithreaded_test.cc deleted file mode 100644 index cea1d144f..000000000 --- a/third_party/aom/test/decode_multithreaded_test.cc +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdio> -#include <cstdlib> -#include <string> - -#include "aom_mem/aom_mem.h" -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/md5_helper.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -static const int kNumMultiThreadDecoders = 3; - -class AV1DecodeMultiThreadedTest - : public ::libaom_test::CodecTestWith5Params<int, int, int, int, int>, - public ::libaom_test::EncoderTest { - protected: - AV1DecodeMultiThreadedTest() - : EncoderTest(GET_PARAM(0)), md5_single_thread_(), md5_multi_thread_(), - n_tile_cols_(GET_PARAM(1)), n_tile_rows_(GET_PARAM(2)), - n_tile_groups_(GET_PARAM(3)), set_cpu_used_(GET_PARAM(4)), - row_mt_(GET_PARAM(5)) { - init_flags_ = AOM_CODEC_USE_PSNR; - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.w = 704; - cfg.h = 576; - cfg.threads = 1; - cfg.allow_lowbitdepth = 1; - single_thread_dec_ = codec_->CreateDecoder(cfg, 0); - - // Test cfg.threads == powers of 2. - for (int i = 0; i < kNumMultiThreadDecoders; ++i) { - cfg.threads <<= 1; - multi_thread_dec_[i] = codec_->CreateDecoder(cfg, 0); - multi_thread_dec_[i]->Control(AV1D_SET_ROW_MT, row_mt_); - } - - if (single_thread_dec_->IsAV1()) { - single_thread_dec_->Control(AV1D_EXT_TILE_DEBUG, 1); - single_thread_dec_->Control(AV1_SET_DECODE_TILE_ROW, -1); - single_thread_dec_->Control(AV1_SET_DECODE_TILE_COL, -1); - } - for (int i = 0; i < kNumMultiThreadDecoders; ++i) { - if (multi_thread_dec_[i]->IsAV1()) { - multi_thread_dec_[i]->Control(AV1D_EXT_TILE_DEBUG, 1); - multi_thread_dec_[i]->Control(AV1_SET_DECODE_TILE_ROW, -1); - multi_thread_dec_[i]->Control(AV1_SET_DECODE_TILE_COL, -1); - } - } - } - - virtual ~AV1DecodeMultiThreadedTest() { - delete single_thread_dec_; - for (int i = 0; i < kNumMultiThreadDecoders; ++i) - delete multi_thread_dec_[i]; - } - - virtual void SetUp() { - InitializeConfig(); - SetMode(libaom_test::kTwoPassGood); - } - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_TILE_COLUMNS, n_tile_cols_); - encoder->Control(AV1E_SET_TILE_ROWS, n_tile_rows_); - encoder->Control(AV1E_SET_NUM_TG, n_tile_groups_); - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - } - } - - void UpdateMD5(::libaom_test::Decoder *dec, const aom_codec_cx_pkt_t *pkt, - ::libaom_test::MD5 *md5) { - const aom_codec_err_t res = dec->DecodeFrame( - reinterpret_cast<uint8_t *>(pkt->data.frame.buf), pkt->data.frame.sz); - if (res != AOM_CODEC_OK) { - abort_ = true; - ASSERT_EQ(AOM_CODEC_OK, res); - } - const aom_image_t *img = dec->GetDxData().Next(); - md5->Add(img); - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - UpdateMD5(single_thread_dec_, pkt, &md5_single_thread_); - - for (int i = 0; i < kNumMultiThreadDecoders; ++i) - UpdateMD5(multi_thread_dec_[i], pkt, &md5_multi_thread_[i]); - } - - void DoTest() { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 500; - cfg_.g_lag_in_frames = 12; - cfg_.rc_end_usage = AOM_VBR; - - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 704, 576, - timebase.den, timebase.num, 0, 5); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - const char *md5_single_thread_str = md5_single_thread_.Get(); - - for (int i = 0; i < kNumMultiThreadDecoders; ++i) { - const char *md5_multi_thread_str = md5_multi_thread_[i].Get(); - ASSERT_STREQ(md5_single_thread_str, md5_multi_thread_str); - } - } - - ::libaom_test::MD5 md5_single_thread_; - ::libaom_test::MD5 md5_multi_thread_[kNumMultiThreadDecoders]; - ::libaom_test::Decoder *single_thread_dec_; - ::libaom_test::Decoder *multi_thread_dec_[kNumMultiThreadDecoders]; - - private: - int n_tile_cols_; - int n_tile_rows_; - int n_tile_groups_; - int set_cpu_used_; - int row_mt_; -}; - -// run an encode and do the decode both in single thread -// and multi thread. Ensure that the MD5 of the output in both cases -// is identical. If so, the test passes. -TEST_P(AV1DecodeMultiThreadedTest, MD5Match) { - cfg_.large_scale_tile = 0; - single_thread_dec_->Control(AV1_SET_TILE_MODE, 0); - for (int i = 0; i < kNumMultiThreadDecoders; ++i) - multi_thread_dec_[i]->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -class AV1DecodeMultiThreadedTestLarge : public AV1DecodeMultiThreadedTest {}; - -TEST_P(AV1DecodeMultiThreadedTestLarge, MD5Match) { - cfg_.large_scale_tile = 0; - single_thread_dec_->Control(AV1_SET_TILE_MODE, 0); - for (int i = 0; i < kNumMultiThreadDecoders; ++i) - multi_thread_dec_[i]->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -// TODO(ranjit): More tests have to be added using pre-generated MD5. -AV1_INSTANTIATE_TEST_CASE(AV1DecodeMultiThreadedTest, ::testing::Values(1, 2), - ::testing::Values(1, 2), ::testing::Values(1), - ::testing::Values(3), ::testing::Values(0, 1)); -AV1_INSTANTIATE_TEST_CASE(AV1DecodeMultiThreadedTestLarge, - ::testing::Values(0, 1, 2, 6), - ::testing::Values(0, 1, 2, 6), - ::testing::Values(1, 4), ::testing::Values(0), - ::testing::Values(0, 1)); - -class AV1DecodeMultiThreadedLSTestLarge - : public AV1DecodeMultiThreadedTestLarge {}; - -TEST_P(AV1DecodeMultiThreadedLSTestLarge, MD5Match) { - cfg_.large_scale_tile = 1; - single_thread_dec_->Control(AV1_SET_TILE_MODE, 1); - for (int i = 0; i < kNumMultiThreadDecoders; ++i) - multi_thread_dec_[i]->Control(AV1_SET_TILE_MODE, 1); - DoTest(); -} - -AV1_INSTANTIATE_TEST_CASE(AV1DecodeMultiThreadedLSTestLarge, - ::testing::Values(6), ::testing::Values(6), - ::testing::Values(1), ::testing::Values(0, 3), - ::testing::Values(0, 1)); - -} // namespace diff --git a/third_party/aom/test/decode_perf_test.cc b/third_party/aom/test/decode_perf_test.cc deleted file mode 100644 index bb7b00032..000000000 --- a/third_party/aom/test/decode_perf_test.cc +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> - -#include "config/aom_version.h" - -#include "aom_ports/aom_timer.h" -#include "common/ivfenc.h" -#include "test/codec_factory.h" -#include "test/decode_test_driver.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/ivf_video_source.h" -#include "test/md5_helper.h" -#include "test/util.h" -#include "test/webm_video_source.h" - -using ::testing::make_tuple; - -namespace { - -#define VIDEO_NAME 0 -#define THREADS 1 - -const double kUsecsInSec = 1000000.0; -const char kNewEncodeOutputFile[] = "new_encode.ivf"; - -/* - DecodePerfTest takes a tuple of filename + number of threads to decode with - */ -typedef ::testing::tuple<const char *, unsigned> DecodePerfParam; - -// TODO(jimbankoski): Add actual test vectors here when available. -// const DecodePerfParam kAV1DecodePerfVectors[] = {}; - -/* - In order to reflect real world performance as much as possible, Perf tests - *DO NOT* do any correctness checks. Please run them alongside correctness - tests to ensure proper codec integrity. Furthermore, in this test we - deliberately limit the amount of system calls we make to avoid OS - preemption. - - TODO(joshualitt) create a more detailed perf measurement test to collect - power/temp/min max frame decode times/etc - */ - -class DecodePerfTest : public ::testing::TestWithParam<DecodePerfParam> {}; - -TEST_P(DecodePerfTest, PerfTest) { - const char *const video_name = GET_PARAM(VIDEO_NAME); - const unsigned threads = GET_PARAM(THREADS); - - libaom_test::WebMVideoSource video(video_name); - video.Init(); - - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.threads = threads; - cfg.allow_lowbitdepth = 1; - libaom_test::AV1Decoder decoder(cfg, 0); - - aom_usec_timer t; - aom_usec_timer_start(&t); - - for (video.Begin(); video.cxdata() != NULL; video.Next()) { - decoder.DecodeFrame(video.cxdata(), video.frame_size()); - } - - aom_usec_timer_mark(&t); - const double elapsed_secs = double(aom_usec_timer_elapsed(&t)) / kUsecsInSec; - const unsigned frames = video.frame_number(); - const double fps = double(frames) / elapsed_secs; - - printf("{\n"); - printf("\t\"type\" : \"decode_perf_test\",\n"); - printf("\t\"version\" : \"%s\",\n", VERSION_STRING_NOSP); - printf("\t\"videoName\" : \"%s\",\n", video_name); - printf("\t\"threadCount\" : %u,\n", threads); - printf("\t\"decodeTimeSecs\" : %f,\n", elapsed_secs); - printf("\t\"totalFrames\" : %u,\n", frames); - printf("\t\"framesPerSecond\" : %f\n", fps); - printf("}\n"); -} - -// TODO(jimbankoski): Enabled when we have actual AV1 Decode vectors. -// INSTANTIATE_TEST_CASE_P(AV1, DecodePerfTest, -// ::testing::ValuesIn(kAV1DecodePerfVectors)); - -class AV1NewEncodeDecodePerfTest - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - AV1NewEncodeDecodePerfTest() - : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), speed_(0), - outfile_(0), out_frames_(0) {} - - virtual ~AV1NewEncodeDecodePerfTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - - cfg_.g_lag_in_frames = 25; - cfg_.rc_min_quantizer = 2; - cfg_.rc_max_quantizer = 56; - cfg_.rc_dropframe_thresh = 0; - cfg_.rc_undershoot_pct = 50; - cfg_.rc_overshoot_pct = 50; - cfg_.rc_buf_sz = 1000; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - cfg_.rc_end_usage = AOM_VBR; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, speed_); - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AV1E_SET_TILE_COLUMNS, 2); - } - } - - virtual void BeginPassHook(unsigned int /*pass*/) { - const char *const env = getenv("LIBAOM_TEST_DATA_PATH"); - const std::string data_path(env ? env : "."); - const std::string path_to_source = data_path + "/" + kNewEncodeOutputFile; - outfile_ = fopen(path_to_source.c_str(), "wb"); - ASSERT_TRUE(outfile_ != NULL); - } - - virtual void EndPassHook() { - if (outfile_ != NULL) { - if (!fseek(outfile_, 0, SEEK_SET)) - ivf_write_file_header(outfile_, &cfg_, AV1_FOURCC, out_frames_); - fclose(outfile_); - outfile_ = NULL; - } - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - ++out_frames_; - - // Write initial file header if first frame. - if (pkt->data.frame.pts == 0) - ivf_write_file_header(outfile_, &cfg_, AV1_FOURCC, out_frames_); - - // Write frame header and data. - ivf_write_frame_header(outfile_, out_frames_, pkt->data.frame.sz); - ASSERT_EQ(fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_), - pkt->data.frame.sz); - } - - virtual bool DoDecode() const { return false; } - - void set_speed(unsigned int speed) { speed_ = speed; } - - private: - libaom_test::TestMode encoding_mode_; - uint32_t speed_; - FILE *outfile_; - uint32_t out_frames_; -}; - -struct EncodePerfTestVideo { - EncodePerfTestVideo(const char *name_, uint32_t width_, uint32_t height_, - uint32_t bitrate_, int frames_) - : name(name_), width(width_), height(height_), bitrate(bitrate_), - frames(frames_) {} - const char *name; - uint32_t width; - uint32_t height; - uint32_t bitrate; - int frames; -}; - -const EncodePerfTestVideo kAV1EncodePerfTestVectors[] = { - EncodePerfTestVideo("niklas_1280_720_30.yuv", 1280, 720, 600, 470), -}; - -TEST_P(AV1NewEncodeDecodePerfTest, PerfTest) { - SetUp(); - - // TODO(JBB): Make this work by going through the set of given files. - const int i = 0; - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = kAV1EncodePerfTestVectors[i].bitrate; - - init_flags_ = AOM_CODEC_USE_PSNR; - - const char *video_name = kAV1EncodePerfTestVectors[i].name; - libaom_test::I420VideoSource video( - video_name, kAV1EncodePerfTestVectors[i].width, - kAV1EncodePerfTestVectors[i].height, timebase.den, timebase.num, 0, - kAV1EncodePerfTestVectors[i].frames); - set_speed(2); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - const uint32_t threads = 4; - - libaom_test::IVFVideoSource decode_video(kNewEncodeOutputFile); - decode_video.Init(); - - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.threads = threads; - cfg.allow_lowbitdepth = 1; - libaom_test::AV1Decoder decoder(cfg, 0); - - aom_usec_timer t; - aom_usec_timer_start(&t); - - for (decode_video.Begin(); decode_video.cxdata() != NULL; - decode_video.Next()) { - decoder.DecodeFrame(decode_video.cxdata(), decode_video.frame_size()); - } - - aom_usec_timer_mark(&t); - const double elapsed_secs = - static_cast<double>(aom_usec_timer_elapsed(&t)) / kUsecsInSec; - const unsigned decode_frames = decode_video.frame_number(); - const double fps = static_cast<double>(decode_frames) / elapsed_secs; - - printf("{\n"); - printf("\t\"type\" : \"decode_perf_test\",\n"); - printf("\t\"version\" : \"%s\",\n", VERSION_STRING_NOSP); - printf("\t\"videoName\" : \"%s\",\n", kNewEncodeOutputFile); - printf("\t\"threadCount\" : %u,\n", threads); - printf("\t\"decodeTimeSecs\" : %f,\n", elapsed_secs); - printf("\t\"totalFrames\" : %u,\n", decode_frames); - printf("\t\"framesPerSecond\" : %f\n", fps); - printf("}\n"); -} - -AV1_INSTANTIATE_TEST_CASE(AV1NewEncodeDecodePerfTest, - ::testing::Values(::libaom_test::kTwoPassGood)); -} // namespace diff --git a/third_party/aom/test/decode_test_driver.cc b/third_party/aom/test/decode_test_driver.cc deleted file mode 100644 index 70de0cff6..000000000 --- a/third_party/aom/test/decode_test_driver.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/codec_factory.h" -#include "test/decode_test_driver.h" -#include "test/register_state_check.h" -#include "test/video_source.h" - -namespace libaom_test { - -const char kAV1Name[] = "AOMedia Project AV1 Decoder"; - -aom_codec_err_t Decoder::PeekStream(const uint8_t *cxdata, size_t size, - aom_codec_stream_info_t *stream_info) { - return aom_codec_peek_stream_info(CodecInterface(), cxdata, size, - stream_info); -} - -aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) { - return DecodeFrame(cxdata, size, NULL); -} - -aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size, - void *user_priv) { - aom_codec_err_t res_dec; - InitOnce(); - API_REGISTER_STATE_CHECK( - res_dec = aom_codec_decode(&decoder_, cxdata, size, user_priv)); - return res_dec; -} - -bool Decoder::IsAV1() const { - const char *codec_name = GetDecoderName(); - return strncmp(kAV1Name, codec_name, sizeof(kAV1Name) - 1) == 0; -} - -void DecoderTest::HandlePeekResult(Decoder *const /*decoder*/, - CompressedVideoSource * /*video*/, - const aom_codec_err_t res_peek) { - /* The Av1 implementation of PeekStream returns an error only if the - * data passed to it isn't a valid Av1 chunk. */ - ASSERT_EQ(AOM_CODEC_OK, res_peek) - << "Peek return failed: " << aom_codec_err_to_string(res_peek); -} - -void DecoderTest::RunLoop(CompressedVideoSource *video, - const aom_codec_dec_cfg_t &dec_cfg) { - Decoder *const decoder = codec_->CreateDecoder(dec_cfg, flags_); - ASSERT_TRUE(decoder != NULL); - bool end_of_file = false; - bool peeked_stream = false; - - // Decode frames. - for (video->Begin(); !::testing::Test::HasFailure() && !end_of_file; - video->Next()) { - PreDecodeFrameHook(*video, decoder); - - aom_codec_stream_info_t stream_info; - stream_info.is_annexb = 0; - - if (video->cxdata() != NULL) { - if (!peeked_stream) { - // TODO(yaowu): PeekStream returns error for non-sequence_header_obu, - // therefore should only be tried once per sequence, this shall be fixed - // once PeekStream is updated to properly operate on other obus. - const aom_codec_err_t res_peek = decoder->PeekStream( - video->cxdata(), video->frame_size(), &stream_info); - HandlePeekResult(decoder, video, res_peek); - ASSERT_FALSE(::testing::Test::HasFailure()); - peeked_stream = true; - } - - aom_codec_err_t res_dec = - decoder->DecodeFrame(video->cxdata(), video->frame_size()); - if (!HandleDecodeResult(res_dec, *video, decoder)) break; - } else { - // Signal end of the file to the decoder. - const aom_codec_err_t res_dec = decoder->DecodeFrame(NULL, 0); - ASSERT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); - end_of_file = true; - } - - DxDataIterator dec_iter = decoder->GetDxData(); - const aom_image_t *img = NULL; - - // Get decompressed data - while (!::testing::Test::HasFailure() && (img = dec_iter.Next())) - DecompressedFrameHook(*img, video->frame_number()); - } - delete decoder; -} - -void DecoderTest::RunLoop(CompressedVideoSource *video) { - aom_codec_dec_cfg_t dec_cfg = aom_codec_dec_cfg_t(); - RunLoop(video, dec_cfg); -} - -void DecoderTest::set_cfg(const aom_codec_dec_cfg_t &dec_cfg) { - memcpy(&cfg_, &dec_cfg, sizeof(cfg_)); -} - -void DecoderTest::set_flags(const aom_codec_flags_t flags) { flags_ = flags; } - -} // namespace libaom_test diff --git a/third_party/aom/test/decode_test_driver.h b/third_party/aom/test/decode_test_driver.h deleted file mode 100644 index d13e13ea1..000000000 --- a/third_party/aom/test/decode_test_driver.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_DECODE_TEST_DRIVER_H_ -#define AOM_TEST_DECODE_TEST_DRIVER_H_ -#include <cstring> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "aom/aom_decoder.h" - -namespace libaom_test { - -class CodecFactory; -class CompressedVideoSource; - -// Provides an object to handle decoding output -class DxDataIterator { - public: - explicit DxDataIterator(aom_codec_ctx_t *decoder) - : decoder_(decoder), iter_(NULL) {} - - const aom_image_t *Next() { return aom_codec_get_frame(decoder_, &iter_); } - - private: - aom_codec_ctx_t *decoder_; - aom_codec_iter_t iter_; -}; - -// Provides a simplified interface to manage one video decoding. -// Similar to Encoder class, the exact services should be added -// as more tests are added. -class Decoder { - public: - explicit Decoder(aom_codec_dec_cfg_t cfg) - : cfg_(cfg), flags_(0), init_done_(false) { - memset(&decoder_, 0, sizeof(decoder_)); - } - - Decoder(aom_codec_dec_cfg_t cfg, const aom_codec_flags_t flag) - : cfg_(cfg), flags_(flag), init_done_(false) { - memset(&decoder_, 0, sizeof(decoder_)); - } - - virtual ~Decoder() { aom_codec_destroy(&decoder_); } - - aom_codec_err_t PeekStream(const uint8_t *cxdata, size_t size, - aom_codec_stream_info_t *stream_info); - - aom_codec_err_t DecodeFrame(const uint8_t *cxdata, size_t size); - - aom_codec_err_t DecodeFrame(const uint8_t *cxdata, size_t size, - void *user_priv); - - DxDataIterator GetDxData() { return DxDataIterator(&decoder_); } - - void Control(int ctrl_id, int arg) { Control(ctrl_id, arg, AOM_CODEC_OK); } - - void Control(int ctrl_id, const void *arg) { - InitOnce(); - const aom_codec_err_t res = aom_codec_control_(&decoder_, ctrl_id, arg); - ASSERT_EQ(AOM_CODEC_OK, res) << DecodeError(); - } - - void Control(int ctrl_id, int arg, aom_codec_err_t expected_value) { - InitOnce(); - const aom_codec_err_t res = aom_codec_control_(&decoder_, ctrl_id, arg); - ASSERT_EQ(expected_value, res) << DecodeError(); - } - - const char *DecodeError() { - const char *detail = aom_codec_error_detail(&decoder_); - return detail ? detail : aom_codec_error(&decoder_); - } - - // Passes the external frame buffer information to libaom. - aom_codec_err_t SetFrameBufferFunctions( - aom_get_frame_buffer_cb_fn_t cb_get, - aom_release_frame_buffer_cb_fn_t cb_release, void *user_priv) { - InitOnce(); - return aom_codec_set_frame_buffer_functions(&decoder_, cb_get, cb_release, - user_priv); - } - - const char *GetDecoderName() const { - return aom_codec_iface_name(CodecInterface()); - } - - bool IsAV1() const; - - aom_codec_ctx_t *GetDecoder() { return &decoder_; } - - protected: - virtual aom_codec_iface_t *CodecInterface() const = 0; - - void InitOnce() { - if (!init_done_) { - const aom_codec_err_t res = - aom_codec_dec_init(&decoder_, CodecInterface(), &cfg_, flags_); - ASSERT_EQ(AOM_CODEC_OK, res) << DecodeError(); - init_done_ = true; - } - } - - aom_codec_ctx_t decoder_; - aom_codec_dec_cfg_t cfg_; - aom_codec_flags_t flags_; - bool init_done_; -}; - -// Common test functionality for all Decoder tests. -class DecoderTest { - public: - // Main decoding loop - virtual void RunLoop(CompressedVideoSource *video); - virtual void RunLoop(CompressedVideoSource *video, - const aom_codec_dec_cfg_t &dec_cfg); - - virtual void set_cfg(const aom_codec_dec_cfg_t &dec_cfg); - virtual void set_flags(const aom_codec_flags_t flags); - - // Hook to be called before decompressing every frame. - virtual void PreDecodeFrameHook(const CompressedVideoSource & /*video*/, - Decoder * /*decoder*/) {} - - // Hook to be called to handle decode result. Return true to continue. - virtual bool HandleDecodeResult(const aom_codec_err_t res_dec, - const CompressedVideoSource & /*video*/, - Decoder *decoder) { - EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); - return AOM_CODEC_OK == res_dec; - } - - // Hook to be called on every decompressed frame. - virtual void DecompressedFrameHook(const aom_image_t & /*img*/, - const unsigned int /*frame_number*/) {} - - // Hook to be called on peek result - virtual void HandlePeekResult(Decoder *const decoder, - CompressedVideoSource *video, - const aom_codec_err_t res_peek); - - protected: - explicit DecoderTest(const CodecFactory *codec) - : codec_(codec), cfg_(), flags_(0) {} - - virtual ~DecoderTest() {} - - const CodecFactory *codec_; - aom_codec_dec_cfg_t cfg_; - aom_codec_flags_t flags_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_DECODE_TEST_DRIVER_H_ diff --git a/third_party/aom/test/decode_to_md5.sh b/third_party/aom/test/decode_to_md5.sh deleted file mode 100755 index 2edd1cb52..000000000 --- a/third_party/aom/test/decode_to_md5.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom decode_to_md5 example. To add new tests to this -## file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to decode_to_md5_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: Make sure input is available: -# $AV1_IVF_FILE is required. -decode_to_md5_verify_environment() { - if [ "$(av1_encode_available)" != "yes" ] && [ ! -e "${AV1_IVF_FILE}" ]; then - return 1 - fi -} - -# Runs decode_to_md5 on $1 and captures the md5 sum for the final frame. $2 is -# interpreted as codec name and used solely to name the output file. $3 is the -# expected md5 sum: It must match that of the final frame. -decode_to_md5() { - local decoder="$(aom_tool_path decode_to_md5)" - local input_file="$1" - local codec="$2" - local expected_md5="$3" - local output_file="${AOM_TEST_OUTPUT_DIR}/decode_to_md5_${codec}" - - if [ ! -x "${decoder}" ]; then - elog "${decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ - ${devnull} - - [ -e "${output_file}" ] || return 1 - - local md5_last_frame="$(tail -n1 "${output_file}" | awk '{print $1}')" - local actual_md5="$(echo "${md5_last_frame}" | awk '{print $1}')" - if [ "${actual_md5}" = "${expected_md5}" ]; then - return 0 - else - elog "MD5 mismatch:" - elog "Expected: ${expected_md5}" - elog "Actual: ${actual_md5}" - return 1 - fi -} - -DISABLED_decode_to_md5_av1() { - # expected MD5 sum for the last frame. - local expected_md5="567dd6d4b7a7170edddbf58bbcc3aff1" - local file="${AV1_IVF_FILE}" - - # TODO(urvang): Check in the encoded file (like libvpx does) to avoid - # encoding every time. - if [ "$(av1_decode_available)" = "yes" ]; then - if [ ! -e "${AV1_IVF_FILE}" ]; then - file="${AOM_TEST_OUTPUT_DIR}/test_encode.ivf" - encode_yuv_raw_input_av1 "${file}" --ivf - fi - decode_to_md5 "${file}" "av1" "${expected_md5}" - fi -} - -# TODO(tomfinegan): Enable when the bitstream stabilizes. -decode_to_md5_tests="DISABLED_decode_to_md5_av1" - -run_tests decode_to_md5_verify_environment "${decode_to_md5_tests}" diff --git a/third_party/aom/test/decode_with_drops.sh b/third_party/aom/test/decode_with_drops.sh deleted file mode 100755 index 155ee9207..000000000 --- a/third_party/aom/test/decode_with_drops.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom decode_with_drops example. To add new tests to -## this file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to decode_with_drops_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: Make sure input is available: -# $AV1_IVF_FILE is required. -decode_with_drops_verify_environment() { - if [ "$(av1_encode_available)" != "yes" ] && [ ! -e "${AV1_IVF_FILE}" ]; then - return 1 - fi -} - -# Runs decode_with_drops on $1, $2 is interpreted as codec name and used solely -# to name the output file. $3 is the drop mode, and is passed directly to -# decode_with_drops. -decode_with_drops() { - local decoder="$(aom_tool_path decode_with_drops)" - local input_file="$1" - local codec="$2" - local output_file="${AOM_TEST_OUTPUT_DIR}/decode_with_drops_${codec}" - local drop_mode="$3" - - if [ ! -x "${decoder}" ]; then - elog "${decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ - "${drop_mode}" ${devnull} - - [ -e "${output_file}" ] || return 1 -} - - -# Decodes $AV1_IVF_FILE while dropping frames, twice: once in sequence mode, -# and once in pattern mode. -DISABLED_decode_with_drops_av1() { - if [ "$(av1_decode_available)" = "yes" ]; then - local file="${AV1_IVF_FILE}" - if [ ! -e "${AV1_IVF_FILE}" ]; then - file="${AOM_TEST_OUTPUT_DIR}/test_encode.ivf" - encode_yuv_raw_input_av1 "${file}" --ivf - fi - # Drop frames 3 and 4. - decode_with_drops "${file}" "av1" "3-4" - - # Test pattern mode: Drop 3 of every 4 frames. - decode_with_drops "${file}" "av1" "3/4" - fi -} - -# TODO(yaowu): Disable this test as trailing_bit check is expected to fail -decode_with_drops_tests="DISABLED_decode_with_drops_av1" - -run_tests decode_with_drops_verify_environment "${decode_with_drops_tests}" diff --git a/third_party/aom/test/divu_small_test.cc b/third_party/aom/test/divu_small_test.cc deleted file mode 100644 index 064f8ee45..000000000 --- a/third_party/aom/test/divu_small_test.cc +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <stdlib.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/acm_random.h" -#include "av1/common/odintrin.h" - -using libaom_test::ACMRandom; - -TEST(Daala, TestDIVUuptoMAX) { - for (int d = 1; d <= OD_DIVU_DMAX; d++) { - for (uint32_t x = 1; x <= 1000000; x++) { - GTEST_ASSERT_EQ(x / d, OD_DIVU_SMALL(x, d)) - << "x=" << x << " d=" << d << " x/d=" << (x / d) - << " != " << OD_DIVU_SMALL(x, d); - } - } -} - -TEST(Daala, TestDIVUrandI31) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int d = 1; d < OD_DIVU_DMAX; d++) { - for (int i = 0; i < 1000000; i++) { - uint32_t x = rnd.Rand31(); - GTEST_ASSERT_EQ(x / d, OD_DIVU_SMALL(x, d)) - << "x=" << x << " d=" << d << " x/d=" << (x / d) - << " != " << OD_DIVU_SMALL(x, d); - } - } -} diff --git a/third_party/aom/test/dr_prediction_test.cc b/third_party/aom/test/dr_prediction_test.cc deleted file mode 100644 index ff2c1de4e..000000000 --- a/third_party/aom/test/dr_prediction_test.cc +++ /dev/null @@ -1,369 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom_mem/aom_mem.h" -#include "aom_ports/aom_timer.h" -#include "av1/common/blockd.h" -#include "av1/common/pred_common.h" -#include "av1/common/reconintra.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -namespace { - -const int kZ1Start = 0; -const int kZ2Start = 90; -const int kZ3Start = 180; - -const TX_SIZE kTxSize[] = { TX_4X4, TX_8X8, TX_16X16, TX_32X32, TX_64X64, - TX_4X8, TX_8X4, TX_8X16, TX_16X8, TX_16X32, - TX_32X16, TX_32X64, TX_64X32, TX_4X16, TX_16X4, - TX_8X32, TX_32X8, TX_16X64, TX_64X16 }; - -const char *const kTxSizeStrings[] = { - "TX_4X4", "TX_8X8", "TX_16X16", "TX_32X32", "TX_64X64", - "TX_4X8", "TX_8X4", "TX_8X16", "TX_16X8", "TX_16X32", - "TX_32X16", "TX_32X64", "TX_64X32", "TX_4X16", "TX_16X4", - "TX_8X32", "TX_32X8", "TX_16X64", "TX_64X16" -}; - -using libaom_test::ACMRandom; - -typedef void (*DrPred_Hbd)(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_above, int upsample_left, int dx, - int dy, int bd); - -typedef void (*DrPred)(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, - int upsample_above, int upsample_left, int dx, int dy, - int bd); - -typedef void (*Z1_Lbd)(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, - int upsample_above, int dx, int dy); -template <Z1_Lbd fn> -void z1_wrapper(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, int upsample_above, - int /*upsample_left*/, int dx, int dy, int /*bd*/) { - fn(dst, stride, bw, bh, above, left, upsample_above, dx, dy); -} - -typedef void (*Z2_Lbd)(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, - int upsample_above, int upsample_left, int dx, int dy); -template <Z2_Lbd fn> -void z2_wrapper(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, int upsample_above, - int upsample_left, int dx, int dy, int /*bd*/) { - fn(dst, stride, bw, bh, above, left, upsample_above, upsample_left, dx, dy); -} - -typedef void (*Z3_Lbd)(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, - int upsample_left, int dx, int dy); -template <Z3_Lbd fn> -void z3_wrapper(uint8_t *dst, ptrdiff_t stride, int bw, int bh, - const uint8_t *above, const uint8_t *left, - int /*upsample_above*/, int upsample_left, int dx, int dy, - int /*bd*/) { - fn(dst, stride, bw, bh, above, left, upsample_left, dx, dy); -} - -typedef void (*Z1_Hbd)(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_above, int dx, int dy, int bd); -template <Z1_Hbd fn> -void z1_wrapper_hbd(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_above, int /*upsample_left*/, int dx, int dy, - int bd) { - fn(dst, stride, bw, bh, above, left, upsample_above, dx, dy, bd); -} - -typedef void (*Z2_Hbd)(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_above, int upsample_left, int dx, int dy, - int bd); -template <Z2_Hbd fn> -void z2_wrapper_hbd(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_above, int upsample_left, int dx, int dy, - int bd) { - fn(dst, stride, bw, bh, above, left, upsample_above, upsample_left, dx, dy, - bd); -} - -typedef void (*Z3_Hbd)(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int upsample_left, int dx, int dy, int bd); -template <Z3_Hbd fn> -void z3_wrapper_hbd(uint16_t *dst, ptrdiff_t stride, int bw, int bh, - const uint16_t *above, const uint16_t *left, - int /*upsample_above*/, int upsample_left, int dx, int dy, - int bd) { - fn(dst, stride, bw, bh, above, left, upsample_left, dx, dy, bd); -} - -template <typename FuncType> -struct DrPredFunc { - DrPredFunc(FuncType pred = NULL, FuncType tst = NULL, int bit_depth_value = 0, - int start_angle_value = 0) - : ref_fn(pred), tst_fn(tst), bit_depth(bit_depth_value), - start_angle(start_angle_value) {} - - FuncType ref_fn; - FuncType tst_fn; - int bit_depth; - int start_angle; -}; - -template <typename Pixel, typename FuncType> -class DrPredTest : public ::testing::TestWithParam<DrPredFunc<FuncType> > { - protected: - static const int kMaxNumTests = 100000; - static const int kIterations = 10; - static const int kDstStride = 64; - static const int kDstSize = kDstStride * kDstStride; - static const int kOffset = 16; - static const int kBufSize = ((2 * MAX_TX_SIZE) << 1) + 16; - - DrPredTest() - : enable_upsample_(0), upsample_above_(0), upsample_left_(0), bw_(0), - bh_(0), dx_(1), dy_(1), bd_(8), txsize_(TX_4X4) { - params_ = this->GetParam(); - start_angle_ = params_.start_angle; - stop_angle_ = start_angle_ + 90; - - dst_ref_ = &dst_ref_data_[0]; - dst_tst_ = &dst_tst_data_[0]; - dst_stride_ = kDstStride; - above_ = &above_data_[kOffset]; - left_ = &left_data_[kOffset]; - - for (int i = 0; i < kBufSize; ++i) { - above_data_[i] = rng_.Rand8(); - left_data_[i] = rng_.Rand8(); - } - - for (int i = 0; i < kDstSize; ++i) { - dst_ref_[i] = 0; - } - } - - virtual ~DrPredTest() {} - - void Predict(bool speedtest, int tx) { - const int kNumTests = speedtest ? kMaxNumTests : 1; - aom_usec_timer timer; - - aom_usec_timer_start(&timer); - for (int k = 0; k < kNumTests; ++k) { - params_.ref_fn(dst_ref_, dst_stride_, bw_, bh_, above_, left_, - upsample_above_, upsample_left_, dx_, dy_, bd_); - } - aom_usec_timer_mark(&timer); - const int ref_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - - aom_usec_timer_start(&timer); - if (params_.tst_fn) { - for (int k = 0; k < kNumTests; ++k) { - ASM_REGISTER_STATE_CHECK(params_.tst_fn(dst_tst_, dst_stride_, bw_, bh_, - above_, left_, upsample_above_, - upsample_left_, dx_, dy_, bd_)); - } - } - aom_usec_timer_mark(&timer); - const int tst_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - - OutputTimes(kNumTests, ref_time, tst_time, tx); - } - - void RunTest(bool speedtest, int p_angle) { - for (int i = 0; i < kBufSize; ++i) { - above_data_[i] = left_data_[i] = (1 << bd_) - 1; - } - - for (int tx = 0; tx < TX_SIZES_ALL; ++tx) { - if (params_.tst_fn == NULL) { - for (int i = 0; i < kDstSize; ++i) { - dst_tst_[i] = (1 << bd_) - 1; - } - } else { - for (int i = 0; i < kDstSize; ++i) { - dst_tst_[i] = 0; - } - } - - bw_ = tx_size_wide[kTxSize[tx]]; - bh_ = tx_size_high[kTxSize[tx]]; - - if (enable_upsample_) { - upsample_above_ = - av1_use_intra_edge_upsample(bw_, bh_, p_angle - 90, 0); - upsample_left_ = - av1_use_intra_edge_upsample(bw_, bh_, p_angle - 180, 0); - } else { - upsample_above_ = upsample_left_ = 0; - } - - Predict(speedtest, tx); - - for (int r = 0; r < bh_; ++r) { - for (int c = 0; c < bw_; ++c) { - ASSERT_EQ(dst_ref_[r * dst_stride_ + c], - dst_tst_[r * dst_stride_ + c]) - << bw_ << "x" << bh_ << " r: " << r << " c: " << c - << " dx: " << dx_ << " dy: " << dy_ - << " upsample_above: " << upsample_above_ - << " upsample_left: " << upsample_left_; - } - } - } - } - - void OutputTimes(int num_tests, int ref_time, int tst_time, int tx) { - if (num_tests > 1) { - if (params_.tst_fn) { - const float x = static_cast<float>(ref_time) / tst_time; - printf("\t[%8s] :: ref time %6d, tst time %6d %3.2f\n", - kTxSizeStrings[tx], ref_time, tst_time, x); - } else { - printf("\t[%8s] :: ref time %6d\n", kTxSizeStrings[tx], ref_time); - } - } - } - - Pixel dst_ref_data_[kDstSize]; - Pixel dst_tst_data_[kDstSize]; - - Pixel left_data_[kBufSize]; - Pixel dummy_data_[kBufSize]; - Pixel above_data_[kBufSize]; - - Pixel *dst_ref_; - Pixel *dst_tst_; - Pixel *above_; - Pixel *left_; - int dst_stride_; - - int enable_upsample_; - int upsample_above_; - int upsample_left_; - int bw_; - int bh_; - int dx_; - int dy_; - int bd_; - TX_SIZE txsize_; - - int start_angle_; - int stop_angle_; - - ACMRandom rng_; - - DrPredFunc<FuncType> params_; -}; - -class LowbdDrPredTest : public DrPredTest<uint8_t, DrPred> {}; - -TEST_P(LowbdDrPredTest, SaturatedValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - enable_upsample_ = iter & 1; - for (int angle = start_angle_; angle < stop_angle_; ++angle) { - dx_ = av1_get_dx(angle); - dy_ = av1_get_dy(angle); - if (dx_ && dy_) RunTest(false, angle); - } - } -} - -TEST_P(LowbdDrPredTest, DISABLED_Speed) { - const int angles[] = { 3, 45, 87 }; - for (enable_upsample_ = 0; enable_upsample_ < 2; ++enable_upsample_) { - for (int i = 0; i < 3; ++i) { - const int angle = angles[i] + start_angle_; - dx_ = av1_get_dx(angle); - dy_ = av1_get_dy(angle); - printf("enable_upsample: %d angle: %d ~~~~~~~~~~~~~~~\n", - enable_upsample_, angle); - if (dx_ && dy_) RunTest(true, angle); - } - } -} - -using ::testing::make_tuple; - -INSTANTIATE_TEST_CASE_P( - C, LowbdDrPredTest, - ::testing::Values(DrPredFunc<DrPred>(&z1_wrapper<av1_dr_prediction_z1_c>, - NULL, AOM_BITS_8, kZ1Start), - DrPredFunc<DrPred>(&z2_wrapper<av1_dr_prediction_z2_c>, - NULL, AOM_BITS_8, kZ2Start), - DrPredFunc<DrPred>(&z3_wrapper<av1_dr_prediction_z3_c>, - NULL, AOM_BITS_8, kZ3Start))); - -class HighbdDrPredTest : public DrPredTest<uint16_t, DrPred_Hbd> {}; - -TEST_P(HighbdDrPredTest, SaturatedValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - enable_upsample_ = iter & 1; - for (int angle = start_angle_; angle < stop_angle_; ++angle) { - dx_ = av1_get_dx(angle); - dy_ = av1_get_dy(angle); - if (dx_ && dy_) RunTest(false, angle); - } - } -} - -TEST_P(HighbdDrPredTest, DISABLED_Speed) { - const int angles[] = { 3, 45, 87 }; - for (enable_upsample_ = 0; enable_upsample_ < 2; ++enable_upsample_) { - for (int i = 0; i < 3; ++i) { - const int angle = angles[i] + start_angle_; - dx_ = av1_get_dx(angle); - dy_ = av1_get_dy(angle); - printf("enable_upsample: %d angle: %d ~~~~~~~~~~~~~~~\n", - enable_upsample_, angle); - if (dx_ && dy_) RunTest(true, angle); - } - } -} - -INSTANTIATE_TEST_CASE_P( - C, HighbdDrPredTest, - ::testing::Values( - DrPredFunc<DrPred_Hbd>(&z1_wrapper_hbd<av1_highbd_dr_prediction_z1_c>, - NULL, AOM_BITS_8, kZ1Start), - DrPredFunc<DrPred_Hbd>(&z1_wrapper_hbd<av1_highbd_dr_prediction_z1_c>, - NULL, AOM_BITS_10, kZ1Start), - DrPredFunc<DrPred_Hbd>(&z1_wrapper_hbd<av1_highbd_dr_prediction_z1_c>, - NULL, AOM_BITS_12, kZ1Start), - DrPredFunc<DrPred_Hbd>(&z2_wrapper_hbd<av1_highbd_dr_prediction_z2_c>, - NULL, AOM_BITS_8, kZ2Start), - DrPredFunc<DrPred_Hbd>(&z2_wrapper_hbd<av1_highbd_dr_prediction_z2_c>, - NULL, AOM_BITS_10, kZ2Start), - DrPredFunc<DrPred_Hbd>(&z2_wrapper_hbd<av1_highbd_dr_prediction_z2_c>, - NULL, AOM_BITS_12, kZ2Start), - DrPredFunc<DrPred_Hbd>(&z3_wrapper_hbd<av1_highbd_dr_prediction_z3_c>, - NULL, AOM_BITS_8, kZ3Start), - DrPredFunc<DrPred_Hbd>(&z3_wrapper_hbd<av1_highbd_dr_prediction_z3_c>, - NULL, AOM_BITS_10, kZ3Start), - DrPredFunc<DrPred_Hbd>(&z3_wrapper_hbd<av1_highbd_dr_prediction_z3_c>, - NULL, AOM_BITS_12, kZ3Start))); - -} // namespace diff --git a/third_party/aom/test/dump_obu.sh b/third_party/aom/test/dump_obu.sh deleted file mode 100755 index da44dd7e6..000000000 --- a/third_party/aom/test/dump_obu.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/sh -## Copyright (c) 2018, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom dump_obu tool. To add new tests to this -## file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to dump_obu_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -readonly dump_obu_test_file="${AOM_TEST_OUTPUT_DIR}/av1_obu_test.ivf" - -dump_obu_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - elog "The file ${YUV_RAW_INPUT##*/} must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi - if [ "$(dump_obu_available)" = "yes" ]; then - if [ -z "$(aom_tool_path dump_obu)" ]; then - elog "dump_obu not found in LIBAOM_BIN_PATH, its parent, or child tools/." - fi - fi -} - -dump_obu_available() { - if [ "$(av1_decode_available)" = "yes" ] && \ - [ "$(av1_encode_available)" = "yes" ]; then - echo yes - fi -} - -aomenc_available() { - if [ -x "$(aom_tool_path aomenc)" ]; then - echo yes - fi -} - -encode_test_file() { - if [ "$(aomenc_available)" = "yes" ]; then - local encoder="$(aom_tool_path aomenc)" - - eval "${encoder}" \ - $(aomenc_encode_test_fast_params) \ - $(yuv_raw_input) \ - --ivf \ - --output=${dump_obu_test_file} \ - ${devnull} - - if [ ! -e "${dump_obu_test_file}" ]; then - elog "dump_obu test input encode failed." - return 1 - fi - fi -} - -dump_obu() { - encode_test_file - eval $(aom_tool_path dump_obu) "${dump_obu_test_file}" ${devnull} -} - -dump_obu_tests="dump_obu" - -run_tests dump_obu_verify_environment "${dump_obu_tests}" diff --git a/third_party/aom/test/ec_test.cc b/third_party/aom/test/ec_test.cc deleted file mode 100644 index e6a5ea63b..000000000 --- a/third_party/aom/test/ec_test.cc +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include <cstdlib> - -#include "aom_dsp/entenc.h" -#include "aom_dsp/entdec.h" - -TEST(EC_TEST, random_ec_test) { - od_ec_enc enc; - od_ec_dec dec; - int sz; - int i; - int ret; - unsigned int sym; - unsigned int seed; - unsigned char *ptr; - uint32_t ptr_sz; - char *seed_str; - ret = 0; - seed_str = getenv("EC_TEST_SEED"); - if (seed_str) { - seed = atoi(seed_str); - } else { - seed = 0xdaa1a; - } - srand(seed); - od_ec_enc_init(&enc, 1); - /*Test compatibility between multiple different encode/decode routines.*/ - for (i = 0; i < 409600; i++) { - unsigned *fz; - unsigned *fts; - unsigned *data; - unsigned *tell; - unsigned *enc_method; - int j; - sz = rand() / ((RAND_MAX >> (rand() % 9U)) + 1U); - fz = (unsigned *)malloc(sz * sizeof(*fz)); - fts = (unsigned *)malloc(sz * sizeof(*fts)); - data = (unsigned *)malloc(sz * sizeof(*data)); - tell = (unsigned *)malloc((sz + 1) * sizeof(*tell)); - enc_method = (unsigned *)malloc(sz * sizeof(*enc_method)); - od_ec_enc_reset(&enc); - tell[0] = od_ec_enc_tell_frac(&enc); - for (j = 0; j < sz; j++) { - data[j] = rand() / ((RAND_MAX >> 1) + 1); - - fts[j] = CDF_PROB_BITS; - fz[j] = (rand() % (CDF_PROB_TOP - 2)) >> (CDF_PROB_BITS - fts[j]); - fz[j] = OD_MAXI(fz[j], 1); - enc_method[j] = 3 + (rand() & 1); - switch (enc_method[j]) { - case 3: { - od_ec_encode_bool_q15(&enc, data[j], - OD_ICDF(fz[j] << (CDF_PROB_BITS - fts[j]))); - break; - } - case 4: { - uint16_t cdf[2]; - cdf[0] = OD_ICDF(fz[j]); - cdf[1] = OD_ICDF(1U << fts[j]); - od_ec_encode_cdf_q15(&enc, data[j], cdf, 2); - break; - } - } - - tell[j + 1] = od_ec_enc_tell_frac(&enc); - } - ptr = od_ec_enc_done(&enc, &ptr_sz); - EXPECT_GE(((od_ec_enc_tell(&enc) + 7U) >> 3), ptr_sz) - << "od_ec_enc_tell() lied: " - "there's " - << ptr_sz << " bytes instead of " << ((od_ec_enc_tell(&enc) + 7) >> 3) - << " (Random seed: " << seed << ")\n"; - od_ec_dec_init(&dec, ptr, ptr_sz); - EXPECT_EQ(od_ec_dec_tell_frac(&dec), tell[0]) - << "od_ec_dec_tell() mismatch between encoder and decoder " - "at symbol 0: " - << (unsigned)od_ec_dec_tell_frac(&dec) << " instead of " << tell[0] - << " (Random seed: " << seed << ").\n"; - for (j = 0; j < sz; j++) { - int dec_method; - if (CDF_SHIFT == 0) { - dec_method = 3 + (rand() & 1); - } else { - dec_method = enc_method[j]; - } - switch (dec_method) { - case 3: { - sym = od_ec_decode_bool_q15( - &dec, OD_ICDF(fz[j] << (CDF_PROB_BITS - fts[j]))); - break; - } - case 4: { - uint16_t cdf[2]; - cdf[0] = OD_ICDF(fz[j]); - cdf[1] = OD_ICDF(1U << fts[j]); - sym = od_ec_decode_cdf_q15(&dec, cdf, 2); - break; - } - } - - EXPECT_EQ(sym, data[j]) - << "Decoded " << sym << " instead of " << data[j] - << " with fz=" << fz[j] << " and ftb=" << fts[j] << "at position " - << j << " of " << sz << " (Random seed: " << seed << ").\n" - << "Encoding method: " << enc_method[j] - << " decoding method: " << dec_method << "\n"; - EXPECT_EQ(od_ec_dec_tell_frac(&dec), tell[j + 1]) - << "od_ec_dec_tell() mismatch between encoder and " - "decoder at symbol " - << j + 1 << ": " << (unsigned)od_ec_dec_tell_frac(&dec) - << " instead of " << tell[j + 1] << " (Random seed: " << seed - << ").\n"; - } - free(enc_method); - free(tell); - free(data); - free(fts); - free(fz); - } - od_ec_enc_reset(&enc); - if (CDF_SHIFT == 0) { - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(24576)); - od_ec_enc_patch_initial_bits(&enc, 3, 2); - EXPECT_FALSE(enc.error) << "od_ec_enc_patch_initial_bits() failed.\n"; - od_ec_enc_patch_initial_bits(&enc, 0, 5); - EXPECT_TRUE(enc.error) - << "od_ec_enc_patch_initial_bits() didn't fail when it should have.\n"; - od_ec_enc_reset(&enc); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); - od_ec_encode_bool_q15(&enc, 1, OD_ICDF(32256)); - od_ec_encode_bool_q15(&enc, 0, OD_ICDF(24576)); - od_ec_enc_patch_initial_bits(&enc, 0, 2); - EXPECT_FALSE(enc.error) << "od_ec_enc_patch_initial_bits() failed.\n"; - ptr = od_ec_enc_done(&enc, &ptr_sz); - EXPECT_EQ(ptr_sz, 2u); - EXPECT_EQ(ptr[0], 63) - << "Got " << ptr[0] - << " when expecting 63 for od_ec_enc_patch_initial_bits().\n"; - } - od_ec_enc_clear(&enc); - EXPECT_EQ(ret, 0); -} diff --git a/third_party/aom/test/encode_api_test.cc b/third_party/aom/test/encode_api_test.cc deleted file mode 100644 index c26f5720f..000000000 --- a/third_party/aom/test/encode_api_test.cc +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "test/util.h" -#include "aom/aomcx.h" -#include "aom/aom_encoder.h" - -namespace { - -TEST(EncodeAPI, InvalidParams) { - static const aom_codec_iface_t *kCodecs[] = { -#if CONFIG_AV1_ENCODER - aom_codec_av1_cx(), -#endif - }; - uint8_t buf[1] = { 0 }; - aom_image_t img; - aom_codec_ctx_t enc; - aom_codec_enc_cfg_t cfg; - - EXPECT_EQ(&img, aom_img_wrap(&img, AOM_IMG_FMT_I420, 1, 1, 1, buf)); - - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(NULL, NULL, NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_enc_init(&enc, NULL, NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_encode(NULL, NULL, 0, 0, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_encode(NULL, &img, 0, 0, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, aom_codec_destroy(NULL)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_enc_config_default(NULL, NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_enc_config_default(NULL, &cfg, 0)); - EXPECT_TRUE(aom_codec_error(NULL) != NULL); - - for (int i = 0; i < NELEMENTS(kCodecs); ++i) { - SCOPED_TRACE(aom_codec_iface_name(kCodecs[i])); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_enc_init(NULL, kCodecs[i], NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_enc_init(&enc, kCodecs[i], NULL, 0)); - EXPECT_EQ(AOM_CODEC_INVALID_PARAM, - aom_codec_enc_config_default(kCodecs[i], &cfg, 1)); - - EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_config_default(kCodecs[i], &cfg, 0)); - EXPECT_EQ(AOM_CODEC_OK, aom_codec_enc_init(&enc, kCodecs[i], &cfg, 0)); - - EXPECT_EQ(NULL, aom_codec_get_global_headers(NULL)); - - aom_fixed_buf_t *glob_headers = aom_codec_get_global_headers(&enc); - EXPECT_TRUE(glob_headers->buf != NULL); - if (glob_headers) { - free(glob_headers->buf); - free(glob_headers); - } - - EXPECT_EQ(AOM_CODEC_OK, aom_codec_encode(&enc, NULL, 0, 0, 0)); - - EXPECT_EQ(AOM_CODEC_OK, aom_codec_destroy(&enc)); - } -} - -} // namespace diff --git a/third_party/aom/test/encode_perf_test.cc b/third_party/aom/test/encode_perf_test.cc deleted file mode 100644 index fe649b153..000000000 --- a/third_party/aom/test/encode_perf_test.cc +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_version.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/util.h" -#include "test/y4m_video_source.h" -#include "aom_ports/aom_timer.h" - -namespace { - -const int kMaxPsnr = 100; -const double kUsecsInSec = 1000000.0; - -struct EncodePerfTestVideo { - EncodePerfTestVideo(const char *name_, uint32_t width_, uint32_t height_, - uint32_t bitrate_, int frames_) - : name(name_), width(width_), height(height_), bitrate(bitrate_), - frames(frames_) {} - const char *name; - uint32_t width; - uint32_t height; - uint32_t bitrate; - int frames; -}; - -const EncodePerfTestVideo kAV1EncodePerfTestVectors[] = { - EncodePerfTestVideo("desktop_640_360_30.yuv", 640, 360, 200, 2484), - EncodePerfTestVideo("kirland_640_480_30.yuv", 640, 480, 200, 300), - EncodePerfTestVideo("macmarcomoving_640_480_30.yuv", 640, 480, 200, 987), - EncodePerfTestVideo("macmarcostationary_640_480_30.yuv", 640, 480, 200, 718), - EncodePerfTestVideo("niklas_640_480_30.yuv", 640, 480, 200, 471), - EncodePerfTestVideo("tacomanarrows_640_480_30.yuv", 640, 480, 200, 300), - EncodePerfTestVideo("tacomasmallcameramovement_640_480_30.yuv", 640, 480, 200, - 300), - EncodePerfTestVideo("thaloundeskmtg_640_480_30.yuv", 640, 480, 200, 300), - EncodePerfTestVideo("niklas_1280_720_30.yuv", 1280, 720, 600, 470), -}; - -const int kEncodePerfTestSpeeds[] = { 5, 6, 7, 8 }; -const int kEncodePerfTestThreads[] = { 1, 2, 4 }; - -class AV1EncodePerfTest - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - AV1EncodePerfTest() - : EncoderTest(GET_PARAM(0)), min_psnr_(kMaxPsnr), nframes_(0), - encoding_mode_(GET_PARAM(1)), speed_(0), threads_(1) {} - - virtual ~AV1EncodePerfTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - - cfg_.g_lag_in_frames = 0; - cfg_.rc_min_quantizer = 2; - cfg_.rc_max_quantizer = 56; - cfg_.rc_dropframe_thresh = 0; - cfg_.rc_undershoot_pct = 50; - cfg_.rc_overshoot_pct = 50; - cfg_.rc_buf_sz = 1000; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - cfg_.rc_end_usage = AOM_CBR; - cfg_.g_error_resilient = 1; - cfg_.g_threads = threads_; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - const int log2_tile_columns = 3; - encoder->Control(AOME_SET_CPUUSED, speed_); - encoder->Control(AV1E_SET_TILE_COLUMNS, log2_tile_columns); - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 0); - } - } - - virtual void BeginPassHook(unsigned int /*pass*/) { - min_psnr_ = kMaxPsnr; - nframes_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (pkt->data.psnr.psnr[0] < min_psnr_) { - min_psnr_ = pkt->data.psnr.psnr[0]; - } - } - - // for performance reasons don't decode - virtual bool DoDecode() { return 0; } - - double min_psnr() const { return min_psnr_; } - - void set_speed(unsigned int speed) { speed_ = speed; } - - void set_threads(unsigned int threads) { threads_ = threads; } - - private: - double min_psnr_; - unsigned int nframes_; - libaom_test::TestMode encoding_mode_; - unsigned speed_; - unsigned int threads_; -}; - -TEST_P(AV1EncodePerfTest, PerfTest) { - for (size_t i = 0; i < NELEMENTS(kAV1EncodePerfTestVectors); ++i) { - for (size_t j = 0; j < NELEMENTS(kEncodePerfTestSpeeds); ++j) { - for (size_t k = 0; k < NELEMENTS(kEncodePerfTestThreads); ++k) { - if (kAV1EncodePerfTestVectors[i].width < 512 && - kEncodePerfTestThreads[k] > 1) - continue; - else if (kAV1EncodePerfTestVectors[i].width < 1024 && - kEncodePerfTestThreads[k] > 2) - continue; - - set_threads(kEncodePerfTestThreads[k]); - SetUp(); - - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = kAV1EncodePerfTestVectors[i].bitrate; - - init_flags_ = AOM_CODEC_USE_PSNR; - - const unsigned frames = kAV1EncodePerfTestVectors[i].frames; - const char *video_name = kAV1EncodePerfTestVectors[i].name; - libaom_test::I420VideoSource video( - video_name, kAV1EncodePerfTestVectors[i].width, - kAV1EncodePerfTestVectors[i].height, timebase.den, timebase.num, 0, - kAV1EncodePerfTestVectors[i].frames); - set_speed(kEncodePerfTestSpeeds[j]); - - aom_usec_timer t; - aom_usec_timer_start(&t); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - aom_usec_timer_mark(&t); - const double elapsed_secs = aom_usec_timer_elapsed(&t) / kUsecsInSec; - const double fps = frames / elapsed_secs; - const double minimum_psnr = min_psnr(); - std::string display_name(video_name); - if (kEncodePerfTestThreads[k] > 1) { - char thread_count[32]; - snprintf(thread_count, sizeof(thread_count), "_t-%d", - kEncodePerfTestThreads[k]); - display_name += thread_count; - } - - printf("{\n"); - printf("\t\"type\" : \"encode_perf_test\",\n"); - printf("\t\"version\" : \"%s\",\n", VERSION_STRING_NOSP); - printf("\t\"videoName\" : \"%s\",\n", display_name.c_str()); - printf("\t\"encodeTimeSecs\" : %f,\n", elapsed_secs); - printf("\t\"totalFrames\" : %u,\n", frames); - printf("\t\"framesPerSecond\" : %f,\n", fps); - printf("\t\"minPsnr\" : %f,\n", minimum_psnr); - printf("\t\"speed\" : %d,\n", kEncodePerfTestSpeeds[j]); - printf("\t\"threads\" : %d\n", kEncodePerfTestThreads[k]); - printf("}\n"); - } - } - } -} - -AV1_INSTANTIATE_TEST_CASE(AV1EncodePerfTest, - ::testing::Values(::libaom_test::kRealTime)); -} // namespace diff --git a/third_party/aom/test/encode_test_driver.cc b/third_party/aom/test/encode_test_driver.cc deleted file mode 100644 index f3d61dc36..000000000 --- a/third_party/aom/test/encode_test_driver.cc +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "aom_ports/mem.h" -#include "test/codec_factory.h" -#include "test/decode_test_driver.h" -#include "test/encode_test_driver.h" -#include "test/register_state_check.h" -#include "test/video_source.h" - -namespace libaom_test { -void Encoder::InitEncoder(VideoSource *video) { - aom_codec_err_t res; - const aom_image_t *img = video->img(); - - if (video->img() && !encoder_.priv) { - cfg_.g_w = img->d_w; - cfg_.g_h = img->d_h; - cfg_.g_timebase = video->timebase(); - cfg_.rc_twopass_stats_in = stats_->buf(); - - res = aom_codec_enc_init(&encoder_, CodecInterface(), &cfg_, init_flags_); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } -} - -void Encoder::EncodeFrame(VideoSource *video, const unsigned long frame_flags) { - if (video->img()) - EncodeFrameInternal(*video, frame_flags); - else - Flush(); - - // Handle twopass stats - CxDataIterator iter = GetCxData(); - - while (const aom_codec_cx_pkt_t *pkt = iter.Next()) { - if (pkt->kind != AOM_CODEC_STATS_PKT) continue; - - stats_->Append(*pkt); - } -} - -void Encoder::EncodeFrameInternal(const VideoSource &video, - const unsigned long frame_flags) { - aom_codec_err_t res; - const aom_image_t *img = video.img(); - - // Handle frame resizing - if (cfg_.g_w != img->d_w || cfg_.g_h != img->d_h) { - cfg_.g_w = img->d_w; - cfg_.g_h = img->d_h; - res = aom_codec_enc_config_set(&encoder_, &cfg_); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } - - // Encode the frame - API_REGISTER_STATE_CHECK(res = - aom_codec_encode(&encoder_, img, video.pts(), - video.duration(), frame_flags)); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); -} - -void Encoder::Flush() { - const aom_codec_err_t res = aom_codec_encode(&encoder_, NULL, 0, 0, 0); - if (!encoder_.priv) - ASSERT_EQ(AOM_CODEC_ERROR, res) << EncoderError(); - else - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); -} - -void EncoderTest::InitializeConfig() { - const aom_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, 0); - ASSERT_EQ(AOM_CODEC_OK, res); -} - -void EncoderTest::SetMode(TestMode mode) { - switch (mode) { - case kOnePassGood: - case kTwoPassGood: break; - case kRealTime: cfg_.g_lag_in_frames = 0; break; - default: ASSERT_TRUE(false) << "Unexpected mode " << mode; - } - mode_ = mode; - if (mode == kTwoPassGood) - passes_ = 2; - else - passes_ = 1; -} - -static bool compare_plane(const uint8_t *const buf1, int stride1, - const uint8_t *const buf2, int stride2, int w, int h, - int *const mismatch_row, int *const mismatch_col, - int *const mismatch_pix1, int *const mismatch_pix2) { - int r, c; - - for (r = 0; r < h; ++r) { - for (c = 0; c < w; ++c) { - const int pix1 = buf1[r * stride1 + c]; - const int pix2 = buf2[r * stride2 + c]; - - if (pix1 != pix2) { - if (mismatch_row != NULL) *mismatch_row = r; - if (mismatch_col != NULL) *mismatch_col = c; - if (mismatch_pix1 != NULL) *mismatch_pix1 = pix1; - if (mismatch_pix2 != NULL) *mismatch_pix2 = pix2; - return false; - } - } - } - - return true; -} - -// The function should return "true" most of the time, therefore no early -// break-out is implemented within the match checking process. -static bool compare_img(const aom_image_t *img1, const aom_image_t *img2, - int *const mismatch_row, int *const mismatch_col, - int *const mismatch_plane, int *const mismatch_pix1, - int *const mismatch_pix2) { - if (img1->fmt != img2->fmt || img1->cp != img2->cp || img1->tc != img2->tc || - img1->mc != img2->mc || img1->d_w != img2->d_w || - img1->d_h != img2->d_h || img1->monochrome != img2->monochrome) { - if (mismatch_row != NULL) *mismatch_row = -1; - if (mismatch_col != NULL) *mismatch_col = -1; - return false; - } - - const int num_planes = img1->monochrome ? 1 : 3; - for (int plane = 0; plane < num_planes; plane++) { - if (!compare_plane(img1->planes[plane], img1->stride[plane], - img2->planes[plane], img2->stride[plane], - aom_img_plane_width(img1, plane), - aom_img_plane_height(img1, plane), mismatch_row, - mismatch_col, mismatch_pix1, mismatch_pix2)) { - if (mismatch_plane != NULL) *mismatch_plane = plane; - return false; - } - } - - return true; -} - -void EncoderTest::MismatchHook(const aom_image_t *img_enc, - const aom_image_t *img_dec) { - int mismatch_row = 0; - int mismatch_col = 0; - int mismatch_plane = 0; - int mismatch_pix_enc = 0; - int mismatch_pix_dec = 0; - - ASSERT_FALSE(compare_img(img_enc, img_dec, &mismatch_row, &mismatch_col, - &mismatch_plane, &mismatch_pix_enc, - &mismatch_pix_dec)); - - GTEST_FAIL() << "Encode/Decode mismatch found:" << std::endl - << " pixel value enc/dec: " << mismatch_pix_enc << "/" - << mismatch_pix_dec << std::endl - << " plane: " << mismatch_plane << std::endl - << " row/col: " << mismatch_row << "/" - << mismatch_col << std::endl; -} - -void EncoderTest::RunLoop(VideoSource *video) { - aom_codec_dec_cfg_t dec_cfg = aom_codec_dec_cfg_t(); - dec_cfg.allow_lowbitdepth = 1; - - stats_.Reset(); - - ASSERT_TRUE(passes_ == 1 || passes_ == 2); - for (unsigned int pass = 0; pass < passes_; pass++) { - last_pts_ = 0; - - if (passes_ == 1) - cfg_.g_pass = AOM_RC_ONE_PASS; - else if (pass == 0) - cfg_.g_pass = AOM_RC_FIRST_PASS; - else - cfg_.g_pass = AOM_RC_LAST_PASS; - - BeginPassHook(pass); - testing::internal::scoped_ptr<Encoder> encoder( - codec_->CreateEncoder(cfg_, init_flags_, &stats_)); - ASSERT_TRUE(encoder.get() != NULL); - - ASSERT_NO_FATAL_FAILURE(video->Begin()); - encoder->InitEncoder(video); - - if (mode_ == kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 0); - } - - ASSERT_FALSE(::testing::Test::HasFatalFailure()); - - testing::internal::scoped_ptr<Decoder> decoder( - codec_->CreateDecoder(dec_cfg, 0 /* flags */)); -#if CONFIG_AV1_DECODER - if (decoder->IsAV1()) { - // Set dec_cfg.tile_row = -1 and dec_cfg.tile_col = -1 so that the whole - // frame is decoded. - decoder->Control(AV1_SET_TILE_MODE, cfg_.large_scale_tile); - decoder->Control(AV1D_EXT_TILE_DEBUG, 1); - decoder->Control(AV1_SET_DECODE_TILE_ROW, -1); - decoder->Control(AV1_SET_DECODE_TILE_COL, -1); - } -#endif - - bool again; - for (again = true; again; video->Next()) { - again = (video->img() != NULL); - - PreEncodeFrameHook(video); - PreEncodeFrameHook(video, encoder.get()); - encoder->EncodeFrame(video, frame_flags_); - - CxDataIterator iter = encoder->GetCxData(); - - bool has_cxdata = false; - bool has_dxdata = false; - while (const aom_codec_cx_pkt_t *pkt = iter.Next()) { - pkt = MutateEncoderOutputHook(pkt); - again = true; - switch (pkt->kind) { - case AOM_CODEC_CX_FRAME_PKT: - has_cxdata = true; - if (decoder.get() != NULL && DoDecode()) { - aom_codec_err_t res_dec; - if (DoDecodeInvisible()) { - res_dec = decoder->DecodeFrame( - (const uint8_t *)pkt->data.frame.buf, pkt->data.frame.sz); - } else { - res_dec = decoder->DecodeFrame( - (const uint8_t *)pkt->data.frame.buf + - (pkt->data.frame.sz - pkt->data.frame.vis_frame_size), - pkt->data.frame.vis_frame_size); - } - - if (!HandleDecodeResult(res_dec, decoder.get())) break; - - has_dxdata = true; - } - ASSERT_GE(pkt->data.frame.pts, last_pts_); - last_pts_ = pkt->data.frame.pts; - FramePktHook(pkt); - break; - - case AOM_CODEC_PSNR_PKT: PSNRPktHook(pkt); break; - - default: break; - } - } - - if (has_dxdata && has_cxdata) { - const aom_image_t *img_enc = encoder->GetPreviewFrame(); - DxDataIterator dec_iter = decoder->GetDxData(); - const aom_image_t *img_dec = dec_iter.Next(); - if (img_enc && img_dec) { - const bool res = - compare_img(img_enc, img_dec, NULL, NULL, NULL, NULL, NULL); - if (!res) { // Mismatch - MismatchHook(img_enc, img_dec); - } - } - if (img_dec) DecompressedFrameHook(*img_dec, video->pts()); - } - if (!Continue()) break; - } - - EndPassHook(); - - if (!Continue()) break; - } -} - -} // namespace libaom_test diff --git a/third_party/aom/test/encode_test_driver.h b/third_party/aom/test/encode_test_driver.h deleted file mode 100644 index 4f3f855cf..000000000 --- a/third_party/aom/test/encode_test_driver.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_ENCODE_TEST_DRIVER_H_ -#define AOM_TEST_ENCODE_TEST_DRIVER_H_ - -#include <string> -#include <vector> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#if CONFIG_AV1_ENCODER -#include "aom/aomcx.h" -#endif -#include "aom/aom_encoder.h" - -namespace libaom_test { - -class CodecFactory; -class VideoSource; - -enum TestMode { kRealTime, kOnePassGood, kTwoPassGood }; -#define ALL_TEST_MODES \ - ::testing::Values(::libaom_test::kRealTime, ::libaom_test::kOnePassGood, \ - ::libaom_test::kTwoPassGood) - -#define ONE_PASS_TEST_MODES \ - ::testing::Values(::libaom_test::kRealTime, ::libaom_test::kOnePassGood) - -#define TWO_PASS_TEST_MODES ::testing::Values(::libaom_test::kTwoPassGood) - -#define NONREALTIME_TEST_MODES \ - ::testing::Values(::libaom_test::kOnePassGood, ::libaom_test::kTwoPassGood) - -// Provides an object to handle the libaom get_cx_data() iteration pattern -class CxDataIterator { - public: - explicit CxDataIterator(aom_codec_ctx_t *encoder) - : encoder_(encoder), iter_(NULL) {} - - const aom_codec_cx_pkt_t *Next() { - return aom_codec_get_cx_data(encoder_, &iter_); - } - - private: - aom_codec_ctx_t *encoder_; - aom_codec_iter_t iter_; -}; - -// Implements an in-memory store for libaom twopass statistics -class TwopassStatsStore { - public: - void Append(const aom_codec_cx_pkt_t &pkt) { - buffer_.append(reinterpret_cast<char *>(pkt.data.twopass_stats.buf), - pkt.data.twopass_stats.sz); - } - - aom_fixed_buf_t buf() { - const aom_fixed_buf_t buf = { &buffer_[0], buffer_.size() }; - return buf; - } - - void Reset() { buffer_.clear(); } - - protected: - std::string buffer_; -}; - -// Provides a simplified interface to manage one video encoding pass, given -// a configuration and video source. -// -// TODO(jkoleszar): The exact services it provides and the appropriate -// level of abstraction will be fleshed out as more tests are written. -class Encoder { - public: - Encoder(aom_codec_enc_cfg_t cfg, const uint32_t init_flags, - TwopassStatsStore *stats) - : cfg_(cfg), init_flags_(init_flags), stats_(stats) { - memset(&encoder_, 0, sizeof(encoder_)); - } - - virtual ~Encoder() { aom_codec_destroy(&encoder_); } - - CxDataIterator GetCxData() { return CxDataIterator(&encoder_); } - - void InitEncoder(VideoSource *video); - - const aom_image_t *GetPreviewFrame() { - return aom_codec_get_preview_frame(&encoder_); - } - // This is a thin wrapper around aom_codec_encode(), so refer to - // aom_encoder.h for its semantics. - void EncodeFrame(VideoSource *video, const unsigned long frame_flags); - - // Convenience wrapper for EncodeFrame() - void EncodeFrame(VideoSource *video) { EncodeFrame(video, 0); } - - void Control(int ctrl_id, int arg) { - const aom_codec_err_t res = aom_codec_control_(&encoder_, ctrl_id, arg); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } - - void Control(int ctrl_id, int *arg) { - const aom_codec_err_t res = aom_codec_control_(&encoder_, ctrl_id, arg); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } - - void Control(int ctrl_id, struct aom_scaling_mode *arg) { - const aom_codec_err_t res = aom_codec_control_(&encoder_, ctrl_id, arg); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } - -#if CONFIG_AV1_ENCODER - void Control(int ctrl_id, aom_active_map_t *arg) { - const aom_codec_err_t res = aom_codec_control_(&encoder_, ctrl_id, arg); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - } -#endif - - void Config(const aom_codec_enc_cfg_t *cfg) { - const aom_codec_err_t res = aom_codec_enc_config_set(&encoder_, cfg); - ASSERT_EQ(AOM_CODEC_OK, res) << EncoderError(); - cfg_ = *cfg; - } - - protected: - virtual aom_codec_iface_t *CodecInterface() const = 0; - - const char *EncoderError() { - const char *detail = aom_codec_error_detail(&encoder_); - return detail ? detail : aom_codec_error(&encoder_); - } - - // Encode an image - void EncodeFrameInternal(const VideoSource &video, - const unsigned long frame_flags); - - // Flush the encoder on EOS - void Flush(); - - aom_codec_ctx_t encoder_; - aom_codec_enc_cfg_t cfg_; - unsigned long init_flags_; - TwopassStatsStore *stats_; -}; - -// Common test functionality for all Encoder tests. -// -// This class is a mixin which provides the main loop common to all -// encoder tests. It provides hooks which can be overridden by subclasses -// to implement each test's specific behavior, while centralizing the bulk -// of the boilerplate. Note that it doesn't inherit the gtest testing -// classes directly, so that tests can be parameterized differently. -class EncoderTest { - protected: - explicit EncoderTest(const CodecFactory *codec) - : codec_(codec), abort_(false), init_flags_(0), frame_flags_(0), - last_pts_(0), mode_(kRealTime) { - // Default to 1 thread. - cfg_.g_threads = 1; - } - - virtual ~EncoderTest() {} - - // Initialize the cfg_ member with the default configuration. - void InitializeConfig(); - - // Map the TestMode enum to the passes_ variables. - void SetMode(TestMode mode); - - // Set encoder flag. - void set_init_flags(unsigned long flag) { // NOLINT(runtime/int) - init_flags_ = flag; - } - - // Main loop - virtual void RunLoop(VideoSource *video); - - // Hook to be called at the beginning of a pass. - virtual void BeginPassHook(unsigned int /*pass*/) {} - - // Hook to be called at the end of a pass. - virtual void EndPassHook() {} - - // Hook to be called before encoding a frame. - virtual void PreEncodeFrameHook(VideoSource * /*video*/) {} - virtual void PreEncodeFrameHook(VideoSource * /*video*/, - Encoder * /*encoder*/) {} - - // Hook to be called on every compressed data packet. - virtual void FramePktHook(const aom_codec_cx_pkt_t * /*pkt*/) {} - - // Hook to be called on every PSNR packet. - virtual void PSNRPktHook(const aom_codec_cx_pkt_t * /*pkt*/) {} - - // Hook to determine whether the encode loop should continue. - virtual bool Continue() const { - return !(::testing::Test::HasFatalFailure() || abort_); - } - - // Hook to determine whether to decode frame after encoding - virtual bool DoDecode() const { return true; } - - // Hook to determine whether to decode invisible frames after encoding - virtual bool DoDecodeInvisible() const { return true; } - - // Hook to handle encode/decode mismatch - virtual void MismatchHook(const aom_image_t *img1, const aom_image_t *img2); - - // Hook to be called on every decompressed frame. - virtual void DecompressedFrameHook(const aom_image_t & /*img*/, - aom_codec_pts_t /*pts*/) {} - - // Hook to be called to handle decode result. Return true to continue. - virtual bool HandleDecodeResult(const aom_codec_err_t res_dec, - Decoder *decoder) { - EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); - return AOM_CODEC_OK == res_dec; - } - - // Hook that can modify the encoder's output data - virtual const aom_codec_cx_pkt_t *MutateEncoderOutputHook( - const aom_codec_cx_pkt_t *pkt) { - return pkt; - } - - const CodecFactory *codec_; - bool abort_; - aom_codec_enc_cfg_t cfg_; - unsigned int passes_; - TwopassStatsStore stats_; - unsigned long init_flags_; - unsigned long frame_flags_; - aom_codec_pts_t last_pts_; - TestMode mode_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_ENCODE_TEST_DRIVER_H_ diff --git a/third_party/aom/test/encodetxb_test.cc b/third_party/aom/test/encodetxb_test.cc deleted file mode 100644 index 11cc07368..000000000 --- a/third_party/aom/test/encodetxb_test.cc +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <stdint.h> -#include <stdio.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "aom_ports/mem.h" -#include "av1/common/idct.h" -#include "av1/common/onyxc_int.h" -#include "av1/common/scan.h" -#include "av1/common/txb_common.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -namespace { -using libaom_test::ACMRandom; - -typedef void (*GetNzMapContextsFunc)(const uint8_t *const levels, - const int16_t *const scan, - const uint16_t eob, const TX_SIZE tx_size, - const TX_CLASS tx_class, - int8_t *const coeff_contexts); - -class EncodeTxbTest : public ::testing::TestWithParam<GetNzMapContextsFunc> { - public: - EncodeTxbTest() : get_nz_map_contexts_func_(GetParam()) {} - - virtual ~EncodeTxbTest() {} - - virtual void SetUp() { - coeff_contexts_ref_ = reinterpret_cast<int8_t *>( - aom_memalign(16, sizeof(*coeff_contexts_ref_) * MAX_TX_SQUARE)); - ASSERT_TRUE(coeff_contexts_ref_ != NULL); - coeff_contexts_ = reinterpret_cast<int8_t *>( - aom_memalign(16, sizeof(*coeff_contexts_) * MAX_TX_SQUARE)); - ASSERT_TRUE(coeff_contexts_ != NULL); - } - - virtual void TearDown() { - aom_free(coeff_contexts_ref_); - aom_free(coeff_contexts_); - libaom_test::ClearSystemState(); - } - - void GetNzMapContextsRun() { - const int kNumTests = 10; - int result = 0; - - for (int is_inter = 0; is_inter < 2; ++is_inter) { - for (int tx_type = DCT_DCT; tx_type < TX_TYPES; ++tx_type) { - const TX_CLASS tx_class = tx_type_to_class[tx_type]; - for (int tx_size = TX_4X4; tx_size < TX_SIZES_ALL; ++tx_size) { - const int bwl = get_txb_bwl((TX_SIZE)tx_size); - const int width = get_txb_wide((TX_SIZE)tx_size); - const int height = get_txb_high((TX_SIZE)tx_size); - const int real_width = tx_size_wide[tx_size]; - const int real_height = tx_size_high[tx_size]; - const int16_t *const scan = av1_scan_orders[tx_size][tx_type].scan; - - levels_ = set_levels(levels_buf_, width); - for (int i = 0; i < kNumTests && !result; ++i) { - for (int eob = 1; eob <= width * height && !result; ++eob) { - InitDataWithEob(scan, bwl, eob); - - av1_get_nz_map_contexts_c(levels_, scan, eob, (TX_SIZE)tx_size, - tx_class, coeff_contexts_ref_); - get_nz_map_contexts_func_(levels_, scan, eob, (TX_SIZE)tx_size, - tx_class, coeff_contexts_); - - result = Compare(scan, eob); - - EXPECT_EQ(result, 0) - << " tx_class " << tx_class << " width " << real_width - << " height " << real_height << " eob " << eob; - } - } - } - } - } - } - - void SpeedTestGetNzMapContextsRun() { - const int kNumTests = 2000000000; - aom_usec_timer timer; - - printf("Note: Only test the largest possible eob case!\n"); - for (int tx_size = TX_4X4; tx_size < TX_SIZES_ALL; ++tx_size) { - const int bwl = get_txb_bwl((TX_SIZE)tx_size); - const int width = get_txb_wide((TX_SIZE)tx_size); - const int height = get_txb_high((TX_SIZE)tx_size); - const int real_width = tx_size_wide[tx_size]; - const int real_height = tx_size_high[tx_size]; - const TX_TYPE tx_type = DCT_DCT; - const TX_CLASS tx_class = tx_type_to_class[tx_type]; - const int16_t *const scan = av1_scan_orders[tx_size][tx_type].scan; - const int eob = width * height; - const int numTests = kNumTests / (width * height); - - levels_ = set_levels(levels_buf_, width); - InitDataWithEob(scan, bwl, eob); - - aom_usec_timer_start(&timer); - for (int i = 0; i < numTests; ++i) { - get_nz_map_contexts_func_(levels_, scan, eob, (TX_SIZE)tx_size, - tx_class, coeff_contexts_); - } - aom_usec_timer_mark(&timer); - - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("get_nz_map_contexts_%2dx%2d: %7.1f ms\n", real_width, real_height, - elapsed_time / 1000.0); - } - } - - private: - void InitDataWithEob(const int16_t *const scan, const int bwl, - const int eob) { - memset(levels_buf_, 0, sizeof(levels_buf_)); - memset(coeff_contexts_, 0, sizeof(*coeff_contexts_) * MAX_TX_SQUARE); - - for (int c = 0; c < eob; ++c) { - levels_[get_padded_idx(scan[c], bwl)] = - static_cast<uint8_t>(clamp(rnd_.Rand8(), 0, INT8_MAX)); - coeff_contexts_[scan[c]] = rnd_.Rand16() >> 1; - } - - memcpy(coeff_contexts_ref_, coeff_contexts_, - sizeof(*coeff_contexts_) * MAX_TX_SQUARE); - } - - bool Compare(const int16_t *const scan, const int eob) const { - bool result = false; - if (memcmp(coeff_contexts_, coeff_contexts_ref_, - sizeof(*coeff_contexts_ref_) * MAX_TX_SQUARE)) { - for (int i = 0; i < eob; i++) { - const int pos = scan[i]; - if (coeff_contexts_ref_[pos] != coeff_contexts_[pos]) { - printf("coeff_contexts_[%d] diff:%6d (ref),%6d (opt)\n", pos, - coeff_contexts_ref_[pos], coeff_contexts_[pos]); - result = true; - break; - } - } - } - return result; - } - - GetNzMapContextsFunc get_nz_map_contexts_func_; - ACMRandom rnd_; - uint8_t levels_buf_[TX_PAD_2D]; - uint8_t *levels_; - int8_t *coeff_contexts_ref_; - int8_t *coeff_contexts_; -}; - -TEST_P(EncodeTxbTest, GetNzMapContexts) { GetNzMapContextsRun(); } - -TEST_P(EncodeTxbTest, DISABLED_SpeedTestGetNzMapContexts) { - SpeedTestGetNzMapContextsRun(); -} - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, EncodeTxbTest, - ::testing::Values(av1_get_nz_map_contexts_sse2)); -#endif - -typedef void (*av1_txb_init_levels_func)(const tran_low_t *const coeff, - const int width, const int height, - uint8_t *const levels); - -typedef ::testing::tuple<av1_txb_init_levels_func, int> TxbInitLevelParam; - -class EncodeTxbInitLevelTest - : public ::testing::TestWithParam<TxbInitLevelParam> { - public: - virtual ~EncodeTxbInitLevelTest() {} - virtual void TearDown() { libaom_test::ClearSystemState(); } - void RunTest(av1_txb_init_levels_func test_func, int tx_size, int is_speed); -}; - -void EncodeTxbInitLevelTest::RunTest(av1_txb_init_levels_func test_func, - int tx_size, int is_speed) { - const int width = get_txb_wide((TX_SIZE)tx_size); - const int height = get_txb_high((TX_SIZE)tx_size); - tran_low_t coeff[MAX_TX_SQUARE]; - - uint8_t levels_buf[2][TX_PAD_2D]; - uint8_t *const levels0 = set_levels(levels_buf[0], width); - uint8_t *const levels1 = set_levels(levels_buf[1], width); - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int i = 0; i < width * height; i++) { - coeff[i] = rnd.Rand15Signed() + rnd.Rand15Signed(); - } - for (int i = 0; i < TX_PAD_2D; i++) { - levels_buf[0][i] = rnd.Rand8(); - levels_buf[1][i] = rnd.Rand8(); - } - const int run_times = is_speed ? (width * height) * 10000 : 1; - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - av1_txb_init_levels_c(coeff, width, height, levels0); - } - const double t1 = get_time_mark(&timer); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - test_func(coeff, width, height, levels1); - } - const double t2 = get_time_mark(&timer); - if (is_speed) { - printf("init %3dx%-3d:%7.2f/%7.2fns", width, height, t1, t2); - printf("(%3.2f)\n", t1 / t2); - } - const int stride = width + TX_PAD_HOR; - for (int r = 0; r < height + TX_PAD_VER; ++r) { - for (int c = 0; c < stride; ++c) { - ASSERT_EQ(levels_buf[0][c + r * stride], levels_buf[1][c + r * stride]) - << "[" << r << "," << c << "] " << run_times << width << "x" - << height; - } - } -} - -TEST_P(EncodeTxbInitLevelTest, match) { - RunTest(GET_PARAM(0), GET_PARAM(1), 0); -} - -TEST_P(EncodeTxbInitLevelTest, DISABLED_Speed) { - RunTest(GET_PARAM(0), GET_PARAM(1), 1); -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, EncodeTxbInitLevelTest, - ::testing::Combine(::testing::Values(&av1_txb_init_levels_sse4_1), - ::testing::Range(0, static_cast<int>(TX_SIZES_ALL), 1))); -#endif -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, EncodeTxbInitLevelTest, - ::testing::Combine(::testing::Values(&av1_txb_init_levels_avx2), - ::testing::Range(0, static_cast<int>(TX_SIZES_ALL), 1))); -#endif -} // namespace diff --git a/third_party/aom/test/end_to_end_test.cc b/third_party/aom/test/end_to_end_test.cc deleted file mode 100644 index 1ac0ae931..000000000 --- a/third_party/aom/test/end_to_end_test.cc +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/util.h" -#include "test/y4m_video_source.h" -#include "test/yuv_video_source.h" - -namespace { - -const unsigned int kWidth = 160; -const unsigned int kHeight = 90; -const unsigned int kFramerate = 50; -const unsigned int kFrames = 10; -const int kBitrate = 500; -// List of psnr thresholds for speed settings 0-7 and 5 encoding modes -const double kPsnrThreshold[][5] = { -// Note: -// AV1 HBD average PSNR is slightly lower than AV1. -// We make two cases here to enable the testing and -// guard picture quality. -#if CONFIG_AV1_ENCODER - { 36.0, 37.0, 37.0, 37.0, 37.0 }, { 31.0, 36.0, 36.0, 36.0, 36.0 }, - { 31.0, 35.0, 35.0, 35.0, 35.0 }, { 31.0, 34.0, 34.0, 34.0, 34.0 }, - { 31.0, 33.0, 33.0, 33.0, 33.0 }, { 31.0, 32.0, 32.0, 32.0, 32.0 }, - { 30.0, 31.0, 31.0, 31.0, 31.0 }, { 29.0, 30.0, 30.0, 30.0, 30.0 }, -#else - { 36.0, 37.0, 37.0, 37.0, 37.0 }, { 35.0, 36.0, 36.0, 36.0, 36.0 }, - { 34.0, 35.0, 35.0, 35.0, 35.0 }, { 33.0, 34.0, 34.0, 34.0, 34.0 }, - { 32.0, 33.0, 33.0, 33.0, 33.0 }, { 31.0, 32.0, 32.0, 32.0, 32.0 }, - { 30.0, 31.0, 31.0, 31.0, 31.0 }, { 29.0, 30.0, 30.0, 30.0, 30.0 }, -#endif // CONFIG_AV1_ENCODER -}; - -typedef struct { - const char *filename; - unsigned int input_bit_depth; - aom_img_fmt fmt; - aom_bit_depth_t bit_depth; - unsigned int profile; -} TestVideoParam; - -const TestVideoParam kTestVectors[] = { - { "park_joy_90p_8_420.y4m", 8, AOM_IMG_FMT_I420, AOM_BITS_8, 0 }, - { "park_joy_90p_8_422.y4m", 8, AOM_IMG_FMT_I422, AOM_BITS_8, 2 }, - { "park_joy_90p_8_444.y4m", 8, AOM_IMG_FMT_I444, AOM_BITS_8, 1 }, - { "park_joy_90p_10_420.y4m", 10, AOM_IMG_FMT_I42016, AOM_BITS_10, 0 }, - { "park_joy_90p_10_422.y4m", 10, AOM_IMG_FMT_I42216, AOM_BITS_10, 2 }, - { "park_joy_90p_10_444.y4m", 10, AOM_IMG_FMT_I44416, AOM_BITS_10, 1 }, - { "park_joy_90p_12_420.y4m", 12, AOM_IMG_FMT_I42016, AOM_BITS_12, 2 }, - { "park_joy_90p_12_422.y4m", 12, AOM_IMG_FMT_I42216, AOM_BITS_12, 2 }, - { "park_joy_90p_12_444.y4m", 12, AOM_IMG_FMT_I44416, AOM_BITS_12, 2 }, -}; - -// Encoding modes tested -const libaom_test::TestMode kEncodingModeVectors[] = { - ::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood, - ::libaom_test::kRealTime, -}; - -// Speed settings tested -const int kCpuUsedVectors[] = { 1, 2, 3, 5, 6 }; - -int is_extension_y4m(const char *filename) { - const char *dot = strrchr(filename, '.'); - if (!dot || dot == filename) - return 0; - else - return !strcmp(dot, ".y4m"); -} - -class EndToEndTest - : public ::libaom_test::CodecTestWith3Params<libaom_test::TestMode, - TestVideoParam, int>, - public ::libaom_test::EncoderTest { - protected: - EndToEndTest() - : EncoderTest(GET_PARAM(0)), test_video_param_(GET_PARAM(2)), - cpu_used_(GET_PARAM(3)), psnr_(0.0), nframes_(0), - encoding_mode_(GET_PARAM(1)) {} - - virtual ~EndToEndTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - cfg_.g_lag_in_frames = 5; - cfg_.rc_end_usage = AOM_VBR; - } else { - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_CBR; - cfg_.rc_buf_sz = 1000; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - } - } - - virtual void BeginPassHook(unsigned int) { - psnr_ = 0.0; - nframes_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - psnr_ += pkt->data.psnr.psnr[0]; - nframes_++; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AV1E_SET_TILE_COLUMNS, 4); - encoder->Control(AOME_SET_CPUUSED, cpu_used_); - // Test screen coding tools at cpu_used = 1 && encoding mode is two-pass. - if (cpu_used_ == 1 && encoding_mode_ == ::libaom_test::kTwoPassGood) - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN); - else - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_DEFAULT); - if (encoding_mode_ != ::libaom_test::kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - } - - double GetAveragePsnr() const { - if (nframes_) return psnr_ / nframes_; - return 0.0; - } - - double GetPsnrThreshold() { - return kPsnrThreshold[cpu_used_][encoding_mode_]; - } - - void DoTest() { - cfg_.rc_target_bitrate = kBitrate; - cfg_.g_error_resilient = 0; - cfg_.g_profile = test_video_param_.profile; - cfg_.g_input_bit_depth = test_video_param_.input_bit_depth; - cfg_.g_bit_depth = test_video_param_.bit_depth; - init_flags_ = AOM_CODEC_USE_PSNR; - if (cfg_.g_bit_depth > 8) init_flags_ |= AOM_CODEC_USE_HIGHBITDEPTH; - - testing::internal::scoped_ptr<libaom_test::VideoSource> video; - if (is_extension_y4m(test_video_param_.filename)) { - video.reset(new libaom_test::Y4mVideoSource(test_video_param_.filename, 0, - kFrames)); - } else { - video.reset(new libaom_test::YUVVideoSource( - test_video_param_.filename, test_video_param_.fmt, kWidth, kHeight, - kFramerate, 1, 0, kFrames)); - } - ASSERT_TRUE(video.get() != NULL); - - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); - const double psnr = GetAveragePsnr(); - EXPECT_GT(psnr, GetPsnrThreshold()) - << "cpu used = " << cpu_used_ << ", encoding mode = " << encoding_mode_; - } - - TestVideoParam test_video_param_; - int cpu_used_; - - private: - double psnr_; - unsigned int nframes_; - libaom_test::TestMode encoding_mode_; -}; - -class EndToEndTestLarge : public EndToEndTest {}; - -TEST_P(EndToEndTestLarge, EndtoEndPSNRTest) { DoTest(); } - -TEST_P(EndToEndTest, EndtoEndPSNRTest) { DoTest(); } - -AV1_INSTANTIATE_TEST_CASE(EndToEndTestLarge, - ::testing::ValuesIn(kEncodingModeVectors), - ::testing::ValuesIn(kTestVectors), - ::testing::ValuesIn(kCpuUsedVectors)); - -AV1_INSTANTIATE_TEST_CASE(EndToEndTest, - ::testing::Values(kEncodingModeVectors[0]), - ::testing::Values(kTestVectors[2]), // 444 - ::testing::Values(kCpuUsedVectors[2])); -} // namespace diff --git a/third_party/aom/test/error_block_test.cc b/third_party/aom/test/error_block_test.cc deleted file mode 100644 index 353947c3d..000000000 --- a/third_party/aom/test/error_block_test.cc +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cmath> -#include <cstdlib> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/entropy.h" -#include "aom/aom_codec.h" -#include "aom/aom_integer.h" - -using libaom_test::ACMRandom; - -namespace { -const int kNumIterations = 1000; - -typedef int64_t (*ErrorBlockFunc)(const tran_low_t *coeff, - const tran_low_t *dqcoeff, - intptr_t block_size, int64_t *ssz, int bps); - -typedef ::testing::tuple<ErrorBlockFunc, ErrorBlockFunc, aom_bit_depth_t> - ErrorBlockParam; - -class ErrorBlockTest : public ::testing::TestWithParam<ErrorBlockParam> { - public: - virtual ~ErrorBlockTest() {} - virtual void SetUp() { - error_block_op_ = GET_PARAM(0); - ref_error_block_op_ = GET_PARAM(1); - bit_depth_ = GET_PARAM(2); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - aom_bit_depth_t bit_depth_; - ErrorBlockFunc error_block_op_; - ErrorBlockFunc ref_error_block_op_; -}; - -TEST_P(ErrorBlockTest, OperationCheck) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, tran_low_t, coeff[4096]); - DECLARE_ALIGNED(16, tran_low_t, dqcoeff[4096]); - int err_count_total = 0; - int first_failure = -1; - intptr_t block_size; - int64_t ssz; - int64_t ret; - int64_t ref_ssz; - int64_t ref_ret; - const int msb = bit_depth_ + 8 - 1; - for (int i = 0; i < kNumIterations; ++i) { - int err_count = 0; - block_size = 16 << (i % 9); // All block sizes from 4x4, 8x4 ..64x64 - for (int j = 0; j < block_size; j++) { - // coeff and dqcoeff will always have at least the same sign, and this - // can be used for optimization, so generate test input precisely. - if (rnd(2)) { - // Positive number - coeff[j] = rnd(1 << msb); - dqcoeff[j] = rnd(1 << msb); - } else { - // Negative number - coeff[j] = -rnd(1 << msb); - dqcoeff[j] = -rnd(1 << msb); - } - } - ref_ret = - ref_error_block_op_(coeff, dqcoeff, block_size, &ref_ssz, bit_depth_); - ASM_REGISTER_STATE_CHECK( - ret = error_block_op_(coeff, dqcoeff, block_size, &ssz, bit_depth_)); - err_count += (ref_ret != ret) | (ref_ssz != ssz); - if (err_count && !err_count_total) { - first_failure = i; - } - err_count_total += err_count; - } - EXPECT_EQ(0, err_count_total) - << "Error: Error Block Test, C output doesn't match optimized output. " - << "First failed at test case " << first_failure; -} - -TEST_P(ErrorBlockTest, ExtremeValues) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, tran_low_t, coeff[4096]); - DECLARE_ALIGNED(16, tran_low_t, dqcoeff[4096]); - int err_count_total = 0; - int first_failure = -1; - intptr_t block_size; - int64_t ssz; - int64_t ret; - int64_t ref_ssz; - int64_t ref_ret; - const int msb = bit_depth_ + 8 - 1; - int max_val = ((1 << msb) - 1); - for (int i = 0; i < kNumIterations; ++i) { - int err_count = 0; - int k = (i / 9) % 9; - - // Change the maximum coeff value, to test different bit boundaries - if (k == 8 && (i % 9) == 0) { - max_val >>= 1; - } - block_size = 16 << (i % 9); // All block sizes from 4x4, 8x4 ..64x64 - for (int j = 0; j < block_size; j++) { - if (k < 4) { - // Test at positive maximum values - coeff[j] = k % 2 ? max_val : 0; - dqcoeff[j] = (k >> 1) % 2 ? max_val : 0; - } else if (k < 8) { - // Test at negative maximum values - coeff[j] = k % 2 ? -max_val : 0; - dqcoeff[j] = (k >> 1) % 2 ? -max_val : 0; - } else { - if (rnd(2)) { - // Positive number - coeff[j] = rnd(1 << 14); - dqcoeff[j] = rnd(1 << 14); - } else { - // Negative number - coeff[j] = -rnd(1 << 14); - dqcoeff[j] = -rnd(1 << 14); - } - } - } - ref_ret = - ref_error_block_op_(coeff, dqcoeff, block_size, &ref_ssz, bit_depth_); - ASM_REGISTER_STATE_CHECK( - ret = error_block_op_(coeff, dqcoeff, block_size, &ssz, bit_depth_)); - err_count += (ref_ret != ret) | (ref_ssz != ssz); - if (err_count && !err_count_total) { - first_failure = i; - } - err_count_total += err_count; - } - EXPECT_EQ(0, err_count_total) - << "Error: Error Block Test, C output doesn't match optimized output. " - << "First failed at test case " << first_failure; -} - -#if (HAVE_SSE2 || HAVE_AVX) -using ::testing::make_tuple; - -INSTANTIATE_TEST_CASE_P( - SSE2, ErrorBlockTest, - ::testing::Values(make_tuple(&av1_highbd_block_error_sse2, - &av1_highbd_block_error_c, AOM_BITS_10), - make_tuple(&av1_highbd_block_error_sse2, - &av1_highbd_block_error_c, AOM_BITS_12), - make_tuple(&av1_highbd_block_error_sse2, - &av1_highbd_block_error_c, AOM_BITS_8))); -#endif // HAVE_SSE2 -} // namespace diff --git a/third_party/aom/test/error_resilience_test.cc b/third_party/aom/test/error_resilience_test.cc deleted file mode 100644 index 13ac0bf93..000000000 --- a/third_party/aom/test/error_resilience_test.cc +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/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 { - -const int kMaxErrorFrames = 12; -const int kMaxInvisibleErrorFrames = 12; -const int kMaxDroppableFrames = 12; -const int kMaxErrorResilientFrames = 12; -const int kMaxNoMFMVFrames = 12; -const int kMaxPrimRefNoneFrames = 12; -const int kMaxSFrames = 12; -const int kCpuUsed = 1; - -class ErrorResilienceTestLarge - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - ErrorResilienceTestLarge() - : EncoderTest(GET_PARAM(0)), psnr_(0.0), nframes_(0), mismatch_psnr_(0.0), - mismatch_nframes_(0), encoding_mode_(GET_PARAM(1)), allow_mismatch_(0) { - Reset(); - } - - virtual ~ErrorResilienceTestLarge() {} - - void Reset() { - error_nframes_ = 0; - invisible_error_nframes_ = 0; - droppable_nframes_ = 0; - error_resilient_nframes_ = 0; - nomfmv_nframes_ = 0; - prim_ref_none_nframes_ = 0; - s_nframes_ = 0; - } - - void SetupEncoder(int bitrate, int lag) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = bitrate; - cfg_.kf_mode = AOM_KF_DISABLED; - cfg_.g_lag_in_frames = lag; - init_flags_ = AOM_CODEC_USE_PSNR; - } - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - } - - virtual void BeginPassHook(unsigned int /*pass*/) { - psnr_ = 0.0; - nframes_ = 0; - decoded_nframes_ = 0; - mismatch_psnr_ = 0.0; - mismatch_nframes_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - psnr_ += pkt->data.psnr.psnr[0]; - nframes_++; - } - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (video->frame() == 0) encoder->Control(AOME_SET_CPUUSED, kCpuUsed); - frame_flags_ &= - ~(AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF | - AOM_EFLAG_NO_REF_FRAME_MVS | AOM_EFLAG_ERROR_RESILIENT | - AOM_EFLAG_SET_S_FRAME | AOM_EFLAG_SET_PRIMARY_REF_NONE); - if (droppable_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < droppable_nframes_; ++i) { - if (droppable_frames_[i] == video->frame()) { - std::cout << " Encoding droppable frame: " - << droppable_frames_[i] << "\n"; - frame_flags_ |= (AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF); - break; - } - } - } - - if (error_resilient_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < error_resilient_nframes_; ++i) { - if (error_resilient_frames_[i] == video->frame()) { - std::cout << " Encoding error_resilient frame: " - << error_resilient_frames_[i] << "\n"; - frame_flags_ |= AOM_EFLAG_ERROR_RESILIENT; - break; - } - } - } - - if (nomfmv_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < nomfmv_nframes_; ++i) { - if (nomfmv_frames_[i] == video->frame()) { - std::cout << " Encoding no mfmv frame: " - << nomfmv_frames_[i] << "\n"; - frame_flags_ |= AOM_EFLAG_NO_REF_FRAME_MVS; - break; - } - } - } - - if (prim_ref_none_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < prim_ref_none_nframes_; ++i) { - if (prim_ref_none_frames_[i] == video->frame()) { - std::cout << " Encoding no PRIMARY_REF_NONE frame: " - << prim_ref_none_frames_[i] << "\n"; - frame_flags_ |= AOM_EFLAG_SET_PRIMARY_REF_NONE; - break; - } - } - } - - encoder->Control(AV1E_SET_S_FRAME_MODE, 0); - if (s_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < s_nframes_; ++i) { - if (s_frames_[i] == video->frame()) { - std::cout << " Encoding S frame: " << s_frames_[i] - << "\n"; - frame_flags_ |= AOM_EFLAG_SET_S_FRAME; - break; - } - } - } - } - - double GetAveragePsnr() const { - if (nframes_) return psnr_ / nframes_; - return 0.0; - } - - double GetAverageMismatchPsnr() const { - if (mismatch_nframes_) return mismatch_psnr_ / mismatch_nframes_; - return 0.0; - } - - virtual bool DoDecode() const { - if (error_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < error_nframes_; ++i) { - if (error_frames_[i] == nframes_ - 1) { - std::cout << " Skipping decoding frame: " - << error_frames_[i] << "\n"; - return 0; - } - } - } - return 1; - } - - virtual bool DoDecodeInvisible() const { - if (invisible_error_nframes_ > 0 && - (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { - for (unsigned int i = 0; i < invisible_error_nframes_; ++i) { - if (invisible_error_frames_[i] == nframes_ - 1) { - std::cout << " Skipping decoding all invisible frames in " - "frame pkt: " - << invisible_error_frames_[i] << "\n"; - return 0; - } - } - } - return 1; - } - - virtual void MismatchHook(const aom_image_t *img1, const aom_image_t *img2) { - if (allow_mismatch_) { - double mismatch_psnr = compute_psnr(img1, img2); - mismatch_psnr_ += mismatch_psnr; - ++mismatch_nframes_; - // std::cout << "Mismatch frame psnr: " << mismatch_psnr << "\n"; - } else { - ::libaom_test::EncoderTest::MismatchHook(img1, img2); - } - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - (void)img; - (void)pts; - ++decoded_nframes_; - } - - void SetErrorFrames(int num, unsigned int *list) { - if (num > kMaxErrorFrames) - num = kMaxErrorFrames; - else if (num < 0) - num = 0; - error_nframes_ = num; - for (unsigned int i = 0; i < error_nframes_; ++i) - error_frames_[i] = list[i]; - } - - void SetInvisibleErrorFrames(int num, unsigned int *list) { - if (num > kMaxInvisibleErrorFrames) - num = kMaxInvisibleErrorFrames; - else if (num < 0) - num = 0; - invisible_error_nframes_ = num; - for (unsigned int i = 0; i < invisible_error_nframes_; ++i) - invisible_error_frames_[i] = list[i]; - } - - void SetDroppableFrames(int num, unsigned int *list) { - if (num > kMaxDroppableFrames) - num = kMaxDroppableFrames; - else if (num < 0) - num = 0; - droppable_nframes_ = num; - for (unsigned int i = 0; i < droppable_nframes_; ++i) - droppable_frames_[i] = list[i]; - } - - void SetErrorResilientFrames(int num, unsigned int *list) { - if (num > kMaxErrorResilientFrames) - num = kMaxErrorResilientFrames; - else if (num < 0) - num = 0; - error_resilient_nframes_ = num; - for (unsigned int i = 0; i < error_resilient_nframes_; ++i) - error_resilient_frames_[i] = list[i]; - } - - void SetNoMFMVFrames(int num, unsigned int *list) { - if (num > kMaxNoMFMVFrames) - num = kMaxNoMFMVFrames; - else if (num < 0) - num = 0; - nomfmv_nframes_ = num; - for (unsigned int i = 0; i < nomfmv_nframes_; ++i) - nomfmv_frames_[i] = list[i]; - } - - void SetPrimaryRefNoneFrames(int num, unsigned int *list) { - if (num > kMaxPrimRefNoneFrames) - num = kMaxPrimRefNoneFrames; - else if (num < 0) - num = 0; - prim_ref_none_nframes_ = num; - for (unsigned int i = 0; i < prim_ref_none_nframes_; ++i) - prim_ref_none_frames_[i] = list[i]; - } - - void SetSFrames(int num, unsigned int *list) { - if (num > kMaxSFrames) - num = kMaxSFrames; - else if (num < 0) - num = 0; - s_nframes_ = num; - for (unsigned int i = 0; i < s_nframes_; ++i) s_frames_[i] = list[i]; - } - - unsigned int GetMismatchFrames() { return mismatch_nframes_; } - unsigned int GetEncodedFrames() { return nframes_; } - unsigned int GetDecodedFrames() { return decoded_nframes_; } - - void SetAllowMismatch(int allow) { allow_mismatch_ = allow; } - - private: - double psnr_; - unsigned int nframes_; - unsigned int decoded_nframes_; - unsigned int error_nframes_; - unsigned int invisible_error_nframes_; - unsigned int droppable_nframes_; - unsigned int error_resilient_nframes_; - unsigned int nomfmv_nframes_; - unsigned int prim_ref_none_nframes_; - unsigned int s_nframes_; - double mismatch_psnr_; - unsigned int mismatch_nframes_; - unsigned int error_frames_[kMaxErrorFrames]; - unsigned int invisible_error_frames_[kMaxInvisibleErrorFrames]; - unsigned int droppable_frames_[kMaxDroppableFrames]; - unsigned int error_resilient_frames_[kMaxErrorResilientFrames]; - unsigned int nomfmv_frames_[kMaxNoMFMVFrames]; - unsigned int prim_ref_none_frames_[kMaxPrimRefNoneFrames]; - unsigned int s_frames_[kMaxSFrames]; - libaom_test::TestMode encoding_mode_; - int allow_mismatch_; -}; - -TEST_P(ErrorResilienceTestLarge, OnVersusOff) { - SetupEncoder(2000, 10); - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - cfg_.g_timebase.den, cfg_.g_timebase.num, - 0, 12); - - // Global error resilient mode OFF. - cfg_.g_error_resilient = 0; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - const double psnr_resilience_off = GetAveragePsnr(); - EXPECT_GT(psnr_resilience_off, 25.0); - - Reset(); - // Error resilient mode ON for certain frames - unsigned int num_error_resilient_frames = 5; - unsigned int error_resilient_frame_list[] = { 3, 5, 6, 9, 11 }; - SetErrorResilientFrames(num_error_resilient_frames, - error_resilient_frame_list); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - const double psnr_resilience_on = GetAveragePsnr(); - EXPECT_GT(psnr_resilience_on, 25.0); - - // Test that turning on error resilient mode hurts by 10% at most. - if (psnr_resilience_off > 0.0) { - const double psnr_ratio = psnr_resilience_on / psnr_resilience_off; - EXPECT_GE(psnr_ratio, 0.9); - EXPECT_LE(psnr_ratio, 1.1); - } -} - -// Check for successful decoding and no encoder/decoder mismatch -// if we lose (i.e., drop before decoding) a set of droppable -// frames (i.e., frames that don't update any reference buffers). -TEST_P(ErrorResilienceTestLarge, DropFramesWithoutRecovery) { - SetupEncoder(500, 10); - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - cfg_.g_timebase.den, cfg_.g_timebase.num, - 0, 20); - - // Set an arbitrary set of error frames same as droppable frames. - unsigned int num_droppable_frames = 3; - unsigned int droppable_frame_list[] = { 5, 10, 13 }; - SetDroppableFrames(num_droppable_frames, droppable_frame_list); - SetErrorFrames(num_droppable_frames, droppable_frame_list); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - // Test that no mismatches have been found - std::cout << " Encoded frames: " << GetEncodedFrames() << "\n"; - std::cout << " Decoded frames: " << GetDecodedFrames() << "\n"; - std::cout << " Mismatch frames: " << GetMismatchFrames() << "\n"; - EXPECT_EQ(GetEncodedFrames() - GetDecodedFrames(), num_droppable_frames); -} - -// Check for ParseAbility property of an error-resilient frame. -// Encode a frame in error-resilient mode (E-frame), and disallow all -// subsequent frames from using MFMV. If frames are dropped before the -// E frame, all frames starting from the E frame should be parse-able. -TEST_P(ErrorResilienceTestLarge, ParseAbilityTest) { - SetupEncoder(500, 10); - - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - cfg_.g_timebase.den, cfg_.g_timebase.num, - 0, 15); - - SetAllowMismatch(1); - - // Note that an E-frame cannot be forced on a frame that is a - // show_existing_frame, or a frame that comes directly after an invisible - // frame. Currently, this will cause an assertion failure. - // Set an arbitrary error resilient (E) frame - unsigned int num_error_resilient_frames = 1; - unsigned int error_resilient_frame_list[] = { 8 }; - SetErrorResilientFrames(num_error_resilient_frames, - error_resilient_frame_list); - // Ensure that any invisible frames before the E frame are dropped - SetInvisibleErrorFrames(num_error_resilient_frames, - error_resilient_frame_list); - // Set all frames after the error resilient frame to not allow MFMV - unsigned int num_post_error_resilient_frames = 6; - unsigned int post_error_resilient_frame_list[] = { 9, 10, 11, 12, 13, 14 }; - SetNoMFMVFrames(num_post_error_resilient_frames, - post_error_resilient_frame_list); - - // Set a few frames before the E frame that are lost (not decoded) - unsigned int num_error_frames = 5; - unsigned int error_frame_list[] = { 3, 4, 5, 6, 7 }; - SetErrorFrames(num_error_frames, error_frame_list); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::cout << " Encoded frames: " << GetEncodedFrames() << "\n"; - std::cout << " Decoded frames: " << GetDecodedFrames() << "\n"; - std::cout << " Mismatch frames: " << GetMismatchFrames() << "\n"; - EXPECT_EQ(GetEncodedFrames() - GetDecodedFrames(), num_error_frames); - // All frames following the E-frame and the E-frame are expected to have - // mismatches, but still be parse-able. - EXPECT_LE(GetMismatchFrames(), num_post_error_resilient_frames + 1); -} - -// Check for ParseAbility property of an S frame. -// Encode an S-frame. If frames are dropped before the S-frame, all frames -// starting from the S frame should be parse-able. -TEST_P(ErrorResilienceTestLarge, SFrameTest) { - SetupEncoder(500, 10); - - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - cfg_.g_timebase.den, cfg_.g_timebase.num, - 0, 15); - - SetAllowMismatch(1); - - // Note that an S-frame cannot be forced on a frame that is a - // show_existing_frame. This issue still needs to be addressed. - // Set an arbitrary S-frame - unsigned int num_s_frames = 1; - unsigned int s_frame_list[] = { 6 }; - SetSFrames(num_s_frames, s_frame_list); - // Ensure that any invisible frames before the S frame are dropped - SetInvisibleErrorFrames(num_s_frames, s_frame_list); - - // Set a few frames before the S frame that are lost (not decoded) - unsigned int num_error_frames = 4; - unsigned int error_frame_list[] = { 2, 3, 4, 5 }; - SetErrorFrames(num_error_frames, error_frame_list); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::cout << " Encoded frames: " << GetEncodedFrames() << "\n"; - std::cout << " Decoded frames: " << GetDecodedFrames() << "\n"; - std::cout << " Mismatch frames: " << GetMismatchFrames() << "\n"; - EXPECT_EQ(GetEncodedFrames() - GetDecodedFrames(), num_error_frames); - // All frames following the S-frame and the S-frame are expected to have - // mismatches, but still be parse-able. - EXPECT_LE(GetMismatchFrames(), GetEncodedFrames() - s_frame_list[0]); -} - -AV1_INSTANTIATE_TEST_CASE(ErrorResilienceTestLarge, NONREALTIME_TEST_MODES); -} // namespace diff --git a/third_party/aom/test/ethread_test.cc b/third_party/aom/test/ethread_test.cc deleted file mode 100644 index d9ac78282..000000000 --- a/third_party/aom/test/ethread_test.cc +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> -#include <vector> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/md5_helper.h" -#include "test/util.h" -#include "test/yuv_video_source.h" - -namespace { -class AVxEncoderThreadTest - : public ::libaom_test::CodecTestWith4Params<libaom_test::TestMode, int, - int, int>, - public ::libaom_test::EncoderTest { - protected: - AVxEncoderThreadTest() - : EncoderTest(GET_PARAM(0)), encoder_initialized_(false), - encoding_mode_(GET_PARAM(1)), set_cpu_used_(GET_PARAM(2)), - tile_cols_(GET_PARAM(3)), tile_rows_(GET_PARAM(4)) { - init_flags_ = AOM_CODEC_USE_PSNR; - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.w = 1280; - cfg.h = 720; - cfg.allow_lowbitdepth = 1; - decoder_ = codec_->CreateDecoder(cfg, 0); - if (decoder_->IsAV1()) { - decoder_->Control(AV1_SET_DECODE_TILE_ROW, -1); - decoder_->Control(AV1_SET_DECODE_TILE_COL, -1); - } - - size_enc_.clear(); - md5_dec_.clear(); - md5_enc_.clear(); - } - virtual ~AVxEncoderThreadTest() { delete decoder_; } - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - - if (encoding_mode_ != ::libaom_test::kRealTime) { - cfg_.g_lag_in_frames = 5; - cfg_.rc_end_usage = AOM_VBR; - cfg_.rc_2pass_vbr_minsection_pct = 5; - cfg_.rc_2pass_vbr_maxsection_pct = 2000; - } else { - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_CBR; - cfg_.g_error_resilient = 1; - } - cfg_.rc_max_quantizer = 56; - cfg_.rc_min_quantizer = 0; - } - - virtual void BeginPassHook(unsigned int /*pass*/) { - encoder_initialized_ = false; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource * /*video*/, - ::libaom_test::Encoder *encoder) { - if (!encoder_initialized_) { - SetTileSize(encoder); - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - encoder->Control(AV1E_SET_ROW_MT, row_mt_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 0); - } else { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 0); - encoder->Control(AV1E_SET_AQ_MODE, 3); - } - encoder_initialized_ = true; - } - } - - virtual void SetTileSize(libaom_test::Encoder *encoder) { - encoder->Control(AV1E_SET_TILE_COLUMNS, tile_cols_); - encoder->Control(AV1E_SET_TILE_ROWS, tile_rows_); - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - size_enc_.push_back(pkt->data.frame.sz); - - ::libaom_test::MD5 md5_enc; - md5_enc.Add(reinterpret_cast<uint8_t *>(pkt->data.frame.buf), - pkt->data.frame.sz); - md5_enc_.push_back(md5_enc.Get()); - - const aom_codec_err_t res = decoder_->DecodeFrame( - reinterpret_cast<uint8_t *>(pkt->data.frame.buf), pkt->data.frame.sz); - if (res != AOM_CODEC_OK) { - abort_ = true; - ASSERT_EQ(AOM_CODEC_OK, res); - } - const aom_image_t *img = decoder_->GetDxData().Next(); - - if (img) { - ::libaom_test::MD5 md5_res; - md5_res.Add(img); - md5_dec_.push_back(md5_res.Get()); - } - } - - void DoTest() { - ::libaom_test::YUVVideoSource video( - "niklas_640_480_30.yuv", AOM_IMG_FMT_I420, 640, 480, 30, 1, 15, 21); - cfg_.rc_target_bitrate = 1000; - - // Encode using single thread. - row_mt_ = 0; - cfg_.g_threads = 1; - init_flags_ = AOM_CODEC_USE_PSNR; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::vector<size_t> single_thr_size_enc; - std::vector<std::string> single_thr_md5_enc; - std::vector<std::string> single_thr_md5_dec; - single_thr_size_enc = size_enc_; - single_thr_md5_enc = md5_enc_; - single_thr_md5_dec = md5_dec_; - size_enc_.clear(); - md5_enc_.clear(); - md5_dec_.clear(); - - // Encode using multiple threads. - cfg_.g_threads = 4; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::vector<size_t> multi_thr_size_enc; - std::vector<std::string> multi_thr_md5_enc; - std::vector<std::string> multi_thr_md5_dec; - multi_thr_size_enc = size_enc_; - multi_thr_md5_enc = md5_enc_; - multi_thr_md5_dec = md5_dec_; - size_enc_.clear(); - md5_enc_.clear(); - md5_dec_.clear(); - - // Check that the vectors are equal. - ASSERT_EQ(single_thr_size_enc, multi_thr_size_enc); - ASSERT_EQ(single_thr_md5_enc, multi_thr_md5_enc); - ASSERT_EQ(single_thr_md5_dec, multi_thr_md5_dec); - - // Encode using multiple threads row-mt enabled. - row_mt_ = 1; - cfg_.g_threads = 2; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::vector<size_t> multi_thr2_row_mt_size_enc; - std::vector<std::string> multi_thr2_row_mt_md5_enc; - std::vector<std::string> multi_thr2_row_mt_md5_dec; - multi_thr2_row_mt_size_enc = size_enc_; - multi_thr2_row_mt_md5_enc = md5_enc_; - multi_thr2_row_mt_md5_dec = md5_dec_; - size_enc_.clear(); - md5_enc_.clear(); - md5_dec_.clear(); - - // Disable threads=3 test for now to reduce the time so that the nightly - // test would not time out. - // cfg_.g_threads = 3; - // ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - // std::vector<size_t> multi_thr3_row_mt_size_enc; - // std::vector<std::string> multi_thr3_row_mt_md5_enc; - // std::vector<std::string> multi_thr3_row_mt_md5_dec; - // multi_thr3_row_mt_size_enc = size_enc_; - // multi_thr3_row_mt_md5_enc = md5_enc_; - // multi_thr3_row_mt_md5_dec = md5_dec_; - // size_enc_.clear(); - // md5_enc_.clear(); - // md5_dec_.clear(); - // Check that the vectors are equal. - // ASSERT_EQ(multi_thr3_row_mt_size_enc, multi_thr2_row_mt_size_enc); - // ASSERT_EQ(multi_thr3_row_mt_md5_enc, multi_thr2_row_mt_md5_enc); - // ASSERT_EQ(multi_thr3_row_mt_md5_dec, multi_thr2_row_mt_md5_dec); - - cfg_.g_threads = 4; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - std::vector<size_t> multi_thr4_row_mt_size_enc; - std::vector<std::string> multi_thr4_row_mt_md5_enc; - std::vector<std::string> multi_thr4_row_mt_md5_dec; - multi_thr4_row_mt_size_enc = size_enc_; - multi_thr4_row_mt_md5_enc = md5_enc_; - multi_thr4_row_mt_md5_dec = md5_dec_; - size_enc_.clear(); - md5_enc_.clear(); - md5_dec_.clear(); - - // Check that the vectors are equal. - ASSERT_EQ(multi_thr4_row_mt_size_enc, multi_thr2_row_mt_size_enc); - ASSERT_EQ(multi_thr4_row_mt_md5_enc, multi_thr2_row_mt_md5_enc); - ASSERT_EQ(multi_thr4_row_mt_md5_dec, multi_thr2_row_mt_md5_dec); - } - - bool encoder_initialized_; - ::libaom_test::TestMode encoding_mode_; - int set_cpu_used_; - int tile_cols_; - int tile_rows_; - int row_mt_; - ::libaom_test::Decoder *decoder_; - std::vector<size_t> size_enc_; - std::vector<std::string> md5_enc_; - std::vector<std::string> md5_dec_; -}; - -TEST_P(AVxEncoderThreadTest, EncoderResultTest) { - cfg_.large_scale_tile = 0; - decoder_->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -class AVxEncoderThreadTestLarge : public AVxEncoderThreadTest {}; - -TEST_P(AVxEncoderThreadTestLarge, EncoderResultTest) { - cfg_.large_scale_tile = 0; - decoder_->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -// For AV1, only test speed 0 to 3. -// Here test cpu_used 2 and 3 -AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadTest, - ::testing::Values(::libaom_test::kTwoPassGood), - ::testing::Range(2, 4), ::testing::Values(0, 2), - ::testing::Values(0, 1)); - -// Test cpu_used 0 and 1. -AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadTestLarge, - ::testing::Values(::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood), - ::testing::Range(0, 2), ::testing::Values(0, 1, 2, 6), - ::testing::Values(0, 1, 2, 6)); - -class AVxEncoderThreadLSTest : public AVxEncoderThreadTest { - virtual void SetTileSize(libaom_test::Encoder *encoder) { - encoder->Control(AV1E_SET_TILE_COLUMNS, tile_cols_); - encoder->Control(AV1E_SET_TILE_ROWS, tile_rows_); - } -}; - -TEST_P(AVxEncoderThreadLSTest, EncoderResultTest) { - cfg_.large_scale_tile = 1; - decoder_->Control(AV1_SET_TILE_MODE, 1); - decoder_->Control(AV1D_EXT_TILE_DEBUG, 1); - DoTest(); -} - -class AVxEncoderThreadLSTestLarge : public AVxEncoderThreadLSTest {}; - -TEST_P(AVxEncoderThreadLSTestLarge, EncoderResultTest) { - cfg_.large_scale_tile = 1; - decoder_->Control(AV1_SET_TILE_MODE, 1); - decoder_->Control(AV1D_EXT_TILE_DEBUG, 1); - DoTest(); -} - -AV1_INSTANTIATE_TEST_CASE(AVxEncoderThreadLSTestLarge, - ::testing::Values(::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood), - ::testing::Range(0, 4), ::testing::Values(0, 6), - ::testing::Values(0, 6)); -} // namespace diff --git a/third_party/aom/test/examples.sh b/third_party/aom/test/examples.sh deleted file mode 100755 index 2cdb89dd0..000000000 --- a/third_party/aom/test/examples.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file runs all of the tests for the libaom examples. -## -. $(dirname $0)/tools_common.sh - -example_tests=$(ls -r $(dirname $0)/*.sh) - -# List of script names to exclude. -exclude_list="best_encode examples run_encodes tools_common" - -# Filter out the scripts in $exclude_list. -for word in ${exclude_list}; do - example_tests=$(filter_strings "${example_tests}" "${word}" exclude) -done - -for test in ${example_tests}; do - # Source each test script so that exporting variables can be avoided. - AOM_TEST_NAME="$(basename ${test%.*})" - . "${test}" -done diff --git a/third_party/aom/test/external_frame_buffer_test.cc b/third_party/aom/test/external_frame_buffer_test.cc deleted file mode 100644 index c2af059a4..000000000 --- a/third_party/aom/test/external_frame_buffer_test.cc +++ /dev/null @@ -1,512 +0,0 @@ -/* - * 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 <string> - -#include "config/aom_config.h" -#include "test/codec_factory.h" -#include "test/decode_test_driver.h" -#include "test/ivf_video_source.h" -#include "test/md5_helper.h" -#include "test/test_vectors.h" -#include "test/util.h" -#if CONFIG_WEBM_IO -#include "test/webm_video_source.h" -#endif - -namespace { - -const int kVideoNameParam = 1; - -struct ExternalFrameBuffer { - uint8_t *data; - size_t size; - int in_use; -}; - -// Class to manipulate a list of external frame buffers. -class ExternalFrameBufferList { - public: - ExternalFrameBufferList() - : num_buffers_(0), num_used_buffers_(0), ext_fb_list_(NULL) {} - - virtual ~ExternalFrameBufferList() { - for (int i = 0; i < num_buffers_; ++i) { - delete[] ext_fb_list_[i].data; - } - delete[] ext_fb_list_; - } - - // Creates the list to hold the external buffers. Returns true on success. - bool CreateBufferList(int num_buffers) { - if (num_buffers < 0) return false; - - num_buffers_ = num_buffers; - ext_fb_list_ = new ExternalFrameBuffer[num_buffers_]; - EXPECT_TRUE(ext_fb_list_ != NULL); - memset(ext_fb_list_, 0, sizeof(ext_fb_list_[0]) * num_buffers_); - return true; - } - - // Searches the frame buffer list for a free frame buffer. Makes sure - // that the frame buffer is at least |min_size| in bytes. Marks that the - // frame buffer is in use by libvpx. Finally sets |fb| to point to the - // external frame buffer. Returns < 0 on an error. - int GetFreeFrameBuffer(size_t min_size, aom_codec_frame_buffer_t *fb) { - EXPECT_TRUE(fb != NULL); - const int idx = FindFreeBufferIndex(); - if (idx == num_buffers_) return -1; - - if (ext_fb_list_[idx].size < min_size) { - delete[] ext_fb_list_[idx].data; - ext_fb_list_[idx].data = new uint8_t[min_size]; - memset(ext_fb_list_[idx].data, 0, min_size); - ext_fb_list_[idx].size = min_size; - } - - SetFrameBuffer(idx, fb); - - num_used_buffers_++; - return 0; - } - - // Test function that will not allocate any data for the frame buffer. - // Returns < 0 on an error. - int GetZeroFrameBuffer(size_t min_size, aom_codec_frame_buffer_t *fb) { - EXPECT_TRUE(fb != NULL); - const int idx = FindFreeBufferIndex(); - if (idx == num_buffers_) return -1; - - if (ext_fb_list_[idx].size < min_size) { - delete[] ext_fb_list_[idx].data; - ext_fb_list_[idx].data = NULL; - ext_fb_list_[idx].size = min_size; - } - - SetFrameBuffer(idx, fb); - return 0; - } - - // Marks the external frame buffer that |fb| is pointing to as free. - // Returns < 0 on an error. - int ReturnFrameBuffer(aom_codec_frame_buffer_t *fb) { - if (fb == NULL) { - EXPECT_TRUE(fb != NULL); - return -1; - } - ExternalFrameBuffer *const ext_fb = - reinterpret_cast<ExternalFrameBuffer *>(fb->priv); - if (ext_fb == NULL) { - EXPECT_TRUE(ext_fb != NULL); - return -1; - } - EXPECT_EQ(1, ext_fb->in_use); - ext_fb->in_use = 0; - num_used_buffers_--; - return 0; - } - - // Checks that the ximage data is contained within the external frame buffer - // private data passed back in the ximage. - void CheckXImageFrameBuffer(const aom_image_t *img) { - if (img->fb_priv != NULL) { - const struct ExternalFrameBuffer *const ext_fb = - reinterpret_cast<ExternalFrameBuffer *>(img->fb_priv); - - ASSERT_TRUE(img->planes[0] >= ext_fb->data && - img->planes[0] < (ext_fb->data + ext_fb->size)); - } - } - - int num_used_buffers() const { return num_used_buffers_; } - - private: - // Returns the index of the first free frame buffer. Returns |num_buffers_| - // if there are no free frame buffers. - int FindFreeBufferIndex() { - int i; - // Find a free frame buffer. - for (i = 0; i < num_buffers_; ++i) { - if (!ext_fb_list_[i].in_use) break; - } - return i; - } - - // Sets |fb| to an external frame buffer. idx is the index into the frame - // buffer list. - void SetFrameBuffer(int idx, aom_codec_frame_buffer_t *fb) { - ASSERT_TRUE(fb != NULL); - fb->data = ext_fb_list_[idx].data; - fb->size = ext_fb_list_[idx].size; - ASSERT_EQ(0, ext_fb_list_[idx].in_use); - ext_fb_list_[idx].in_use = 1; - fb->priv = &ext_fb_list_[idx]; - } - - int num_buffers_; - int num_used_buffers_; - ExternalFrameBuffer *ext_fb_list_; -}; - -#if CONFIG_WEBM_IO - -// Callback used by libvpx to request the application to return a frame -// buffer of at least |min_size| in bytes. -int get_aom_frame_buffer(void *user_priv, size_t min_size, - aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferList *const fb_list = - reinterpret_cast<ExternalFrameBufferList *>(user_priv); - return fb_list->GetFreeFrameBuffer(min_size, fb); -} - -// Callback used by libvpx to tell the application that |fb| is not needed -// anymore. -int release_aom_frame_buffer(void *user_priv, aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferList *const fb_list = - reinterpret_cast<ExternalFrameBufferList *>(user_priv); - return fb_list->ReturnFrameBuffer(fb); -} - -// Callback will not allocate data for frame buffer. -int get_aom_zero_frame_buffer(void *user_priv, size_t min_size, - aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferList *const fb_list = - reinterpret_cast<ExternalFrameBufferList *>(user_priv); - return fb_list->GetZeroFrameBuffer(min_size, fb); -} - -// Callback will allocate one less byte than |min_size|. -int get_aom_one_less_byte_frame_buffer(void *user_priv, size_t min_size, - aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferList *const fb_list = - reinterpret_cast<ExternalFrameBufferList *>(user_priv); - return fb_list->GetFreeFrameBuffer(min_size - 1, fb); -} - -// Callback will not release the external frame buffer. -int do_not_release_aom_frame_buffer(void *user_priv, - aom_codec_frame_buffer_t *fb) { - (void)user_priv; - (void)fb; - return 0; -} - -#endif // CONFIG_WEBM_IO - -// Class for testing passing in external frame buffers to libaom. -class ExternalFrameBufferMD5Test - : public ::libaom_test::DecoderTest, - public ::libaom_test::CodecTestWithParam<const char *> { - protected: - ExternalFrameBufferMD5Test() - : DecoderTest(GET_PARAM(::libaom_test::kCodecFactoryParam)), - md5_file_(NULL), num_buffers_(0) {} - - virtual ~ExternalFrameBufferMD5Test() { - if (md5_file_ != NULL) fclose(md5_file_); - } - - virtual void PreDecodeFrameHook( - const libaom_test::CompressedVideoSource &video, - libaom_test::Decoder *decoder) { - if (num_buffers_ > 0 && video.frame_number() == 0) { - // Have libvpx use frame buffers we create. - ASSERT_TRUE(fb_list_.CreateBufferList(num_buffers_)); - ASSERT_EQ(AOM_CODEC_OK, - decoder->SetFrameBufferFunctions(GetAV1FrameBuffer, - ReleaseAV1FrameBuffer, this)); - } - } - - void OpenMD5File(const std::string &md5_file_name_) { - md5_file_ = libaom_test::OpenTestDataFile(md5_file_name_); - ASSERT_TRUE(md5_file_ != NULL) - << "Md5 file open failed. Filename: " << md5_file_name_; - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - const unsigned int frame_number) { - ASSERT_TRUE(md5_file_ != NULL); - char expected_md5[33]; - char junk[128]; - - // Read correct md5 checksums. - const int res = fscanf(md5_file_, "%s %s", expected_md5, junk); - ASSERT_NE(EOF, res) << "Read md5 data failed"; - expected_md5[32] = '\0'; - - ::libaom_test::MD5 md5_res; - md5_res.Add(&img); - const char *const actual_md5 = md5_res.Get(); - - // Check md5 match. - ASSERT_STREQ(expected_md5, actual_md5) - << "Md5 checksums don't match: frame number = " << frame_number; - } - - // Callback to get a free external frame buffer. Return value < 0 is an - // error. - static int GetAV1FrameBuffer(void *user_priv, size_t min_size, - aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferMD5Test *const md5Test = - reinterpret_cast<ExternalFrameBufferMD5Test *>(user_priv); - return md5Test->fb_list_.GetFreeFrameBuffer(min_size, fb); - } - - // Callback to release an external frame buffer. Return value < 0 is an - // error. - static int ReleaseAV1FrameBuffer(void *user_priv, - aom_codec_frame_buffer_t *fb) { - ExternalFrameBufferMD5Test *const md5Test = - reinterpret_cast<ExternalFrameBufferMD5Test *>(user_priv); - return md5Test->fb_list_.ReturnFrameBuffer(fb); - } - - void set_num_buffers(int num_buffers) { num_buffers_ = num_buffers; } - int num_buffers() const { return num_buffers_; } - - private: - FILE *md5_file_; - int num_buffers_; - ExternalFrameBufferList fb_list_; -}; - -#if CONFIG_WEBM_IO -const char kAV1TestFile[] = "av1-1-b8-01-size-226x226.ivf"; -const char kAV1NonRefTestFile[] = "av1-1-b8-01-size-226x226.ivf"; - -// Class for testing passing in external frame buffers to libvpx. -class ExternalFrameBufferTest : public ::testing::Test { - protected: - ExternalFrameBufferTest() : video_(NULL), decoder_(NULL), num_buffers_(0) {} - - virtual void SetUp() { - video_ = new libaom_test::IVFVideoSource(kAV1TestFile); - ASSERT_TRUE(video_ != NULL); - video_->Init(); - video_->Begin(); - - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - decoder_ = new libaom_test::AV1Decoder(cfg, 0); - ASSERT_TRUE(decoder_ != NULL); - } - - virtual void TearDown() { - delete decoder_; - decoder_ = NULL; - delete video_; - video_ = NULL; - } - - // Passes the external frame buffer information to libvpx. - aom_codec_err_t SetFrameBufferFunctions( - int num_buffers, aom_get_frame_buffer_cb_fn_t cb_get, - aom_release_frame_buffer_cb_fn_t cb_release) { - if (num_buffers > 0) { - num_buffers_ = num_buffers; - EXPECT_TRUE(fb_list_.CreateBufferList(num_buffers_)); - } - - return decoder_->SetFrameBufferFunctions(cb_get, cb_release, &fb_list_); - } - - aom_codec_err_t DecodeOneFrame() { - const aom_codec_err_t res = - decoder_->DecodeFrame(video_->cxdata(), video_->frame_size()); - CheckDecodedFrames(); - if (res == AOM_CODEC_OK) video_->Next(); - return res; - } - - aom_codec_err_t DecodeRemainingFrames() { - for (; video_->cxdata() != NULL; video_->Next()) { - const aom_codec_err_t res = - decoder_->DecodeFrame(video_->cxdata(), video_->frame_size()); - if (res != AOM_CODEC_OK) return res; - CheckDecodedFrames(); - } - return AOM_CODEC_OK; - } - - protected: - void CheckDecodedFrames() { - libaom_test::DxDataIterator dec_iter = decoder_->GetDxData(); - const aom_image_t *img = NULL; - - // Get decompressed data - while ((img = dec_iter.Next()) != NULL) { - fb_list_.CheckXImageFrameBuffer(img); - } - } - - libaom_test::IVFVideoSource *video_; - libaom_test::AV1Decoder *decoder_; - int num_buffers_; - ExternalFrameBufferList fb_list_; -}; - -class ExternalFrameBufferNonRefTest : public ExternalFrameBufferTest { - protected: - virtual void SetUp() { - video_ = new libaom_test::IVFVideoSource(kAV1NonRefTestFile); - ASSERT_TRUE(video_ != NULL); - video_->Init(); - video_->Begin(); - - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - decoder_ = new libaom_test::AV1Decoder(cfg, 0); - ASSERT_TRUE(decoder_ != NULL); - } - - virtual void CheckFrameBufferRelease() { - TearDown(); - ASSERT_EQ(0, fb_list_.num_used_buffers()); - } -}; -#endif // CONFIG_WEBM_IO - -// This test runs through the set of test vectors, and decodes them. -// Libvpx will call into the application to allocate a frame buffer when -// needed. The md5 checksums are computed for each frame in the video file. -// If md5 checksums match the correct md5 data, then the test is passed. -// Otherwise, the test failed. -TEST_P(ExternalFrameBufferMD5Test, DISABLED_ExtFBMD5Match) { - const std::string filename = GET_PARAM(kVideoNameParam); - - // Number of buffers equals #AOM_MAXIMUM_REF_BUFFERS + - // #AOM_MAXIMUM_WORK_BUFFERS + four jitter buffers. - const int jitter_buffers = 4; - const int num_buffers = - AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS + jitter_buffers; - set_num_buffers(num_buffers); - - // Open compressed video file. - testing::internal::scoped_ptr<libaom_test::CompressedVideoSource> video; - if (filename.substr(filename.length() - 3, 3) == "ivf") { - video.reset(new libaom_test::IVFVideoSource(filename)); - } else { -#if CONFIG_WEBM_IO - video.reset(new libaom_test::WebMVideoSource(filename)); -#else - fprintf(stderr, "WebM IO is disabled, skipping test vector %s\n", - filename.c_str()); - return; -#endif - } - ASSERT_TRUE(video.get() != NULL); - video->Init(); - - // Construct md5 file name. - const std::string md5_filename = filename + ".md5"; - OpenMD5File(md5_filename); - - // Decode frame, and check the md5 matching. - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); -} - -#if CONFIG_WEBM_IO -TEST_F(ExternalFrameBufferTest, MinFrameBuffers) { - // Minimum number of external frame buffers for AV1 is - // #AOM_MAXIMUM_REF_BUFFERS + #AOM_MAXIMUM_WORK_BUFFERS. - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_OK, DecodeRemainingFrames()); -} - -TEST_F(ExternalFrameBufferTest, EightJitterBuffers) { - // Number of buffers equals #AOM_MAXIMUM_REF_BUFFERS + - // #AOM_MAXIMUM_WORK_BUFFERS + eight jitter buffers. - const int jitter_buffers = 8; - const int num_buffers = - AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS + jitter_buffers; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_OK, DecodeRemainingFrames()); -} - -TEST_F(ExternalFrameBufferTest, DISABLED_NotEnoughBuffers) { - // Minimum number of external frame buffers for AV1 is - // #AOM_MAXIMUM_REF_BUFFERS + #AOM_MAXIMUM_WORK_BUFFERS. Most files will - // only use 5 frame buffers at one time. - const int num_buffers = 2; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_OK, DecodeOneFrame()); - // Only run this on long clips. Decoding a very short clip will return - // AOM_CODEC_OK even with only 2 buffers. - ASSERT_EQ(AOM_CODEC_MEM_ERROR, DecodeRemainingFrames()); -} - -TEST_F(ExternalFrameBufferTest, DISABLED_NoRelease) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - do_not_release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_OK, DecodeOneFrame()); - ASSERT_EQ(AOM_CODEC_MEM_ERROR, DecodeRemainingFrames()); -} - -TEST_F(ExternalFrameBufferTest, NullRealloc) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_zero_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_MEM_ERROR, DecodeOneFrame()); -} - -TEST_F(ExternalFrameBufferTest, ReallocOneLessByte) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, SetFrameBufferFunctions( - num_buffers, get_aom_one_less_byte_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_MEM_ERROR, DecodeOneFrame()); -} - -TEST_F(ExternalFrameBufferTest, NullGetFunction) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ( - AOM_CODEC_INVALID_PARAM, - SetFrameBufferFunctions(num_buffers, NULL, release_aom_frame_buffer)); -} - -TEST_F(ExternalFrameBufferTest, NullReleaseFunction) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_INVALID_PARAM, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, NULL)); -} - -TEST_F(ExternalFrameBufferTest, SetAfterDecode) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, DecodeOneFrame()); - ASSERT_EQ(AOM_CODEC_ERROR, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - release_aom_frame_buffer)); -} - -TEST_F(ExternalFrameBufferNonRefTest, ReleaseNonRefFrameBuffer) { - const int num_buffers = AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; - ASSERT_EQ(AOM_CODEC_OK, - SetFrameBufferFunctions(num_buffers, get_aom_frame_buffer, - release_aom_frame_buffer)); - ASSERT_EQ(AOM_CODEC_OK, DecodeRemainingFrames()); - CheckFrameBufferRelease(); -} -#endif // CONFIG_WEBM_IO - -AV1_INSTANTIATE_TEST_CASE( - ExternalFrameBufferMD5Test, - ::testing::ValuesIn(libaom_test::kAV1TestVectors, - libaom_test::kAV1TestVectors + - libaom_test::kNumAV1TestVectors)); -} // namespace diff --git a/third_party/aom/test/fft_test.cc b/third_party/aom/test/fft_test.cc deleted file mode 100644 index e24e451a3..000000000 --- a/third_party/aom/test/fft_test.cc +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> - -#include <algorithm> -#include <complex> -#include <vector> - -#include "aom_dsp/fft_common.h" -#include "aom_mem/aom_mem.h" -#include "av1/common/common.h" -#include "config/aom_dsp_rtcd.h" -#include "test/acm_random.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -typedef void (*tform_fun_t)(const float *input, float *temp, float *output); - -// Simple 1D FFT implementation -template <typename InputType> -void fft(const InputType *data, std::complex<float> *result, int n) { - if (n == 1) { - result[0] = data[0]; - return; - } - std::vector<InputType> temp(n); - for (int k = 0; k < n / 2; ++k) { - temp[k] = data[2 * k]; - temp[n / 2 + k] = data[2 * k + 1]; - } - fft(&temp[0], result, n / 2); - fft(&temp[n / 2], result + n / 2, n / 2); - for (int k = 0; k < n / 2; ++k) { - std::complex<float> w = std::complex<float>((float)cos(2. * PI * k / n), - (float)-sin(2. * PI * k / n)); - std::complex<float> a = result[k]; - std::complex<float> b = result[n / 2 + k]; - result[k] = a + w * b; - result[n / 2 + k] = a - w * b; - } -} - -void transpose(std::vector<std::complex<float> > *data, int n) { - for (int y = 0; y < n; ++y) { - for (int x = y + 1; x < n; ++x) { - std::swap((*data)[y * n + x], (*data)[x * n + y]); - } - } -} - -// Simple 2D FFT implementation -template <class InputType> -std::vector<std::complex<float> > fft2d(const InputType *input, int n) { - std::vector<std::complex<float> > rowfft(n * n); - std::vector<std::complex<float> > result(n * n); - for (int y = 0; y < n; ++y) { - fft(input + y * n, &rowfft[y * n], n); - } - transpose(&rowfft, n); - for (int y = 0; y < n; ++y) { - fft(&rowfft[y * n], &result[y * n], n); - } - transpose(&result, n); - return result; -} - -struct FFTTestArg { - int n; - void (*fft)(const float *input, float *temp, float *output); - FFTTestArg(int n_in, tform_fun_t fft_in) : n(n_in), fft(fft_in) {} -}; - -std::ostream &operator<<(std::ostream &os, const FFTTestArg &test_arg) { - return os << "fft_arg { n:" << test_arg.n << " fft:" << test_arg.fft << " }"; -} - -class FFT2DTest : public ::testing::TestWithParam<FFTTestArg> { - protected: - void SetUp() { - int n = GetParam().n; - input_ = (float *)aom_memalign(32, sizeof(*input_) * n * n); - temp_ = (float *)aom_memalign(32, sizeof(*temp_) * n * n); - output_ = (float *)aom_memalign(32, sizeof(*output_) * n * n * 2); - memset(input_, 0, sizeof(*input_) * n * n); - memset(temp_, 0, sizeof(*temp_) * n * n); - memset(output_, 0, sizeof(*output_) * n * n * 2); - } - void TearDown() { - aom_free(input_); - aom_free(temp_); - aom_free(output_); - } - float *input_; - float *temp_; - float *output_; -}; - -TEST_P(FFT2DTest, Correct) { - int n = GetParam().n; - for (int i = 0; i < n * n; ++i) { - input_[i] = 1; - std::vector<std::complex<float> > expected = fft2d<float>(&input_[0], n); - GetParam().fft(&input_[0], &temp_[0], &output_[0]); - for (int y = 0; y < n; ++y) { - for (int x = 0; x < (n / 2) + 1; ++x) { - EXPECT_NEAR(expected[y * n + x].real(), output_[2 * (y * n + x)], 1e-5); - EXPECT_NEAR(expected[y * n + x].imag(), output_[2 * (y * n + x) + 1], - 1e-5); - } - } - input_[i] = 0; - } -} - -TEST_P(FFT2DTest, Benchmark) { - int n = GetParam().n; - float sum = 0; - for (int i = 0; i < 1000 * (64 - n); ++i) { - input_[i % (n * n)] = 1; - GetParam().fft(&input_[0], &temp_[0], &output_[0]); - sum += output_[0]; - input_[i % (n * n)] = 0; - } -} - -INSTANTIATE_TEST_CASE_P(C, FFT2DTest, - ::testing::Values(FFTTestArg(2, aom_fft2x2_float_c), - FFTTestArg(4, aom_fft4x4_float_c), - FFTTestArg(8, aom_fft8x8_float_c), - FFTTestArg(16, aom_fft16x16_float_c), - FFTTestArg(32, - aom_fft32x32_float_c))); -#if ARCH_X86 || ARCH_X86_64 -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, FFT2DTest, - ::testing::Values(FFTTestArg(4, aom_fft4x4_float_sse2), - FFTTestArg(8, aom_fft8x8_float_sse2), - FFTTestArg(16, aom_fft16x16_float_sse2), - FFTTestArg(32, aom_fft32x32_float_sse2))); -#endif // HAVE_SSE2 -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, FFT2DTest, - ::testing::Values(FFTTestArg(8, aom_fft8x8_float_avx2), - FFTTestArg(16, aom_fft16x16_float_avx2), - FFTTestArg(32, aom_fft32x32_float_avx2))); -#endif // HAVE_AVX2 -#endif // ARCH_X86 || ARCH_X86_64 - -struct IFFTTestArg { - int n; - tform_fun_t ifft; - IFFTTestArg(int n_in, tform_fun_t ifft_in) : n(n_in), ifft(ifft_in) {} -}; - -std::ostream &operator<<(std::ostream &os, const IFFTTestArg &test_arg) { - return os << "ifft_arg { n:" << test_arg.n << " fft:" << test_arg.ifft - << " }"; -} - -class IFFT2DTest : public ::testing::TestWithParam<IFFTTestArg> { - protected: - void SetUp() { - int n = GetParam().n; - input_ = (float *)aom_memalign(32, sizeof(*input_) * n * n * 2); - temp_ = (float *)aom_memalign(32, sizeof(*temp_) * n * n * 2); - output_ = (float *)aom_memalign(32, sizeof(*output_) * n * n); - memset(input_, 0, sizeof(*input_) * n * n * 2); - memset(temp_, 0, sizeof(*temp_) * n * n * 2); - memset(output_, 0, sizeof(*output_) * n * n); - } - void TearDown() { - aom_free(input_); - aom_free(temp_); - aom_free(output_); - } - float *input_; - float *temp_; - float *output_; -}; - -TEST_P(IFFT2DTest, Correctness) { - int n = GetParam().n; - ASSERT_GE(n, 2); - std::vector<float> expected(n * n); - std::vector<float> actual(n * n); - // Do forward transform then invert to make sure we get back expected - for (int y = 0; y < n; ++y) { - for (int x = 0; x < n; ++x) { - expected[y * n + x] = 1; - std::vector<std::complex<float> > input_c = fft2d(&expected[0], n); - for (int i = 0; i < n * n; ++i) { - input_[2 * i + 0] = input_c[i].real(); - input_[2 * i + 1] = input_c[i].imag(); - } - GetParam().ifft(&input_[0], &temp_[0], &output_[0]); - - for (int yy = 0; yy < n; ++yy) { - for (int xx = 0; xx < n; ++xx) { - EXPECT_NEAR(expected[yy * n + xx], output_[yy * n + xx] / (n * n), - 1e-5); - } - } - expected[y * n + x] = 0; - } - } -}; - -TEST_P(IFFT2DTest, Benchmark) { - int n = GetParam().n; - float sum = 0; - for (int i = 0; i < 1000 * (64 - n); ++i) { - input_[i % (n * n)] = 1; - GetParam().ifft(&input_[0], &temp_[0], &output_[0]); - sum += output_[0]; - input_[i % (n * n)] = 0; - } -} -INSTANTIATE_TEST_CASE_P( - C, IFFT2DTest, - ::testing::Values(IFFTTestArg(2, aom_ifft2x2_float_c), - IFFTTestArg(4, aom_ifft4x4_float_c), - IFFTTestArg(8, aom_ifft8x8_float_c), - IFFTTestArg(16, aom_ifft16x16_float_c), - IFFTTestArg(32, aom_ifft32x32_float_c))); -#if ARCH_X86 || ARCH_X86_64 -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P( - SSE2, IFFT2DTest, - ::testing::Values(IFFTTestArg(4, aom_ifft4x4_float_sse2), - IFFTTestArg(8, aom_ifft8x8_float_sse2), - IFFTTestArg(16, aom_ifft16x16_float_sse2), - IFFTTestArg(32, aom_ifft32x32_float_sse2))); -#endif // HAVE_SSE2 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, IFFT2DTest, - ::testing::Values(IFFTTestArg(8, aom_ifft8x8_float_avx2), - IFFTTestArg(16, aom_ifft16x16_float_avx2), - IFFTTestArg(32, aom_ifft32x32_float_avx2))); -#endif // HAVE_AVX2 -#endif // ARCH_X86 || ARCH_X86_64 - -} // namespace diff --git a/third_party/aom/test/film_grain_table_test.cc b/third_party/aom/test/film_grain_table_test.cc deleted file mode 100644 index 524d67d7b..000000000 --- a/third_party/aom/test/film_grain_table_test.cc +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "aom_dsp/grain_table.h" -#include "aom/internal/aom_codec_internal.h" -#include "av1/encoder/grain_test_vectors.h" -#include "test/video_source.h" - -void grain_equal(const aom_film_grain_t *expected, - const aom_film_grain_t *actual) { - EXPECT_EQ(expected->apply_grain, actual->apply_grain); - EXPECT_EQ(expected->update_parameters, actual->update_parameters); - if (!expected->update_parameters) return; - EXPECT_EQ(expected->num_y_points, actual->num_y_points); - EXPECT_EQ(expected->num_cb_points, actual->num_cb_points); - EXPECT_EQ(expected->num_cr_points, actual->num_cr_points); - EXPECT_EQ(0, memcmp(expected->scaling_points_y, actual->scaling_points_y, - expected->num_y_points * - sizeof(expected->scaling_points_y[0]))); - EXPECT_EQ(0, memcmp(expected->scaling_points_cb, actual->scaling_points_cb, - expected->num_cb_points * - sizeof(expected->scaling_points_cb[0]))); - EXPECT_EQ(0, memcmp(expected->scaling_points_cr, actual->scaling_points_cr, - expected->num_cr_points * - sizeof(expected->scaling_points_cr[0]))); - EXPECT_EQ(expected->scaling_shift, actual->scaling_shift); - EXPECT_EQ(expected->ar_coeff_lag, actual->ar_coeff_lag); - EXPECT_EQ(expected->ar_coeff_shift, actual->ar_coeff_shift); - - const int num_pos_luma = - 2 * expected->ar_coeff_lag * (expected->ar_coeff_lag + 1); - const int num_pos_chroma = num_pos_luma; - EXPECT_EQ(0, memcmp(expected->ar_coeffs_y, actual->ar_coeffs_y, - sizeof(expected->ar_coeffs_y[0]) * num_pos_luma)); - if (actual->num_cb_points || actual->chroma_scaling_from_luma) { - EXPECT_EQ(0, memcmp(expected->ar_coeffs_cb, actual->ar_coeffs_cb, - sizeof(expected->ar_coeffs_cb[0]) * num_pos_chroma)); - } - if (actual->num_cr_points || actual->chroma_scaling_from_luma) { - EXPECT_EQ(0, memcmp(expected->ar_coeffs_cr, actual->ar_coeffs_cr, - sizeof(expected->ar_coeffs_cr[0]) * num_pos_chroma)); - } - EXPECT_EQ(expected->overlap_flag, actual->overlap_flag); - EXPECT_EQ(expected->chroma_scaling_from_luma, - actual->chroma_scaling_from_luma); - EXPECT_EQ(expected->grain_scale_shift, actual->grain_scale_shift); - // EXPECT_EQ(expected->random_seed, actual->random_seed); - - // clip_to_restricted and bit_depth aren't written - if (expected->num_cb_points) { - EXPECT_EQ(expected->cb_mult, actual->cb_mult); - EXPECT_EQ(expected->cb_luma_mult, actual->cb_luma_mult); - EXPECT_EQ(expected->cb_offset, actual->cb_offset); - } - if (expected->num_cr_points) { - EXPECT_EQ(expected->cr_mult, actual->cr_mult); - EXPECT_EQ(expected->cr_luma_mult, actual->cr_luma_mult); - EXPECT_EQ(expected->cr_offset, actual->cr_offset); - } -} - -TEST(FilmGrainTableTest, AddAndLookupSingleSegment) { - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - - aom_film_grain_t grain; - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 0, 1000, false, &grain)); - - aom_film_grain_table_append(&table, 1000, 2000, film_grain_test_vectors + 0); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 0, 1000, false, &grain)); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 2000, 3000, false, &grain)); - - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 1000, 2000, false, &grain)); - - grain.bit_depth = film_grain_test_vectors[0].bit_depth; - EXPECT_EQ(0, memcmp(&grain, film_grain_test_vectors + 0, sizeof(table))); - - // Extend the existing segment - aom_film_grain_table_append(&table, 2000, 3000, film_grain_test_vectors + 0); - EXPECT_EQ(0, table.head->next); - - // Lookup and remove and check that the entry is no longer there - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 1000, 2000, true, &grain)); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 1000, 2000, false, &grain)); - - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 2000, 3000, true, &grain)); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 2000, 3000, false, &grain)); - - EXPECT_EQ(0, table.head); - EXPECT_EQ(0, table.tail); - aom_film_grain_table_free(&table); -} - -TEST(FilmGrainTableTest, SplitSingleSegment) { - aom_film_grain_table_t table; - aom_film_grain_t grain; - memset(&table, 0, sizeof(table)); - - aom_film_grain_table_append(&table, 0, 1000, film_grain_test_vectors + 0); - - // Test lookup and remove that adjusts start time - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 0, 100, true, &grain)); - EXPECT_EQ(NULL, table.head->next); - EXPECT_EQ(100, table.head->start_time); - - // Test lookup and remove that adjusts end time - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 900, 1000, true, &grain)); - EXPECT_EQ(NULL, table.head->next); - EXPECT_EQ(100, table.head->start_time); - EXPECT_EQ(900, table.head->end_time); - - // Test lookup and remove that splits the first entry - EXPECT_TRUE(aom_film_grain_table_lookup(&table, 400, 600, true, &grain)); - EXPECT_EQ(100, table.head->start_time); - EXPECT_EQ(400, table.head->end_time); - - ASSERT_NE((void *)NULL, table.head->next); - EXPECT_EQ(table.tail, table.head->next); - EXPECT_EQ(600, table.head->next->start_time); - EXPECT_EQ(900, table.head->next->end_time); - - aom_film_grain_table_free(&table); -} - -TEST(FilmGrainTableTest, AddAndLookupMultipleSegments) { - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - - aom_film_grain_t grain; - const int kNumTestVectors = - sizeof(film_grain_test_vectors) / sizeof(film_grain_test_vectors[0]); - for (int i = 0; i < kNumTestVectors; ++i) { - aom_film_grain_table_append(&table, i * 1000, (i + 1) * 1000, - film_grain_test_vectors + i); - } - - for (int i = kNumTestVectors - 1; i >= 0; --i) { - EXPECT_TRUE(aom_film_grain_table_lookup(&table, i * 1000, (i + 1) * 1000, - true, &grain)); - grain_equal(film_grain_test_vectors + i, &grain); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, i * 1000, (i + 1) * 1000, - true, &grain)); - } - - // Verify that all the data has been removed - for (int i = 0; i < kNumTestVectors; ++i) { - EXPECT_FALSE(aom_film_grain_table_lookup(&table, i * 1000, (i + 1) * 1000, - true, &grain)); - } - aom_film_grain_table_free(&table); -} - -class FilmGrainTableIOTest : public ::testing::Test { - protected: - void SetUp() { memset(&error_, 0, sizeof(error_)); } - struct aom_internal_error_info error_; -}; - -TEST_F(FilmGrainTableIOTest, ReadMissingFile) { - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - ASSERT_EQ(AOM_CODEC_ERROR, aom_film_grain_table_read( - &table, "/path/to/missing/file", &error_)); -} - -TEST_F(FilmGrainTableIOTest, ReadTruncatedFile) { - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - - std::string grain_file; - FILE *file = libaom_test::GetTempOutFile(&grain_file); - fwrite("deadbeef", 8, 1, file); - fclose(file); - ASSERT_EQ(AOM_CODEC_ERROR, - aom_film_grain_table_read(&table, grain_file.c_str(), &error_)); - EXPECT_EQ(0, remove(grain_file.c_str())); -} - -TEST_F(FilmGrainTableIOTest, RoundTripReadWrite) { - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - - aom_film_grain_t expected_grain[16]; - const int kNumTestVectors = - sizeof(film_grain_test_vectors) / sizeof(film_grain_test_vectors[0]); - for (int i = 0; i < kNumTestVectors; ++i) { - expected_grain[i] = film_grain_test_vectors[i]; - expected_grain[i].random_seed = i; - expected_grain[i].update_parameters = i % 2; - expected_grain[i].apply_grain = (i + 1) % 2; - expected_grain[i].bit_depth = 0; - aom_film_grain_table_append(&table, i * 1000, (i + 1) * 1000, - expected_grain + i); - } - std::string grain_file; - fclose(libaom_test::GetTempOutFile(&grain_file)); - ASSERT_EQ(AOM_CODEC_OK, - aom_film_grain_table_write(&table, grain_file.c_str(), &error_)); - aom_film_grain_table_free(&table); - - memset(&table, 0, sizeof(table)); - ASSERT_EQ(AOM_CODEC_OK, - aom_film_grain_table_read(&table, grain_file.c_str(), &error_)); - for (int i = 0; i < kNumTestVectors; ++i) { - aom_film_grain_t grain; - EXPECT_TRUE(aom_film_grain_table_lookup(&table, i * 1000, (i + 1) * 1000, - true, &grain)); - grain_equal(expected_grain + i, &grain); - } - aom_film_grain_table_free(&table); - EXPECT_EQ(0, remove(grain_file.c_str())); -} - -TEST_F(FilmGrainTableIOTest, RoundTripSplit) { - std::string grain_file; - fclose(libaom_test::GetTempOutFile(&grain_file)); - - aom_film_grain_table_t table; - memset(&table, 0, sizeof(table)); - - aom_film_grain_t grain = film_grain_test_vectors[0]; - aom_film_grain_table_append(&table, 0, 3000, &grain); - ASSERT_TRUE(aom_film_grain_table_lookup(&table, 1000, 2000, true, &grain)); - ASSERT_TRUE(aom_film_grain_table_lookup(&table, 0, 1000, false, &grain)); - EXPECT_FALSE(aom_film_grain_table_lookup(&table, 1000, 2000, false, &grain)); - ASSERT_TRUE(aom_film_grain_table_lookup(&table, 2000, 3000, false, &grain)); - ASSERT_EQ(AOM_CODEC_OK, - aom_film_grain_table_write(&table, grain_file.c_str(), &error_)); - aom_film_grain_table_free(&table); - - memset(&table, 0, sizeof(table)); - ASSERT_EQ(AOM_CODEC_OK, - aom_film_grain_table_read(&table, grain_file.c_str(), &error_)); - ASSERT_TRUE(aom_film_grain_table_lookup(&table, 0, 1000, false, &grain)); - ASSERT_FALSE(aom_film_grain_table_lookup(&table, 1000, 2000, false, &grain)); - ASSERT_TRUE(aom_film_grain_table_lookup(&table, 2000, 3000, false, &grain)); - aom_film_grain_table_free(&table); - - EXPECT_EQ(0, remove(grain_file.c_str())); -} diff --git a/third_party/aom/test/filterintra_test.cc b/third_party/aom/test/filterintra_test.cc deleted file mode 100644 index 597134940..000000000 --- a/third_party/aom/test/filterintra_test.cc +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/enums.h" - -namespace { - -using ::testing::tuple; -using libaom_test::ACMRandom; - -typedef void (*Predictor)(uint8_t *dst, ptrdiff_t stride, TX_SIZE tx_size, - const uint8_t *above, const uint8_t *left, int mode); - -// Note: -// Test parameter list: -// Reference predictor, optimized predictor, prediction mode, tx size -// -typedef tuple<Predictor, Predictor, int> PredFuncMode; -typedef tuple<PredFuncMode, TX_SIZE> PredParams; - -const int MaxTxSize = 32; - -const int MaxTestNum = 100; - -class AV1FilterIntraPredTest : public ::testing::TestWithParam<PredParams> { - public: - virtual ~AV1FilterIntraPredTest() {} - virtual void SetUp() { - PredFuncMode funcMode = GET_PARAM(0); - predFuncRef_ = ::testing::get<0>(funcMode); - predFunc_ = ::testing::get<1>(funcMode); - mode_ = ::testing::get<2>(funcMode); - txSize_ = GET_PARAM(1); - - alloc_ = new uint8_t[2 * MaxTxSize + 1]; - predRef_ = new uint8_t[MaxTxSize * MaxTxSize]; - pred_ = new uint8_t[MaxTxSize * MaxTxSize]; - } - - virtual void TearDown() { - delete[] alloc_; - delete[] predRef_; - delete[] pred_; - libaom_test::ClearSystemState(); - } - - protected: - void RunTest() const { - int tstIndex = 0; - int stride = tx_size_wide[txSize_]; - uint8_t *left = alloc_; - uint8_t *above = alloc_ + MaxTxSize; - while (tstIndex < MaxTestNum) { - PrepareBuffer(); - predFuncRef_(predRef_, stride, txSize_, &above[1], left, mode_); - ASM_REGISTER_STATE_CHECK( - predFunc_(pred_, stride, txSize_, &above[1], left, mode_)); - DiffPred(tstIndex); - tstIndex += 1; - } - } - - private: - void PrepareBuffer() const { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - int i = 0; - while (i < (2 * MaxTxSize + 1)) { - alloc_[i] = rnd.Rand8(); - i++; - } - } - - void DiffPred(int testNum) const { - int i = 0; - while (i < tx_size_wide[txSize_] * tx_size_high[txSize_]) { - EXPECT_EQ(predRef_[i], pred_[i]) << "Error at position: " << i << " " - << "Tx size: " << tx_size_wide[txSize_] - << "x" << tx_size_high[txSize_] << " " - << "Test number: " << testNum; - i++; - } - } - - Predictor predFunc_; - Predictor predFuncRef_; - int mode_; - TX_SIZE txSize_; - uint8_t *alloc_; - uint8_t *pred_; - uint8_t *predRef_; -}; - -TEST_P(AV1FilterIntraPredTest, BitExactCheck) { RunTest(); } - -using ::testing::make_tuple; - -const PredFuncMode kPredFuncMdArray[] = { - make_tuple(&av1_filter_intra_predictor_c, &av1_filter_intra_predictor_sse4_1, - FILTER_DC_PRED), - make_tuple(&av1_filter_intra_predictor_c, &av1_filter_intra_predictor_sse4_1, - FILTER_V_PRED), - make_tuple(&av1_filter_intra_predictor_c, &av1_filter_intra_predictor_sse4_1, - FILTER_H_PRED), - make_tuple(&av1_filter_intra_predictor_c, &av1_filter_intra_predictor_sse4_1, - FILTER_D157_PRED), - make_tuple(&av1_filter_intra_predictor_c, &av1_filter_intra_predictor_sse4_1, - FILTER_PAETH_PRED), -}; - -const TX_SIZE kTxSize[] = { TX_4X4, TX_8X8, TX_16X16, TX_32X32, TX_4X8, - TX_8X4, TX_8X16, TX_16X8, TX_16X32, TX_32X16, - TX_4X16, TX_16X4, TX_8X32, TX_32X8 }; - -INSTANTIATE_TEST_CASE_P( - SSE4_1, AV1FilterIntraPredTest, - ::testing::Combine(::testing::ValuesIn(kPredFuncMdArray), - ::testing::ValuesIn(kTxSize))); -} // namespace diff --git a/third_party/aom/test/frame_size_tests.cc b/third_party/aom/test/frame_size_tests.cc deleted file mode 100644 index eaf0b8370..000000000 --- a/third_party/aom/test/frame_size_tests.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/video_source.h" - -namespace { - -class AV1FrameSizeTests : public ::testing::Test, - public ::libaom_test::EncoderTest { - protected: - AV1FrameSizeTests() - : EncoderTest(&::libaom_test::kAV1), expected_res_(AOM_CODEC_OK) {} - virtual ~AV1FrameSizeTests() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(::libaom_test::kRealTime); - } - - virtual bool HandleDecodeResult(const aom_codec_err_t res_dec, - libaom_test::Decoder *decoder) { - EXPECT_EQ(expected_res_, res_dec) << decoder->DecodeError(); - return !::testing::Test::HasFailure(); - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, 7); - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - - int expected_res_; -}; - -#if CONFIG_SIZE_LIMIT -TEST_F(AV1FrameSizeTests, TestInvalidSizes) { - ::libaom_test::RandomVideoSource video; - - video.SetSize(DECODE_WIDTH_LIMIT + 16, DECODE_HEIGHT_LIMIT + 16); - video.set_limit(2); - expected_res_ = AOM_CODEC_CORRUPT_FRAME; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -TEST_F(AV1FrameSizeTests, LargeValidSizes) { - ::libaom_test::RandomVideoSource video; - - video.SetSize(DECODE_WIDTH_LIMIT, DECODE_HEIGHT_LIMIT); - video.set_limit(2); - expected_res_ = AOM_CODEC_OK; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} -#endif - -TEST_F(AV1FrameSizeTests, OneByOneVideo) { - ::libaom_test::RandomVideoSource video; - - video.SetSize(1, 1); - video.set_limit(2); - expected_res_ = AOM_CODEC_OK; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} -#undef ONE_BY_ONE_VIDEO_NAME -} // namespace diff --git a/third_party/aom/test/function_equivalence_test.h b/third_party/aom/test/function_equivalence_test.h deleted file mode 100644 index f27068902..000000000 --- a/third_party/aom/test/function_equivalence_test.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_FUNCTION_EQUIVALENCE_TEST_H_ -#define AOM_TEST_FUNCTION_EQUIVALENCE_TEST_H_ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/util.h" - -using libaom_test::ACMRandom; - -namespace libaom_test { -// Base class for tests that compare 2 implementations of the same function -// for equivalence. The template parameter should be pointer to a function -// that is being tested. -// -// The test takes a 3-parameters encapsulating struct 'FuncParam', containing: -// - Pointer to reference function -// - Pointer to tested function -// - Integer bit depth (default to 0). -// -// These values are then accessible in the tests as member of params_: -// params_.ref_func, params_.tst_func, and params_.bit_depth. -// - -template <typename T> -struct FuncParam { - FuncParam(T ref = NULL, T tst = NULL, int bit_depth = 0) - : ref_func(ref), tst_func(tst), bit_depth(bit_depth) {} - T ref_func; - T tst_func; - int bit_depth; -}; - -template <typename T> -std::ostream &operator<<(std::ostream &os, const FuncParam<T> &p) { - return os << "bit_depth:" << p.bit_depth - << " function:" << reinterpret_cast<const void *>(p.ref_func) - << " function:" << reinterpret_cast<const void *>(p.tst_func); -} - -template <typename T> -class FunctionEquivalenceTest : public ::testing::TestWithParam<FuncParam<T> > { - public: - FunctionEquivalenceTest() : rng_(ACMRandom::DeterministicSeed()) {} - - virtual ~FunctionEquivalenceTest() {} - - virtual void SetUp() { params_ = this->GetParam(); } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - ACMRandom rng_; - FuncParam<T> params_; -}; - -} // namespace libaom_test -#endif // AOM_TEST_FUNCTION_EQUIVALENCE_TEST_H_ diff --git a/third_party/aom/test/fwht4x4_test.cc b/third_party/aom/test/fwht4x4_test.cc deleted file mode 100644 index c8d98c519..000000000 --- a/third_party/aom/test/fwht4x4_test.cc +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" -#include "config/aom_dsp_rtcd.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/transform_test_base.h" -#include "test/util.h" -#include "av1/common/entropy.h" -#include "aom/aom_codec.h" -#include "aom/aom_integer.h" -#include "aom_ports/mem.h" - -using libaom_test::ACMRandom; - -namespace { -typedef void (*FdctFunc)(const int16_t *in, tran_low_t *out, int stride); -typedef void (*IdctFunc)(const tran_low_t *in, uint8_t *out, int stride); - -using libaom_test::FhtFunc; - -typedef ::testing::tuple<FdctFunc, IdctFunc, TX_TYPE, aom_bit_depth_t, int> - Dct4x4Param; - -void fwht4x4_ref(const int16_t *in, tran_low_t *out, int stride, - TxfmParam * /*txfm_param*/) { - av1_fwht4x4_c(in, out, stride); -} - -void iwht4x4_10(const tran_low_t *in, uint8_t *out, int stride) { - av1_highbd_iwht4x4_16_add_c(in, out, stride, 10); -} - -void iwht4x4_12(const tran_low_t *in, uint8_t *out, int stride) { - av1_highbd_iwht4x4_16_add_c(in, out, stride, 12); -} - -class Trans4x4WHT : public libaom_test::TransformTestBase, - public ::testing::TestWithParam<Dct4x4Param> { - public: - virtual ~Trans4x4WHT() {} - - virtual void SetUp() { - fwd_txfm_ = GET_PARAM(0); - inv_txfm_ = GET_PARAM(1); - pitch_ = 4; - height_ = 4; - fwd_txfm_ref = fwht4x4_ref; - bit_depth_ = GET_PARAM(3); - mask_ = (1 << bit_depth_) - 1; - num_coeffs_ = GET_PARAM(4); - } - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunFwdTxfm(const int16_t *in, tran_low_t *out, int stride) { - fwd_txfm_(in, out, stride); - } - void RunInvTxfm(const tran_low_t *out, uint8_t *dst, int stride) { - inv_txfm_(out, dst, stride); - } - - FdctFunc fwd_txfm_; - IdctFunc inv_txfm_; -}; - -TEST_P(Trans4x4WHT, AccuracyCheck) { RunAccuracyCheck(0, 0.00001); } - -TEST_P(Trans4x4WHT, CoeffCheck) { RunCoeffCheck(); } - -TEST_P(Trans4x4WHT, MemCheck) { RunMemCheck(); } - -TEST_P(Trans4x4WHT, InvAccuracyCheck) { RunInvAccuracyCheck(0); } -using ::testing::make_tuple; - -INSTANTIATE_TEST_CASE_P( - C, Trans4x4WHT, - ::testing::Values(make_tuple(&av1_highbd_fwht4x4_c, &iwht4x4_10, DCT_DCT, - AOM_BITS_10, 16), - make_tuple(&av1_highbd_fwht4x4_c, &iwht4x4_12, DCT_DCT, - AOM_BITS_12, 16))); -} // namespace diff --git a/third_party/aom/test/gviz_api.py b/third_party/aom/test/gviz_api.py deleted file mode 100755 index d3a443dab..000000000 --- a/third_party/aom/test/gviz_api.py +++ /dev/null @@ -1,1087 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2016, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and -# the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -# was not distributed with this source code in the LICENSE file, you can -# obtain it at www.aomedia.org/license/software. If the Alliance for Open -# Media Patent License 1.0 was not distributed with this source code in the -# PATENTS file, you can obtain it at www.aomedia.org/license/patent. -# - -"""Converts Python data into data for Google Visualization API clients. - -This library can be used to create a google.visualization.DataTable usable by -visualizations built on the Google Visualization API. Output formats are raw -JSON, JSON response, JavaScript, CSV, and HTML table. - -See http://code.google.com/apis/visualization/ for documentation on the -Google Visualization API. -""" - -__author__ = "Amit Weinstein, Misha Seltzer, Jacob Baskin" - -import cgi -import cStringIO -import csv -import datetime -try: - import json -except ImportError: - import simplejson as json -import types - - -class DataTableException(Exception): - """The general exception object thrown by DataTable.""" - pass - - -class DataTableJSONEncoder(json.JSONEncoder): - """JSON encoder that handles date/time/datetime objects correctly.""" - - def __init__(self): - json.JSONEncoder.__init__(self, - separators=(",", ":"), - ensure_ascii=False) - - def default(self, o): - if isinstance(o, datetime.datetime): - if o.microsecond == 0: - # If the time doesn't have ms-resolution, leave it out to keep - # things smaller. - return "Date(%d,%d,%d,%d,%d,%d)" % ( - o.year, o.month - 1, o.day, o.hour, o.minute, o.second) - else: - return "Date(%d,%d,%d,%d,%d,%d,%d)" % ( - o.year, o.month - 1, o.day, o.hour, o.minute, o.second, - o.microsecond / 1000) - elif isinstance(o, datetime.date): - return "Date(%d,%d,%d)" % (o.year, o.month - 1, o.day) - elif isinstance(o, datetime.time): - return [o.hour, o.minute, o.second] - else: - return super(DataTableJSONEncoder, self).default(o) - - -class DataTable(object): - """Wraps the data to convert to a Google Visualization API DataTable. - - Create this object, populate it with data, then call one of the ToJS... - methods to return a string representation of the data in the format described. - - You can clear all data from the object to reuse it, but you cannot clear - individual cells, rows, or columns. You also cannot modify the table schema - specified in the class constructor. - - You can add new data one or more rows at a time. All data added to an - instantiated DataTable must conform to the schema passed in to __init__(). - - You can reorder the columns in the output table, and also specify row sorting - order by column. The default column order is according to the original - table_description parameter. Default row sort order is ascending, by column - 1 values. For a dictionary, we sort the keys for order. - - The data and the table_description are closely tied, as described here: - - The table schema is defined in the class constructor's table_description - parameter. The user defines each column using a tuple of - (id[, type[, label[, custom_properties]]]). The default value for type is - string, label is the same as ID if not specified, and custom properties is - an empty dictionary if not specified. - - table_description is a dictionary or list, containing one or more column - descriptor tuples, nested dictionaries, and lists. Each dictionary key, list - element, or dictionary element must eventually be defined as - a column description tuple. Here's an example of a dictionary where the key - is a tuple, and the value is a list of two tuples: - {('a', 'number'): [('b', 'number'), ('c', 'string')]} - - This flexibility in data entry enables you to build and manipulate your data - in a Python structure that makes sense for your program. - - Add data to the table using the same nested design as the table's - table_description, replacing column descriptor tuples with cell data, and - each row is an element in the top level collection. This will be a bit - clearer after you look at the following examples showing the - table_description, matching data, and the resulting table: - - Columns as list of tuples [col1, col2, col3] - table_description: [('a', 'number'), ('b', 'string')] - AppendData( [[1, 'z'], [2, 'w'], [4, 'o'], [5, 'k']] ) - Table: - a b <--- these are column ids/labels - 1 z - 2 w - 4 o - 5 k - - Dictionary of columns, where key is a column, and value is a list of - columns {col1: [col2, col3]} - table_description: {('a', 'number'): [('b', 'number'), ('c', 'string')]} - AppendData( data: {1: [2, 'z'], 3: [4, 'w']} - Table: - a b c - 1 2 z - 3 4 w - - Dictionary where key is a column, and the value is itself a dictionary of - columns {col1: {col2, col3}} - table_description: {('a', 'number'): {'b': 'number', 'c': 'string'}} - AppendData( data: {1: {'b': 2, 'c': 'z'}, 3: {'b': 4, 'c': 'w'}} - Table: - a b c - 1 2 z - 3 4 w - """ - - def __init__(self, table_description, data=None, custom_properties=None): - """Initialize the data table from a table schema and (optionally) data. - - See the class documentation for more information on table schema and data - values. - - Args: - table_description: A table schema, following one of the formats described - in TableDescriptionParser(). Schemas describe the - column names, data types, and labels. See - TableDescriptionParser() for acceptable formats. - data: Optional. If given, fills the table with the given data. The data - structure must be consistent with schema in table_description. See - the class documentation for more information on acceptable data. You - can add data later by calling AppendData(). - custom_properties: Optional. A dictionary from string to string that - goes into the table's custom properties. This can be - later changed by changing self.custom_properties. - - Raises: - DataTableException: Raised if the data and the description did not match, - or did not use the supported formats. - """ - self.__columns = self.TableDescriptionParser(table_description) - self.__data = [] - self.custom_properties = {} - if custom_properties is not None: - self.custom_properties = custom_properties - if data: - self.LoadData(data) - - @staticmethod - def CoerceValue(value, value_type): - """Coerces a single value into the type expected for its column. - - Internal helper method. - - Args: - value: The value which should be converted - value_type: One of "string", "number", "boolean", "date", "datetime" or - "timeofday". - - Returns: - An item of the Python type appropriate to the given value_type. Strings - are also converted to Unicode using UTF-8 encoding if necessary. - If a tuple is given, it should be in one of the following forms: - - (value, formatted value) - - (value, formatted value, custom properties) - where the formatted value is a string, and custom properties is a - dictionary of the custom properties for this cell. - To specify custom properties without specifying formatted value, one can - pass None as the formatted value. - One can also have a null-valued cell with formatted value and/or custom - properties by specifying None for the value. - This method ignores the custom properties except for checking that it is a - dictionary. The custom properties are handled in the ToJSon and ToJSCode - methods. - The real type of the given value is not strictly checked. For example, - any type can be used for string - as we simply take its str( ) and for - boolean value we just check "if value". - Examples: - CoerceValue(None, "string") returns None - CoerceValue((5, "5$"), "number") returns (5, "5$") - CoerceValue(100, "string") returns "100" - CoerceValue(0, "boolean") returns False - - Raises: - DataTableException: The value and type did not match in a not-recoverable - way, for example given value 'abc' for type 'number'. - """ - if isinstance(value, tuple): - # In case of a tuple, we run the same function on the value itself and - # add the formatted value. - if (len(value) not in [2, 3] or - (len(value) == 3 and not isinstance(value[2], dict))): - raise DataTableException("Wrong format for value and formatting - %s." % - str(value)) - if not isinstance(value[1], types.StringTypes + (types.NoneType,)): - raise DataTableException("Formatted value is not string, given %s." % - type(value[1])) - js_value = DataTable.CoerceValue(value[0], value_type) - return (js_value,) + value[1:] - - t_value = type(value) - if value is None: - return value - if value_type == "boolean": - return bool(value) - - elif value_type == "number": - if isinstance(value, (int, long, float)): - return value - raise DataTableException("Wrong type %s when expected number" % t_value) - - elif value_type == "string": - if isinstance(value, unicode): - return value - else: - return str(value).decode("utf-8") - - elif value_type == "date": - if isinstance(value, datetime.datetime): - return datetime.date(value.year, value.month, value.day) - elif isinstance(value, datetime.date): - return value - else: - raise DataTableException("Wrong type %s when expected date" % t_value) - - elif value_type == "timeofday": - if isinstance(value, datetime.datetime): - return datetime.time(value.hour, value.minute, value.second) - elif isinstance(value, datetime.time): - return value - else: - raise DataTableException("Wrong type %s when expected time" % t_value) - - elif value_type == "datetime": - if isinstance(value, datetime.datetime): - return value - else: - raise DataTableException("Wrong type %s when expected datetime" % - t_value) - # If we got here, it means the given value_type was not one of the - # supported types. - raise DataTableException("Unsupported type %s" % value_type) - - @staticmethod - def EscapeForJSCode(encoder, value): - if value is None: - return "null" - elif isinstance(value, datetime.datetime): - if value.microsecond == 0: - # If it's not ms-resolution, leave that out to save space. - return "new Date(%d,%d,%d,%d,%d,%d)" % (value.year, - value.month - 1, # To match JS - value.day, - value.hour, - value.minute, - value.second) - else: - return "new Date(%d,%d,%d,%d,%d,%d,%d)" % (value.year, - value.month - 1, # match JS - value.day, - value.hour, - value.minute, - value.second, - value.microsecond / 1000) - elif isinstance(value, datetime.date): - return "new Date(%d,%d,%d)" % (value.year, value.month - 1, value.day) - else: - return encoder.encode(value) - - @staticmethod - def ToString(value): - if value is None: - return "(empty)" - elif isinstance(value, (datetime.datetime, - datetime.date, - datetime.time)): - return str(value) - elif isinstance(value, unicode): - return value - elif isinstance(value, bool): - return str(value).lower() - else: - return str(value).decode("utf-8") - - @staticmethod - def ColumnTypeParser(description): - """Parses a single column description. Internal helper method. - - Args: - description: a column description in the possible formats: - 'id' - ('id',) - ('id', 'type') - ('id', 'type', 'label') - ('id', 'type', 'label', {'custom_prop1': 'custom_val1'}) - Returns: - Dictionary with the following keys: id, label, type, and - custom_properties where: - - If label not given, it equals the id. - - If type not given, string is used by default. - - If custom properties are not given, an empty dictionary is used by - default. - - Raises: - DataTableException: The column description did not match the RE, or - unsupported type was passed. - """ - if not description: - raise DataTableException("Description error: empty description given") - - if not isinstance(description, (types.StringTypes, tuple)): - raise DataTableException("Description error: expected either string or " - "tuple, got %s." % type(description)) - - if isinstance(description, types.StringTypes): - description = (description,) - - # According to the tuple's length, we fill the keys - # We verify everything is of type string - for elem in description[:3]: - if not isinstance(elem, types.StringTypes): - raise DataTableException("Description error: expected tuple of " - "strings, current element of type %s." % - type(elem)) - desc_dict = {"id": description[0], - "label": description[0], - "type": "string", - "custom_properties": {}} - if len(description) > 1: - desc_dict["type"] = description[1].lower() - if len(description) > 2: - desc_dict["label"] = description[2] - if len(description) > 3: - if not isinstance(description[3], dict): - raise DataTableException("Description error: expected custom " - "properties of type dict, current element " - "of type %s." % type(description[3])) - desc_dict["custom_properties"] = description[3] - if len(description) > 4: - raise DataTableException("Description error: tuple of length > 4") - if desc_dict["type"] not in ["string", "number", "boolean", - "date", "datetime", "timeofday"]: - raise DataTableException( - "Description error: unsupported type '%s'" % desc_dict["type"]) - return desc_dict - - @staticmethod - def TableDescriptionParser(table_description, depth=0): - """Parses the table_description object for internal use. - - Parses the user-submitted table description into an internal format used - by the Python DataTable class. Returns the flat list of parsed columns. - - Args: - table_description: A description of the table which should comply - with one of the formats described below. - depth: Optional. The depth of the first level in the current description. - Used by recursive calls to this function. - - Returns: - List of columns, where each column represented by a dictionary with the - keys: id, label, type, depth, container which means the following: - - id: the id of the column - - name: The name of the column - - type: The datatype of the elements in this column. Allowed types are - described in ColumnTypeParser(). - - depth: The depth of this column in the table description - - container: 'dict', 'iter' or 'scalar' for parsing the format easily. - - custom_properties: The custom properties for this column. - The returned description is flattened regardless of how it was given. - - Raises: - DataTableException: Error in a column description or in the description - structure. - - Examples: - A column description can be of the following forms: - 'id' - ('id',) - ('id', 'type') - ('id', 'type', 'label') - ('id', 'type', 'label', {'custom_prop1': 'custom_val1'}) - or as a dictionary: - 'id': 'type' - 'id': ('type',) - 'id': ('type', 'label') - 'id': ('type', 'label', {'custom_prop1': 'custom_val1'}) - If the type is not specified, we treat it as string. - If no specific label is given, the label is simply the id. - If no custom properties are given, we use an empty dictionary. - - input: [('a', 'date'), ('b', 'timeofday', 'b', {'foo': 'bar'})] - output: [{'id': 'a', 'label': 'a', 'type': 'date', - 'depth': 0, 'container': 'iter', 'custom_properties': {}}, - {'id': 'b', 'label': 'b', 'type': 'timeofday', - 'depth': 0, 'container': 'iter', - 'custom_properties': {'foo': 'bar'}}] - - input: {'a': [('b', 'number'), ('c', 'string', 'column c')]} - output: [{'id': 'a', 'label': 'a', 'type': 'string', - 'depth': 0, 'container': 'dict', 'custom_properties': {}}, - {'id': 'b', 'label': 'b', 'type': 'number', - 'depth': 1, 'container': 'iter', 'custom_properties': {}}, - {'id': 'c', 'label': 'column c', 'type': 'string', - 'depth': 1, 'container': 'iter', 'custom_properties': {}}] - - input: {('a', 'number', 'column a'): { 'b': 'number', 'c': 'string'}} - output: [{'id': 'a', 'label': 'column a', 'type': 'number', - 'depth': 0, 'container': 'dict', 'custom_properties': {}}, - {'id': 'b', 'label': 'b', 'type': 'number', - 'depth': 1, 'container': 'dict', 'custom_properties': {}}, - {'id': 'c', 'label': 'c', 'type': 'string', - 'depth': 1, 'container': 'dict', 'custom_properties': {}}] - - input: { ('w', 'string', 'word'): ('c', 'number', 'count') } - output: [{'id': 'w', 'label': 'word', 'type': 'string', - 'depth': 0, 'container': 'dict', 'custom_properties': {}}, - {'id': 'c', 'label': 'count', 'type': 'number', - 'depth': 1, 'container': 'scalar', 'custom_properties': {}}] - - input: {'a': ('number', 'column a'), 'b': ('string', 'column b')} - output: [{'id': 'a', 'label': 'column a', 'type': 'number', 'depth': 0, - 'container': 'dict', 'custom_properties': {}}, - {'id': 'b', 'label': 'column b', 'type': 'string', 'depth': 0, - 'container': 'dict', 'custom_properties': {}} - - NOTE: there might be ambiguity in the case of a dictionary representation - of a single column. For example, the following description can be parsed - in 2 different ways: {'a': ('b', 'c')} can be thought of a single column - with the id 'a', of type 'b' and the label 'c', or as 2 columns: one named - 'a', and the other named 'b' of type 'c'. We choose the first option by - default, and in case the second option is the right one, it is possible to - make the key into a tuple (i.e. {('a',): ('b', 'c')}) or add more info - into the tuple, thus making it look like this: {'a': ('b', 'c', 'b', {})} - -- second 'b' is the label, and {} is the custom properties field. - """ - # For the recursion step, we check for a scalar object (string or tuple) - if isinstance(table_description, (types.StringTypes, tuple)): - parsed_col = DataTable.ColumnTypeParser(table_description) - parsed_col["depth"] = depth - parsed_col["container"] = "scalar" - return [parsed_col] - - # Since it is not scalar, table_description must be iterable. - if not hasattr(table_description, "__iter__"): - raise DataTableException("Expected an iterable object, got %s" % - type(table_description)) - if not isinstance(table_description, dict): - # We expects a non-dictionary iterable item. - columns = [] - for desc in table_description: - parsed_col = DataTable.ColumnTypeParser(desc) - parsed_col["depth"] = depth - parsed_col["container"] = "iter" - columns.append(parsed_col) - if not columns: - raise DataTableException("Description iterable objects should not" - " be empty.") - return columns - # The other case is a dictionary - if not table_description: - raise DataTableException("Empty dictionaries are not allowed inside" - " description") - - # To differentiate between the two cases of more levels below or this is - # the most inner dictionary, we consider the number of keys (more then one - # key is indication for most inner dictionary) and the type of the key and - # value in case of only 1 key (if the type of key is string and the type of - # the value is a tuple of 0-3 items, we assume this is the most inner - # dictionary). - # NOTE: this way of differentiating might create ambiguity. See docs. - if (len(table_description) != 1 or - (isinstance(table_description.keys()[0], types.StringTypes) and - isinstance(table_description.values()[0], tuple) and - len(table_description.values()[0]) < 4)): - # This is the most inner dictionary. Parsing types. - columns = [] - # We sort the items, equivalent to sort the keys since they are unique - for key, value in sorted(table_description.items()): - # We parse the column type as (key, type) or (key, type, label) using - # ColumnTypeParser. - if isinstance(value, tuple): - parsed_col = DataTable.ColumnTypeParser((key,) + value) - else: - parsed_col = DataTable.ColumnTypeParser((key, value)) - parsed_col["depth"] = depth - parsed_col["container"] = "dict" - columns.append(parsed_col) - return columns - # This is an outer dictionary, must have at most one key. - parsed_col = DataTable.ColumnTypeParser(table_description.keys()[0]) - parsed_col["depth"] = depth - parsed_col["container"] = "dict" - return ([parsed_col] + - DataTable.TableDescriptionParser(table_description.values()[0], - depth=depth + 1)) - - @property - def columns(self): - """Returns the parsed table description.""" - return self.__columns - - def NumberOfRows(self): - """Returns the number of rows in the current data stored in the table.""" - return len(self.__data) - - def SetRowsCustomProperties(self, rows, custom_properties): - """Sets the custom properties for given row(s). - - Can accept a single row or an iterable of rows. - Sets the given custom properties for all specified rows. - - Args: - rows: The row, or rows, to set the custom properties for. - custom_properties: A string to string dictionary of custom properties to - set for all rows. - """ - if not hasattr(rows, "__iter__"): - rows = [rows] - for row in rows: - self.__data[row] = (self.__data[row][0], custom_properties) - - def LoadData(self, data, custom_properties=None): - """Loads new rows to the data table, clearing existing rows. - - May also set the custom_properties for the added rows. The given custom - properties dictionary specifies the dictionary that will be used for *all* - given rows. - - Args: - data: The rows that the table will contain. - custom_properties: A dictionary of string to string to set as the custom - properties for all rows. - """ - self.__data = [] - self.AppendData(data, custom_properties) - - def AppendData(self, data, custom_properties=None): - """Appends new data to the table. - - Data is appended in rows. Data must comply with - the table schema passed in to __init__(). See CoerceValue() for a list - of acceptable data types. See the class documentation for more information - and examples of schema and data values. - - Args: - data: The row to add to the table. The data must conform to the table - description format. - custom_properties: A dictionary of string to string, representing the - custom properties to add to all the rows. - - Raises: - DataTableException: The data structure does not match the description. - """ - # If the maximal depth is 0, we simply iterate over the data table - # lines and insert them using _InnerAppendData. Otherwise, we simply - # let the _InnerAppendData handle all the levels. - if not self.__columns[-1]["depth"]: - for row in data: - self._InnerAppendData(({}, custom_properties), row, 0) - else: - self._InnerAppendData(({}, custom_properties), data, 0) - - def _InnerAppendData(self, prev_col_values, data, col_index): - """Inner function to assist LoadData.""" - # We first check that col_index has not exceeded the columns size - if col_index >= len(self.__columns): - raise DataTableException("The data does not match description, too deep") - - # Dealing with the scalar case, the data is the last value. - if self.__columns[col_index]["container"] == "scalar": - prev_col_values[0][self.__columns[col_index]["id"]] = data - self.__data.append(prev_col_values) - return - - if self.__columns[col_index]["container"] == "iter": - if not hasattr(data, "__iter__") or isinstance(data, dict): - raise DataTableException("Expected iterable object, got %s" % - type(data)) - # We only need to insert the rest of the columns - # If there are less items than expected, we only add what there is. - for value in data: - if col_index >= len(self.__columns): - raise DataTableException("Too many elements given in data") - prev_col_values[0][self.__columns[col_index]["id"]] = value - col_index += 1 - self.__data.append(prev_col_values) - return - - # We know the current level is a dictionary, we verify the type. - if not isinstance(data, dict): - raise DataTableException("Expected dictionary at current level, got %s" % - type(data)) - # We check if this is the last level - if self.__columns[col_index]["depth"] == self.__columns[-1]["depth"]: - # We need to add the keys in the dictionary as they are - for col in self.__columns[col_index:]: - if col["id"] in data: - prev_col_values[0][col["id"]] = data[col["id"]] - self.__data.append(prev_col_values) - return - - # We have a dictionary in an inner depth level. - if not data.keys(): - # In case this is an empty dictionary, we add a record with the columns - # filled only until this point. - self.__data.append(prev_col_values) - else: - for key in sorted(data): - col_values = dict(prev_col_values[0]) - col_values[self.__columns[col_index]["id"]] = key - self._InnerAppendData((col_values, prev_col_values[1]), - data[key], col_index + 1) - - def _PreparedData(self, order_by=()): - """Prepares the data for enumeration - sorting it by order_by. - - Args: - order_by: Optional. Specifies the name of the column(s) to sort by, and - (optionally) which direction to sort in. Default sort direction - is asc. Following formats are accepted: - "string_col_name" -- For a single key in default (asc) order. - ("string_col_name", "asc|desc") -- For a single key. - [("col_1","asc|desc"), ("col_2","asc|desc")] -- For more than - one column, an array of tuples of (col_name, "asc|desc"). - - Returns: - The data sorted by the keys given. - - Raises: - DataTableException: Sort direction not in 'asc' or 'desc' - """ - if not order_by: - return self.__data - - proper_sort_keys = [] - if isinstance(order_by, types.StringTypes) or ( - isinstance(order_by, tuple) and len(order_by) == 2 and - order_by[1].lower() in ["asc", "desc"]): - order_by = (order_by,) - for key in order_by: - if isinstance(key, types.StringTypes): - proper_sort_keys.append((key, 1)) - elif (isinstance(key, (list, tuple)) and len(key) == 2 and - key[1].lower() in ("asc", "desc")): - proper_sort_keys.append((key[0], key[1].lower() == "asc" and 1 or -1)) - else: - raise DataTableException("Expected tuple with second value: " - "'asc' or 'desc'") - - def SortCmpFunc(row1, row2): - """cmp function for sorted. Compares by keys and 'asc'/'desc' keywords.""" - for key, asc_mult in proper_sort_keys: - cmp_result = asc_mult * cmp(row1[0].get(key), row2[0].get(key)) - if cmp_result: - return cmp_result - return 0 - - return sorted(self.__data, cmp=SortCmpFunc) - - def ToJSCode(self, name, columns_order=None, order_by=()): - """Writes the data table as a JS code string. - - This method writes a string of JS code that can be run to - generate a DataTable with the specified data. Typically used for debugging - only. - - Args: - name: The name of the table. The name would be used as the DataTable's - variable name in the created JS code. - columns_order: Optional. Specifies the order of columns in the - output table. Specify a list of all column IDs in the order - in which you want the table created. - Note that you must list all column IDs in this parameter, - if you use it. - order_by: Optional. Specifies the name of the column(s) to sort by. - Passed as is to _PreparedData. - - Returns: - A string of JS code that, when run, generates a DataTable with the given - name and the data stored in the DataTable object. - Example result: - "var tab1 = new google.visualization.DataTable(); - tab1.addColumn("string", "a", "a"); - tab1.addColumn("number", "b", "b"); - tab1.addColumn("boolean", "c", "c"); - tab1.addRows(10); - tab1.setCell(0, 0, "a"); - tab1.setCell(0, 1, 1, null, {"foo": "bar"}); - tab1.setCell(0, 2, true); - ... - tab1.setCell(9, 0, "c"); - tab1.setCell(9, 1, 3, "3$"); - tab1.setCell(9, 2, false);" - - Raises: - DataTableException: The data does not match the type. - """ - - encoder = DataTableJSONEncoder() - - if columns_order is None: - columns_order = [col["id"] for col in self.__columns] - col_dict = dict([(col["id"], col) for col in self.__columns]) - - # We first create the table with the given name - jscode = "var %s = new google.visualization.DataTable();\n" % name - if self.custom_properties: - jscode += "%s.setTableProperties(%s);\n" % ( - name, encoder.encode(self.custom_properties)) - - # We add the columns to the table - for i, col in enumerate(columns_order): - jscode += "%s.addColumn(%s, %s, %s);\n" % ( - name, - encoder.encode(col_dict[col]["type"]), - encoder.encode(col_dict[col]["label"]), - encoder.encode(col_dict[col]["id"])) - if col_dict[col]["custom_properties"]: - jscode += "%s.setColumnProperties(%d, %s);\n" % ( - name, i, encoder.encode(col_dict[col]["custom_properties"])) - jscode += "%s.addRows(%d);\n" % (name, len(self.__data)) - - # We now go over the data and add each row - for (i, (row, cp)) in enumerate(self._PreparedData(order_by)): - # We add all the elements of this row by their order - for (j, col) in enumerate(columns_order): - if col not in row or row[col] is None: - continue - value = self.CoerceValue(row[col], col_dict[col]["type"]) - if isinstance(value, tuple): - cell_cp = "" - if len(value) == 3: - cell_cp = ", %s" % encoder.encode(row[col][2]) - # We have a formatted value or custom property as well - jscode += ("%s.setCell(%d, %d, %s, %s%s);\n" % - (name, i, j, - self.EscapeForJSCode(encoder, value[0]), - self.EscapeForJSCode(encoder, value[1]), cell_cp)) - else: - jscode += "%s.setCell(%d, %d, %s);\n" % ( - name, i, j, self.EscapeForJSCode(encoder, value)) - if cp: - jscode += "%s.setRowProperties(%d, %s);\n" % ( - name, i, encoder.encode(cp)) - return jscode - - def ToHtml(self, columns_order=None, order_by=()): - """Writes the data table as an HTML table code string. - - Args: - columns_order: Optional. Specifies the order of columns in the - output table. Specify a list of all column IDs in the order - in which you want the table created. - Note that you must list all column IDs in this parameter, - if you use it. - order_by: Optional. Specifies the name of the column(s) to sort by. - Passed as is to _PreparedData. - - Returns: - An HTML table code string. - Example result (the result is without the newlines): - <html><body><table border="1"> - <thead><tr><th>a</th><th>b</th><th>c</th></tr></thead> - <tbody> - <tr><td>1</td><td>"z"</td><td>2</td></tr> - <tr><td>"3$"</td><td>"w"</td><td></td></tr> - </tbody> - </table></body></html> - - Raises: - DataTableException: The data does not match the type. - """ - table_template = "<html><body><table border=\"1\">%s</table></body></html>" - columns_template = "<thead><tr>%s</tr></thead>" - rows_template = "<tbody>%s</tbody>" - row_template = "<tr>%s</tr>" - header_cell_template = "<th>%s</th>" - cell_template = "<td>%s</td>" - - if columns_order is None: - columns_order = [col["id"] for col in self.__columns] - col_dict = dict([(col["id"], col) for col in self.__columns]) - - columns_list = [] - for col in columns_order: - columns_list.append(header_cell_template % - cgi.escape(col_dict[col]["label"])) - columns_html = columns_template % "".join(columns_list) - - rows_list = [] - # We now go over the data and add each row - for row, unused_cp in self._PreparedData(order_by): - cells_list = [] - # We add all the elements of this row by their order - for col in columns_order: - # For empty string we want empty quotes (""). - value = "" - if col in row and row[col] is not None: - value = self.CoerceValue(row[col], col_dict[col]["type"]) - if isinstance(value, tuple): - # We have a formatted value and we're going to use it - cells_list.append(cell_template % cgi.escape(self.ToString(value[1]))) - else: - cells_list.append(cell_template % cgi.escape(self.ToString(value))) - rows_list.append(row_template % "".join(cells_list)) - rows_html = rows_template % "".join(rows_list) - - return table_template % (columns_html + rows_html) - - def ToCsv(self, columns_order=None, order_by=(), separator=","): - """Writes the data table as a CSV string. - - Output is encoded in UTF-8 because the Python "csv" module can't handle - Unicode properly according to its documentation. - - Args: - columns_order: Optional. Specifies the order of columns in the - output table. Specify a list of all column IDs in the order - in which you want the table created. - Note that you must list all column IDs in this parameter, - if you use it. - order_by: Optional. Specifies the name of the column(s) to sort by. - Passed as is to _PreparedData. - separator: Optional. The separator to use between the values. - - Returns: - A CSV string representing the table. - Example result: - 'a','b','c' - 1,'z',2 - 3,'w','' - - Raises: - DataTableException: The data does not match the type. - """ - - csv_buffer = cStringIO.StringIO() - writer = csv.writer(csv_buffer, delimiter=separator) - - if columns_order is None: - columns_order = [col["id"] for col in self.__columns] - col_dict = dict([(col["id"], col) for col in self.__columns]) - - writer.writerow([col_dict[col]["label"].encode("utf-8") - for col in columns_order]) - - # We now go over the data and add each row - for row, unused_cp in self._PreparedData(order_by): - cells_list = [] - # We add all the elements of this row by their order - for col in columns_order: - value = "" - if col in row and row[col] is not None: - value = self.CoerceValue(row[col], col_dict[col]["type"]) - if isinstance(value, tuple): - # We have a formatted value. Using it only for date/time types. - if col_dict[col]["type"] in ["date", "datetime", "timeofday"]: - cells_list.append(self.ToString(value[1]).encode("utf-8")) - else: - cells_list.append(self.ToString(value[0]).encode("utf-8")) - else: - cells_list.append(self.ToString(value).encode("utf-8")) - writer.writerow(cells_list) - return csv_buffer.getvalue() - - def ToTsvExcel(self, columns_order=None, order_by=()): - """Returns a file in tab-separated-format readable by MS Excel. - - Returns a file in UTF-16 little endian encoding, with tabs separating the - values. - - Args: - columns_order: Delegated to ToCsv. - order_by: Delegated to ToCsv. - - Returns: - A tab-separated little endian UTF16 file representing the table. - """ - return (self.ToCsv(columns_order, order_by, separator="\t") - .decode("utf-8").encode("UTF-16LE")) - - def _ToJSonObj(self, columns_order=None, order_by=()): - """Returns an object suitable to be converted to JSON. - - Args: - columns_order: Optional. A list of all column IDs in the order in which - you want them created in the output table. If specified, - all column IDs must be present. - order_by: Optional. Specifies the name of the column(s) to sort by. - Passed as is to _PreparedData(). - - Returns: - A dictionary object for use by ToJSon or ToJSonResponse. - """ - if columns_order is None: - columns_order = [col["id"] for col in self.__columns] - col_dict = dict([(col["id"], col) for col in self.__columns]) - - # Creating the column JSON objects - col_objs = [] - for col_id in columns_order: - col_obj = {"id": col_dict[col_id]["id"], - "label": col_dict[col_id]["label"], - "type": col_dict[col_id]["type"]} - if col_dict[col_id]["custom_properties"]: - col_obj["p"] = col_dict[col_id]["custom_properties"] - col_objs.append(col_obj) - - # Creating the rows jsons - row_objs = [] - for row, cp in self._PreparedData(order_by): - cell_objs = [] - for col in columns_order: - value = self.CoerceValue(row.get(col, None), col_dict[col]["type"]) - if value is None: - cell_obj = None - elif isinstance(value, tuple): - cell_obj = {"v": value[0]} - if len(value) > 1 and value[1] is not None: - cell_obj["f"] = value[1] - if len(value) == 3: - cell_obj["p"] = value[2] - else: - cell_obj = {"v": value} - cell_objs.append(cell_obj) - row_obj = {"c": cell_objs} - if cp: - row_obj["p"] = cp - row_objs.append(row_obj) - - json_obj = {"cols": col_objs, "rows": row_objs} - if self.custom_properties: - json_obj["p"] = self.custom_properties - - return json_obj - - def ToJSon(self, columns_order=None, order_by=()): - """Returns a string that can be used in a JS DataTable constructor. - - This method writes a JSON string that can be passed directly into a Google - Visualization API DataTable constructor. Use this output if you are - hosting the visualization HTML on your site, and want to code the data - table in Python. Pass this string into the - google.visualization.DataTable constructor, e.g,: - ... on my page that hosts my visualization ... - google.setOnLoadCallback(drawTable); - function drawTable() { - var data = new google.visualization.DataTable(_my_JSon_string, 0.6); - myTable.draw(data); - } - - Args: - columns_order: Optional. Specifies the order of columns in the - output table. Specify a list of all column IDs in the order - in which you want the table created. - Note that you must list all column IDs in this parameter, - if you use it. - order_by: Optional. Specifies the name of the column(s) to sort by. - Passed as is to _PreparedData(). - - Returns: - A JSon constructor string to generate a JS DataTable with the data - stored in the DataTable object. - Example result (the result is without the newlines): - {cols: [{id:"a",label:"a",type:"number"}, - {id:"b",label:"b",type:"string"}, - {id:"c",label:"c",type:"number"}], - rows: [{c:[{v:1},{v:"z"},{v:2}]}, c:{[{v:3,f:"3$"},{v:"w"},{v:null}]}], - p: {'foo': 'bar'}} - - Raises: - DataTableException: The data does not match the type. - """ - - encoder = DataTableJSONEncoder() - return encoder.encode( - self._ToJSonObj(columns_order, order_by)).encode("utf-8") - - def ToJSonResponse(self, columns_order=None, order_by=(), req_id=0, - response_handler="google.visualization.Query.setResponse"): - """Writes a table as a JSON response that can be returned as-is to a client. - - This method writes a JSON response to return to a client in response to a - Google Visualization API query. This string can be processed by the calling - page, and is used to deliver a data table to a visualization hosted on - a different page. - - Args: - columns_order: Optional. Passed straight to self.ToJSon(). - order_by: Optional. Passed straight to self.ToJSon(). - req_id: Optional. The response id, as retrieved by the request. - response_handler: Optional. The response handler, as retrieved by the - request. - - Returns: - A JSON response string to be received by JS the visualization Query - object. This response would be translated into a DataTable on the - client side. - Example result (newlines added for readability): - google.visualization.Query.setResponse({ - 'version':'0.6', 'reqId':'0', 'status':'OK', - 'table': {cols: [...], rows: [...]}}); - - Note: The URL returning this string can be used as a data source by Google - Visualization Gadgets or from JS code. - """ - - response_obj = { - "version": "0.6", - "reqId": str(req_id), - "table": self._ToJSonObj(columns_order, order_by), - "status": "ok" - } - encoder = DataTableJSONEncoder() - return "%s(%s);" % (response_handler, - encoder.encode(response_obj).encode("utf-8")) - - def ToResponse(self, columns_order=None, order_by=(), tqx=""): - """Writes the right response according to the request string passed in tqx. - - This method parses the tqx request string (format of which is defined in - the documentation for implementing a data source of Google Visualization), - and returns the right response according to the request. - It parses out the "out" parameter of tqx, calls the relevant response - (ToJSonResponse() for "json", ToCsv() for "csv", ToHtml() for "html", - ToTsvExcel() for "tsv-excel") and passes the response function the rest of - the relevant request keys. - - Args: - columns_order: Optional. Passed as is to the relevant response function. - order_by: Optional. Passed as is to the relevant response function. - tqx: Optional. The request string as received by HTTP GET. Should be in - the format "key1:value1;key2:value2...". All keys have a default - value, so an empty string will just do the default (which is calling - ToJSonResponse() with no extra parameters). - - Returns: - A response string, as returned by the relevant response function. - - Raises: - DataTableException: One of the parameters passed in tqx is not supported. - """ - tqx_dict = {} - if tqx: - tqx_dict = dict(opt.split(":") for opt in tqx.split(";")) - if tqx_dict.get("version", "0.6") != "0.6": - raise DataTableException( - "Version (%s) passed by request is not supported." - % tqx_dict["version"]) - - if tqx_dict.get("out", "json") == "json": - response_handler = tqx_dict.get("responseHandler", - "google.visualization.Query.setResponse") - return self.ToJSonResponse(columns_order, order_by, - req_id=tqx_dict.get("reqId", 0), - response_handler=response_handler) - elif tqx_dict["out"] == "html": - return self.ToHtml(columns_order, order_by) - elif tqx_dict["out"] == "csv": - return self.ToCsv(columns_order, order_by) - elif tqx_dict["out"] == "tsv-excel": - return self.ToTsvExcel(columns_order, order_by) - else: - raise DataTableException( - "'out' parameter: '%s' is not supported" % tqx_dict["out"]) diff --git a/third_party/aom/test/hash_test.cc b/third_party/aom/test/hash_test.cc deleted file mode 100644 index e9f7f63c9..000000000 --- a/third_party/aom/test/hash_test.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdlib> -#include <new> - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "aom_ports/aom_timer.h" -#include "av1/encoder/hash.h" -#include "test/acm_random.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -typedef uint32_t (*get_crc32c_value_func)(void *calculator, uint8_t *p, - int length); - -typedef ::testing::tuple<get_crc32c_value_func, int> HashParam; - -class AV1Crc32cHashTest : public ::testing::TestWithParam<HashParam> { - public: - ~AV1Crc32cHashTest(); - void SetUp(); - - void TearDown(); - - protected: - void RunCheckOutput(get_crc32c_value_func test_impl); - void RunSpeedTest(get_crc32c_value_func test_impl); - - void RunZeroTest(get_crc32c_value_func test_impl); - - libaom_test::ACMRandom rnd_; - CRC32C calc_; - uint8_t *buffer_; - int bsize_; - int length_; -}; - -AV1Crc32cHashTest::~AV1Crc32cHashTest() { ; } - -void AV1Crc32cHashTest::SetUp() { - rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed()); - av1_crc32c_calculator_init(&calc_); - - bsize_ = GET_PARAM(1); - length_ = bsize_ * bsize_ * sizeof(uint16_t); - buffer_ = new uint8_t[length_]; - ASSERT_TRUE(buffer_ != NULL); - for (int i = 0; i < length_; ++i) { - buffer_[i] = rnd_.Rand8(); - } -} - -void AV1Crc32cHashTest::TearDown() { delete[] buffer_; } - -void AV1Crc32cHashTest::RunCheckOutput(get_crc32c_value_func test_impl) { - get_crc32c_value_func ref_impl = av1_get_crc32c_value_c; - // for the same buffer crc should be the same - uint32_t crc0 = test_impl(&calc_, buffer_, length_); - uint32_t crc1 = test_impl(&calc_, buffer_, length_); - uint32_t crc2 = ref_impl(&calc_, buffer_, length_); - ASSERT_EQ(crc0, crc1); - ASSERT_EQ(crc0, crc2); // should equal to software version - // modify buffer - buffer_[0] += 1; - uint32_t crc3 = test_impl(&calc_, buffer_, length_); - uint32_t crc4 = ref_impl(&calc_, buffer_, length_); - ASSERT_NE(crc0, crc3); // crc shoud not equal to previous one - ASSERT_EQ(crc3, crc4); -} - -void AV1Crc32cHashTest::RunSpeedTest(get_crc32c_value_func test_impl) { - get_crc32c_value_func impls[] = { av1_get_crc32c_value_c, test_impl }; - const int repeat = 10000000 / (bsize_ + bsize_); - - aom_usec_timer timer; - double time[2]; - for (int i = 0; i < 2; ++i) { - aom_usec_timer_start(&timer); - for (int j = 0; j < repeat; ++j) { - impls[i](&calc_, buffer_, length_); - } - aom_usec_timer_mark(&timer); - time[i] = static_cast<double>(aom_usec_timer_elapsed(&timer)); - } - printf("hash %3dx%-3d:%7.2f/%7.2fus", bsize_, bsize_, time[0], time[1]); - printf("(%3.2f)\n", time[0] / time[1]); -} - -void AV1Crc32cHashTest::RunZeroTest(get_crc32c_value_func test_impl) { - uint8_t buffer0[1024] = { 0 }; - // for buffer with different size the crc should not be the same - const uint32_t crc0 = test_impl(&calc_, buffer0, 32); - const uint32_t crc1 = test_impl(&calc_, buffer0, 128); - const uint32_t crc2 = test_impl(&calc_, buffer0, 1024); - ASSERT_NE(crc0, crc1); - ASSERT_NE(crc0, crc2); - ASSERT_NE(crc1, crc2); -} - -TEST_P(AV1Crc32cHashTest, CheckOutput) { RunCheckOutput(GET_PARAM(0)); } - -TEST_P(AV1Crc32cHashTest, CheckZero) { RunZeroTest(GET_PARAM(0)); } - -TEST_P(AV1Crc32cHashTest, DISABLED_Speed) { RunSpeedTest(GET_PARAM(0)); } - -const int kValidBlockSize[] = { 64, 32, 8, 4 }; - -INSTANTIATE_TEST_CASE_P( - C, AV1Crc32cHashTest, - ::testing::Combine(::testing::Values(&av1_get_crc32c_value_c), - ::testing::ValuesIn(kValidBlockSize))); - -#if HAVE_SSE4_2 -INSTANTIATE_TEST_CASE_P( - SSE4_2, AV1Crc32cHashTest, - ::testing::Combine(::testing::Values(&av1_get_crc32c_value_sse4_2), - ::testing::ValuesIn(kValidBlockSize))); -#endif - -} // namespace diff --git a/third_party/aom/test/hbd_metrics_test.cc b/third_party/aom/test/hbd_metrics_test.cc deleted file mode 100644 index 09df9bde4..000000000 --- a/third_party/aom/test/hbd_metrics_test.cc +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <new> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/util.h" - -#include "config/aom_config.h" - -#include "aom_dsp/psnr.h" -#include "aom_dsp/ssim.h" -#include "aom_ports/mem.h" -#include "aom_ports/msvc.h" -#include "aom_scale/yv12config.h" - -using libaom_test::ACMRandom; - -namespace { - -typedef double (*LBDMetricFunc)(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest); -typedef double (*HBDMetricFunc)(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest, uint32_t in_bd, - uint32_t bd); - -double compute_hbd_psnr(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest, uint32_t in_bd, - uint32_t bd) { - PSNR_STATS psnr; - aom_calc_highbd_psnr(source, dest, &psnr, bd, in_bd); - return psnr.psnr[0]; -} - -double compute_psnr(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest) { - PSNR_STATS psnr; - aom_calc_psnr(source, dest, &psnr); - return psnr.psnr[0]; -} - -double compute_hbd_psnrhvs(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest, uint32_t in_bd, - uint32_t bd) { - double tempy, tempu, tempv; - return aom_psnrhvs(source, dest, &tempy, &tempu, &tempv, bd, in_bd); -} - -double compute_psnrhvs(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest) { - double tempy, tempu, tempv; - return aom_psnrhvs(source, dest, &tempy, &tempu, &tempv, 8, 8); -} - -double compute_hbd_fastssim(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest, uint32_t in_bd, - uint32_t bd) { - double tempy, tempu, tempv; - return aom_calc_fastssim(source, dest, &tempy, &tempu, &tempv, bd, in_bd); -} - -double compute_fastssim(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest) { - double tempy, tempu, tempv; - return aom_calc_fastssim(source, dest, &tempy, &tempu, &tempv, 8, 8); -} - -double compute_hbd_aomssim(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest, uint32_t in_bd, - uint32_t bd) { - double ssim, weight; - ssim = aom_highbd_calc_ssim(source, dest, &weight, bd, in_bd); - return 100 * pow(ssim / weight, 8.0); -} - -double compute_aomssim(const YV12_BUFFER_CONFIG *source, - const YV12_BUFFER_CONFIG *dest) { - double ssim, weight; - ssim = aom_calc_ssim(source, dest, &weight); - return 100 * pow(ssim / weight, 8.0); -} - -class HBDMetricsTestBase { - public: - virtual ~HBDMetricsTestBase() {} - - protected: - void RunAccuracyCheck() { - const int width = 1920; - const int height = 1080; - size_t i = 0; - const uint8_t kPixFiller = 128; - YV12_BUFFER_CONFIG lbd_src, lbd_dst; - YV12_BUFFER_CONFIG hbd_src, hbd_dst; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - double lbd_db, hbd_db; - - memset(&lbd_src, 0, sizeof(lbd_src)); - memset(&lbd_dst, 0, sizeof(lbd_dst)); - memset(&hbd_src, 0, sizeof(hbd_src)); - memset(&hbd_dst, 0, sizeof(hbd_dst)); - - aom_alloc_frame_buffer(&lbd_src, width, height, 1, 1, 0, 32, 16); - aom_alloc_frame_buffer(&lbd_dst, width, height, 1, 1, 0, 32, 16); - aom_alloc_frame_buffer(&hbd_src, width, height, 1, 1, 1, 32, 16); - aom_alloc_frame_buffer(&hbd_dst, width, height, 1, 1, 1, 32, 16); - - memset(lbd_src.buffer_alloc, kPixFiller, lbd_src.buffer_alloc_sz); - while (i < lbd_src.buffer_alloc_sz) { - uint16_t spel, dpel; - spel = lbd_src.buffer_alloc[i]; - // Create some distortion for dst buffer. - dpel = rnd.Rand8(); - lbd_dst.buffer_alloc[i] = (uint8_t)dpel; - ((uint16_t *)(hbd_src.buffer_alloc))[i] = spel << (bit_depth_ - 8); - ((uint16_t *)(hbd_dst.buffer_alloc))[i] = dpel << (bit_depth_ - 8); - i++; - } - - lbd_db = lbd_metric_(&lbd_src, &lbd_dst); - hbd_db = hbd_metric_(&hbd_src, &hbd_dst, input_bit_depth_, bit_depth_); - EXPECT_LE(fabs(lbd_db - hbd_db), threshold_); - - i = 0; - while (i < lbd_src.buffer_alloc_sz) { - uint16_t dpel; - // Create some small distortion for dst buffer. - dpel = 120 + (rnd.Rand8() >> 4); - lbd_dst.buffer_alloc[i] = (uint8_t)dpel; - ((uint16_t *)(hbd_dst.buffer_alloc))[i] = dpel << (bit_depth_ - 8); - i++; - } - - lbd_db = lbd_metric_(&lbd_src, &lbd_dst); - hbd_db = hbd_metric_(&hbd_src, &hbd_dst, input_bit_depth_, bit_depth_); - EXPECT_LE(fabs(lbd_db - hbd_db), threshold_); - - i = 0; - while (i < lbd_src.buffer_alloc_sz) { - uint16_t dpel; - // Create some small distortion for dst buffer. - dpel = 126 + (rnd.Rand8() >> 6); - lbd_dst.buffer_alloc[i] = (uint8_t)dpel; - ((uint16_t *)(hbd_dst.buffer_alloc))[i] = dpel << (bit_depth_ - 8); - i++; - } - - lbd_db = lbd_metric_(&lbd_src, &lbd_dst); - hbd_db = hbd_metric_(&hbd_src, &hbd_dst, input_bit_depth_, bit_depth_); - EXPECT_LE(fabs(lbd_db - hbd_db), threshold_); - - aom_free_frame_buffer(&lbd_src); - aom_free_frame_buffer(&lbd_dst); - aom_free_frame_buffer(&hbd_src); - aom_free_frame_buffer(&hbd_dst); - } - - int input_bit_depth_; - int bit_depth_; - double threshold_; - LBDMetricFunc lbd_metric_; - HBDMetricFunc hbd_metric_; -}; - -typedef ::testing::tuple<LBDMetricFunc, HBDMetricFunc, int, int, double> - MetricTestTParam; -class HBDMetricsTest : public HBDMetricsTestBase, - public ::testing::TestWithParam<MetricTestTParam> { - public: - virtual void SetUp() { - lbd_metric_ = GET_PARAM(0); - hbd_metric_ = GET_PARAM(1); - input_bit_depth_ = GET_PARAM(2); - bit_depth_ = GET_PARAM(3); - threshold_ = GET_PARAM(4); - } - virtual void TearDown() {} -}; - -TEST_P(HBDMetricsTest, RunAccuracyCheck) { RunAccuracyCheck(); } - -// Allow small variation due to floating point operations. -static const double kSsim_thresh = 0.001; -// Allow some additional errors accumulated in floating point operations. -static const double kFSsim_thresh = 0.03; -// Allow some extra variation due to rounding error accumulated in dct. -static const double kPhvs_thresh = 0.3; - -INSTANTIATE_TEST_CASE_P( - AOMSSIM, HBDMetricsTest, - ::testing::Values(MetricTestTParam(&compute_aomssim, &compute_hbd_aomssim, - 8, 10, kSsim_thresh), - MetricTestTParam(&compute_aomssim, &compute_hbd_aomssim, - 10, 10, kPhvs_thresh), - MetricTestTParam(&compute_aomssim, &compute_hbd_aomssim, - 8, 12, kSsim_thresh), - MetricTestTParam(&compute_aomssim, &compute_hbd_aomssim, - 12, 12, kPhvs_thresh))); -INSTANTIATE_TEST_CASE_P( - FASTSSIM, HBDMetricsTest, - ::testing::Values(MetricTestTParam(&compute_fastssim, &compute_hbd_fastssim, - 8, 10, kFSsim_thresh), - MetricTestTParam(&compute_fastssim, &compute_hbd_fastssim, - 10, 10, kFSsim_thresh), - MetricTestTParam(&compute_fastssim, &compute_hbd_fastssim, - 8, 12, kFSsim_thresh), - MetricTestTParam(&compute_fastssim, &compute_hbd_fastssim, - 12, 12, kFSsim_thresh))); -INSTANTIATE_TEST_CASE_P( - PSNRHVS, HBDMetricsTest, - ::testing::Values(MetricTestTParam(&compute_psnrhvs, &compute_hbd_psnrhvs, - 8, 10, kPhvs_thresh), - MetricTestTParam(&compute_psnrhvs, &compute_hbd_psnrhvs, - 10, 10, kPhvs_thresh), - MetricTestTParam(&compute_psnrhvs, &compute_hbd_psnrhvs, - 8, 12, kPhvs_thresh), - MetricTestTParam(&compute_psnrhvs, &compute_hbd_psnrhvs, - 12, 12, kPhvs_thresh))); -INSTANTIATE_TEST_CASE_P( - PSNR, HBDMetricsTest, - ::testing::Values( - MetricTestTParam(&compute_psnr, &compute_hbd_psnr, 8, 10, kPhvs_thresh), - MetricTestTParam(&compute_psnr, &compute_hbd_psnr, 10, 10, - kPhvs_thresh), - MetricTestTParam(&compute_psnr, &compute_hbd_psnr, 8, 12, kPhvs_thresh), - MetricTestTParam(&compute_psnr, &compute_hbd_psnr, 12, 12, - kPhvs_thresh))); -} // namespace diff --git a/third_party/aom/test/hiprec_convolve_test.cc b/third_party/aom/test/hiprec_convolve_test.cc deleted file mode 100644 index f94a0730c..000000000 --- a/third_party/aom/test/hiprec_convolve_test.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/hiprec_convolve_test_util.h" - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; -using libaom_test::AV1HighbdHiprecConvolve::AV1HighbdHiprecConvolveTest; -using libaom_test::AV1HiprecConvolve::AV1HiprecConvolveTest; - -namespace { - -TEST_P(AV1HiprecConvolveTest, CheckOutput) { RunCheckOutput(GET_PARAM(3)); } -TEST_P(AV1HiprecConvolveTest, DISABLED_SpeedTest) { - RunSpeedTest(GET_PARAM(3)); -} -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, AV1HiprecConvolveTest, - libaom_test::AV1HiprecConvolve::BuildParams( - av1_wiener_convolve_add_src_sse2)); -#endif -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AV1HiprecConvolveTest, - libaom_test::AV1HiprecConvolve::BuildParams( - av1_wiener_convolve_add_src_avx2)); -#endif -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, AV1HiprecConvolveTest, - libaom_test::AV1HiprecConvolve::BuildParams( - av1_wiener_convolve_add_src_neon)); -#endif - -#if HAVE_SSSE3 || HAVE_AVX2 -TEST_P(AV1HighbdHiprecConvolveTest, CheckOutput) { - RunCheckOutput(GET_PARAM(4)); -} -TEST_P(AV1HighbdHiprecConvolveTest, DISABLED_SpeedTest) { - RunSpeedTest(GET_PARAM(4)); -} -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P(SSSE3, AV1HighbdHiprecConvolveTest, - libaom_test::AV1HighbdHiprecConvolve::BuildParams( - av1_highbd_wiener_convolve_add_src_ssse3)); -#endif -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AV1HighbdHiprecConvolveTest, - libaom_test::AV1HighbdHiprecConvolve::BuildParams( - av1_highbd_wiener_convolve_add_src_avx2)); -#endif -#endif - -} // namespace diff --git a/third_party/aom/test/hiprec_convolve_test_util.cc b/third_party/aom/test/hiprec_convolve_test_util.cc deleted file mode 100644 index 2672bcec3..000000000 --- a/third_party/aom/test/hiprec_convolve_test_util.cc +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "test/hiprec_convolve_test_util.h" - -#include "av1/common/restoration.h" - -using ::testing::make_tuple; -using ::testing::tuple; - -namespace libaom_test { - -// Generate a random pair of filter kernels, using the ranges -// of possible values from the loop-restoration experiment -static void generate_kernels(ACMRandom *rnd, InterpKernel hkernel, - InterpKernel vkernel) { - hkernel[0] = hkernel[6] = - WIENER_FILT_TAP0_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP0_MAXV + 1 - WIENER_FILT_TAP0_MINV); - hkernel[1] = hkernel[5] = - WIENER_FILT_TAP1_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP1_MAXV + 1 - WIENER_FILT_TAP1_MINV); - hkernel[2] = hkernel[4] = - WIENER_FILT_TAP2_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP2_MAXV + 1 - WIENER_FILT_TAP2_MINV); - hkernel[3] = -(hkernel[0] + hkernel[1] + hkernel[2]); - hkernel[7] = 0; - - vkernel[0] = vkernel[6] = - WIENER_FILT_TAP0_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP0_MAXV + 1 - WIENER_FILT_TAP0_MINV); - vkernel[1] = vkernel[5] = - WIENER_FILT_TAP1_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP1_MAXV + 1 - WIENER_FILT_TAP1_MINV); - vkernel[2] = vkernel[4] = - WIENER_FILT_TAP2_MINV + - rnd->PseudoUniform(WIENER_FILT_TAP2_MAXV + 1 - WIENER_FILT_TAP2_MINV); - vkernel[3] = -(vkernel[0] + vkernel[1] + vkernel[2]); - vkernel[7] = 0; -} - -namespace AV1HiprecConvolve { - -::testing::internal::ParamGenerator<HiprecConvolveParam> BuildParams( - hiprec_convolve_func filter) { - const HiprecConvolveParam params[] = { - make_tuple(8, 8, 50000, filter), make_tuple(8, 4, 50000, filter), - make_tuple(64, 24, 1000, filter), make_tuple(64, 64, 1000, filter), - make_tuple(64, 56, 1000, filter), make_tuple(32, 8, 10000, filter), - make_tuple(32, 28, 10000, filter), make_tuple(32, 32, 10000, filter), - make_tuple(16, 34, 10000, filter), make_tuple(32, 34, 10000, filter), - make_tuple(64, 34, 1000, filter), make_tuple(8, 17, 10000, filter), - make_tuple(16, 17, 10000, filter), make_tuple(32, 17, 10000, filter) - }; - return ::testing::ValuesIn(params); -} - -AV1HiprecConvolveTest::~AV1HiprecConvolveTest() {} -void AV1HiprecConvolveTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1HiprecConvolveTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1HiprecConvolveTest::RunCheckOutput(hiprec_convolve_func test_impl) { - const int w = 128, h = 128; - const int out_w = GET_PARAM(0), out_h = GET_PARAM(1); - const int num_iters = GET_PARAM(2); - int i, j; - const ConvolveParams conv_params = get_conv_params_wiener(8); - - uint8_t *input_ = new uint8_t[h * w]; - uint8_t *input = input_; - - // The AVX2 convolve functions always write rows with widths that are - // multiples of 16. So to avoid a buffer overflow, we may need to pad - // rows to a multiple of 16. - int output_n = ALIGN_POWER_OF_TWO(out_w, 4) * out_h; - uint8_t *output = new uint8_t[output_n]; - uint8_t *output2 = new uint8_t[output_n]; - - // Generate random filter kernels - DECLARE_ALIGNED(16, InterpKernel, hkernel); - DECLARE_ALIGNED(16, InterpKernel, vkernel); - - generate_kernels(&rnd_, hkernel, vkernel); - - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - - for (i = 0; i < num_iters; ++i) { - // Choose random locations within the source block - int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_wiener_convolve_add_src_c(input + offset_r * w + offset_c, w, output, - out_w, hkernel, 16, vkernel, 16, out_w, out_h, - &conv_params); - test_impl(input + offset_r * w + offset_c, w, output2, out_w, hkernel, 16, - vkernel, 16, out_w, out_h, &conv_params); - - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" << (j % out_w) << ", " - << (j / out_w) << ") on iteration " << i; - } - delete[] input_; - delete[] output; - delete[] output2; -} - -void AV1HiprecConvolveTest::RunSpeedTest(hiprec_convolve_func test_impl) { - const int w = 128, h = 128; - const int out_w = GET_PARAM(0), out_h = GET_PARAM(1); - const int num_iters = GET_PARAM(2) / 500; - int i, j, k; - const ConvolveParams conv_params = get_conv_params_wiener(8); - - uint8_t *input_ = new uint8_t[h * w]; - uint8_t *input = input_; - - // The AVX2 convolve functions always write rows with widths that are - // multiples of 16. So to avoid a buffer overflow, we may need to pad - // rows to a multiple of 16. - int output_n = ALIGN_POWER_OF_TWO(out_w, 4) * out_h; - uint8_t *output = new uint8_t[output_n]; - uint8_t *output2 = new uint8_t[output_n]; - - // Generate random filter kernels - DECLARE_ALIGNED(16, InterpKernel, hkernel); - DECLARE_ALIGNED(16, InterpKernel, vkernel); - - generate_kernels(&rnd_, hkernel, vkernel); - - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand8(); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (i = 0; i < num_iters; ++i) { - for (j = 3; j < h - out_h - 4; j++) { - for (k = 3; k < w - out_w - 4; k++) { - av1_wiener_convolve_add_src_c(input + j * w + k, w, output, out_w, - hkernel, 16, vkernel, 16, out_w, out_h, - &conv_params); - } - } - } - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (i = 0; i < num_iters; ++i) { - for (j = 3; j < h - out_h - 4; j++) { - for (k = 3; k < w - out_w - 4; k++) { - test_impl(input + j * w + k, w, output2, out_w, hkernel, 16, vkernel, - 16, out_w, out_h, &conv_params); - } - } - } - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: AV1HiprecConvolveTest.SpeedTest, SIMD slower than C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - - delete[] input_; - delete[] output; - delete[] output2; -} -} // namespace AV1HiprecConvolve - -namespace AV1HighbdHiprecConvolve { - -::testing::internal::ParamGenerator<HighbdHiprecConvolveParam> BuildParams( - highbd_hiprec_convolve_func filter) { - const HighbdHiprecConvolveParam params[] = { - make_tuple(8, 8, 50000, 8, filter), make_tuple(64, 64, 1000, 8, filter), - make_tuple(32, 8, 10000, 8, filter), make_tuple(8, 8, 50000, 10, filter), - make_tuple(64, 64, 1000, 10, filter), make_tuple(32, 8, 10000, 10, filter), - make_tuple(8, 8, 50000, 12, filter), make_tuple(64, 64, 1000, 12, filter), - make_tuple(32, 8, 10000, 12, filter), - }; - return ::testing::ValuesIn(params); -} - -AV1HighbdHiprecConvolveTest::~AV1HighbdHiprecConvolveTest() {} -void AV1HighbdHiprecConvolveTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1HighbdHiprecConvolveTest::TearDown() { - libaom_test::ClearSystemState(); -} - -void AV1HighbdHiprecConvolveTest::RunCheckOutput( - highbd_hiprec_convolve_func test_impl) { - const int w = 128, h = 128; - const int out_w = GET_PARAM(0), out_h = GET_PARAM(1); - const int num_iters = GET_PARAM(2); - const int bd = GET_PARAM(3); - int i, j; - const ConvolveParams conv_params = get_conv_params_wiener(bd); - - uint16_t *input = new uint16_t[h * w]; - - // The AVX2 convolve functions always write rows with widths that are - // multiples of 16. So to avoid a buffer overflow, we may need to pad - // rows to a multiple of 16. - int output_n = ALIGN_POWER_OF_TWO(out_w, 4) * out_h; - uint16_t *output = new uint16_t[output_n]; - uint16_t *output2 = new uint16_t[output_n]; - - // Generate random filter kernels - DECLARE_ALIGNED(16, InterpKernel, hkernel); - DECLARE_ALIGNED(16, InterpKernel, vkernel); - - generate_kernels(&rnd_, hkernel, vkernel); - - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - - uint8_t *input_ptr = CONVERT_TO_BYTEPTR(input); - uint8_t *output_ptr = CONVERT_TO_BYTEPTR(output); - uint8_t *output2_ptr = CONVERT_TO_BYTEPTR(output2); - - for (i = 0; i < num_iters; ++i) { - // Choose random locations within the source block - int offset_r = 3 + rnd_.PseudoUniform(h - out_h - 7); - int offset_c = 3 + rnd_.PseudoUniform(w - out_w - 7); - av1_highbd_wiener_convolve_add_src_c( - input_ptr + offset_r * w + offset_c, w, output_ptr, out_w, hkernel, 16, - vkernel, 16, out_w, out_h, &conv_params, bd); - test_impl(input_ptr + offset_r * w + offset_c, w, output2_ptr, out_w, - hkernel, 16, vkernel, 16, out_w, out_h, &conv_params, bd); - - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" << (j % out_w) << ", " - << (j / out_w) << ") on iteration " << i; - } - delete[] input; - delete[] output; - delete[] output2; -} - -void AV1HighbdHiprecConvolveTest::RunSpeedTest( - highbd_hiprec_convolve_func test_impl) { - const int w = 128, h = 128; - const int out_w = GET_PARAM(0), out_h = GET_PARAM(1); - const int num_iters = GET_PARAM(2) / 500; - const int bd = GET_PARAM(3); - int i, j, k; - const ConvolveParams conv_params = get_conv_params_wiener(bd); - - uint16_t *input = new uint16_t[h * w]; - - // The AVX2 convolve functions always write rows with widths that are - // multiples of 16. So to avoid a buffer overflow, we may need to pad - // rows to a multiple of 16. - int output_n = ALIGN_POWER_OF_TWO(out_w, 4) * out_h; - uint16_t *output = new uint16_t[output_n]; - uint16_t *output2 = new uint16_t[output_n]; - - // Generate random filter kernels - DECLARE_ALIGNED(16, InterpKernel, hkernel); - DECLARE_ALIGNED(16, InterpKernel, vkernel); - - generate_kernels(&rnd_, hkernel, vkernel); - - for (i = 0; i < h; ++i) - for (j = 0; j < w; ++j) input[i * w + j] = rnd_.Rand16() & ((1 << bd) - 1); - - uint8_t *input_ptr = CONVERT_TO_BYTEPTR(input); - uint8_t *output_ptr = CONVERT_TO_BYTEPTR(output); - uint8_t *output2_ptr = CONVERT_TO_BYTEPTR(output2); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (i = 0; i < num_iters; ++i) { - for (j = 3; j < h - out_h - 4; j++) { - for (k = 3; k < w - out_w - 4; k++) { - av1_highbd_wiener_convolve_add_src_c( - input_ptr + j * w + k, w, output_ptr, out_w, hkernel, 16, vkernel, - 16, out_w, out_h, &conv_params, bd); - } - } - } - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (i = 0; i < num_iters; ++i) { - for (j = 3; j < h - out_h - 4; j++) { - for (k = 3; k < w - out_w - 4; k++) { - test_impl(input_ptr + j * w + k, w, output2_ptr, out_w, hkernel, 16, - vkernel, 16, out_w, out_h, &conv_params, bd); - } - } - } - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: AV1HighbdHiprecConvolveTest.SpeedTest, SIMD slower than C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - - delete[] input; - delete[] output; - delete[] output2; -} -} // namespace AV1HighbdHiprecConvolve -} // namespace libaom_test diff --git a/third_party/aom/test/hiprec_convolve_test_util.h b/third_party/aom/test/hiprec_convolve_test_util.h deleted file mode 100644 index 2abe24b57..000000000 --- a/third_party/aom/test/hiprec_convolve_test_util.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_HIPREC_CONVOLVE_TEST_UTIL_H_ -#define AOM_TEST_HIPREC_CONVOLVE_TEST_UTIL_H_ - -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/util.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/convolve.h" -#include "av1/common/mv.h" - -namespace libaom_test { - -namespace AV1HiprecConvolve { - -typedef void (*hiprec_convolve_func)(const uint8_t *src, ptrdiff_t src_stride, - uint8_t *dst, ptrdiff_t dst_stride, - const int16_t *filter_x, int x_step_q4, - const int16_t *filter_y, int y_step_q4, - int w, int h, - const ConvolveParams *conv_params); - -typedef ::testing::tuple<int, int, int, hiprec_convolve_func> - HiprecConvolveParam; - -::testing::internal::ParamGenerator<HiprecConvolveParam> BuildParams( - hiprec_convolve_func filter); - -class AV1HiprecConvolveTest - : public ::testing::TestWithParam<HiprecConvolveParam> { - public: - virtual ~AV1HiprecConvolveTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(hiprec_convolve_func test_impl); - void RunSpeedTest(hiprec_convolve_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -} // namespace AV1HiprecConvolve - -namespace AV1HighbdHiprecConvolve { -typedef void (*highbd_hiprec_convolve_func)( - const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, - ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4, - const int16_t *filter_y, int y_step_q4, int w, int h, - const ConvolveParams *conv_params, int bps); - -typedef ::testing::tuple<int, int, int, int, highbd_hiprec_convolve_func> - HighbdHiprecConvolveParam; - -::testing::internal::ParamGenerator<HighbdHiprecConvolveParam> BuildParams( - highbd_hiprec_convolve_func filter); - -class AV1HighbdHiprecConvolveTest - : public ::testing::TestWithParam<HighbdHiprecConvolveParam> { - public: - virtual ~AV1HighbdHiprecConvolveTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(highbd_hiprec_convolve_func test_impl); - void RunSpeedTest(highbd_hiprec_convolve_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -} // namespace AV1HighbdHiprecConvolve - -} // namespace libaom_test - -#endif // AOM_TEST_HIPREC_CONVOLVE_TEST_UTIL_H_ diff --git a/third_party/aom/test/horz_superres_test.cc b/third_party/aom/test/horz_superres_test.cc deleted file mode 100644 index 973f55b66..000000000 --- a/third_party/aom/test/horz_superres_test.cc +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "av1/encoder/encoder.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/util.h" -#include "test/y4m_video_source.h" -#include "test/yuv_video_source.h" - -namespace { - -using ::testing::make_tuple; -using ::testing::tuple; - -/* TESTING PARAMETERS */ - -#define NUM_TEST_VIDEOS 3 - -const int kBitrate = 40; - -// PSNR thresholds found by experiment -const double kPSNRThresholds[] = { 26.0, 28.0, 20.0 }; - -typedef struct { - const char *filename; - aom_img_fmt fmt; - aom_bit_depth_t bit_depth; - unsigned int profile; - unsigned int limit; - unsigned int screen_content; -} TestVideoParam; - -const TestVideoParam kTestVideoVectors[] = { - { "park_joy_90p_8_420.y4m", AOM_IMG_FMT_I420, AOM_BITS_8, 0, 5, 0 }, - { "park_joy_90p_10_444.y4m", AOM_IMG_FMT_I44416, AOM_BITS_10, 1, 5, 0 }, - { "screendata.y4m", AOM_IMG_FMT_I420, AOM_BITS_8, 0, 4, 1 }, -}; - -// Superres modes tested -// SUPERRES_QTHRESH is not included, as it has its own test -const SUPERRES_MODE kSuperresModesNotQThresh[] = { SUPERRES_FIXED, - SUPERRES_RANDOM }; - -// Superres denominators and superres kf denominators to be tested -typedef tuple<int, int> SuperresDenominatorPair; -const SuperresDenominatorPair kSuperresDenominators[] = { - make_tuple(16, 9), make_tuple(13, 11), make_tuple(9, 9), - make_tuple(13, 13), make_tuple(11, 16), make_tuple(8, 16), - make_tuple(16, 8), make_tuple(8, 8), make_tuple(9, 14), -}; - -// Superres q thresholds and superres kf q thresholds to be tested -typedef tuple<int, int> SuperresQThresholdPair; -const SuperresQThresholdPair kSuperresQThresholds[] = { - make_tuple(63, 63), make_tuple(63, 41), make_tuple(17, 63), - make_tuple(41, 11), make_tuple(1, 37), make_tuple(11, 11), - make_tuple(1, 1), make_tuple(17, 29), make_tuple(29, 11), -}; - -/* END (TESTING PARAMETERS) */ - -// Test parameter list: -// <[needed for EncoderTest], test_video_idx_, superres_mode_, -// tuple(superres_denom_, superres_kf_denom_)> -typedef tuple<const libaom_test::CodecFactory *, int, SUPERRES_MODE, - SuperresDenominatorPair> - HorzSuperresTestParam; - -class HorzSuperresEndToEndTest - : public ::testing::TestWithParam<HorzSuperresTestParam>, - public ::libaom_test::EncoderTest { - protected: - HorzSuperresEndToEndTest() - : EncoderTest(GET_PARAM(0)), test_video_idx_(GET_PARAM(1)), - superres_mode_(GET_PARAM(2)), psnr_(0.0), frame_count_(0) { - test_video_param_ = kTestVideoVectors[test_video_idx_]; - - SuperresDenominatorPair denoms = GET_PARAM(3); - superres_denom_ = ::testing::get<0>(denoms); - superres_kf_denom_ = ::testing::get<1>(denoms); - } - - virtual ~HorzSuperresEndToEndTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(::libaom_test::kTwoPassGood); - cfg_.g_lag_in_frames = 5; - cfg_.rc_end_usage = AOM_VBR; - cfg_.rc_target_bitrate = kBitrate; - cfg_.g_error_resilient = 0; - cfg_.g_profile = test_video_param_.profile; - cfg_.g_input_bit_depth = (unsigned int)test_video_param_.bit_depth; - cfg_.g_bit_depth = test_video_param_.bit_depth; - init_flags_ = AOM_CODEC_USE_PSNR; - if (cfg_.g_bit_depth > 8) init_flags_ |= AOM_CODEC_USE_HIGHBITDEPTH; - - // Set superres parameters - cfg_.rc_superres_mode = superres_mode_; - cfg_.rc_superres_denominator = superres_denom_; - cfg_.rc_superres_kf_denominator = superres_kf_denom_; - } - - virtual void BeginPassHook(unsigned int) { - psnr_ = 0.0; - frame_count_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - psnr_ += pkt->data.psnr.psnr[0]; - frame_count_++; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AV1E_SET_TILE_COLUMNS, 4); - - // Set cpu-used = 8 for speed - encoder->Control(AOME_SET_CPUUSED, 8); - - // Test screen coding tools - if (test_video_param_.screen_content) - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN); - else - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_DEFAULT); - - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - - double GetAveragePsnr() const { - if (frame_count_) return psnr_ / frame_count_; - return 0.0; - } - - double GetPsnrThreshold() { return kPSNRThresholds[test_video_idx_]; } - - void DoTest() { - testing::internal::scoped_ptr<libaom_test::VideoSource> video; - video.reset(new libaom_test::Y4mVideoSource(test_video_param_.filename, 0, - test_video_param_.limit)); - ASSERT_TRUE(video.get() != NULL); - - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); - const double psnr = GetAveragePsnr(); - EXPECT_GT(psnr, GetPsnrThreshold()) - << "superres_mode_ = " << superres_mode_ - << ", superres_denom_ = " << superres_denom_ - << ", superres_kf_denom_ = " << superres_kf_denom_; - - EXPECT_EQ(test_video_param_.limit, frame_count_) - << "superres_mode_ = " << superres_mode_ - << ", superres_denom_ = " << superres_denom_ - << ", superres_kf_denom_ = " << superres_kf_denom_; - } - - int test_video_idx_; - TestVideoParam test_video_param_; - SUPERRES_MODE superres_mode_; - int superres_denom_; - int superres_kf_denom_; - - private: - double psnr_; - unsigned int frame_count_; -}; - -TEST_P(HorzSuperresEndToEndTest, HorzSuperresEndToEndPSNRTest) { DoTest(); } - -AV1_INSTANTIATE_TEST_CASE(HorzSuperresEndToEndTest, - ::testing::Range(0, NUM_TEST_VIDEOS), - ::testing::ValuesIn(kSuperresModesNotQThresh), - ::testing::ValuesIn(kSuperresDenominators)); - -// Test parameter list: -// <[needed for EncoderTest], test_video_idx_, tuple(superres_denom_, -// superres_kf_denom_), tuple(superres_qthresh_,superres_kf_qthresh_)> -typedef tuple<const libaom_test::CodecFactory *, int, SuperresDenominatorPair, - SuperresQThresholdPair> - HorzSuperresQThreshTestParam; - -class HorzSuperresQThreshEndToEndTest - : public ::testing::TestWithParam<HorzSuperresQThreshTestParam>, - public ::libaom_test::EncoderTest { - protected: - HorzSuperresQThreshEndToEndTest() - : EncoderTest(GET_PARAM(0)), test_video_idx_(GET_PARAM(1)), - superres_mode_(SUPERRES_QTHRESH), psnr_(0.0), frame_count_(0) { - test_video_param_ = kTestVideoVectors[test_video_idx_]; - - SuperresDenominatorPair denoms = GET_PARAM(2); - superres_denom_ = ::testing::get<0>(denoms); - superres_kf_denom_ = ::testing::get<1>(denoms); - - SuperresQThresholdPair qthresholds = GET_PARAM(3); - superres_qthresh_ = ::testing::get<0>(qthresholds); - superres_kf_qthresh_ = ::testing::get<1>(qthresholds); - } - - virtual ~HorzSuperresQThreshEndToEndTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(::libaom_test::kTwoPassGood); - cfg_.g_lag_in_frames = 5; - cfg_.rc_end_usage = AOM_VBR; - cfg_.rc_target_bitrate = kBitrate; - cfg_.g_error_resilient = 0; - cfg_.g_profile = test_video_param_.profile; - cfg_.g_input_bit_depth = (unsigned int)test_video_param_.bit_depth; - cfg_.g_bit_depth = test_video_param_.bit_depth; - init_flags_ = AOM_CODEC_USE_PSNR; - if (cfg_.g_bit_depth > 8) init_flags_ |= AOM_CODEC_USE_HIGHBITDEPTH; - - // Set superres parameters - cfg_.rc_superres_mode = superres_mode_; - cfg_.rc_superres_denominator = superres_denom_; - cfg_.rc_superres_kf_denominator = superres_kf_denom_; - cfg_.rc_superres_qthresh = superres_qthresh_; - cfg_.rc_superres_kf_qthresh = superres_kf_qthresh_; - } - - virtual void BeginPassHook(unsigned int) { - psnr_ = 0.0; - frame_count_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - psnr_ += pkt->data.psnr.psnr[0]; - frame_count_++; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1); - encoder->Control(AV1E_SET_TILE_COLUMNS, 0); - - // Set cpu-used = 8 for speed - encoder->Control(AOME_SET_CPUUSED, 8); - - // Test screen coding tools - if (test_video_param_.screen_content) - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN); - else - encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_DEFAULT); - - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - - double GetAveragePsnr() const { - if (frame_count_) return psnr_ / frame_count_; - return 0.0; - } - - double GetPsnrThreshold() { return kPSNRThresholds[test_video_idx_]; } - - void DoTest() { - testing::internal::scoped_ptr<libaom_test::VideoSource> video; - video.reset(new libaom_test::Y4mVideoSource(test_video_param_.filename, 0, - test_video_param_.limit)); - ASSERT_TRUE(video.get() != NULL); - - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); - const double psnr = GetAveragePsnr(); - EXPECT_GT(psnr, GetPsnrThreshold()) - << "superres_mode_ = " << superres_mode_ - << ", superres_denom_ = " << superres_denom_ - << ", superres_kf_denom_ = " << superres_kf_denom_ - << ", superres_qthresh_ = " << superres_qthresh_ - << ", superres_kf_qthresh_ = " << superres_kf_qthresh_; - - EXPECT_EQ(test_video_param_.limit, frame_count_) - << "superres_mode_ = " << superres_mode_ - << ", superres_denom_ = " << superres_denom_ - << ", superres_kf_denom_ = " << superres_kf_denom_ - << ", superres_qthresh_ = " << superres_qthresh_ - << ", superres_kf_qthresh_ = " << superres_kf_qthresh_; - } - - int test_video_idx_; - TestVideoParam test_video_param_; - SUPERRES_MODE superres_mode_; - int superres_denom_; - int superres_kf_denom_; - int superres_qthresh_; - int superres_kf_qthresh_; - - private: - double psnr_; - unsigned int frame_count_; -}; - -TEST_P(HorzSuperresQThreshEndToEndTest, HorzSuperresQThreshEndToEndPSNRTest) { - DoTest(); -} - -AV1_INSTANTIATE_TEST_CASE(HorzSuperresQThreshEndToEndTest, - ::testing::Range(0, NUM_TEST_VIDEOS), - ::testing::ValuesIn(kSuperresDenominators), - ::testing::ValuesIn(kSuperresQThresholds)); - -} // namespace diff --git a/third_party/aom/test/i420_video_source.h b/third_party/aom/test/i420_video_source.h deleted file mode 100644 index 233e7152b..000000000 --- a/third_party/aom/test/i420_video_source.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_I420_VIDEO_SOURCE_H_ -#define AOM_TEST_I420_VIDEO_SOURCE_H_ -#include <cstdio> -#include <cstdlib> -#include <string> - -#include "test/yuv_video_source.h" - -namespace libaom_test { - -// This class extends VideoSource to allow parsing of raw yv12 -// so that we can do actual file encodes. -class I420VideoSource : public YUVVideoSource { - public: - I420VideoSource(const std::string &file_name, unsigned int width, - unsigned int height, int rate_numerator, int rate_denominator, - unsigned int start, int limit) - : YUVVideoSource(file_name, AOM_IMG_FMT_I420, width, height, - rate_numerator, rate_denominator, start, limit) {} -}; - -} // namespace libaom_test - -#endif // AOM_TEST_I420_VIDEO_SOURCE_H_ diff --git a/third_party/aom/test/intra_edge_test.cc b/third_party/aom/test/intra_edge_test.cc deleted file mode 100644 index ce61402ac..000000000 --- a/third_party/aom/test/intra_edge_test.cc +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/register_state_check.h" -#include "test/function_equivalence_test.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" -#include "config/av1_rtcd.h" - -#include "aom/aom_integer.h" -#include "av1/common/enums.h" - -using libaom_test::FunctionEquivalenceTest; - -namespace { - -template <typename F, typename T> -class UpsampleTest : public FunctionEquivalenceTest<F> { - protected: - static const int kIterations = 1000000; - static const int kMinEdge = 4; - static const int kMaxEdge = 24; - static const int kBufSize = 2 * 64 + 32; - static const int kOffset = 16; - - virtual ~UpsampleTest() {} - - virtual void Execute(T *edge_tst) = 0; - - void Common() { - edge_ref_ = &edge_ref_data_[kOffset]; - edge_tst_ = &edge_tst_data_[kOffset]; - - Execute(edge_tst_); - - const int max_idx = (size_ - 1) * 2; - for (int r = -2; r <= max_idx; ++r) { - ASSERT_EQ(edge_ref_[r], edge_tst_[r]); - } - } - - T edge_ref_data_[kBufSize]; - T edge_tst_data_[kBufSize]; - - T *edge_ref_; - T *edge_tst_; - - int size_; -}; - -////////////////////////////////////////////////////////////////////////////// -// 8 bit version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*UP8B)(uint8_t *p, int size); -typedef libaom_test::FuncParam<UP8B> TestFuncs; - -class UpsampleTest8B : public UpsampleTest<UP8B, uint8_t> { - protected: - void Execute(uint8_t *edge_tst) { - params_.ref_func(edge_ref_, size_); - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst, size_)); - } -}; - -TEST_P(UpsampleTest8B, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - size_ = 4 * (this->rng_(4) + 1); - - int i, pix = 0; - for (i = 0; i < kOffset + size_; ++i) { - pix = rng_.Rand8(); - edge_ref_data_[i] = pix; - edge_tst_data_[i] = edge_ref_data_[i]; - } - - // Extend final sample - while (i < kBufSize) { - edge_ref_data_[i] = pix; - edge_tst_data_[i] = pix; - i++; - } - - Common(); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, UpsampleTest8B, - ::testing::Values(TestFuncs(av1_upsample_intra_edge_c, - av1_upsample_intra_edge_sse4_1))); -#endif // HAVE_SSE4_1 - -////////////////////////////////////////////////////////////////////////////// -// High bit-depth version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*UPHB)(uint16_t *p, int size, int bd); -typedef libaom_test::FuncParam<UPHB> TestFuncsHBD; - -class UpsampleTestHB : public UpsampleTest<UPHB, uint16_t> { - protected: - void Execute(uint16_t *edge_tst) { - params_.ref_func(edge_ref_, size_, bit_depth_); - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst, size_, bit_depth_)); - } - int bit_depth_; -}; - -TEST_P(UpsampleTestHB, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - const int hi = 1 << bit_depth_; - - size_ = 4 * (this->rng_(4) + 1); - - int i, pix = 0; - for (i = 0; i < kOffset + size_; ++i) { - pix = rng_(hi); - edge_ref_data_[i] = pix; - edge_tst_data_[i] = pix; - } - - // Extend final sample - while (i < kBufSize) { - edge_ref_data_[i] = pix; - edge_tst_data_[i] = pix; - i++; - } - - Common(); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, UpsampleTestHB, - ::testing::Values(TestFuncsHBD(av1_upsample_intra_edge_high_c, - av1_upsample_intra_edge_high_sse4_1))); -#endif // HAVE_SSE4_1 - -template <typename F, typename T> -class FilterEdgeTest : public FunctionEquivalenceTest<F> { - protected: - static const int kIterations = 1000000; - static const int kMaxEdge = 2 * 64; - static const int kBufSize = kMaxEdge + 32; - static const int kOffset = 15; - - virtual ~FilterEdgeTest() {} - - virtual void Execute(T *edge_tst) = 0; - - void Common() { - edge_ref_ = &edge_ref_data_[kOffset]; - edge_tst_ = &edge_tst_data_[kOffset]; - - Execute(edge_tst_); - - for (int r = 0; r < size_; ++r) { - ASSERT_EQ(edge_ref_[r], edge_tst_[r]); - } - } - - T edge_ref_data_[kBufSize]; - T edge_tst_data_[kBufSize]; - - T *edge_ref_; - T *edge_tst_; - - int size_; - int strength_; -}; - -////////////////////////////////////////////////////////////////////////////// -// 8 bit version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FE8B)(uint8_t *p, int size, int strength); -typedef libaom_test::FuncParam<FE8B> FilterEdgeTestFuncs; - -class FilterEdgeTest8B : public FilterEdgeTest<FE8B, uint8_t> { - protected: - void Execute(uint8_t *edge_tst) { - params_.ref_func(edge_ref_, size_, strength_); - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst, size_, strength_)); - } -}; - -TEST_P(FilterEdgeTest8B, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - strength_ = this->rng_(4); - size_ = 4 * (this->rng_(128 / 4) + 1) + 1; - - int i, pix = 0; - for (i = 0; i < kOffset + size_; ++i) { - pix = rng_.Rand8(); - edge_ref_data_[i] = pix; - edge_tst_data_[i] = pix; - } - - Common(); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, FilterEdgeTest8B, - ::testing::Values(FilterEdgeTestFuncs(av1_filter_intra_edge_c, - av1_filter_intra_edge_sse4_1))); -#endif // HAVE_SSE4_1 - -////////////////////////////////////////////////////////////////////////////// -// High bit-depth version -////////////////////////////////////////////////////////////////////////////// - -typedef void (*FEHB)(uint16_t *p, int size, int strength); -typedef libaom_test::FuncParam<FEHB> FilterEdgeTestFuncsHBD; - -class FilterEdgeTestHB : public FilterEdgeTest<FEHB, uint16_t> { - protected: - void Execute(uint16_t *edge_tst) { - params_.ref_func(edge_ref_, size_, strength_); - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst, size_, strength_)); - } - int bit_depth_; -}; - -TEST_P(FilterEdgeTestHB, RandomValues) { - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - switch (rng_(3)) { - case 0: bit_depth_ = 8; break; - case 1: bit_depth_ = 10; break; - default: bit_depth_ = 12; break; - } - const int hi = 1 << bit_depth_; - strength_ = this->rng_(4); - size_ = 4 * (this->rng_(128 / 4) + 1) + 1; - - int i, pix = 0; - for (i = 0; i < kOffset + size_; ++i) { - pix = rng_(hi); - edge_ref_data_[i] = pix; - edge_tst_data_[i] = pix; - } - - Common(); - } -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, FilterEdgeTestHB, - ::testing::Values(FilterEdgeTestFuncsHBD( - av1_filter_intra_edge_high_c, - av1_filter_intra_edge_high_sse4_1))); -#endif // HAVE_SSE4_1 - -// Speed tests - -TEST_P(UpsampleTest8B, DISABLED_Speed) { - const int test_count = 10000000; - size_ = kMaxEdge; - for (int i = 0; i < kOffset + size_; ++i) { - edge_tst_data_[i] = rng_.Rand8(); - } - edge_tst_ = &edge_tst_data_[kOffset]; - for (int iter = 0; iter < test_count; ++iter) { - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst_, size_)); - } -} - -TEST_P(UpsampleTestHB, DISABLED_Speed) { - const int test_count = 10000000; - size_ = kMaxEdge; - bit_depth_ = 12; - const int hi = 1 << bit_depth_; - for (int i = 0; i < kOffset + size_; ++i) { - edge_tst_data_[i] = rng_(hi); - } - edge_tst_ = &edge_tst_data_[kOffset]; - for (int iter = 0; iter < test_count; ++iter) { - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst_, size_, bit_depth_)); - } -} - -TEST_P(FilterEdgeTest8B, DISABLED_Speed) { - const int test_count = 10000000; - size_ = kMaxEdge; - strength_ = 1; - for (int i = 0; i < kOffset + size_; ++i) { - edge_tst_data_[i] = rng_.Rand8(); - } - edge_tst_ = &edge_tst_data_[kOffset]; - for (int iter = 0; iter < test_count; ++iter) { - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst_, size_, strength_)); - // iterate over filter strengths (1,2,3) - strength_ = (strength_ == 3) ? 1 : strength_ + 1; - } -} - -TEST_P(FilterEdgeTestHB, DISABLED_Speed) { - const int test_count = 10000000; - size_ = kMaxEdge; - strength_ = 1; - bit_depth_ = 12; - const int hi = 1 << bit_depth_; - for (int i = 0; i < kOffset + size_; ++i) { - edge_tst_data_[i] = rng_(hi); - } - edge_tst_ = &edge_tst_data_[kOffset]; - for (int iter = 0; iter < test_count; ++iter) { - ASM_REGISTER_STATE_CHECK(params_.tst_func(edge_tst_, size_, strength_)); - // iterate over filter strengths (1,2,3) - strength_ = (strength_ == 3) ? 1 : strength_ + 1; - } -} - -} // namespace diff --git a/third_party/aom/test/intrabc_test.cc b/third_party/aom/test/intrabc_test.cc deleted file mode 100644 index 3ea421708..000000000 --- a/third_party/aom/test/intrabc_test.cc +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "av1/common/blockd.h" -#include "av1/common/enums.h" -#include "av1/common/mv.h" -#include "av1/common/mvref_common.h" -#include "av1/common/onyxc_int.h" -#include "av1/common/tile_common.h" - -namespace { -TEST(IntrabcTest, DvValidation) { - struct DvTestCase { - MV dv; - int mi_row_offset; - int mi_col_offset; - BLOCK_SIZE bsize; - bool valid; - }; - const int kSubPelScale = 8; - const int kTileMaxMibWidth = 8; - const DvTestCase kDvCases[] = { - { { 0, 0 }, 0, 0, BLOCK_128X128, false }, - { { 0, 0 }, 0, 0, BLOCK_64X64, false }, - { { 0, 0 }, 0, 0, BLOCK_32X32, false }, - { { 0, 0 }, 0, 0, BLOCK_16X16, false }, - { { 0, 0 }, 0, 0, BLOCK_8X8, false }, - { { 0, 0 }, 0, 0, BLOCK_4X4, false }, - { { -MAX_SB_SIZE * kSubPelScale, -MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_16X16, - true }, - { { 0, -MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_16X16, - false }, - { { -MAX_SB_SIZE * kSubPelScale, 0 }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_16X16, - true }, - { { MAX_SB_SIZE * kSubPelScale, 0 }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_16X16, - false }, - { { 0, MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_16X16, - false }, - { { -32 * kSubPelScale, -32 * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_32X32, - true }, - { { -32 * kSubPelScale, -32 * kSubPelScale }, - 32 / MI_SIZE, - 32 / MI_SIZE, - BLOCK_32X32, - false }, - { { -32 * kSubPelScale - kSubPelScale / 2, -32 * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_32X32, - false }, - { { -33 * kSubPelScale, -32 * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_32X32, - true }, - { { -32 * kSubPelScale, -32 * kSubPelScale - kSubPelScale / 2 }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_32X32, - false }, - { { -32 * kSubPelScale, -33 * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_32X32, - true }, - { { -MAX_SB_SIZE * kSubPelScale, -MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - true }, - { { -(MAX_SB_SIZE + 1) * kSubPelScale, -MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -MAX_SB_SIZE * kSubPelScale, -(MAX_SB_SIZE + 1) * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -(MAX_SB_SIZE - 1) * kSubPelScale, -MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -MAX_SB_SIZE * kSubPelScale, -(MAX_SB_SIZE - 1) * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - true }, - { { -(MAX_SB_SIZE - 1) * kSubPelScale, -(MAX_SB_SIZE - 1) * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -MAX_SB_SIZE * kSubPelScale, MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -MAX_SB_SIZE * kSubPelScale, - (kTileMaxMibWidth - 2) * MAX_SB_SIZE * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - { { -MAX_SB_SIZE * kSubPelScale, - ((kTileMaxMibWidth - 2) * MAX_SB_SIZE + 1) * kSubPelScale }, - MAX_SB_SIZE / MI_SIZE, - MAX_SB_SIZE / MI_SIZE, - BLOCK_LARGEST, - false }, - }; - - MACROBLOCKD xd; - memset(&xd, 0, sizeof(xd)); - xd.tile.mi_row_start = 8 * MAX_MIB_SIZE; - xd.tile.mi_row_end = 16 * MAX_MIB_SIZE; - xd.tile.mi_col_start = 24 * MAX_MIB_SIZE; - xd.tile.mi_col_end = xd.tile.mi_col_start + kTileMaxMibWidth * MAX_MIB_SIZE; - xd.plane[1].subsampling_x = 1; - xd.plane[1].subsampling_y = 1; - xd.plane[2].subsampling_x = 1; - xd.plane[2].subsampling_y = 1; - - AV1_COMMON cm; - memset(&cm, 0, sizeof(cm)); - - for (int i = 0; i < static_cast<int>(GTEST_ARRAY_SIZE_(kDvCases)); ++i) { - EXPECT_EQ(static_cast<int>(kDvCases[i].valid), - av1_is_dv_valid(kDvCases[i].dv, &cm, &xd, - xd.tile.mi_row_start + kDvCases[i].mi_row_offset, - xd.tile.mi_col_start + kDvCases[i].mi_col_offset, - kDvCases[i].bsize, MAX_MIB_SIZE_LOG2)) - << "DvCases[" << i << "]"; - } -} -} // namespace diff --git a/third_party/aom/test/intrapred_test.cc b/third_party/aom/test/intrapred_test.cc deleted file mode 100644 index 1a1c0fc42..000000000 --- a/third_party/aom/test/intrapred_test.cc +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/blockd.h" -#include "av1/common/common.h" -#include "av1/common/pred_common.h" -#include "aom_mem/aom_mem.h" - -namespace { - -using libaom_test::ACMRandom; - -const int count_test_block = 100000; - -typedef void (*HighbdIntraPred)(uint16_t *dst, ptrdiff_t stride, - const uint16_t *above, const uint16_t *left, - int bps); -typedef void (*IntraPred)(uint8_t *dst, ptrdiff_t stride, const uint8_t *above, - const uint8_t *left); - -} // namespace - -// NOTE: Under gcc version 7.3.0 (Debian 7.3.0-5), if this template is in the -// anonymous namespace, then we get a strange compiler warning in -// the begin() and end() methods of the ParamGenerator template class in -// gtest/internal/gtest-param-util.h: -// warning: ‘<anonymous>’ is used uninitialized in this function -// As a workaround, put this template outside the anonymous namespace. -// See bug aomedia:2003. -template <typename FuncType> -struct IntraPredFunc { - IntraPredFunc(FuncType pred = NULL, FuncType ref = NULL, - int block_width_value = 0, int block_height_value = 0, - int bit_depth_value = 0) - : pred_fn(pred), ref_fn(ref), block_width(block_width_value), - block_height(block_height_value), bit_depth(bit_depth_value) {} - - FuncType pred_fn; - FuncType ref_fn; - int block_width; - int block_height; - int bit_depth; -}; - -namespace { - -template <typename FuncType, typename Pixel> -class AV1IntraPredTest - : public ::testing::TestWithParam<IntraPredFunc<FuncType> > { - public: - void RunTest(Pixel *left_col, Pixel *above_data, Pixel *dst, Pixel *ref_dst) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int block_width = params_.block_width; - const int block_height = params_.block_height; - above_row_ = above_data + 16; - left_col_ = left_col; - dst_ = dst; - ref_dst_ = ref_dst; - int error_count = 0; - for (int i = 0; i < count_test_block; ++i) { - // Fill edges with random data, try first with saturated values. - for (int x = -1; x <= block_width * 2; x++) { - if (i == 0) { - above_row_[x] = mask_; - } else { - above_row_[x] = rnd.Rand16() & mask_; - } - } - for (int y = 0; y < block_height; y++) { - if (i == 0) { - left_col_[y] = mask_; - } else { - left_col_[y] = rnd.Rand16() & mask_; - } - } - Predict(); - CheckPrediction(i, &error_count); - } - ASSERT_EQ(0, error_count); - } - - protected: - virtual void SetUp() { - params_ = this->GetParam(); - stride_ = params_.block_width * 3; - mask_ = (1 << params_.bit_depth) - 1; - } - - virtual void Predict() = 0; - - void CheckPrediction(int test_case_number, int *error_count) const { - // For each pixel ensure that the calculated value is the same as reference. - const int block_width = params_.block_width; - const int block_height = params_.block_height; - for (int y = 0; y < block_height; y++) { - for (int x = 0; x < block_width; x++) { - *error_count += ref_dst_[x + y * stride_] != dst_[x + y * stride_]; - if (*error_count == 1) { - ASSERT_EQ(ref_dst_[x + y * stride_], dst_[x + y * stride_]) - << " Failed on Test Case Number " << test_case_number - << " location: x = " << x << " y = " << y; - } - } - } - } - - Pixel *above_row_; - Pixel *left_col_; - Pixel *dst_; - Pixel *ref_dst_; - ptrdiff_t stride_; - int mask_; - - IntraPredFunc<FuncType> params_; -}; - -class HighbdIntraPredTest : public AV1IntraPredTest<HighbdIntraPred, uint16_t> { - protected: - void Predict() { - const int bit_depth = params_.bit_depth; - params_.ref_fn(ref_dst_, stride_, above_row_, left_col_, bit_depth); - ASM_REGISTER_STATE_CHECK( - params_.pred_fn(dst_, stride_, above_row_, left_col_, bit_depth)); - } -}; - -class LowbdIntraPredTest : public AV1IntraPredTest<IntraPred, uint8_t> { - protected: - void Predict() { - params_.ref_fn(ref_dst_, stride_, above_row_, left_col_); - ASM_REGISTER_STATE_CHECK( - params_.pred_fn(dst_, stride_, above_row_, left_col_)); - } -}; - -// Suppress an unitialized warning. Once there are implementations to test then -// this can be restored. -TEST_P(HighbdIntraPredTest, Bitexact) { - // max block size is 64 - DECLARE_ALIGNED(16, uint16_t, left_col[2 * 64]); - DECLARE_ALIGNED(16, uint16_t, above_data[2 * 64 + 64]); - DECLARE_ALIGNED(16, uint16_t, dst[3 * 64 * 64]); - DECLARE_ALIGNED(16, uint16_t, ref_dst[3 * 64 * 64]); - av1_zero(left_col); - av1_zero(above_data); - RunTest(left_col, above_data, dst, ref_dst); -} - -// Same issue as above but for arm. -#if !HAVE_NEON -TEST_P(LowbdIntraPredTest, Bitexact) { - // max block size is 32 - DECLARE_ALIGNED(16, uint8_t, left_col[2 * 32]); - DECLARE_ALIGNED(16, uint8_t, above_data[2 * 32 + 32]); - DECLARE_ALIGNED(16, uint8_t, dst[3 * 32 * 32]); - DECLARE_ALIGNED(16, uint8_t, ref_dst[3 * 32 * 32]); - av1_zero(left_col); - av1_zero(above_data); - RunTest(left_col, above_data, dst, ref_dst); -} -#endif // !HAVE_NEON - -// ----------------------------------------------------------------------------- -// High Bit Depth Tests -#define highbd_entry(type, width, height, opt, bd) \ - IntraPredFunc<HighbdIntraPred>( \ - &aom_highbd_##type##_predictor_##width##x##height##_##opt, \ - &aom_highbd_##type##_predictor_##width##x##height##_c, width, height, \ - bd) - -#if 0 -#define highbd_intrapred(type, opt, bd) \ - highbd_entry(type, 4, 4, opt, bd), highbd_entry(type, 4, 8, opt, bd), \ - highbd_entry(type, 8, 4, opt, bd), highbd_entry(type, 8, 8, opt, bd), \ - highbd_entry(type, 8, 16, opt, bd), highbd_entry(type, 16, 8, opt, bd), \ - highbd_entry(type, 16, 16, opt, bd), \ - highbd_entry(type, 16, 32, opt, bd), \ - highbd_entry(type, 32, 16, opt, bd), highbd_entry(type, 32, 32, opt, bd) -#endif - - // --------------------------------------------------------------------------- - // Low Bit Depth Tests - -#define lowbd_entry(type, width, height, opt) \ - IntraPredFunc<IntraPred>(&aom_##type##_predictor_##width##x##height##_##opt, \ - &aom_##type##_predictor_##width##x##height##_c, \ - width, height, 8) - -#define lowbd_intrapred(type, opt) \ - lowbd_entry(type, 4, 4, opt), lowbd_entry(type, 4, 8, opt), \ - lowbd_entry(type, 8, 4, opt), lowbd_entry(type, 8, 8, opt), \ - lowbd_entry(type, 8, 16, opt), lowbd_entry(type, 16, 8, opt), \ - lowbd_entry(type, 16, 16, opt), lowbd_entry(type, 16, 32, opt), \ - lowbd_entry(type, 32, 16, opt), lowbd_entry(type, 32, 32, opt) - -#if HAVE_SSE2 -const IntraPredFunc<IntraPred> LowbdIntraPredTestVector[] = { - lowbd_intrapred(dc, sse2), lowbd_intrapred(dc_top, sse2), - lowbd_intrapred(dc_left, sse2), lowbd_intrapred(dc_128, sse2), - lowbd_intrapred(v, sse2), lowbd_intrapred(h, sse2), -}; - -INSTANTIATE_TEST_CASE_P(SSE2, LowbdIntraPredTest, - ::testing::ValuesIn(LowbdIntraPredTestVector)); - -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -const IntraPredFunc<IntraPred> LowbdIntraPredTestVectorSsse3[] = { - lowbd_intrapred(paeth, ssse3), - lowbd_intrapred(smooth, ssse3), -}; - -INSTANTIATE_TEST_CASE_P(SSSE3, LowbdIntraPredTest, - ::testing::ValuesIn(LowbdIntraPredTestVectorSsse3)); - -#endif // HAVE_SSSE3 - -#if HAVE_AVX2 -const IntraPredFunc<IntraPred> LowbdIntraPredTestVectorAvx2[] = { - lowbd_entry(dc, 32, 32, avx2), lowbd_entry(dc_top, 32, 32, avx2), - lowbd_entry(dc_left, 32, 32, avx2), lowbd_entry(dc_128, 32, 32, avx2), - lowbd_entry(v, 32, 32, avx2), lowbd_entry(h, 32, 32, avx2), - lowbd_entry(dc, 32, 16, avx2), lowbd_entry(dc_top, 32, 16, avx2), - lowbd_entry(dc_left, 32, 16, avx2), lowbd_entry(dc_128, 32, 16, avx2), - lowbd_entry(v, 32, 16, avx2), lowbd_entry(paeth, 16, 8, avx2), - lowbd_entry(paeth, 16, 16, avx2), lowbd_entry(paeth, 16, 32, avx2), - lowbd_entry(paeth, 32, 16, avx2), lowbd_entry(paeth, 32, 32, avx2), -}; - -INSTANTIATE_TEST_CASE_P(AVX2, LowbdIntraPredTest, - ::testing::ValuesIn(LowbdIntraPredTestVectorAvx2)); - -#endif // HAVE_AVX2 - -#if HAVE_NEON -const IntraPredFunc<HighbdIntraPred> HighbdIntraPredTestVectorNeon[] = { - highbd_entry(dc, 4, 4, neon, 8), highbd_entry(dc, 8, 8, neon, 8), - highbd_entry(dc, 16, 16, neon, 8), highbd_entry(dc, 32, 32, neon, 8), - highbd_entry(dc, 64, 64, neon, 8), -}; - -INSTANTIATE_TEST_CASE_P(NEON, HighbdIntraPredTest, - ::testing::ValuesIn(HighbdIntraPredTestVectorNeon)); - -#endif // HAVE_NEON -} // namespace diff --git a/third_party/aom/test/invalid_file_test.cc b/third_party/aom/test/invalid_file_test.cc deleted file mode 100644 index 5b4f5a6c3..000000000 --- a/third_party/aom/test/invalid_file_test.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdio> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/ivf_video_source.h" -#include "test/util.h" -#include "test/video_source.h" - -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 ::libaom_test::DecoderTest, - public ::libaom_test::CodecTestWithParam<DecodeParam> { - protected: - InvalidFileTest() : DecoderTest(GET_PARAM(0)), res_file_(NULL) {} - - virtual ~InvalidFileTest() { - if (res_file_ != NULL) fclose(res_file_); - } - - void OpenResFile(const std::string &res_file_name) { - res_file_ = libaom_test::OpenTestDataFile(res_file_name); - ASSERT_TRUE(res_file_ != NULL) - << "Result file open failed. Filename: " << res_file_name; - } - - virtual bool HandleDecodeResult( - const aom_codec_err_t res_dec, - const libaom_test::CompressedVideoSource &video, - libaom_test::Decoder *decoder) { - EXPECT_TRUE(res_file_ != NULL); - int expected_res_dec = -1; - - // Read integer result. - const int res = fscanf(res_file_, "%d", &expected_res_dec); - EXPECT_NE(res, EOF) << "Read result data failed"; - - if (expected_res_dec != -1) { - // Check results match. - const DecodeParam input = GET_PARAM(1); - if (input.threads > 1) { - // The serial decode check is too strict for tile-threaded decoding as - // there is no guarantee on the decode order nor which specific error - // will take precedence. Currently a tile-level error is not forwarded - // so the frame will simply be marked corrupt. - EXPECT_TRUE(res_dec == expected_res_dec || - res_dec == AOM_CODEC_CORRUPT_FRAME) - << "Results don't match: frame number = " << video.frame_number() - << ". (" << decoder->DecodeError() - << "). Expected: " << expected_res_dec << " or " - << AOM_CODEC_CORRUPT_FRAME; - } else { - EXPECT_EQ(expected_res_dec, res_dec) - << "Results don't match: frame number = " << video.frame_number() - << ". (" << decoder->DecodeError() << ")"; - } - } - - return !HasFailure(); - } - - virtual void HandlePeekResult(libaom_test::Decoder *const /*decoder*/, - libaom_test::CompressedVideoSource * /*video*/, - const aom_codec_err_t /*res_peek*/) {} - - void RunTest() { - const DecodeParam input = GET_PARAM(1); - aom_codec_dec_cfg_t cfg = { 0, 0, 0, CONFIG_LOWBITDEPTH, { 1 } }; - cfg.threads = input.threads; - const std::string filename = input.filename; - libaom_test::IVFVideoSource decode_video(filename); - decode_video.Init(); - - // Construct result file name. The file holds a list of expected integer - // results, one for each decoded frame. Any result that doesn't match - // the files list will cause a test failure. - const std::string res_filename = filename + ".res"; - OpenResFile(res_filename); - - ASSERT_NO_FATAL_FAILURE(RunLoop(&decode_video, cfg)); - } - - private: - FILE *res_file_; -}; - -TEST_P(InvalidFileTest, ReturnCode) { RunTest(); } - -const DecodeParam kAV1InvalidFileTests[] = { - { 1, "invalid-bug-1814.ivf" }, - { 4, "invalid-oss-fuzz-9463.ivf" }, - { 1, "invalid-oss-fuzz-9482.ivf" }, - { 1, "invalid-oss-fuzz-9720.ivf" }, - { 1, "invalid-oss-fuzz-10061.ivf" }, - { 1, "invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf" }, - { 1, "invalid-oss-fuzz-10227.ivf" }, -}; - -AV1_INSTANTIATE_TEST_CASE(InvalidFileTest, - ::testing::ValuesIn(kAV1InvalidFileTests)); - -} // namespace diff --git a/third_party/aom/test/ivf_video_source.h b/third_party/aom/test/ivf_video_source.h deleted file mode 100644 index ff2841445..000000000 --- a/third_party/aom/test/ivf_video_source.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_IVF_VIDEO_SOURCE_H_ -#define AOM_TEST_IVF_VIDEO_SOURCE_H_ - -#include <cstdio> -#include <cstdlib> -#include <new> -#include <string> - -#include "aom_ports/sanitizer.h" -#include "test/video_source.h" - -namespace libaom_test { -const unsigned int kCodeBufferSize = 256 * 1024 * 1024; -const unsigned int kIvfFileHdrSize = 32; -const unsigned int kIvfFrameHdrSize = 12; - -static unsigned int MemGetLe32(const uint8_t *mem) { - return (mem[3] << 24) | (mem[2] << 16) | (mem[1] << 8) | (mem[0]); -} - -// This class extends VideoSource to allow parsing of ivf files, -// so that we can do actual file decodes. -class IVFVideoSource : public CompressedVideoSource { - public: - explicit IVFVideoSource(const std::string &file_name) - : file_name_(file_name), input_file_(NULL), compressed_frame_buf_(NULL), - frame_sz_(0), frame_(0), end_of_file_(false) {} - - virtual ~IVFVideoSource() { - delete[] compressed_frame_buf_; - - if (input_file_) fclose(input_file_); - } - - virtual void Init() { - // Allocate a buffer for read in the compressed video frame. - compressed_frame_buf_ = new uint8_t[kCodeBufferSize]; - ASSERT_TRUE(compressed_frame_buf_ != NULL) - << "Allocate frame buffer failed"; - ASAN_POISON_MEMORY_REGION(compressed_frame_buf_, kCodeBufferSize); - } - - virtual void Begin() { - input_file_ = OpenTestDataFile(file_name_); - ASSERT_TRUE(input_file_ != NULL) - << "Input file open failed. Filename: " << file_name_; - - // Read file header - uint8_t file_hdr[kIvfFileHdrSize]; - ASSERT_EQ(kIvfFileHdrSize, fread(file_hdr, 1, kIvfFileHdrSize, input_file_)) - << "File header read failed."; - // Check file header - ASSERT_TRUE(file_hdr[0] == 'D' && file_hdr[1] == 'K' && - file_hdr[2] == 'I' && file_hdr[3] == 'F') - << "Input is not an IVF file."; - - FillFrame(); - } - - virtual void Next() { - ++frame_; - FillFrame(); - } - - void FillFrame() { - ASSERT_TRUE(input_file_ != NULL); - uint8_t frame_hdr[kIvfFrameHdrSize]; - // Check frame header and read a frame from input_file. - if (fread(frame_hdr, 1, kIvfFrameHdrSize, input_file_) != - kIvfFrameHdrSize) { - end_of_file_ = true; - } else { - end_of_file_ = false; - - frame_sz_ = MemGetLe32(frame_hdr); - ASSERT_LE(frame_sz_, kCodeBufferSize) - << "Frame is too big for allocated code buffer"; - ASAN_UNPOISON_MEMORY_REGION(compressed_frame_buf_, kCodeBufferSize); - ASSERT_EQ(frame_sz_, - fread(compressed_frame_buf_, 1, frame_sz_, input_file_)) - << "Failed to read complete frame"; - ASAN_POISON_MEMORY_REGION(compressed_frame_buf_ + frame_sz_, - kCodeBufferSize - frame_sz_); - } - } - - virtual const uint8_t *cxdata() const { - return end_of_file_ ? NULL : compressed_frame_buf_; - } - virtual size_t frame_size() const { return frame_sz_; } - virtual unsigned int frame_number() const { return frame_; } - - protected: - std::string file_name_; - FILE *input_file_; - uint8_t *compressed_frame_buf_; - size_t frame_sz_; - unsigned int frame_; - bool end_of_file_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_IVF_VIDEO_SOURCE_H_ diff --git a/third_party/aom/test/lightfield_test.sh b/third_party/aom/test/lightfield_test.sh deleted file mode 100755 index b957a6b79..000000000 --- a/third_party/aom/test/lightfield_test.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/sh -## Copyright (c) 2018, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the lightfield example. -## -. $(dirname $0)/tools_common.sh - -# Environment check: $infile is required. -lightfield_test_verify_environment() { - local infile="${LIBAOM_TEST_DATA_PATH}/vase10x10.yuv" - if [ ! -e "${infile}" ]; then - echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi -} - -# Run the lightfield example -lightfield_test() { - local img_width=1024 - local img_height=1024 - local lf_width=10 - local lf_height=10 - local lf_blocksize=5 - local num_references=4 - local num_tile_lists=2 - - # Encode the lightfield. - local encoder="${LIBAOM_BIN_PATH}/lightfield_encoder${AOM_TEST_EXE_SUFFIX}" - local yuv_file="${LIBAOM_TEST_DATA_PATH}/vase10x10.yuv" - local lf_file="${AOM_TEST_OUTPUT_DIR}/vase10x10.ivf" - if [ ! -x "${encoder}" ]; then - elog "${encoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${encoder}" "${img_width}" "${img_height}" \ - "${yuv_file}" "${lf_file}" "${lf_width}" \ - "${lf_height}" "${lf_blocksize}" ${devnull} - - [ -e "${lf_file}" ] || return 1 - - # Parse lightfield bitstream to construct and output a new bitstream that can - # be decoded by an AV1 decoder. - local bs_decoder="${LIBAOM_BIN_PATH}/lightfield_bitstream_parsing${AOM_TEST_EXE_SUFFIX}" - local tl_file="${AOM_TEST_OUTPUT_DIR}/vase_tile_list.ivf" - if [ ! -x "${bs_decoder}" ]; then - elog "${bs_decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${bs_decoder}" "${lf_file}" "${tl_file}" \ - "${num_references}" ${devnull} - - [ -e "${tl_file}" ] || return 1 - - # Run lightfield tile list decoder - local tl_decoder="${LIBAOM_BIN_PATH}/lightfield_tile_list_decoder${AOM_TEST_EXE_SUFFIX}" - local tl_outfile="${AOM_TEST_OUTPUT_DIR}/vase_tile_list.yuv" - if [ ! -x "${tl_decoder}" ]; then - elog "${tl_decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${tl_decoder}" "${tl_file}" "${tl_outfile}" \ - "${num_references}" "${num_tile_lists}" ${devnull} - - [ -e "${tl_outfile}" ] || return 1 - - # Run reference lightfield decoder - local ref_decoder="${LIBAOM_BIN_PATH}/lightfield_decoder${AOM_TEST_EXE_SUFFIX}" - local tl_reffile="${AOM_TEST_OUTPUT_DIR}/vase_reference.yuv" - if [ ! -x "${ref_decoder}" ]; then - elog "${ref_decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${ref_decoder}" "${lf_file}" "${tl_reffile}" \ - "${num_references}" ${devnull} - - [ -e "${tl_reffile}" ] || return 1 - - # Check if tl_outfile and tl_reffile are identical. If not identical, this test fails. - diff ${tl_outfile} ${tl_reffile} > /dev/null - if [ $? -eq 1 ]; then - return 1 - fi -} - -lightfield_test_tests="lightfield_test" - -run_tests lightfield_test_verify_environment "${lightfield_test_tests}" diff --git a/third_party/aom/test/log2_test.cc b/third_party/aom/test/log2_test.cc deleted file mode 100644 index d7840c68b..000000000 --- a/third_party/aom/test/log2_test.cc +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> - -#include "aom_ports/bitops.h" -#include "av1/common/entropymode.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -TEST(Log2Test, GetMsb) { - // Test small numbers exhaustively. - for (unsigned int n = 1; n < 10000; n++) { - EXPECT_EQ(get_msb(n), static_cast<int>(floor(log2(n)))); - } - - // Test every power of 2 and the two adjacent numbers. - for (int exponent = 2; exponent < 32; exponent++) { - const unsigned int power_of_2 = 1U << exponent; - EXPECT_EQ(get_msb(power_of_2 - 1), exponent - 1); - EXPECT_EQ(get_msb(power_of_2), exponent); - EXPECT_EQ(get_msb(power_of_2 + 1), exponent); - } -} - -TEST(Log2Test, Av1CeilLog2) { - // Test small numbers exhaustively. - EXPECT_EQ(av1_ceil_log2(0), 0); - for (int n = 1; n < 10000; n++) { - EXPECT_EQ(av1_ceil_log2(n), static_cast<int>(ceil(log2(n)))); - } - - // Test every power of 2 and the two adjacent numbers. - for (int exponent = 2; exponent < 31; exponent++) { - const int power_of_2 = 1 << exponent; - EXPECT_EQ(av1_ceil_log2(power_of_2 - 1), exponent); - EXPECT_EQ(av1_ceil_log2(power_of_2), exponent); - // The current implementation of av1_ceil_log2 only works up to 2^30. - if (exponent < 30) { - EXPECT_EQ(av1_ceil_log2(power_of_2 + 1), exponent + 1); - } - } -} diff --git a/third_party/aom/test/lossless_test.cc b/third_party/aom/test/lossless_test.cc deleted file mode 100644 index 3f8e89c81..000000000 --- a/third_party/aom/test/lossless_test.cc +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/util.h" -#include "test/y4m_video_source.h" - -namespace { - -const int kMaxPsnr = 100; - -class LosslessTestLarge - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - LosslessTestLarge() - : EncoderTest(GET_PARAM(0)), psnr_(kMaxPsnr), nframes_(0), - encoding_mode_(GET_PARAM(1)) {} - - virtual ~LosslessTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - // Only call Control if quantizer > 0 to verify that using quantizer - // alone will activate lossless - if (cfg_.rc_max_quantizer > 0 || cfg_.rc_min_quantizer > 0) { - encoder->Control(AV1E_SET_LOSSLESS, 1); - } - } - } - - virtual void BeginPassHook(unsigned int /*pass*/) { - psnr_ = kMaxPsnr; - nframes_ = 0; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (pkt->data.psnr.psnr[0] < psnr_) psnr_ = pkt->data.psnr.psnr[0]; - } - - double GetMinPsnr() const { return psnr_; } - - private: - double psnr_; - unsigned int nframes_; - libaom_test::TestMode encoding_mode_; -}; - -TEST_P(LosslessTestLarge, TestLossLessEncoding) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 2000; - cfg_.g_lag_in_frames = 25; - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 0; - - init_flags_ = AOM_CODEC_USE_PSNR; - - // intentionally changed the dimension for better testing coverage - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 5); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - const double psnr_lossless = GetMinPsnr(); - EXPECT_GE(psnr_lossless, kMaxPsnr); -} - -TEST_P(LosslessTestLarge, TestLossLessEncoding444) { - libaom_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 5); - - cfg_.g_profile = 1; - cfg_.g_timebase = video.timebase(); - cfg_.rc_target_bitrate = 2000; - cfg_.g_lag_in_frames = 25; - cfg_.rc_min_quantizer = 0; - cfg_.rc_max_quantizer = 0; - - init_flags_ = AOM_CODEC_USE_PSNR; - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - const double psnr_lossless = GetMinPsnr(); - EXPECT_GE(psnr_lossless, kMaxPsnr); -} - -TEST_P(LosslessTestLarge, TestLossLessEncodingCtrl) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 2000; - cfg_.g_lag_in_frames = 25; - // Intentionally set Q > 0, to make sure control can be used to activate - // lossless - cfg_.rc_min_quantizer = 10; - cfg_.rc_max_quantizer = 20; - - init_flags_ = AOM_CODEC_USE_PSNR; - - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 5); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - const double psnr_lossless = GetMinPsnr(); - EXPECT_GE(psnr_lossless, kMaxPsnr); -} - -AV1_INSTANTIATE_TEST_CASE(LosslessTestLarge, - ::testing::Values(::libaom_test::kOnePassGood, - ::libaom_test::kTwoPassGood)); -} // namespace diff --git a/third_party/aom/test/lpf_test.cc b/third_party/aom/test/lpf_test.cc deleted file mode 100644 index 451bffd2a..000000000 --- a/third_party/aom/test/lpf_test.cc +++ /dev/null @@ -1,627 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cmath> -#include <cstdlib> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/av1_loopfilter.h" -#include "av1/common/entropy.h" -#include "aom/aom_integer.h" - -using libaom_test::ACMRandom; - -namespace { -// Horizontally and Vertically need 32x32: 8 Coeffs preceeding filtered section -// 16 Coefs within filtered section -// 8 Coeffs following filtered section -const int kNumCoeffs = 1024; - -const int number_of_iterations = 10000; - -const int kSpeedTestNum = 500000; - -#define LOOP_PARAM \ - int p, const uint8_t *blimit, const uint8_t *limit, const uint8_t *thresh -#define DUAL_LOOP_PARAM \ - int p, const uint8_t *blimit0, const uint8_t *limit0, \ - const uint8_t *thresh0, const uint8_t *blimit1, const uint8_t *limit1, \ - const uint8_t *thresh1 - -typedef void (*loop_op_t)(uint8_t *s, LOOP_PARAM); -typedef void (*dual_loop_op_t)(uint8_t *s, DUAL_LOOP_PARAM); -typedef void (*hbdloop_op_t)(uint16_t *s, LOOP_PARAM, int bd); -typedef void (*hbddual_loop_op_t)(uint16_t *s, DUAL_LOOP_PARAM, int bd); - -typedef ::testing::tuple<hbdloop_op_t, hbdloop_op_t, int> hbdloop_param_t; -typedef ::testing::tuple<hbddual_loop_op_t, hbddual_loop_op_t, int> - hbddual_loop_param_t; -typedef ::testing::tuple<loop_op_t, loop_op_t, int> loop_param_t; -typedef ::testing::tuple<dual_loop_op_t, dual_loop_op_t, int> dual_loop_param_t; - -template <typename Pixel_t, int PIXEL_WIDTH_t> -void InitInput(Pixel_t *s, Pixel_t *ref_s, ACMRandom *rnd, const uint8_t limit, - const int mask, const int32_t p, const int i) { - uint16_t tmp_s[kNumCoeffs]; - - for (int j = 0; j < kNumCoeffs;) { - const uint8_t val = rnd->Rand8(); - if (val & 0x80) { // 50% chance to choose a new value. - tmp_s[j] = rnd->Rand16(); - j++; - } else { // 50% chance to repeat previous value in row X times. - int k = 0; - while (k++ < ((val & 0x1f) + 1) && j < kNumCoeffs) { - if (j < 1) { - tmp_s[j] = rnd->Rand16(); - } else if (val & 0x20) { // Increment by a value within the limit. - tmp_s[j] = tmp_s[j - 1] + (limit - 1); - } else { // Decrement by a value within the limit. - tmp_s[j] = tmp_s[j - 1] - (limit - 1); - } - j++; - } - } - } - - for (int j = 0; j < kNumCoeffs;) { - const uint8_t val = rnd->Rand8(); - if (val & 0x80) { - j++; - } else { // 50% chance to repeat previous value in column X times. - int k = 0; - while (k++ < ((val & 0x1f) + 1) && j < kNumCoeffs) { - if (j < 1) { - tmp_s[j] = rnd->Rand16(); - } else if (val & 0x20) { // Increment by a value within the limit. - tmp_s[(j % 32) * 32 + j / 32] = - tmp_s[((j - 1) % 32) * 32 + (j - 1) / 32] + (limit - 1); - } else { // Decrement by a value within the limit. - tmp_s[(j % 32) * 32 + j / 32] = - tmp_s[((j - 1) % 32) * 32 + (j - 1) / 32] - (limit - 1); - } - j++; - } - } - } - - for (int j = 0; j < kNumCoeffs; j++) { - if (i % 2) { - s[j] = tmp_s[j] & mask; - } else { - s[j] = tmp_s[p * (j % p) + j / p] & mask; - } - ref_s[j] = s[j]; - } -} - -uint8_t GetOuterThresh(ACMRandom *rnd) { - return static_cast<uint8_t>(rnd->PseudoUniform(3 * MAX_LOOP_FILTER + 5)); -} - -uint8_t GetInnerThresh(ACMRandom *rnd) { - return static_cast<uint8_t>(rnd->PseudoUniform(MAX_LOOP_FILTER + 1)); -} - -uint8_t GetHevThresh(ACMRandom *rnd) { - return static_cast<uint8_t>(rnd->PseudoUniform(MAX_LOOP_FILTER + 1) >> 4); -} - -template <typename func_type_t, typename params_t> -class LoopTestParam : public ::testing::TestWithParam<params_t> { - public: - virtual ~LoopTestParam() {} - virtual void SetUp() { - loopfilter_op_ = ::testing::get<0>(this->GetParam()); - ref_loopfilter_op_ = ::testing::get<1>(this->GetParam()); - bit_depth_ = ::testing::get<2>(this->GetParam()); - mask_ = (1 << bit_depth_) - 1; - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - int bit_depth_; - int mask_; - func_type_t loopfilter_op_; - func_type_t ref_loopfilter_op_; -}; - -void call_filter(uint16_t *s, LOOP_PARAM, int bd, hbdloop_op_t op) { - op(s, p, blimit, limit, thresh, bd); -} -void call_filter(uint8_t *s, LOOP_PARAM, int bd, loop_op_t op) { - (void)bd; - op(s, p, blimit, limit, thresh); -} -void call_dualfilter(uint16_t *s, DUAL_LOOP_PARAM, int bd, - hbddual_loop_op_t op) { - op(s, p, blimit0, limit0, thresh0, blimit1, limit1, thresh1, bd); -} -void call_dualfilter(uint8_t *s, DUAL_LOOP_PARAM, int bd, dual_loop_op_t op) { - (void)bd; - op(s, p, blimit0, limit0, thresh0, blimit1, limit1, thresh1); -}; - -typedef LoopTestParam<hbdloop_op_t, hbdloop_param_t> Loop8Test6Param_hbd; -typedef LoopTestParam<loop_op_t, loop_param_t> Loop8Test6Param_lbd; -typedef LoopTestParam<hbddual_loop_op_t, hbddual_loop_param_t> - Loop8Test9Param_hbd; -typedef LoopTestParam<dual_loop_op_t, dual_loop_param_t> Loop8Test9Param_lbd; - -#define OPCHECK(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = number_of_iterations; \ - const int32_t p = kNumCoeffs / 32; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - DECLARE_ALIGNED(b, a, ref_s[kNumCoeffs]); \ - int err_count_total = 0; \ - int first_failure = -1; \ - for (int i = 0; i < count_test_block; ++i) { \ - int err_count = 0; \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - InitInput<a, b>(s, ref_s, &rnd, *limit, mask_, p, i); \ - call_filter(ref_s + 8 + p * 8, p, blimit, limit, thresh, bit_depth_, \ - ref_loopfilter_op_); \ - ASM_REGISTER_STATE_CHECK(call_filter(s + 8 + p * 8, p, blimit, limit, \ - thresh, bit_depth_, loopfilter_op_)); \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - err_count += ref_s[j] != s[j]; \ - } \ - if (err_count && !err_count_total) { \ - first_failure = i; \ - } \ - err_count_total += err_count; \ - } \ - EXPECT_EQ(0, err_count_total) \ - << "Error: Loop8Test6Param, C output doesn't match SIMD " \ - "loopfilter output. " \ - << "First failed at test case " << first_failure; - -TEST_P(Loop8Test6Param_hbd, OperationCheck) { OPCHECK(uint16_t, 16); } -TEST_P(Loop8Test6Param_lbd, OperationCheck) { OPCHECK(uint8_t, 8); } - -#define VALCHECK(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = number_of_iterations; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - DECLARE_ALIGNED(b, a, ref_s[kNumCoeffs]); \ - int err_count_total = 0; \ - int first_failure = -1; \ - for (int i = 0; i < count_test_block; ++i) { \ - int err_count = 0; \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - int32_t p = kNumCoeffs / 32; \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - s[j] = rnd.Rand16() & mask_; \ - ref_s[j] = s[j]; \ - } \ - call_filter(ref_s + 8 + p * 8, p, blimit, limit, thresh, bit_depth_, \ - ref_loopfilter_op_); \ - ASM_REGISTER_STATE_CHECK(call_filter(s + 8 + p * 8, p, blimit, limit, \ - thresh, bit_depth_, loopfilter_op_)); \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - err_count += ref_s[j] != s[j]; \ - } \ - if (err_count && !err_count_total) { \ - first_failure = i; \ - } \ - err_count_total += err_count; \ - } \ - EXPECT_EQ(0, err_count_total) \ - << "Error: Loop8Test6Param, C output doesn't match SIMD " \ - "loopfilter output. " \ - << "First failed at test case " << first_failure; - -TEST_P(Loop8Test6Param_hbd, ValueCheck) { VALCHECK(uint16_t, 16); } -TEST_P(Loop8Test6Param_lbd, ValueCheck) { VALCHECK(uint8_t, 8); } - -#define SPEEDCHECK(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = kSpeedTestNum; \ - const int32_t bd = bit_depth_; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - int32_t p = kNumCoeffs / 32; \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - s[j] = rnd.Rand16() & mask_; \ - } \ - for (int i = 0; i < count_test_block; ++i) { \ - call_filter(s + 8 + p * 8, p, blimit, limit, thresh, bd, loopfilter_op_); \ - } - -TEST_P(Loop8Test6Param_hbd, DISABLED_Speed) { SPEEDCHECK(uint16_t, 16); } -TEST_P(Loop8Test6Param_lbd, DISABLED_Speed) { SPEEDCHECK(uint8_t, 8); } - -#define OPCHECKd(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = number_of_iterations; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - DECLARE_ALIGNED(b, a, ref_s[kNumCoeffs]); \ - int err_count_total = 0; \ - int first_failure = -1; \ - for (int i = 0; i < count_test_block; ++i) { \ - int err_count = 0; \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - int32_t p = kNumCoeffs / 32; \ - const uint8_t limit = *limit0 < *limit1 ? *limit0 : *limit1; \ - InitInput<a, b>(s, ref_s, &rnd, limit, mask_, p, i); \ - call_dualfilter(ref_s + 8 + p * 8, p, blimit0, limit0, thresh0, blimit1, \ - limit1, thresh1, bit_depth_, ref_loopfilter_op_); \ - ASM_REGISTER_STATE_CHECK( \ - call_dualfilter(s + 8 + p * 8, p, blimit0, limit0, thresh0, blimit1, \ - limit1, thresh1, bit_depth_, loopfilter_op_)); \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - err_count += ref_s[j] != s[j]; \ - } \ - if (err_count && !err_count_total) { \ - first_failure = i; \ - } \ - err_count_total += err_count; \ - } \ - EXPECT_EQ(0, err_count_total) \ - << "Error: Loop8Test9Param, C output doesn't match SIMD " \ - "loopfilter output. " \ - << "First failed at test case " << first_failure; - -TEST_P(Loop8Test9Param_hbd, OperationCheck) { OPCHECKd(uint16_t, 16); } -TEST_P(Loop8Test9Param_lbd, OperationCheck) { OPCHECKd(uint8_t, 8); } - -#define VALCHECKd(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = number_of_iterations; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - DECLARE_ALIGNED(b, a, ref_s[kNumCoeffs]); \ - int err_count_total = 0; \ - int first_failure = -1; \ - for (int i = 0; i < count_test_block; ++i) { \ - int err_count = 0; \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - int32_t p = kNumCoeffs / 32; \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - s[j] = rnd.Rand16() & mask_; \ - ref_s[j] = s[j]; \ - } \ - call_dualfilter(ref_s + 8 + p * 8, p, blimit0, limit0, thresh0, blimit1, \ - limit1, thresh1, bit_depth_, ref_loopfilter_op_); \ - ASM_REGISTER_STATE_CHECK( \ - call_dualfilter(s + 8 + p * 8, p, blimit0, limit0, thresh0, blimit1, \ - limit1, thresh1, bit_depth_, loopfilter_op_)); \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - err_count += ref_s[j] != s[j]; \ - } \ - if (err_count && !err_count_total) { \ - first_failure = i; \ - } \ - err_count_total += err_count; \ - } \ - EXPECT_EQ(0, err_count_total) \ - << "Error: Loop8Test9Param, C output doesn't match SIMD " \ - "loopfilter output. " \ - << "First failed at test case " << first_failure; - -TEST_P(Loop8Test9Param_hbd, ValueCheck) { VALCHECKd(uint16_t, 16); } -TEST_P(Loop8Test9Param_lbd, ValueCheck) { VALCHECKd(uint8_t, 8); } - -#define SPEEDCHECKd(a, b) \ - ACMRandom rnd(ACMRandom::DeterministicSeed()); \ - const int count_test_block = kSpeedTestNum; \ - DECLARE_ALIGNED(b, a, s[kNumCoeffs]); \ - uint8_t tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh0[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetOuterThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - blimit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetInnerThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - limit1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - tmp = GetHevThresh(&rnd); \ - DECLARE_ALIGNED(16, const uint8_t, \ - thresh1[16]) = { tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp, \ - tmp, tmp, tmp, tmp, tmp, tmp, tmp, tmp }; \ - int32_t p = kNumCoeffs / 32; \ - for (int j = 0; j < kNumCoeffs; ++j) { \ - s[j] = rnd.Rand16() & mask_; \ - } \ - for (int i = 0; i < count_test_block; ++i) { \ - call_dualfilter(s + 8 + p * 8, p, blimit0, limit0, thresh0, blimit1, \ - limit1, thresh1, bit_depth_, loopfilter_op_); \ - } - -TEST_P(Loop8Test9Param_hbd, DISABLED_Speed) { SPEEDCHECKd(uint16_t, 16); } -TEST_P(Loop8Test9Param_lbd, DISABLED_Speed) { SPEEDCHECKd(uint8_t, 8); } - -using ::testing::make_tuple; - -#if HAVE_SSE2 - -const hbdloop_param_t kHbdLoop8Test6[] = { - make_tuple(&aom_highbd_lpf_horizontal_4_sse2, &aom_highbd_lpf_horizontal_4_c, - 8), - make_tuple(&aom_highbd_lpf_vertical_4_sse2, &aom_highbd_lpf_vertical_4_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_6_sse2, &aom_highbd_lpf_horizontal_6_c, - 8), - make_tuple(&aom_highbd_lpf_horizontal_8_sse2, &aom_highbd_lpf_horizontal_8_c, - 8), - make_tuple(&aom_highbd_lpf_horizontal_14_sse2, - &aom_highbd_lpf_horizontal_14_c, 8), - make_tuple(&aom_highbd_lpf_vertical_6_sse2, &aom_highbd_lpf_vertical_6_c, 8), - make_tuple(&aom_highbd_lpf_vertical_8_sse2, &aom_highbd_lpf_vertical_8_c, 8), - - make_tuple(&aom_highbd_lpf_vertical_14_sse2, &aom_highbd_lpf_vertical_14_c, - 8), - make_tuple(&aom_highbd_lpf_horizontal_4_sse2, &aom_highbd_lpf_horizontal_4_c, - 10), - make_tuple(&aom_highbd_lpf_vertical_4_sse2, &aom_highbd_lpf_vertical_4_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_6_sse2, &aom_highbd_lpf_horizontal_6_c, - 10), - make_tuple(&aom_highbd_lpf_horizontal_8_sse2, &aom_highbd_lpf_horizontal_8_c, - 10), - make_tuple(&aom_highbd_lpf_horizontal_14_sse2, - &aom_highbd_lpf_horizontal_14_c, 10), - make_tuple(&aom_highbd_lpf_vertical_6_sse2, &aom_highbd_lpf_vertical_6_c, 10), - make_tuple(&aom_highbd_lpf_vertical_8_sse2, &aom_highbd_lpf_vertical_8_c, 10), - make_tuple(&aom_highbd_lpf_vertical_14_sse2, &aom_highbd_lpf_vertical_14_c, - 10), - make_tuple(&aom_highbd_lpf_horizontal_4_sse2, &aom_highbd_lpf_horizontal_4_c, - 12), - make_tuple(&aom_highbd_lpf_vertical_4_sse2, &aom_highbd_lpf_vertical_4_c, 12), - make_tuple(&aom_highbd_lpf_horizontal_6_sse2, &aom_highbd_lpf_horizontal_6_c, - 12), - make_tuple(&aom_highbd_lpf_horizontal_8_sse2, &aom_highbd_lpf_horizontal_8_c, - 12), - make_tuple(&aom_highbd_lpf_horizontal_14_sse2, - &aom_highbd_lpf_horizontal_14_c, 12), - make_tuple(&aom_highbd_lpf_vertical_14_sse2, &aom_highbd_lpf_vertical_14_c, - 12), - make_tuple(&aom_highbd_lpf_vertical_6_sse2, &aom_highbd_lpf_vertical_6_c, 12), - make_tuple(&aom_highbd_lpf_vertical_8_sse2, &aom_highbd_lpf_vertical_8_c, 12) -}; - -INSTANTIATE_TEST_CASE_P(SSE2, Loop8Test6Param_hbd, - ::testing::ValuesIn(kHbdLoop8Test6)); - -const loop_param_t kLoop8Test6[] = { - make_tuple(&aom_lpf_horizontal_4_sse2, &aom_lpf_horizontal_4_c, 8), - make_tuple(&aom_lpf_horizontal_8_sse2, &aom_lpf_horizontal_8_c, 8), - make_tuple(&aom_lpf_horizontal_6_sse2, &aom_lpf_horizontal_6_c, 8), - make_tuple(&aom_lpf_vertical_6_sse2, &aom_lpf_vertical_6_c, 8), - make_tuple(&aom_lpf_horizontal_14_sse2, &aom_lpf_horizontal_14_c, 8), - make_tuple(&aom_lpf_vertical_4_sse2, &aom_lpf_vertical_4_c, 8), - make_tuple(&aom_lpf_vertical_8_sse2, &aom_lpf_vertical_8_c, 8), - make_tuple(&aom_lpf_vertical_14_sse2, &aom_lpf_vertical_14_c, 8), -}; - -INSTANTIATE_TEST_CASE_P(SSE2, Loop8Test6Param_lbd, - ::testing::ValuesIn(kLoop8Test6)); - -const dual_loop_param_t kLoop8Test9[] = { - make_tuple(&aom_lpf_horizontal_4_dual_sse2, &aom_lpf_horizontal_4_dual_c, 8), - make_tuple(&aom_lpf_vertical_4_dual_sse2, &aom_lpf_vertical_4_dual_c, 8), - make_tuple(&aom_lpf_horizontal_6_dual_sse2, &aom_lpf_horizontal_6_dual_c, 8), - make_tuple(&aom_lpf_vertical_6_dual_sse2, &aom_lpf_vertical_6_dual_c, 8), - make_tuple(&aom_lpf_horizontal_8_dual_sse2, &aom_lpf_horizontal_8_dual_c, 8), - make_tuple(&aom_lpf_vertical_8_dual_sse2, &aom_lpf_vertical_8_dual_c, 8), - make_tuple(&aom_lpf_horizontal_14_dual_sse2, &aom_lpf_horizontal_14_dual_c, - 8), - make_tuple(&aom_lpf_vertical_14_dual_sse2, &aom_lpf_vertical_14_dual_c, 8) -}; - -INSTANTIATE_TEST_CASE_P(SSE2, Loop8Test9Param_lbd, - ::testing::ValuesIn(kLoop8Test9)); - -#endif // HAVE_SSE2 - -#if HAVE_SSE2 -const hbddual_loop_param_t kHbdLoop8Test9[] = { - make_tuple(&aom_highbd_lpf_horizontal_4_dual_sse2, - &aom_highbd_lpf_horizontal_4_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_6_dual_sse2, - &aom_highbd_lpf_horizontal_6_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_sse2, - &aom_highbd_lpf_horizontal_8_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_14_dual_sse2, - &aom_highbd_lpf_horizontal_14_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_4_dual_sse2, - &aom_highbd_lpf_vertical_4_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_6_dual_sse2, - &aom_highbd_lpf_vertical_6_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_8_dual_sse2, - &aom_highbd_lpf_vertical_8_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_14_dual_sse2, - &aom_highbd_lpf_vertical_14_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_4_dual_sse2, - &aom_highbd_lpf_horizontal_4_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_6_dual_sse2, - &aom_highbd_lpf_horizontal_6_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_sse2, - &aom_highbd_lpf_horizontal_8_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_14_dual_sse2, - &aom_highbd_lpf_horizontal_14_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_4_dual_sse2, - &aom_highbd_lpf_vertical_4_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_6_dual_sse2, - &aom_highbd_lpf_vertical_6_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_8_dual_sse2, - &aom_highbd_lpf_vertical_8_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_14_dual_sse2, - &aom_highbd_lpf_vertical_14_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_4_dual_sse2, - &aom_highbd_lpf_horizontal_4_dual_c, 12), - make_tuple(&aom_highbd_lpf_horizontal_6_dual_sse2, - &aom_highbd_lpf_horizontal_6_dual_c, 12), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_sse2, - &aom_highbd_lpf_horizontal_8_dual_c, 12), - make_tuple(&aom_highbd_lpf_horizontal_14_dual_sse2, - &aom_highbd_lpf_horizontal_14_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_4_dual_sse2, - &aom_highbd_lpf_vertical_4_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_6_dual_sse2, - &aom_highbd_lpf_vertical_6_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_8_dual_sse2, - &aom_highbd_lpf_vertical_8_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_14_dual_sse2, - &aom_highbd_lpf_vertical_14_dual_c, 12), -}; - -INSTANTIATE_TEST_CASE_P(SSE2, Loop8Test9Param_hbd, - ::testing::ValuesIn(kHbdLoop8Test9)); - -#endif // HAVE_SSE2 - -#if HAVE_NEON -const loop_param_t kLoop8Test6[] = { - make_tuple(&aom_lpf_vertical_14_neon, &aom_lpf_vertical_14_c, 8), - make_tuple(&aom_lpf_vertical_8_neon, &aom_lpf_vertical_8_c, 8), - make_tuple(&aom_lpf_vertical_6_neon, &aom_lpf_vertical_6_c, 8), - make_tuple(&aom_lpf_vertical_4_neon, &aom_lpf_vertical_4_c, 8), - make_tuple(&aom_lpf_horizontal_14_neon, &aom_lpf_horizontal_14_c, 8), - make_tuple(&aom_lpf_horizontal_8_neon, &aom_lpf_horizontal_8_c, 8), - make_tuple(&aom_lpf_horizontal_6_neon, &aom_lpf_horizontal_6_c, 8), - make_tuple(&aom_lpf_horizontal_4_neon, &aom_lpf_horizontal_4_c, 8) -}; - -INSTANTIATE_TEST_CASE_P(NEON, Loop8Test6Param_lbd, - ::testing::ValuesIn(kLoop8Test6)); -#endif // HAVE_NEON - -#if HAVE_AVX2 -const hbddual_loop_param_t kHbdLoop8Test9Avx2[] = { - make_tuple(&aom_highbd_lpf_horizontal_4_dual_avx2, - &aom_highbd_lpf_horizontal_4_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_4_dual_avx2, - &aom_highbd_lpf_horizontal_4_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_4_dual_avx2, - &aom_highbd_lpf_horizontal_4_dual_c, 12), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_avx2, - &aom_highbd_lpf_horizontal_8_dual_c, 8), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_avx2, - &aom_highbd_lpf_horizontal_8_dual_c, 10), - make_tuple(&aom_highbd_lpf_horizontal_8_dual_avx2, - &aom_highbd_lpf_horizontal_8_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_4_dual_avx2, - &aom_highbd_lpf_vertical_4_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_4_dual_avx2, - &aom_highbd_lpf_vertical_4_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_4_dual_avx2, - &aom_highbd_lpf_vertical_4_dual_c, 12), - make_tuple(&aom_highbd_lpf_vertical_8_dual_avx2, - &aom_highbd_lpf_vertical_8_dual_c, 8), - make_tuple(&aom_highbd_lpf_vertical_8_dual_avx2, - &aom_highbd_lpf_vertical_8_dual_c, 10), - make_tuple(&aom_highbd_lpf_vertical_8_dual_avx2, - &aom_highbd_lpf_vertical_8_dual_c, 12), -}; - -INSTANTIATE_TEST_CASE_P(AVX2, Loop8Test9Param_hbd, - ::testing::ValuesIn(kHbdLoop8Test9Avx2)); -#endif -} // namespace diff --git a/third_party/aom/test/masked_sad_test.cc b/third_party/aom/test/masked_sad_test.cc deleted file mode 100644 index 311f1877d..000000000 --- a/third_party/aom/test/masked_sad_test.cc +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_integer.h" - -using libaom_test::ACMRandom; - -namespace { -const int number_of_iterations = 200; - -typedef unsigned int (*MaskedSADFunc)(const uint8_t *src, int src_stride, - const uint8_t *ref, int ref_stride, - const uint8_t *second_pred, - const uint8_t *msk, int msk_stride, - int invert_mask); -typedef ::testing::tuple<MaskedSADFunc, MaskedSADFunc> MaskedSADParam; - -class MaskedSADTest : public ::testing::TestWithParam<MaskedSADParam> { - public: - virtual ~MaskedSADTest() {} - virtual void SetUp() { - maskedSAD_op_ = GET_PARAM(0); - ref_maskedSAD_op_ = GET_PARAM(1); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - void runMaskedSADTest(int run_times); - - protected: - MaskedSADFunc maskedSAD_op_; - MaskedSADFunc ref_maskedSAD_op_; -}; -void MaskedSADTest::runMaskedSADTest(int run_times) { - unsigned int ref_ret = 0, ret = 1; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint8_t, src_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint8_t, ref_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint8_t, second_pred_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - int err_count = 0; - int first_failure = -1; - int src_stride = MAX_SB_SIZE; - int ref_stride = MAX_SB_SIZE; - int msk_stride = MAX_SB_SIZE; - const int iters = run_times == 1 ? number_of_iterations : 1; - for (int i = 0; i < iters; ++i) { - for (int j = 0; j < MAX_SB_SIZE * MAX_SB_SIZE; j++) { - src_ptr[j] = rnd.Rand8(); - ref_ptr[j] = rnd.Rand8(); - second_pred_ptr[j] = rnd.Rand8(); - msk_ptr[j] = ((rnd.Rand8() & 0x7f) > 64) ? rnd.Rand8() & 0x3f : 64; - assert(msk_ptr[j] <= 64); - } - - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int repeat = 0; repeat < run_times; ++repeat) { - ref_ret = ref_maskedSAD_op_(src_ptr, src_stride, ref_ptr, ref_stride, - second_pred_ptr, msk_ptr, msk_stride, - invert_mask); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - if (run_times == 1) { - ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src_ptr, src_stride, - ref_ptr, ref_stride, - second_pred_ptr, msk_ptr, - msk_stride, invert_mask)); - } else { - for (int repeat = 0; repeat < run_times; ++repeat) { - ret = - maskedSAD_op_(src_ptr, src_stride, ref_ptr, ref_stride, - second_pred_ptr, msk_ptr, msk_stride, invert_mask); - } - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 10) { - printf("%7.2f/%7.2fns", time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - if (ret != ref_ret) { - err_count++; - if (first_failure == -1) first_failure = i; - } - } - } - EXPECT_EQ(0, err_count) << "Error: Masked SAD Test, output doesn't match. " - << "First failed at test case " << first_failure; -} - -TEST_P(MaskedSADTest, OperationCheck) { runMaskedSADTest(1); } - -TEST_P(MaskedSADTest, DISABLED_Speed) { runMaskedSADTest(2000000); } - -typedef unsigned int (*HighbdMaskedSADFunc)(const uint8_t *src, int src_stride, - const uint8_t *ref, int ref_stride, - const uint8_t *second_pred, - const uint8_t *msk, int msk_stride, - int invert_mask); -typedef ::testing::tuple<HighbdMaskedSADFunc, HighbdMaskedSADFunc> - HighbdMaskedSADParam; - -class HighbdMaskedSADTest - : public ::testing::TestWithParam<HighbdMaskedSADParam> { - public: - virtual ~HighbdMaskedSADTest() {} - virtual void SetUp() { - maskedSAD_op_ = GET_PARAM(0); - ref_maskedSAD_op_ = GET_PARAM(1); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - void runHighbdMaskedSADTest(int run_times); - - protected: - HighbdMaskedSADFunc maskedSAD_op_; - HighbdMaskedSADFunc ref_maskedSAD_op_; -}; -void HighbdMaskedSADTest::runHighbdMaskedSADTest(int run_times) { - unsigned int ref_ret = 0, ret = 1; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint16_t, src_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint16_t, ref_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint16_t, second_pred_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[MAX_SB_SIZE * MAX_SB_SIZE]); - uint8_t *src8_ptr = CONVERT_TO_BYTEPTR(src_ptr); - uint8_t *ref8_ptr = CONVERT_TO_BYTEPTR(ref_ptr); - uint8_t *second_pred8_ptr = CONVERT_TO_BYTEPTR(second_pred_ptr); - int err_count = 0; - int first_failure = -1; - int src_stride = MAX_SB_SIZE; - int ref_stride = MAX_SB_SIZE; - int msk_stride = MAX_SB_SIZE; - const int iters = run_times == 1 ? number_of_iterations : 1; - for (int i = 0; i < iters; ++i) { - for (int j = 0; j < MAX_SB_SIZE * MAX_SB_SIZE; j++) { - src_ptr[j] = rnd.Rand16() & 0xfff; - ref_ptr[j] = rnd.Rand16() & 0xfff; - second_pred_ptr[j] = rnd.Rand16() & 0xfff; - msk_ptr[j] = ((rnd.Rand8() & 0x7f) > 64) ? rnd.Rand8() & 0x3f : 64; - } - - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int repeat = 0; repeat < run_times; ++repeat) { - ref_ret = ref_maskedSAD_op_(src8_ptr, src_stride, ref8_ptr, ref_stride, - second_pred8_ptr, msk_ptr, msk_stride, - invert_mask); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - if (run_times == 1) { - ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src8_ptr, src_stride, - ref8_ptr, ref_stride, - second_pred8_ptr, msk_ptr, - msk_stride, invert_mask)); - } else { - for (int repeat = 0; repeat < run_times; ++repeat) { - ret = - maskedSAD_op_(src8_ptr, src_stride, ref8_ptr, ref_stride, - second_pred8_ptr, msk_ptr, msk_stride, invert_mask); - } - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 10) { - printf("%7.2f/%7.2fns", time1, time2); - printf("(%3.2f)\n", time1 / time2); - } - if (ret != ref_ret) { - err_count++; - if (first_failure == -1) first_failure = i; - } - } - } - EXPECT_EQ(0, err_count) - << "Error: High BD Masked SAD Test, output doesn't match. " - << "First failed at test case " << first_failure; -} - -TEST_P(HighbdMaskedSADTest, OperationCheck) { runHighbdMaskedSADTest(1); } - -TEST_P(HighbdMaskedSADTest, DISABLED_Speed) { runHighbdMaskedSADTest(1000000); } - -using ::testing::make_tuple; - -#if HAVE_SSSE3 -const MaskedSADParam msad_test[] = { - make_tuple(&aom_masked_sad4x4_ssse3, &aom_masked_sad4x4_c), - make_tuple(&aom_masked_sad4x8_ssse3, &aom_masked_sad4x8_c), - make_tuple(&aom_masked_sad8x4_ssse3, &aom_masked_sad8x4_c), - make_tuple(&aom_masked_sad8x8_ssse3, &aom_masked_sad8x8_c), - make_tuple(&aom_masked_sad8x16_ssse3, &aom_masked_sad8x16_c), - make_tuple(&aom_masked_sad16x8_ssse3, &aom_masked_sad16x8_c), - make_tuple(&aom_masked_sad16x16_ssse3, &aom_masked_sad16x16_c), - make_tuple(&aom_masked_sad16x32_ssse3, &aom_masked_sad16x32_c), - make_tuple(&aom_masked_sad32x16_ssse3, &aom_masked_sad32x16_c), - make_tuple(&aom_masked_sad32x32_ssse3, &aom_masked_sad32x32_c), - make_tuple(&aom_masked_sad32x64_ssse3, &aom_masked_sad32x64_c), - make_tuple(&aom_masked_sad64x32_ssse3, &aom_masked_sad64x32_c), - make_tuple(&aom_masked_sad64x64_ssse3, &aom_masked_sad64x64_c), - make_tuple(&aom_masked_sad64x128_ssse3, &aom_masked_sad64x128_c), - make_tuple(&aom_masked_sad128x64_ssse3, &aom_masked_sad128x64_c), - make_tuple(&aom_masked_sad128x128_ssse3, &aom_masked_sad128x128_c), - make_tuple(&aom_masked_sad4x16_ssse3, &aom_masked_sad4x16_c), - make_tuple(&aom_masked_sad16x4_ssse3, &aom_masked_sad16x4_c), - make_tuple(&aom_masked_sad8x32_ssse3, &aom_masked_sad8x32_c), - make_tuple(&aom_masked_sad32x8_ssse3, &aom_masked_sad32x8_c), - make_tuple(&aom_masked_sad16x64_ssse3, &aom_masked_sad16x64_c), - make_tuple(&aom_masked_sad64x16_ssse3, &aom_masked_sad64x16_c), -}; - -INSTANTIATE_TEST_CASE_P(SSSE3, MaskedSADTest, ::testing::ValuesIn(msad_test)); - -const HighbdMaskedSADParam hbd_msad_test[] = { - make_tuple(&aom_highbd_masked_sad4x4_ssse3, &aom_highbd_masked_sad4x4_c), - make_tuple(&aom_highbd_masked_sad4x8_ssse3, &aom_highbd_masked_sad4x8_c), - make_tuple(&aom_highbd_masked_sad8x4_ssse3, &aom_highbd_masked_sad8x4_c), - make_tuple(&aom_highbd_masked_sad8x8_ssse3, &aom_highbd_masked_sad8x8_c), - make_tuple(&aom_highbd_masked_sad8x16_ssse3, &aom_highbd_masked_sad8x16_c), - make_tuple(&aom_highbd_masked_sad16x8_ssse3, &aom_highbd_masked_sad16x8_c), - make_tuple(&aom_highbd_masked_sad16x16_ssse3, &aom_highbd_masked_sad16x16_c), - make_tuple(&aom_highbd_masked_sad16x32_ssse3, &aom_highbd_masked_sad16x32_c), - make_tuple(&aom_highbd_masked_sad32x16_ssse3, &aom_highbd_masked_sad32x16_c), - make_tuple(&aom_highbd_masked_sad32x32_ssse3, &aom_highbd_masked_sad32x32_c), - make_tuple(&aom_highbd_masked_sad32x64_ssse3, &aom_highbd_masked_sad32x64_c), - make_tuple(&aom_highbd_masked_sad64x32_ssse3, &aom_highbd_masked_sad64x32_c), - make_tuple(&aom_highbd_masked_sad64x64_ssse3, &aom_highbd_masked_sad64x64_c), - make_tuple(&aom_highbd_masked_sad64x128_ssse3, - &aom_highbd_masked_sad64x128_c), - make_tuple(&aom_highbd_masked_sad128x64_ssse3, - &aom_highbd_masked_sad128x64_c), - make_tuple(&aom_highbd_masked_sad128x128_ssse3, - &aom_highbd_masked_sad128x128_c), - make_tuple(&aom_highbd_masked_sad4x16_ssse3, &aom_highbd_masked_sad4x16_c), - make_tuple(&aom_highbd_masked_sad16x4_ssse3, &aom_highbd_masked_sad16x4_c), - make_tuple(&aom_highbd_masked_sad8x32_ssse3, &aom_highbd_masked_sad8x32_c), - make_tuple(&aom_highbd_masked_sad32x8_ssse3, &aom_highbd_masked_sad32x8_c), - make_tuple(&aom_highbd_masked_sad16x64_ssse3, &aom_highbd_masked_sad16x64_c), - make_tuple(&aom_highbd_masked_sad64x16_ssse3, &aom_highbd_masked_sad64x16_c), -}; - -INSTANTIATE_TEST_CASE_P(SSSE3, HighbdMaskedSADTest, - ::testing::ValuesIn(hbd_msad_test)); -#endif // HAVE_SSSE3 - -#if HAVE_AVX2 -const MaskedSADParam msad_avx2_test[] = { - make_tuple(&aom_masked_sad4x4_avx2, &aom_masked_sad4x4_ssse3), - make_tuple(&aom_masked_sad4x8_avx2, &aom_masked_sad4x8_ssse3), - make_tuple(&aom_masked_sad8x4_avx2, &aom_masked_sad8x4_ssse3), - make_tuple(&aom_masked_sad8x8_avx2, &aom_masked_sad8x8_ssse3), - make_tuple(&aom_masked_sad8x16_avx2, &aom_masked_sad8x16_ssse3), - make_tuple(&aom_masked_sad16x8_avx2, &aom_masked_sad16x8_ssse3), - make_tuple(&aom_masked_sad16x16_avx2, &aom_masked_sad16x16_ssse3), - make_tuple(&aom_masked_sad16x32_avx2, &aom_masked_sad16x32_ssse3), - make_tuple(&aom_masked_sad32x16_avx2, &aom_masked_sad32x16_ssse3), - make_tuple(&aom_masked_sad32x32_avx2, &aom_masked_sad32x32_ssse3), - make_tuple(&aom_masked_sad32x64_avx2, &aom_masked_sad32x64_ssse3), - make_tuple(&aom_masked_sad64x32_avx2, &aom_masked_sad64x32_ssse3), - make_tuple(&aom_masked_sad64x64_avx2, &aom_masked_sad64x64_ssse3), - make_tuple(&aom_masked_sad64x128_avx2, &aom_masked_sad64x128_ssse3), - make_tuple(&aom_masked_sad128x64_avx2, &aom_masked_sad128x64_ssse3), - make_tuple(&aom_masked_sad128x128_avx2, &aom_masked_sad128x128_ssse3), - make_tuple(&aom_masked_sad4x16_avx2, &aom_masked_sad4x16_ssse3), - make_tuple(&aom_masked_sad16x4_avx2, &aom_masked_sad16x4_ssse3), - make_tuple(&aom_masked_sad8x32_avx2, &aom_masked_sad8x32_ssse3), - make_tuple(&aom_masked_sad32x8_avx2, &aom_masked_sad32x8_ssse3), - make_tuple(&aom_masked_sad16x64_avx2, &aom_masked_sad16x64_ssse3), - make_tuple(&aom_masked_sad64x16_avx2, &aom_masked_sad64x16_ssse3) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, MaskedSADTest, - ::testing::ValuesIn(msad_avx2_test)); - -const HighbdMaskedSADParam hbd_msad_avx2_test[] = { - make_tuple(&aom_highbd_masked_sad4x4_avx2, &aom_highbd_masked_sad4x4_ssse3), - make_tuple(&aom_highbd_masked_sad4x8_avx2, &aom_highbd_masked_sad4x8_ssse3), - make_tuple(&aom_highbd_masked_sad8x4_avx2, &aom_highbd_masked_sad8x4_ssse3), - make_tuple(&aom_highbd_masked_sad8x8_avx2, &aom_highbd_masked_sad8x8_ssse3), - make_tuple(&aom_highbd_masked_sad8x16_avx2, &aom_highbd_masked_sad8x16_ssse3), - make_tuple(&aom_highbd_masked_sad16x8_avx2, &aom_highbd_masked_sad16x8_ssse3), - make_tuple(&aom_highbd_masked_sad16x16_avx2, - &aom_highbd_masked_sad16x16_ssse3), - make_tuple(&aom_highbd_masked_sad16x32_avx2, - &aom_highbd_masked_sad16x32_ssse3), - make_tuple(&aom_highbd_masked_sad32x16_avx2, - &aom_highbd_masked_sad32x16_ssse3), - make_tuple(&aom_highbd_masked_sad32x32_avx2, - &aom_highbd_masked_sad32x32_ssse3), - make_tuple(&aom_highbd_masked_sad32x64_avx2, - &aom_highbd_masked_sad32x64_ssse3), - make_tuple(&aom_highbd_masked_sad64x32_avx2, - &aom_highbd_masked_sad64x32_ssse3), - make_tuple(&aom_highbd_masked_sad64x64_avx2, - &aom_highbd_masked_sad64x64_ssse3), - make_tuple(&aom_highbd_masked_sad64x128_avx2, - &aom_highbd_masked_sad64x128_ssse3), - make_tuple(&aom_highbd_masked_sad128x64_avx2, - &aom_highbd_masked_sad128x64_ssse3), - make_tuple(&aom_highbd_masked_sad128x128_avx2, - &aom_highbd_masked_sad128x128_ssse3), - make_tuple(&aom_highbd_masked_sad4x16_avx2, &aom_highbd_masked_sad4x16_ssse3), - make_tuple(&aom_highbd_masked_sad16x4_avx2, &aom_highbd_masked_sad16x4_ssse3), - make_tuple(&aom_highbd_masked_sad8x32_avx2, &aom_highbd_masked_sad8x32_ssse3), - make_tuple(&aom_highbd_masked_sad32x8_avx2, &aom_highbd_masked_sad32x8_ssse3), - make_tuple(&aom_highbd_masked_sad16x64_avx2, - &aom_highbd_masked_sad16x64_ssse3), - make_tuple(&aom_highbd_masked_sad64x16_avx2, - &aom_highbd_masked_sad64x16_ssse3) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, HighbdMaskedSADTest, - ::testing::ValuesIn(hbd_msad_avx2_test)); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/masked_variance_test.cc b/third_party/aom/test/masked_variance_test.cc deleted file mode 100644 index 275b9feb6..000000000 --- a/third_party/aom/test/masked_variance_test.cc +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <stdlib.h> -#include <string.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_codec.h" -#include "aom/aom_integer.h" -#include "aom_dsp/aom_filter.h" -#include "aom_mem/aom_mem.h" - -using libaom_test::ACMRandom; - -namespace { -const int number_of_iterations = 200; - -typedef unsigned int (*MaskedSubPixelVarianceFunc)( - const uint8_t *src, int src_stride, int xoffset, int yoffset, - const uint8_t *ref, int ref_stride, const uint8_t *second_pred, - const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse); - -typedef ::testing::tuple<MaskedSubPixelVarianceFunc, MaskedSubPixelVarianceFunc> - MaskedSubPixelVarianceParam; - -class MaskedSubPixelVarianceTest - : public ::testing::TestWithParam<MaskedSubPixelVarianceParam> { - public: - virtual ~MaskedSubPixelVarianceTest() {} - virtual void SetUp() { - opt_func_ = GET_PARAM(0); - ref_func_ = GET_PARAM(1); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - MaskedSubPixelVarianceFunc opt_func_; - MaskedSubPixelVarianceFunc ref_func_; -}; - -TEST_P(MaskedSubPixelVarianceTest, OperationCheck) { - unsigned int ref_ret, opt_ret; - unsigned int ref_sse, opt_sse; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - // Note: We pad out the input array to a multiple of 16 bytes wide, so that - // consecutive rows keep the 16-byte alignment. - DECLARE_ALIGNED(16, uint8_t, src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, - second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - int err_count = 0; - int first_failure = -1; - int src_stride = (MAX_SB_SIZE + 16); - int ref_stride = (MAX_SB_SIZE + 16); - int msk_stride = (MAX_SB_SIZE + 16); - int xoffset; - int yoffset; - - for (int i = 0; i < number_of_iterations; ++i) { - int xoffsets[] = { 0, 4, rnd(BIL_SUBPEL_SHIFTS) }; - int yoffsets[] = { 0, 4, rnd(BIL_SUBPEL_SHIFTS) }; - for (int j = 0; j < (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16); j++) { - src_ptr[j] = rnd.Rand8(); - ref_ptr[j] = rnd.Rand8(); - second_pred_ptr[j] = rnd.Rand8(); - msk_ptr[j] = rnd(65); - } - for (int k = 0; k < 3; k++) { - for (int l = 0; l < 3; l++) { - xoffset = xoffsets[k]; - yoffset = yoffsets[l]; - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - ref_ret = ref_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr, - ref_stride, second_pred_ptr, msk_ptr, msk_stride, - invert_mask, &ref_sse); - ASM_REGISTER_STATE_CHECK( - opt_ret = opt_func_(src_ptr, src_stride, xoffset, yoffset, - ref_ptr, ref_stride, second_pred_ptr, msk_ptr, - msk_stride, invert_mask, &opt_sse)); - - if (opt_ret != ref_ret || opt_sse != ref_sse) { - err_count++; - if (first_failure == -1) first_failure = i; - } - } - } - } - } - - EXPECT_EQ(0, err_count) - << "Error: Masked Sub Pixel Variance Test OperationCheck," - << "C output doesn't match SSSE3 output. " - << "First failed at test case " << first_failure; -} - -TEST_P(MaskedSubPixelVarianceTest, ExtremeValues) { - unsigned int ref_ret, opt_ret; - unsigned int ref_sse, opt_sse; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint8_t, src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, - second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)]); - int first_failure_x = -1; - int first_failure_y = -1; - int err_count = 0; - int first_failure = -1; - int src_stride = (MAX_SB_SIZE + 16); - int ref_stride = (MAX_SB_SIZE + 16); - int msk_stride = (MAX_SB_SIZE + 16); - - for (int xoffset = 0; xoffset < BIL_SUBPEL_SHIFTS; xoffset++) { - for (int yoffset = 0; yoffset < BIL_SUBPEL_SHIFTS; yoffset++) { - for (int i = 0; i < 16; ++i) { - memset(src_ptr, (i & 0x1) ? 255 : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)); - memset(ref_ptr, (i & 0x2) ? 255 : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)); - memset(second_pred_ptr, (i & 0x4) ? 255 : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)); - memset(msk_ptr, (i & 0x8) ? 64 : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 16)); - - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - ref_ret = ref_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr, - ref_stride, second_pred_ptr, msk_ptr, msk_stride, - invert_mask, &ref_sse); - ASM_REGISTER_STATE_CHECK( - opt_ret = opt_func_(src_ptr, src_stride, xoffset, yoffset, - ref_ptr, ref_stride, second_pred_ptr, msk_ptr, - msk_stride, invert_mask, &opt_sse)); - - if (opt_ret != ref_ret || opt_sse != ref_sse) { - err_count++; - if (first_failure == -1) { - first_failure = i; - first_failure_x = xoffset; - first_failure_y = yoffset; - } - } - } - } - } - } - - EXPECT_EQ(0, err_count) << "Error: Masked Variance Test ExtremeValues," - << "C output doesn't match SSSE3 output. " - << "First failed at test case " << first_failure - << " x_offset = " << first_failure_x - << " y_offset = " << first_failure_y; -} - -typedef ::testing::tuple<MaskedSubPixelVarianceFunc, MaskedSubPixelVarianceFunc, - aom_bit_depth_t> - HighbdMaskedSubPixelVarianceParam; - -class HighbdMaskedSubPixelVarianceTest - : public ::testing::TestWithParam<HighbdMaskedSubPixelVarianceParam> { - public: - virtual ~HighbdMaskedSubPixelVarianceTest() {} - virtual void SetUp() { - opt_func_ = GET_PARAM(0); - ref_func_ = GET_PARAM(1); - bit_depth_ = GET_PARAM(2); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - MaskedSubPixelVarianceFunc opt_func_; - MaskedSubPixelVarianceFunc ref_func_; - aom_bit_depth_t bit_depth_; -}; - -TEST_P(HighbdMaskedSubPixelVarianceTest, OperationCheck) { - unsigned int ref_ret, opt_ret; - unsigned int ref_sse, opt_sse; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint16_t, src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint16_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint16_t, - second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - uint8_t *src8_ptr = CONVERT_TO_BYTEPTR(src_ptr); - uint8_t *ref8_ptr = CONVERT_TO_BYTEPTR(ref_ptr); - uint8_t *second_pred8_ptr = CONVERT_TO_BYTEPTR(second_pred_ptr); - int err_count = 0; - int first_failure = -1; - int first_failure_x = -1; - int first_failure_y = -1; - int src_stride = (MAX_SB_SIZE + 8); - int ref_stride = (MAX_SB_SIZE + 8); - int msk_stride = (MAX_SB_SIZE + 8); - int xoffset, yoffset; - - for (int i = 0; i < number_of_iterations; ++i) { - for (int j = 0; j < (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8); j++) { - src_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1); - ref_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1); - second_pred_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1); - msk_ptr[j] = rnd(65); - } - for (xoffset = 0; xoffset < BIL_SUBPEL_SHIFTS; xoffset++) { - for (yoffset = 0; yoffset < BIL_SUBPEL_SHIFTS; yoffset++) { - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - ref_ret = ref_func_(src8_ptr, src_stride, xoffset, yoffset, ref8_ptr, - ref_stride, second_pred8_ptr, msk_ptr, msk_stride, - invert_mask, &ref_sse); - ASM_REGISTER_STATE_CHECK( - opt_ret = opt_func_(src8_ptr, src_stride, xoffset, yoffset, - ref8_ptr, ref_stride, second_pred8_ptr, - msk_ptr, msk_stride, invert_mask, &opt_sse)); - - if (opt_ret != ref_ret || opt_sse != ref_sse) { - err_count++; - if (first_failure == -1) { - first_failure = i; - first_failure_x = xoffset; - first_failure_y = yoffset; - } - } - } - } - } - } - - EXPECT_EQ(0, err_count) - << "Error: Masked Sub Pixel Variance Test OperationCheck," - << "C output doesn't match SSSE3 output. " - << "First failed at test case " << first_failure - << " x_offset = " << first_failure_x << " y_offset = " << first_failure_y; -} - -TEST_P(HighbdMaskedSubPixelVarianceTest, ExtremeValues) { - unsigned int ref_ret, opt_ret; - unsigned int ref_sse, opt_sse; - ACMRandom rnd(ACMRandom::DeterministicSeed()); - DECLARE_ALIGNED(16, uint16_t, src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint16_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - DECLARE_ALIGNED(16, uint16_t, - second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)]); - uint8_t *src8_ptr = CONVERT_TO_BYTEPTR(src_ptr); - uint8_t *ref8_ptr = CONVERT_TO_BYTEPTR(ref_ptr); - uint8_t *second_pred8_ptr = CONVERT_TO_BYTEPTR(second_pred_ptr); - int first_failure_x = -1; - int first_failure_y = -1; - int err_count = 0; - int first_failure = -1; - int src_stride = (MAX_SB_SIZE + 8); - int ref_stride = (MAX_SB_SIZE + 8); - int msk_stride = (MAX_SB_SIZE + 8); - - for (int xoffset = 0; xoffset < BIL_SUBPEL_SHIFTS; xoffset++) { - for (int yoffset = 0; yoffset < BIL_SUBPEL_SHIFTS; yoffset++) { - for (int i = 0; i < 16; ++i) { - aom_memset16(src_ptr, (i & 0x1) ? ((1 << bit_depth_) - 1) : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)); - aom_memset16(ref_ptr, (i & 0x2) ? ((1 << bit_depth_) - 1) : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)); - aom_memset16(second_pred_ptr, (i & 0x4) ? ((1 << bit_depth_) - 1) : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)); - memset(msk_ptr, (i & 0x8) ? 64 : 0, - (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 8)); - - for (int invert_mask = 0; invert_mask < 2; ++invert_mask) { - ref_ret = ref_func_(src8_ptr, src_stride, xoffset, yoffset, ref8_ptr, - ref_stride, second_pred8_ptr, msk_ptr, msk_stride, - invert_mask, &ref_sse); - ASM_REGISTER_STATE_CHECK( - opt_ret = opt_func_(src8_ptr, src_stride, xoffset, yoffset, - ref8_ptr, ref_stride, second_pred8_ptr, - msk_ptr, msk_stride, invert_mask, &opt_sse)); - - if (opt_ret != ref_ret || opt_sse != ref_sse) { - err_count++; - if (first_failure == -1) { - first_failure = i; - first_failure_x = xoffset; - first_failure_y = yoffset; - } - } - } - } - } - } - - EXPECT_EQ(0, err_count) << "Error: Masked Variance Test ExtremeValues," - << "C output doesn't match SSSE3 output. " - << "First failed at test case " << first_failure - << " x_offset = " << first_failure_x - << " y_offset = " << first_failure_y; -} - -using ::testing::make_tuple; - -#if HAVE_SSSE3 - -const MaskedSubPixelVarianceParam sub_pel_var_test[] = { - make_tuple(&aom_masked_sub_pixel_variance128x128_ssse3, - &aom_masked_sub_pixel_variance128x128_c), - make_tuple(&aom_masked_sub_pixel_variance128x64_ssse3, - &aom_masked_sub_pixel_variance128x64_c), - make_tuple(&aom_masked_sub_pixel_variance64x128_ssse3, - &aom_masked_sub_pixel_variance64x128_c), - make_tuple(&aom_masked_sub_pixel_variance64x64_ssse3, - &aom_masked_sub_pixel_variance64x64_c), - make_tuple(&aom_masked_sub_pixel_variance64x32_ssse3, - &aom_masked_sub_pixel_variance64x32_c), - make_tuple(&aom_masked_sub_pixel_variance32x64_ssse3, - &aom_masked_sub_pixel_variance32x64_c), - make_tuple(&aom_masked_sub_pixel_variance32x32_ssse3, - &aom_masked_sub_pixel_variance32x32_c), - make_tuple(&aom_masked_sub_pixel_variance32x16_ssse3, - &aom_masked_sub_pixel_variance32x16_c), - make_tuple(&aom_masked_sub_pixel_variance16x32_ssse3, - &aom_masked_sub_pixel_variance16x32_c), - make_tuple(&aom_masked_sub_pixel_variance16x16_ssse3, - &aom_masked_sub_pixel_variance16x16_c), - make_tuple(&aom_masked_sub_pixel_variance16x8_ssse3, - &aom_masked_sub_pixel_variance16x8_c), - make_tuple(&aom_masked_sub_pixel_variance8x16_ssse3, - &aom_masked_sub_pixel_variance8x16_c), - make_tuple(&aom_masked_sub_pixel_variance8x8_ssse3, - &aom_masked_sub_pixel_variance8x8_c), - make_tuple(&aom_masked_sub_pixel_variance8x4_ssse3, - &aom_masked_sub_pixel_variance8x4_c), - make_tuple(&aom_masked_sub_pixel_variance4x8_ssse3, - &aom_masked_sub_pixel_variance4x8_c), - make_tuple(&aom_masked_sub_pixel_variance4x4_ssse3, - &aom_masked_sub_pixel_variance4x4_c) -}; - -INSTANTIATE_TEST_CASE_P(SSSE3_C_COMPARE, MaskedSubPixelVarianceTest, - ::testing::ValuesIn(sub_pel_var_test)); - -const HighbdMaskedSubPixelVarianceParam hbd_sub_pel_var_test[] = { - make_tuple(&aom_highbd_8_masked_sub_pixel_variance128x128_ssse3, - &aom_highbd_8_masked_sub_pixel_variance128x128_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance128x64_ssse3, - &aom_highbd_8_masked_sub_pixel_variance128x64_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance64x128_ssse3, - &aom_highbd_8_masked_sub_pixel_variance64x128_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance64x64_ssse3, - &aom_highbd_8_masked_sub_pixel_variance64x64_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance64x32_ssse3, - &aom_highbd_8_masked_sub_pixel_variance64x32_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance32x64_ssse3, - &aom_highbd_8_masked_sub_pixel_variance32x64_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance32x32_ssse3, - &aom_highbd_8_masked_sub_pixel_variance32x32_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance32x16_ssse3, - &aom_highbd_8_masked_sub_pixel_variance32x16_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance16x32_ssse3, - &aom_highbd_8_masked_sub_pixel_variance16x32_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance16x16_ssse3, - &aom_highbd_8_masked_sub_pixel_variance16x16_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance16x8_ssse3, - &aom_highbd_8_masked_sub_pixel_variance16x8_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance8x16_ssse3, - &aom_highbd_8_masked_sub_pixel_variance8x16_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance8x8_ssse3, - &aom_highbd_8_masked_sub_pixel_variance8x8_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance8x4_ssse3, - &aom_highbd_8_masked_sub_pixel_variance8x4_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance4x8_ssse3, - &aom_highbd_8_masked_sub_pixel_variance4x8_c, AOM_BITS_8), - make_tuple(&aom_highbd_8_masked_sub_pixel_variance4x4_ssse3, - &aom_highbd_8_masked_sub_pixel_variance4x4_c, AOM_BITS_8), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance128x128_ssse3, - &aom_highbd_10_masked_sub_pixel_variance128x128_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance128x64_ssse3, - &aom_highbd_10_masked_sub_pixel_variance128x64_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance64x128_ssse3, - &aom_highbd_10_masked_sub_pixel_variance64x128_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance64x64_ssse3, - &aom_highbd_10_masked_sub_pixel_variance64x64_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance64x32_ssse3, - &aom_highbd_10_masked_sub_pixel_variance64x32_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance32x64_ssse3, - &aom_highbd_10_masked_sub_pixel_variance32x64_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance32x32_ssse3, - &aom_highbd_10_masked_sub_pixel_variance32x32_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance32x16_ssse3, - &aom_highbd_10_masked_sub_pixel_variance32x16_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance16x32_ssse3, - &aom_highbd_10_masked_sub_pixel_variance16x32_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance16x16_ssse3, - &aom_highbd_10_masked_sub_pixel_variance16x16_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance16x8_ssse3, - &aom_highbd_10_masked_sub_pixel_variance16x8_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance8x16_ssse3, - &aom_highbd_10_masked_sub_pixel_variance8x16_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance8x8_ssse3, - &aom_highbd_10_masked_sub_pixel_variance8x8_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance8x4_ssse3, - &aom_highbd_10_masked_sub_pixel_variance8x4_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance4x8_ssse3, - &aom_highbd_10_masked_sub_pixel_variance4x8_c, AOM_BITS_10), - make_tuple(&aom_highbd_10_masked_sub_pixel_variance4x4_ssse3, - &aom_highbd_10_masked_sub_pixel_variance4x4_c, AOM_BITS_10), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance128x128_ssse3, - &aom_highbd_12_masked_sub_pixel_variance128x128_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance128x64_ssse3, - &aom_highbd_12_masked_sub_pixel_variance128x64_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance64x128_ssse3, - &aom_highbd_12_masked_sub_pixel_variance64x128_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance64x64_ssse3, - &aom_highbd_12_masked_sub_pixel_variance64x64_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance64x32_ssse3, - &aom_highbd_12_masked_sub_pixel_variance64x32_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance32x64_ssse3, - &aom_highbd_12_masked_sub_pixel_variance32x64_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance32x32_ssse3, - &aom_highbd_12_masked_sub_pixel_variance32x32_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance32x16_ssse3, - &aom_highbd_12_masked_sub_pixel_variance32x16_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance16x32_ssse3, - &aom_highbd_12_masked_sub_pixel_variance16x32_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance16x16_ssse3, - &aom_highbd_12_masked_sub_pixel_variance16x16_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance16x8_ssse3, - &aom_highbd_12_masked_sub_pixel_variance16x8_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance8x16_ssse3, - &aom_highbd_12_masked_sub_pixel_variance8x16_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance8x8_ssse3, - &aom_highbd_12_masked_sub_pixel_variance8x8_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance8x4_ssse3, - &aom_highbd_12_masked_sub_pixel_variance8x4_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance4x8_ssse3, - &aom_highbd_12_masked_sub_pixel_variance4x8_c, AOM_BITS_12), - make_tuple(&aom_highbd_12_masked_sub_pixel_variance4x4_ssse3, - &aom_highbd_12_masked_sub_pixel_variance4x4_c, AOM_BITS_12) -}; - -INSTANTIATE_TEST_CASE_P(SSSE3_C_COMPARE, HighbdMaskedSubPixelVarianceTest, - ::testing::ValuesIn(hbd_sub_pel_var_test)); -#endif // HAVE_SSSE3 -} // namespace diff --git a/third_party/aom/test/md5_helper.h b/third_party/aom/test/md5_helper.h deleted file mode 100644 index 9443cb262..000000000 --- a/third_party/aom/test/md5_helper.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_MD5_HELPER_H_ -#define AOM_TEST_MD5_HELPER_H_ - -#include "aom/aom_decoder.h" -#include "common/md5_utils.h" - -namespace libaom_test { -class MD5 { - public: - MD5() { MD5Init(&md5_); } - - void Add(const aom_image_t *img) { - for (int plane = 0; plane < 3; ++plane) { - const uint8_t *buf = img->planes[plane]; - // Calculate the width and height to do the md5 check. For the chroma - // 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 & AOM_IMG_FMT_HIGHBITDEPTH) ? 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) * - bytes_per_sample; - - for (int y = 0; y < h; ++y) { - MD5Update(&md5_, buf, w); - buf += img->stride[plane]; - } - } - } - - void Add(const uint8_t *data, size_t size) { - MD5Update(&md5_, data, static_cast<uint32_t>(size)); - } - - const char *Get(void) { - static const char hex[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', - }; - uint8_t tmp[16]; - MD5Context ctx_tmp = md5_; - - MD5Final(tmp, &ctx_tmp); - for (int i = 0; i < 16; i++) { - res_[i * 2 + 0] = hex[tmp[i] >> 4]; - res_[i * 2 + 1] = hex[tmp[i] & 0xf]; - } - res_[32] = 0; - - return res_; - } - - protected: - char res_[33]; - MD5Context md5_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_MD5_HELPER_H_ diff --git a/third_party/aom/test/metrics_template.html b/third_party/aom/test/metrics_template.html deleted file mode 100644 index b57c62314..000000000 --- a/third_party/aom/test/metrics_template.html +++ /dev/null @@ -1,422 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> -<meta charset="utf-8"> -<title>Video Codec Test Results</title> -<style type="text/css"> -<!-- Begin 960 reset --> -a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,c -ode,dd,del,details,dfn,dialog,div,dl,dt,em,embed,fieldset,figcaption,figure,font,footer,form,h1,h2,h -3,h4,h5,h6,header,hgroup,hr,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,meter,nav,object,ol, -output,p,pre,progress,q,rp,rt,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbo -dy,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,xmp{border:0;margin:0;padding:0;font-size:100%}html,b -ody{height:100%}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{displa -y:block}b,strong{font-weight:bold}img{color:transparent;font-size:0;vertical-align:middle;-ms-interp -olation-mode:bicubic}ol,ul{list-style:none}li{display:list-item}table{border-collapse:collapse;borde -r-spacing:0}th,td,caption{font-weight:normal;vertical-align:top;text-align:left}q{quotes:none}q:befo -re,q:after{content:'';content:none}sub,sup,small{font-size:75%}sub,sup{line-height:0;position:relati -ve;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}svg{overflow:hidden} -<!-- End 960 reset --> -<!-- Begin 960 text --> -body{font:13px/1.5 'Helvetica Neue',Arial,'Liberation Sans',FreeSans,sans-serif}pre,code{font-family -:'DejaVu Sans Mono',Menlo,Consolas,monospace}hr{border:0 #ccc solid;border-top-width:1px;clear:both; -height:0}h1{font-size:25px}h2{font-size:23px}h3{font-size:21px}h4{font-size:19px}h5{font-size:17px}h -6{font-size:15px}ol{list-style:decimal}ul{list-style:disc}li{margin-left:30px}p,dl,hr,h1,h2,h3,h4,h5 -,h6,ol,ul,pre,table,address,fieldset,figure{margin-bottom:20px} -<!-- End 960 text --> -<!-- Begin 960 grid (fluid variant) - 12 columns, 1152px total width - http://960.gs/ | http://grids.heroku.com/ --> -.container_12{width:92%;margin-left:4%;margin-right:4%}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid -_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12{display:inline;float:left;position:relative;ma -rgin-left:1%;margin-right:1%}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width: -6.333%}.container_12 .grid_2{width:14.667%}.container_12 .grid_3{width:23.0%}.container_12 .grid_4{w -idth:31.333%}.container_12 .grid_5{width:39.667%}.container_12 .grid_6{width:48.0%}.container_12 .gr -id_7{width:56.333%}.container_12 .grid_8{width:64.667%}.container_12 .grid_9{width:73.0%}.container_ -12 .grid_10{width:81.333%}.container_12 .grid_11{width:89.667%}.container_12 .grid_12{width:98.0%}.c -ontainer_12 .prefix_1{padding-left:8.333%}.container_12 .prefix_2{padding-left:16.667%}.container_12 - .prefix_3{padding-left:25.0%}.container_12 .prefix_4{padding-left:33.333%}.container_12 .prefix_5{p -adding-left:41.667%}.container_12 .prefix_6{padding-left:50.0%}.container_12 .prefix_7{padding-left: -58.333%}.container_12 .prefix_8{padding-left:66.667%}.container_12 .prefix_9{padding-left:75.0%}.con -tainer_12 .prefix_10{padding-left:83.333%}.container_12 .prefix_11{padding-left:91.667%}.container_1 -2 .suffix_1{padding-right:8.333%}.container_12 .suffix_2{padding-right:16.667%}.container_12 .suffix -_3{padding-right:25.0%}.container_12 .suffix_4{padding-right:33.333%}.container_12 .suffix_5{padding --right:41.667%}.container_12 .suffix_6{padding-right:50.0%}.container_12 .suffix_7{padding-right:58. -333%}.container_12 .suffix_8{padding-right:66.667%}.container_12 .suffix_9{padding-right:75.0%}.cont -ainer_12 .suffix_10{padding-right:83.333%}.container_12 .suffix_11{padding-right:91.667%}.container_ -12 .push_1{left:8.333%}.container_12 .push_2{left:16.667%}.container_12 .push_3{left:25.0%}.containe -r_12 .push_4{left:33.333%}.container_12 .push_5{left:41.667%}.container_12 .push_6{left:50.0%}.conta -iner_12 .push_7{left:58.333%}.container_12 .push_8{left:66.667%}.container_12 .push_9{left:75.0%}.co -ntainer_12 .push_10{left:83.333%}.container_12 .push_11{left:91.667%}.container_12 .pull_1{left:-8.3 -33%}.container_12 .pull_2{left:-16.667%}.container_12 .pull_3{left:-25.0%}.container_12 .pull_4{left -:-33.333%}.container_12 .pull_5{left:-41.667%}.container_12 .pull_6{left:-50.0%}.container_12 .pull_ -7{left:-58.333%}.container_12 .pull_8{left:-66.667%}.container_12 .pull_9{left:-75.0%}.container_12 -.pull_10{left:-83.333%}.container_12 .pull_11{left:-91.667%}.clear{clear:both;display:block;overflow -:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font --size:0;line-height:0;visibility:hidden;width:0;height:0}.clearfix{display:inline-block}* html .clea -rfix{height:1%}.clearfix{display:block} -<!-- End 960 grid --> - -div.metricgraph { - -} - -body { - -} - -div.header { - font-family: Arial, sans-serif; -} - -div.header h2 { - margin: .5em auto; -} - -div.radio { - font-family: Arial, sans-serif; - margin-bottom: 1em; -} - -div.main { - -} - -div.cliplist { - font-family: Arial, sans-serif; - margin-top: 6px; -} - -div.chartarea { - font-family: Arial, sans-serif; -} - -div.indicators { - font-family: Arial, sans-serif; - font-size: 13px; - margin-top: 6px; - min-height: 600px; - background-color: #f7f7f7; -} - -div.indicators div.content { - margin: 1em; -} - -div.indicators div.content h5 { - font-size: 13px; - text-align: center; - margin: 0; -} - -div.indicators div.content ul { - margin-left: 0; - padding-left: 0; - margin-top: 0; -} - -div.indicators div.content ul li { - margin-left: 1.5em; -} - -div.indicators div.content p:first-child { - margin-bottom: .5em; -} - -span.google-visualization-table-sortind { - color: #000; -} -.header-style { - font-weight: bold; - border: 1px solid #fff; - background-color: #ccc; -} - -td.header-style+td { - -} - -.orange-background { - background-color: orange; -} - -.light-gray-background { - background-color: #f0f0f0; -} -</style> -<script type="text/javascript" src="https://www.google.com/jsapi"></script> -<script type="text/javascript"> -var chart_left = 40; -var chart_top = 6; -var chart_height = document.documentElement.clientHeight-100; -var chart_width = "100%"; -ftable='filestable_avg' -var snrs = []; -var filestable_dsnr = []; -var filestable_drate = []; -var filestable_avg = []; - -// Python template code replaces the following 2 lines. -//%%metrics_js%%// -//%%filestable_dpsnr%%// -//%%filestable_avg%%// -//%%filestable_drate%%// -//%%snrs%%// - -var selected = 0 -var imagestr = ''; -var bettertable=0; -var chart=0; -var better=0; -var metricdata=0; -var metricView=0; -var column=1; -var formatter=0; - -function changeColumn(col) { - column = col; - console.log(col) - draw_files(); -} - -function changeMetric(m) { - ftable=m - draw_files() -} - -function setup_vis() { - chart = new google.visualization.ScatterChart( - document.getElementById("metricgraph")); - - bettertable = new google.visualization.Table( - document.getElementById("bettertable")); - - draw_files(); - build_metrics_radio(); -} - -function build_metrics_radio() { - for (metric=1; metric < metrics.length; metric++) { - var rb = document.createElement('input'); - var l = document.createElement('label'); - rb.setAttribute('type','radio'); - rb.setAttribute('name','metric'); - rb.setAttribute('onClick', "changeColumn('"+metric.toString()+"')"); - l.innerHTML = metrics[metric]; - document.getElementById('metrics').appendChild(rb); - document.getElementById('metrics').appendChild(l); - } -} - -function draw_files() { - var options = {'allowHtml': true, 'width': "100%", 'height': "50%"}; - if (better != 0) delete better; - - col=eval(ftable+'[column]') - better = new google.visualization.DataTable(col) - - // Python Template code replaces the following line with a list of - // formatters. - if (ftable == 'filestable_dsnr') - formatter = new google.visualization.NumberFormat( - {fractionDigits: 4, suffix:" db"}); - else - formatter = new google.visualization.NumberFormat( - {fractionDigits: 4, suffix:"%"}); - - //%%formatters%%// - - bettertable.draw(better,options); - google.visualization.events.addListener(bettertable, 'select', - selectBetterHandler); - query_file() -} - -function query_file() { - imagestr = better.getFormattedValue(selected, 0) - var metricjson = eval('(' + snrs[column][selected] + ')'); - metricdata = new google.visualization.DataTable(metricjson, 0.6); - if( metricView != 0 ) delete metricView; - metricView = new google.visualization.DataView(metricdata); - - chart.draw(metricView, {curveType:'function', - explorer: {}, - chartArea:{left:chart_left, top:chart_top, width:chart_width, - height:chart_height-90}, - hAxis:{title:"Datarate in kbps"}, - vAxis:{title:"Quality in decibels", format: '##.0', textPosition: 'in'}, - legend:{position:"in"}, title:imagestr, pointSize:2, lineWidth:1, - width:chart_width, height:chart_height-50 }); - - google.visualization.events.addListener(chart, 'select', chartSelect); - google.visualization.events.addListener(chart, 'onmouseover', chartMouseOver); - google.visualization.events.addListener(chart, 'onmouseout', chartMouseOut); -} - -function chartMouseOut(e) { - statusbar = document.getElementById('status'); - statusbar.style.display = 'none'; -} - -function chartMouseOver(e) { - pointDifference(e.row, e.column) -} - -function pointDifference(row, col) { - if(!row || !col) - return; - - var cols = metricdata.getNumberOfColumns(); - var rows = metricdata.getNumberOfRows(); - - var sel_bitrate = metricView.getValue(row, 0 ); - var sel_metric = metricView.getValue(row, col); - - var message = '<ul>' + metricView.getColumnLabel(col) + - ' (' + sel_bitrate.toFixed(0) + ' kbps, ' + sel_metric.toFixed(2) + ')' + ' is '; - - - // col 0 is datarate - for( var i=1;i<cols;++i) { - - var metric_greatest_thats_less = 0; - var rate_greatest_thats_less = 0; - var metric_smallest_thats_greater = 999; - var rate_smallest_thats_greater = 0; - - if(i==col) - continue; - - // Find the lowest metric for the column that's greater than sel_metric and - // the highest metric for this column that's less than the metric. - for(var line_count = 0; line_count < rows; ++line_count) { - this_metric = metricdata.getValue(line_count, i) - this_rate = metricdata.getValue(line_count, 0) - if(!this_metric) - continue; - - if(this_metric > metric_greatest_thats_less && - this_metric <= sel_metric) { - metric_greatest_thats_less = this_metric; - rate_greatest_thats_less = this_rate; - } - if(this_metric < metric_smallest_thats_greater && - this_metric > sel_metric) { - metric_smallest_thats_greater = this_metric; - rate_smallest_thats_greater = this_rate; - } - } - - if(rate_smallest_thats_greater == 0 || rate_greatest_thats_less == 0) { - message = message + " <li> Couldn't find a point on both sides.</li>" - } else { - metric_slope = ( rate_smallest_thats_greater - rate_greatest_thats_less) / - ( metric_smallest_thats_greater - metric_greatest_thats_less); - - projected_rate = ( sel_metric - metric_greatest_thats_less) * - metric_slope + rate_greatest_thats_less; - - difference = 100 * (projected_rate / sel_bitrate - 1); - - - if (difference > 0) - message = message + "<li> " + difference.toFixed(2) + - "% smaller than <em>" + - metricdata.getColumnLabel(i) + "</em></li> " - else - message = message + "<li> " + -difference.toFixed(2) + - "% bigger than <em>" + - metricdata.getColumnLabel(i) + "</em></li> " - } - - } - message = message + "</ul>" - statusbar = document.getElementById('status'); - statusbar.innerHTML = "<p>" + message + "</p>"; - statusbar.style.display = 'block'; -} - -function chartSelect() { - var selection = chart.getSelection(); - var message = ''; - var min = metricView.getFormattedValue(selection[0].row, 0); - var max = metricView.getFormattedValue(selection[selection.length-1].row, 0); - var val = metricView.getFormattedValue(selection[0].row,selection[0].column); - - pointDifference(selection[0].row, selection[0].column) - min = min / 3 - max = max * 3 - metricView.setRows(metricdata.getFilteredRows( - [{column: 0,minValue: min, maxValue:max}])); - - chart.draw(metricView, {curveType:'function', - chartArea:{left:40, top:10, width:chart_width, height:chart_height - 110}, - hAxis:{title:"datarate in kbps"}, vAxis:{title:"quality in decibels"}, - legend:{position:"in"}, title:imagestr, pointSize:2, lineWidth:1, - width:chart_width, height:chart_height - 50}); -} - -function selectBetterHandler() { - var selection = bettertable.getSelection(); - for (var i = 0; i < selection.length; i++) { - item = selection[i]; - } - selected = item.row - query_file() -} - - -google.load('visualization', '1', {'packages' : ['corechart','table']}); -google.setOnLoadCallback(setup_vis); -</script> -</head> - -<body> - - <div class="container_12"> - - <div class="grid_12 header"> - <h2>Codec Comparison Results</h2> - </div> - - <div class="grid_12 radio"> - - <form name="myform"> - Method For Combining Points - <input type="radio" checked name="column" value="1" - onClick="changeMetric('filestable_avg')" />Average of bitrates difference - <input type="radio" name="column" value="2" - onClick="changeMetric('filestable_dsnr')" />BDSNR - <input type="radio" name="column" value="3" - onClick="changeMetric('filestable_drate')" />BDRATE - </form> - - <form id="metrics" name="myform"> - </form> - - </div> - - <div class="grid_12 main"> - - <div class="grid_5 alpha cliplist"> - <div id="bettertable"></div> - </div> - - <div class="grid_5 chartarea"> - <div id="metricgraph"></div> - </div> - - <div class="grid_2 omega indicators"> - <div class="content"> - <h5>Indicators</h5> - <hr> - <div id="status"></div> - </div> - </div> - - </div> - - </div> - -</body> -</html> diff --git a/third_party/aom/test/monochrome_test.cc b/third_party/aom/test/monochrome_test.cc deleted file mode 100644 index ebccba584..000000000 --- a/third_party/aom/test/monochrome_test.cc +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <climits> -#include <vector> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/video_source.h" -#include "test/util.h" - -namespace { - -class MonochromeTest - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - MonochromeTest() : EncoderTest(GET_PARAM(0)), frame0_psnr_y_(0.) {} - - virtual ~MonochromeTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - (void)pts; - - // Get value of top-left corner pixel of U plane - int chroma_value = img.planes[AOM_PLANE_U][0]; - - bool is_chroma_constant = - ComparePlaneToValue(img, AOM_PLANE_U, chroma_value) && - ComparePlaneToValue(img, AOM_PLANE_V, chroma_value); - - // Chroma planes should be constant - EXPECT_TRUE(is_chroma_constant); - - // Monochrome flag on image should be set - EXPECT_EQ(img.monochrome, 1); - - chroma_value_list_.push_back(chroma_value); - } - - // Returns true if all pixels on the plane are equal to value, and returns - // false otherwise. - bool ComparePlaneToValue(const aom_image_t &img, const int plane, - const int value) { - const int w = aom_img_plane_width(&img, plane); - const int h = aom_img_plane_height(&img, plane); - const uint8_t *const buf = img.planes[plane]; - const int stride = img.stride[plane]; - - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - if (buf[r * stride + c] != value) return false; - } - } - return true; - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - // Check that the initial Y PSNR value is 'high enough', and check that - // subsequent Y PSNR values are 'close' to this initial value. - if (frame0_psnr_y_ == 0.) { - frame0_psnr_y_ = pkt->data.psnr.psnr[1]; - EXPECT_GT(frame0_psnr_y_, 29.); - } - EXPECT_NEAR(pkt->data.psnr.psnr[1], frame0_psnr_y_, 2.5); - } - - std::vector<int> chroma_value_list_; - double frame0_psnr_y_; -}; - -TEST_P(MonochromeTest, TestMonochromeEncoding) { - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 5); - - init_flags_ = AOM_CODEC_USE_PSNR; - - cfg_.g_w = 352; - cfg_.g_h = 288; - - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - cfg_.rc_buf_sz = 1000; - cfg_.rc_min_quantizer = 2; - cfg_.rc_max_quantizer = 56; - cfg_.rc_undershoot_pct = 50; - cfg_.rc_overshoot_pct = 50; - cfg_.rc_end_usage = AOM_CBR; - cfg_.kf_mode = AOM_KF_AUTO; - cfg_.g_lag_in_frames = 1; - cfg_.kf_min_dist = cfg_.kf_max_dist = 3000; - // Enable dropped frames. - cfg_.rc_dropframe_thresh = 1; - // Disable error_resilience mode. - cfg_.g_error_resilient = 0; - // Run at low bitrate. - cfg_.rc_target_bitrate = 40; - // Set monochrome encoding flag - cfg_.monochrome = 1; - - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - // Check that the chroma planes are equal across all frames - std::vector<int>::const_iterator iter = chroma_value_list_.begin(); - int initial_chroma_value = *iter; - for (; iter != chroma_value_list_.end(); ++iter) { - // Check that all decoded frames have the same constant chroma planes. - EXPECT_EQ(*iter, initial_chroma_value); - } -} - -AV1_INSTANTIATE_TEST_CASE(MonochromeTest, - ::testing::Values(::libaom_test::kTwoPassGood)); - -} // namespace diff --git a/third_party/aom/test/motion_vector_test.cc b/third_party/aom/test/motion_vector_test.cc deleted file mode 100644 index 27eb93893..000000000 --- a/third_party/aom/test/motion_vector_test.cc +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/util.h" -#include "test/yuv_video_source.h" - -namespace { -#define MAX_EXTREME_MV 1 -#define MIN_EXTREME_MV 2 - -// Encoding modes -const libaom_test::TestMode kEncodingModeVectors[] = { - ::libaom_test::kTwoPassGood, - ::libaom_test::kOnePassGood, -}; - -// Encoding speeds -const int kCpuUsedVectors[] = { 1, 5 }; - -// MV test modes: 1 - always use maximum MV; 2 - always use minimum MV. -const int kMVTestModes[] = { MAX_EXTREME_MV, MIN_EXTREME_MV }; - -class MotionVectorTestLarge - : public ::libaom_test::CodecTestWith3Params<libaom_test::TestMode, int, - int>, - public ::libaom_test::EncoderTest { - protected: - MotionVectorTestLarge() - : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), - cpu_used_(GET_PARAM(2)), mv_test_mode_(GET_PARAM(3)) {} - - virtual ~MotionVectorTestLarge() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(encoding_mode_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - cfg_.g_lag_in_frames = 3; - cfg_.rc_end_usage = AOM_VBR; - } else { - cfg_.g_lag_in_frames = 0; - cfg_.rc_end_usage = AOM_CBR; - cfg_.rc_buf_sz = 1000; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - } - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, cpu_used_); - encoder->Control(AV1E_ENABLE_MOTION_VECTOR_UNIT_TEST, mv_test_mode_); - if (encoding_mode_ != ::libaom_test::kRealTime) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7); - encoder->Control(AOME_SET_ARNR_STRENGTH, 5); - } - } - } - - libaom_test::TestMode encoding_mode_; - int cpu_used_; - int mv_test_mode_; -}; - -TEST_P(MotionVectorTestLarge, OverallTest) { - int width = 3840; - int height = 2160; - - // Reduce the test clip's resolution while testing on 32-bit system. - if (sizeof(void *) == 4) { - width = 2048; - height = 360; - } - - cfg_.rc_target_bitrate = 24000; - cfg_.g_profile = 0; - init_flags_ = AOM_CODEC_USE_PSNR; - - testing::internal::scoped_ptr<libaom_test::VideoSource> video; - video.reset(new libaom_test::YUVVideoSource( - "niklas_640_480_30.yuv", AOM_IMG_FMT_I420, width, height, 30, 1, 0, 3)); - - ASSERT_TRUE(video.get() != NULL); - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get())); -} - -AV1_INSTANTIATE_TEST_CASE(MotionVectorTestLarge, - ::testing::ValuesIn(kEncodingModeVectors), - ::testing::ValuesIn(kCpuUsedVectors), - ::testing::ValuesIn(kMVTestModes)); -} // namespace diff --git a/third_party/aom/test/noise_model_test.cc b/third_party/aom/test/noise_model_test.cc deleted file mode 100644 index b5b387e31..000000000 --- a/third_party/aom/test/noise_model_test.cc +++ /dev/null @@ -1,1343 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <math.h> -#include <algorithm> -#include <vector> - -#include "aom_dsp/noise_model.h" -#include "aom_dsp/noise_util.h" -#include "config/aom_dsp_rtcd.h" -#include "test/acm_random.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -// Return normally distrbuted values with standard deviation of sigma. -double randn(libaom_test::ACMRandom *random, double sigma) { - while (1) { - const double u = 2.0 * ((double)random->Rand31() / - testing::internal::Random::kMaxRange) - - 1.0; - const double v = 2.0 * ((double)random->Rand31() / - testing::internal::Random::kMaxRange) - - 1.0; - const double s = u * u + v * v; - if (s > 0 && s < 1) { - return sigma * (u * sqrt(-2.0 * log(s) / s)); - } - } - return 0; -} - -// Synthesizes noise using the auto-regressive filter of the given lag, -// with the provided n coefficients sampled at the given coords. -void noise_synth(libaom_test::ACMRandom *random, int lag, int n, - const int (*coords)[2], const double *coeffs, double *data, - int w, int h) { - const int pad_size = 3 * lag; - const int padded_w = w + pad_size; - const int padded_h = h + pad_size; - int x = 0, y = 0; - std::vector<double> padded(padded_w * padded_h); - - for (y = 0; y < padded_h; ++y) { - for (x = 0; x < padded_w; ++x) { - padded[y * padded_w + x] = randn(random, 1.0); - } - } - for (y = lag; y < padded_h; ++y) { - for (x = lag; x < padded_w; ++x) { - double sum = 0; - int i = 0; - for (i = 0; i < n; ++i) { - const int dx = coords[i][0]; - const int dy = coords[i][1]; - sum += padded[(y + dy) * padded_w + (x + dx)] * coeffs[i]; - } - padded[y * padded_w + x] += sum; - } - } - // Copy over the padded rows to the output - for (y = 0; y < h; ++y) { - memcpy(data + y * w, &padded[0] + y * padded_w, sizeof(*data) * w); - } -} - -std::vector<float> get_noise_psd(double *noise, int width, int height, - int block_size) { - float *block = - (float *)aom_memalign(32, block_size * block_size * sizeof(block)); - std::vector<float> psd(block_size * block_size); - int num_blocks = 0; - struct aom_noise_tx_t *tx = aom_noise_tx_malloc(block_size); - for (int y = 0; y <= height - block_size; y += block_size / 2) { - for (int x = 0; x <= width - block_size; x += block_size / 2) { - for (int yy = 0; yy < block_size; ++yy) { - for (int xx = 0; xx < block_size; ++xx) { - block[yy * block_size + xx] = (float)noise[(y + yy) * width + x + xx]; - } - } - aom_noise_tx_forward(tx, &block[0]); - aom_noise_tx_add_energy(tx, &psd[0]); - num_blocks++; - } - } - for (int yy = 0; yy < block_size; ++yy) { - for (int xx = 0; xx <= block_size / 2; ++xx) { - psd[yy * block_size + xx] /= num_blocks; - } - } - // Fill in the data that is missing due to symmetries - for (int xx = 1; xx < block_size / 2; ++xx) { - psd[(block_size - xx)] = psd[xx]; - } - for (int yy = 1; yy < block_size; ++yy) { - for (int xx = 1; xx < block_size / 2; ++xx) { - psd[(block_size - yy) * block_size + (block_size - xx)] = - psd[yy * block_size + xx]; - } - } - aom_noise_tx_free(tx); - aom_free(block); - return psd; -} - -} // namespace - -TEST(NoiseStrengthSolver, GetCentersTwoBins) { - aom_noise_strength_solver_t solver; - aom_noise_strength_solver_init(&solver, 2, 8); - EXPECT_NEAR(0, aom_noise_strength_solver_get_center(&solver, 0), 1e-5); - EXPECT_NEAR(255, aom_noise_strength_solver_get_center(&solver, 1), 1e-5); - aom_noise_strength_solver_free(&solver); -} - -TEST(NoiseStrengthSolver, GetCentersTwoBins10bit) { - aom_noise_strength_solver_t solver; - aom_noise_strength_solver_init(&solver, 2, 10); - EXPECT_NEAR(0, aom_noise_strength_solver_get_center(&solver, 0), 1e-5); - EXPECT_NEAR(1023, aom_noise_strength_solver_get_center(&solver, 1), 1e-5); - aom_noise_strength_solver_free(&solver); -} - -TEST(NoiseStrengthSolver, GetCenters256Bins) { - const int num_bins = 256; - aom_noise_strength_solver_t solver; - aom_noise_strength_solver_init(&solver, num_bins, 8); - - for (int i = 0; i < 256; ++i) { - EXPECT_NEAR(i, aom_noise_strength_solver_get_center(&solver, i), 1e-5); - } - aom_noise_strength_solver_free(&solver); -} - -// Tests that the noise strength solver returns the identity transform when -// given identity-like constraints. -TEST(NoiseStrengthSolver, ObserveIdentity) { - const int num_bins = 256; - aom_noise_strength_solver_t solver; - EXPECT_EQ(1, aom_noise_strength_solver_init(&solver, num_bins, 8)); - - // We have to add a big more strength to constraints at the boundary to - // overcome any regularization. - for (int j = 0; j < 5; ++j) { - aom_noise_strength_solver_add_measurement(&solver, 0, 0); - aom_noise_strength_solver_add_measurement(&solver, 255, 255); - } - for (int i = 0; i < 256; ++i) { - aom_noise_strength_solver_add_measurement(&solver, i, i); - } - EXPECT_EQ(1, aom_noise_strength_solver_solve(&solver)); - for (int i = 2; i < num_bins - 2; ++i) { - EXPECT_NEAR(i, solver.eqns.x[i], 0.1); - } - - aom_noise_strength_lut_t lut; - EXPECT_EQ(1, aom_noise_strength_solver_fit_piecewise(&solver, 2, &lut)); - - ASSERT_EQ(2, lut.num_points); - EXPECT_NEAR(0.0, lut.points[0][0], 1e-5); - EXPECT_NEAR(0.0, lut.points[0][1], 0.5); - EXPECT_NEAR(255.0, lut.points[1][0], 1e-5); - EXPECT_NEAR(255.0, lut.points[1][1], 0.5); - - aom_noise_strength_lut_free(&lut); - aom_noise_strength_solver_free(&solver); -} - -TEST(NoiseStrengthSolver, SimplifiesCurve) { - const int num_bins = 256; - aom_noise_strength_solver_t solver; - EXPECT_EQ(1, aom_noise_strength_solver_init(&solver, num_bins, 8)); - - // Create a parabolic input - for (int i = 0; i < 256; ++i) { - const double x = (i - 127.5) / 63.5; - aom_noise_strength_solver_add_measurement(&solver, i, x * x); - } - EXPECT_EQ(1, aom_noise_strength_solver_solve(&solver)); - - // First try to fit an unconstrained lut - aom_noise_strength_lut_t lut; - EXPECT_EQ(1, aom_noise_strength_solver_fit_piecewise(&solver, -1, &lut)); - ASSERT_LE(20, lut.num_points); - aom_noise_strength_lut_free(&lut); - - // Now constrain the maximum number of points - const int kMaxPoints = 9; - EXPECT_EQ(1, - aom_noise_strength_solver_fit_piecewise(&solver, kMaxPoints, &lut)); - ASSERT_EQ(kMaxPoints, lut.num_points); - - // Check that the input parabola is still well represented - EXPECT_NEAR(0.0, lut.points[0][0], 1e-5); - EXPECT_NEAR(4.0, lut.points[0][1], 0.1); - for (int i = 1; i < lut.num_points - 1; ++i) { - const double x = (lut.points[i][0] - 128.) / 64.; - EXPECT_NEAR(x * x, lut.points[i][1], 0.1); - } - EXPECT_NEAR(255.0, lut.points[kMaxPoints - 1][0], 1e-5); - - EXPECT_NEAR(4.0, lut.points[kMaxPoints - 1][1], 0.1); - aom_noise_strength_lut_free(&lut); - aom_noise_strength_solver_free(&solver); -} - -TEST(NoiseStrengthLut, LutEvalSinglePoint) { - aom_noise_strength_lut_t lut; - ASSERT_TRUE(aom_noise_strength_lut_init(&lut, 1)); - ASSERT_EQ(1, lut.num_points); - lut.points[0][0] = 0; - lut.points[0][1] = 1; - EXPECT_EQ(1, aom_noise_strength_lut_eval(&lut, -1)); - EXPECT_EQ(1, aom_noise_strength_lut_eval(&lut, 0)); - EXPECT_EQ(1, aom_noise_strength_lut_eval(&lut, 1)); - aom_noise_strength_lut_free(&lut); -} - -TEST(NoiseStrengthLut, LutEvalMultiPointInterp) { - const double kEps = 1e-5; - aom_noise_strength_lut_t lut; - ASSERT_TRUE(aom_noise_strength_lut_init(&lut, 4)); - ASSERT_EQ(4, lut.num_points); - - lut.points[0][0] = 0; - lut.points[0][1] = 0; - - lut.points[1][0] = 1; - lut.points[1][1] = 1; - - lut.points[2][0] = 2; - lut.points[2][1] = 1; - - lut.points[3][0] = 100; - lut.points[3][1] = 1001; - - // Test lower boundary - EXPECT_EQ(0, aom_noise_strength_lut_eval(&lut, -1)); - EXPECT_EQ(0, aom_noise_strength_lut_eval(&lut, 0)); - - // Test first part that should be identity - EXPECT_NEAR(0.25, aom_noise_strength_lut_eval(&lut, 0.25), kEps); - EXPECT_NEAR(0.75, aom_noise_strength_lut_eval(&lut, 0.75), kEps); - - // This is a constant section (should evaluate to 1) - EXPECT_NEAR(1.0, aom_noise_strength_lut_eval(&lut, 1.25), kEps); - EXPECT_NEAR(1.0, aom_noise_strength_lut_eval(&lut, 1.75), kEps); - - // Test interpolation between to non-zero y coords. - EXPECT_NEAR(1, aom_noise_strength_lut_eval(&lut, 2), kEps); - EXPECT_NEAR(251, aom_noise_strength_lut_eval(&lut, 26.5), kEps); - EXPECT_NEAR(751, aom_noise_strength_lut_eval(&lut, 75.5), kEps); - - // Test upper boundary - EXPECT_EQ(1001, aom_noise_strength_lut_eval(&lut, 100)); - EXPECT_EQ(1001, aom_noise_strength_lut_eval(&lut, 101)); - - aom_noise_strength_lut_free(&lut); -} - -TEST(NoiseModel, InitSuccessWithValidSquareShape) { - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 2, 8, 0 }; - aom_noise_model_t model; - - EXPECT_TRUE(aom_noise_model_init(&model, params)); - - const int kNumCoords = 12; - const int kCoords[][2] = { { -2, -2 }, { -1, -2 }, { 0, -2 }, { 1, -2 }, - { 2, -2 }, { -2, -1 }, { -1, -1 }, { 0, -1 }, - { 1, -1 }, { 2, -1 }, { -2, 0 }, { -1, 0 } }; - EXPECT_EQ(kNumCoords, model.n); - for (int i = 0; i < kNumCoords; ++i) { - const int *coord = kCoords[i]; - EXPECT_EQ(coord[0], model.coords[i][0]); - EXPECT_EQ(coord[1], model.coords[i][1]); - } - aom_noise_model_free(&model); -} - -TEST(NoiseModel, InitSuccessWithValidDiamondShape) { - aom_noise_model_t model; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_DIAMOND, 2, 8, 0 }; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - EXPECT_EQ(6, model.n); - const int kNumCoords = 6; - const int kCoords[][2] = { { 0, -2 }, { -1, -1 }, { 0, -1 }, - { 1, -1 }, { -2, 0 }, { -1, 0 } }; - EXPECT_EQ(kNumCoords, model.n); - for (int i = 0; i < kNumCoords; ++i) { - const int *coord = kCoords[i]; - EXPECT_EQ(coord[0], model.coords[i][0]); - EXPECT_EQ(coord[1], model.coords[i][1]); - } - aom_noise_model_free(&model); -} - -TEST(NoiseModel, InitFailsWithTooLargeLag) { - aom_noise_model_t model; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 10, 8, 0 }; - EXPECT_FALSE(aom_noise_model_init(&model, params)); - aom_noise_model_free(&model); -} - -TEST(NoiseModel, InitFailsWithTooSmallLag) { - aom_noise_model_t model; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 0, 8, 0 }; - EXPECT_FALSE(aom_noise_model_init(&model, params)); - aom_noise_model_free(&model); -} - -TEST(NoiseModel, InitFailsWithInvalidShape) { - aom_noise_model_t model; - aom_noise_model_params_t params = { aom_noise_shape(100), 3, 8, 0 }; - EXPECT_FALSE(aom_noise_model_init(&model, params)); - aom_noise_model_free(&model); -} - -// A container template class to hold a data type and extra arguments. -// All of these args are bundled into one struct so that we can use -// parameterized tests on combinations of supported data types -// (uint8_t and uint16_t) and bit depths (8, 10, 12). -template <typename T, int bit_depth, bool use_highbd> -struct BitDepthParams { - typedef T data_type_t; - static const int kBitDepth = bit_depth; - static const bool kUseHighBD = use_highbd; -}; - -template <typename T> -class FlatBlockEstimatorTest : public ::testing::Test, public T { - public: - virtual void SetUp() { random_.Reset(171); } - typedef std::vector<typename T::data_type_t> VecType; - VecType data_; - libaom_test::ACMRandom random_; -}; - -TYPED_TEST_CASE_P(FlatBlockEstimatorTest); - -TYPED_TEST_P(FlatBlockEstimatorTest, ExtractBlock) { - const int kBlockSize = 16; - aom_flat_block_finder_t flat_block_finder; - ASSERT_EQ(1, aom_flat_block_finder_init(&flat_block_finder, kBlockSize, - this->kBitDepth, this->kUseHighBD)); - const double normalization = flat_block_finder.normalization; - - // Test with an image of more than one block. - const int h = 2 * kBlockSize; - const int w = 2 * kBlockSize; - const int stride = 2 * kBlockSize; - this->data_.resize(h * stride, 128); - - // Set up the (0,0) block to be a plane and the (0,1) block to be a - // checkerboard - const int shift = this->kBitDepth - 8; - for (int y = 0; y < kBlockSize; ++y) { - for (int x = 0; x < kBlockSize; ++x) { - this->data_[y * stride + x] = (-y + x + 128) << shift; - this->data_[y * stride + x + kBlockSize] = - ((x % 2 + y % 2) % 2 ? 128 - 20 : 128 + 20) << shift; - } - } - std::vector<double> block(kBlockSize * kBlockSize, 1); - std::vector<double> plane(kBlockSize * kBlockSize, 1); - - // The block data should be a constant (zero) and the rest of the plane - // trend is covered in the plane data. - aom_flat_block_finder_extract_block(&flat_block_finder, - (uint8_t *)&this->data_[0], w, h, stride, - 0, 0, &plane[0], &block[0]); - for (int y = 0; y < kBlockSize; ++y) { - for (int x = 0; x < kBlockSize; ++x) { - EXPECT_NEAR(0, block[y * kBlockSize + x], 1e-5); - EXPECT_NEAR((double)(this->data_[y * stride + x]) / normalization, - plane[y * kBlockSize + x], 1e-5); - } - } - - // The plane trend is a constant, and the block is a zero mean checkerboard. - aom_flat_block_finder_extract_block(&flat_block_finder, - (uint8_t *)&this->data_[0], w, h, stride, - kBlockSize, 0, &plane[0], &block[0]); - const int mid = 128 << shift; - for (int y = 0; y < kBlockSize; ++y) { - for (int x = 0; x < kBlockSize; ++x) { - EXPECT_NEAR(((double)this->data_[y * stride + x + kBlockSize] - mid) / - normalization, - block[y * kBlockSize + x], 1e-5); - EXPECT_NEAR(mid / normalization, plane[y * kBlockSize + x], 1e-5); - } - } - aom_flat_block_finder_free(&flat_block_finder); -} - -TYPED_TEST_P(FlatBlockEstimatorTest, FindFlatBlocks) { - const int kBlockSize = 32; - aom_flat_block_finder_t flat_block_finder; - ASSERT_EQ(1, aom_flat_block_finder_init(&flat_block_finder, kBlockSize, - this->kBitDepth, this->kUseHighBD)); - - const int num_blocks_w = 8; - const int h = kBlockSize; - const int w = kBlockSize * num_blocks_w; - const int stride = w; - this->data_.resize(h * stride, 128); - std::vector<uint8_t> flat_blocks(num_blocks_w, 0); - - const int shift = this->kBitDepth - 8; - for (int y = 0; y < kBlockSize; ++y) { - for (int x = 0; x < kBlockSize; ++x) { - // Block 0 (not flat): constant doesn't have enough variance to qualify - this->data_[y * stride + x + 0 * kBlockSize] = 128 << shift; - - // Block 1 (not flat): too high of variance is hard to validate as flat - this->data_[y * stride + x + 1 * kBlockSize] = - ((uint8_t)(128 + randn(&this->random_, 5))) << shift; - - // Block 2 (flat): slight checkerboard added to constant - const int check = (x % 2 + y % 2) % 2 ? -2 : 2; - this->data_[y * stride + x + 2 * kBlockSize] = (128 + check) << shift; - - // Block 3 (flat): planar block with checkerboard pattern is also flat - this->data_[y * stride + x + 3 * kBlockSize] = - (y * 2 - x / 2 + 128 + check) << shift; - - // Block 4 (flat): gaussian random with standard deviation 1. - this->data_[y * stride + x + 4 * kBlockSize] = - ((uint8_t)(randn(&this->random_, 1) + x + 128.0)) << shift; - - // Block 5 (flat): gaussian random with standard deviation 2. - this->data_[y * stride + x + 5 * kBlockSize] = - ((uint8_t)(randn(&this->random_, 2) + y + 128.0)) << shift; - - // Block 6 (not flat): too high of directional gradient. - const int strong_edge = x > kBlockSize / 2 ? 64 : 0; - this->data_[y * stride + x + 6 * kBlockSize] = - ((uint8_t)(randn(&this->random_, 1) + strong_edge + 128.0)) << shift; - - // Block 7 (not flat): too high gradient. - const int big_check = ((x >> 2) % 2 + (y >> 2) % 2) % 2 ? -16 : 16; - this->data_[y * stride + x + 7 * kBlockSize] = - ((uint8_t)(randn(&this->random_, 1) + big_check + 128.0)) << shift; - } - } - - EXPECT_EQ(4, aom_flat_block_finder_run(&flat_block_finder, - (uint8_t *)&this->data_[0], w, h, - stride, &flat_blocks[0])); - - // First two blocks are not flat - EXPECT_EQ(0, flat_blocks[0]); - EXPECT_EQ(0, flat_blocks[1]); - - // Next 4 blocks are flat. - EXPECT_EQ(255, flat_blocks[2]); - EXPECT_EQ(255, flat_blocks[3]); - EXPECT_EQ(255, flat_blocks[4]); - EXPECT_EQ(255, flat_blocks[5]); - - // Last 2 are not flat by threshold - EXPECT_EQ(0, flat_blocks[6]); - EXPECT_EQ(0, flat_blocks[7]); - - // Add the noise from non-flat block 1 to every block. - for (int y = 0; y < kBlockSize; ++y) { - for (int x = 0; x < kBlockSize * num_blocks_w; ++x) { - this->data_[y * stride + x] += - (this->data_[y * stride + x % kBlockSize + kBlockSize] - - (128 << shift)); - } - } - // Now the scored selection will pick the one that is most likely flat (block - // 0) - EXPECT_EQ(1, aom_flat_block_finder_run(&flat_block_finder, - (uint8_t *)&this->data_[0], w, h, - stride, &flat_blocks[0])); - EXPECT_EQ(1, flat_blocks[0]); - EXPECT_EQ(0, flat_blocks[1]); - EXPECT_EQ(0, flat_blocks[2]); - EXPECT_EQ(0, flat_blocks[3]); - EXPECT_EQ(0, flat_blocks[4]); - EXPECT_EQ(0, flat_blocks[5]); - EXPECT_EQ(0, flat_blocks[6]); - EXPECT_EQ(0, flat_blocks[7]); - - aom_flat_block_finder_free(&flat_block_finder); -} - -REGISTER_TYPED_TEST_CASE_P(FlatBlockEstimatorTest, ExtractBlock, - FindFlatBlocks); - -typedef ::testing::Types<BitDepthParams<uint8_t, 8, false>, // lowbd - BitDepthParams<uint16_t, 8, true>, // lowbd in 16-bit - BitDepthParams<uint16_t, 10, true>, // highbd data - BitDepthParams<uint16_t, 12, true> > - AllBitDepthParams; -INSTANTIATE_TYPED_TEST_CASE_P(FlatBlockInstatiation, FlatBlockEstimatorTest, - AllBitDepthParams); - -template <typename T> -class NoiseModelUpdateTest : public ::testing::Test, public T { - public: - static const int kWidth = 128; - static const int kHeight = 128; - static const int kBlockSize = 16; - static const int kNumBlocksX = kWidth / kBlockSize; - static const int kNumBlocksY = kHeight / kBlockSize; - - virtual void SetUp() { - const aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 3, - T::kBitDepth, T::kUseHighBD }; - ASSERT_TRUE(aom_noise_model_init(&model_, params)); - - random_.Reset(100171); - - data_.resize(kWidth * kHeight * 3); - denoised_.resize(kWidth * kHeight * 3); - noise_.resize(kWidth * kHeight * 3); - renoise_.resize(kWidth * kHeight); - flat_blocks_.resize(kNumBlocksX * kNumBlocksY); - - for (int c = 0, offset = 0; c < 3; ++c, offset += kWidth * kHeight) { - data_ptr_[c] = &data_[offset]; - noise_ptr_[c] = &noise_[offset]; - denoised_ptr_[c] = &denoised_[offset]; - strides_[c] = kWidth; - - data_ptr_raw_[c] = (uint8_t *)&data_[offset]; - denoised_ptr_raw_[c] = (uint8_t *)&denoised_[offset]; - } - chroma_sub_[0] = 0; - chroma_sub_[1] = 0; - } - - int NoiseModelUpdate(int block_size = kBlockSize) { - return aom_noise_model_update(&model_, data_ptr_raw_, denoised_ptr_raw_, - kWidth, kHeight, strides_, chroma_sub_, - &flat_blocks_[0], block_size); - } - - void TearDown() { aom_noise_model_free(&model_); } - - protected: - aom_noise_model_t model_; - std::vector<typename T::data_type_t> data_; - std::vector<typename T::data_type_t> denoised_; - - std::vector<double> noise_; - std::vector<double> renoise_; - std::vector<uint8_t> flat_blocks_; - - typename T::data_type_t *data_ptr_[3]; - typename T::data_type_t *denoised_ptr_[3]; - - double *noise_ptr_[3]; - int strides_[3]; - int chroma_sub_[2]; - libaom_test::ACMRandom random_; - - private: - uint8_t *data_ptr_raw_[3]; - uint8_t *denoised_ptr_raw_[3]; -}; - -TYPED_TEST_CASE_P(NoiseModelUpdateTest); - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateFailsNoFlatBlocks) { - EXPECT_EQ(AOM_NOISE_STATUS_INSUFFICIENT_FLAT_BLOCKS, - this->NoiseModelUpdate()); -} - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateSuccessForZeroNoiseAllFlat) { - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - this->denoised_.assign(this->denoised_.size(), 128); - this->data_.assign(this->denoised_.size(), 128); - EXPECT_EQ(AOM_NOISE_STATUS_INTERNAL_ERROR, this->NoiseModelUpdate()); -} - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateFailsBlockSizeTooSmall) { - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - this->denoised_.assign(this->denoised_.size(), 128); - this->data_.assign(this->denoised_.size(), 128); - EXPECT_EQ(AOM_NOISE_STATUS_INVALID_ARGUMENT, - this->NoiseModelUpdate(6 /* block_size=6 is too small*/)); -} - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateSuccessForWhiteRandomNoise) { - aom_noise_model_t &model = this->model_; - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - - const int shift = this->kBitDepth - 8; - for (int y = 0; y < kHeight; ++y) { - for (int x = 0; x < kWidth; ++x) { - this->data_ptr_[0][y * kWidth + x] = - int(64 + y + randn(&this->random_, 1)) << shift; - this->denoised_ptr_[0][y * kWidth + x] = (64 + y) << shift; - // Make the chroma planes completely correlated with the Y plane - for (int c = 1; c < 3; ++c) { - this->data_ptr_[c][y * kWidth + x] = this->data_ptr_[0][y * kWidth + x]; - this->denoised_ptr_[c][y * kWidth + x] = - this->denoised_ptr_[0][y * kWidth + x]; - } - } - } - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - const double kCoeffEps = 0.075; - const int n = model.n; - for (int c = 0; c < 3; ++c) { - for (int i = 0; i < n; ++i) { - EXPECT_NEAR(0, model.latest_state[c].eqns.x[i], kCoeffEps); - EXPECT_NEAR(0, model.combined_state[c].eqns.x[i], kCoeffEps); - } - // The second and third channels are highly correlated with the first. - if (c > 0) { - ASSERT_EQ(n + 1, model.latest_state[c].eqns.n); - ASSERT_EQ(n + 1, model.combined_state[c].eqns.n); - - EXPECT_NEAR(1, model.latest_state[c].eqns.x[n], kCoeffEps); - EXPECT_NEAR(1, model.combined_state[c].eqns.x[n], kCoeffEps); - } - } - - // The fitted noise strength should be close to the standard deviation - // for all intensity bins. - const double kStdEps = 0.1; - const double normalize = 1 << shift; - - for (int i = 0; i < model.latest_state[0].strength_solver.eqns.n; ++i) { - EXPECT_NEAR(1.0, - model.latest_state[0].strength_solver.eqns.x[i] / normalize, - kStdEps); - EXPECT_NEAR(1.0, - model.combined_state[0].strength_solver.eqns.x[i] / normalize, - kStdEps); - } - - aom_noise_strength_lut_t lut; - aom_noise_strength_solver_fit_piecewise( - &model.latest_state[0].strength_solver, -1, &lut); - ASSERT_EQ(2, lut.num_points); - EXPECT_NEAR(0.0, lut.points[0][0], 1e-5); - EXPECT_NEAR(1.0, lut.points[0][1] / normalize, kStdEps); - EXPECT_NEAR((1 << this->kBitDepth) - 1, lut.points[1][0], 1e-5); - EXPECT_NEAR(1.0, lut.points[1][1] / normalize, kStdEps); - aom_noise_strength_lut_free(&lut); -} - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateSuccessForScaledWhiteNoise) { - aom_noise_model_t &model = this->model_; - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - - const double kCoeffEps = 0.055; - const double kLowStd = 1; - const double kHighStd = 4; - const int shift = this->kBitDepth - 8; - for (int y = 0; y < kHeight; ++y) { - for (int x = 0; x < kWidth; ++x) { - for (int c = 0; c < 3; ++c) { - // The image data is bimodal: - // Bottom half has low intensity and low noise strength - // Top half has high intensity and high noise strength - const int avg = (y < kHeight / 2) ? 4 : 245; - const double std = (y < kHeight / 2) ? kLowStd : kHighStd; - this->data_ptr_[c][y * kWidth + x] = - ((uint8_t)std::min((int)255, - (int)(2 + avg + randn(&this->random_, std)))) - << shift; - this->denoised_ptr_[c][y * kWidth + x] = (2 + avg) << shift; - } - } - } - // Label all blocks as flat for the update - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - const int n = model.n; - // The noise is uncorrelated spatially and with the y channel. - // All coefficients should be reasonably close to zero. - for (int c = 0; c < 3; ++c) { - for (int i = 0; i < n; ++i) { - EXPECT_NEAR(0, model.latest_state[c].eqns.x[i], kCoeffEps); - EXPECT_NEAR(0, model.combined_state[c].eqns.x[i], kCoeffEps); - } - if (c > 0) { - ASSERT_EQ(n + 1, model.latest_state[c].eqns.n); - ASSERT_EQ(n + 1, model.combined_state[c].eqns.n); - - // The correlation to the y channel should be low (near zero) - EXPECT_NEAR(0, model.latest_state[c].eqns.x[n], kCoeffEps); - EXPECT_NEAR(0, model.combined_state[c].eqns.x[n], kCoeffEps); - } - } - - // Noise strength should vary between kLowStd and kHighStd. - const double kStdEps = 0.15; - // We have to normalize fitted standard deviation based on bit depth. - const double normalize = (1 << shift); - - ASSERT_EQ(20, model.latest_state[0].strength_solver.eqns.n); - for (int i = 0; i < model.latest_state[0].strength_solver.eqns.n; ++i) { - const double a = i / 19.0; - const double expected = (kLowStd * (1.0 - a) + kHighStd * a); - EXPECT_NEAR(expected, - model.latest_state[0].strength_solver.eqns.x[i] / normalize, - kStdEps); - EXPECT_NEAR(expected, - model.combined_state[0].strength_solver.eqns.x[i] / normalize, - kStdEps); - } - - // If we fit a piecewise linear model, there should be two points: - // one near kLowStd at 0, and the other near kHighStd and 255. - aom_noise_strength_lut_t lut; - aom_noise_strength_solver_fit_piecewise( - &model.latest_state[0].strength_solver, 2, &lut); - ASSERT_EQ(2, lut.num_points); - EXPECT_NEAR(0, lut.points[0][0], 1e-4); - EXPECT_NEAR(kLowStd, lut.points[0][1] / normalize, kStdEps); - EXPECT_NEAR((1 << this->kBitDepth) - 1, lut.points[1][0], 1e-5); - EXPECT_NEAR(kHighStd, lut.points[1][1] / normalize, kStdEps); - aom_noise_strength_lut_free(&lut); -} - -TYPED_TEST_P(NoiseModelUpdateTest, UpdateSuccessForCorrelatedNoise) { - aom_noise_model_t &model = this->model_; - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - const int kNumCoeffs = 24; - const double kStd = 4; - const double kStdEps = 0.3; - const double kCoeffEps = 0.065; - // Use different coefficients for each channel - const double kCoeffs[3][24] = { - { 0.02884, -0.03356, 0.00633, 0.01757, 0.02849, -0.04620, - 0.02833, -0.07178, 0.07076, -0.11603, -0.10413, -0.16571, - 0.05158, -0.07969, 0.02640, -0.07191, 0.02530, 0.41968, - 0.21450, -0.00702, -0.01401, -0.03676, -0.08713, 0.44196 }, - { 0.00269, -0.01291, -0.01513, 0.07234, 0.03208, 0.00477, - 0.00226, -0.00254, 0.03533, 0.12841, -0.25970, -0.06336, - 0.05238, -0.00845, -0.03118, 0.09043, -0.36558, 0.48903, - 0.00595, -0.11938, 0.02106, 0.095956, -0.350139, 0.59305 }, - { -0.00643, -0.01080, -0.01466, 0.06951, 0.03707, -0.00482, - 0.00817, -0.00909, 0.02949, 0.12181, -0.25210, -0.07886, - 0.06083, -0.01210, -0.03108, 0.08944, -0.35875, 0.49150, - 0.00415, -0.12905, 0.02870, 0.09740, -0.34610, 0.58824 }, - }; - - ASSERT_EQ(model.n, kNumCoeffs); - this->chroma_sub_[0] = this->chroma_sub_[1] = 1; - - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - - // Add different noise onto each plane - const int shift = this->kBitDepth - 8; - for (int c = 0; c < 3; ++c) { - noise_synth(&this->random_, model.params.lag, model.n, model.coords, - kCoeffs[c], this->noise_ptr_[c], kWidth, kHeight); - const int x_shift = c > 0 ? this->chroma_sub_[0] : 0; - const int y_shift = c > 0 ? this->chroma_sub_[1] : 0; - for (int y = 0; y < (kHeight >> y_shift); ++y) { - for (int x = 0; x < (kWidth >> x_shift); ++x) { - const uint8_t value = 64 + x / 2 + y / 4; - this->data_ptr_[c][y * kWidth + x] = - (uint8_t(value + this->noise_ptr_[c][y * kWidth + x] * kStd)) - << shift; - this->denoised_ptr_[c][y * kWidth + x] = value << shift; - } - } - } - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - // For the Y plane, the solved coefficients should be close to the original - const int n = model.n; - for (int c = 0; c < 3; ++c) { - for (int i = 0; i < n; ++i) { - EXPECT_NEAR(kCoeffs[c][i], model.latest_state[c].eqns.x[i], kCoeffEps); - EXPECT_NEAR(kCoeffs[c][i], model.combined_state[c].eqns.x[i], kCoeffEps); - } - // The chroma planes should be uncorrelated with the luma plane - if (c > 0) { - EXPECT_NEAR(0, model.latest_state[c].eqns.x[n], kCoeffEps); - EXPECT_NEAR(0, model.combined_state[c].eqns.x[n], kCoeffEps); - } - // Correlation between the coefficient vector and the fitted coefficients - // should be close to 1. - EXPECT_LT(0.98, aom_normalized_cross_correlation( - model.latest_state[c].eqns.x, kCoeffs[c], kNumCoeffs)); - - noise_synth(&this->random_, model.params.lag, model.n, model.coords, - model.latest_state[c].eqns.x, &this->renoise_[0], kWidth, - kHeight); - - EXPECT_TRUE(aom_noise_data_validate(&this->renoise_[0], kWidth, kHeight)); - } - - // Check fitted noise strength - const double normalize = 1 << shift; - for (int c = 0; c < 3; ++c) { - for (int i = 0; i < model.latest_state[c].strength_solver.eqns.n; ++i) { - EXPECT_NEAR(kStd, - model.latest_state[c].strength_solver.eqns.x[i] / normalize, - kStdEps); - } - } -} - -TYPED_TEST_P(NoiseModelUpdateTest, - NoiseStrengthChangeSignalsDifferentNoiseType) { - aom_noise_model_t &model = this->model_; - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - const int kBlockSize = this->kBlockSize; - // Create a gradient image with std = 2 uncorrelated noise - const double kStd = 2; - const int shift = this->kBitDepth - 8; - - for (int i = 0; i < kWidth * kHeight; ++i) { - const uint8_t val = (i % kWidth) < kWidth / 2 ? 64 : 192; - for (int c = 0; c < 3; ++c) { - this->noise_ptr_[c][i] = randn(&this->random_, 1); - this->data_ptr_[c][i] = ((uint8_t)(this->noise_ptr_[c][i] * kStd + val)) - << shift; - this->denoised_ptr_[c][i] = val << shift; - } - } - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - const int kNumBlocks = kWidth * kHeight / kBlockSize / kBlockSize; - EXPECT_EQ(kNumBlocks, model.latest_state[0].strength_solver.num_equations); - EXPECT_EQ(kNumBlocks, model.latest_state[1].strength_solver.num_equations); - EXPECT_EQ(kNumBlocks, model.latest_state[2].strength_solver.num_equations); - EXPECT_EQ(kNumBlocks, model.combined_state[0].strength_solver.num_equations); - EXPECT_EQ(kNumBlocks, model.combined_state[1].strength_solver.num_equations); - EXPECT_EQ(kNumBlocks, model.combined_state[2].strength_solver.num_equations); - - // Bump up noise by an insignificant amount - for (int i = 0; i < kWidth * kHeight; ++i) { - const uint8_t val = (i % kWidth) < kWidth / 2 ? 64 : 192; - this->data_ptr_[0][i] = - ((uint8_t)(this->noise_ptr_[0][i] * (kStd + 0.085) + val)) << shift; - } - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - const double kARGainTolerance = 0.02; - for (int c = 0; c < 3; ++c) { - EXPECT_EQ(kNumBlocks, model.latest_state[c].strength_solver.num_equations); - EXPECT_EQ(15250, model.latest_state[c].num_observations); - EXPECT_NEAR(1, model.latest_state[c].ar_gain, kARGainTolerance); - - EXPECT_EQ(2 * kNumBlocks, - model.combined_state[c].strength_solver.num_equations); - EXPECT_EQ(2 * 15250, model.combined_state[c].num_observations); - EXPECT_NEAR(1, model.combined_state[c].ar_gain, kARGainTolerance); - } - - // Bump up the noise strength on half the image for one channel by a - // significant amount. - for (int i = 0; i < kWidth * kHeight; ++i) { - const uint8_t val = (i % kWidth) < kWidth / 2 ? 64 : 128; - if (i % kWidth < kWidth / 2) { - this->data_ptr_[0][i] = - ((uint8_t)(randn(&this->random_, kStd + 0.5) + val)) << shift; - } - } - EXPECT_EQ(AOM_NOISE_STATUS_DIFFERENT_NOISE_TYPE, this->NoiseModelUpdate()); - - // Since we didn't update the combined state, it should still be at 2 * - // num_blocks - EXPECT_EQ(kNumBlocks, model.latest_state[0].strength_solver.num_equations); - EXPECT_EQ(2 * kNumBlocks, - model.combined_state[0].strength_solver.num_equations); - - // In normal operation, the "latest" estimate can be saved to the "combined" - // state for continued updates. - aom_noise_model_save_latest(&model); - for (int c = 0; c < 3; ++c) { - EXPECT_EQ(kNumBlocks, model.latest_state[c].strength_solver.num_equations); - EXPECT_EQ(15250, model.latest_state[c].num_observations); - EXPECT_NEAR(1, model.latest_state[c].ar_gain, kARGainTolerance); - - EXPECT_EQ(kNumBlocks, - model.combined_state[c].strength_solver.num_equations); - EXPECT_EQ(15250, model.combined_state[c].num_observations); - EXPECT_NEAR(1, model.combined_state[c].ar_gain, kARGainTolerance); - } -} - -TYPED_TEST_P(NoiseModelUpdateTest, NoiseCoeffsSignalsDifferentNoiseType) { - aom_noise_model_t &model = this->model_; - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - const double kCoeffs[2][24] = { - { 0.02884, -0.03356, 0.00633, 0.01757, 0.02849, -0.04620, - 0.02833, -0.07178, 0.07076, -0.11603, -0.10413, -0.16571, - 0.05158, -0.07969, 0.02640, -0.07191, 0.02530, 0.41968, - 0.21450, -0.00702, -0.01401, -0.03676, -0.08713, 0.44196 }, - { 0.00269, -0.01291, -0.01513, 0.07234, 0.03208, 0.00477, - 0.00226, -0.00254, 0.03533, 0.12841, -0.25970, -0.06336, - 0.05238, -0.00845, -0.03118, 0.09043, -0.36558, 0.48903, - 0.00595, -0.11938, 0.02106, 0.095956, -0.350139, 0.59305 } - }; - - noise_synth(&this->random_, model.params.lag, model.n, model.coords, - kCoeffs[0], this->noise_ptr_[0], kWidth, kHeight); - for (int i = 0; i < kWidth * kHeight; ++i) { - this->data_ptr_[0][i] = (uint8_t)(128 + this->noise_ptr_[0][i]); - } - this->flat_blocks_.assign(this->flat_blocks_.size(), 1); - EXPECT_EQ(AOM_NOISE_STATUS_OK, this->NoiseModelUpdate()); - - // Now try with the second set of AR coefficients - noise_synth(&this->random_, model.params.lag, model.n, model.coords, - kCoeffs[1], this->noise_ptr_[0], kWidth, kHeight); - for (int i = 0; i < kWidth * kHeight; ++i) { - this->data_ptr_[0][i] = (uint8_t)(128 + this->noise_ptr_[0][i]); - } - EXPECT_EQ(AOM_NOISE_STATUS_DIFFERENT_NOISE_TYPE, this->NoiseModelUpdate()); -} -REGISTER_TYPED_TEST_CASE_P(NoiseModelUpdateTest, UpdateFailsNoFlatBlocks, - UpdateSuccessForZeroNoiseAllFlat, - UpdateFailsBlockSizeTooSmall, - UpdateSuccessForWhiteRandomNoise, - UpdateSuccessForScaledWhiteNoise, - UpdateSuccessForCorrelatedNoise, - NoiseStrengthChangeSignalsDifferentNoiseType, - NoiseCoeffsSignalsDifferentNoiseType); - -INSTANTIATE_TYPED_TEST_CASE_P(NoiseModelUpdateTestInstatiation, - NoiseModelUpdateTest, AllBitDepthParams); - -TEST(NoiseModelGetGrainParameters, TestLagSize) { - aom_film_grain_t film_grain; - for (int lag = 1; lag <= 3; ++lag) { - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, lag, 8, 0 }; - aom_noise_model_t model; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - EXPECT_TRUE(aom_noise_model_get_grain_parameters(&model, &film_grain)); - EXPECT_EQ(lag, film_grain.ar_coeff_lag); - aom_noise_model_free(&model); - } - - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, 4, 8, 0 }; - aom_noise_model_t model; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - EXPECT_FALSE(aom_noise_model_get_grain_parameters(&model, &film_grain)); - aom_noise_model_free(&model); -} - -TEST(NoiseModelGetGrainParameters, TestARCoeffShiftBounds) { - struct TestCase { - double max_input_value; - int expected_ar_coeff_shift; - int expected_value; - }; - const int lag = 1; - const int kNumTestCases = 19; - const TestCase test_cases[] = { - // Test cases for ar_coeff_shift = 9 - { 0, 9, 0 }, - { 0.125, 9, 64 }, - { -0.125, 9, -64 }, - { 0.2499, 9, 127 }, - { -0.25, 9, -128 }, - // Test cases for ar_coeff_shift = 8 - { 0.25, 8, 64 }, - { -0.2501, 8, -64 }, - { 0.499, 8, 127 }, - { -0.5, 8, -128 }, - // Test cases for ar_coeff_shift = 7 - { 0.5, 7, 64 }, - { -0.5001, 7, -64 }, - { 0.999, 7, 127 }, - { -1, 7, -128 }, - // Test cases for ar_coeff_shift = 6 - { 1.0, 6, 64 }, - { -1.0001, 6, -64 }, - { 2.0, 6, 127 }, - { -2.0, 6, -128 }, - { 4, 6, 127 }, - { -4, 6, -128 }, - }; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, lag, 8, 0 }; - aom_noise_model_t model; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - - for (int i = 0; i < kNumTestCases; ++i) { - const TestCase &test_case = test_cases[i]; - model.combined_state[0].eqns.x[0] = test_case.max_input_value; - - aom_film_grain_t film_grain; - EXPECT_TRUE(aom_noise_model_get_grain_parameters(&model, &film_grain)); - EXPECT_EQ(1, film_grain.ar_coeff_lag); - EXPECT_EQ(test_case.expected_ar_coeff_shift, film_grain.ar_coeff_shift); - EXPECT_EQ(test_case.expected_value, film_grain.ar_coeffs_y[0]); - } - aom_noise_model_free(&model); -} - -TEST(NoiseModelGetGrainParameters, TestNoiseStrengthShiftBounds) { - struct TestCase { - double max_input_value; - int expected_scaling_shift; - int expected_value; - }; - const int kNumTestCases = 10; - const TestCase test_cases[] = { - { 0, 11, 0 }, { 1, 11, 64 }, { 2, 11, 128 }, { 3.99, 11, 255 }, - { 4, 10, 128 }, { 7.99, 10, 255 }, { 8, 9, 128 }, { 16, 8, 128 }, - { 31.99, 8, 255 }, { 64, 8, 255 }, // clipped - }; - const int lag = 1; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, lag, 8, 0 }; - aom_noise_model_t model; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - - for (int i = 0; i < kNumTestCases; ++i) { - const TestCase &test_case = test_cases[i]; - aom_equation_system_t &eqns = model.combined_state[0].strength_solver.eqns; - // Set the fitted scale parameters to be a constant value. - for (int j = 0; j < eqns.n; ++j) { - eqns.x[j] = test_case.max_input_value; - } - aom_film_grain_t film_grain; - EXPECT_TRUE(aom_noise_model_get_grain_parameters(&model, &film_grain)); - // We expect a single constant segemnt - EXPECT_EQ(test_case.expected_scaling_shift, film_grain.scaling_shift); - EXPECT_EQ(test_case.expected_value, film_grain.scaling_points_y[0][1]); - EXPECT_EQ(test_case.expected_value, film_grain.scaling_points_y[1][1]); - } - aom_noise_model_free(&model); -} - -// The AR coefficients are the same inputs used to generate "Test 2" in the test -// vectors -TEST(NoiseModelGetGrainParameters, GetGrainParametersReal) { - const double kInputCoeffsY[] = { 0.0315, 0.0073, 0.0218, 0.00235, 0.00511, - -0.0222, 0.0627, -0.022, 0.05575, -0.1816, - 0.0107, -0.1966, 0.00065, -0.0809, 0.04934, - -0.1349, -0.0352, 0.41772, 0.27973, 0.04207, - -0.0429, -0.1372, 0.06193, 0.52032 }; - const double kInputCoeffsCB[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5 }; - const double kInputCoeffsCR[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5 }; - const int kExpectedARCoeffsY[] = { 4, 1, 3, 0, 1, -3, 8, -3, - 7, -23, 1, -25, 0, -10, 6, -17, - -5, 53, 36, 5, -5, -18, 8, 67 }; - const int kExpectedARCoeffsCB[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84 }; - const int kExpectedARCoeffsCR[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126 }; - // Scaling function is initialized analytically with a sqrt function. - const int kNumScalingPointsY = 12; - const int kExpectedScalingPointsY[][2] = { - { 0, 0 }, { 13, 44 }, { 27, 62 }, { 40, 76 }, - { 54, 88 }, { 67, 98 }, { 94, 117 }, { 121, 132 }, - { 148, 146 }, { 174, 159 }, { 201, 171 }, { 255, 192 }, - }; - - const int lag = 3; - aom_noise_model_params_t params = { AOM_NOISE_SHAPE_SQUARE, lag, 8, 0 }; - aom_noise_model_t model; - EXPECT_TRUE(aom_noise_model_init(&model, params)); - - // Setup the AR coeffs - memcpy(model.combined_state[0].eqns.x, kInputCoeffsY, sizeof(kInputCoeffsY)); - memcpy(model.combined_state[1].eqns.x, kInputCoeffsCB, - sizeof(kInputCoeffsCB)); - memcpy(model.combined_state[2].eqns.x, kInputCoeffsCR, - sizeof(kInputCoeffsCR)); - for (int i = 0; i < model.combined_state[0].strength_solver.num_bins; ++i) { - const double x = - ((double)i) / (model.combined_state[0].strength_solver.num_bins - 1.0); - model.combined_state[0].strength_solver.eqns.x[i] = 6 * sqrt(x); - model.combined_state[1].strength_solver.eqns.x[i] = 3; - model.combined_state[2].strength_solver.eqns.x[i] = 2; - - // Inject some observations into the strength solver, as during film grain - // parameter extraction an estimate of the average strength will be used to - // adjust correlation. - const int n = model.combined_state[0].strength_solver.num_bins; - for (int j = 0; j < model.combined_state[0].strength_solver.num_bins; ++j) { - model.combined_state[0].strength_solver.eqns.A[i * n + j] = 1; - model.combined_state[1].strength_solver.eqns.A[i * n + j] = 1; - model.combined_state[2].strength_solver.eqns.A[i * n + j] = 1; - } - } - - aom_film_grain_t film_grain; - EXPECT_TRUE(aom_noise_model_get_grain_parameters(&model, &film_grain)); - EXPECT_EQ(lag, film_grain.ar_coeff_lag); - EXPECT_EQ(3, film_grain.ar_coeff_lag); - EXPECT_EQ(7, film_grain.ar_coeff_shift); - EXPECT_EQ(10, film_grain.scaling_shift); - EXPECT_EQ(kNumScalingPointsY, film_grain.num_y_points); - EXPECT_EQ(1, film_grain.update_parameters); - EXPECT_EQ(1, film_grain.apply_grain); - - const int kNumARCoeffs = 24; - for (int i = 0; i < kNumARCoeffs; ++i) { - EXPECT_EQ(kExpectedARCoeffsY[i], film_grain.ar_coeffs_y[i]); - } - for (int i = 0; i < kNumARCoeffs + 1; ++i) { - EXPECT_EQ(kExpectedARCoeffsCB[i], film_grain.ar_coeffs_cb[i]); - } - for (int i = 0; i < kNumARCoeffs + 1; ++i) { - EXPECT_EQ(kExpectedARCoeffsCR[i], film_grain.ar_coeffs_cr[i]); - } - for (int i = 0; i < kNumScalingPointsY; ++i) { - EXPECT_EQ(kExpectedScalingPointsY[i][0], film_grain.scaling_points_y[i][0]); - EXPECT_EQ(kExpectedScalingPointsY[i][1], film_grain.scaling_points_y[i][1]); - } - - // CB strength should just be a piecewise segment - EXPECT_EQ(2, film_grain.num_cb_points); - EXPECT_EQ(0, film_grain.scaling_points_cb[0][0]); - EXPECT_EQ(255, film_grain.scaling_points_cb[1][0]); - EXPECT_EQ(96, film_grain.scaling_points_cb[0][1]); - EXPECT_EQ(96, film_grain.scaling_points_cb[1][1]); - - // CR strength should just be a piecewise segment - EXPECT_EQ(2, film_grain.num_cr_points); - EXPECT_EQ(0, film_grain.scaling_points_cr[0][0]); - EXPECT_EQ(255, film_grain.scaling_points_cr[1][0]); - EXPECT_EQ(64, film_grain.scaling_points_cr[0][1]); - EXPECT_EQ(64, film_grain.scaling_points_cr[1][1]); - - EXPECT_EQ(128, film_grain.cb_mult); - EXPECT_EQ(192, film_grain.cb_luma_mult); - EXPECT_EQ(256, film_grain.cb_offset); - EXPECT_EQ(128, film_grain.cr_mult); - EXPECT_EQ(192, film_grain.cr_luma_mult); - EXPECT_EQ(256, film_grain.cr_offset); - EXPECT_EQ(0, film_grain.chroma_scaling_from_luma); - EXPECT_EQ(0, film_grain.grain_scale_shift); - - aom_noise_model_free(&model); -} - -template <typename T> -class WienerDenoiseTest : public ::testing::Test, public T { - public: - static void SetUpTestCase() { aom_dsp_rtcd(); } - - protected: - void SetUp() { - static const float kNoiseLevel = 5.f; - static const float kStd = 4.0; - static const double kMaxValue = (1 << T::kBitDepth) - 1; - - chroma_sub_[0] = 1; - chroma_sub_[1] = 1; - stride_[0] = kWidth; - stride_[1] = kWidth / 2; - stride_[2] = kWidth / 2; - for (int k = 0; k < 3; ++k) { - data_[k].resize(kWidth * kHeight); - denoised_[k].resize(kWidth * kHeight); - noise_psd_[k].resize(kBlockSize * kBlockSize); - } - - const double kCoeffsY[] = { 0.0406, -0.116, -0.078, -0.152, 0.0033, -0.093, - 0.048, 0.404, 0.2353, -0.035, -0.093, 0.441 }; - const int kCoords[12][2] = { - { -2, -2 }, { -1, -2 }, { 0, -2 }, { 1, -2 }, { 2, -2 }, { -2, -1 }, - { -1, -1 }, { 0, -1 }, { 1, -1 }, { 2, -1 }, { -2, 0 }, { -1, 0 } - }; - const int kLag = 2; - const int kLength = 12; - libaom_test::ACMRandom random; - std::vector<double> noise(kWidth * kHeight); - noise_synth(&random, kLag, kLength, kCoords, kCoeffsY, &noise[0], kWidth, - kHeight); - noise_psd_[0] = get_noise_psd(&noise[0], kWidth, kHeight, kBlockSize); - for (int i = 0; i < kBlockSize * kBlockSize; ++i) { - noise_psd_[0][i] = (float)(noise_psd_[0][i] * kStd * kStd * kScaleNoise * - kScaleNoise / (kMaxValue * kMaxValue)); - } - - float psd_value = - aom_noise_psd_get_default_value(kBlockSizeChroma, kNoiseLevel); - for (int i = 0; i < kBlockSizeChroma * kBlockSizeChroma; ++i) { - noise_psd_[1][i] = psd_value; - noise_psd_[2][i] = psd_value; - } - for (int y = 0; y < kHeight; ++y) { - for (int x = 0; x < kWidth; ++x) { - data_[0][y * stride_[0] + x] = (typename T::data_type_t)fclamp( - (x + noise[y * stride_[0] + x] * kStd) * kScaleNoise, 0, kMaxValue); - } - } - - for (int c = 1; c < 3; ++c) { - for (int y = 0; y < (kHeight >> 1); ++y) { - for (int x = 0; x < (kWidth >> 1); ++x) { - data_[c][y * stride_[c] + x] = (typename T::data_type_t)fclamp( - (x + randn(&random, kStd)) * kScaleNoise, 0, kMaxValue); - } - } - } - for (int k = 0; k < 3; ++k) { - noise_psd_ptrs_[k] = &noise_psd_[k][0]; - } - } - static const int kBlockSize = 32; - static const int kBlockSizeChroma = 16; - static const int kWidth = 256; - static const int kHeight = 256; - static const int kScaleNoise = 1 << (T::kBitDepth - 8); - - std::vector<typename T::data_type_t> data_[3]; - std::vector<typename T::data_type_t> denoised_[3]; - std::vector<float> noise_psd_[3]; - int chroma_sub_[2]; - float *noise_psd_ptrs_[3]; - int stride_[3]; -}; - -TYPED_TEST_CASE_P(WienerDenoiseTest); - -TYPED_TEST_P(WienerDenoiseTest, InvalidBlockSize) { - const uint8_t *const data_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->data_[0][0]), - reinterpret_cast<uint8_t *>(&this->data_[1][0]), - reinterpret_cast<uint8_t *>(&this->data_[2][0]), - }; - uint8_t *denoised_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->denoised_[0][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[1][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[2][0]), - }; - EXPECT_EQ(0, aom_wiener_denoise_2d(data_ptrs, denoised_ptrs, this->kWidth, - this->kHeight, this->stride_, - this->chroma_sub_, this->noise_psd_ptrs_, - 18, this->kBitDepth, this->kUseHighBD)); - EXPECT_EQ(0, aom_wiener_denoise_2d(data_ptrs, denoised_ptrs, this->kWidth, - this->kHeight, this->stride_, - this->chroma_sub_, this->noise_psd_ptrs_, - 48, this->kBitDepth, this->kUseHighBD)); - EXPECT_EQ(0, aom_wiener_denoise_2d(data_ptrs, denoised_ptrs, this->kWidth, - this->kHeight, this->stride_, - this->chroma_sub_, this->noise_psd_ptrs_, - 64, this->kBitDepth, this->kUseHighBD)); -} - -TYPED_TEST_P(WienerDenoiseTest, InvalidChromaSubsampling) { - const uint8_t *const data_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->data_[0][0]), - reinterpret_cast<uint8_t *>(&this->data_[1][0]), - reinterpret_cast<uint8_t *>(&this->data_[2][0]), - }; - uint8_t *denoised_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->denoised_[0][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[1][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[2][0]), - }; - int chroma_sub[2] = { 1, 0 }; - EXPECT_EQ(0, aom_wiener_denoise_2d(data_ptrs, denoised_ptrs, this->kWidth, - this->kHeight, this->stride_, chroma_sub, - this->noise_psd_ptrs_, 32, this->kBitDepth, - this->kUseHighBD)); - - chroma_sub[0] = 0; - chroma_sub[1] = 1; - EXPECT_EQ(0, aom_wiener_denoise_2d(data_ptrs, denoised_ptrs, this->kWidth, - this->kHeight, this->stride_, chroma_sub, - this->noise_psd_ptrs_, 32, this->kBitDepth, - this->kUseHighBD)); -} - -TYPED_TEST_P(WienerDenoiseTest, GradientTest) { - const int kWidth = this->kWidth; - const int kHeight = this->kHeight; - const int kBlockSize = this->kBlockSize; - const uint8_t *const data_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->data_[0][0]), - reinterpret_cast<uint8_t *>(&this->data_[1][0]), - reinterpret_cast<uint8_t *>(&this->data_[2][0]), - }; - uint8_t *denoised_ptrs[3] = { - reinterpret_cast<uint8_t *>(&this->denoised_[0][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[1][0]), - reinterpret_cast<uint8_t *>(&this->denoised_[2][0]), - }; - const int ret = aom_wiener_denoise_2d( - data_ptrs, denoised_ptrs, kWidth, kHeight, this->stride_, - this->chroma_sub_, this->noise_psd_ptrs_, this->kBlockSize, - this->kBitDepth, this->kUseHighBD); - EXPECT_EQ(1, ret); - - // Check the noise on the denoised image (from the analytical gradient) - // and make sure that it is less than what we added. - for (int c = 0; c < 3; ++c) { - std::vector<double> measured_noise(kWidth * kHeight); - - double var = 0; - const int shift = (c > 0); - for (int x = 0; x < (kWidth >> shift); ++x) { - for (int y = 0; y < (kHeight >> shift); ++y) { - const double diff = this->denoised_[c][y * this->stride_[c] + x] - - x * this->kScaleNoise; - var += diff * diff; - measured_noise[y * kWidth + x] = diff; - } - } - var /= (kWidth * kHeight); - const double std = sqrt(std::max(0.0, var)); - EXPECT_LE(std, 1.25f * this->kScaleNoise); - if (c == 0) { - std::vector<float> measured_psd = - get_noise_psd(&measured_noise[0], kWidth, kHeight, kBlockSize); - std::vector<double> measured_psd_d(kBlockSize * kBlockSize); - std::vector<double> noise_psd_d(kBlockSize * kBlockSize); - std::copy(measured_psd.begin(), measured_psd.end(), - measured_psd_d.begin()); - std::copy(this->noise_psd_[0].begin(), this->noise_psd_[0].end(), - noise_psd_d.begin()); - EXPECT_LT( - aom_normalized_cross_correlation(&measured_psd_d[0], &noise_psd_d[0], - (int)(noise_psd_d.size())), - 0.35); - } - } -} - -REGISTER_TYPED_TEST_CASE_P(WienerDenoiseTest, InvalidBlockSize, - InvalidChromaSubsampling, GradientTest); - -INSTANTIATE_TYPED_TEST_CASE_P(WienerDenoiseTestInstatiation, WienerDenoiseTest, - AllBitDepthParams); diff --git a/third_party/aom/test/obmc_sad_test.cc b/third_party/aom/test/obmc_sad_test.cc deleted file mode 100644 index 6cef86961..000000000 --- a/third_party/aom/test/obmc_sad_test.cc +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/function_equivalence_test.h" -#include "test/register_state_check.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_integer.h" - -#define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE) - -using libaom_test::FunctionEquivalenceTest; - -namespace { - -static const int kIterations = 1000; -static const int kMaskMax = 64; - -typedef unsigned int (*ObmcSadF)(const uint8_t *pre, int pre_stride, - const int32_t *wsrc, const int32_t *mask); -typedef libaom_test::FuncParam<ObmcSadF> TestFuncs; - -//////////////////////////////////////////////////////////////////////////////// -// 8 bit -//////////////////////////////////////////////////////////////////////////////// - -class ObmcSadTest : public FunctionEquivalenceTest<ObmcSadF> {}; - -TEST_P(ObmcSadTest, RandomValues) { - DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - const int pre_stride = rng_(MAX_SB_SIZE + 1); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = rng_.Rand8(); - wsrc[i] = rng_.Rand8() * rng_(kMaskMax * kMaskMax + 1); - mask[i] = rng_(kMaskMax * kMaskMax + 1); - } - - const unsigned int ref_res = params_.ref_func(pre, pre_stride, wsrc, mask); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = - params_.tst_func(pre, pre_stride, wsrc, mask)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -TEST_P(ObmcSadTest, ExtremeValues) { - DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { - const int pre_stride = iter; - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = UINT8_MAX; - wsrc[i] = UINT8_MAX * kMaskMax * kMaskMax; - mask[i] = kMaskMax * kMaskMax; - } - - const unsigned int ref_res = params_.ref_func(pre, pre_stride, wsrc, mask); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = - params_.tst_func(pre, pre_stride, wsrc, mask)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -#if HAVE_SSE4_1 -const ObmcSadTest::ParamType sse4_functions[] = { - TestFuncs(aom_obmc_sad128x128_c, aom_obmc_sad128x128_sse4_1), - TestFuncs(aom_obmc_sad128x64_c, aom_obmc_sad128x64_sse4_1), - TestFuncs(aom_obmc_sad64x128_c, aom_obmc_sad64x128_sse4_1), - TestFuncs(aom_obmc_sad64x64_c, aom_obmc_sad64x64_sse4_1), - TestFuncs(aom_obmc_sad64x32_c, aom_obmc_sad64x32_sse4_1), - TestFuncs(aom_obmc_sad32x64_c, aom_obmc_sad32x64_sse4_1), - TestFuncs(aom_obmc_sad32x32_c, aom_obmc_sad32x32_sse4_1), - TestFuncs(aom_obmc_sad32x16_c, aom_obmc_sad32x16_sse4_1), - TestFuncs(aom_obmc_sad16x32_c, aom_obmc_sad16x32_sse4_1), - TestFuncs(aom_obmc_sad16x16_c, aom_obmc_sad16x16_sse4_1), - TestFuncs(aom_obmc_sad16x8_c, aom_obmc_sad16x8_sse4_1), - TestFuncs(aom_obmc_sad8x16_c, aom_obmc_sad8x16_sse4_1), - TestFuncs(aom_obmc_sad8x8_c, aom_obmc_sad8x8_sse4_1), - TestFuncs(aom_obmc_sad8x4_c, aom_obmc_sad8x4_sse4_1), - TestFuncs(aom_obmc_sad4x8_c, aom_obmc_sad4x8_sse4_1), - TestFuncs(aom_obmc_sad4x4_c, aom_obmc_sad4x4_sse4_1) -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcSadTest, - ::testing::ValuesIn(sse4_functions)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -const ObmcSadTest::ParamType avx2_functions[] = { - TestFuncs(aom_obmc_sad128x128_c, aom_obmc_sad128x128_avx2), - TestFuncs(aom_obmc_sad128x64_c, aom_obmc_sad128x64_avx2), - TestFuncs(aom_obmc_sad64x128_c, aom_obmc_sad64x128_avx2), - TestFuncs(aom_obmc_sad64x64_c, aom_obmc_sad64x64_avx2), - TestFuncs(aom_obmc_sad64x32_c, aom_obmc_sad64x32_avx2), - TestFuncs(aom_obmc_sad32x64_c, aom_obmc_sad32x64_avx2), - TestFuncs(aom_obmc_sad32x32_c, aom_obmc_sad32x32_avx2), - TestFuncs(aom_obmc_sad32x16_c, aom_obmc_sad32x16_avx2), - TestFuncs(aom_obmc_sad16x32_c, aom_obmc_sad16x32_avx2), - TestFuncs(aom_obmc_sad16x16_c, aom_obmc_sad16x16_avx2), - TestFuncs(aom_obmc_sad16x8_c, aom_obmc_sad16x8_avx2), - TestFuncs(aom_obmc_sad8x16_c, aom_obmc_sad8x16_avx2), - TestFuncs(aom_obmc_sad8x8_c, aom_obmc_sad8x8_avx2), - TestFuncs(aom_obmc_sad8x4_c, aom_obmc_sad8x4_avx2), - TestFuncs(aom_obmc_sad4x8_c, aom_obmc_sad4x8_avx2), - TestFuncs(aom_obmc_sad4x4_c, aom_obmc_sad4x4_avx2) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, ObmcSadTest, ::testing::ValuesIn(avx2_functions)); -#endif // HAVE_AVX2 - -//////////////////////////////////////////////////////////////////////////////// -// High bit-depth -//////////////////////////////////////////////////////////////////////////////// - -class ObmcSadHBDTest : public FunctionEquivalenceTest<ObmcSadF> {}; - -TEST_P(ObmcSadHBDTest, RandomValues) { - DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - const int pre_stride = rng_(MAX_SB_SIZE + 1); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = rng_(1 << 12); - wsrc[i] = rng_(1 << 12) * rng_(kMaskMax * kMaskMax + 1); - mask[i] = rng_(kMaskMax * kMaskMax + 1); - } - - const unsigned int ref_res = - params_.ref_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK( - tst_res = - params_.tst_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -TEST_P(ObmcSadHBDTest, ExtremeValues) { - DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { - const int pre_stride = iter; - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = (1 << 12) - 1; - wsrc[i] = ((1 << 12) - 1) * kMaskMax * kMaskMax; - mask[i] = kMaskMax * kMaskMax; - } - - const unsigned int ref_res = - params_.ref_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK( - tst_res = - params_.tst_func(CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -#if HAVE_SSE4_1 -ObmcSadHBDTest::ParamType sse4_functions_hbd[] = { - TestFuncs(aom_highbd_obmc_sad128x128_c, aom_highbd_obmc_sad128x128_sse4_1), - TestFuncs(aom_highbd_obmc_sad128x64_c, aom_highbd_obmc_sad128x64_sse4_1), - TestFuncs(aom_highbd_obmc_sad64x128_c, aom_highbd_obmc_sad64x128_sse4_1), - TestFuncs(aom_highbd_obmc_sad64x64_c, aom_highbd_obmc_sad64x64_sse4_1), - TestFuncs(aom_highbd_obmc_sad64x32_c, aom_highbd_obmc_sad64x32_sse4_1), - TestFuncs(aom_highbd_obmc_sad32x64_c, aom_highbd_obmc_sad32x64_sse4_1), - TestFuncs(aom_highbd_obmc_sad32x32_c, aom_highbd_obmc_sad32x32_sse4_1), - TestFuncs(aom_highbd_obmc_sad32x16_c, aom_highbd_obmc_sad32x16_sse4_1), - TestFuncs(aom_highbd_obmc_sad16x32_c, aom_highbd_obmc_sad16x32_sse4_1), - TestFuncs(aom_highbd_obmc_sad16x16_c, aom_highbd_obmc_sad16x16_sse4_1), - TestFuncs(aom_highbd_obmc_sad16x8_c, aom_highbd_obmc_sad16x8_sse4_1), - TestFuncs(aom_highbd_obmc_sad8x16_c, aom_highbd_obmc_sad8x16_sse4_1), - TestFuncs(aom_highbd_obmc_sad8x8_c, aom_highbd_obmc_sad8x8_sse4_1), - TestFuncs(aom_highbd_obmc_sad8x4_c, aom_highbd_obmc_sad8x4_sse4_1), - TestFuncs(aom_highbd_obmc_sad4x8_c, aom_highbd_obmc_sad4x8_sse4_1), - TestFuncs(aom_highbd_obmc_sad4x4_c, aom_highbd_obmc_sad4x4_sse4_1) -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcSadHBDTest, - ::testing::ValuesIn(sse4_functions_hbd)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -ObmcSadHBDTest::ParamType avx2_functions_hbd[] = { - TestFuncs(aom_highbd_obmc_sad128x128_c, aom_highbd_obmc_sad128x128_avx2), - TestFuncs(aom_highbd_obmc_sad128x64_c, aom_highbd_obmc_sad128x64_avx2), - TestFuncs(aom_highbd_obmc_sad64x128_c, aom_highbd_obmc_sad64x128_avx2), - TestFuncs(aom_highbd_obmc_sad64x64_c, aom_highbd_obmc_sad64x64_avx2), - TestFuncs(aom_highbd_obmc_sad64x32_c, aom_highbd_obmc_sad64x32_avx2), - TestFuncs(aom_highbd_obmc_sad32x64_c, aom_highbd_obmc_sad32x64_avx2), - TestFuncs(aom_highbd_obmc_sad32x32_c, aom_highbd_obmc_sad32x32_avx2), - TestFuncs(aom_highbd_obmc_sad32x16_c, aom_highbd_obmc_sad32x16_avx2), - TestFuncs(aom_highbd_obmc_sad16x32_c, aom_highbd_obmc_sad16x32_avx2), - TestFuncs(aom_highbd_obmc_sad16x16_c, aom_highbd_obmc_sad16x16_avx2), - TestFuncs(aom_highbd_obmc_sad16x8_c, aom_highbd_obmc_sad16x8_avx2), - TestFuncs(aom_highbd_obmc_sad8x16_c, aom_highbd_obmc_sad8x16_avx2), - TestFuncs(aom_highbd_obmc_sad8x8_c, aom_highbd_obmc_sad8x8_avx2), - TestFuncs(aom_highbd_obmc_sad8x4_c, aom_highbd_obmc_sad8x4_avx2), - TestFuncs(aom_highbd_obmc_sad4x8_c, aom_highbd_obmc_sad4x8_avx2), - TestFuncs(aom_highbd_obmc_sad4x4_c, aom_highbd_obmc_sad4x4_avx2) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, ObmcSadHBDTest, - ::testing::ValuesIn(avx2_functions_hbd)); -#endif // HAVE_AVX2 -} // namespace diff --git a/third_party/aom/test/obmc_variance_test.cc b/third_party/aom/test/obmc_variance_test.cc deleted file mode 100644 index 4563b964a..000000000 --- a/third_party/aom/test/obmc_variance_test.cc +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" - -#include "test/function_equivalence_test.h" -#include "test/register_state_check.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_integer.h" - -#define MAX_SB_SQUARE (MAX_SB_SIZE * MAX_SB_SIZE) - -using libaom_test::ACMRandom; -using libaom_test::FunctionEquivalenceTest; - -namespace { - -static const int kIterations = 1000; -static const int kMaskMax = 64; - -typedef unsigned int (*ObmcVarF)(const uint8_t *pre, int pre_stride, - const int32_t *wsrc, const int32_t *mask, - unsigned int *sse); -typedef libaom_test::FuncParam<ObmcVarF> TestFuncs; - -//////////////////////////////////////////////////////////////////////////////// -// 8 bit -//////////////////////////////////////////////////////////////////////////////// - -class ObmcVarianceTest : public FunctionEquivalenceTest<ObmcVarF> {}; - -TEST_P(ObmcVarianceTest, RandomValues) { - DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - const int pre_stride = this->rng_(MAX_SB_SIZE + 1); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = this->rng_.Rand8(); - wsrc[i] = this->rng_.Rand8() * this->rng_(kMaskMax * kMaskMax + 1); - mask[i] = this->rng_(kMaskMax * kMaskMax + 1); - } - - unsigned int ref_sse, tst_sse; - const unsigned int ref_res = - params_.ref_func(pre, pre_stride, wsrc, mask, &ref_sse); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK( - tst_res = params_.tst_func(pre, pre_stride, wsrc, mask, &tst_sse)); - - ASSERT_EQ(ref_res, tst_res); - ASSERT_EQ(ref_sse, tst_sse); - } -} - -TEST_P(ObmcVarianceTest, ExtremeValues) { - DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { - const int pre_stride = iter; - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = UINT8_MAX; - wsrc[i] = UINT8_MAX * kMaskMax * kMaskMax; - mask[i] = kMaskMax * kMaskMax; - } - - unsigned int ref_sse, tst_sse; - const unsigned int ref_res = - params_.ref_func(pre, pre_stride, wsrc, mask, &ref_sse); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK( - tst_res = params_.tst_func(pre, pre_stride, wsrc, mask, &tst_sse)); - - ASSERT_EQ(ref_res, tst_res); - ASSERT_EQ(ref_sse, tst_sse); - } -} - -TEST_P(ObmcVarianceTest, DISABLED_Speed) { - DECLARE_ALIGNED(32, uint8_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - const int pre_stride = this->rng_(MAX_SB_SIZE + 1); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = this->rng_.Rand8(); - wsrc[i] = this->rng_.Rand8() * this->rng_(kMaskMax * kMaskMax + 1); - mask[i] = this->rng_(kMaskMax * kMaskMax + 1); - } - - const int num_loops = 1000000; - unsigned int ref_sse, tst_sse; - aom_usec_timer ref_timer, test_timer; - - aom_usec_timer_start(&ref_timer); - for (int i = 0; i < num_loops; ++i) { - params_.ref_func(pre, pre_stride, wsrc, mask, &ref_sse); - } - aom_usec_timer_mark(&ref_timer); - const int elapsed_time_c = - static_cast<int>(aom_usec_timer_elapsed(&ref_timer)); - - aom_usec_timer_start(&test_timer); - for (int i = 0; i < num_loops; ++i) { - params_.tst_func(pre, pre_stride, wsrc, mask, &tst_sse); - } - aom_usec_timer_mark(&test_timer); - const int elapsed_time_simd = - static_cast<int>(aom_usec_timer_elapsed(&test_timer)); - - printf("c_time=%d \t simd_time=%d \t gain=%d \n", elapsed_time_c, - elapsed_time_simd, (elapsed_time_c / elapsed_time_simd)); -} - -#if HAVE_SSE4_1 -const ObmcVarianceTest::ParamType sse4_functions[] = { - TestFuncs(aom_obmc_variance128x128_c, aom_obmc_variance128x128_sse4_1), - TestFuncs(aom_obmc_variance128x64_c, aom_obmc_variance128x64_sse4_1), - TestFuncs(aom_obmc_variance64x128_c, aom_obmc_variance64x128_sse4_1), - TestFuncs(aom_obmc_variance64x64_c, aom_obmc_variance64x64_sse4_1), - TestFuncs(aom_obmc_variance64x32_c, aom_obmc_variance64x32_sse4_1), - TestFuncs(aom_obmc_variance32x64_c, aom_obmc_variance32x64_sse4_1), - TestFuncs(aom_obmc_variance32x32_c, aom_obmc_variance32x32_sse4_1), - TestFuncs(aom_obmc_variance32x16_c, aom_obmc_variance32x16_sse4_1), - TestFuncs(aom_obmc_variance16x32_c, aom_obmc_variance16x32_sse4_1), - TestFuncs(aom_obmc_variance16x16_c, aom_obmc_variance16x16_sse4_1), - TestFuncs(aom_obmc_variance16x8_c, aom_obmc_variance16x8_sse4_1), - TestFuncs(aom_obmc_variance8x16_c, aom_obmc_variance8x16_sse4_1), - TestFuncs(aom_obmc_variance8x8_c, aom_obmc_variance8x8_sse4_1), - TestFuncs(aom_obmc_variance8x4_c, aom_obmc_variance8x4_sse4_1), - TestFuncs(aom_obmc_variance4x8_c, aom_obmc_variance4x8_sse4_1), - TestFuncs(aom_obmc_variance4x4_c, aom_obmc_variance4x4_sse4_1) -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcVarianceTest, - ::testing::ValuesIn(sse4_functions)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -const ObmcVarianceTest::ParamType avx2_functions[] = { - TestFuncs(aom_obmc_variance128x128_c, aom_obmc_variance128x128_avx2), - TestFuncs(aom_obmc_variance128x64_c, aom_obmc_variance128x64_avx2), - TestFuncs(aom_obmc_variance64x128_c, aom_obmc_variance64x128_avx2), - TestFuncs(aom_obmc_variance64x64_c, aom_obmc_variance64x64_avx2), - TestFuncs(aom_obmc_variance64x32_c, aom_obmc_variance64x32_avx2), - TestFuncs(aom_obmc_variance32x64_c, aom_obmc_variance32x64_avx2), - TestFuncs(aom_obmc_variance32x32_c, aom_obmc_variance32x32_avx2), - TestFuncs(aom_obmc_variance32x16_c, aom_obmc_variance32x16_avx2), - TestFuncs(aom_obmc_variance16x32_c, aom_obmc_variance16x32_avx2), - TestFuncs(aom_obmc_variance16x16_c, aom_obmc_variance16x16_avx2), - TestFuncs(aom_obmc_variance16x8_c, aom_obmc_variance16x8_avx2), - TestFuncs(aom_obmc_variance8x16_c, aom_obmc_variance8x16_avx2), - TestFuncs(aom_obmc_variance8x8_c, aom_obmc_variance8x8_avx2), - TestFuncs(aom_obmc_variance8x4_c, aom_obmc_variance8x4_avx2), - TestFuncs(aom_obmc_variance4x8_c, aom_obmc_variance4x8_sse4_1), - TestFuncs(aom_obmc_variance4x4_c, aom_obmc_variance4x4_sse4_1) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, ObmcVarianceTest, - ::testing::ValuesIn(avx2_functions)); -#endif // HAVE_AVX2 - -//////////////////////////////////////////////////////////////////////////////// -// High bit-depth -//////////////////////////////////////////////////////////////////////////////// - -class ObmcVarianceHBDTest : public FunctionEquivalenceTest<ObmcVarF> {}; - -TEST_P(ObmcVarianceHBDTest, RandomValues) { - DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - const int pre_stride = this->rng_(MAX_SB_SIZE + 1); - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = this->rng_(1 << params_.bit_depth); - wsrc[i] = this->rng_(1 << params_.bit_depth) * - this->rng_(kMaskMax * kMaskMax + 1); - mask[i] = this->rng_(kMaskMax * kMaskMax + 1); - } - - unsigned int ref_sse, tst_sse; - const unsigned int ref_res = params_.ref_func( - CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask, &ref_sse); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(CONVERT_TO_BYTEPTR(pre), - pre_stride, wsrc, mask, - &tst_sse)); - - ASSERT_EQ(ref_res, tst_res); - ASSERT_EQ(ref_sse, tst_sse); - } -} - -TEST_P(ObmcVarianceHBDTest, ExtremeValues) { - DECLARE_ALIGNED(32, uint16_t, pre[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, wsrc[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, int32_t, mask[MAX_SB_SQUARE]); - - for (int iter = 0; iter < MAX_SB_SIZE && !HasFatalFailure(); ++iter) { - const int pre_stride = iter; - - for (int i = 0; i < MAX_SB_SQUARE; ++i) { - pre[i] = (1 << params_.bit_depth) - 1; - wsrc[i] = ((1 << params_.bit_depth) - 1) * kMaskMax * kMaskMax; - mask[i] = kMaskMax * kMaskMax; - } - - unsigned int ref_sse, tst_sse; - const unsigned int ref_res = params_.ref_func( - CONVERT_TO_BYTEPTR(pre), pre_stride, wsrc, mask, &ref_sse); - unsigned int tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(CONVERT_TO_BYTEPTR(pre), - pre_stride, wsrc, mask, - &tst_sse)); - - ASSERT_EQ(ref_res, tst_res); - ASSERT_EQ(ref_sse, tst_sse); - } -} - -#if HAVE_SSE4_1 -ObmcVarianceHBDTest::ParamType sse4_functions_hbd[] = { - TestFuncs(aom_highbd_obmc_variance128x128_c, - aom_highbd_obmc_variance128x128_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance128x64_c, - aom_highbd_obmc_variance128x64_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance64x128_c, - aom_highbd_obmc_variance64x128_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance64x64_c, - aom_highbd_obmc_variance64x64_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance64x32_c, - aom_highbd_obmc_variance64x32_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance32x64_c, - aom_highbd_obmc_variance32x64_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance32x32_c, - aom_highbd_obmc_variance32x32_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance32x16_c, - aom_highbd_obmc_variance32x16_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance16x32_c, - aom_highbd_obmc_variance16x32_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance16x16_c, - aom_highbd_obmc_variance16x16_sse4_1, 8), - TestFuncs(aom_highbd_obmc_variance16x8_c, aom_highbd_obmc_variance16x8_sse4_1, - 8), - TestFuncs(aom_highbd_obmc_variance8x16_c, aom_highbd_obmc_variance8x16_sse4_1, - 8), - TestFuncs(aom_highbd_obmc_variance8x8_c, aom_highbd_obmc_variance8x8_sse4_1, - 8), - TestFuncs(aom_highbd_obmc_variance8x4_c, aom_highbd_obmc_variance8x4_sse4_1, - 8), - TestFuncs(aom_highbd_obmc_variance4x8_c, aom_highbd_obmc_variance4x8_sse4_1, - 8), - TestFuncs(aom_highbd_obmc_variance4x4_c, aom_highbd_obmc_variance4x4_sse4_1, - 8), - TestFuncs(aom_highbd_10_obmc_variance128x128_c, - aom_highbd_10_obmc_variance128x128_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance128x64_c, - aom_highbd_10_obmc_variance128x64_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance64x128_c, - aom_highbd_10_obmc_variance64x128_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance64x64_c, - aom_highbd_10_obmc_variance64x64_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance64x32_c, - aom_highbd_10_obmc_variance64x32_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance32x64_c, - aom_highbd_10_obmc_variance32x64_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance32x32_c, - aom_highbd_10_obmc_variance32x32_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance32x16_c, - aom_highbd_10_obmc_variance32x16_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance16x32_c, - aom_highbd_10_obmc_variance16x32_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance16x16_c, - aom_highbd_10_obmc_variance16x16_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance16x8_c, - aom_highbd_10_obmc_variance16x8_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance8x16_c, - aom_highbd_10_obmc_variance8x16_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance8x8_c, - aom_highbd_10_obmc_variance8x8_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance8x4_c, - aom_highbd_10_obmc_variance8x4_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance4x8_c, - aom_highbd_10_obmc_variance4x8_sse4_1, 10), - TestFuncs(aom_highbd_10_obmc_variance4x4_c, - aom_highbd_10_obmc_variance4x4_sse4_1, 10), - TestFuncs(aom_highbd_12_obmc_variance128x128_c, - aom_highbd_12_obmc_variance128x128_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance128x64_c, - aom_highbd_12_obmc_variance128x64_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance64x128_c, - aom_highbd_12_obmc_variance64x128_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance64x64_c, - aom_highbd_12_obmc_variance64x64_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance64x32_c, - aom_highbd_12_obmc_variance64x32_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance32x64_c, - aom_highbd_12_obmc_variance32x64_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance32x32_c, - aom_highbd_12_obmc_variance32x32_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance32x16_c, - aom_highbd_12_obmc_variance32x16_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance16x32_c, - aom_highbd_12_obmc_variance16x32_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance16x16_c, - aom_highbd_12_obmc_variance16x16_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance16x8_c, - aom_highbd_12_obmc_variance16x8_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance8x16_c, - aom_highbd_12_obmc_variance8x16_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance8x8_c, - aom_highbd_12_obmc_variance8x8_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance8x4_c, - aom_highbd_12_obmc_variance8x4_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance4x8_c, - aom_highbd_12_obmc_variance4x8_sse4_1, 12), - TestFuncs(aom_highbd_12_obmc_variance4x4_c, - aom_highbd_12_obmc_variance4x4_sse4_1, 12) -}; - -INSTANTIATE_TEST_CASE_P(SSE4_1, ObmcVarianceHBDTest, - ::testing::ValuesIn(sse4_functions_hbd)); -#endif // HAVE_SSE4_1 -} // namespace diff --git a/third_party/aom/test/onyxc_int_test.cc b/third_party/aom/test/onyxc_int_test.cc deleted file mode 100644 index 388959518..000000000 --- a/third_party/aom/test/onyxc_int_test.cc +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "av1/common/onyxc_int.h" - -TEST(OnyxcInt, TestGetTxSize) { - for (int t = TX_4X4; t < TX_SIZES_ALL; t++) { - TX_SIZE t2 = get_tx_size(tx_size_wide[t], tx_size_high[t]); - GTEST_ASSERT_EQ(tx_size_wide[t], tx_size_wide[t2]); - GTEST_ASSERT_EQ(tx_size_high[t], tx_size_high[t2]); - } -} diff --git a/third_party/aom/test/pickrst_test.cc b/third_party/aom/test/pickrst_test.cc deleted file mode 100644 index 040e8e8b7..000000000 --- a/third_party/aom/test/pickrst_test.cc +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/function_equivalence_test.h" -#include "test/register_state_check.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_integer.h" -#include "av1/encoder/pickrst.h" -using libaom_test::FunctionEquivalenceTest; - -#define MAX_DATA_BLOCK 384 - -namespace { -static const int kIterations = 100; - -typedef int64_t (*lowbd_pixel_proj_error_func)( - const uint8_t *src8, int width, int height, int src_stride, - const uint8_t *dat8, int dat_stride, int32_t *flt0, int flt0_stride, - int32_t *flt1, int flt1_stride, int xq[2], const sgr_params_type *params); - -typedef libaom_test::FuncParam<lowbd_pixel_proj_error_func> TestFuncs; - -//////////////////////////////////////////////////////////////////////////////// -// 8 bit -//////////////////////////////////////////////////////////////////////////////// - -typedef ::testing::tuple<const lowbd_pixel_proj_error_func> - PixelProjErrorTestParam; - -class PixelProjErrorTest - : public ::testing::TestWithParam<PixelProjErrorTestParam> { - public: - virtual void SetUp() { - target_func_ = GET_PARAM(0); - src_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * - sizeof(uint8_t))); - dgd_ = (uint8_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * - sizeof(uint8_t))); - flt0_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * - sizeof(int32_t))); - flt1_ = (int32_t *)(aom_malloc(MAX_DATA_BLOCK * MAX_DATA_BLOCK * - sizeof(int32_t))); - } - virtual void TearDown() { - aom_free(src_); - aom_free(dgd_); - aom_free(flt0_); - aom_free(flt1_); - } - void runPixelProjErrorTest(int32_t run_times); - void runPixelProjErrorTest_ExtremeValues(); - - private: - lowbd_pixel_proj_error_func target_func_; - ACMRandom rng_; - uint8_t *src_; - uint8_t *dgd_; - int32_t *flt0_; - int32_t *flt1_; -}; - -void PixelProjErrorTest::runPixelProjErrorTest(int32_t run_times) { - int h_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1; - int v_end = run_times != 1 ? 128 : (rng_.Rand16() % MAX_DATA_BLOCK) + 1; - const int dgd_stride = MAX_DATA_BLOCK; - const int src_stride = MAX_DATA_BLOCK; - const int flt0_stride = MAX_DATA_BLOCK; - const int flt1_stride = MAX_DATA_BLOCK; - sgr_params_type params; - int xq[2]; - const int iters = run_times == 1 ? kIterations : 4; - for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) { - int64_t err_ref = 0, err_test = 1; - for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) { - dgd_[i] = rng_.Rand8(); - src_[i] = rng_.Rand8(); - flt0_[i] = rng_.Rand15Signed(); - flt1_[i] = rng_.Rand15Signed(); - } - xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS); - xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS); - params.r[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2); - params.r[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2); - params.s[0] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter % 2); - params.s[1] = run_times == 1 ? (rng_.Rand8() % MAX_RADIUS) : (iter / 2); - uint8_t *dgd = dgd_; - uint8_t *src = src_; - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - err_ref = av1_lowbd_pixel_proj_error_c(src, h_end, v_end, src_stride, dgd, - dgd_stride, flt0_, flt0_stride, - flt1_, flt1_stride, xq, ¶ms); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - err_test = - target_func_(src, h_end, v_end, src_stride, dgd, dgd_stride, flt0_, - flt0_stride, flt1_, flt1_stride, xq, ¶ms); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 10) { - printf("r0 %d r1 %d %3dx%-3d:%7.2f/%7.2fns (%3.2f)\n", params.r[0], - params.r[1], h_end, v_end, time1, time2, time1 / time2); - } - ASSERT_EQ(err_ref, err_test); - } -} - -void PixelProjErrorTest::runPixelProjErrorTest_ExtremeValues() { - const int h_start = 0; - int h_end = 192; - const int v_start = 0; - int v_end = 192; - const int dgd_stride = MAX_DATA_BLOCK; - const int src_stride = MAX_DATA_BLOCK; - const int flt0_stride = MAX_DATA_BLOCK; - const int flt1_stride = MAX_DATA_BLOCK; - sgr_params_type params; - int xq[2]; - const int iters = kIterations; - for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) { - int64_t err_ref = 0, err_test = 1; - for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) { - dgd_[i] = 0; - src_[i] = 255; - flt0_[i] = rng_.Rand15Signed(); - flt1_[i] = rng_.Rand15Signed(); - } - xq[0] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS); - xq[1] = rng_.Rand8() % (1 << SGRPROJ_PRJ_BITS); - params.r[0] = rng_.Rand8() % MAX_RADIUS; - params.r[1] = rng_.Rand8() % MAX_RADIUS; - params.s[0] = rng_.Rand8() % MAX_RADIUS; - params.s[1] = rng_.Rand8() % MAX_RADIUS; - uint8_t *dgd = dgd_; - uint8_t *src = src_; - - err_ref = av1_lowbd_pixel_proj_error_c( - src, h_end - h_start, v_end - v_start, src_stride, dgd, dgd_stride, - flt0_, flt0_stride, flt1_, flt1_stride, xq, ¶ms); - - err_test = target_func_(src, h_end - h_start, v_end - v_start, src_stride, - dgd, dgd_stride, flt0_, flt0_stride, flt1_, - flt1_stride, xq, ¶ms); - - ASSERT_EQ(err_ref, err_test); - } -} - -TEST_P(PixelProjErrorTest, RandomValues) { runPixelProjErrorTest(1); } - -TEST_P(PixelProjErrorTest, ExtremeValues) { - runPixelProjErrorTest_ExtremeValues(); -} - -TEST_P(PixelProjErrorTest, DISABLED_Speed) { runPixelProjErrorTest(200000); } - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, PixelProjErrorTest, - ::testing::Values(av1_lowbd_pixel_proj_error_sse4_1)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 - -INSTANTIATE_TEST_CASE_P(AVX2, PixelProjErrorTest, - ::testing::Values(av1_lowbd_pixel_proj_error_avx2)); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/qm_test.cc b/third_party/aom/test/qm_test.cc deleted file mode 100644 index c87506b41..000000000 --- a/third_party/aom/test/qm_test.cc +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include "config/aom_config.h" - -#include "third_party/googletest/src/googletest/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 QMTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - QMTest() : EncoderTest(GET_PARAM(0)) {} - virtual ~QMTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - set_cpu_used_ = GET_PARAM(2); - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - encoder->Control(AV1E_SET_ENABLE_QM, 1); - encoder->Control(AV1E_SET_QM_MIN, qm_min_); - encoder->Control(AV1E_SET_QM_MAX, qm_max_); - - encoder->Control(AOME_SET_MAX_INTRA_BITRATE_PCT, 100); - } - } - - void DoTest(int qm_min, int qm_max) { - qm_min_ = qm_min; - qm_max_ = qm_max; - cfg_.kf_max_dist = 12; - cfg_.rc_min_quantizer = 8; - cfg_.rc_max_quantizer = 56; - cfg_.rc_end_usage = AOM_CBR; - cfg_.g_lag_in_frames = 6; - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 500; - cfg_.rc_buf_sz = 1000; - cfg_.rc_target_bitrate = 300; - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, - 288, 30, 1, 0, 15); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } - - int set_cpu_used_; - int qm_min_; - int qm_max_; -}; - -// encodes and decodes without a mismatch. -TEST_P(QMTest, TestNoMisMatchQM1) { DoTest(5, 9); } - -// encodes and decodes without a mismatch. -TEST_P(QMTest, TestNoMisMatchQM2) { DoTest(0, 8); } - -// encodes and decodes without a mismatch. -TEST_P(QMTest, TestNoMisMatchQM3) { DoTest(9, 15); } - -AV1_INSTANTIATE_TEST_CASE(QMTest, - ::testing::Values(::libaom_test::kRealTime, - ::libaom_test::kOnePassGood), - ::testing::Range(5, 9)); -} // namespace diff --git a/third_party/aom/test/quantize_func_test.cc b/third_party/aom/test/quantize_func_test.cc deleted file mode 100644 index 554d0c721..000000000 --- a/third_party/aom/test/quantize_func_test.cc +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" -#include "config/av1_rtcd.h" - -#include "aom/aom_codec.h" -#include "aom_ports/aom_timer.h" -#include "av1/encoder/encoder.h" -#include "av1/common/scan.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -namespace { -using libaom_test::ACMRandom; - -#define QUAN_PARAM_LIST \ - const tran_low_t *coeff_ptr, intptr_t n_coeffs, const int16_t *zbin_ptr, \ - const int16_t *round_ptr, const int16_t *quant_ptr, \ - const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, \ - tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, \ - const int16_t *scan, const int16_t *iscan - -typedef void (*QuantizeFunc)(QUAN_PARAM_LIST); -typedef void (*QuantizeFuncHbd)(QUAN_PARAM_LIST, int log_scale); - -#define HBD_QUAN_FUNC \ - fn(coeff_ptr, n_coeffs, zbin_ptr, round_ptr, quant_ptr, quant_shift_ptr, \ - qcoeff_ptr, dqcoeff_ptr, dequant_ptr, eob_ptr, scan, iscan, log_scale) - -#define LBD_QUAN_FUNC \ - fn(coeff_ptr, n_coeffs, zbin_ptr, round_ptr, quant_ptr, quant_shift_ptr, \ - qcoeff_ptr, dqcoeff_ptr, dequant_ptr, eob_ptr, scan, iscan) - -template <QuantizeFuncHbd fn> -void highbd_quan16x16_wrapper(QUAN_PARAM_LIST) { - const int log_scale = 0; - HBD_QUAN_FUNC; -} - -template <QuantizeFuncHbd fn> -void highbd_quan32x32_wrapper(QUAN_PARAM_LIST) { - const int log_scale = 1; - HBD_QUAN_FUNC; -} - -template <QuantizeFuncHbd fn> -void highbd_quan64x64_wrapper(QUAN_PARAM_LIST) { - const int log_scale = 2; - HBD_QUAN_FUNC; -} - -typedef enum { TYPE_B, TYPE_DC, TYPE_FP } QuantType; - -using ::testing::tuple; -typedef tuple<QuantizeFunc, QuantizeFunc, TX_SIZE, QuantType, aom_bit_depth_t> - QuantizeParam; - -typedef struct { - QUANTS quant; - Dequants dequant; -} QuanTable; - -const int kTestNum = 1000; - -class QuantizeTest : public ::testing::TestWithParam<QuantizeParam> { - protected: - QuantizeTest() - : quant_ref_(GET_PARAM(0)), quant_(GET_PARAM(1)), tx_size_(GET_PARAM(2)), - type_(GET_PARAM(3)), bd_(GET_PARAM(4)) {} - - virtual ~QuantizeTest() {} - - virtual void SetUp() { - qtab_ = reinterpret_cast<QuanTable *>(aom_memalign(32, sizeof(*qtab_))); - const int n_coeffs = coeff_num(); - coeff_ = reinterpret_cast<tran_low_t *>( - aom_memalign(32, 6 * n_coeffs * sizeof(tran_low_t))); - InitQuantizer(); - } - - virtual void TearDown() { - aom_free(qtab_); - qtab_ = NULL; - aom_free(coeff_); - coeff_ = NULL; - libaom_test::ClearSystemState(); - } - - void InitQuantizer() { - av1_build_quantizer(bd_, 0, 0, 0, 0, 0, &qtab_->quant, &qtab_->dequant); - } - - void QuantizeRun(bool is_loop, int q = 0, int test_num = 1) { - tran_low_t *coeff_ptr = coeff_; - const intptr_t n_coeffs = coeff_num(); - - tran_low_t *qcoeff_ref = coeff_ptr + n_coeffs; - tran_low_t *dqcoeff_ref = qcoeff_ref + n_coeffs; - - tran_low_t *qcoeff = dqcoeff_ref + n_coeffs; - tran_low_t *dqcoeff = qcoeff + n_coeffs; - uint16_t *eob = (uint16_t *)(dqcoeff + n_coeffs); - - // Testing uses 2-D DCT scan order table - const SCAN_ORDER *const sc = get_default_scan(tx_size_, DCT_DCT); - - // Testing uses luminance quantization table - const int16_t *zbin = qtab_->quant.y_zbin[q]; - - const int16_t *round = 0; - const int16_t *quant = 0; - if (type_ == TYPE_B) { - round = qtab_->quant.y_round[q]; - quant = qtab_->quant.y_quant[q]; - } else if (type_ == TYPE_FP) { - round = qtab_->quant.y_round_fp[q]; - quant = qtab_->quant.y_quant_fp[q]; - } - - const int16_t *quant_shift = qtab_->quant.y_quant_shift[q]; - const int16_t *dequant = qtab_->dequant.y_dequant_QTX[q]; - - for (int i = 0; i < test_num; ++i) { - if (is_loop) FillCoeffRandom(); - - memset(qcoeff_ref, 0, 5 * n_coeffs * sizeof(*qcoeff_ref)); - - quant_ref_(coeff_ptr, n_coeffs, zbin, round, quant, quant_shift, - qcoeff_ref, dqcoeff_ref, dequant, &eob[0], sc->scan, - sc->iscan); - - ASM_REGISTER_STATE_CHECK(quant_(coeff_ptr, n_coeffs, zbin, round, quant, - quant_shift, qcoeff, dqcoeff, dequant, - &eob[1], sc->scan, sc->iscan)); - - for (int j = 0; j < n_coeffs; ++j) { - ASSERT_EQ(qcoeff_ref[j], qcoeff[j]) - << "Q mismatch on test: " << i << " at position: " << j - << " Q: " << q << " coeff: " << coeff_ptr[j]; - } - - for (int j = 0; j < n_coeffs; ++j) { - ASSERT_EQ(dqcoeff_ref[j], dqcoeff[j]) - << "Dq mismatch on test: " << i << " at position: " << j - << " Q: " << q << " coeff: " << coeff_ptr[j]; - } - - ASSERT_EQ(eob[0], eob[1]) - << "eobs mismatch on test: " << i << " Q: " << q; - } - } - - void CompareResults(const tran_low_t *buf_ref, const tran_low_t *buf, - int size, const char *text, int q, int number) { - int i; - for (i = 0; i < size; ++i) { - ASSERT_EQ(buf_ref[i], buf[i]) << text << " mismatch on test: " << number - << " at position: " << i << " Q: " << q; - } - } - - int coeff_num() const { return av1_get_max_eob(tx_size_); } - - void FillCoeff(tran_low_t c) { - const int n_coeffs = coeff_num(); - for (int i = 0; i < n_coeffs; ++i) { - coeff_[i] = c; - } - } - - void FillCoeffRandom() { - const int n_coeffs = coeff_num(); - FillCoeffZero(); - int num = rnd_.Rand16() % n_coeffs; - for (int i = 0; i < num; ++i) { - coeff_[i] = GetRandomCoeff(); - } - } - - void FillCoeffZero() { FillCoeff(0); } - - void FillCoeffConstant() { - tran_low_t c = GetRandomCoeff(); - FillCoeff(c); - } - - void FillDcOnly() { - FillCoeffZero(); - coeff_[0] = GetRandomCoeff(); - } - - void FillDcLargeNegative() { - FillCoeffZero(); - // Generate a qcoeff which contains 512/-512 (0x0100/0xFE00) to catch issues - // like BUG=883 where the constant being compared was incorrectly - // initialized. - coeff_[0] = -8191; - } - - tran_low_t GetRandomCoeff() { - tran_low_t coeff; - if (bd_ == AOM_BITS_8) { - coeff = - clamp(static_cast<int16_t>(rnd_.Rand16()), INT16_MIN + 1, INT16_MAX); - } else { - tran_low_t min = -(1 << (7 + bd_)); - tran_low_t max = -min - 1; - coeff = clamp(static_cast<tran_low_t>(rnd_.Rand31()), min, max); - } - return coeff; - } - - ACMRandom rnd_; - QuanTable *qtab_; - tran_low_t *coeff_; - QuantizeFunc quant_ref_; - QuantizeFunc quant_; - TX_SIZE tx_size_; - QuantType type_; - aom_bit_depth_t bd_; -}; - -TEST_P(QuantizeTest, ZeroInput) { - FillCoeffZero(); - QuantizeRun(false); -} - -TEST_P(QuantizeTest, LargeNegativeInput) { - FillDcLargeNegative(); - QuantizeRun(false, 0, 1); -} - -TEST_P(QuantizeTest, DcOnlyInput) { - FillDcOnly(); - QuantizeRun(false, 0, 1); -} - -TEST_P(QuantizeTest, RandomInput) { QuantizeRun(true, 0, kTestNum); } - -TEST_P(QuantizeTest, MultipleQ) { - for (int q = 0; q < QINDEX_RANGE; ++q) { - QuantizeRun(true, q, kTestNum); - } -} - -// Force the coeff to be half the value of the dequant. This exposes a -// mismatch found in av1_quantize_fp_sse2(). -TEST_P(QuantizeTest, CoeffHalfDequant) { - FillCoeff(16); - QuantizeRun(false, 25, 1); -} - -TEST_P(QuantizeTest, DISABLED_Speed) { - tran_low_t *coeff_ptr = coeff_; - const intptr_t n_coeffs = coeff_num(); - - tran_low_t *qcoeff_ref = coeff_ptr + n_coeffs; - tran_low_t *dqcoeff_ref = qcoeff_ref + n_coeffs; - - tran_low_t *qcoeff = dqcoeff_ref + n_coeffs; - tran_low_t *dqcoeff = qcoeff + n_coeffs; - uint16_t *eob = (uint16_t *)(dqcoeff + n_coeffs); - - // Testing uses 2-D DCT scan order table - const SCAN_ORDER *const sc = get_default_scan(tx_size_, DCT_DCT); - - // Testing uses luminance quantization table - const int q = 22; - const int16_t *zbin = qtab_->quant.y_zbin[q]; - const int16_t *round_fp = qtab_->quant.y_round_fp[q]; - const int16_t *quant_fp = qtab_->quant.y_quant_fp[q]; - const int16_t *quant_shift = qtab_->quant.y_quant_shift[q]; - const int16_t *dequant = qtab_->dequant.y_dequant_QTX[q]; - const int kNumTests = 5000000; - aom_usec_timer timer; - - FillCoeffRandom(); - - aom_usec_timer_start(&timer); - for (int n = 0; n < kNumTests; ++n) { - quant_(coeff_ptr, n_coeffs, zbin, round_fp, quant_fp, quant_shift, qcoeff, - dqcoeff, dequant, eob, sc->scan, sc->iscan); - } - aom_usec_timer_mark(&timer); - - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("Elapsed time: %d us\n", elapsed_time); -} - -using ::testing::make_tuple; - -#if HAVE_AVX2 -const QuantizeParam kQParamArrayAvx2[] = { - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_avx2, TX_16X16, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_avx2, TX_4X16, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_avx2, TX_16X4, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_avx2, TX_32X8, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_avx2, TX_8X32, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_32x32_c, &av1_quantize_fp_32x32_avx2, TX_32X32, - TYPE_FP, AOM_BITS_8), - make_tuple(&av1_quantize_fp_32x32_c, &av1_quantize_fp_32x32_avx2, TX_16X64, - TYPE_FP, AOM_BITS_8), - make_tuple(&av1_quantize_fp_32x32_c, &av1_quantize_fp_32x32_avx2, TX_64X16, - TYPE_FP, AOM_BITS_8), - make_tuple(&av1_quantize_fp_64x64_c, &av1_quantize_fp_64x64_avx2, TX_64X64, - TYPE_FP, AOM_BITS_8), - make_tuple(&highbd_quan16x16_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan16x16_wrapper<av1_highbd_quantize_fp_avx2>, TX_16X16, - TYPE_FP, AOM_BITS_8), - make_tuple(&highbd_quan16x16_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan16x16_wrapper<av1_highbd_quantize_fp_avx2>, TX_16X16, - TYPE_FP, AOM_BITS_10), - make_tuple(&highbd_quan16x16_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan16x16_wrapper<av1_highbd_quantize_fp_avx2>, TX_16X16, - TYPE_FP, AOM_BITS_12), - make_tuple(&highbd_quan32x32_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan32x32_wrapper<av1_highbd_quantize_fp_avx2>, TX_32X32, - TYPE_FP, AOM_BITS_8), - make_tuple(&highbd_quan32x32_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan32x32_wrapper<av1_highbd_quantize_fp_avx2>, TX_32X32, - TYPE_FP, AOM_BITS_10), - make_tuple(&highbd_quan32x32_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan32x32_wrapper<av1_highbd_quantize_fp_avx2>, TX_32X32, - TYPE_FP, AOM_BITS_12), - make_tuple(&highbd_quan64x64_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan64x64_wrapper<av1_highbd_quantize_fp_avx2>, TX_64X64, - TYPE_FP, AOM_BITS_8), - make_tuple(&highbd_quan64x64_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan64x64_wrapper<av1_highbd_quantize_fp_avx2>, TX_64X64, - TYPE_FP, AOM_BITS_10), - make_tuple(&highbd_quan64x64_wrapper<av1_highbd_quantize_fp_c>, - &highbd_quan64x64_wrapper<av1_highbd_quantize_fp_avx2>, TX_64X64, - TYPE_FP, AOM_BITS_12), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_avx2, TX_16X16, - TYPE_B, AOM_BITS_8), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_avx2, TX_16X16, - TYPE_B, AOM_BITS_10), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_avx2, TX_16X16, - TYPE_B, AOM_BITS_12), -}; - -INSTANTIATE_TEST_CASE_P(AVX2, QuantizeTest, - ::testing::ValuesIn(kQParamArrayAvx2)); -#endif // HAVE_AVX2 - -#if HAVE_SSE2 -const QuantizeParam kQParamArraySSE2[] = { - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_16X16, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_4X16, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_16X4, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_8X32, TYPE_FP, - AOM_BITS_8), - make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_32X8, TYPE_FP, - AOM_BITS_8), - make_tuple(&aom_quantize_b_c, &aom_quantize_b_sse2, TX_16X16, TYPE_B, - AOM_BITS_8), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_sse2, TX_16X16, - TYPE_B, AOM_BITS_8), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_sse2, TX_16X16, - TYPE_B, AOM_BITS_10), - make_tuple(&aom_highbd_quantize_b_c, &aom_highbd_quantize_b_sse2, TX_16X16, - TYPE_B, AOM_BITS_12), - make_tuple(&aom_highbd_quantize_b_32x32_c, &aom_highbd_quantize_b_32x32_sse2, - TX_32X32, TYPE_B, AOM_BITS_8), - make_tuple(&aom_highbd_quantize_b_32x32_c, &aom_highbd_quantize_b_32x32_sse2, - TX_32X32, TYPE_B, AOM_BITS_10), - make_tuple(&aom_highbd_quantize_b_32x32_c, &aom_highbd_quantize_b_32x32_sse2, - TX_32X32, TYPE_B, AOM_BITS_12), -}; - -INSTANTIATE_TEST_CASE_P(SSE2, QuantizeTest, - ::testing::ValuesIn(kQParamArraySSE2)); -#endif - -#if HAVE_SSSE3 && ARCH_X86_64 -INSTANTIATE_TEST_CASE_P( - SSSE3, QuantizeTest, - ::testing::Values(make_tuple(&aom_quantize_b_c, &aom_quantize_b_ssse3, - TX_16X16, TYPE_B, AOM_BITS_8))); - -// Like libvpx, the ssse3 and avx quantize tests do not pass. -// https://bugs.chromium.org/p/webm/issues/detail?id=1448 -INSTANTIATE_TEST_CASE_P( - DISABLED_SSSE3_32x32, QuantizeTest, - ::testing::Values(make_tuple(&aom_quantize_b_32x32_c, - &aom_quantize_b_32x32_ssse3, TX_16X16, TYPE_B, - AOM_BITS_8))); - -#endif // HAVE_SSSE3 && ARCH_X86_64 - -#if HAVE_AVX && ARCH_X86_64 -INSTANTIATE_TEST_CASE_P( - AVX, QuantizeTest, - ::testing::Values( - make_tuple(&aom_quantize_b_c, &aom_quantize_b_avx, TX_16X16, TYPE_B, - AOM_BITS_8), - // Although these tests will not pass against _c, test them against each - // other so there is some minor checking. - make_tuple(&aom_quantize_b_32x32_ssse3, &aom_quantize_b_32x32_avx, - TX_32X32, TYPE_B, AOM_BITS_8))); - -#endif // HAVE_AVX && ARCH_X86_64 -} // namespace diff --git a/third_party/aom/test/reconinter_test.cc b/third_party/aom/test/reconinter_test.cc deleted file mode 100644 index a8536e517..000000000 --- a/third_party/aom/test/reconinter_test.cc +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2017, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <stdint.h> -#include <stdio.h> -#include <string.h> - -#include "config/aom_config.h" -#include "config/av1_rtcd.h" - -#include "aom_ports/mem.h" -#include "av1/common/scan.h" -#include "av1/common/txb_common.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { -using libaom_test::ACMRandom; - -typedef void (*buildcompdiffwtdmaskd_func)(uint8_t *mask, - DIFFWTD_MASK_TYPE mask_type, - const uint8_t *src0, int src0_stride, - const uint8_t *src1, int src1_stride, - int h, int w); - -typedef ::testing::tuple<BLOCK_SIZE, buildcompdiffwtdmaskd_func> - BuildCompDiffwtdMaskDParam; - -#if HAVE_SSE4_1 -::testing::internal::ParamGenerator<BuildCompDiffwtdMaskDParam> BuildParams( - buildcompdiffwtdmaskd_func filter) { - return ::testing::Combine(::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL), - ::testing::Values(filter)); -} -#endif - -class BuildCompDiffwtdMaskTest - : public ::testing::TestWithParam<BuildCompDiffwtdMaskDParam> { - public: - virtual ~BuildCompDiffwtdMaskTest() {} - - virtual void TearDown() { libaom_test::ClearSystemState(); } - void RunTest(buildcompdiffwtdmaskd_func test_impl, const int is_speed, - const DIFFWTD_MASK_TYPE type); - - private: - ACMRandom rnd_; -}; - -typedef void (*buildcompdiffwtdmaskd16_func)( - uint8_t *mask, DIFFWTD_MASK_TYPE mask_type, const CONV_BUF_TYPE *src0, - int src0_stride, const CONV_BUF_TYPE *src1, int src1_stride, int h, int w, - ConvolveParams *conv_params, int bd); - -typedef ::testing::tuple<int, buildcompdiffwtdmaskd16_func, BLOCK_SIZE> - BuildCompDiffwtdMaskD16Param; - -#if HAVE_SSE4_1 || HAVE_NEON -::testing::internal::ParamGenerator<BuildCompDiffwtdMaskD16Param> BuildParams( - buildcompdiffwtdmaskd16_func filter) { - return ::testing::Combine(::testing::Range(8, 13, 2), - ::testing::Values(filter), - ::testing::Range(BLOCK_4X4, BLOCK_SIZES_ALL)); -} -#endif -class BuildCompDiffwtdMaskD16Test - : public ::testing::TestWithParam<BuildCompDiffwtdMaskD16Param> { - public: - ~BuildCompDiffwtdMaskD16Test() {} - virtual void TearDown() { libaom_test::ClearSystemState(); } - void SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - - protected: - void RunCheckOutput(buildcompdiffwtdmaskd16_func test_impl); - void RunSpeedTest(buildcompdiffwtdmaskd16_func test_impl, - DIFFWTD_MASK_TYPE mask_type); - libaom_test::ACMRandom rnd_; -}; // class BuildCompDiffwtdMaskD16Test - -void BuildCompDiffwtdMaskD16Test::RunCheckOutput( - buildcompdiffwtdmaskd16_func test_impl) { - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - const int width = block_size_wide[block_idx]; - const int height = block_size_high[block_idx]; - DECLARE_ALIGNED(16, uint8_t, mask_ref[2 * MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, mask_test[2 * MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, src0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, src1[MAX_SB_SQUARE]); - - ConvolveParams conv_params = get_conv_params_no_round(0, 0, NULL, 0, 1, bd); - - int in_precision = - bd + 2 * FILTER_BITS - conv_params.round_0 - conv_params.round_1 + 2; - - for (int i = 0; i < MAX_SB_SQUARE; i++) { - src0[i] = rnd_.Rand16() & ((1 << in_precision) - 1); - src1[i] = rnd_.Rand16() & ((1 << in_precision) - 1); - } - - for (int mask_type = 0; mask_type < DIFFWTD_MASK_TYPES; mask_type++) { - av1_build_compound_diffwtd_mask_d16_c( - mask_ref, (DIFFWTD_MASK_TYPE)mask_type, src0, width, src1, width, - height, width, &conv_params, bd); - - test_impl(mask_test, (DIFFWTD_MASK_TYPE)mask_type, src0, width, src1, width, - height, width, &conv_params, bd); - - for (int r = 0; r < height; ++r) { - for (int c = 0; c < width; ++c) { - ASSERT_EQ(mask_ref[c + r * width], mask_test[c + r * width]) - << "Mismatch at unit tests for BuildCompDiffwtdMaskD16Test\n" - << " Pixel mismatch at index " - << "[" << r << "," << c << "] " - << " @ " << width << "x" << height << " inv " << mask_type; - } - } - } -} - -void BuildCompDiffwtdMaskD16Test::RunSpeedTest( - buildcompdiffwtdmaskd16_func test_impl, DIFFWTD_MASK_TYPE mask_type) { - const int block_idx = GET_PARAM(2); - const int bd = GET_PARAM(0); - const int width = block_size_wide[block_idx]; - const int height = block_size_high[block_idx]; - DECLARE_ALIGNED(16, uint8_t, mask[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, src0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(32, uint16_t, src1[MAX_SB_SQUARE]); - - ConvolveParams conv_params = get_conv_params_no_round(0, 0, NULL, 0, 1, bd); - - int in_precision = - bd + 2 * FILTER_BITS - conv_params.round_0 - conv_params.round_1 + 2; - - for (int i = 0; i < MAX_SB_SQUARE; i++) { - src0[i] = rnd_.Rand16() & ((1 << in_precision) - 1); - src1[i] = rnd_.Rand16() & ((1 << in_precision) - 1); - } - - const int num_loops = 10000000 / (width + height); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - av1_build_compound_diffwtd_mask_d16_c(mask, mask_type, src0, width, src1, - width, height, width, &conv_params, - bd); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - - for (int i = 0; i < num_loops; ++i) - test_impl(mask, mask_type, src0, width, src1, width, height, width, - &conv_params, bd); - - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("av1_build_compound_diffwtd_mask_d16 %3dx%-3d: %7.2f \n", width, - height, elapsed_time / double(elapsed_time1)); -} -#if HAVE_SSE4_1 -void BuildCompDiffwtdMaskTest::RunTest(buildcompdiffwtdmaskd_func test_impl, - const int is_speed, - const DIFFWTD_MASK_TYPE type) { - const int sb_type = GET_PARAM(0); - const int width = block_size_wide[sb_type]; - const int height = block_size_high[sb_type]; - DECLARE_ALIGNED(16, uint8_t, mask_ref[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, mask_test[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, src0[MAX_SB_SQUARE]); - DECLARE_ALIGNED(16, uint8_t, src1[MAX_SB_SQUARE]); - ACMRandom rnd(ACMRandom::DeterministicSeed()); - for (int i = 0; i < width * height; i++) { - src0[i] = rnd.Rand8(); - src1[i] = rnd.Rand8(); - } - const int run_times = is_speed ? (10000000 / (width + height)) : 1; - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - av1_build_compound_diffwtd_mask_c(mask_ref, type, src0, width, src1, width, - height, width); - } - const double t1 = get_time_mark(&timer); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - test_impl(mask_test, type, src0, width, src1, width, height, width); - } - const double t2 = get_time_mark(&timer); - if (is_speed) { - printf("mask %d %3dx%-3d:%7.2f/%7.2fns", type, width, height, t1, t2); - printf("(%3.2f)\n", t1 / t2); - } - for (int r = 0; r < height; ++r) { - for (int c = 0; c < width; ++c) { - ASSERT_EQ(mask_ref[c + r * width], mask_test[c + r * width]) - << "[" << r << "," << c << "] " << run_times << " @ " << width << "x" - << height << " inv " << type; - } - } -} - -TEST_P(BuildCompDiffwtdMaskTest, match) { - RunTest(GET_PARAM(1), 0, DIFFWTD_38); - RunTest(GET_PARAM(1), 0, DIFFWTD_38_INV); -} -TEST_P(BuildCompDiffwtdMaskTest, DISABLED_Speed) { - RunTest(GET_PARAM(1), 1, DIFFWTD_38); - RunTest(GET_PARAM(1), 1, DIFFWTD_38_INV); -} -#endif -TEST_P(BuildCompDiffwtdMaskD16Test, CheckOutput) { - RunCheckOutput(GET_PARAM(1)); -} - -TEST_P(BuildCompDiffwtdMaskD16Test, DISABLED_Speed) { - RunSpeedTest(GET_PARAM(1), DIFFWTD_38); - RunSpeedTest(GET_PARAM(1), DIFFWTD_38_INV); -} - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, BuildCompDiffwtdMaskTest, - BuildParams(av1_build_compound_diffwtd_mask_sse4_1)); - -INSTANTIATE_TEST_CASE_P( - SSE4_1, BuildCompDiffwtdMaskD16Test, - BuildParams(av1_build_compound_diffwtd_mask_d16_sse4_1)); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, BuildCompDiffwtdMaskTest, - BuildParams(av1_build_compound_diffwtd_mask_avx2)); - -INSTANTIATE_TEST_CASE_P(AVX2, BuildCompDiffwtdMaskD16Test, - BuildParams(av1_build_compound_diffwtd_mask_d16_avx2)); -#endif - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, BuildCompDiffwtdMaskD16Test, - BuildParams(av1_build_compound_diffwtd_mask_d16_neon)); -#endif - -} // namespace diff --git a/third_party/aom/test/register_state_check.h b/third_party/aom/test/register_state_check.h deleted file mode 100644 index d404621dd..000000000 --- a/third_party/aom/test/register_state_check.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_REGISTER_STATE_CHECK_H_ -#define AOM_TEST_REGISTER_STATE_CHECK_H_ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#include "aom/aom_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) && ARCH_X86_64 - -#undef NOMINMAX -#define NOMINMAX -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <winnt.h> - -inline bool operator==(const M128A &lhs, const M128A &rhs) { - return (lhs.Low == rhs.Low && lhs.High == rhs.High); -} - -namespace libaom_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. -class RegisterStateCheck { - public: - RegisterStateCheck() { initialized_ = StoreRegisters(&pre_context_); } - ~RegisterStateCheck() { Check(); } - - private: - static bool StoreRegisters(CONTEXT *const context) { - const HANDLE this_thread = GetCurrentThread(); - EXPECT_TRUE(this_thread != NULL); - context->ContextFlags = CONTEXT_FLOATING_POINT; - const bool context_saved = GetThreadContext(this_thread, context) == TRUE; - EXPECT_TRUE(context_saved) << "GetLastError: " << GetLastError(); - return context_saved; - } - - // Compares the register state. Returns true if the states match. - void Check() const { - ASSERT_TRUE(initialized_); - CONTEXT post_context; - ASSERT_TRUE(StoreRegisters(&post_context)); - - const M128A *xmm_pre = &pre_context_.Xmm6; - const M128A *xmm_post = &post_context.Xmm6; - for (int i = 6; i <= 15; ++i) { - EXPECT_EQ(*xmm_pre, *xmm_post) << "xmm" << i << " has been modified!"; - ++xmm_pre; - ++xmm_post; - } - } - - bool initialized_; - CONTEXT pre_context_; -}; - -#define ASM_REGISTER_STATE_CHECK(statement) \ - do { \ - libaom_test::RegisterStateCheck reg_check; \ - statement; \ - } while (false) - -} // namespace libaom_test - -#else - -namespace libaom_test { - -class RegisterStateCheck {}; -#define ASM_REGISTER_STATE_CHECK(statement) statement - -} // namespace libaom_test - -#endif // _WIN64 && ARCH_X86_64 - -#if ARCH_X86 || ARCH_X86_64 -#if defined(__GNUC__) - -namespace libaom_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() { Check(); } - - private: - // Checks the FPU tag word pre/post execution, returning false if not cleared - // to 0xffff. - void 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"; - } - - uint16_t pre_fpu_env_[14]; -}; - -#define API_REGISTER_STATE_CHECK(statement) \ - do { \ - libaom_test::RegisterStateCheckMMX reg_check; \ - ASM_REGISTER_STATE_CHECK(statement); \ - } while (false) - -} // namespace libaom_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 // AOM_TEST_REGISTER_STATE_CHECK_H_ diff --git a/third_party/aom/test/resize_test.cc b/third_party/aom/test/resize_test.cc deleted file mode 100644 index b270b8362..000000000 --- a/third_party/aom/test/resize_test.cc +++ /dev/null @@ -1,642 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <climits> -#include <vector> -#include "aom_dsp/aom_dsp_common.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/codec_factory.h" -#include "test/encode_test_driver.h" -#include "test/i420_video_source.h" -#include "test/video_source.h" -#include "test/util.h" - -// Enable(1) or Disable(0) writing of the compressed bitstream. -#define WRITE_COMPRESSED_STREAM 0 - -namespace { - -#if WRITE_COMPRESSED_STREAM -static void mem_put_le16(char *const mem, unsigned int val) { - mem[0] = val; - mem[1] = val >> 8; -} - -static void mem_put_le32(char *const mem, unsigned int val) { - mem[0] = val; - mem[1] = val >> 8; - mem[2] = val >> 16; - mem[3] = val >> 24; -} - -static void write_ivf_file_header(const aom_codec_enc_cfg_t *const cfg, - int frame_cnt, FILE *const outfile) { - char header[32]; - - header[0] = 'D'; - header[1] = 'K'; - header[2] = 'I'; - header[3] = 'F'; - mem_put_le16(header + 4, 0); /* version */ - mem_put_le16(header + 6, 32); /* headersize */ - mem_put_le32(header + 8, 0x30395056); /* fourcc (av1) */ - mem_put_le16(header + 12, cfg->g_w); /* width */ - mem_put_le16(header + 14, cfg->g_h); /* height */ - mem_put_le32(header + 16, cfg->g_timebase.den); /* rate */ - mem_put_le32(header + 20, cfg->g_timebase.num); /* scale */ - mem_put_le32(header + 24, frame_cnt); /* length */ - mem_put_le32(header + 28, 0); /* unused */ - - (void)fwrite(header, 1, 32, outfile); -} - -static void write_ivf_frame_size(FILE *const outfile, const size_t size) { - char header[4]; - mem_put_le32(header, static_cast<unsigned int>(size)); - (void)fwrite(header, 1, 4, outfile); -} - -static void write_ivf_frame_header(const aom_codec_cx_pkt_t *const pkt, - FILE *const outfile) { - char header[12]; - aom_codec_pts_t pts; - - if (pkt->kind != AOM_CODEC_CX_FRAME_PKT) return; - - pts = pkt->data.frame.pts; - mem_put_le32(header, static_cast<unsigned int>(pkt->data.frame.sz)); - mem_put_le32(header + 4, pts & 0xFFFFFFFF); - mem_put_le32(header + 8, pts >> 32); - - (void)fwrite(header, 1, 12, outfile); -} -#endif // WRITE_COMPRESSED_STREAM - -const unsigned int kInitialWidth = 320; -const unsigned int kInitialHeight = 240; - -struct FrameInfo { - FrameInfo(aom_codec_pts_t _pts, unsigned int _w, unsigned int _h) - : pts(_pts), w(_w), h(_h) {} - - aom_codec_pts_t pts; - unsigned int w; - unsigned int h; -}; - -void ScaleForFrameNumber(unsigned int frame, unsigned int initial_w, - unsigned int initial_h, unsigned int *w, - unsigned int *h, int flag_codec) { - if (frame < 10) { - *w = initial_w; - *h = initial_h; - return; - } - if (frame < 20) { - *w = initial_w * 3 / 4; - *h = initial_h * 3 / 4; - return; - } - if (frame < 30) { - *w = initial_w / 2; - *h = initial_h / 2; - return; - } - if (frame < 40) { - *w = initial_w; - *h = initial_h; - return; - } - if (frame < 50) { - *w = initial_w * 3 / 4; - *h = initial_h * 3 / 4; - return; - } - if (frame < 60) { - *w = initial_w / 2; - *h = initial_h / 2; - return; - } - if (frame < 70) { - *w = initial_w; - *h = initial_h; - return; - } - if (frame < 80) { - *w = initial_w * 3 / 4; - *h = initial_h * 3 / 4; - return; - } - if (frame < 90) { - *w = initial_w / 2; - *h = initial_h / 2; - return; - } - if (frame < 100) { - *w = initial_w * 3 / 4; - *h = initial_h * 3 / 4; - return; - } - if (frame < 110) { - *w = initial_w; - *h = initial_h; - return; - } - // Go down very low - if (frame < 120) { - *w = initial_w / 4; - *h = initial_h / 4; - return; - } - if (flag_codec == 1) { - // Cases that only works for AV1. - // For AV1: Swap width and height of original. - if (frame < 140) { - *w = initial_h; - *h = initial_w; - return; - } - } - *w = initial_w; - *h = initial_h; -} - -class ResizingVideoSource : public ::libaom_test::DummyVideoSource { - public: - ResizingVideoSource() { - SetSize(kInitialWidth, kInitialHeight); - limit_ = 150; - } - int flag_codec_; - virtual ~ResizingVideoSource() {} - - protected: - virtual void Next() { - ++frame_; - unsigned int width; - unsigned int height; - ScaleForFrameNumber(frame_, kInitialWidth, kInitialHeight, &width, &height, - flag_codec_); - SetSize(width, height); - FillFrame(); - } -}; - -class ResizeTest - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - ResizeTest() : EncoderTest(GET_PARAM(0)) {} - - virtual ~ResizeTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h)); - } - - std::vector<FrameInfo> frame_info_list_; -}; - -TEST_P(ResizeTest, TestExternalResizeWorks) { - ResizingVideoSource video; - video.flag_codec_ = 0; - cfg_.g_lag_in_frames = 0; - // We use max(kInitialWidth, kInitialHeight) because during the test - // the width and height of the frame are swapped - cfg_.g_forced_max_frame_width = cfg_.g_forced_max_frame_height = - AOMMAX(kInitialWidth, kInitialHeight); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - // Check we decoded the same number of frames as we attempted to encode - ASSERT_EQ(frame_info_list_.size(), video.limit()); - - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - const unsigned int frame = static_cast<unsigned>(info->pts); - unsigned int expected_w; - unsigned int expected_h; - ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w, - &expected_h, 0); - EXPECT_EQ(expected_w, info->w) - << "Frame " << frame << " had unexpected width"; - EXPECT_EQ(expected_h, info->h) - << "Frame " << frame << " had unexpected height"; - } -} - -const unsigned int kStepDownFrame = 3; -const unsigned int kStepUpFrame = 6; - -class ResizeInternalTestLarge : public ResizeTest { - protected: -#if WRITE_COMPRESSED_STREAM - ResizeInternalTestLarge() - : ResizeTest(), frame0_psnr_(0.0), outfile_(NULL), out_frames_(0) {} -#else - ResizeInternalTestLarge() : ResizeTest(), frame0_psnr_(0.0) {} -#endif - - virtual ~ResizeInternalTestLarge() {} - - virtual void BeginPassHook(unsigned int /*pass*/) { -#if WRITE_COMPRESSED_STREAM - outfile_ = fopen("av10-2-05-resize.ivf", "wb"); -#endif - } - - virtual void EndPassHook() { -#if WRITE_COMPRESSED_STREAM - if (outfile_) { - if (!fseek(outfile_, 0, SEEK_SET)) - write_ivf_file_header(&cfg_, out_frames_, outfile_); - fclose(outfile_); - outfile_ = NULL; - } -#endif - } - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (change_config_) { - int new_q = 60; - if (video->frame() == 0) { - struct aom_scaling_mode mode = { AOME_ONETWO, AOME_ONETWO }; - encoder->Control(AOME_SET_SCALEMODE, &mode); - } - if (video->frame() == 1) { - struct aom_scaling_mode mode = { AOME_NORMAL, AOME_NORMAL }; - encoder->Control(AOME_SET_SCALEMODE, &mode); - cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = new_q; - encoder->Config(&cfg_); - } - } else { - if (video->frame() >= kStepDownFrame && video->frame() < kStepUpFrame) { - struct aom_scaling_mode mode = { AOME_FOURFIVE, AOME_THREEFIVE }; - encoder->Control(AOME_SET_SCALEMODE, &mode); - } - if (video->frame() >= kStepUpFrame) { - struct aom_scaling_mode mode = { AOME_NORMAL, AOME_NORMAL }; - encoder->Control(AOME_SET_SCALEMODE, &mode); - } - } - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (frame0_psnr_ == 0.) frame0_psnr_ = pkt->data.psnr.psnr[0]; - EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 2.5); - } - -#if WRITE_COMPRESSED_STREAM - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - ++out_frames_; - - // Write initial file header if first frame. - if (pkt->data.frame.pts == 0) write_ivf_file_header(&cfg_, 0, outfile_); - - // Write frame header and data. - write_ivf_frame_header(pkt, outfile_); - (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_); - } -#endif - - double frame0_psnr_; - bool change_config_; -#if WRITE_COMPRESSED_STREAM - FILE *outfile_; - unsigned int out_frames_; -#endif -}; - -TEST_P(ResizeInternalTestLarge, TestInternalResizeWorks) { - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 10); - init_flags_ = AOM_CODEC_USE_PSNR; - change_config_ = false; - - // q picked such that initial keyframe on this clip is ~30dB PSNR - cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48; - - // If the number of frames being encoded is smaller than g_lag_in_frames - // the encoded frame is unavailable using the current API. Comparing - // frames to detect mismatch would then not be possible. Set - // g_lag_in_frames = 0 to get around this. - cfg_.g_lag_in_frames = 0; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - } - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - const aom_codec_pts_t pts = info->pts; - if (pts >= kStepDownFrame && pts < kStepUpFrame) { - ASSERT_EQ(282U, info->w) << "Frame " << pts << " had unexpected width"; - ASSERT_EQ(173U, info->h) << "Frame " << pts << " had unexpected height"; - } else { - EXPECT_EQ(352U, info->w) << "Frame " << pts << " had unexpected width"; - EXPECT_EQ(288U, info->h) << "Frame " << pts << " had unexpected height"; - } - } -} - -TEST_P(ResizeInternalTestLarge, TestInternalResizeChangeConfig) { - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 10); - cfg_.g_w = 352; - cfg_.g_h = 288; - change_config_ = true; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); -} - -class ResizeRealtimeTest - : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, - public ::libaom_test::EncoderTest { - protected: - ResizeRealtimeTest() : EncoderTest(GET_PARAM(0)) {} - virtual ~ResizeRealtimeTest() {} - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - encoder->Control(AV1E_SET_AQ_MODE, 3); - encoder->Control(AOME_SET_CPUUSED, set_cpu_used_); - } - - if (change_bitrate_ && video->frame() == 120) { - change_bitrate_ = false; - cfg_.rc_target_bitrate = 500; - encoder->Config(&cfg_); - } - } - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - set_cpu_used_ = GET_PARAM(2); - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - aom_codec_pts_t pts) { - frame_info_list_.push_back(FrameInfo(pts, img.d_w, img.d_h)); - } - - virtual void MismatchHook(const aom_image_t *img1, const aom_image_t *img2) { - double mismatch_psnr = compute_psnr(img1, img2); - mismatch_psnr_ += mismatch_psnr; - ++mismatch_nframes_; - } - - unsigned int GetMismatchFrames() { return mismatch_nframes_; } - - void DefaultConfig() { - cfg_.rc_buf_initial_sz = 500; - cfg_.rc_buf_optimal_sz = 600; - cfg_.rc_buf_sz = 1000; - cfg_.rc_min_quantizer = 2; - cfg_.rc_max_quantizer = 56; - cfg_.rc_undershoot_pct = 50; - cfg_.rc_overshoot_pct = 50; - cfg_.rc_end_usage = AOM_CBR; - cfg_.kf_mode = AOM_KF_AUTO; - cfg_.g_lag_in_frames = 0; - cfg_.kf_min_dist = cfg_.kf_max_dist = 3000; - // Enable dropped frames. - cfg_.rc_dropframe_thresh = 1; - // Disable error_resilience mode. - cfg_.g_error_resilient = 0; - // Run at low bitrate. - cfg_.rc_target_bitrate = 200; - // We use max(kInitialWidth, kInitialHeight) because during the test - // the width and height of the frame are swapped - cfg_.g_forced_max_frame_width = cfg_.g_forced_max_frame_height = - AOMMAX(kInitialWidth, kInitialHeight); - } - - std::vector<FrameInfo> frame_info_list_; - int set_cpu_used_; - bool change_bitrate_; - double mismatch_psnr_; - int mismatch_nframes_; -}; - -TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) { - ResizingVideoSource video; - video.flag_codec_ = 1; - DefaultConfig(); - change_bitrate_ = false; - mismatch_psnr_ = 0.0; - mismatch_nframes_ = 0; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - // Check we decoded the same number of frames as we attempted to encode - ASSERT_EQ(frame_info_list_.size(), video.limit()); - - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - const unsigned int frame = static_cast<unsigned>(info->pts); - unsigned int expected_w; - unsigned int expected_h; - ScaleForFrameNumber(frame, kInitialWidth, kInitialHeight, &expected_w, - &expected_h, 1); - EXPECT_EQ(expected_w, info->w) - << "Frame " << frame << " had unexpected width"; - EXPECT_EQ(expected_h, info->h) - << "Frame " << frame << " had unexpected height"; - EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames()); - } -} - -// Verify the dynamic resizer behavior for real time, 1 pass CBR mode. -// Run at low bitrate, with resize_allowed = 1, and verify that we get -// one resize down event. -TEST_P(ResizeRealtimeTest, DISABLED_TestInternalResizeDown) { - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 299); - DefaultConfig(); - cfg_.g_w = 352; - cfg_.g_h = 288; - change_bitrate_ = false; - mismatch_psnr_ = 0.0; - mismatch_nframes_ = 0; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - unsigned int last_w = cfg_.g_w; - unsigned int last_h = cfg_.g_h; - int resize_count = 0; - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - if (info->w != last_w || info->h != last_h) { - // Verify that resize down occurs. - ASSERT_LT(info->w, last_w); - ASSERT_LT(info->h, last_h); - last_w = info->w; - last_h = info->h; - resize_count++; - } - } - -#if CONFIG_AV1_DECODER - // Verify that we get 1 resize down event in this test. - ASSERT_EQ(1, resize_count) << "Resizing should occur."; - EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames()); -#else - printf("Warning: AV1 decoder unavailable, unable to check resize count!\n"); -#endif -} - -// Verify the dynamic resizer behavior for real time, 1 pass CBR mode. -// Start at low target bitrate, raise the bitrate in the middle of the clip, -// scaling-up should occur after bitrate changed. -TEST_P(ResizeRealtimeTest, DISABLED_TestInternalResizeDownUpChangeBitRate) { - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 359); - DefaultConfig(); - cfg_.g_w = 352; - cfg_.g_h = 288; - change_bitrate_ = true; - mismatch_psnr_ = 0.0; - mismatch_nframes_ = 0; - // Disable dropped frames. - cfg_.rc_dropframe_thresh = 0; - // Starting bitrate low. - cfg_.rc_target_bitrate = 80; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - unsigned int last_w = cfg_.g_w; - unsigned int last_h = cfg_.g_h; - int resize_count = 0; - for (std::vector<FrameInfo>::const_iterator info = frame_info_list_.begin(); - info != frame_info_list_.end(); ++info) { - if (info->w != last_w || info->h != last_h) { - resize_count++; - if (resize_count == 1) { - // Verify that resize down occurs. - ASSERT_LT(info->w, last_w); - ASSERT_LT(info->h, last_h); - } else if (resize_count == 2) { - // Verify that resize up occurs. - ASSERT_GT(info->w, last_w); - ASSERT_GT(info->h, last_h); - } - last_w = info->w; - last_h = info->h; - } - } - -#if CONFIG_AV1_DECODER - // Verify that we get 2 resize events in this test. - ASSERT_EQ(resize_count, 2) << "Resizing should occur twice."; - EXPECT_EQ(static_cast<unsigned int>(0), GetMismatchFrames()); -#else - printf("Warning: AV1 decoder unavailable, unable to check resize count!\n"); -#endif -} - -class ResizeCspTest : public ResizeTest { - protected: -#if WRITE_COMPRESSED_STREAM - ResizeCspTest() - : ResizeTest(), frame0_psnr_(0.0), outfile_(NULL), out_frames_(0) {} -#else - ResizeCspTest() : ResizeTest(), frame0_psnr_(0.0) {} -#endif - - virtual ~ResizeCspTest() {} - - virtual void BeginPassHook(unsigned int /*pass*/) { -#if WRITE_COMPRESSED_STREAM - outfile_ = fopen("av11-2-05-cspchape.ivf", "wb"); -#endif - } - - virtual void EndPassHook() { -#if WRITE_COMPRESSED_STREAM - if (outfile_) { - if (!fseek(outfile_, 0, SEEK_SET)) - write_ivf_file_header(&cfg_, out_frames_, outfile_); - fclose(outfile_); - outfile_ = NULL; - } -#endif - } - - virtual void PSNRPktHook(const aom_codec_cx_pkt_t *pkt) { - if (frame0_psnr_ == 0.) frame0_psnr_ = pkt->data.psnr.psnr[0]; - EXPECT_NEAR(pkt->data.psnr.psnr[0], frame0_psnr_, 2.0); - } - -#if WRITE_COMPRESSED_STREAM - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - ++out_frames_; - - // Write initial file header if first frame. - if (pkt->data.frame.pts == 0) write_ivf_file_header(&cfg_, 0, outfile_); - - // Write frame header and data. - write_ivf_frame_header(pkt, outfile_); - (void)fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile_); - } -#endif - - double frame0_psnr_; -#if WRITE_COMPRESSED_STREAM - FILE *outfile_; - unsigned int out_frames_; -#endif -}; - -class ResizingCspVideoSource : public ::libaom_test::DummyVideoSource { - public: - explicit ResizingCspVideoSource(aom_img_fmt_t image_format) { - SetSize(kInitialWidth, kInitialHeight); - SetImageFormat(image_format); - limit_ = 30; - } - - virtual ~ResizingCspVideoSource() {} -}; - -#if (defined(DISABLE_TRELLISQ_SEARCH) && DISABLE_TRELLISQ_SEARCH) -TEST_P(ResizeCspTest, DISABLED_TestResizeCspWorks) { -#else -TEST_P(ResizeCspTest, TestResizeCspWorks) { -#endif - const aom_img_fmt_t image_formats[] = { AOM_IMG_FMT_I420, AOM_IMG_FMT_I444 }; - for (size_t i = 0; i < GTEST_ARRAY_SIZE_(image_formats); ++i) { - ResizingCspVideoSource video(image_formats[i]); - init_flags_ = AOM_CODEC_USE_PSNR; - cfg_.rc_min_quantizer = cfg_.rc_max_quantizer = 48; - cfg_.g_lag_in_frames = 0; - cfg_.g_profile = (image_formats[i] == AOM_IMG_FMT_I420) ? 0 : 1; - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - // Check we decoded the same number of frames as we attempted to encode - ASSERT_EQ(frame_info_list_.size(), video.limit()); - frame_info_list_.clear(); - } -} - -AV1_INSTANTIATE_TEST_CASE(ResizeTest, - ::testing::Values(::libaom_test::kRealTime)); -AV1_INSTANTIATE_TEST_CASE(ResizeInternalTestLarge, - ::testing::Values(::libaom_test::kOnePassGood)); -AV1_INSTANTIATE_TEST_CASE(ResizeRealtimeTest, - ::testing::Values(::libaom_test::kRealTime), - ::testing::Range(5, 9)); -AV1_INSTANTIATE_TEST_CASE(ResizeCspTest, - ::testing::Values(::libaom_test::kRealTime)); -} // namespace diff --git a/third_party/aom/test/run_encodes.sh b/third_party/aom/test/run_encodes.sh deleted file mode 100755 index 2096d8b15..000000000 --- a/third_party/aom/test/run_encodes.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2016, Alliance for Open Media. All rights reserved. -# -# This source code is subject to the terms of the BSD 2 Clause License and -# the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -# was not distributed with this source code in the LICENSE file, you can -# obtain it at www.aomedia.org/license/software. If the Alliance for Open -# Media Patent License 1.0 was not distributed with this source code in the -# PATENTS file, you can obtain it at www.aomedia.org/license/patent. -# -# Author: jimbankoski@google.com (Jim Bankoski) - -if [[ $# -ne 4 ]]; then - echo Encodes all the y4m files in the directory at the bitrates specified by - echo the first 3 parameters and stores the results in a subdirectory named by - echo the 4th parameter: - echo - echo Usage: run_encodes.sh start-kbps end-kbps step-kbps output-directory - echo Example: run_encodes.sh 200 500 50 baseline - exit -fi - -s=$1 -e=$2 -step=$3 -newdir=$4 - -for i in ./*y4m; do - for (( b=$s; b<= $e; b+= $step )) - do - best_encode.sh $i $b - done - mv opsnr.stt $i.stt -done - -mkdir $newdir -mv *.stt $newdir -mv *.webm $newdir diff --git a/third_party/aom/test/sad_test.cc b/third_party/aom/test/sad_test.cc deleted file mode 100644 index 845fe79da..000000000 --- a/third_party/aom/test/sad_test.cc +++ /dev/null @@ -1,1528 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string.h> -#include <limits.h> -#include <stdio.h> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "aom/aom_codec.h" -#include "aom_mem/aom_mem.h" -#include "aom_ports/mem.h" - -typedef unsigned int (*SadMxNFunc)(const uint8_t *src_ptr, int src_stride, - const uint8_t *ref_ptr, int ref_stride); -typedef ::testing::tuple<int, int, SadMxNFunc, int> SadMxNParam; - -typedef uint32_t (*SadMxNAvgFunc)(const uint8_t *src_ptr, int src_stride, - const uint8_t *ref_ptr, int ref_stride, - const uint8_t *second_pred); -typedef ::testing::tuple<int, int, SadMxNAvgFunc, int> SadMxNAvgParam; - -typedef void (*JntCompAvgFunc)(uint8_t *comp_pred, const uint8_t *pred, - int width, int height, const uint8_t *ref, - int ref_stride, - const JNT_COMP_PARAMS *jcp_param); -typedef ::testing::tuple<int, int, JntCompAvgFunc, int> JntCompAvgParam; - -typedef unsigned int (*JntSadMxhFunc)(const uint8_t *src_ptr, int src_stride, - const uint8_t *ref_ptr, int ref_stride, - int width, int height); -typedef ::testing::tuple<int, int, JntSadMxhFunc, int> JntSadMxhParam; - -typedef uint32_t (*JntSadMxNAvgFunc)(const uint8_t *src_ptr, int src_stride, - const uint8_t *ref_ptr, int ref_stride, - const uint8_t *second_pred, - const JNT_COMP_PARAMS *jcp_param); -typedef ::testing::tuple<int, int, JntSadMxNAvgFunc, int> JntSadMxNAvgParam; - -typedef void (*SadMxNx4Func)(const uint8_t *src_ptr, int src_stride, - const uint8_t *const ref_ptr[], int ref_stride, - uint32_t *sad_array); -typedef ::testing::tuple<int, int, SadMxNx4Func, int> SadMxNx4Param; - -using libaom_test::ACMRandom; - -namespace { -class SADTestBase : public ::testing::Test { - public: - SADTestBase(int width, int height, int bit_depth) - : width_(width), height_(height), bd_(bit_depth) {} - - static void SetUpTestCase() { - source_data8_ = reinterpret_cast<uint8_t *>( - aom_memalign(kDataAlignment, kDataBlockSize)); - reference_data8_ = reinterpret_cast<uint8_t *>( - aom_memalign(kDataAlignment, kDataBufferSize)); - second_pred8_ = - reinterpret_cast<uint8_t *>(aom_memalign(kDataAlignment, 128 * 128)); - comp_pred8_ = - reinterpret_cast<uint8_t *>(aom_memalign(kDataAlignment, 128 * 128)); - comp_pred8_test_ = - reinterpret_cast<uint8_t *>(aom_memalign(kDataAlignment, 128 * 128)); - source_data16_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, kDataBlockSize * sizeof(uint16_t))); - reference_data16_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, kDataBufferSize * sizeof(uint16_t))); - second_pred16_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, 128 * 128 * sizeof(uint16_t))); - comp_pred16_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, 128 * 128 * sizeof(uint16_t))); - comp_pred16_test_ = reinterpret_cast<uint16_t *>( - aom_memalign(kDataAlignment, 128 * 128 * sizeof(uint16_t))); - } - - static void TearDownTestCase() { - aom_free(source_data8_); - source_data8_ = NULL; - aom_free(reference_data8_); - reference_data8_ = NULL; - aom_free(second_pred8_); - second_pred8_ = NULL; - aom_free(comp_pred8_); - comp_pred8_ = NULL; - aom_free(comp_pred8_test_); - comp_pred8_test_ = NULL; - aom_free(source_data16_); - source_data16_ = NULL; - aom_free(reference_data16_); - reference_data16_ = NULL; - aom_free(second_pred16_); - second_pred16_ = NULL; - aom_free(comp_pred16_); - comp_pred16_ = NULL; - aom_free(comp_pred16_test_); - comp_pred16_test_ = NULL; - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - // Handle up to 4 128x128 blocks, with stride up to 256 - static const int kDataAlignment = 16; - static const int kDataBlockSize = 128 * 256; - static const int kDataBufferSize = 4 * kDataBlockSize; - - virtual void SetUp() { - if (bd_ == -1) { - use_high_bit_depth_ = false; - bit_depth_ = AOM_BITS_8; - source_data_ = source_data8_; - reference_data_ = reference_data8_; - second_pred_ = second_pred8_; - comp_pred_ = comp_pred8_; - comp_pred_test_ = comp_pred8_test_; - } else { - use_high_bit_depth_ = true; - bit_depth_ = static_cast<aom_bit_depth_t>(bd_); - source_data_ = CONVERT_TO_BYTEPTR(source_data16_); - reference_data_ = CONVERT_TO_BYTEPTR(reference_data16_); - second_pred_ = CONVERT_TO_BYTEPTR(second_pred16_); - comp_pred_ = CONVERT_TO_BYTEPTR(comp_pred16_); - comp_pred_test_ = CONVERT_TO_BYTEPTR(comp_pred16_test_); - } - mask_ = (1 << bit_depth_) - 1; - source_stride_ = (width_ + 31) & ~31; - reference_stride_ = width_ * 2; - rnd_.Reset(ACMRandom::DeterministicSeed()); - } - - virtual uint8_t *GetReference(int block_idx) { - if (use_high_bit_depth_) - return CONVERT_TO_BYTEPTR(CONVERT_TO_SHORTPTR(reference_data_) + - block_idx * kDataBlockSize); - return reference_data_ + block_idx * kDataBlockSize; - } - - // Sum of Absolute Differences. Given two blocks, calculate the absolute - // difference between two pixels in the same relative location; accumulate. - unsigned int ReferenceSAD(int block_idx) { - unsigned int sad = 0; - const uint8_t *const reference8 = GetReference(block_idx); - const uint8_t *const source8 = source_data_; - const uint16_t *const reference16 = - CONVERT_TO_SHORTPTR(GetReference(block_idx)); - const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - sad += abs(source8[h * source_stride_ + w] - - reference8[h * reference_stride_ + w]); - } else { - sad += abs(source16[h * source_stride_ + w] - - reference16[h * reference_stride_ + w]); - } - } - } - return sad; - } - - // Sum of Absolute Differences Average. Given two blocks, and a prediction - // calculate the absolute difference between one pixel and average of the - // corresponding and predicted pixels; accumulate. - unsigned int ReferenceSADavg(int block_idx) { - unsigned int sad = 0; - const uint8_t *const reference8 = GetReference(block_idx); - const uint8_t *const source8 = source_data_; - const uint8_t *const second_pred8 = second_pred_; - const uint16_t *const reference16 = - CONVERT_TO_SHORTPTR(GetReference(block_idx)); - const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); - const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - const int tmp = second_pred8[h * width_ + w] + - reference8[h * reference_stride_ + w]; - const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); - sad += abs(source8[h * source_stride_ + w] - comp_pred); - } else { - const int tmp = second_pred16[h * width_ + w] + - reference16[h * reference_stride_ + w]; - const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 1); - sad += abs(source16[h * source_stride_ + w] - comp_pred); - } - } - } - return sad; - } - - void ReferenceJntCompAvg(int block_idx) { - const uint8_t *const reference8 = GetReference(block_idx); - const uint8_t *const second_pred8 = second_pred_; - uint8_t *const comp_pred8 = comp_pred_; - const uint16_t *const reference16 = - CONVERT_TO_SHORTPTR(GetReference(block_idx)); - const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_); - uint16_t *const comp_pred16 = CONVERT_TO_SHORTPTR(comp_pred_); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - const int tmp = - second_pred8[h * width_ + w] * jcp_param_.bck_offset + - reference8[h * reference_stride_ + w] * jcp_param_.fwd_offset; - comp_pred8[h * width_ + w] = ROUND_POWER_OF_TWO(tmp, 4); - } else { - const int tmp = - second_pred16[h * width_ + w] * jcp_param_.bck_offset + - reference16[h * reference_stride_ + w] * jcp_param_.fwd_offset; - comp_pred16[h * width_ + w] = ROUND_POWER_OF_TWO(tmp, 4); - } - } - } - } - - unsigned int ReferenceJntSADavg(int block_idx) { - unsigned int sad = 0; - const uint8_t *const reference8 = GetReference(block_idx); - const uint8_t *const source8 = source_data_; - const uint8_t *const second_pred8 = second_pred_; - const uint16_t *const reference16 = - CONVERT_TO_SHORTPTR(GetReference(block_idx)); - const uint16_t *const source16 = CONVERT_TO_SHORTPTR(source_data_); - const uint16_t *const second_pred16 = CONVERT_TO_SHORTPTR(second_pred_); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - const int tmp = - second_pred8[h * width_ + w] * jcp_param_.bck_offset + - reference8[h * reference_stride_ + w] * jcp_param_.fwd_offset; - const uint8_t comp_pred = ROUND_POWER_OF_TWO(tmp, 4); - sad += abs(source8[h * source_stride_ + w] - comp_pred); - } else { - const int tmp = - second_pred16[h * width_ + w] * jcp_param_.bck_offset + - reference16[h * reference_stride_ + w] * jcp_param_.fwd_offset; - const uint16_t comp_pred = ROUND_POWER_OF_TWO(tmp, 4); - sad += abs(source16[h * source_stride_ + w] - comp_pred); - } - } - } - return sad; - } - - void FillConstant(uint8_t *data, int stride, uint16_t fill_constant) { - uint8_t *data8 = data; - uint16_t *data16 = CONVERT_TO_SHORTPTR(data); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - data8[h * stride + w] = static_cast<uint8_t>(fill_constant); - } else { - data16[h * stride + w] = fill_constant; - } - } - } - } - - void FillRandom(uint8_t *data, int stride) { - uint8_t *data8 = data; - uint16_t *data16 = CONVERT_TO_SHORTPTR(data); - for (int h = 0; h < height_; ++h) { - for (int w = 0; w < width_; ++w) { - if (!use_high_bit_depth_) { - data8[h * stride + w] = rnd_.Rand8(); - } else { - data16[h * stride + w] = rnd_.Rand16() & mask_; - } - } - } - } - - int width_, height_, mask_, bd_; - aom_bit_depth_t bit_depth_; - static uint8_t *source_data_; - static uint8_t *reference_data_; - static uint8_t *second_pred_; - int source_stride_; - bool use_high_bit_depth_; - static uint8_t *source_data8_; - static uint8_t *reference_data8_; - static uint8_t *second_pred8_; - static uint16_t *source_data16_; - static uint16_t *reference_data16_; - static uint16_t *second_pred16_; - int reference_stride_; - static uint8_t *comp_pred_; - static uint8_t *comp_pred8_; - static uint16_t *comp_pred16_; - static uint8_t *comp_pred_test_; - static uint8_t *comp_pred8_test_; - static uint16_t *comp_pred16_test_; - JNT_COMP_PARAMS jcp_param_; - - ACMRandom rnd_; -}; - -class SADx4Test : public ::testing::WithParamInterface<SadMxNx4Param>, - public SADTestBase { - public: - SADx4Test() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - void SADs(unsigned int *results) { - const uint8_t *references[] = { GetReference(0), GetReference(1), - GetReference(2), GetReference(3) }; - - ASM_REGISTER_STATE_CHECK(GET_PARAM(2)( - source_data_, source_stride_, references, reference_stride_, results)); - } - - void CheckSADs() { - unsigned int reference_sad, exp_sad[4]; - - SADs(exp_sad); - for (int block = 0; block < 4; ++block) { - reference_sad = ReferenceSAD(block); - - EXPECT_EQ(reference_sad, exp_sad[block]) << "block " << block; - } - } -}; - -class SADTest : public ::testing::WithParamInterface<SadMxNParam>, - public SADTestBase { - public: - SADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - unsigned int SAD(int block_idx) { - unsigned int ret; - const uint8_t *const reference = GetReference(block_idx); - - ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_)); - return ret; - } - - void CheckSAD() { - const unsigned int reference_sad = ReferenceSAD(0); - const unsigned int exp_sad = SAD(0); - - ASSERT_EQ(reference_sad, exp_sad); - } - - void SpeedSAD() { - int test_count = 20000000; - while (test_count > 0) { - SAD(0); - test_count -= 1; - } - } -}; - -class SADavgTest : public ::testing::WithParamInterface<SadMxNAvgParam>, - public SADTestBase { - public: - SADavgTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - unsigned int SAD_avg(int block_idx) { - unsigned int ret; - const uint8_t *const reference = GetReference(block_idx); - - ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_, - second_pred_)); - return ret; - } - - void CheckSAD() { - const unsigned int reference_sad = ReferenceSADavg(0); - const unsigned int exp_sad = SAD_avg(0); - - ASSERT_EQ(reference_sad, exp_sad); - } -}; - -class JntCompAvgTest : public ::testing::WithParamInterface<JntCompAvgParam>, - public SADTestBase { - public: - JntCompAvgTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - void jnt_comp_avg(int block_idx) { - const uint8_t *const reference = GetReference(block_idx); - - ASM_REGISTER_STATE_CHECK(GET_PARAM(2)(comp_pred_test_, second_pred_, width_, - height_, reference, reference_stride_, - &jcp_param_)); - } - - void CheckCompAvg() { - for (int j = 0; j < 2; ++j) { - for (int i = 0; i < 4; ++i) { - jcp_param_.fwd_offset = quant_dist_lookup_table[j][i][0]; - jcp_param_.bck_offset = quant_dist_lookup_table[j][i][1]; - - ReferenceJntCompAvg(0); - jnt_comp_avg(0); - - for (int y = 0; y < height_; ++y) - for (int x = 0; x < width_; ++x) - ASSERT_EQ(comp_pred_[y * width_ + x], - comp_pred_test_[y * width_ + x]); - } - } - } -}; - -class JntSADTest : public ::testing::WithParamInterface<JntSadMxhParam>, - public SADTestBase { - public: - JntSADTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - unsigned int SAD(int block_idx) { - unsigned int ret; - const uint8_t *const reference = GetReference(block_idx); - - ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_, - GET_PARAM(0), GET_PARAM(1))); - return ret; - } - - void CheckSAD() { - const unsigned int reference_sad = ReferenceSAD(0); - const unsigned int exp_sad = SAD(0); - - ASSERT_EQ(reference_sad, exp_sad); - } - - void SpeedSAD() { - int test_count = 20000000; - while (test_count > 0) { - SAD(0); - test_count -= 1; - } - } -}; - -class JntSADavgTest : public ::testing::WithParamInterface<JntSadMxNAvgParam>, - public SADTestBase { - public: - JntSADavgTest() : SADTestBase(GET_PARAM(0), GET_PARAM(1), GET_PARAM(3)) {} - - protected: - unsigned int jnt_SAD_avg(int block_idx) { - unsigned int ret; - const uint8_t *const reference = GetReference(block_idx); - - ASM_REGISTER_STATE_CHECK(ret = GET_PARAM(2)(source_data_, source_stride_, - reference, reference_stride_, - second_pred_, &jcp_param_)); - return ret; - } - - void CheckSAD() { - for (int j = 0; j < 2; ++j) { - for (int i = 0; i < 4; ++i) { - jcp_param_.fwd_offset = quant_dist_lookup_table[j][i][0]; - jcp_param_.bck_offset = quant_dist_lookup_table[j][i][1]; - - const unsigned int reference_sad = ReferenceJntSADavg(0); - const unsigned int exp_sad = jnt_SAD_avg(0); - - ASSERT_EQ(reference_sad, exp_sad); - } - } - } -}; - -uint8_t *SADTestBase::source_data_ = NULL; -uint8_t *SADTestBase::reference_data_ = NULL; -uint8_t *SADTestBase::second_pred_ = NULL; -uint8_t *SADTestBase::comp_pred_ = NULL; -uint8_t *SADTestBase::comp_pred_test_ = NULL; -uint8_t *SADTestBase::source_data8_ = NULL; -uint8_t *SADTestBase::reference_data8_ = NULL; -uint8_t *SADTestBase::second_pred8_ = NULL; -uint8_t *SADTestBase::comp_pred8_ = NULL; -uint8_t *SADTestBase::comp_pred8_test_ = NULL; -uint16_t *SADTestBase::source_data16_ = NULL; -uint16_t *SADTestBase::reference_data16_ = NULL; -uint16_t *SADTestBase::second_pred16_ = NULL; -uint16_t *SADTestBase::comp_pred16_ = NULL; -uint16_t *SADTestBase::comp_pred16_test_ = NULL; - -TEST_P(SADTest, MaxRef) { - FillConstant(source_data_, source_stride_, 0); - FillConstant(reference_data_, reference_stride_, mask_); - CheckSAD(); -} - -TEST_P(SADTest, MaxSrc) { - FillConstant(source_data_, source_stride_, mask_); - FillConstant(reference_data_, reference_stride_, 0); - CheckSAD(); -} - -TEST_P(SADTest, ShortRef) { - const int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADTest, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - const int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADTest, ShortSrc) { - const int tmp_stride = source_stride_; - source_stride_ >>= 1; - int test_count = 2000; - while (test_count > 0) { - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - test_count -= 1; - } - source_stride_ = tmp_stride; -} - -#define SPEED_TEST (0) -#if SPEED_TEST -TEST_P(SADTest, Speed) { - const int tmp_stride = source_stride_; - source_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - SpeedSAD(); - source_stride_ = tmp_stride; -} -#endif - -TEST_P(SADavgTest, MaxRef) { - FillConstant(source_data_, source_stride_, 0); - FillConstant(reference_data_, reference_stride_, mask_); - FillConstant(second_pred_, width_, 0); - CheckSAD(); -} -TEST_P(SADavgTest, MaxSrc) { - FillConstant(source_data_, source_stride_, mask_); - FillConstant(reference_data_, reference_stride_, 0); - FillConstant(second_pred_, width_, 0); - CheckSAD(); -} - -TEST_P(SADavgTest, ShortRef) { - const int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADavgTest, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - const int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADavgTest, ShortSrc) { - const int tmp_stride = source_stride_; - source_stride_ >>= 1; - int test_count = 2000; - while (test_count > 0) { - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - test_count -= 1; - } - source_stride_ = tmp_stride; -} - -TEST_P(JntCompAvgTest, MaxRef) { - FillConstant(reference_data_, reference_stride_, mask_); - FillConstant(second_pred_, width_, 0); - CheckCompAvg(); -} - -TEST_P(JntCompAvgTest, MaxSecondPred) { - FillConstant(reference_data_, reference_stride_, 0); - FillConstant(second_pred_, width_, mask_); - CheckCompAvg(); -} - -TEST_P(JntCompAvgTest, ShortRef) { - const int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckCompAvg(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntCompAvgTest, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - const int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckCompAvg(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntSADTest, MaxRef) { - FillConstant(source_data_, source_stride_, 0); - FillConstant(reference_data_, reference_stride_, mask_); - CheckSAD(); -} - -TEST_P(JntSADTest, MaxSrc) { - FillConstant(source_data_, source_stride_, mask_); - FillConstant(reference_data_, reference_stride_, 0); - CheckSAD(); -} - -TEST_P(JntSADTest, ShortRef) { - const int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntSADTest, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - const int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntSADTest, ShortSrc) { - const int tmp_stride = source_stride_; - source_stride_ >>= 1; - int test_count = 2000; - while (test_count > 0) { - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - CheckSAD(); - test_count -= 1; - } - source_stride_ = tmp_stride; -} - -TEST_P(JntSADavgTest, MaxRef) { - FillConstant(source_data_, source_stride_, 0); - FillConstant(reference_data_, reference_stride_, mask_); - FillConstant(second_pred_, width_, 0); - CheckSAD(); -} -TEST_P(JntSADavgTest, MaxSrc) { - FillConstant(source_data_, source_stride_, mask_); - FillConstant(reference_data_, reference_stride_, 0); - FillConstant(second_pred_, width_, 0); - CheckSAD(); -} - -TEST_P(JntSADavgTest, ShortRef) { - const int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntSADavgTest, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - const int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - reference_stride_ = tmp_stride; -} - -TEST_P(JntSADavgTest, ShortSrc) { - const int tmp_stride = source_stride_; - source_stride_ >>= 1; - int test_count = 2000; - while (test_count > 0) { - FillRandom(source_data_, source_stride_); - FillRandom(reference_data_, reference_stride_); - FillRandom(second_pred_, width_); - CheckSAD(); - test_count -= 1; - } - source_stride_ = tmp_stride; -} - -TEST_P(SADx4Test, MaxRef) { - FillConstant(source_data_, source_stride_, 0); - FillConstant(GetReference(0), reference_stride_, mask_); - FillConstant(GetReference(1), reference_stride_, mask_); - FillConstant(GetReference(2), reference_stride_, mask_); - FillConstant(GetReference(3), reference_stride_, mask_); - CheckSADs(); -} - -TEST_P(SADx4Test, MaxSrc) { - FillConstant(source_data_, source_stride_, mask_); - FillConstant(GetReference(0), reference_stride_, 0); - FillConstant(GetReference(1), reference_stride_, 0); - FillConstant(GetReference(2), reference_stride_, 0); - FillConstant(GetReference(3), reference_stride_, 0); - CheckSADs(); -} - -TEST_P(SADx4Test, ShortRef) { - int tmp_stride = reference_stride_; - reference_stride_ >>= 1; - FillRandom(source_data_, source_stride_); - FillRandom(GetReference(0), reference_stride_); - FillRandom(GetReference(1), reference_stride_); - FillRandom(GetReference(2), reference_stride_); - FillRandom(GetReference(3), reference_stride_); - CheckSADs(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADx4Test, UnalignedRef) { - // The reference frame, but not the source frame, may be unaligned for - // certain types of searches. - int tmp_stride = reference_stride_; - reference_stride_ -= 1; - FillRandom(source_data_, source_stride_); - FillRandom(GetReference(0), reference_stride_); - FillRandom(GetReference(1), reference_stride_); - FillRandom(GetReference(2), reference_stride_); - FillRandom(GetReference(3), reference_stride_); - CheckSADs(); - reference_stride_ = tmp_stride; -} - -TEST_P(SADx4Test, ShortSrc) { - int tmp_stride = source_stride_; - source_stride_ >>= 1; - int test_count = 1000; - while (test_count > 0) { - FillRandom(source_data_, source_stride_); - FillRandom(GetReference(0), reference_stride_); - FillRandom(GetReference(1), reference_stride_); - FillRandom(GetReference(2), reference_stride_); - FillRandom(GetReference(3), reference_stride_); - CheckSADs(); - test_count -= 1; - } - source_stride_ = tmp_stride; -} - -TEST_P(SADx4Test, SrcAlignedByWidth) { - uint8_t *tmp_source_data = source_data_; - source_data_ += width_; - FillRandom(source_data_, source_stride_); - FillRandom(GetReference(0), reference_stride_); - FillRandom(GetReference(1), reference_stride_); - FillRandom(GetReference(2), reference_stride_); - FillRandom(GetReference(3), reference_stride_); - CheckSADs(); - source_data_ = tmp_source_data; -} - -using ::testing::make_tuple; - -//------------------------------------------------------------------------------ -// C functions -const SadMxNParam c_tests[] = { - make_tuple(128, 128, &aom_sad128x128_c, -1), - make_tuple(128, 64, &aom_sad128x64_c, -1), - make_tuple(64, 128, &aom_sad64x128_c, -1), - make_tuple(64, 64, &aom_sad64x64_c, -1), - make_tuple(64, 32, &aom_sad64x32_c, -1), - make_tuple(32, 64, &aom_sad32x64_c, -1), - make_tuple(32, 32, &aom_sad32x32_c, -1), - make_tuple(32, 16, &aom_sad32x16_c, -1), - make_tuple(16, 32, &aom_sad16x32_c, -1), - make_tuple(16, 16, &aom_sad16x16_c, -1), - make_tuple(16, 8, &aom_sad16x8_c, -1), - make_tuple(8, 16, &aom_sad8x16_c, -1), - make_tuple(8, 8, &aom_sad8x8_c, -1), - make_tuple(8, 4, &aom_sad8x4_c, -1), - make_tuple(4, 8, &aom_sad4x8_c, -1), - make_tuple(4, 4, &aom_sad4x4_c, -1), - make_tuple(128, 128, &aom_highbd_sad128x128_c, 8), - make_tuple(128, 64, &aom_highbd_sad128x64_c, 8), - make_tuple(64, 128, &aom_highbd_sad64x128_c, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_c, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_c, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_c, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_c, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_c, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_c, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_c, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_c, 8), - make_tuple(8, 16, &aom_highbd_sad8x16_c, 8), - make_tuple(8, 8, &aom_highbd_sad8x8_c, 8), - make_tuple(8, 4, &aom_highbd_sad8x4_c, 8), - make_tuple(4, 8, &aom_highbd_sad4x8_c, 8), - make_tuple(4, 4, &aom_highbd_sad4x4_c, 8), - make_tuple(128, 128, &aom_highbd_sad128x128_c, 10), - make_tuple(128, 64, &aom_highbd_sad128x64_c, 10), - make_tuple(64, 128, &aom_highbd_sad64x128_c, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_c, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_c, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_c, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_c, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_c, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_c, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_c, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_c, 10), - make_tuple(8, 16, &aom_highbd_sad8x16_c, 10), - make_tuple(8, 8, &aom_highbd_sad8x8_c, 10), - make_tuple(8, 4, &aom_highbd_sad8x4_c, 10), - make_tuple(4, 8, &aom_highbd_sad4x8_c, 10), - make_tuple(4, 4, &aom_highbd_sad4x4_c, 10), - make_tuple(128, 128, &aom_highbd_sad128x128_c, 12), - make_tuple(128, 64, &aom_highbd_sad128x64_c, 12), - make_tuple(64, 128, &aom_highbd_sad64x128_c, 12), - make_tuple(64, 64, &aom_highbd_sad64x64_c, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_c, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_c, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_c, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_c, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_c, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_c, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_c, 12), - make_tuple(8, 16, &aom_highbd_sad8x16_c, 12), - make_tuple(8, 8, &aom_highbd_sad8x8_c, 12), - make_tuple(8, 4, &aom_highbd_sad8x4_c, 12), - make_tuple(4, 8, &aom_highbd_sad4x8_c, 12), - make_tuple(4, 4, &aom_highbd_sad4x4_c, 12), -}; -INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::ValuesIn(c_tests)); - -const SadMxNAvgParam avg_c_tests[] = { - make_tuple(128, 128, &aom_sad128x128_avg_c, -1), - make_tuple(128, 64, &aom_sad128x64_avg_c, -1), - make_tuple(64, 128, &aom_sad64x128_avg_c, -1), - make_tuple(64, 64, &aom_sad64x64_avg_c, -1), - make_tuple(64, 32, &aom_sad64x32_avg_c, -1), - make_tuple(32, 64, &aom_sad32x64_avg_c, -1), - make_tuple(32, 32, &aom_sad32x32_avg_c, -1), - make_tuple(32, 16, &aom_sad32x16_avg_c, -1), - make_tuple(16, 32, &aom_sad16x32_avg_c, -1), - make_tuple(16, 16, &aom_sad16x16_avg_c, -1), - make_tuple(16, 8, &aom_sad16x8_avg_c, -1), - make_tuple(8, 16, &aom_sad8x16_avg_c, -1), - make_tuple(8, 8, &aom_sad8x8_avg_c, -1), - make_tuple(8, 4, &aom_sad8x4_avg_c, -1), - make_tuple(4, 8, &aom_sad4x8_avg_c, -1), - make_tuple(4, 4, &aom_sad4x4_avg_c, -1), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_c, 8), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_c, 8), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_c, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_c, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_c, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_c, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_c, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_c, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_c, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_c, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_c, 8), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_c, 8), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_c, 8), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_c, 8), - make_tuple(4, 8, &aom_highbd_sad4x8_avg_c, 8), - make_tuple(4, 4, &aom_highbd_sad4x4_avg_c, 8), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_c, 10), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_c, 10), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_c, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_c, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_c, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_c, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_c, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_c, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_c, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_c, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_c, 10), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_c, 10), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_c, 10), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_c, 10), - make_tuple(4, 8, &aom_highbd_sad4x8_avg_c, 10), - make_tuple(4, 4, &aom_highbd_sad4x4_avg_c, 10), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_c, 12), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_c, 12), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_c, 12), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_c, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_c, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_c, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_c, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_c, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_c, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_c, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_c, 12), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_c, 12), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_c, 12), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_c, 12), - make_tuple(4, 8, &aom_highbd_sad4x8_avg_c, 12), - make_tuple(4, 4, &aom_highbd_sad4x4_avg_c, 12), -}; -INSTANTIATE_TEST_CASE_P(C, SADavgTest, ::testing::ValuesIn(avg_c_tests)); - -// TODO(chengchen): add highbd tests -const JntCompAvgParam jnt_comp_avg_c_tests[] = { - make_tuple(128, 128, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(128, 64, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(64, 128, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(64, 64, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(64, 32, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(32, 64, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(32, 32, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(32, 16, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(16, 32, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(16, 16, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(16, 8, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(8, 16, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(8, 8, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(8, 4, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(4, 8, &aom_jnt_comp_avg_pred_c, -1), - make_tuple(4, 4, &aom_jnt_comp_avg_pred_c, -1), -}; - -INSTANTIATE_TEST_CASE_P(C, JntCompAvgTest, - ::testing::ValuesIn(jnt_comp_avg_c_tests)); - -const JntSadMxNAvgParam jnt_avg_c_tests[] = { - make_tuple(128, 128, &aom_jnt_sad128x128_avg_c, -1), - make_tuple(128, 64, &aom_jnt_sad128x64_avg_c, -1), - make_tuple(64, 128, &aom_jnt_sad64x128_avg_c, -1), - make_tuple(64, 64, &aom_jnt_sad64x64_avg_c, -1), - make_tuple(64, 32, &aom_jnt_sad64x32_avg_c, -1), - make_tuple(32, 64, &aom_jnt_sad32x64_avg_c, -1), - make_tuple(32, 32, &aom_jnt_sad32x32_avg_c, -1), - make_tuple(32, 16, &aom_jnt_sad32x16_avg_c, -1), - make_tuple(16, 32, &aom_jnt_sad16x32_avg_c, -1), - make_tuple(16, 16, &aom_jnt_sad16x16_avg_c, -1), - make_tuple(16, 8, &aom_jnt_sad16x8_avg_c, -1), - make_tuple(8, 16, &aom_jnt_sad8x16_avg_c, -1), - make_tuple(8, 8, &aom_jnt_sad8x8_avg_c, -1), - make_tuple(8, 4, &aom_jnt_sad8x4_avg_c, -1), - make_tuple(4, 8, &aom_jnt_sad4x8_avg_c, -1), - make_tuple(4, 4, &aom_jnt_sad4x4_avg_c, -1), -}; -INSTANTIATE_TEST_CASE_P(C, JntSADavgTest, ::testing::ValuesIn(jnt_avg_c_tests)); - -const SadMxNx4Param x4d_c_tests[] = { - make_tuple(128, 128, &aom_sad128x128x4d_c, -1), - make_tuple(128, 64, &aom_sad128x64x4d_c, -1), - make_tuple(64, 128, &aom_sad64x128x4d_c, -1), - make_tuple(64, 64, &aom_sad64x64x4d_c, -1), - make_tuple(64, 32, &aom_sad64x32x4d_c, -1), - make_tuple(32, 64, &aom_sad32x64x4d_c, -1), - make_tuple(32, 32, &aom_sad32x32x4d_c, -1), - make_tuple(32, 16, &aom_sad32x16x4d_c, -1), - make_tuple(16, 32, &aom_sad16x32x4d_c, -1), - make_tuple(16, 16, &aom_sad16x16x4d_c, -1), - make_tuple(16, 8, &aom_sad16x8x4d_c, -1), - make_tuple(8, 16, &aom_sad8x16x4d_c, -1), - make_tuple(8, 8, &aom_sad8x8x4d_c, -1), - make_tuple(8, 4, &aom_sad8x4x4d_c, -1), - make_tuple(4, 8, &aom_sad4x8x4d_c, -1), - make_tuple(4, 4, &aom_sad4x4x4d_c, -1), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_c, 8), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_c, 8), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_c, 8), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_c, 8), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_c, 8), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_c, 8), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_c, 8), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_c, 8), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_c, 8), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_c, 8), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_c, 8), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_c, 8), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_c, 8), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_c, 8), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_c, 8), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_c, 8), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_c, 10), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_c, 10), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_c, 10), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_c, 10), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_c, 10), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_c, 10), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_c, 10), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_c, 10), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_c, 10), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_c, 10), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_c, 10), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_c, 10), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_c, 10), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_c, 10), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_c, 10), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_c, 10), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_c, 12), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_c, 12), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_c, 12), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_c, 12), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_c, 12), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_c, 12), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_c, 12), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_c, 12), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_c, 12), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_c, 12), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_c, 12), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_c, 12), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_c, 12), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_c, 12), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_c, 12), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_c, 12), -}; -INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests)); - -//------------------------------------------------------------------------------ -// ARM functions -#if HAVE_NEON -const SadMxNParam neon_tests[] = { - make_tuple(64, 64, &aom_sad64x64_neon, -1), - make_tuple(32, 32, &aom_sad32x32_neon, -1), - make_tuple(16, 16, &aom_sad16x16_neon, -1), - make_tuple(16, 8, &aom_sad16x8_neon, -1), - make_tuple(8, 16, &aom_sad8x16_neon, -1), - make_tuple(8, 8, &aom_sad8x8_neon, -1), - make_tuple(4, 4, &aom_sad4x4_neon, -1), -}; -INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::ValuesIn(neon_tests)); - -const SadMxNx4Param x4d_neon_tests[] = { - make_tuple(64, 64, &aom_sad64x64x4d_neon, -1), - make_tuple(32, 32, &aom_sad32x32x4d_neon, -1), - make_tuple(16, 16, &aom_sad16x16x4d_neon, -1), -}; -INSTANTIATE_TEST_CASE_P(NEON, SADx4Test, ::testing::ValuesIn(x4d_neon_tests)); -#endif // HAVE_NEON - -//------------------------------------------------------------------------------ -// x86 functions -#if HAVE_SSE2 -const SadMxNParam sse2_tests[] = { - make_tuple(128, 128, &aom_sad128x128_sse2, -1), - make_tuple(128, 64, &aom_sad128x64_sse2, -1), - make_tuple(64, 128, &aom_sad64x128_sse2, -1), - make_tuple(64, 64, &aom_sad64x64_sse2, -1), - make_tuple(64, 32, &aom_sad64x32_sse2, -1), - make_tuple(32, 64, &aom_sad32x64_sse2, -1), - make_tuple(32, 32, &aom_sad32x32_sse2, -1), - make_tuple(32, 16, &aom_sad32x16_sse2, -1), - make_tuple(16, 32, &aom_sad16x32_sse2, -1), - make_tuple(16, 16, &aom_sad16x16_sse2, -1), - make_tuple(16, 8, &aom_sad16x8_sse2, -1), - make_tuple(8, 16, &aom_sad8x16_sse2, -1), - make_tuple(8, 8, &aom_sad8x8_sse2, -1), - make_tuple(8, 4, &aom_sad8x4_sse2, -1), - make_tuple(4, 8, &aom_sad4x8_sse2, -1), - make_tuple(4, 4, &aom_sad4x4_sse2, -1), - make_tuple(64, 64, &aom_highbd_sad64x64_sse2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_sse2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_sse2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_sse2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_sse2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_sse2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_sse2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_sse2, 8), - make_tuple(8, 16, &aom_highbd_sad8x16_sse2, 8), - make_tuple(8, 8, &aom_highbd_sad8x8_sse2, 8), - make_tuple(8, 4, &aom_highbd_sad8x4_sse2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_sse2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_sse2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_sse2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_sse2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_sse2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_sse2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_sse2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_sse2, 10), - make_tuple(8, 16, &aom_highbd_sad8x16_sse2, 10), - make_tuple(8, 8, &aom_highbd_sad8x8_sse2, 10), - make_tuple(8, 4, &aom_highbd_sad8x4_sse2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_sse2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_sse2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_sse2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_sse2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_sse2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_sse2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_sse2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_sse2, 12), - make_tuple(8, 16, &aom_highbd_sad8x16_sse2, 12), - make_tuple(8, 8, &aom_highbd_sad8x8_sse2, 12), - make_tuple(8, 4, &aom_highbd_sad8x4_sse2, 12), -}; -INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests)); - -const SadMxNAvgParam avg_sse2_tests[] = { - make_tuple(128, 128, &aom_sad128x128_avg_sse2, -1), - make_tuple(128, 64, &aom_sad128x64_avg_sse2, -1), - make_tuple(64, 128, &aom_sad64x128_avg_sse2, -1), - make_tuple(64, 64, &aom_sad64x64_avg_sse2, -1), - make_tuple(64, 32, &aom_sad64x32_avg_sse2, -1), - make_tuple(32, 64, &aom_sad32x64_avg_sse2, -1), - make_tuple(32, 32, &aom_sad32x32_avg_sse2, -1), - make_tuple(32, 16, &aom_sad32x16_avg_sse2, -1), - make_tuple(16, 32, &aom_sad16x32_avg_sse2, -1), - make_tuple(16, 16, &aom_sad16x16_avg_sse2, -1), - make_tuple(16, 8, &aom_sad16x8_avg_sse2, -1), - make_tuple(8, 16, &aom_sad8x16_avg_sse2, -1), - make_tuple(8, 8, &aom_sad8x8_avg_sse2, -1), - make_tuple(8, 4, &aom_sad8x4_avg_sse2, -1), - make_tuple(4, 8, &aom_sad4x8_avg_sse2, -1), - make_tuple(4, 4, &aom_sad4x4_avg_sse2, -1), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_sse2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_sse2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_sse2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_sse2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_sse2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_sse2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_sse2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_sse2, 8), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_sse2, 8), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_sse2, 8), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_sse2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_sse2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_sse2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_sse2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_sse2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_sse2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_sse2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_sse2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_sse2, 10), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_sse2, 10), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_sse2, 10), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_sse2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_sse2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_sse2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_sse2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_sse2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_sse2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_sse2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_sse2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_sse2, 12), - make_tuple(8, 16, &aom_highbd_sad8x16_avg_sse2, 12), - make_tuple(8, 8, &aom_highbd_sad8x8_avg_sse2, 12), - make_tuple(8, 4, &aom_highbd_sad8x4_avg_sse2, 12), -}; -INSTANTIATE_TEST_CASE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests)); - -const SadMxNx4Param x4d_sse2_tests[] = { - make_tuple(128, 128, &aom_sad128x128x4d_sse2, -1), - make_tuple(128, 64, &aom_sad128x64x4d_sse2, -1), - make_tuple(64, 128, &aom_sad64x128x4d_sse2, -1), - make_tuple(64, 64, &aom_sad64x64x4d_sse2, -1), - make_tuple(64, 32, &aom_sad64x32x4d_sse2, -1), - make_tuple(32, 64, &aom_sad32x64x4d_sse2, -1), - make_tuple(32, 32, &aom_sad32x32x4d_sse2, -1), - make_tuple(32, 16, &aom_sad32x16x4d_sse2, -1), - make_tuple(16, 32, &aom_sad16x32x4d_sse2, -1), - make_tuple(16, 16, &aom_sad16x16x4d_sse2, -1), - make_tuple(16, 8, &aom_sad16x8x4d_sse2, -1), - make_tuple(8, 16, &aom_sad8x16x4d_sse2, -1), - make_tuple(8, 8, &aom_sad8x8x4d_sse2, -1), - make_tuple(8, 4, &aom_sad8x4x4d_sse2, -1), - make_tuple(4, 8, &aom_sad4x8x4d_sse2, -1), - make_tuple(4, 4, &aom_sad4x4x4d_sse2, -1), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_sse2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_sse2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_sse2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_sse2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_sse2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_sse2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_sse2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_sse2, 8), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_sse2, 8), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_sse2, 8), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_sse2, 8), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_sse2, 8), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_sse2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_sse2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_sse2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_sse2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_sse2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_sse2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_sse2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_sse2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_sse2, 10), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_sse2, 10), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_sse2, 10), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_sse2, 10), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_sse2, 10), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_sse2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_sse2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_sse2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_sse2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_sse2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_sse2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_sse2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_sse2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_sse2, 12), - make_tuple(8, 16, &aom_highbd_sad8x16x4d_sse2, 12), - make_tuple(8, 8, &aom_highbd_sad8x8x4d_sse2, 12), - make_tuple(8, 4, &aom_highbd_sad8x4x4d_sse2, 12), - make_tuple(4, 8, &aom_highbd_sad4x8x4d_sse2, 12), - make_tuple(4, 4, &aom_highbd_sad4x4x4d_sse2, 12), -}; -INSTANTIATE_TEST_CASE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests)); -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -// Note: These are named sse2, but part of ssse3 file and only built and linked -// when ssse3 is enabled. -const JntSadMxhParam jnt_sad_sse2_tests[] = { - make_tuple(4, 4, &aom_sad4xh_sse2, -1), - make_tuple(4, 8, &aom_sad4xh_sse2, -1), - make_tuple(8, 4, &aom_sad8xh_sse2, -1), - make_tuple(8, 8, &aom_sad8xh_sse2, -1), - make_tuple(8, 16, &aom_sad8xh_sse2, -1), - make_tuple(16, 8, &aom_sad16xh_sse2, -1), - make_tuple(16, 16, &aom_sad16xh_sse2, -1), - make_tuple(16, 32, &aom_sad16xh_sse2, -1), - make_tuple(32, 16, &aom_sad32xh_sse2, -1), - make_tuple(32, 32, &aom_sad32xh_sse2, -1), - make_tuple(32, 64, &aom_sad32xh_sse2, -1), - make_tuple(64, 32, &aom_sad64xh_sse2, -1), - make_tuple(64, 64, &aom_sad64xh_sse2, -1), - make_tuple(128, 128, &aom_sad128xh_sse2, -1), - make_tuple(128, 64, &aom_sad128xh_sse2, -1), - make_tuple(64, 128, &aom_sad64xh_sse2, -1), - make_tuple(4, 16, &aom_sad4xh_sse2, -1), - make_tuple(16, 4, &aom_sad16xh_sse2, -1), - make_tuple(8, 32, &aom_sad8xh_sse2, -1), - make_tuple(32, 8, &aom_sad32xh_sse2, -1), - make_tuple(16, 64, &aom_sad16xh_sse2, -1), - make_tuple(64, 16, &aom_sad64xh_sse2, -1), -}; -INSTANTIATE_TEST_CASE_P(SSE2, JntSADTest, - ::testing::ValuesIn(jnt_sad_sse2_tests)); - -#endif // HAVE_SSSE3 - -#if HAVE_SSE3 -// Only functions are x3, which do not have tests. -#endif // HAVE_SSE3 - -#if HAVE_SSSE3 -const JntCompAvgParam jnt_comp_avg_ssse3_tests[] = { - make_tuple(128, 128, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(128, 64, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(64, 128, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(64, 64, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(64, 32, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(32, 64, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(32, 32, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(32, 16, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(16, 32, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(16, 16, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(16, 8, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(8, 16, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(8, 8, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(8, 4, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(4, 8, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(4, 4, &aom_jnt_comp_avg_pred_ssse3, -1), - make_tuple(16, 16, &aom_jnt_comp_avg_pred_ssse3, -1), -}; - -INSTANTIATE_TEST_CASE_P(SSSE3, JntCompAvgTest, - ::testing::ValuesIn(jnt_comp_avg_ssse3_tests)); - -const JntSadMxNAvgParam jnt_avg_ssse3_tests[] = { - make_tuple(128, 128, &aom_jnt_sad128x128_avg_ssse3, -1), - make_tuple(128, 64, &aom_jnt_sad128x64_avg_ssse3, -1), - make_tuple(64, 128, &aom_jnt_sad64x128_avg_ssse3, -1), - make_tuple(64, 64, &aom_jnt_sad64x64_avg_ssse3, -1), - make_tuple(64, 32, &aom_jnt_sad64x32_avg_ssse3, -1), - make_tuple(32, 64, &aom_jnt_sad32x64_avg_ssse3, -1), - make_tuple(32, 32, &aom_jnt_sad32x32_avg_ssse3, -1), - make_tuple(32, 16, &aom_jnt_sad32x16_avg_ssse3, -1), - make_tuple(16, 32, &aom_jnt_sad16x32_avg_ssse3, -1), - make_tuple(16, 16, &aom_jnt_sad16x16_avg_ssse3, -1), - make_tuple(16, 8, &aom_jnt_sad16x8_avg_ssse3, -1), - make_tuple(8, 16, &aom_jnt_sad8x16_avg_ssse3, -1), - make_tuple(8, 8, &aom_jnt_sad8x8_avg_ssse3, -1), - make_tuple(8, 4, &aom_jnt_sad8x4_avg_ssse3, -1), - make_tuple(4, 8, &aom_jnt_sad4x8_avg_ssse3, -1), - make_tuple(4, 4, &aom_jnt_sad4x4_avg_ssse3, -1), -}; -INSTANTIATE_TEST_CASE_P(SSSE3, JntSADavgTest, - ::testing::ValuesIn(jnt_avg_ssse3_tests)); -#endif // HAVE_SSSE3 - -#if HAVE_SSE4_1 -// Only functions are x8, which do not have tests. -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -const SadMxNParam avx2_tests[] = { - make_tuple(64, 128, &aom_sad64x128_avx2, -1), - make_tuple(128, 64, &aom_sad128x64_avx2, -1), - make_tuple(128, 128, &aom_sad128x128_avx2, -1), - make_tuple(64, 64, &aom_sad64x64_avx2, -1), - make_tuple(64, 32, &aom_sad64x32_avx2, -1), - make_tuple(32, 64, &aom_sad32x64_avx2, -1), - make_tuple(32, 32, &aom_sad32x32_avx2, -1), - make_tuple(32, 16, &aom_sad32x16_avx2, -1), - make_tuple(128, 128, &aom_highbd_sad128x128_avx2, 8), - make_tuple(128, 128, &aom_highbd_sad128x128_avx2, 10), - make_tuple(128, 128, &aom_highbd_sad128x128_avx2, 12), - make_tuple(128, 64, &aom_highbd_sad128x64_avx2, 8), - make_tuple(128, 64, &aom_highbd_sad128x64_avx2, 10), - make_tuple(128, 64, &aom_highbd_sad128x64_avx2, 12), - make_tuple(64, 128, &aom_highbd_sad64x128_avx2, 8), - make_tuple(64, 128, &aom_highbd_sad64x128_avx2, 10), - make_tuple(64, 128, &aom_highbd_sad64x128_avx2, 12), - make_tuple(64, 64, &aom_highbd_sad64x64_avx2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_avx2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_avx2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_avx2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_avx2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_avx2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_avx2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_avx2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_avx2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_avx2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_avx2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_avx2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_avx2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_avx2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_avx2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_avx2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_avx2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_avx2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_avx2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_avx2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_avx2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_avx2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_avx2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_avx2, 12), -}; -INSTANTIATE_TEST_CASE_P(AVX2, SADTest, ::testing::ValuesIn(avx2_tests)); - -const SadMxNAvgParam avg_avx2_tests[] = { - make_tuple(64, 128, &aom_sad64x128_avg_avx2, -1), - make_tuple(128, 64, &aom_sad128x64_avg_avx2, -1), - make_tuple(128, 128, &aom_sad128x128_avg_avx2, -1), - make_tuple(64, 64, &aom_sad64x64_avg_avx2, -1), - make_tuple(64, 32, &aom_sad64x32_avg_avx2, -1), - make_tuple(32, 64, &aom_sad32x64_avg_avx2, -1), - make_tuple(32, 32, &aom_sad32x32_avg_avx2, -1), - make_tuple(32, 16, &aom_sad32x16_avg_avx2, -1), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_avx2, 8), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_avx2, 10), - make_tuple(128, 128, &aom_highbd_sad128x128_avg_avx2, 12), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_avx2, 8), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_avx2, 10), - make_tuple(128, 64, &aom_highbd_sad128x64_avg_avx2, 12), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_avx2, 8), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_avx2, 10), - make_tuple(64, 128, &aom_highbd_sad64x128_avg_avx2, 12), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_avx2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_avx2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64_avg_avx2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_avx2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_avx2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32_avg_avx2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_avx2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_avx2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64_avg_avx2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_avx2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_avx2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32_avg_avx2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_avx2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_avx2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16_avg_avx2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_avx2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_avx2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32_avg_avx2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_avx2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_avx2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16_avg_avx2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_avx2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_avx2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8_avg_avx2, 12), -}; -INSTANTIATE_TEST_CASE_P(AVX2, SADavgTest, ::testing::ValuesIn(avg_avx2_tests)); - -const SadMxNx4Param x4d_avx2_tests[] = { - make_tuple(64, 128, &aom_sad64x128x4d_avx2, -1), - make_tuple(128, 64, &aom_sad128x64x4d_avx2, -1), - make_tuple(128, 128, &aom_sad128x128x4d_avx2, -1), - make_tuple(64, 64, &aom_sad64x64x4d_avx2, -1), - make_tuple(32, 64, &aom_sad32x64x4d_avx2, -1), - make_tuple(64, 32, &aom_sad64x32x4d_avx2, -1), - make_tuple(32, 32, &aom_sad32x32x4d_avx2, -1), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_avx2, 8), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_avx2, 10), - make_tuple(128, 128, &aom_highbd_sad128x128x4d_avx2, 12), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_avx2, 8), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_avx2, 10), - make_tuple(128, 64, &aom_highbd_sad128x64x4d_avx2, 12), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_avx2, 8), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_avx2, 10), - make_tuple(64, 128, &aom_highbd_sad64x128x4d_avx2, 12), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_avx2, 8), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_avx2, 10), - make_tuple(64, 64, &aom_highbd_sad64x64x4d_avx2, 12), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_avx2, 8), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_avx2, 10), - make_tuple(64, 32, &aom_highbd_sad64x32x4d_avx2, 12), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_avx2, 8), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_avx2, 10), - make_tuple(32, 64, &aom_highbd_sad32x64x4d_avx2, 12), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_avx2, 8), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_avx2, 10), - make_tuple(32, 32, &aom_highbd_sad32x32x4d_avx2, 12), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_avx2, 8), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_avx2, 10), - make_tuple(32, 16, &aom_highbd_sad32x16x4d_avx2, 12), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_avx2, 8), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_avx2, 10), - make_tuple(16, 32, &aom_highbd_sad16x32x4d_avx2, 12), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_avx2, 8), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_avx2, 10), - make_tuple(16, 16, &aom_highbd_sad16x16x4d_avx2, 12), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_avx2, 8), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_avx2, 10), - make_tuple(16, 8, &aom_highbd_sad16x8x4d_avx2, 12), -}; -INSTANTIATE_TEST_CASE_P(AVX2, SADx4Test, ::testing::ValuesIn(x4d_avx2_tests)); -#endif // HAVE_AVX2 - -//------------------------------------------------------------------------------ -// MIPS functions -#if HAVE_MSA -const SadMxNParam msa_tests[] = { - make_tuple(64, 64, &aom_sad64x64_msa, -1), - make_tuple(64, 32, &aom_sad64x32_msa, -1), - make_tuple(32, 64, &aom_sad32x64_msa, -1), - make_tuple(32, 32, &aom_sad32x32_msa, -1), - make_tuple(32, 16, &aom_sad32x16_msa, -1), - make_tuple(16, 32, &aom_sad16x32_msa, -1), - make_tuple(16, 16, &aom_sad16x16_msa, -1), - make_tuple(16, 8, &aom_sad16x8_msa, -1), - make_tuple(8, 16, &aom_sad8x16_msa, -1), - make_tuple(8, 8, &aom_sad8x8_msa, -1), - make_tuple(8, 4, &aom_sad8x4_msa, -1), - make_tuple(4, 8, &aom_sad4x8_msa, -1), - make_tuple(4, 4, &aom_sad4x4_msa, -1), -}; -INSTANTIATE_TEST_CASE_P(MSA, SADTest, ::testing::ValuesIn(msa_tests)); - -const SadMxNAvgParam avg_msa_tests[] = { - make_tuple(64, 64, &aom_sad64x64_avg_msa, -1), - make_tuple(64, 32, &aom_sad64x32_avg_msa, -1), - make_tuple(32, 64, &aom_sad32x64_avg_msa, -1), - make_tuple(32, 32, &aom_sad32x32_avg_msa, -1), - make_tuple(32, 16, &aom_sad32x16_avg_msa, -1), - make_tuple(16, 32, &aom_sad16x32_avg_msa, -1), - make_tuple(16, 16, &aom_sad16x16_avg_msa, -1), - make_tuple(16, 8, &aom_sad16x8_avg_msa, -1), - make_tuple(8, 16, &aom_sad8x16_avg_msa, -1), - make_tuple(8, 8, &aom_sad8x8_avg_msa, -1), - make_tuple(8, 4, &aom_sad8x4_avg_msa, -1), - make_tuple(4, 8, &aom_sad4x8_avg_msa, -1), - make_tuple(4, 4, &aom_sad4x4_avg_msa, -1), -}; -INSTANTIATE_TEST_CASE_P(MSA, SADavgTest, ::testing::ValuesIn(avg_msa_tests)); - -const SadMxNx4Param x4d_msa_tests[] = { - make_tuple(64, 64, &aom_sad64x64x4d_msa, -1), - make_tuple(64, 32, &aom_sad64x32x4d_msa, -1), - make_tuple(32, 64, &aom_sad32x64x4d_msa, -1), - make_tuple(32, 32, &aom_sad32x32x4d_msa, -1), - make_tuple(32, 16, &aom_sad32x16x4d_msa, -1), - make_tuple(16, 32, &aom_sad16x32x4d_msa, -1), - make_tuple(16, 16, &aom_sad16x16x4d_msa, -1), - make_tuple(16, 8, &aom_sad16x8x4d_msa, -1), - make_tuple(8, 16, &aom_sad8x16x4d_msa, -1), - make_tuple(8, 8, &aom_sad8x8x4d_msa, -1), - make_tuple(8, 4, &aom_sad8x4x4d_msa, -1), - make_tuple(4, 8, &aom_sad4x8x4d_msa, -1), - make_tuple(4, 4, &aom_sad4x4x4d_msa, -1), -}; -INSTANTIATE_TEST_CASE_P(MSA, SADx4Test, ::testing::ValuesIn(x4d_msa_tests)); -#endif // HAVE_MSA - -} // namespace diff --git a/third_party/aom/test/scalability_test.cc b/third_party/aom/test/scalability_test.cc deleted file mode 100644 index b39918861..000000000 --- a/third_party/aom/test/scalability_test.cc +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/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 { - -const int kCpuUsed = 8; -const int kBaseLayerQp = 55; -const int kEnhancementLayerQp = 20; - -class ScalabilityTest - : public ::libaom_test::CodecTestWithParam<libaom_test::TestMode>, - public ::libaom_test::EncoderTest { - protected: - ScalabilityTest() : EncoderTest(GET_PARAM(0)) {} - virtual ~ScalabilityTest() {} - - virtual void SetUp() { - InitializeConfig(); - SetMode(GET_PARAM(1)); - num_spatial_layers_ = 2; - } - - virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, - ::libaom_test::Encoder *encoder) { - if (video->frame() == 0) { - encoder->Control(AOME_SET_CPUUSED, kCpuUsed); - encoder->Control(AOME_SET_NUMBER_SPATIAL_LAYERS, num_spatial_layers_); - } else if (video->frame() % num_spatial_layers_) { - frame_flags_ = AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | - AOM_EFLAG_NO_UPD_ARF | AOM_EFLAG_NO_UPD_ENTROPY; - encoder->Control(AOME_SET_SPATIAL_LAYER_ID, 1); - encoder->Control(AOME_SET_CQ_LEVEL, kEnhancementLayerQp); - } else { - frame_flags_ = AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 | - AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | - AOM_EFLAG_NO_REF_BWD | AOM_EFLAG_NO_REF_ARF2 | - AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF | - AOM_EFLAG_NO_UPD_ENTROPY; - encoder->Control(AOME_SET_SPATIAL_LAYER_ID, 0); - encoder->Control(AOME_SET_CQ_LEVEL, kBaseLayerQp); - } - } - - void DoTest(int num_spatial_layers) { - num_spatial_layers_ = num_spatial_layers; - cfg_.rc_end_usage = AOM_Q; - cfg_.g_lag_in_frames = 0; - - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, - 288, 30, 1, 0, 18); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - } - - int num_spatial_layers_; -}; - -TEST_P(ScalabilityTest, TestNoMismatch2SpatialLayers) { DoTest(2); } - -TEST_P(ScalabilityTest, TestNoMismatch3SpatialLayers) { DoTest(3); } - -AV1_INSTANTIATE_TEST_CASE(ScalabilityTest, - ::testing::Values(::libaom_test::kRealTime)); - -} // namespace diff --git a/third_party/aom/test/scan_test.cc b/third_party/aom/test/scan_test.cc deleted file mode 100644 index dee2ab5a6..000000000 --- a/third_party/aom/test/scan_test.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "av1/common/scan.h" -#include "av1/common/txb_common.h" -#include "test/av1_txfm_test.h" - -static int scan_test(const int16_t *scan, const int16_t *iscan, int si, int r, - int c, int w) { - if (iscan[r * w + c] != si || scan[si] != r * w + c) { - printf("r %d c %d ref_iscan %d iscan %d ref_scan %d scan %d\n", r, c, si, - iscan[r * w + c], r * w + c, scan[si]); - return 1; - } else { - return 0; - } -} - -int scan_order_test(const SCAN_ORDER *scan_order, int w, int h, - SCAN_MODE mode) { - const int16_t *scan = scan_order->scan; - const int16_t *iscan = scan_order->iscan; - int dim = w + h - 1; - if (mode == SCAN_MODE_ZIG_ZAG) { - int si = 0; - for (int i = 0; i < dim; ++i) { - if (i % 2 == 0) { - for (int c = 0; c < w; ++c) { - int r = i - c; - if (r >= 0 && r < h) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } else { - for (int r = 0; r < h; ++r) { - int c = i - r; - if (c >= 0 && c < w) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } - } - } else if (mode == SCAN_MODE_COL_DIAG) { - int si = 0; - for (int i = 0; i < dim; ++i) { - for (int c = 0; c < w; ++c) { - int r = i - c; - if (r >= 0 && r < h) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } - } else if (mode == SCAN_MODE_ROW_DIAG) { - int si = 0; - for (int i = 0; i < dim; ++i) { - for (int r = 0; r < h; ++r) { - int c = i - r; - if (c >= 0 && c < w) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } - } else if (mode == SCAN_MODE_ROW_1D) { - int si = 0; - for (int r = 0; r < h; ++r) { - for (int c = 0; c < w; ++c) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } else { - assert(mode == SCAN_MODE_COL_1D); - int si = 0; - for (int c = 0; c < w; ++c) { - for (int r = 0; r < h; ++r) { - if (scan_test(scan, iscan, si, r, c, w)) return 1; - ++si; - } - } - } - return 0; -} - -TEST(Av1ScanTest, Dependency) { - for (int tx_size = TX_4X4; tx_size < TX_SIZES_ALL; ++tx_size) { - const int org_rows = tx_size_high[(TX_SIZE)tx_size]; - const int org_cols = tx_size_wide[(TX_SIZE)tx_size]; - const int rows = get_txb_high((TX_SIZE)tx_size); - const int cols = get_txb_wide((TX_SIZE)tx_size); - for (int tx_type = 0; tx_type < TX_TYPES; ++tx_type) { - if (libaom_test::IsTxSizeTypeValid(static_cast<TX_SIZE>(tx_size), - static_cast<TX_TYPE>(tx_type)) == - false) { - continue; - } - SCAN_MODE scan_mode; - TX_CLASS tx_class = tx_type_to_class[(TX_TYPE)tx_type]; - if (tx_class == TX_CLASS_2D) { - if (rows == cols) { - scan_mode = SCAN_MODE_ZIG_ZAG; - } else if (rows > cols) { - scan_mode = SCAN_MODE_ROW_DIAG; - } else { - scan_mode = SCAN_MODE_COL_DIAG; - } - } else if (tx_class == TX_CLASS_VERT) { - scan_mode = SCAN_MODE_ROW_1D; - } else { - assert(tx_class == TX_CLASS_HORIZ); - scan_mode = SCAN_MODE_COL_1D; - } - const SCAN_ORDER *scan_order = - get_default_scan((TX_SIZE)tx_size, (TX_TYPE)tx_type); - ASSERT_EQ(scan_order_test(scan_order, cols, rows, scan_mode), 0) - << "scan mismatch tx_class " << tx_class << " tx_type " << tx_type - << " tx_w " << org_cols << " tx_h " << org_rows << " scan_mode " - << scan_mode << "\n"; - } - } -} diff --git a/third_party/aom/test/segment_binarization_sync.cc b/third_party/aom/test/segment_binarization_sync.cc deleted file mode 100644 index bd8cf1141..000000000 --- a/third_party/aom/test/segment_binarization_sync.cc +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" - -using libaom_test::ACMRandom; - -extern "C" { -int av1_neg_interleave(int x, int ref, int max); -int av1_neg_deinterleave(int diff, int ref, int max); -} - -namespace { - -struct Segment { - int id; - int pred; - int last_id; -}; - -Segment GenerateSegment(int seed) { - static const int MAX_SEGMENTS = 8; - - ACMRandom rnd_(seed); - - Segment segment; - const int last_segid = rnd_.PseudoUniform(MAX_SEGMENTS); - segment.last_id = last_segid; - segment.pred = rnd_.PseudoUniform(MAX_SEGMENTS); - segment.id = rnd_.PseudoUniform(last_segid + 1); - - return segment; -} - -// Try to reveal a mismatch between segment binarization and debinarization -TEST(SegmentBinarizationSync, SearchForBinarizationMismatch) { - const int count_tests = 1000; - const int seed_init = 4321; - - for (int i = 0; i < count_tests; ++i) { - const Segment seg = GenerateSegment(seed_init + i); - - const int max_segid = seg.last_id + 1; - const int seg_diff = av1_neg_interleave(seg.id, seg.pred, max_segid); - const int decoded_segid = - av1_neg_deinterleave(seg_diff, seg.pred, max_segid); - - ASSERT_EQ(decoded_segid, seg.id); - } -} - -} // namespace diff --git a/third_party/aom/test/selfguided_filter_test.cc b/third_party/aom/test/selfguided_filter_test.cc deleted file mode 100644 index d2d5c6105..000000000 --- a/third_party/aom/test/selfguided_filter_test.cc +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <ctime> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/av1_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" - -#include "aom_ports/aom_timer.h" -#include "av1/common/mv.h" -#include "av1/common/restoration.h" - -namespace { - -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; - -typedef void (*SgrFunc)(const uint8_t *dat8, int width, int height, int stride, - int eps, const int *xqd, uint8_t *dst8, int dst_stride, - int32_t *tmpbuf, int bit_depth, int highbd); - -// Test parameter list: -// <tst_fun_> -typedef tuple<SgrFunc> FilterTestParam; - -class AV1SelfguidedFilterTest - : public ::testing::TestWithParam<FilterTestParam> { - public: - virtual ~AV1SelfguidedFilterTest() {} - virtual void SetUp() {} - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunSpeedTest() { - tst_fun_ = GET_PARAM(0); - const int pu_width = RESTORATION_PROC_UNIT_SIZE; - const int pu_height = RESTORATION_PROC_UNIT_SIZE; - const int width = 256, height = 256, stride = 288, out_stride = 288; - const int NUM_ITERS = 2000; - int i, j, k; - - uint8_t *input_ = - (uint8_t *)aom_memalign(32, stride * (height + 32) * sizeof(uint8_t)); - uint8_t *output_ = (uint8_t *)aom_memalign( - 32, out_stride * (height + 32) * sizeof(uint8_t)); - int32_t *tmpbuf = (int32_t *)aom_memalign(32, RESTORATION_TMPBUF_SIZE); - uint8_t *input = input_ + stride * 16 + 16; - uint8_t *output = output_ + out_stride * 16 + 16; - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - for (i = -16; i < height + 16; ++i) - for (j = -16; j < width + 16; ++j) - input[i * stride + j] = rnd.Rand16() & 0xFF; - - int xqd[2] = { SGRPROJ_PRJ_MIN0 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX0 + 1 - - SGRPROJ_PRJ_MIN0), - SGRPROJ_PRJ_MIN1 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX1 + 1 - - SGRPROJ_PRJ_MIN1) }; - // Fix a parameter set, since the speed depends slightly on r. - // Change this to test different combinations of values of r. - int eps = 15; - - av1_loop_restoration_precal(); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (i = 0; i < NUM_ITERS; ++i) { - for (k = 0; k < height; k += pu_height) - for (j = 0; j < width; j += pu_width) { - int w = AOMMIN(pu_width, width - j); - int h = AOMMIN(pu_height, height - k); - uint8_t *input_p = input + k * stride + j; - uint8_t *output_p = output + k * out_stride + j; - apply_selfguided_restoration_c(input_p, w, h, stride, eps, xqd, - output_p, out_stride, tmpbuf, 8, 0); - } - } - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (i = 0; i < NUM_ITERS; ++i) { - for (k = 0; k < height; k += pu_height) - for (j = 0; j < width; j += pu_width) { - int w = AOMMIN(pu_width, width - j); - int h = AOMMIN(pu_height, height - k); - uint8_t *input_p = input + k * stride + j; - uint8_t *output_p = output + k * out_stride + j; - tst_fun_(input_p, w, h, stride, eps, xqd, output_p, out_stride, - tmpbuf, 8, 0); - } - } - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: AV1SelfguidedFilterTest.SpeedTest, SIMD slower than C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - - aom_free(input_); - aom_free(output_); - aom_free(tmpbuf); - } - - void RunCorrectnessTest() { - tst_fun_ = GET_PARAM(0); - const int pu_width = RESTORATION_PROC_UNIT_SIZE; - const int pu_height = RESTORATION_PROC_UNIT_SIZE; - // Set the maximum width/height to test here. We actually test a small - // range of sizes *up to* this size, so that we can check, eg., - // the behaviour on tiles which are not a multiple of 4 wide. - const int max_w = 260, max_h = 260, stride = 672, out_stride = 672; - const int NUM_ITERS = 81; - int i, j, k; - - uint8_t *input_ = - (uint8_t *)aom_memalign(32, stride * (max_h + 32) * sizeof(uint8_t)); - uint8_t *output_ = (uint8_t *)aom_memalign( - 32, out_stride * (max_h + 32) * sizeof(uint8_t)); - uint8_t *output2_ = (uint8_t *)aom_memalign( - 32, out_stride * (max_h + 32) * sizeof(uint8_t)); - int32_t *tmpbuf = (int32_t *)aom_memalign(32, RESTORATION_TMPBUF_SIZE); - - uint8_t *input = input_ + stride * 16 + 16; - uint8_t *output = output_ + out_stride * 16 + 16; - uint8_t *output2 = output2_ + out_stride * 16 + 16; - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - av1_loop_restoration_precal(); - - for (i = 0; i < NUM_ITERS; ++i) { - for (j = -16; j < max_h + 16; ++j) - for (k = -16; k < max_w + 16; ++k) - input[j * stride + k] = rnd.Rand16() & 0xFF; - - int xqd[2] = { SGRPROJ_PRJ_MIN0 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX0 + 1 - - SGRPROJ_PRJ_MIN0), - SGRPROJ_PRJ_MIN1 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX1 + 1 - - SGRPROJ_PRJ_MIN1) }; - int eps = rnd.PseudoUniform(1 << SGRPROJ_PARAMS_BITS); - - // Test various tile sizes around 256x256 - int test_w = max_w - (i / 9); - int test_h = max_h - (i % 9); - - for (k = 0; k < test_h; k += pu_height) - for (j = 0; j < test_w; j += pu_width) { - int w = AOMMIN(pu_width, test_w - j); - int h = AOMMIN(pu_height, test_h - k); - uint8_t *input_p = input + k * stride + j; - uint8_t *output_p = output + k * out_stride + j; - uint8_t *output2_p = output2 + k * out_stride + j; - tst_fun_(input_p, w, h, stride, eps, xqd, output_p, out_stride, - tmpbuf, 8, 0); - apply_selfguided_restoration_c(input_p, w, h, stride, eps, xqd, - output2_p, out_stride, tmpbuf, 8, 0); - } - - for (j = 0; j < test_h; ++j) - for (k = 0; k < test_w; ++k) { - ASSERT_EQ(output[j * out_stride + k], output2[j * out_stride + k]); - } - } - - aom_free(input_); - aom_free(output_); - aom_free(output2_); - aom_free(tmpbuf); - } - - private: - SgrFunc tst_fun_; -}; - -TEST_P(AV1SelfguidedFilterTest, DISABLED_SpeedTest) { RunSpeedTest(); } -TEST_P(AV1SelfguidedFilterTest, CorrectnessTest) { RunCorrectnessTest(); } - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1SelfguidedFilterTest, - ::testing::Values(apply_selfguided_restoration_sse4_1)); -#endif - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AV1SelfguidedFilterTest, - ::testing::Values(apply_selfguided_restoration_avx2)); -#endif - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, AV1SelfguidedFilterTest, - ::testing::Values(apply_selfguided_restoration_neon)); -#endif - -// Test parameter list: -// <tst_fun_, bit_depth> -typedef tuple<SgrFunc, int> HighbdFilterTestParam; - -class AV1HighbdSelfguidedFilterTest - : public ::testing::TestWithParam<HighbdFilterTestParam> { - public: - virtual ~AV1HighbdSelfguidedFilterTest() {} - virtual void SetUp() {} - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - void RunSpeedTest() { - tst_fun_ = GET_PARAM(0); - const int pu_width = RESTORATION_PROC_UNIT_SIZE; - const int pu_height = RESTORATION_PROC_UNIT_SIZE; - const int width = 256, height = 256, stride = 288, out_stride = 288; - const int NUM_ITERS = 2000; - int i, j, k; - int bit_depth = GET_PARAM(1); - int mask = (1 << bit_depth) - 1; - - uint16_t *input_ = - (uint16_t *)aom_memalign(32, stride * (height + 32) * sizeof(uint16_t)); - uint16_t *output_ = (uint16_t *)aom_memalign( - 32, out_stride * (height + 32) * sizeof(uint16_t)); - int32_t *tmpbuf = (int32_t *)aom_memalign(32, RESTORATION_TMPBUF_SIZE); - uint16_t *input = input_ + stride * 16 + 16; - uint16_t *output = output_ + out_stride * 16 + 16; - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - for (i = -16; i < height + 16; ++i) - for (j = -16; j < width + 16; ++j) - input[i * stride + j] = rnd.Rand16() & mask; - - int xqd[2] = { SGRPROJ_PRJ_MIN0 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX0 + 1 - - SGRPROJ_PRJ_MIN0), - SGRPROJ_PRJ_MIN1 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX1 + 1 - - SGRPROJ_PRJ_MIN1) }; - // Fix a parameter set, since the speed depends slightly on r. - // Change this to test different combinations of values of r. - int eps = 15; - - av1_loop_restoration_precal(); - - aom_usec_timer ref_timer; - aom_usec_timer_start(&ref_timer); - for (i = 0; i < NUM_ITERS; ++i) { - for (k = 0; k < height; k += pu_height) - for (j = 0; j < width; j += pu_width) { - int w = AOMMIN(pu_width, width - j); - int h = AOMMIN(pu_height, height - k); - uint16_t *input_p = input + k * stride + j; - uint16_t *output_p = output + k * out_stride + j; - apply_selfguided_restoration_c( - CONVERT_TO_BYTEPTR(input_p), w, h, stride, eps, xqd, - CONVERT_TO_BYTEPTR(output_p), out_stride, tmpbuf, bit_depth, 1); - } - } - aom_usec_timer_mark(&ref_timer); - const int64_t ref_time = aom_usec_timer_elapsed(&ref_timer); - - aom_usec_timer tst_timer; - aom_usec_timer_start(&tst_timer); - for (i = 0; i < NUM_ITERS; ++i) { - for (k = 0; k < height; k += pu_height) - for (j = 0; j < width; j += pu_width) { - int w = AOMMIN(pu_width, width - j); - int h = AOMMIN(pu_height, height - k); - uint16_t *input_p = input + k * stride + j; - uint16_t *output_p = output + k * out_stride + j; - tst_fun_(CONVERT_TO_BYTEPTR(input_p), w, h, stride, eps, xqd, - CONVERT_TO_BYTEPTR(output_p), out_stride, tmpbuf, bit_depth, - 1); - } - } - aom_usec_timer_mark(&tst_timer); - const int64_t tst_time = aom_usec_timer_elapsed(&tst_timer); - - std::cout << "[ ] C time = " << ref_time / 1000 - << " ms, SIMD time = " << tst_time / 1000 << " ms\n"; - - EXPECT_GT(ref_time, tst_time) - << "Error: AV1HighbdSelfguidedFilterTest.SpeedTest, SIMD slower than " - "C.\n" - << "C time: " << ref_time << " us\n" - << "SIMD time: " << tst_time << " us\n"; - - aom_free(input_); - aom_free(output_); - aom_free(tmpbuf); - } - - void RunCorrectnessTest() { - tst_fun_ = GET_PARAM(0); - const int pu_width = RESTORATION_PROC_UNIT_SIZE; - const int pu_height = RESTORATION_PROC_UNIT_SIZE; - // Set the maximum width/height to test here. We actually test a small - // range of sizes *up to* this size, so that we can check, eg., - // the behaviour on tiles which are not a multiple of 4 wide. - const int max_w = 260, max_h = 260, stride = 672, out_stride = 672; - const int NUM_ITERS = 81; - int i, j, k; - int bit_depth = GET_PARAM(1); - int mask = (1 << bit_depth) - 1; - - uint16_t *input_ = - (uint16_t *)aom_memalign(32, stride * (max_h + 32) * sizeof(uint16_t)); - uint16_t *output_ = (uint16_t *)aom_memalign( - 32, out_stride * (max_h + 32) * sizeof(uint16_t)); - uint16_t *output2_ = (uint16_t *)aom_memalign( - 32, out_stride * (max_h + 32) * sizeof(uint16_t)); - int32_t *tmpbuf = (int32_t *)aom_memalign(32, RESTORATION_TMPBUF_SIZE); - - uint16_t *input = input_ + stride * 16 + 16; - uint16_t *output = output_ + out_stride * 16 + 16; - uint16_t *output2 = output2_ + out_stride * 16 + 16; - - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - av1_loop_restoration_precal(); - - for (i = 0; i < NUM_ITERS; ++i) { - for (j = -16; j < max_h + 16; ++j) - for (k = -16; k < max_w + 16; ++k) - input[j * stride + k] = rnd.Rand16() & mask; - - int xqd[2] = { SGRPROJ_PRJ_MIN0 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX0 + 1 - - SGRPROJ_PRJ_MIN0), - SGRPROJ_PRJ_MIN1 + rnd.PseudoUniform(SGRPROJ_PRJ_MAX1 + 1 - - SGRPROJ_PRJ_MIN1) }; - int eps = rnd.PseudoUniform(1 << SGRPROJ_PARAMS_BITS); - - // Test various tile sizes around 256x256 - int test_w = max_w - (i / 9); - int test_h = max_h - (i % 9); - - for (k = 0; k < test_h; k += pu_height) - for (j = 0; j < test_w; j += pu_width) { - int w = AOMMIN(pu_width, test_w - j); - int h = AOMMIN(pu_height, test_h - k); - uint16_t *input_p = input + k * stride + j; - uint16_t *output_p = output + k * out_stride + j; - uint16_t *output2_p = output2 + k * out_stride + j; - tst_fun_(CONVERT_TO_BYTEPTR(input_p), w, h, stride, eps, xqd, - CONVERT_TO_BYTEPTR(output_p), out_stride, tmpbuf, bit_depth, - 1); - apply_selfguided_restoration_c( - CONVERT_TO_BYTEPTR(input_p), w, h, stride, eps, xqd, - CONVERT_TO_BYTEPTR(output2_p), out_stride, tmpbuf, bit_depth, 1); - } - - for (j = 0; j < test_h; ++j) - for (k = 0; k < test_w; ++k) - ASSERT_EQ(output[j * out_stride + k], output2[j * out_stride + k]); - } - - aom_free(input_); - aom_free(output_); - aom_free(output2_); - aom_free(tmpbuf); - } - - private: - SgrFunc tst_fun_; -}; - -TEST_P(AV1HighbdSelfguidedFilterTest, DISABLED_SpeedTest) { RunSpeedTest(); } -TEST_P(AV1HighbdSelfguidedFilterTest, CorrectnessTest) { RunCorrectnessTest(); } - -#if HAVE_SSE4_1 -const int highbd_params_sse4_1[] = { 8, 10, 12 }; -INSTANTIATE_TEST_CASE_P( - SSE4_1, AV1HighbdSelfguidedFilterTest, - ::testing::Combine(::testing::Values(apply_selfguided_restoration_sse4_1), - ::testing::ValuesIn(highbd_params_sse4_1))); -#endif - -#if HAVE_AVX2 -const int highbd_params_avx2[] = { 8, 10, 12 }; -INSTANTIATE_TEST_CASE_P( - AVX2, AV1HighbdSelfguidedFilterTest, - ::testing::Combine(::testing::Values(apply_selfguided_restoration_avx2), - ::testing::ValuesIn(highbd_params_avx2))); -#endif -#if HAVE_NEON -const int highbd_params_neon[] = { 8, 10, 12 }; -INSTANTIATE_TEST_CASE_P( - NEON, AV1HighbdSelfguidedFilterTest, - ::testing::Combine(::testing::Values(apply_selfguided_restoration_neon), - ::testing::ValuesIn(highbd_params_neon))); -#endif -} // namespace diff --git a/third_party/aom/test/set_maps.sh b/third_party/aom/test/set_maps.sh deleted file mode 100755 index 4f59b06d6..000000000 --- a/third_party/aom/test/set_maps.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom set_maps example. To add new tests to this file, -## do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to set_maps_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: $YUV_RAW_INPUT is required, and set_maps must exist in -# $LIBAOM_BIN_PATH. -set_maps_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi - if [ -z "$(aom_tool_path set_maps)" ]; then - elog "set_maps not found. It must exist in LIBAOM_BIN_PATH or its parent." - return 1 - fi -} - -# Runs set_maps using the codec specified by $1. -set_maps() { - local encoder="$(aom_tool_path set_maps)" - local codec="$1" - local output_file="${AOM_TEST_OUTPUT_DIR}/set_maps_${codec}.ivf" - - eval "${AOM_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ - "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" \ - ${devnull} - - [ -e "${output_file}" ] || return 1 -} - -set_maps_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - set_maps av1 || return 1 - fi -} - -set_maps_tests="set_maps_av1" - -run_tests set_maps_verify_environment "${set_maps_tests}" diff --git a/third_party/aom/test/simd_avx2_test.cc b/third_party/aom/test/simd_avx2_test.cc deleted file mode 100644 index 8a012bff8..000000000 --- a/third_party/aom/test/simd_avx2_test.cc +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#define ARCH AVX2 -#define ARCH_POSTFIX(name) name##_avx2 -#define SIMD_NAMESPACE simd_test_avx2 -#include "test/simd_impl.h" diff --git a/third_party/aom/test/simd_cmp_avx2.cc b/third_party/aom/test/simd_cmp_avx2.cc deleted file mode 100644 index cda632bcd..000000000 --- a/third_party/aom/test/simd_cmp_avx2.cc +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#define ARCH AVX2 -#define ARCH_POSTFIX(name) name##_avx2 -#define SIMD_NAMESPACE simd_test_avx2 -#include "test/simd_cmp_impl.h" diff --git a/third_party/aom/test/simd_cmp_impl.h b/third_party/aom/test/simd_cmp_impl.h deleted file mode 100644 index b98af9aad..000000000 --- a/third_party/aom/test/simd_cmp_impl.h +++ /dev/null @@ -1,2171 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <assert.h> -#include <string> - -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "aom_dsp/aom_simd.h" -#undef SIMD_INLINE -#define SIMD_INLINE static // Don't enforce inlining -#include "aom_dsp/simd/v256_intrinsics_c.h" - -// Machine tuned code goes into this file. This file is included from -// simd_cmp_sse2.cc, simd_cmp_ssse3.cc etc which define the macros -// ARCH (=neon, sse2, ssse3, etc), SIMD_NAMESPACE and ARCH_POSTFIX(). - -#ifdef _MSC_VER -// Disable "value of intrinsic immediate argument 'value' is out of range -// 'lowerbound - upperbound'" warning. Visual Studio emits this warning though -// the parameters are conditionally checked in e.g., v256_shr_n_byte. Adding a -// mask doesn't always appear to be sufficient. -#pragma warning(disable : 4556) -#endif - -using libaom_test::ACMRandom; - -namespace SIMD_NAMESPACE { - -// Wrap templates around intrinsics using immediate values -template <int shift> -v64 imm_v64_shl_n_byte(v64 a) { - return v64_shl_n_byte(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_byte(v64 a) { - return v64_shr_n_byte(a, shift); -} -template <int shift> -v64 imm_v64_shl_n_8(v64 a) { - return v64_shl_n_8(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_u8(v64 a) { - return v64_shr_n_u8(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_s8(v64 a) { - return v64_shr_n_s8(a, shift); -} -template <int shift> -v64 imm_v64_shl_n_16(v64 a) { - return v64_shl_n_16(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_u16(v64 a) { - return v64_shr_n_u16(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_s16(v64 a) { - return v64_shr_n_s16(a, shift); -} -template <int shift> -v64 imm_v64_shl_n_32(v64 a) { - return v64_shl_n_32(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_u32(v64 a) { - return v64_shr_n_u32(a, shift); -} -template <int shift> -v64 imm_v64_shr_n_s32(v64 a) { - return v64_shr_n_s32(a, shift); -} -template <int shift> -v64 imm_v64_align(v64 a, v64 b) { - return v64_align(a, b, shift); -} - -// Wrap templates around corresponding C implementations of the above -template <int shift> -c_v64 c_imm_v64_shl_n_byte(c_v64 a) { - return c_v64_shl_n_byte(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_byte(c_v64 a) { - return c_v64_shr_n_byte(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shl_n_8(c_v64 a) { - return c_v64_shl_n_8(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_u8(c_v64 a) { - return c_v64_shr_n_u8(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_s8(c_v64 a) { - return c_v64_shr_n_s8(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shl_n_16(c_v64 a) { - return c_v64_shl_n_16(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_u16(c_v64 a) { - return c_v64_shr_n_u16(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_s16(c_v64 a) { - return c_v64_shr_n_s16(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shl_n_32(c_v64 a) { - return c_v64_shl_n_32(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_u32(c_v64 a) { - return c_v64_shr_n_u32(a, shift); -} -template <int shift> -c_v64 c_imm_v64_shr_n_s32(c_v64 a) { - return c_v64_shr_n_s32(a, shift); -} -template <int shift> -c_v64 c_imm_v64_align(c_v64 a, c_v64 b) { - return c_v64_align(a, b, shift); -} - -template <int shift> -v128 imm_v128_shl_n_byte(v128 a) { - return v128_shl_n_byte(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_byte(v128 a) { - return v128_shr_n_byte(a, shift); -} -template <int shift> -v128 imm_v128_shl_n_8(v128 a) { - return v128_shl_n_8(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_u8(v128 a) { - return v128_shr_n_u8(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_s8(v128 a) { - return v128_shr_n_s8(a, shift); -} -template <int shift> -v128 imm_v128_shl_n_16(v128 a) { - return v128_shl_n_16(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_u16(v128 a) { - return v128_shr_n_u16(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_s16(v128 a) { - return v128_shr_n_s16(a, shift); -} -template <int shift> -v128 imm_v128_shl_n_32(v128 a) { - return v128_shl_n_32(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_u32(v128 a) { - return v128_shr_n_u32(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_s32(v128 a) { - return v128_shr_n_s32(a, shift); -} -template <int shift> -v128 imm_v128_shl_n_64(v128 a) { - return v128_shl_n_64(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_u64(v128 a) { - return v128_shr_n_u64(a, shift); -} -template <int shift> -v128 imm_v128_shr_n_s64(v128 a) { - return v128_shr_n_s64(a, shift); -} -template <int shift> -v128 imm_v128_align(v128 a, v128 b) { - return v128_align(a, b, shift); -} - -template <int shift> -c_v128 c_imm_v128_shl_n_byte(c_v128 a) { - return c_v128_shl_n_byte(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_byte(c_v128 a) { - return c_v128_shr_n_byte(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shl_n_8(c_v128 a) { - return c_v128_shl_n_8(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_u8(c_v128 a) { - return c_v128_shr_n_u8(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_s8(c_v128 a) { - return c_v128_shr_n_s8(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shl_n_16(c_v128 a) { - return c_v128_shl_n_16(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_u16(c_v128 a) { - return c_v128_shr_n_u16(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_s16(c_v128 a) { - return c_v128_shr_n_s16(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shl_n_32(c_v128 a) { - return c_v128_shl_n_32(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_u32(c_v128 a) { - return c_v128_shr_n_u32(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_s32(c_v128 a) { - return c_v128_shr_n_s32(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shl_n_64(c_v128 a) { - return c_v128_shl_n_64(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_u64(c_v128 a) { - return c_v128_shr_n_u64(a, shift); -} -template <int shift> -c_v128 c_imm_v128_shr_n_s64(c_v128 a) { - return c_v128_shr_n_s64(a, shift); -} -template <int shift> -c_v128 c_imm_v128_align(c_v128 a, c_v128 b) { - return c_v128_align(a, b, shift); -} - -template <int shift> -v256 imm_v256_shl_n_word(v256 a) { - return v256_shl_n_word(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_word(v256 a) { - return v256_shr_n_word(a, shift); -} -template <int shift> -v256 imm_v256_shl_n_byte(v256 a) { - return v256_shl_n_byte(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_byte(v256 a) { - return v256_shr_n_byte(a, shift); -} -template <int shift> -v256 imm_v256_shl_n_8(v256 a) { - return v256_shl_n_8(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_u8(v256 a) { - return v256_shr_n_u8(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_s8(v256 a) { - return v256_shr_n_s8(a, shift); -} -template <int shift> -v256 imm_v256_shl_n_16(v256 a) { - return v256_shl_n_16(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_u16(v256 a) { - return v256_shr_n_u16(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_s16(v256 a) { - return v256_shr_n_s16(a, shift); -} -template <int shift> -v256 imm_v256_shl_n_32(v256 a) { - return v256_shl_n_32(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_u32(v256 a) { - return v256_shr_n_u32(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_s32(v256 a) { - return v256_shr_n_s32(a, shift); -} -template <int shift> -v256 imm_v256_shl_n_64(v256 a) { - return v256_shl_n_64(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_u64(v256 a) { - return v256_shr_n_u64(a, shift); -} -template <int shift> -v256 imm_v256_shr_n_s64(v256 a) { - return v256_shr_n_s64(a, shift); -} -template <int shift> -v256 imm_v256_align(v256 a, v256 b) { - return v256_align(a, b, shift); -} - -template <int shift> -c_v256 c_imm_v256_shl_n_word(c_v256 a) { - return c_v256_shl_n_word(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_word(c_v256 a) { - return c_v256_shr_n_word(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shl_n_byte(c_v256 a) { - return c_v256_shl_n_byte(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_byte(c_v256 a) { - return c_v256_shr_n_byte(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shl_n_8(c_v256 a) { - return c_v256_shl_n_8(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_u8(c_v256 a) { - return c_v256_shr_n_u8(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_s8(c_v256 a) { - return c_v256_shr_n_s8(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shl_n_16(c_v256 a) { - return c_v256_shl_n_16(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_u16(c_v256 a) { - return c_v256_shr_n_u16(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_s16(c_v256 a) { - return c_v256_shr_n_s16(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shl_n_32(c_v256 a) { - return c_v256_shl_n_32(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_u32(c_v256 a) { - return c_v256_shr_n_u32(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_s32(c_v256 a) { - return c_v256_shr_n_s32(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shl_n_64(c_v256 a) { - return c_v256_shl_n_64(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_u64(c_v256 a) { - return c_v256_shr_n_u64(a, shift); -} -template <int shift> -c_v256 c_imm_v256_shr_n_s64(c_v256 a) { - return c_v256_shr_n_s64(a, shift); -} -template <int shift> -c_v256 c_imm_v256_align(c_v256 a, c_v256 b) { - return c_v256_align(a, b, shift); -} - -// Wrappers around the the SAD and SSD functions -uint32_t v64_sad_u8(v64 a, v64 b) { - return v64_sad_u8_sum(::v64_sad_u8(v64_sad_u8_init(), a, b)); -} -uint32_t v64_ssd_u8(v64 a, v64 b) { - return v64_ssd_u8_sum(::v64_ssd_u8(v64_ssd_u8_init(), a, b)); -} - -uint32_t c_v64_sad_u8(c_v64 a, c_v64 b) { - return c_v64_sad_u8_sum(::c_v64_sad_u8(c_v64_sad_u8_init(), a, b)); -} -uint32_t c_v64_ssd_u8(c_v64 a, c_v64 b) { - return c_v64_ssd_u8_sum(::c_v64_ssd_u8(c_v64_ssd_u8_init(), a, b)); -} -uint32_t v128_sad_u8(v128 a, v128 b) { - return v128_sad_u8_sum(::v128_sad_u8(v128_sad_u8_init(), a, b)); -} -uint32_t v128_ssd_u8(v128 a, v128 b) { - return v128_ssd_u8_sum(::v128_ssd_u8(v128_ssd_u8_init(), a, b)); -} -uint32_t c_v128_sad_u8(c_v128 a, c_v128 b) { - return c_v128_sad_u8_sum(::c_v128_sad_u8(c_v128_sad_u8_init(), a, b)); -} -uint32_t c_v128_ssd_u8(c_v128 a, c_v128 b) { - return c_v128_ssd_u8_sum(::c_v128_ssd_u8(c_v128_ssd_u8_init(), a, b)); -} -uint32_t v128_sad_u16(v128 a, v128 b) { - return v128_sad_u16_sum(::v128_sad_u16(v128_sad_u16_init(), a, b)); -} -uint64_t v128_ssd_s16(v128 a, v128 b) { - return v128_ssd_s16_sum(::v128_ssd_s16(v128_ssd_s16_init(), a, b)); -} -uint32_t c_v128_sad_u16(c_v128 a, c_v128 b) { - return c_v128_sad_u16_sum(::c_v128_sad_u16(c_v128_sad_u16_init(), a, b)); -} -uint64_t c_v128_ssd_s16(c_v128 a, c_v128 b) { - return c_v128_ssd_s16_sum(::c_v128_ssd_s16(c_v128_ssd_s16_init(), a, b)); -} -uint32_t v256_sad_u8(v256 a, v256 b) { - return v256_sad_u8_sum(::v256_sad_u8(v256_sad_u8_init(), a, b)); -} -uint32_t v256_ssd_u8(v256 a, v256 b) { - return v256_ssd_u8_sum(::v256_ssd_u8(v256_ssd_u8_init(), a, b)); -} -uint32_t c_v256_sad_u8(c_v256 a, c_v256 b) { - return c_v256_sad_u8_sum(::c_v256_sad_u8(c_v256_sad_u8_init(), a, b)); -} -uint32_t c_v256_ssd_u8(c_v256 a, c_v256 b) { - return c_v256_ssd_u8_sum(::c_v256_ssd_u8(c_v256_ssd_u8_init(), a, b)); -} -uint32_t v256_sad_u16(v256 a, v256 b) { - return v256_sad_u16_sum(::v256_sad_u16(v256_sad_u16_init(), a, b)); -} -uint64_t v256_ssd_s16(v256 a, v256 b) { - return v256_ssd_s16_sum(::v256_ssd_s16(v256_ssd_s16_init(), a, b)); -} -uint32_t c_v256_sad_u16(c_v256 a, c_v256 b) { - return c_v256_sad_u16_sum(::c_v256_sad_u16(c_v256_sad_u16_init(), a, b)); -} -uint64_t c_v256_ssd_s16(c_v256 a, c_v256 b) { - return c_v256_ssd_s16_sum(::c_v256_ssd_s16(c_v256_ssd_s16_init(), a, b)); -} - -namespace { - -typedef void (*fptr)(); - -typedef struct { - const char *name; - fptr ref; - fptr simd; -} mapping; - -#define MAP(name) \ - { \ - #name, reinterpret_cast < fptr > (c_##name), \ - reinterpret_cast < fptr > (name) \ - } - -const mapping m[] = { MAP(v64_sad_u8), - MAP(v64_ssd_u8), - MAP(v64_add_8), - MAP(v64_add_16), - MAP(v64_sadd_s8), - MAP(v64_sadd_u8), - MAP(v64_sadd_s16), - MAP(v64_add_32), - MAP(v64_sub_8), - MAP(v64_ssub_u8), - MAP(v64_ssub_s8), - MAP(v64_sub_16), - MAP(v64_ssub_s16), - MAP(v64_ssub_u16), - MAP(v64_sub_32), - MAP(v64_ziplo_8), - MAP(v64_ziphi_8), - MAP(v64_ziplo_16), - MAP(v64_ziphi_16), - MAP(v64_ziplo_32), - MAP(v64_ziphi_32), - MAP(v64_pack_s32_u16), - MAP(v64_pack_s32_s16), - MAP(v64_pack_s16_u8), - MAP(v64_pack_s16_s8), - MAP(v64_unziphi_8), - MAP(v64_unziplo_8), - MAP(v64_unziphi_16), - MAP(v64_unziplo_16), - MAP(v64_or), - MAP(v64_xor), - MAP(v64_and), - MAP(v64_andn), - MAP(v64_mullo_s16), - MAP(v64_mulhi_s16), - MAP(v64_mullo_s32), - MAP(v64_madd_s16), - MAP(v64_madd_us8), - MAP(v64_avg_u8), - MAP(v64_rdavg_u8), - MAP(v64_rdavg_u16), - MAP(v64_avg_u16), - MAP(v64_min_u8), - MAP(v64_max_u8), - MAP(v64_min_s8), - MAP(v64_max_s8), - MAP(v64_min_s16), - MAP(v64_max_s16), - MAP(v64_cmpgt_s8), - MAP(v64_cmplt_s8), - MAP(v64_cmpeq_8), - MAP(v64_cmpgt_s16), - MAP(v64_cmplt_s16), - MAP(v64_cmpeq_16), - MAP(v64_shuffle_8), - MAP(imm_v64_align<1>), - MAP(imm_v64_align<2>), - MAP(imm_v64_align<3>), - MAP(imm_v64_align<4>), - MAP(imm_v64_align<5>), - MAP(imm_v64_align<6>), - MAP(imm_v64_align<7>), - MAP(v64_abs_s8), - MAP(v64_abs_s16), - MAP(v64_unpacklo_u8_s16), - MAP(v64_unpackhi_u8_s16), - MAP(v64_unpacklo_s8_s16), - MAP(v64_unpackhi_s8_s16), - MAP(v64_unpacklo_u16_s32), - MAP(v64_unpacklo_s16_s32), - MAP(v64_unpackhi_u16_s32), - MAP(v64_unpackhi_s16_s32), - MAP(imm_v64_shr_n_byte<1>), - MAP(imm_v64_shr_n_byte<2>), - MAP(imm_v64_shr_n_byte<3>), - MAP(imm_v64_shr_n_byte<4>), - MAP(imm_v64_shr_n_byte<5>), - MAP(imm_v64_shr_n_byte<6>), - MAP(imm_v64_shr_n_byte<7>), - MAP(imm_v64_shl_n_byte<1>), - MAP(imm_v64_shl_n_byte<2>), - MAP(imm_v64_shl_n_byte<3>), - MAP(imm_v64_shl_n_byte<4>), - MAP(imm_v64_shl_n_byte<5>), - MAP(imm_v64_shl_n_byte<6>), - MAP(imm_v64_shl_n_byte<7>), - MAP(imm_v64_shl_n_8<1>), - MAP(imm_v64_shl_n_8<2>), - MAP(imm_v64_shl_n_8<3>), - MAP(imm_v64_shl_n_8<4>), - MAP(imm_v64_shl_n_8<5>), - MAP(imm_v64_shl_n_8<6>), - MAP(imm_v64_shl_n_8<7>), - MAP(imm_v64_shr_n_u8<1>), - MAP(imm_v64_shr_n_u8<2>), - MAP(imm_v64_shr_n_u8<3>), - MAP(imm_v64_shr_n_u8<4>), - MAP(imm_v64_shr_n_u8<5>), - MAP(imm_v64_shr_n_u8<6>), - MAP(imm_v64_shr_n_u8<7>), - MAP(imm_v64_shr_n_s8<1>), - MAP(imm_v64_shr_n_s8<2>), - MAP(imm_v64_shr_n_s8<3>), - MAP(imm_v64_shr_n_s8<4>), - MAP(imm_v64_shr_n_s8<5>), - MAP(imm_v64_shr_n_s8<6>), - MAP(imm_v64_shr_n_s8<7>), - MAP(imm_v64_shl_n_16<1>), - MAP(imm_v64_shl_n_16<2>), - MAP(imm_v64_shl_n_16<4>), - MAP(imm_v64_shl_n_16<6>), - MAP(imm_v64_shl_n_16<8>), - MAP(imm_v64_shl_n_16<10>), - MAP(imm_v64_shl_n_16<12>), - MAP(imm_v64_shl_n_16<14>), - MAP(imm_v64_shr_n_u16<1>), - MAP(imm_v64_shr_n_u16<2>), - MAP(imm_v64_shr_n_u16<4>), - MAP(imm_v64_shr_n_u16<6>), - MAP(imm_v64_shr_n_u16<8>), - MAP(imm_v64_shr_n_u16<10>), - MAP(imm_v64_shr_n_u16<12>), - MAP(imm_v64_shr_n_u16<14>), - MAP(imm_v64_shr_n_s16<1>), - MAP(imm_v64_shr_n_s16<2>), - MAP(imm_v64_shr_n_s16<4>), - MAP(imm_v64_shr_n_s16<6>), - MAP(imm_v64_shr_n_s16<8>), - MAP(imm_v64_shr_n_s16<10>), - MAP(imm_v64_shr_n_s16<12>), - MAP(imm_v64_shr_n_s16<14>), - MAP(imm_v64_shl_n_32<1>), - MAP(imm_v64_shl_n_32<4>), - MAP(imm_v64_shl_n_32<8>), - MAP(imm_v64_shl_n_32<12>), - MAP(imm_v64_shl_n_32<16>), - MAP(imm_v64_shl_n_32<20>), - MAP(imm_v64_shl_n_32<24>), - MAP(imm_v64_shl_n_32<28>), - MAP(imm_v64_shr_n_u32<1>), - MAP(imm_v64_shr_n_u32<4>), - MAP(imm_v64_shr_n_u32<8>), - MAP(imm_v64_shr_n_u32<12>), - MAP(imm_v64_shr_n_u32<16>), - MAP(imm_v64_shr_n_u32<20>), - MAP(imm_v64_shr_n_u32<24>), - MAP(imm_v64_shr_n_u32<28>), - MAP(imm_v64_shr_n_s32<1>), - MAP(imm_v64_shr_n_s32<4>), - MAP(imm_v64_shr_n_s32<8>), - MAP(imm_v64_shr_n_s32<12>), - MAP(imm_v64_shr_n_s32<16>), - MAP(imm_v64_shr_n_s32<20>), - MAP(imm_v64_shr_n_s32<24>), - MAP(imm_v64_shr_n_s32<28>), - MAP(v64_shl_8), - MAP(v64_shr_u8), - MAP(v64_shr_s8), - MAP(v64_shl_16), - MAP(v64_shr_u16), - MAP(v64_shr_s16), - MAP(v64_shl_32), - MAP(v64_shr_u32), - MAP(v64_shr_s32), - MAP(v64_hadd_u8), - MAP(v64_hadd_s16), - MAP(v64_dotp_s16), - MAP(v64_dotp_su8), - MAP(v64_u64), - MAP(v64_low_u32), - MAP(v64_high_u32), - MAP(v64_low_s32), - MAP(v64_high_s32), - MAP(v64_dup_8), - MAP(v64_dup_16), - MAP(v64_dup_32), - MAP(v64_from_32), - MAP(v64_zero), - MAP(v64_from_16), - MAP(v128_sad_u8), - MAP(v128_ssd_u8), - MAP(v128_sad_u16), - MAP(v128_ssd_s16), - MAP(v128_add_8), - MAP(v128_add_16), - MAP(v128_sadd_s8), - MAP(v128_sadd_u8), - MAP(v128_sadd_s16), - MAP(v128_add_32), - MAP(v128_add_64), - MAP(v128_sub_8), - MAP(v128_ssub_u8), - MAP(v128_ssub_s8), - MAP(v128_sub_16), - MAP(v128_ssub_s16), - MAP(v128_ssub_u16), - MAP(v128_sub_32), - MAP(v128_sub_64), - MAP(v128_ziplo_8), - MAP(v128_ziphi_8), - MAP(v128_ziplo_16), - MAP(v128_ziphi_16), - MAP(v128_ziplo_32), - MAP(v128_ziphi_32), - MAP(v128_ziplo_64), - MAP(v128_ziphi_64), - MAP(v128_unziphi_8), - MAP(v128_unziplo_8), - MAP(v128_unziphi_16), - MAP(v128_unziplo_16), - MAP(v128_unziphi_32), - MAP(v128_unziplo_32), - MAP(v128_pack_s32_u16), - MAP(v128_pack_s32_s16), - MAP(v128_pack_s16_u8), - MAP(v128_pack_s16_s8), - MAP(v128_or), - MAP(v128_xor), - MAP(v128_and), - MAP(v128_andn), - MAP(v128_mullo_s16), - MAP(v128_mulhi_s16), - MAP(v128_mullo_s32), - MAP(v128_madd_s16), - MAP(v128_madd_us8), - MAP(v128_avg_u8), - MAP(v128_rdavg_u8), - MAP(v128_rdavg_u16), - MAP(v128_avg_u16), - MAP(v128_min_u8), - MAP(v128_max_u8), - MAP(v128_min_s8), - MAP(v128_max_s8), - MAP(v128_min_s16), - MAP(v128_max_s16), - MAP(v128_min_s32), - MAP(v128_max_s32), - MAP(v128_cmpgt_s8), - MAP(v128_cmplt_s8), - MAP(v128_cmpeq_8), - MAP(v128_cmpgt_s16), - MAP(v128_cmpeq_16), - MAP(v128_cmplt_s16), - MAP(v128_cmpgt_s32), - MAP(v128_cmpeq_32), - MAP(v128_cmplt_s32), - MAP(v128_shuffle_8), - MAP(imm_v128_align<1>), - MAP(imm_v128_align<2>), - MAP(imm_v128_align<3>), - MAP(imm_v128_align<4>), - MAP(imm_v128_align<5>), - MAP(imm_v128_align<6>), - MAP(imm_v128_align<7>), - MAP(imm_v128_align<8>), - MAP(imm_v128_align<9>), - MAP(imm_v128_align<10>), - MAP(imm_v128_align<11>), - MAP(imm_v128_align<12>), - MAP(imm_v128_align<13>), - MAP(imm_v128_align<14>), - MAP(imm_v128_align<15>), - MAP(v128_abs_s8), - MAP(v128_abs_s16), - MAP(v128_padd_u8), - MAP(v128_padd_s16), - MAP(v128_unpacklo_u16_s32), - MAP(v128_unpacklo_s16_s32), - MAP(v128_unpackhi_u16_s32), - MAP(v128_unpackhi_s16_s32), - MAP(imm_v128_shr_n_byte<1>), - MAP(imm_v128_shr_n_byte<2>), - MAP(imm_v128_shr_n_byte<3>), - MAP(imm_v128_shr_n_byte<4>), - MAP(imm_v128_shr_n_byte<5>), - MAP(imm_v128_shr_n_byte<6>), - MAP(imm_v128_shr_n_byte<7>), - MAP(imm_v128_shr_n_byte<8>), - MAP(imm_v128_shr_n_byte<9>), - MAP(imm_v128_shr_n_byte<10>), - MAP(imm_v128_shr_n_byte<11>), - MAP(imm_v128_shr_n_byte<12>), - MAP(imm_v128_shr_n_byte<13>), - MAP(imm_v128_shr_n_byte<14>), - MAP(imm_v128_shr_n_byte<15>), - MAP(imm_v128_shl_n_byte<1>), - MAP(imm_v128_shl_n_byte<2>), - MAP(imm_v128_shl_n_byte<3>), - MAP(imm_v128_shl_n_byte<4>), - MAP(imm_v128_shl_n_byte<5>), - MAP(imm_v128_shl_n_byte<6>), - MAP(imm_v128_shl_n_byte<7>), - MAP(imm_v128_shl_n_byte<8>), - MAP(imm_v128_shl_n_byte<9>), - MAP(imm_v128_shl_n_byte<10>), - MAP(imm_v128_shl_n_byte<11>), - MAP(imm_v128_shl_n_byte<12>), - MAP(imm_v128_shl_n_byte<13>), - MAP(imm_v128_shl_n_byte<14>), - MAP(imm_v128_shl_n_byte<15>), - MAP(imm_v128_shl_n_8<1>), - MAP(imm_v128_shl_n_8<2>), - MAP(imm_v128_shl_n_8<3>), - MAP(imm_v128_shl_n_8<4>), - MAP(imm_v128_shl_n_8<5>), - MAP(imm_v128_shl_n_8<6>), - MAP(imm_v128_shl_n_8<7>), - MAP(imm_v128_shr_n_u8<1>), - MAP(imm_v128_shr_n_u8<2>), - MAP(imm_v128_shr_n_u8<3>), - MAP(imm_v128_shr_n_u8<4>), - MAP(imm_v128_shr_n_u8<5>), - MAP(imm_v128_shr_n_u8<6>), - MAP(imm_v128_shr_n_u8<7>), - MAP(imm_v128_shr_n_s8<1>), - MAP(imm_v128_shr_n_s8<2>), - MAP(imm_v128_shr_n_s8<3>), - MAP(imm_v128_shr_n_s8<4>), - MAP(imm_v128_shr_n_s8<5>), - MAP(imm_v128_shr_n_s8<6>), - MAP(imm_v128_shr_n_s8<7>), - MAP(imm_v128_shl_n_16<1>), - MAP(imm_v128_shl_n_16<2>), - MAP(imm_v128_shl_n_16<4>), - MAP(imm_v128_shl_n_16<6>), - MAP(imm_v128_shl_n_16<8>), - MAP(imm_v128_shl_n_16<10>), - MAP(imm_v128_shl_n_16<12>), - MAP(imm_v128_shl_n_16<14>), - MAP(imm_v128_shr_n_u16<1>), - MAP(imm_v128_shr_n_u16<2>), - MAP(imm_v128_shr_n_u16<4>), - MAP(imm_v128_shr_n_u16<6>), - MAP(imm_v128_shr_n_u16<8>), - MAP(imm_v128_shr_n_u16<10>), - MAP(imm_v128_shr_n_u16<12>), - MAP(imm_v128_shr_n_u16<14>), - MAP(imm_v128_shr_n_s16<1>), - MAP(imm_v128_shr_n_s16<2>), - MAP(imm_v128_shr_n_s16<4>), - MAP(imm_v128_shr_n_s16<6>), - MAP(imm_v128_shr_n_s16<8>), - MAP(imm_v128_shr_n_s16<10>), - MAP(imm_v128_shr_n_s16<12>), - MAP(imm_v128_shr_n_s16<14>), - MAP(imm_v128_shl_n_32<1>), - MAP(imm_v128_shl_n_32<4>), - MAP(imm_v128_shl_n_32<8>), - MAP(imm_v128_shl_n_32<12>), - MAP(imm_v128_shl_n_32<16>), - MAP(imm_v128_shl_n_32<20>), - MAP(imm_v128_shl_n_32<24>), - MAP(imm_v128_shl_n_32<28>), - MAP(imm_v128_shr_n_u32<1>), - MAP(imm_v128_shr_n_u32<4>), - MAP(imm_v128_shr_n_u32<8>), - MAP(imm_v128_shr_n_u32<12>), - MAP(imm_v128_shr_n_u32<16>), - MAP(imm_v128_shr_n_u32<20>), - MAP(imm_v128_shr_n_u32<24>), - MAP(imm_v128_shr_n_u32<28>), - MAP(imm_v128_shr_n_s32<1>), - MAP(imm_v128_shr_n_s32<4>), - MAP(imm_v128_shr_n_s32<8>), - MAP(imm_v128_shr_n_s32<12>), - MAP(imm_v128_shr_n_s32<16>), - MAP(imm_v128_shr_n_s32<20>), - MAP(imm_v128_shr_n_s32<24>), - MAP(imm_v128_shr_n_s32<28>), - MAP(imm_v128_shl_n_64<1>), - MAP(imm_v128_shl_n_64<4>), - MAP(imm_v128_shl_n_64<8>), - MAP(imm_v128_shl_n_64<12>), - MAP(imm_v128_shl_n_64<16>), - MAP(imm_v128_shl_n_64<20>), - MAP(imm_v128_shl_n_64<24>), - MAP(imm_v128_shl_n_64<28>), - MAP(imm_v128_shl_n_64<32>), - MAP(imm_v128_shl_n_64<36>), - MAP(imm_v128_shl_n_64<40>), - MAP(imm_v128_shl_n_64<44>), - MAP(imm_v128_shl_n_64<48>), - MAP(imm_v128_shl_n_64<52>), - MAP(imm_v128_shl_n_64<56>), - MAP(imm_v128_shl_n_64<60>), - MAP(imm_v128_shr_n_u64<1>), - MAP(imm_v128_shr_n_u64<4>), - MAP(imm_v128_shr_n_u64<8>), - MAP(imm_v128_shr_n_u64<12>), - MAP(imm_v128_shr_n_u64<16>), - MAP(imm_v128_shr_n_u64<20>), - MAP(imm_v128_shr_n_u64<24>), - MAP(imm_v128_shr_n_u64<28>), - MAP(imm_v128_shr_n_u64<32>), - MAP(imm_v128_shr_n_u64<36>), - MAP(imm_v128_shr_n_u64<40>), - MAP(imm_v128_shr_n_u64<44>), - MAP(imm_v128_shr_n_u64<48>), - MAP(imm_v128_shr_n_u64<52>), - MAP(imm_v128_shr_n_u64<56>), - MAP(imm_v128_shr_n_u64<60>), - MAP(imm_v128_shr_n_s64<1>), - MAP(imm_v128_shr_n_s64<4>), - MAP(imm_v128_shr_n_s64<8>), - MAP(imm_v128_shr_n_s64<12>), - MAP(imm_v128_shr_n_s64<16>), - MAP(imm_v128_shr_n_s64<20>), - MAP(imm_v128_shr_n_s64<24>), - MAP(imm_v128_shr_n_s64<28>), - MAP(imm_v128_shr_n_s64<32>), - MAP(imm_v128_shr_n_s64<36>), - MAP(imm_v128_shr_n_s64<40>), - MAP(imm_v128_shr_n_s64<44>), - MAP(imm_v128_shr_n_s64<48>), - MAP(imm_v128_shr_n_s64<52>), - MAP(imm_v128_shr_n_s64<56>), - MAP(imm_v128_shr_n_s64<60>), - MAP(v128_from_v64), - MAP(v128_zip_8), - MAP(v128_zip_16), - MAP(v128_zip_32), - MAP(v128_mul_s16), - MAP(v128_unpack_u8_s16), - MAP(v128_unpack_s8_s16), - MAP(v128_unpack_u16_s32), - MAP(v128_unpack_s16_s32), - MAP(v128_shl_8), - MAP(v128_shr_u8), - MAP(v128_shr_s8), - MAP(v128_shl_16), - MAP(v128_shr_u16), - MAP(v128_shr_s16), - MAP(v128_shl_32), - MAP(v128_shr_u32), - MAP(v128_shr_s32), - MAP(v128_shl_64), - MAP(v128_shr_u64), - MAP(v128_shr_s64), - MAP(v128_hadd_u8), - MAP(v128_dotp_su8), - MAP(v128_dotp_s16), - MAP(v128_dotp_s32), - MAP(v128_low_u32), - MAP(v128_low_v64), - MAP(v128_high_v64), - MAP(v128_from_64), - MAP(v128_from_32), - MAP(v128_movemask_8), - MAP(v128_zero), - MAP(v128_dup_8), - MAP(v128_dup_16), - MAP(v128_dup_32), - MAP(v128_dup_64), - MAP(v128_unpacklo_u8_s16), - MAP(v128_unpackhi_u8_s16), - MAP(v128_unpacklo_s8_s16), - MAP(v128_unpackhi_s8_s16), - MAP(v128_blend_8), - MAP(u32_load_unaligned), - MAP(u32_store_unaligned), - MAP(v64_load_unaligned), - MAP(v64_store_unaligned), - MAP(v128_load_unaligned), - MAP(v128_store_unaligned), - MAP(v256_sad_u8), - MAP(v256_ssd_u8), - MAP(v256_sad_u16), - MAP(v256_ssd_s16), - MAP(v256_hadd_u8), - MAP(v256_low_u64), - MAP(v256_dotp_su8), - MAP(v256_dotp_s16), - MAP(v256_dotp_s32), - MAP(v256_add_8), - MAP(v256_add_16), - MAP(v256_sadd_s8), - MAP(v256_sadd_u8), - MAP(v256_sadd_s16), - MAP(v256_add_32), - MAP(v256_add_64), - MAP(v256_sub_8), - MAP(v256_ssub_u8), - MAP(v256_ssub_s8), - MAP(v256_sub_16), - MAP(v256_ssub_u16), - MAP(v256_ssub_s16), - MAP(v256_sub_32), - MAP(v256_sub_64), - MAP(v256_ziplo_8), - MAP(v256_ziphi_8), - MAP(v256_ziplo_16), - MAP(v256_ziphi_16), - MAP(v256_ziplo_32), - MAP(v256_ziphi_32), - MAP(v256_ziplo_64), - MAP(v256_ziphi_64), - MAP(v256_unziphi_8), - MAP(v256_unziplo_8), - MAP(v256_unziphi_16), - MAP(v256_unziplo_16), - MAP(v256_unziphi_32), - MAP(v256_unziplo_32), - MAP(v256_unziphi_64), - MAP(v256_unziplo_64), - MAP(v256_pack_s32_u16), - MAP(v256_pack_s32_s16), - MAP(v256_pack_s16_u8), - MAP(v256_pack_s16_s8), - MAP(v256_or), - MAP(v256_xor), - MAP(v256_and), - MAP(v256_andn), - MAP(v256_mullo_s16), - MAP(v256_mulhi_s16), - MAP(v256_mullo_s32), - MAP(v256_madd_s16), - MAP(v256_madd_us8), - MAP(v256_avg_u8), - MAP(v256_rdavg_u8), - MAP(v256_rdavg_u16), - MAP(v256_avg_u16), - MAP(v256_min_u8), - MAP(v256_max_u8), - MAP(v256_min_s8), - MAP(v256_max_s8), - MAP(v256_min_s16), - MAP(v256_max_s16), - MAP(v256_min_s32), - MAP(v256_max_s32), - MAP(v256_cmpgt_s8), - MAP(v256_cmplt_s8), - MAP(v256_cmpeq_8), - MAP(v256_cmpgt_s16), - MAP(v256_cmplt_s16), - MAP(v256_cmpeq_16), - MAP(v256_cmpgt_s32), - MAP(v256_cmplt_s32), - MAP(v256_cmpeq_32), - MAP(v256_shuffle_8), - MAP(v256_pshuffle_8), - MAP(v256_wideshuffle_8), - MAP(imm_v256_align<1>), - MAP(imm_v256_align<2>), - MAP(imm_v256_align<3>), - MAP(imm_v256_align<4>), - MAP(imm_v256_align<5>), - MAP(imm_v256_align<6>), - MAP(imm_v256_align<7>), - MAP(imm_v256_align<8>), - MAP(imm_v256_align<9>), - MAP(imm_v256_align<10>), - MAP(imm_v256_align<11>), - MAP(imm_v256_align<12>), - MAP(imm_v256_align<13>), - MAP(imm_v256_align<14>), - MAP(imm_v256_align<15>), - MAP(imm_v256_align<16>), - MAP(imm_v256_align<17>), - MAP(imm_v256_align<18>), - MAP(imm_v256_align<19>), - MAP(imm_v256_align<20>), - MAP(imm_v256_align<21>), - MAP(imm_v256_align<22>), - MAP(imm_v256_align<23>), - MAP(imm_v256_align<24>), - MAP(imm_v256_align<25>), - MAP(imm_v256_align<26>), - MAP(imm_v256_align<27>), - MAP(imm_v256_align<28>), - MAP(imm_v256_align<29>), - MAP(imm_v256_align<30>), - MAP(imm_v256_align<31>), - MAP(v256_from_v128), - MAP(v256_zip_8), - MAP(v256_zip_16), - MAP(v256_zip_32), - MAP(v256_mul_s16), - MAP(v256_unpack_u8_s16), - MAP(v256_unpack_s8_s16), - MAP(v256_unpack_u16_s32), - MAP(v256_unpack_s16_s32), - MAP(v256_shl_8), - MAP(v256_shr_u8), - MAP(v256_shr_s8), - MAP(v256_shl_16), - MAP(v256_shr_u16), - MAP(v256_shr_s16), - MAP(v256_shl_32), - MAP(v256_shr_u32), - MAP(v256_shr_s32), - MAP(v256_shl_64), - MAP(v256_shr_u64), - MAP(v256_shr_s64), - MAP(v256_abs_s8), - MAP(v256_abs_s16), - MAP(v256_padd_u8), - MAP(v256_padd_s16), - MAP(v256_unpacklo_u16_s32), - MAP(v256_unpacklo_s16_s32), - MAP(v256_unpackhi_u16_s32), - MAP(v256_unpackhi_s16_s32), - MAP(imm_v256_shr_n_word<1>), - MAP(imm_v256_shr_n_word<2>), - MAP(imm_v256_shr_n_word<3>), - MAP(imm_v256_shr_n_word<4>), - MAP(imm_v256_shr_n_word<5>), - MAP(imm_v256_shr_n_word<6>), - MAP(imm_v256_shr_n_word<7>), - MAP(imm_v256_shr_n_word<8>), - MAP(imm_v256_shr_n_word<9>), - MAP(imm_v256_shr_n_word<10>), - MAP(imm_v256_shr_n_word<11>), - MAP(imm_v256_shr_n_word<12>), - MAP(imm_v256_shr_n_word<13>), - MAP(imm_v256_shr_n_word<14>), - MAP(imm_v256_shr_n_word<15>), - MAP(imm_v256_shl_n_word<1>), - MAP(imm_v256_shl_n_word<2>), - MAP(imm_v256_shl_n_word<3>), - MAP(imm_v256_shl_n_word<4>), - MAP(imm_v256_shl_n_word<5>), - MAP(imm_v256_shl_n_word<6>), - MAP(imm_v256_shl_n_word<7>), - MAP(imm_v256_shl_n_word<8>), - MAP(imm_v256_shl_n_word<9>), - MAP(imm_v256_shl_n_word<10>), - MAP(imm_v256_shl_n_word<11>), - MAP(imm_v256_shl_n_word<12>), - MAP(imm_v256_shl_n_word<13>), - MAP(imm_v256_shl_n_word<14>), - MAP(imm_v256_shl_n_word<15>), - MAP(imm_v256_shr_n_byte<1>), - MAP(imm_v256_shr_n_byte<2>), - MAP(imm_v256_shr_n_byte<3>), - MAP(imm_v256_shr_n_byte<4>), - MAP(imm_v256_shr_n_byte<5>), - MAP(imm_v256_shr_n_byte<6>), - MAP(imm_v256_shr_n_byte<7>), - MAP(imm_v256_shr_n_byte<8>), - MAP(imm_v256_shr_n_byte<9>), - MAP(imm_v256_shr_n_byte<10>), - MAP(imm_v256_shr_n_byte<11>), - MAP(imm_v256_shr_n_byte<12>), - MAP(imm_v256_shr_n_byte<13>), - MAP(imm_v256_shr_n_byte<14>), - MAP(imm_v256_shr_n_byte<15>), - MAP(imm_v256_shr_n_byte<16>), - MAP(imm_v256_shr_n_byte<17>), - MAP(imm_v256_shr_n_byte<18>), - MAP(imm_v256_shr_n_byte<19>), - MAP(imm_v256_shr_n_byte<20>), - MAP(imm_v256_shr_n_byte<21>), - MAP(imm_v256_shr_n_byte<22>), - MAP(imm_v256_shr_n_byte<23>), - MAP(imm_v256_shr_n_byte<24>), - MAP(imm_v256_shr_n_byte<25>), - MAP(imm_v256_shr_n_byte<26>), - MAP(imm_v256_shr_n_byte<27>), - MAP(imm_v256_shr_n_byte<28>), - MAP(imm_v256_shr_n_byte<29>), - MAP(imm_v256_shr_n_byte<30>), - MAP(imm_v256_shr_n_byte<31>), - MAP(imm_v256_shl_n_byte<1>), - MAP(imm_v256_shl_n_byte<2>), - MAP(imm_v256_shl_n_byte<3>), - MAP(imm_v256_shl_n_byte<4>), - MAP(imm_v256_shl_n_byte<5>), - MAP(imm_v256_shl_n_byte<6>), - MAP(imm_v256_shl_n_byte<7>), - MAP(imm_v256_shl_n_byte<8>), - MAP(imm_v256_shl_n_byte<9>), - MAP(imm_v256_shl_n_byte<10>), - MAP(imm_v256_shl_n_byte<11>), - MAP(imm_v256_shl_n_byte<12>), - MAP(imm_v256_shl_n_byte<13>), - MAP(imm_v256_shl_n_byte<14>), - MAP(imm_v256_shl_n_byte<15>), - MAP(imm_v256_shl_n_byte<16>), - MAP(imm_v256_shl_n_byte<17>), - MAP(imm_v256_shl_n_byte<18>), - MAP(imm_v256_shl_n_byte<19>), - MAP(imm_v256_shl_n_byte<20>), - MAP(imm_v256_shl_n_byte<21>), - MAP(imm_v256_shl_n_byte<22>), - MAP(imm_v256_shl_n_byte<23>), - MAP(imm_v256_shl_n_byte<24>), - MAP(imm_v256_shl_n_byte<25>), - MAP(imm_v256_shl_n_byte<26>), - MAP(imm_v256_shl_n_byte<27>), - MAP(imm_v256_shl_n_byte<28>), - MAP(imm_v256_shl_n_byte<29>), - MAP(imm_v256_shl_n_byte<30>), - MAP(imm_v256_shl_n_byte<31>), - MAP(imm_v256_shl_n_8<1>), - MAP(imm_v256_shl_n_8<2>), - MAP(imm_v256_shl_n_8<3>), - MAP(imm_v256_shl_n_8<4>), - MAP(imm_v256_shl_n_8<5>), - MAP(imm_v256_shl_n_8<6>), - MAP(imm_v256_shl_n_8<7>), - MAP(imm_v256_shr_n_u8<1>), - MAP(imm_v256_shr_n_u8<2>), - MAP(imm_v256_shr_n_u8<3>), - MAP(imm_v256_shr_n_u8<4>), - MAP(imm_v256_shr_n_u8<5>), - MAP(imm_v256_shr_n_u8<6>), - MAP(imm_v256_shr_n_u8<7>), - MAP(imm_v256_shr_n_s8<1>), - MAP(imm_v256_shr_n_s8<2>), - MAP(imm_v256_shr_n_s8<3>), - MAP(imm_v256_shr_n_s8<4>), - MAP(imm_v256_shr_n_s8<5>), - MAP(imm_v256_shr_n_s8<6>), - MAP(imm_v256_shr_n_s8<7>), - MAP(imm_v256_shl_n_16<1>), - MAP(imm_v256_shl_n_16<2>), - MAP(imm_v256_shl_n_16<4>), - MAP(imm_v256_shl_n_16<6>), - MAP(imm_v256_shl_n_16<8>), - MAP(imm_v256_shl_n_16<10>), - MAP(imm_v256_shl_n_16<12>), - MAP(imm_v256_shl_n_16<14>), - MAP(imm_v256_shr_n_u16<1>), - MAP(imm_v256_shr_n_u16<2>), - MAP(imm_v256_shr_n_u16<4>), - MAP(imm_v256_shr_n_u16<6>), - MAP(imm_v256_shr_n_u16<8>), - MAP(imm_v256_shr_n_u16<10>), - MAP(imm_v256_shr_n_u16<12>), - MAP(imm_v256_shr_n_u16<14>), - MAP(imm_v256_shr_n_s16<1>), - MAP(imm_v256_shr_n_s16<2>), - MAP(imm_v256_shr_n_s16<4>), - MAP(imm_v256_shr_n_s16<6>), - MAP(imm_v256_shr_n_s16<8>), - MAP(imm_v256_shr_n_s16<10>), - MAP(imm_v256_shr_n_s16<12>), - MAP(imm_v256_shr_n_s16<14>), - MAP(imm_v256_shl_n_32<1>), - MAP(imm_v256_shl_n_32<4>), - MAP(imm_v256_shl_n_32<8>), - MAP(imm_v256_shl_n_32<12>), - MAP(imm_v256_shl_n_32<16>), - MAP(imm_v256_shl_n_32<20>), - MAP(imm_v256_shl_n_32<24>), - MAP(imm_v256_shl_n_32<28>), - MAP(imm_v256_shr_n_u32<1>), - MAP(imm_v256_shr_n_u32<4>), - MAP(imm_v256_shr_n_u32<8>), - MAP(imm_v256_shr_n_u32<12>), - MAP(imm_v256_shr_n_u32<16>), - MAP(imm_v256_shr_n_u32<20>), - MAP(imm_v256_shr_n_u32<24>), - MAP(imm_v256_shr_n_u32<28>), - MAP(imm_v256_shr_n_s32<1>), - MAP(imm_v256_shr_n_s32<4>), - MAP(imm_v256_shr_n_s32<8>), - MAP(imm_v256_shr_n_s32<12>), - MAP(imm_v256_shr_n_s32<16>), - MAP(imm_v256_shr_n_s32<20>), - MAP(imm_v256_shr_n_s32<24>), - MAP(imm_v256_shr_n_s32<28>), - MAP(imm_v256_shl_n_64<1>), - MAP(imm_v256_shl_n_64<4>), - MAP(imm_v256_shl_n_64<8>), - MAP(imm_v256_shl_n_64<12>), - MAP(imm_v256_shl_n_64<16>), - MAP(imm_v256_shl_n_64<20>), - MAP(imm_v256_shl_n_64<24>), - MAP(imm_v256_shl_n_64<28>), - MAP(imm_v256_shl_n_64<32>), - MAP(imm_v256_shl_n_64<36>), - MAP(imm_v256_shl_n_64<40>), - MAP(imm_v256_shl_n_64<44>), - MAP(imm_v256_shl_n_64<48>), - MAP(imm_v256_shl_n_64<52>), - MAP(imm_v256_shl_n_64<56>), - MAP(imm_v256_shl_n_64<60>), - MAP(imm_v256_shr_n_u64<1>), - MAP(imm_v256_shr_n_u64<4>), - MAP(imm_v256_shr_n_u64<8>), - MAP(imm_v256_shr_n_u64<12>), - MAP(imm_v256_shr_n_u64<16>), - MAP(imm_v256_shr_n_u64<20>), - MAP(imm_v256_shr_n_u64<24>), - MAP(imm_v256_shr_n_u64<28>), - MAP(imm_v256_shr_n_u64<32>), - MAP(imm_v256_shr_n_u64<36>), - MAP(imm_v256_shr_n_u64<40>), - MAP(imm_v256_shr_n_u64<44>), - MAP(imm_v256_shr_n_u64<48>), - MAP(imm_v256_shr_n_u64<52>), - MAP(imm_v256_shr_n_u64<56>), - MAP(imm_v256_shr_n_u64<60>), - MAP(imm_v256_shr_n_s64<1>), - MAP(imm_v256_shr_n_s64<4>), - MAP(imm_v256_shr_n_s64<8>), - MAP(imm_v256_shr_n_s64<12>), - MAP(imm_v256_shr_n_s64<16>), - MAP(imm_v256_shr_n_s64<20>), - MAP(imm_v256_shr_n_s64<24>), - MAP(imm_v256_shr_n_s64<28>), - MAP(imm_v256_shr_n_s64<32>), - MAP(imm_v256_shr_n_s64<36>), - MAP(imm_v256_shr_n_s64<40>), - MAP(imm_v256_shr_n_s64<44>), - MAP(imm_v256_shr_n_s64<48>), - MAP(imm_v256_shr_n_s64<52>), - MAP(imm_v256_shr_n_s64<56>), - MAP(imm_v256_shr_n_s64<60>), - MAP(v256_movemask_8), - MAP(v256_zero), - MAP(v256_dup_8), - MAP(v256_dup_16), - MAP(v256_dup_32), - MAP(v256_dup_64), - MAP(v256_low_u32), - MAP(v256_low_v64), - MAP(v256_from_64), - MAP(v256_from_v64), - MAP(v256_ziplo_128), - MAP(v256_ziphi_128), - MAP(v256_unpacklo_u8_s16), - MAP(v256_unpackhi_u8_s16), - MAP(v256_unpacklo_s8_s16), - MAP(v256_unpackhi_s8_s16), - MAP(v256_blend_8), - { NULL, NULL, NULL } }; -#undef MAP - -// Map reference functions to machine tuned functions. Since the -// functions depend on machine tuned types, the non-machine tuned -// instantiations of the test can't refer to these functions directly, -// so we refer to them by name and do the mapping here. -void Map(const char *name, fptr *ref, fptr *simd) { - unsigned int i; - for (i = 0; m[i].name && strcmp(name, m[i].name); i++) { - } - - *ref = m[i].ref; - *simd = m[i].simd; -} - -// Used for printing errors in TestSimd1Arg, TestSimd2Args and TestSimd3Args -std::string Print(const uint8_t *a, int size) { - std::string text = "0x"; - for (int i = 0; i < size; i++) { - const uint8_t c = a[!CONFIG_BIG_ENDIAN ? size - 1 - i : i]; - // Same as snprintf(..., ..., "%02x", c) - text += (c >> 4) + '0' + ((c >> 4) > 9) * ('a' - '0' - 10); - text += (c & 15) + '0' + ((c & 15) > 9) * ('a' - '0' - 10); - } - - return text; -} - -// Used in TestSimd1Arg, TestSimd2Args and TestSimd3Args to restrict argument -// ranges -void SetMask(uint8_t *s, int size, uint32_t mask, uint32_t maskwidth) { - switch (maskwidth) { - case 0: { - break; - } - case 8: { - for (int i = 0; i < size; i++) s[i] &= mask; - break; - } - case 16: { - uint16_t *t = reinterpret_cast<uint16_t *>(s); - assert(!(reinterpret_cast<uintptr_t>(s) & 1)); - for (int i = 0; i < size / 2; i++) t[i] &= mask; - break; - } - case 32: { - uint32_t *t = reinterpret_cast<uint32_t *>(s); - assert(!(reinterpret_cast<uintptr_t>(s) & 3)); - for (int i = 0; i < size / 4; i++) t[i] &= mask; - break; - } - case 64: { - uint64_t *t = reinterpret_cast<uint64_t *>(s); - assert(!(reinterpret_cast<uintptr_t>(s) & 7)); - for (int i = 0; i < size / 8; i++) t[i] &= mask; - break; - } - default: { - FAIL() << "Unsupported mask width"; - break; - } - } -} - -// We need some extra load/store functions -void u64_store_aligned(void *p, uint64_t a) { - v64_store_aligned(p, v64_from_64(a)); -} -void s32_store_aligned(void *p, int32_t a) { - u32_store_aligned(p, static_cast<uint32_t>(a)); -} -void s64_store_aligned(void *p, int64_t a) { - v64_store_aligned(p, v64_from_64(static_cast<uint64_t>(a))); -} - -void c_u64_store_aligned(void *p, uint64_t a) { - c_v64_store_aligned(p, c_v64_from_64(a)); -} - -void c_s32_store_aligned(void *p, int32_t a) { - c_u32_store_aligned(p, static_cast<uint32_t>(a)); -} - -void c_s64_store_aligned(void *p, int64_t a) { - c_v64_store_aligned(p, c_v64_from_64(static_cast<uint64_t>(a))); -} - -uint64_t u64_load_aligned(const void *p) { - return v64_u64(v64_load_aligned(p)); -} -uint16_t u16_load_aligned(const void *p) { - return *(reinterpret_cast<const uint16_t *>(p)); -} -uint8_t u8_load_aligned(const void *p) { - return *(reinterpret_cast<const uint8_t *>(p)); -} - -uint64_t c_u64_load_aligned(const void *p) { - return c_v64_u64(c_v64_load_aligned(p)); -} -uint16_t c_u16_load_aligned(const void *p) { - return *(reinterpret_cast<const uint16_t *>(p)); -} -uint8_t c_u8_load_aligned(const void *p) { - return *(reinterpret_cast<const uint8_t *>(p)); -} - -// CompareSimd1Arg, CompareSimd2Args and CompareSimd3Args compare -// intrinsics taking 1, 2 or 3 arguments respectively with their -// corresponding C reference. Ideally, the loads and stores should -// have gone into the template parameter list, but v64 and v128 could -// be typedef'ed to the same type (which is the case on x86) and then -// we can't instantiate both v64 and v128, so the function return and -// argument types, including the always differing types in the C -// equivalent are used instead. The function arguments must be void -// pointers and then go through a cast to avoid matching errors in the -// branches eliminated by the typeid tests in the calling function. -template <typename Ret, typename Arg, typename CRet, typename CArg> -int CompareSimd1Arg(fptr store, fptr load, fptr simd, void *d, fptr c_store, - fptr c_load, fptr c_simd, void *ref_d, const void *a) { - void (*const my_store)(void *, Ret) = (void (*const)(void *, Ret))store; - Arg (*const my_load)(const void *) = (Arg(*const)(const void *))load; - Ret (*const my_simd)(Arg) = (Ret(*const)(Arg))simd; - void (*const my_c_store)(void *, CRet) = (void (*const)(void *, CRet))c_store; - CArg (*const my_c_load)(const void *) = (CArg(*const)(const void *))c_load; - CRet (*const my_c_simd)(CArg) = (CRet(*const)(CArg))c_simd; - - // Call reference and intrinsic - my_c_store(ref_d, my_c_simd(my_c_load(a))); - my_store(d, my_simd(my_load(a))); - - // Compare results - return memcmp(ref_d, d, sizeof(CRet)); -} - -template <typename Ret, typename Arg1, typename Arg2, typename CRet, - typename CArg1, typename CArg2> -int CompareSimd2Args(fptr store, fptr load1, fptr load2, fptr simd, void *d, - fptr c_store, fptr c_load1, fptr c_load2, fptr c_simd, - void *ref_d, const void *a, const void *b) { - void (*const my_store)(void *, Ret) = (void (*const)(void *, Ret))store; - Arg1 (*const my_load1)(const void *) = (Arg1(*const)(const void *))load1; - Arg2 (*const my_load2)(const void *) = (Arg2(*const)(const void *))load2; - Ret (*const my_simd)(Arg1, Arg2) = (Ret(*const)(Arg1, Arg2))simd; - void (*const my_c_store)(void *, CRet) = (void (*const)(void *, CRet))c_store; - CArg1 (*const my_c_load1)(const void *) = - (CArg1(*const)(const void *))c_load1; - CArg2 (*const my_c_load2)(const void *) = - (CArg2(*const)(const void *))c_load2; - CRet (*const my_c_simd)(CArg1, CArg2) = (CRet(*const)(CArg1, CArg2))c_simd; - - // Call reference and intrinsic - my_c_store(ref_d, my_c_simd(my_c_load1(a), my_c_load2(b))); - my_store(d, my_simd(my_load1(a), my_load2(b))); - - // Compare results - return memcmp(ref_d, d, sizeof(CRet)); -} - -template <typename Ret, typename Arg1, typename Arg2, typename Arg3, - typename CRet, typename CArg1, typename CArg2, typename CArg3> -int CompareSimd3Args(fptr store, fptr load1, fptr load2, fptr load3, fptr simd, - void *d, fptr c_store, fptr c_load1, fptr c_load2, - fptr c_load3, fptr c_simd, void *ref_d, const void *a, - const void *b, const void *c) { - void (*const my_store)(void *, Ret) = (void (*const)(void *, Ret))store; - Arg1 (*const my_load1)(const void *) = (Arg1(*const)(const void *))load1; - Arg2 (*const my_load2)(const void *) = (Arg2(*const)(const void *))load2; - Arg3 (*const my_load3)(const void *) = (Arg3(*const)(const void *))load3; - Ret (*const my_simd)(Arg1, Arg2, Arg3) = (Ret(*const)(Arg1, Arg2, Arg3))simd; - void (*const my_c_store)(void *, CRet) = (void (*const)(void *, CRet))c_store; - CArg1 (*const my_c_load1)(const void *) = - (CArg1(*const)(const void *))c_load1; - CArg2 (*const my_c_load2)(const void *) = - (CArg2(*const)(const void *))c_load2; - CArg2 (*const my_c_load3)(const void *) = - (CArg2(*const)(const void *))c_load3; - CRet (*const my_c_simd)(CArg1, CArg2, CArg3) = - (CRet(*const)(CArg1, CArg2, CArg3))c_simd; - - // Call reference and intrinsic - my_c_store(ref_d, my_c_simd(my_c_load1(a), my_c_load2(b), my_c_load3(c))); - my_store(d, my_simd(my_load1(a), my_load2(b), my_load3(c))); - - // Compare results - return memcmp(ref_d, d, sizeof(CRet)); -} - -} // namespace - -template <typename CRet, typename CArg> -void TestSimd1Arg(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - fptr ref_simd; - fptr simd; - int error = 0; - DECLARE_ALIGNED(32, uint8_t, s[32]); - DECLARE_ALIGNED(32, uint8_t, d[32]); - DECLARE_ALIGNED(32, uint8_t, ref_d[32]); - assert(sizeof(CArg) <= 32 && sizeof(CRet) <= 32); - memset(ref_d, 0, sizeof(ref_d)); - memset(d, 0, sizeof(d)); - - Map(name, &ref_simd, &simd); - if (simd == NULL || ref_simd == NULL) { - FAIL() << "Internal error: Unknown intrinsic function " << name; - } - for (unsigned int count = 0; - count < iterations && !error && !testing::Test::HasFailure(); count++) { - for (unsigned int c = 0; c < sizeof(CArg); c++) s[c] = rnd.Rand8(); - - if (maskwidth) { - SetMask(s, sizeof(CArg), mask, maskwidth); - } - - if (typeid(CRet) == typeid(c_v64) && typeid(CArg) == typeid(c_v64)) { - // V64_V64 - error = CompareSimd1Arg<v64, v64, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg) == typeid(uint8_t)) { - // V64_U8 - error = CompareSimd1Arg<v64, uint8_t, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(u8_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_u8_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg) == typeid(uint16_t)) { - // V64_U16 - error = CompareSimd1Arg<v64, uint16_t, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(u16_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_u16_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg) == typeid(uint32_t)) { - // V64_U32 - error = CompareSimd1Arg<v64, uint32_t, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint64_t) && - typeid(CArg) == typeid(c_v64)) { - // U64_V64 - error = CompareSimd1Arg<uint64_t, v64, CRet, CArg>( - reinterpret_cast<fptr>(u64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(int64_t) && - typeid(CArg) == typeid(c_v64)) { - // S64_V64 - error = CompareSimd1Arg<int64_t, v64, CRet, CArg>( - reinterpret_cast<fptr>(s64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_s64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg) == typeid(c_v64)) { - // U32_V64 - error = CompareSimd1Arg<uint32_t, v64, CRet, CArg>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(int32_t) && - typeid(CArg) == typeid(c_v64)) { - // S32_V64 - error = CompareSimd1Arg<int32_t, v64, CRet, CArg>( - reinterpret_cast<fptr>(s32_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_s32_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg) == typeid(c_v128)) { - // U32_V128 - error = CompareSimd1Arg<uint32_t, v128, CRet, CArg>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint64_t) && - typeid(CArg) == typeid(c_v128)) { - // U64_V128 - error = CompareSimd1Arg<uint64_t, v128, CRet, CArg>( - reinterpret_cast<fptr>(u64_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u64_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint64_t) && - typeid(CArg) == typeid(c_v256)) { - // U64_V256 - error = CompareSimd1Arg<uint64_t, v256, CRet, CArg>( - reinterpret_cast<fptr>(u64_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u64_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg) == typeid(c_v128)) { - // V64_V128 - error = CompareSimd1Arg<v64, v128, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(c_v128)) { - // V128_V128 - error = CompareSimd1Arg<v128, v128, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(c_v64)) { - // V128_V64 - error = CompareSimd1Arg<v128, v64, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(uint8_t)) { - // V128_U8 - error = CompareSimd1Arg<v128, uint8_t, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(u8_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_u8_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(uint16_t)) { - // V128_U16 - error = CompareSimd1Arg<v128, uint16_t, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(u16_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_u16_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(uint32_t)) { - // V128_U32 - error = CompareSimd1Arg<v128, uint32_t, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg) == typeid(uint64_t)) { - // V128_U64 - error = CompareSimd1Arg<v128, uint64_t, CRet, CArg>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(u64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_u64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(c_v256)) { - // V256_V256 - error = CompareSimd1Arg<v256, v256, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(c_v128)) { - // V256_V128 - error = CompareSimd1Arg<v256, v128, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(uint8_t)) { - // V256_U8 - error = CompareSimd1Arg<v256, uint8_t, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(u8_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_u8_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(uint16_t)) { - // V256_U16 - error = CompareSimd1Arg<v256, uint16_t, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(u16_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_u16_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(uint32_t)) { - // V256_U32 - error = CompareSimd1Arg<v256, uint32_t, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg) == typeid(uint64_t)) { - // V256_U64 - error = CompareSimd1Arg<v256, uint64_t, CRet, CArg>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(u64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_u64_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg) == typeid(c_v256)) { - // U32_V256 - error = CompareSimd1Arg<uint32_t, v256, CRet, CArg>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), ref_simd, ref_d, s); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg) == typeid(c_v256)) { - // V64_V256 - error = CompareSimd1Arg<v64, v256, CRet, CArg>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), ref_simd, ref_d, s); - } else { - FAIL() << "Internal error: Unknown intrinsic function " - << typeid(CRet).name() << " " << name << "(" << typeid(CArg).name() - << ")"; - } - } - - EXPECT_EQ(0, error) << "Error: mismatch for " << name << "(" - << Print(s, sizeof(s)) << ") -> " << Print(d, sizeof(d)) - << " (simd), " << Print(ref_d, sizeof(ref_d)) << " (ref)"; -} - -template <typename CRet, typename CArg1, typename CArg2> -void TestSimd2Args(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - fptr ref_simd; - fptr simd; - int error = 0; - DECLARE_ALIGNED(32, uint8_t, s1[32]); - DECLARE_ALIGNED(32, uint8_t, s2[32]); - DECLARE_ALIGNED(32, uint8_t, d[32]); - DECLARE_ALIGNED(32, uint8_t, ref_d[32]); - assert(sizeof(CArg1) <= 32 && sizeof(CArg2) <= 32 && sizeof(CRet) <= 32); - memset(ref_d, 0, sizeof(ref_d)); - memset(d, 0, sizeof(d)); - - Map(name, &ref_simd, &simd); - if (simd == NULL || ref_simd == NULL) { - FAIL() << "Internal error: Unknown intrinsic function " << name; - } - - for (unsigned int count = 0; - count < iterations && !error && !testing::Test::HasFailure(); count++) { - for (unsigned int c = 0; c < sizeof(CArg1); c++) s1[c] = rnd.Rand8(); - - for (unsigned int c = 0; c < sizeof(CArg2); c++) s2[c] = rnd.Rand8(); - - if (maskwidth) SetMask(s2, sizeof(CArg2), mask, maskwidth); - - if (typeid(CRet) == typeid(c_v64) && typeid(CArg1) == typeid(c_v64) && - typeid(CArg2) == typeid(c_v64)) { - // V64_V64V64 - error = CompareSimd2Args<v64, v64, v64, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg1) == typeid(uint32_t) && - typeid(CArg2) == typeid(uint32_t)) { - // V64_U32U32 - error = CompareSimd2Args<v64, uint32_t, uint32_t, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(u32_load_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg1) == typeid(c_v64) && - typeid(CArg2) == typeid(c_v64)) { - // U32_V64V64 - error = CompareSimd2Args<uint32_t, v64, v64, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(int64_t) && - typeid(CArg1) == typeid(c_v64) && - typeid(CArg2) == typeid(c_v64)) { - // S64_V64V64 - error = CompareSimd2Args<int64_t, v64, v64, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(s64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_s64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v64) && - typeid(CArg1) == typeid(c_v64) && - typeid(CArg2) == typeid(uint32_t)) { - // V64_V64U32 - error = CompareSimd2Args<v64, v64, uint32_t, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v64_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v64_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128)) { - // V128_V128V128 - error = CompareSimd2Args<v128, v128, v128, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128)) { - // U32_V128V128 - error = CompareSimd2Args<uint32_t, v128, v128, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(uint64_t) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128)) { - // U64_V128V128 - error = CompareSimd2Args<uint64_t, v128, v128, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(u64_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u64_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(int64_t) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128)) { - // S64_V128V128 - error = CompareSimd2Args<int64_t, v128, v128, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(s64_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_s64_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg1) == typeid(uint64_t) && - typeid(CArg2) == typeid(uint64_t)) { - // V128_U64U64 - error = CompareSimd2Args<v128, uint64_t, uint64_t, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(u64_load_aligned), - reinterpret_cast<fptr>(u64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_u64_load_aligned), - reinterpret_cast<fptr>(c_u64_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg1) == typeid(c_v64) && - typeid(CArg2) == typeid(c_v64)) { - // V128_V64V64 - error = CompareSimd2Args<v128, v64, v64, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v64_load_aligned), - reinterpret_cast<fptr>(v64_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(c_v64_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v128) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(uint32_t)) { - // V128_V128U32 - error = CompareSimd2Args<v128, v128, uint32_t, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(c_v256)) { - // V256_V256V256 - error = CompareSimd2Args<v256, v256, v256, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(uint64_t) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(c_v256)) { - // U64_V256V256 - error = CompareSimd2Args<uint64_t, v256, v256, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(u64_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u64_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(int64_t) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(c_v256)) { - // S64_V256V256 - error = CompareSimd2Args<int64_t, v256, v256, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(s64_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_s64_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(uint32_t) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(c_v256)) { - // U32_V256V256 - error = CompareSimd2Args<uint32_t, v256, v256, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(u32_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_u32_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128)) { - // V256_V128V128 - error = CompareSimd2Args<v256, v128, v128, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(uint32_t)) { - // V256_V256U32 - error = CompareSimd2Args<v256, v256, uint32_t, CRet, CArg1, CArg2>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(u32_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_u32_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2); - - } else { - FAIL() << "Internal error: Unknown intrinsic function " - << typeid(CRet).name() << " " << name << "(" - << typeid(CArg1).name() << ", " << typeid(CArg2).name() << ")"; - } - } - - EXPECT_EQ(0, error) << "Error: mismatch for " << name << "(" - << Print(s1, sizeof(s1)) << ", " << Print(s2, sizeof(s2)) - << ") -> " << Print(d, sizeof(d)) << " (simd), " - << Print(ref_d, sizeof(ref_d)) << " (ref)"; -} - -template <typename CRet, typename CArg1, typename CArg2, typename CArg3> -void TestSimd3Args(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - fptr ref_simd; - fptr simd; - int error = 0; - DECLARE_ALIGNED(32, uint8_t, s1[32]); - DECLARE_ALIGNED(32, uint8_t, s2[32]); - DECLARE_ALIGNED(32, uint8_t, s3[32]); - DECLARE_ALIGNED(32, uint8_t, d[32]); - DECLARE_ALIGNED(32, uint8_t, ref_d[32]); - assert(sizeof(CArg1) <= 32 && sizeof(CArg2) <= 32 && sizeof(CArg3) <= 32 && - sizeof(CRet) <= 32); - memset(ref_d, 0, sizeof(ref_d)); - memset(d, 0, sizeof(d)); - - Map(name, &ref_simd, &simd); - if (simd == NULL || ref_simd == NULL) { - FAIL() << "Internal error: Unknown intrinsic function " << name; - } - - for (unsigned int count = 0; - count < iterations && !error && !testing::Test::HasFailure(); count++) { - for (unsigned int c = 0; c < sizeof(CArg1); c++) s1[c] = rnd.Rand8(); - - for (unsigned int c = 0; c < sizeof(CArg2); c++) s2[c] = rnd.Rand8(); - - for (unsigned int c = 0; c < sizeof(CArg3); c++) s3[c] = rnd.Rand8(); - - if (maskwidth) SetMask(s3, sizeof(CArg3), mask, maskwidth); - - if (typeid(CRet) == typeid(c_v128) && typeid(CArg1) == typeid(c_v128) && - typeid(CArg2) == typeid(c_v128) && typeid(CArg3) == typeid(c_v128)) { - // V128_V128V128V128 - error = - CompareSimd3Args<v128, v128, v128, v128, CRet, CArg1, CArg2, CArg3>( - reinterpret_cast<fptr>(v128_store_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), - reinterpret_cast<fptr>(v128_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v128_store_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(c_v128_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2, s3); - } else if (typeid(CRet) == typeid(c_v256) && - typeid(CArg1) == typeid(c_v256) && - typeid(CArg2) == typeid(c_v256) && - typeid(CArg3) == typeid(c_v256)) { - // V256_V256V256V256 - error = - CompareSimd3Args<v256, v256, v256, v256, CRet, CArg1, CArg2, CArg3>( - reinterpret_cast<fptr>(v256_store_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), - reinterpret_cast<fptr>(v256_load_aligned), simd, d, - reinterpret_cast<fptr>(c_v256_store_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(c_v256_load_aligned), - reinterpret_cast<fptr>(ref_simd), ref_d, s1, s2, s3); - } else { - FAIL() << "Internal error: Unknown intrinsic function " - << typeid(CRet).name() << " " << name << "(" - << typeid(CArg1).name() << ", " << typeid(CArg2).name() << ", " - << typeid(CArg3).name() << ")"; - } - } - - EXPECT_EQ(0, error) << "Error: mismatch for " << name << "(" - << Print(s1, sizeof(s1)) << ", " << Print(s2, sizeof(s2)) - << ", " << Print(s3, sizeof(s3)) << ") -> " - << Print(d, sizeof(d)) << " (simd), " - << Print(ref_d, sizeof(ref_d)) << " (ref)"; -} - -// Instantiations to make the functions callable from another files -template void TestSimd1Arg<c_v64, uint8_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v64, uint16_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v64, uint32_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v64, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint32_t, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<int32_t, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint64_t, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<int64_t, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<c_v64, uint32_t, uint32_t>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v64, c_v64, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<c_v64, c_v64, uint32_t>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<int64_t, c_v64, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<uint32_t, c_v64, c_v64>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd1Arg<c_v128, c_v128>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v128, uint8_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v128, uint16_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v128, uint32_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v128, uint64_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v128, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint32_t, c_v128>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint64_t, c_v128>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v64, c_v128>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<c_v128, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v128, c_v128, uint32_t>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v128, uint64_t, uint64_t>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v128, c_v64, c_v64>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<uint64_t, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<int64_t, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<uint32_t, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd3Args<c_v128, c_v128, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, - const char *); -template void TestSimd1Arg<c_v256, c_v128>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v256, c_v256>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint64_t, c_v256>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v256, uint8_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v256, uint16_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v256, uint32_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v256, uint64_t>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<uint32_t, c_v256>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd1Arg<c_v64, c_v256>(uint32_t, uint32_t, uint32_t, - const char *); -template void TestSimd2Args<c_v256, c_v128, c_v128>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v256, c_v256, c_v256>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<c_v256, c_v256, uint32_t>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<uint64_t, c_v256, c_v256>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<int64_t, c_v256, c_v256>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd2Args<uint32_t, c_v256, c_v256>(uint32_t, uint32_t, - uint32_t, const char *); -template void TestSimd3Args<c_v256, c_v256, c_v256, c_v256>(uint32_t, uint32_t, - uint32_t, - const char *); - -} // namespace SIMD_NAMESPACE diff --git a/third_party/aom/test/simd_cmp_neon.cc b/third_party/aom/test/simd_cmp_neon.cc deleted file mode 100644 index 53c1e2a07..000000000 --- a/third_party/aom/test/simd_cmp_neon.cc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if defined(__OPTIMIZE__) && __OPTIMIZE__ -#define ARCH NEON -#define ARCH_POSTFIX(name) name##_neon -#define SIMD_NAMESPACE simd_test_neon -#include "test/simd_cmp_impl.h" -#endif diff --git a/third_party/aom/test/simd_cmp_sse2.cc b/third_party/aom/test/simd_cmp_sse2.cc deleted file mode 100644 index f7827a7fa..000000000 --- a/third_party/aom/test/simd_cmp_sse2.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSE2 -#define ARCH_POSTFIX(name) name##_sse2 -#define SIMD_NAMESPACE simd_test_sse2 -#include "test/simd_cmp_impl.h" -#endif diff --git a/third_party/aom/test/simd_cmp_sse4.cc b/third_party/aom/test/simd_cmp_sse4.cc deleted file mode 100644 index 3566764b6..000000000 --- a/third_party/aom/test/simd_cmp_sse4.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSE4_1 -#define ARCH_POSTFIX(name) name##_sse4_1 -#define SIMD_NAMESPACE simd_test_sse4_1 -#include "test/simd_cmp_impl.h" -#endif diff --git a/third_party/aom/test/simd_cmp_ssse3.cc b/third_party/aom/test/simd_cmp_ssse3.cc deleted file mode 100644 index 57bf135dd..000000000 --- a/third_party/aom/test/simd_cmp_ssse3.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSSE3 -#define ARCH_POSTFIX(name) name##_ssse3 -#define SIMD_NAMESPACE simd_test_ssse3 -#include "test/simd_cmp_impl.h" -#endif diff --git a/third_party/aom/test/simd_impl.h b/third_party/aom/test/simd_impl.h deleted file mode 100644 index fd06f67fd..000000000 --- a/third_party/aom/test/simd_impl.h +++ /dev/null @@ -1,1141 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#define SIMD_CHECK 1 -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "aom_dsp/aom_simd_inline.h" -#include "aom_dsp/simd/v256_intrinsics_c.h" - -namespace SIMD_NAMESPACE { - -template <typename param_signature> -class TestIntrinsic : public ::testing::TestWithParam<param_signature> { - public: - virtual ~TestIntrinsic() {} - virtual void SetUp() { - mask = ::testing::get<0>(this->GetParam()); - maskwidth = ::testing::get<1>(this->GetParam()); - name = ::testing::get<2>(this->GetParam()); - } - - virtual void TearDown() { libaom_test::ClearSystemState(); } - - protected: - uint32_t mask, maskwidth; - const char *name; -}; - -// Create one typedef for each function signature -#define TYPEDEF_SIMD(name) \ - typedef TestIntrinsic< ::testing::tuple<uint32_t, uint32_t, const char *> > \ - ARCH_POSTFIX(name) - -TYPEDEF_SIMD(V64_U8); -TYPEDEF_SIMD(V64_U16); -TYPEDEF_SIMD(V64_U32); -TYPEDEF_SIMD(V64_V64); -TYPEDEF_SIMD(U32_V64); -TYPEDEF_SIMD(S32_V64); -TYPEDEF_SIMD(U64_V64); -TYPEDEF_SIMD(S64_V64); -TYPEDEF_SIMD(V64_U32U32); -TYPEDEF_SIMD(V64_V64V64); -TYPEDEF_SIMD(S64_V64V64); -TYPEDEF_SIMD(V64_V64U32); -TYPEDEF_SIMD(U32_V64V64); -TYPEDEF_SIMD(V128_V64); -TYPEDEF_SIMD(V128_V128); -TYPEDEF_SIMD(U32_V128); -TYPEDEF_SIMD(U64_V128); -TYPEDEF_SIMD(V64_V128); -TYPEDEF_SIMD(V128_U8); -TYPEDEF_SIMD(V128_U16); -TYPEDEF_SIMD(V128_U32); -TYPEDEF_SIMD(V128_U64); -TYPEDEF_SIMD(V128_U64U64); -TYPEDEF_SIMD(V128_V64V64); -TYPEDEF_SIMD(V128_V128V128); -TYPEDEF_SIMD(V128_V128V128V128); -TYPEDEF_SIMD(S64_V128V128); -TYPEDEF_SIMD(V128_V128U32); -TYPEDEF_SIMD(U32_V128V128); -TYPEDEF_SIMD(U64_V128V128); -TYPEDEF_SIMD(V256_V128); -TYPEDEF_SIMD(V256_V256); -TYPEDEF_SIMD(U64_V256); -TYPEDEF_SIMD(V256_V128V128); -TYPEDEF_SIMD(V256_V256V256); -TYPEDEF_SIMD(V256_V256V256V256); -TYPEDEF_SIMD(U64_V256V256); -TYPEDEF_SIMD(S64_V256V256); -TYPEDEF_SIMD(V256_V256U32); -TYPEDEF_SIMD(U32_V256V256); -TYPEDEF_SIMD(V256_U8); -TYPEDEF_SIMD(V256_U16); -TYPEDEF_SIMD(V256_U32); -TYPEDEF_SIMD(V256_U64); -TYPEDEF_SIMD(U32_V256); -TYPEDEF_SIMD(V64_V256); - -// Google Test allows up to 50 tests per case, so split the largest -typedef ARCH_POSTFIX(V64_V64) ARCH_POSTFIX(V64_V64_Part2); -typedef ARCH_POSTFIX(V64_V64V64) ARCH_POSTFIX(V64_V64V64_Part2); -typedef ARCH_POSTFIX(V128_V128) ARCH_POSTFIX(V128_V128_Part2); -typedef ARCH_POSTFIX(V128_V128) ARCH_POSTFIX(V128_V128_Part3); -typedef ARCH_POSTFIX(V128_V128) ARCH_POSTFIX(V128_V128_Part4); -typedef ARCH_POSTFIX(V128_V128V128) ARCH_POSTFIX(V128_V128V128_Part2); -typedef ARCH_POSTFIX(V256_V256) ARCH_POSTFIX(V256_V256_Part2); -typedef ARCH_POSTFIX(V256_V256) ARCH_POSTFIX(V256_V256_Part3); -typedef ARCH_POSTFIX(V256_V256) ARCH_POSTFIX(V256_V256_Part4); -typedef ARCH_POSTFIX(V256_V256) ARCH_POSTFIX(V256_V256_Part5); -typedef ARCH_POSTFIX(V256_V256V256) ARCH_POSTFIX(V256_V256V256_Part2); - -// These functions are machine tuned located elsewhere -template <typename c_ret, typename c_arg> -void TestSimd1Arg(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name); - -template <typename c_ret, typename c_arg1, typename c_arg2> -void TestSimd2Args(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name); - -template <typename c_ret, typename c_arg1, typename c_arg2, typename c_arg3> -void TestSimd3Args(uint32_t iterations, uint32_t mask, uint32_t maskwidth, - const char *name); - -const int kIterations = 65536; - -// Add a macro layer since TEST_P will quote the name so we need to -// expand it first with the prefix. -#define MY_TEST_P(name, test) TEST_P(name, test) - -MY_TEST_P(ARCH_POSTFIX(V64_U8), TestIntrinsics) { - TestSimd1Arg<c_v64, uint8_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_U16), TestIntrinsics) { - TestSimd1Arg<c_v64, uint16_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_U32), TestIntrinsics) { - TestSimd1Arg<c_v64, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V64), TestIntrinsics) { - TestSimd1Arg<c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U64_V64), TestIntrinsics) { - TestSimd1Arg<uint64_t, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(S64_V64), TestIntrinsics) { - TestSimd1Arg<int64_t, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V64), TestIntrinsics) { - TestSimd1Arg<uint32_t, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(S32_V64), TestIntrinsics) { - TestSimd1Arg<int32_t, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_U32U32), TestIntrinsics) { - TestSimd2Args<c_v64, uint32_t, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V64V64), TestIntrinsics) { - TestSimd2Args<c_v64, c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(S64_V64V64), TestIntrinsics) { - TestSimd2Args<int64_t, c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V64V64), TestIntrinsics) { - TestSimd2Args<uint32_t, c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V64U32), TestIntrinsics) { - TestSimd2Args<c_v64, c_v64, uint32_t>(kIterations, mask, maskwidth, name); -} - -// Google Test allows up to 50 tests per case, so split the largest -MY_TEST_P(ARCH_POSTFIX(V64_V64_Part2), TestIntrinsics) { - TestSimd1Arg<c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V64V64_Part2), TestIntrinsics) { - TestSimd2Args<c_v64, c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V128), TestIntrinsics) { - TestSimd1Arg<uint32_t, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U64_V128), TestIntrinsics) { - TestSimd1Arg<uint64_t, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V128), TestIntrinsics) { - TestSimd1Arg<c_v64, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128), TestIntrinsics) { - TestSimd1Arg<c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_U8), TestIntrinsics) { - TestSimd1Arg<c_v128, uint8_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_U16), TestIntrinsics) { - TestSimd1Arg<c_v128, uint16_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_U32), TestIntrinsics) { - TestSimd1Arg<c_v128, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_U64), TestIntrinsics) { - TestSimd1Arg<c_v128, uint64_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V64), TestIntrinsics) { - TestSimd1Arg<c_v128, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128V128), TestIntrinsics) { - TestSimd2Args<c_v128, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128V128V128), TestIntrinsics) { - TestSimd3Args<c_v128, c_v128, c_v128, c_v128>(kIterations, mask, maskwidth, - name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V128V128), TestIntrinsics) { - TestSimd2Args<uint32_t, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U64_V128V128), TestIntrinsics) { - TestSimd2Args<uint64_t, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(S64_V128V128), TestIntrinsics) { - TestSimd2Args<int64_t, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_U64U64), TestIntrinsics) { - TestSimd2Args<c_v128, uint64_t, uint64_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V64V64), TestIntrinsics) { - TestSimd2Args<c_v128, c_v64, c_v64>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128U32), TestIntrinsics) { - TestSimd2Args<c_v128, c_v128, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128V128_Part2), TestIntrinsics) { - TestSimd2Args<c_v128, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128_Part2), TestIntrinsics) { - TestSimd1Arg<c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128_Part3), TestIntrinsics) { - TestSimd1Arg<c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V128_V128_Part4), TestIntrinsics) { - TestSimd1Arg<c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U64_V256), TestIntrinsics) { - TestSimd1Arg<uint64_t, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V128), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256V256), TestIntrinsics) { - TestSimd2Args<c_v256, c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256V256V256), TestIntrinsics) { - TestSimd3Args<c_v256, c_v256, c_v256, c_v256>(kIterations, mask, maskwidth, - name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V128V128), TestIntrinsics) { - TestSimd2Args<c_v256, c_v128, c_v128>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V256V256), TestIntrinsics) { - TestSimd2Args<uint32_t, c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U64_V256V256), TestIntrinsics) { - TestSimd2Args<uint64_t, c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(S64_V256V256), TestIntrinsics) { - TestSimd2Args<int64_t, c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256V256_Part2), TestIntrinsics) { - TestSimd2Args<c_v256, c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256U32), TestIntrinsics) { - TestSimd2Args<c_v256, c_v256, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256_Part2), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256_Part3), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256_Part4), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_V256_Part5), TestIntrinsics) { - TestSimd1Arg<c_v256, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_U8), TestIntrinsics) { - TestSimd1Arg<c_v256, uint8_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_U16), TestIntrinsics) { - TestSimd1Arg<c_v256, uint16_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_U32), TestIntrinsics) { - TestSimd1Arg<c_v256, uint32_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V256_U64), TestIntrinsics) { - TestSimd1Arg<c_v256, uint64_t>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(U32_V256), TestIntrinsics) { - TestSimd1Arg<uint32_t, c_v256>(kIterations, mask, maskwidth, name); -} - -MY_TEST_P(ARCH_POSTFIX(V64_V256), TestIntrinsics) { - TestSimd1Arg<c_v64, c_v256>(kIterations, mask, maskwidth, name); -} - -// Add a macro layer since INSTANTIATE_TEST_CASE_P will quote the name -// so we need to expand it first with the prefix -#define INSTANTIATE(name, type, ...) \ - INSTANTIATE_TEST_CASE_P(name, type, ::testing::Values(__VA_ARGS__)) - -#define SIMD_TUPLE(name, mask, maskwidth) \ - ::testing::make_tuple(mask, maskwidth, static_cast<const char *>(#name)) - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V64V64), - (SIMD_TUPLE(v64_sad_u8, 0U, 0U), SIMD_TUPLE(v64_ssd_u8, 0U, 0U))); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V64_V64V64), SIMD_TUPLE(v64_add_8, 0U, 0U), - SIMD_TUPLE(v64_add_16, 0U, 0U), SIMD_TUPLE(v64_sadd_s16, 0U, 0U), - SIMD_TUPLE(v64_add_32, 0U, 0U), SIMD_TUPLE(v64_sub_8, 0U, 0U), - SIMD_TUPLE(v64_ssub_u8, 0U, 0U), SIMD_TUPLE(v64_ssub_s8, 0U, 0U), - SIMD_TUPLE(v64_sub_16, 0U, 0U), SIMD_TUPLE(v64_ssub_s16, 0U, 0U), - SIMD_TUPLE(v64_ssub_u16, 0U, 0U), SIMD_TUPLE(v64_sub_32, 0U, 0U), - SIMD_TUPLE(v64_ziplo_8, 0U, 0U), SIMD_TUPLE(v64_ziphi_8, 0U, 0U), - SIMD_TUPLE(v64_ziplo_16, 0U, 0U), SIMD_TUPLE(v64_ziphi_16, 0U, 0U), - SIMD_TUPLE(v64_ziplo_32, 0U, 0U), SIMD_TUPLE(v64_ziphi_32, 0U, 0U), - SIMD_TUPLE(v64_pack_s32_s16, 0U, 0U), SIMD_TUPLE(v64_pack_s16_u8, 0U, 0U), - SIMD_TUPLE(v64_pack_s16_s8, 0U, 0U), SIMD_TUPLE(v64_unziphi_8, 0U, 0U), - SIMD_TUPLE(v64_unziplo_8, 0U, 0U), SIMD_TUPLE(v64_unziphi_16, 0U, 0U), - SIMD_TUPLE(v64_unziplo_16, 0U, 0U), SIMD_TUPLE(v64_or, 0U, 0U), - SIMD_TUPLE(v64_xor, 0U, 0U), SIMD_TUPLE(v64_and, 0U, 0U), - SIMD_TUPLE(v64_andn, 0U, 0U), SIMD_TUPLE(v64_mullo_s16, 0U, 0U), - SIMD_TUPLE(v64_mulhi_s16, 0U, 0U), SIMD_TUPLE(v64_mullo_s32, 0U, 0U), - SIMD_TUPLE(v64_madd_s16, 0U, 0U), SIMD_TUPLE(v64_madd_us8, 0U, 0U), - SIMD_TUPLE(v64_avg_u8, 0U, 0U), SIMD_TUPLE(v64_rdavg_u8, 0U, 0U), - SIMD_TUPLE(v64_avg_u16, 0U, 0U), SIMD_TUPLE(v64_min_u8, 0U, 0U), - SIMD_TUPLE(v64_max_u8, 0U, 0U), SIMD_TUPLE(v64_min_s8, 0U, 0U), - SIMD_TUPLE(v64_max_s8, 0U, 0U), SIMD_TUPLE(v64_min_s16, 0U, 0U), - SIMD_TUPLE(v64_max_s16, 0U, 0U), SIMD_TUPLE(v64_cmpgt_s8, 0U, 0U), - SIMD_TUPLE(v64_cmplt_s8, 0U, 0U), SIMD_TUPLE(v64_cmpeq_8, 0U, 0U), - SIMD_TUPLE(v64_cmpgt_s16, 0U, 0U), SIMD_TUPLE(v64_cmplt_s16, 0U, 0U), - SIMD_TUPLE(v64_cmpeq_16, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V64_V64V64_Part2), SIMD_TUPLE(v64_shuffle_8, 7U, 8U), - SIMD_TUPLE(v64_pack_s32_u16, 0U, 0U), SIMD_TUPLE(v64_rdavg_u16, 0U, 0U), - SIMD_TUPLE(v64_sadd_s8, 0U, 0U), SIMD_TUPLE(v64_sadd_u8, 0U, 0U), - SIMD_TUPLE(imm_v64_align<1>, 0U, 0U), SIMD_TUPLE(imm_v64_align<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_align<3>, 0U, 0U), SIMD_TUPLE(imm_v64_align<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_align<5>, 0U, 0U), SIMD_TUPLE(imm_v64_align<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_align<7>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V64), SIMD_TUPLE(v64_abs_s8, 0U, 0U), - SIMD_TUPLE(v64_abs_s16, 0U, 0U), - SIMD_TUPLE(v64_unpacklo_u8_s16, 0U, 0U), - SIMD_TUPLE(v64_unpackhi_u8_s16, 0U, 0U), - SIMD_TUPLE(v64_unpacklo_s8_s16, 0U, 0U), - SIMD_TUPLE(v64_unpackhi_s8_s16, 0U, 0U), - SIMD_TUPLE(v64_unpacklo_u16_s32, 0U, 0U), - SIMD_TUPLE(v64_unpacklo_s16_s32, 0U, 0U), - SIMD_TUPLE(v64_unpackhi_u16_s32, 0U, 0U), - SIMD_TUPLE(v64_unpackhi_s16_s32, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<3>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<5>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_8<7>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<3>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<5>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u8<7>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<3>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<5>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s8<7>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<8>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V64_Part2), - SIMD_TUPLE(imm_v64_shl_n_16<10>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_16<14>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<8>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<10>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u16<14>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<2>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<6>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<8>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<10>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s16<14>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<8>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<16>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<20>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<24>, 0U, 0U), - SIMD_TUPLE(imm_v64_shl_n_32<28>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<8>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<16>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<20>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<24>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_u32<28>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<1>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<4>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<8>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<12>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<16>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<20>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<24>, 0U, 0U), - SIMD_TUPLE(imm_v64_shr_n_s32<28>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V64U32), SIMD_TUPLE(v64_shl_8, 7U, 32U), - SIMD_TUPLE(v64_shr_u8, 7U, 32U), SIMD_TUPLE(v64_shr_s8, 7U, 32U), - SIMD_TUPLE(v64_shl_16, 15U, 32U), SIMD_TUPLE(v64_shr_u16, 15U, 32U), - SIMD_TUPLE(v64_shr_s16, 15U, 32U), SIMD_TUPLE(v64_shl_32, 31U, 32U), - SIMD_TUPLE(v64_shr_u32, 31U, 32U), - SIMD_TUPLE(v64_shr_s32, 31U, 32U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V64), SIMD_TUPLE(v64_hadd_u8, 0U, 0U), - SIMD_TUPLE(v64_u64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V64), SIMD_TUPLE(v64_hadd_s16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V64), SIMD_TUPLE(v64_low_u32, 0U, 0U), - SIMD_TUPLE(v64_high_u32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(S32_V64), SIMD_TUPLE(v64_low_s32, 0U, 0U), - SIMD_TUPLE(v64_high_s32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V64V64), SIMD_TUPLE(v64_dotp_s16, 0U, 0U), - SIMD_TUPLE(v64_dotp_su8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_U8), SIMD_TUPLE(v64_dup_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_U16), SIMD_TUPLE(v64_dup_16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_U32), SIMD_TUPLE(v64_dup_32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_U32U32), SIMD_TUPLE(v64_from_32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V128V128), SIMD_TUPLE(v128_sad_u8, 0U, 0U), - SIMD_TUPLE(v128_ssd_u8, 0U, 0U), SIMD_TUPLE(v128_sad_u16, 0U, 0U)); -INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V128V128), SIMD_TUPLE(v128_ssd_s16, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V128_V128V128), SIMD_TUPLE(v128_add_8, 0U, 0U), - SIMD_TUPLE(v128_add_16, 0U, 0U), SIMD_TUPLE(v128_sadd_s16, 0U, 0U), - SIMD_TUPLE(v128_add_32, 0U, 0U), SIMD_TUPLE(v128_sub_8, 0U, 0U), - SIMD_TUPLE(v128_ssub_u8, 0U, 0U), SIMD_TUPLE(v128_ssub_s8, 0U, 0U), - SIMD_TUPLE(v128_sub_16, 0U, 0U), SIMD_TUPLE(v128_ssub_s16, 0U, 0U), - SIMD_TUPLE(v128_ssub_u16, 0U, 0U), SIMD_TUPLE(v128_sub_32, 0U, 0U), - SIMD_TUPLE(v128_ziplo_8, 0U, 0U), SIMD_TUPLE(v128_ziphi_8, 0U, 0U), - SIMD_TUPLE(v128_ziplo_16, 0U, 0U), SIMD_TUPLE(v128_ziphi_16, 0U, 0U), - SIMD_TUPLE(v128_ziplo_32, 0U, 0U), SIMD_TUPLE(v128_ziphi_32, 0U, 0U), - SIMD_TUPLE(v128_ziplo_64, 0U, 0U), SIMD_TUPLE(v128_ziphi_64, 0U, 0U), - SIMD_TUPLE(v128_unziphi_8, 0U, 0U), SIMD_TUPLE(v128_unziplo_8, 0U, 0U), - SIMD_TUPLE(v128_unziphi_16, 0U, 0U), SIMD_TUPLE(v128_unziplo_16, 0U, 0U), - SIMD_TUPLE(v128_unziphi_32, 0U, 0U), SIMD_TUPLE(v128_unziplo_32, 0U, 0U), - SIMD_TUPLE(v128_pack_s32_s16, 0U, 0U), SIMD_TUPLE(v128_pack_s16_u8, 0U, 0U), - SIMD_TUPLE(v128_pack_s16_s8, 0U, 0U), SIMD_TUPLE(v128_or, 0U, 0U), - SIMD_TUPLE(v128_xor, 0U, 0U), SIMD_TUPLE(v128_and, 0U, 0U), - SIMD_TUPLE(v128_andn, 0U, 0U), SIMD_TUPLE(v128_mullo_s16, 0U, 0U), - SIMD_TUPLE(v128_mulhi_s16, 0U, 0U), SIMD_TUPLE(v128_mullo_s32, 0U, 0U), - SIMD_TUPLE(v128_madd_s16, 0U, 0U), SIMD_TUPLE(v128_madd_us8, 0U, 0U), - SIMD_TUPLE(v128_avg_u8, 0U, 0U), SIMD_TUPLE(v128_rdavg_u8, 0U, 0U), - SIMD_TUPLE(v128_avg_u16, 0U, 0U), SIMD_TUPLE(v128_min_u8, 0U, 0U), - SIMD_TUPLE(v128_max_u8, 0U, 0U), SIMD_TUPLE(v128_min_s8, 0U, 0U), - SIMD_TUPLE(v128_max_s8, 0U, 0U), SIMD_TUPLE(v128_min_s16, 0U, 0U), - SIMD_TUPLE(v128_max_s16, 0U, 0U), SIMD_TUPLE(v128_cmpgt_s8, 0U, 0U), - SIMD_TUPLE(v128_cmplt_s8, 0U, 0U), SIMD_TUPLE(v128_cmpeq_8, 0U, 0U), - SIMD_TUPLE(v128_cmpgt_s16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128V128_Part2), - SIMD_TUPLE(v128_pack_s32_u16, 0U, 0U), - SIMD_TUPLE(v128_rdavg_u16, 0U, 0U), SIMD_TUPLE(v128_add_64, 0U, 0U), - SIMD_TUPLE(v128_sub_64, 0U, 0U), SIMD_TUPLE(v128_sadd_s8, 0U, 0U), - SIMD_TUPLE(v128_sadd_u8, 0U, 0U), SIMD_TUPLE(v128_cmpeq_16, 0U, 0U), - SIMD_TUPLE(v128_cmplt_s16, 0U, 0U), - SIMD_TUPLE(v128_cmplt_s32, 0U, 0U), - SIMD_TUPLE(v128_cmpeq_32, 0U, 0U), - SIMD_TUPLE(v128_cmpgt_s32, 0U, 0U), - SIMD_TUPLE(v128_shuffle_8, 15U, 8U), - SIMD_TUPLE(v128_min_s32, 0U, 0U), SIMD_TUPLE(v128_max_s32, 0U, 0U), - SIMD_TUPLE(imm_v128_align<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<9>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<11>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<13>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_align<15>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128V128V128), - SIMD_TUPLE(v128_blend_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128), SIMD_TUPLE(v128_abs_s8, 0U, 0U), - SIMD_TUPLE(v128_abs_s16, 0U, 0U), SIMD_TUPLE(v128_padd_s16, 0U, 0U), - SIMD_TUPLE(v128_unpacklo_u8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpacklo_s8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpacklo_u16_s32, 0U, 0U), - SIMD_TUPLE(v128_unpacklo_s16_s32, 0U, 0U), - SIMD_TUPLE(v128_unpackhi_u8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpackhi_s8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpackhi_u16_s32, 0U, 0U), - SIMD_TUPLE(v128_unpackhi_s16_s32, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<9>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<11>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<13>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_byte<15>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<9>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<11>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<13>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_byte<15>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_8<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<1>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128_Part2), - SIMD_TUPLE(imm_v128_shr_n_u8<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u8<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<3>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<5>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s8<7>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_16<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u16<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<2>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<6>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<10>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s16<14>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_32<28>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<4>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128_Part3), - SIMD_TUPLE(imm_v128_shr_n_u32<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u32<28>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s32<28>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V128_Part4), - SIMD_TUPLE(imm_v128_shl_n_64<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<28>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<32>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<36>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<40>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<44>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<48>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<52>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<56>, 0U, 0U), - SIMD_TUPLE(imm_v128_shl_n_64<60>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<28>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<32>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<36>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<40>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<44>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<48>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<52>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<56>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_u64<60>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<1>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<4>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<8>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<12>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<16>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<20>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<24>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<28>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<32>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<36>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<40>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<44>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<48>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<52>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<56>, 0U, 0U), - SIMD_TUPLE(imm_v128_shr_n_s64<60>, 0U, 0U), - SIMD_TUPLE(v128_padd_u8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V64V64), SIMD_TUPLE(v128_from_v64, 0U, 0U), - SIMD_TUPLE(v128_zip_8, 0U, 0U), SIMD_TUPLE(v128_zip_16, 0U, 0U), - SIMD_TUPLE(v128_zip_32, 0U, 0U), SIMD_TUPLE(v128_mul_s16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U64U64), SIMD_TUPLE(v128_from_64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_V64), - SIMD_TUPLE(v128_unpack_u8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpack_s8_s16, 0U, 0U), - SIMD_TUPLE(v128_unpack_u16_s32, 0U, 0U), - SIMD_TUPLE(v128_unpack_s16_s32, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V128_V128U32), SIMD_TUPLE(v128_shl_8, 7U, 32U), - SIMD_TUPLE(v128_shr_u8, 7U, 32U), SIMD_TUPLE(v128_shr_s8, 7U, 32U), - SIMD_TUPLE(v128_shl_16, 15U, 32U), SIMD_TUPLE(v128_shr_u16, 15U, 32U), - SIMD_TUPLE(v128_shr_s16, 15U, 32U), SIMD_TUPLE(v128_shl_32, 31U, 32U), - SIMD_TUPLE(v128_shr_u32, 31U, 32U), SIMD_TUPLE(v128_shr_s32, 31U, 32U), - SIMD_TUPLE(v128_shl_64, 63U, 32U), SIMD_TUPLE(v128_shr_u64, 63U, 32U), - SIMD_TUPLE(v128_shr_s64, 63U, 32U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V128), SIMD_TUPLE(v128_low_u32, 0U, 0U), - SIMD_TUPLE(v128_movemask_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V128), SIMD_TUPLE(v128_hadd_u8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V128), SIMD_TUPLE(v128_low_v64, 0U, 0U), - SIMD_TUPLE(v128_high_v64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U8), SIMD_TUPLE(v128_dup_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U16), SIMD_TUPLE(v128_dup_16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U32), SIMD_TUPLE(v128_dup_32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U64), SIMD_TUPLE(v128_dup_64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V128V128), SIMD_TUPLE(v128_dotp_s16, 0U, 0U), - SIMD_TUPLE(v128_dotp_s32, 0U, 0U), - SIMD_TUPLE(v128_dotp_su8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V256V256), SIMD_TUPLE(v256_sad_u8, 0U, 0U), - SIMD_TUPLE(v256_ssd_u8, 0U, 0U), SIMD_TUPLE(v256_sad_u16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V256), SIMD_TUPLE(v256_hadd_u8, 0U, 0U), - SIMD_TUPLE(v256_low_u64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V256V256), SIMD_TUPLE(v256_dotp_s16, 0U, 0U), - SIMD_TUPLE(v256_dotp_s32, 0U, 0U), - SIMD_TUPLE(v256_dotp_su8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V256V256), SIMD_TUPLE(v256_ssd_s16, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V256_V256V256), SIMD_TUPLE(v256_add_8, 0U, 0U), - SIMD_TUPLE(v256_add_16, 0U, 0U), SIMD_TUPLE(v256_sadd_s16, 0U, 0U), - SIMD_TUPLE(v256_add_32, 0U, 0U), SIMD_TUPLE(v256_sub_8, 0U, 0U), - SIMD_TUPLE(v256_ssub_u8, 0U, 0U), SIMD_TUPLE(v256_ssub_s8, 0U, 0U), - SIMD_TUPLE(v256_sub_16, 0U, 0U), SIMD_TUPLE(v256_ssub_s16, 0U, 0U), - SIMD_TUPLE(v256_ssub_u16, 0U, 0U), SIMD_TUPLE(v256_sub_32, 0U, 0U), - SIMD_TUPLE(v256_ziplo_8, 0U, 0U), SIMD_TUPLE(v256_ziphi_8, 0U, 0U), - SIMD_TUPLE(v256_ziplo_16, 0U, 0U), SIMD_TUPLE(v256_ziphi_16, 0U, 0U), - SIMD_TUPLE(v256_ziplo_32, 0U, 0U), SIMD_TUPLE(v256_ziphi_32, 0U, 0U), - SIMD_TUPLE(v256_ziplo_64, 0U, 0U), SIMD_TUPLE(v256_ziphi_64, 0U, 0U), - SIMD_TUPLE(v256_ziplo_128, 0U, 0U), SIMD_TUPLE(v256_ziphi_128, 0U, 0U), - SIMD_TUPLE(v256_unziphi_8, 0U, 0U), SIMD_TUPLE(v256_unziplo_8, 0U, 0U), - SIMD_TUPLE(v256_unziphi_16, 0U, 0U), SIMD_TUPLE(v256_unziplo_16, 0U, 0U), - SIMD_TUPLE(v256_unziphi_32, 0U, 0U), SIMD_TUPLE(v256_unziplo_32, 0U, 0U), - SIMD_TUPLE(v256_pack_s32_s16, 0U, 0U), SIMD_TUPLE(v256_pack_s16_u8, 0U, 0U), - SIMD_TUPLE(v256_pack_s16_s8, 0U, 0U), SIMD_TUPLE(v256_or, 0U, 0U), - SIMD_TUPLE(v256_xor, 0U, 0U), SIMD_TUPLE(v256_and, 0U, 0U), - SIMD_TUPLE(v256_andn, 0U, 0U), SIMD_TUPLE(v256_mullo_s16, 0U, 0U), - SIMD_TUPLE(v256_mulhi_s16, 0U, 0U), SIMD_TUPLE(v256_mullo_s32, 0U, 0U), - SIMD_TUPLE(v256_madd_s16, 0U, 0U), SIMD_TUPLE(v256_madd_us8, 0U, 0U), - SIMD_TUPLE(v256_avg_u8, 0U, 0U), SIMD_TUPLE(v256_rdavg_u8, 0U, 0U), - SIMD_TUPLE(v256_avg_u16, 0U, 0U), SIMD_TUPLE(v256_min_u8, 0U, 0U), - SIMD_TUPLE(v256_max_u8, 0U, 0U), SIMD_TUPLE(v256_min_s8, 0U, 0U), - SIMD_TUPLE(v256_max_s8, 0U, 0U), SIMD_TUPLE(v256_min_s16, 0U, 0U), - SIMD_TUPLE(v256_max_s16, 0U, 0U), SIMD_TUPLE(v256_cmpgt_s8, 0U, 0U), - SIMD_TUPLE(v256_cmplt_s8, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V256_V256V256_Part2), SIMD_TUPLE(v256_cmpeq_8, 0U, 0U), - SIMD_TUPLE(v256_min_s32, 0U, 0U), SIMD_TUPLE(v256_max_s32, 0U, 0U), - SIMD_TUPLE(v256_add_64, 0U, 0U), SIMD_TUPLE(v256_sub_64, 0U, 0U), - SIMD_TUPLE(v256_cmpgt_s16, 0U, 0U), SIMD_TUPLE(v256_cmplt_s16, 0U, 0U), - SIMD_TUPLE(v256_cmpeq_16, 0U, 0U), SIMD_TUPLE(v256_cmpgt_s32, 0U, 0U), - SIMD_TUPLE(v256_cmplt_s32, 0U, 0U), SIMD_TUPLE(v256_cmpeq_32, 0U, 0U), - SIMD_TUPLE(v256_shuffle_8, 31U, 8U), SIMD_TUPLE(v256_pshuffle_8, 15U, 8U), - SIMD_TUPLE(imm_v256_align<1>, 0U, 0U), SIMD_TUPLE(v256_sadd_s8, 0U, 0U), - SIMD_TUPLE(v256_sadd_u8, 0U, 0U), SIMD_TUPLE(v256_pack_s32_u16, 0U, 0U), - SIMD_TUPLE(v256_rdavg_u16, 0U, 0U), SIMD_TUPLE(imm_v256_align<2>, 0U, 0U), - SIMD_TUPLE(v256_unziphi_64, 0U, 0U), SIMD_TUPLE(v256_unziplo_64, 0U, 0U), - SIMD_TUPLE(imm_v256_align<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<9>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<11>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<13>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<15>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<17>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<18>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<19>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<21>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<22>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<23>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<25>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<26>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<27>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<29>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<30>, 0U, 0U), - SIMD_TUPLE(imm_v256_align<31>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V128V128), - SIMD_TUPLE(v256_from_v128, 0U, 0U), SIMD_TUPLE(v256_zip_8, 0U, 0U), - SIMD_TUPLE(v256_zip_16, 0U, 0U), SIMD_TUPLE(v256_zip_32, 0U, 0U), - SIMD_TUPLE(v256_mul_s16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V128), - SIMD_TUPLE(v256_unpack_u8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpack_s8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpack_u16_s32, 0U, 0U), - SIMD_TUPLE(v256_unpack_s16_s32, 0U, 0U)); - -INSTANTIATE( - ARCH, ARCH_POSTFIX(V256_V256U32), SIMD_TUPLE(v256_shl_8, 7U, 32U), - SIMD_TUPLE(v256_shr_u8, 7U, 32U), SIMD_TUPLE(v256_shr_s8, 7U, 32U), - SIMD_TUPLE(v256_shl_16, 15U, 32U), SIMD_TUPLE(v256_shr_u16, 15U, 32U), - SIMD_TUPLE(v256_shr_s16, 15U, 32U), SIMD_TUPLE(v256_shl_32, 31U, 32U), - SIMD_TUPLE(v256_shr_u32, 31U, 32U), SIMD_TUPLE(v256_shr_s32, 31U, 32U), - SIMD_TUPLE(v256_shl_64, 63U, 32U), SIMD_TUPLE(v256_shr_u64, 63U, 32U), - SIMD_TUPLE(v256_shr_s64, 63U, 32U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256), SIMD_TUPLE(v256_abs_s8, 0U, 0U), - SIMD_TUPLE(v256_abs_s16, 0U, 0U), SIMD_TUPLE(v256_padd_s16, 0U, 0U), - SIMD_TUPLE(v256_unpacklo_u8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpacklo_s8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpacklo_u16_s32, 0U, 0U), - SIMD_TUPLE(v256_unpacklo_s16_s32, 0U, 0U), - SIMD_TUPLE(v256_unpackhi_u8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpackhi_s8_s16, 0U, 0U), - SIMD_TUPLE(v256_unpackhi_u16_s32, 0U, 0U), - SIMD_TUPLE(v256_unpackhi_s16_s32, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<9>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<11>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<13>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<15>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<17>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<18>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<19>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<21>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<22>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<23>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<25>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<26>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<27>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<29>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<30>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_byte<31>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<8>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256_Part2), - SIMD_TUPLE(imm_v256_shl_n_byte<9>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<11>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<13>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<15>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<17>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<18>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<19>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<21>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<22>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<23>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<25>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<26>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<27>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<29>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<30>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_byte<31>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_8<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u8<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s8<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<10>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256_Part3), - SIMD_TUPLE(imm_v256_shl_n_16<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_16<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u16<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s16<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_32<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u32<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s32<28>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256_Part4), - SIMD_TUPLE(imm_v256_shl_n_64<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<32>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<36>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<40>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<44>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<48>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<52>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<56>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_64<60>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<32>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<36>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<40>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<44>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<48>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<52>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<56>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_u64<60>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<16>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<20>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<24>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<28>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<32>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<36>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<40>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<44>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<48>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<52>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<56>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_s64<60>, 0U, 0U), - SIMD_TUPLE(v256_padd_u8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256_Part5), - SIMD_TUPLE(imm_v256_shr_n_word<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<9>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<11>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<13>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shr_n_word<15>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<1>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<2>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<3>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<4>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<5>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<6>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<7>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<8>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<9>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<10>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<11>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<12>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<13>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<14>, 0U, 0U), - SIMD_TUPLE(imm_v256_shl_n_word<15>, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_V256V256V256), - SIMD_TUPLE(v256_blend_8, 0U, 0U), - SIMD_TUPLE(v256_wideshuffle_8, 63U, 8U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_U8), SIMD_TUPLE(v256_dup_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_U16), SIMD_TUPLE(v256_dup_16, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_U32), SIMD_TUPLE(v256_dup_32, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V256_U64), SIMD_TUPLE(v256_dup_64, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V256), SIMD_TUPLE(v256_low_u32, 0U, 0U), - SIMD_TUPLE(v256_movemask_8, 0U, 0U)); - -INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V256), SIMD_TUPLE(v256_low_v64, 0U, 0U)); - -} // namespace SIMD_NAMESPACE diff --git a/third_party/aom/test/simd_neon_test.cc b/third_party/aom/test/simd_neon_test.cc deleted file mode 100644 index b67b18895..000000000 --- a/third_party/aom/test/simd_neon_test.cc +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if defined(__OPTIMIZE__) && __OPTIMIZE__ -#define ARCH NEON -#define ARCH_POSTFIX(name) name##_neon -#define SIMD_NAMESPACE simd_test_neon -#include "test/simd_impl.h" -#endif diff --git a/third_party/aom/test/simd_sse2_test.cc b/third_party/aom/test/simd_sse2_test.cc deleted file mode 100644 index b37a931b3..000000000 --- a/third_party/aom/test/simd_sse2_test.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSE2 -#define ARCH_POSTFIX(name) name##_sse2 -#define SIMD_NAMESPACE simd_test_sse2 -#include "test/simd_impl.h" -#endif diff --git a/third_party/aom/test/simd_sse4_test.cc b/third_party/aom/test/simd_sse4_test.cc deleted file mode 100644 index b1c9d5cd8..000000000 --- a/third_party/aom/test/simd_sse4_test.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSE4_1 -#define ARCH_POSTFIX(name) name##_sse4_1 -#define SIMD_NAMESPACE simd_test_sse4_1 -#include "test/simd_impl.h" -#endif diff --git a/third_party/aom/test/simd_ssse3_test.cc b/third_party/aom/test/simd_ssse3_test.cc deleted file mode 100644 index d95c26fb5..000000000 --- a/third_party/aom/test/simd_ssse3_test.cc +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#if (defined(__OPTIMIZE__) && __OPTIMIZE__) || \ - (!defined(__GNUC__) && !defined(_DEBUG)) -#define ARCH SSSE3 -#define ARCH_POSTFIX(name) name##_ssse3 -#define SIMD_NAMESPACE simd_test_ssse3 -#include "test/simd_impl.h" -#endif diff --git a/third_party/aom/test/simple_decoder.sh b/third_party/aom/test/simple_decoder.sh deleted file mode 100755 index 5f39ad206..000000000 --- a/third_party/aom/test/simple_decoder.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom simple_decoder example code. To add new tests to -## this file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to simple_decoder_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: Make sure input is available: -simple_decoder_verify_environment() { - if [ ! "$(av1_encode_available)" = "yes" ] && [ ! -e "${AV1_IVF_FILE}" ]; then - return 1 - fi -} - -# Runs simple_decoder using $1 as input file. $2 is the codec name, and is used -# solely to name the output file. -simple_decoder() { - local decoder="$(aom_tool_path simple_decoder)" - local input_file="$1" - local codec="$2" - local output_file="${AOM_TEST_OUTPUT_DIR}/simple_decoder_${codec}.raw" - - if [ ! -x "${decoder}" ]; then - elog "${decoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${decoder}" "${input_file}" "${output_file}" \ - ${devnull} - - [ -e "${output_file}" ] || return 1 -} - -simple_decoder_av1() { - if [ "$(av1_decode_available)" = "yes" ]; then - if [ ! -e "${AV1_IVF_FILE}" ]; then - local file="${AOM_TEST_OUTPUT_DIR}/test_encode.ivf" - encode_yuv_raw_input_av1 "${file}" --ivf - simple_decoder "${file}" av1 || return 1 - else - simple_decoder "${AV1_IVF_FILE}" av1 || return 1 - fi - fi -} - -simple_decoder_tests="simple_decoder_av1" - -run_tests simple_decoder_verify_environment "${simple_decoder_tests}" diff --git a/third_party/aom/test/simple_encoder.sh b/third_party/aom/test/simple_encoder.sh deleted file mode 100755 index 5cd6b46a1..000000000 --- a/third_party/aom/test/simple_encoder.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom simple_encoder example. To add new tests to this -## file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to simple_encoder_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: $YUV_RAW_INPUT is required. -simple_encoder_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi -} - -# Runs simple_encoder using the codec specified by $1 with a frame limit of 100. -simple_encoder() { - local encoder="${LIBAOM_BIN_PATH}/simple_encoder${AOM_TEST_EXE_SUFFIX}" - local codec="$1" - local output_file="${AOM_TEST_OUTPUT_DIR}/simple_encoder_${codec}.ivf" - - if [ ! -x "${encoder}" ]; then - elog "${encoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ - "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" 9999 0 5 \ - ${devnull} - - [ -e "${output_file}" ] || return 1 -} - - -simple_encoder_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - simple_encoder av1 || return 1 - fi -} - -simple_encoder_tests="simple_encoder_av1" - -run_tests simple_encoder_verify_environment "${simple_encoder_tests}" diff --git a/third_party/aom/test/subtract_test.cc b/third_party/aom/test/subtract_test.cc deleted file mode 100644 index 7dcedf56d..000000000 --- a/third_party/aom/test/subtract_test.cc +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "av1/common/blockd.h" -#include "aom_mem/aom_mem.h" -#include "aom_ports/mem.h" - -typedef void (*SubtractFunc)(int rows, int cols, int16_t *diff_ptr, - ptrdiff_t diff_stride, const uint8_t *src_ptr, - ptrdiff_t src_stride, const uint8_t *pred_ptr, - ptrdiff_t pred_stride); - -namespace { - -class AV1SubtractBlockTest : public ::testing::TestWithParam<SubtractFunc> { - public: - virtual void TearDown() { libaom_test::ClearSystemState(); } -}; - -using libaom_test::ACMRandom; - -TEST_P(AV1SubtractBlockTest, SimpleSubtract) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - - // FIXME(rbultje) split in its own file - for (BLOCK_SIZE bsize = BLOCK_4X4; bsize < BLOCK_SIZES; - bsize = static_cast<BLOCK_SIZE>(static_cast<int>(bsize) + 1)) { - const int block_width = block_size_wide[bsize]; - const int block_height = block_size_high[bsize]; - int16_t *diff = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(*diff) * block_width * block_height * 2)); - uint8_t *pred = reinterpret_cast<uint8_t *>( - aom_memalign(16, block_width * block_height * 2)); - uint8_t *src = reinterpret_cast<uint8_t *>( - aom_memalign(16, block_width * block_height * 2)); - - for (int n = 0; n < 100; n++) { - for (int r = 0; r < block_height; ++r) { - for (int c = 0; c < block_width * 2; ++c) { - src[r * block_width * 2 + c] = rnd.Rand8(); - pred[r * block_width * 2 + c] = rnd.Rand8(); - } - } - - GetParam()(block_height, block_width, diff, block_width, src, block_width, - pred, block_width); - - for (int r = 0; r < block_height; ++r) { - for (int c = 0; c < block_width; ++c) { - EXPECT_EQ(diff[r * block_width + c], - (src[r * block_width + c] - pred[r * block_width + c])) - << "r = " << r << ", c = " << c << ", bs = " << bsize; - } - } - - GetParam()(block_height, block_width, diff, block_width * 2, src, - block_width * 2, pred, block_width * 2); - - for (int r = 0; r < block_height; ++r) { - for (int c = 0; c < block_width; ++c) { - EXPECT_EQ( - diff[r * block_width * 2 + c], - (src[r * block_width * 2 + c] - pred[r * block_width * 2 + c])) - << "r = " << r << ", c = " << c << ", bs = " << bsize; - } - } - } - aom_free(diff); - aom_free(pred); - aom_free(src); - } -} - -INSTANTIATE_TEST_CASE_P(C, AV1SubtractBlockTest, - ::testing::Values(aom_subtract_block_c)); - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, AV1SubtractBlockTest, - ::testing::Values(aom_subtract_block_sse2)); -#endif -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, AV1SubtractBlockTest, - ::testing::Values(aom_subtract_block_neon)); -#endif -#if HAVE_MSA -INSTANTIATE_TEST_CASE_P(MSA, AV1SubtractBlockTest, - ::testing::Values(aom_subtract_block_msa)); -#endif - -typedef void (*HBDSubtractFunc)(int rows, int cols, int16_t *diff_ptr, - ptrdiff_t diff_stride, const uint8_t *src_ptr, - ptrdiff_t src_stride, const uint8_t *pred_ptr, - ptrdiff_t pred_stride, int bd); - -using ::testing::get; -using ::testing::make_tuple; -using ::testing::tuple; - -// <width, height, bit_dpeth, subtract> -typedef tuple<int, int, int, HBDSubtractFunc> Params; - -class AV1HBDSubtractBlockTest : public ::testing::TestWithParam<Params> { - public: - virtual void SetUp() { - block_width_ = GET_PARAM(0); - block_height_ = GET_PARAM(1); - bit_depth_ = static_cast<aom_bit_depth_t>(GET_PARAM(2)); - func_ = GET_PARAM(3); - - rnd_.Reset(ACMRandom::DeterministicSeed()); - - const size_t max_width = 128; - const size_t max_block_size = max_width * max_width; - src_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>( - aom_memalign(16, max_block_size * sizeof(uint16_t)))); - pred_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>( - aom_memalign(16, max_block_size * sizeof(uint16_t)))); - diff_ = reinterpret_cast<int16_t *>( - aom_memalign(16, max_block_size * sizeof(int16_t))); - } - - virtual void TearDown() { - aom_free(CONVERT_TO_SHORTPTR(src_)); - aom_free(CONVERT_TO_SHORTPTR(pred_)); - aom_free(diff_); - } - - protected: - void CheckResult(); - void RunForSpeed(); - - private: - ACMRandom rnd_; - int block_height_; - int block_width_; - aom_bit_depth_t bit_depth_; - HBDSubtractFunc func_; - uint8_t *src_; - uint8_t *pred_; - int16_t *diff_; -}; - -void AV1HBDSubtractBlockTest::CheckResult() { - const int test_num = 100; - const size_t max_width = 128; - const int max_block_size = max_width * max_width; - const int mask = (1 << bit_depth_) - 1; - int i, j; - - for (i = 0; i < test_num; ++i) { - for (j = 0; j < max_block_size; ++j) { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask; - CONVERT_TO_SHORTPTR(pred_)[j] = rnd_.Rand16() & mask; - } - - func_(block_height_, block_width_, diff_, block_width_, src_, block_width_, - pred_, block_width_, bit_depth_); - - for (int r = 0; r < block_height_; ++r) { - for (int c = 0; c < block_width_; ++c) { - EXPECT_EQ(diff_[r * block_width_ + c], - (CONVERT_TO_SHORTPTR(src_)[r * block_width_ + c] - - CONVERT_TO_SHORTPTR(pred_)[r * block_width_ + c])) - << "r = " << r << ", c = " << c << ", test: " << i; - } - } - } -} - -TEST_P(AV1HBDSubtractBlockTest, CheckResult) { CheckResult(); } - -void AV1HBDSubtractBlockTest::RunForSpeed() { - const int test_num = 200000; - const size_t max_width = 128; - const int max_block_size = max_width * max_width; - const int mask = (1 << bit_depth_) - 1; - int i, j; - - for (j = 0; j < max_block_size; ++j) { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask; - CONVERT_TO_SHORTPTR(pred_)[j] = rnd_.Rand16() & mask; - } - - for (i = 0; i < test_num; ++i) { - func_(block_height_, block_width_, diff_, block_width_, src_, block_width_, - pred_, block_width_, bit_depth_); - } -} - -TEST_P(AV1HBDSubtractBlockTest, DISABLED_Speed) { RunForSpeed(); } - -#if HAVE_SSE2 - -const Params kAV1HBDSubtractBlock_sse2[] = { - make_tuple(4, 4, 12, &aom_highbd_subtract_block_sse2), - make_tuple(4, 4, 12, &aom_highbd_subtract_block_c), - make_tuple(4, 8, 12, &aom_highbd_subtract_block_sse2), - make_tuple(4, 8, 12, &aom_highbd_subtract_block_c), - make_tuple(8, 4, 12, &aom_highbd_subtract_block_sse2), - make_tuple(8, 4, 12, &aom_highbd_subtract_block_c), - make_tuple(8, 8, 12, &aom_highbd_subtract_block_sse2), - make_tuple(8, 8, 12, &aom_highbd_subtract_block_c), - make_tuple(8, 16, 12, &aom_highbd_subtract_block_sse2), - make_tuple(8, 16, 12, &aom_highbd_subtract_block_c), - make_tuple(16, 8, 12, &aom_highbd_subtract_block_sse2), - make_tuple(16, 8, 12, &aom_highbd_subtract_block_c), - make_tuple(16, 16, 12, &aom_highbd_subtract_block_sse2), - make_tuple(16, 16, 12, &aom_highbd_subtract_block_c), - make_tuple(16, 32, 12, &aom_highbd_subtract_block_sse2), - make_tuple(16, 32, 12, &aom_highbd_subtract_block_c), - make_tuple(32, 16, 12, &aom_highbd_subtract_block_sse2), - make_tuple(32, 16, 12, &aom_highbd_subtract_block_c), - make_tuple(32, 32, 12, &aom_highbd_subtract_block_sse2), - make_tuple(32, 32, 12, &aom_highbd_subtract_block_c), - make_tuple(32, 64, 12, &aom_highbd_subtract_block_sse2), - make_tuple(32, 64, 12, &aom_highbd_subtract_block_c), - make_tuple(64, 32, 12, &aom_highbd_subtract_block_sse2), - make_tuple(64, 32, 12, &aom_highbd_subtract_block_c), - make_tuple(64, 64, 12, &aom_highbd_subtract_block_sse2), - make_tuple(64, 64, 12, &aom_highbd_subtract_block_c), - make_tuple(64, 128, 12, &aom_highbd_subtract_block_sse2), - make_tuple(64, 128, 12, &aom_highbd_subtract_block_c), - make_tuple(128, 64, 12, &aom_highbd_subtract_block_sse2), - make_tuple(128, 64, 12, &aom_highbd_subtract_block_c), - make_tuple(128, 128, 12, &aom_highbd_subtract_block_sse2), - make_tuple(128, 128, 12, &aom_highbd_subtract_block_c) -}; - -INSTANTIATE_TEST_CASE_P(SSE2, AV1HBDSubtractBlockTest, - ::testing::ValuesIn(kAV1HBDSubtractBlock_sse2)); -#endif // HAVE_SSE2 -} // namespace diff --git a/third_party/aom/test/sum_squares_test.cc b/third_party/aom/test/sum_squares_test.cc deleted file mode 100644 index f10998498..000000000 --- a/third_party/aom/test/sum_squares_test.cc +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cmath> -#include <cstdlib> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom_ports/mem.h" -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "test/util.h" -#include "test/function_equivalence_test.h" - -using libaom_test::ACMRandom; -using libaom_test::FunctionEquivalenceTest; - -namespace { -const int kNumIterations = 10000; - -static const int16_t kInt13Max = (1 << 12) - 1; - -typedef uint64_t (*SSI16Func)(const int16_t *src, int stride, int width, - int height); -typedef libaom_test::FuncParam<SSI16Func> TestFuncs; - -class SumSquaresTest : public ::testing::TestWithParam<TestFuncs> { - public: - virtual ~SumSquaresTest() {} - virtual void SetUp() { - params_ = this->GetParam(); - rnd_.Reset(ACMRandom::DeterministicSeed()); - src_ = reinterpret_cast<int16_t *>(aom_memalign(16, 256 * 256 * 2)); - ASSERT_TRUE(src_ != NULL); - } - - virtual void TearDown() { - libaom_test::ClearSystemState(); - aom_free(src_); - } - void RunTest(int isRandom); - void RunSpeedTest(); - - void GenRandomData(int width, int height, int stride) { - const int msb = 11; // Up to 12 bit input - const int limit = 1 << (msb + 1); - for (int ii = 0; ii < height; ii++) { - for (int jj = 0; jj < width; jj++) { - src_[ii * stride + jj] = rnd_(2) ? rnd_(limit) : -rnd_(limit); - } - } - } - - void GenExtremeData(int width, int height, int stride) { - const int msb = 11; // Up to 12 bit input - const int limit = 1 << (msb + 1); - const int val = rnd_(2) ? limit - 1 : -(limit - 1); - for (int ii = 0; ii < height; ii++) { - for (int jj = 0; jj < width; jj++) { - src_[ii * stride + jj] = val; - } - } - } - - protected: - TestFuncs params_; - int16_t *src_; - ACMRandom rnd_; -}; - -void SumSquaresTest::RunTest(int isRandom) { - int failed = 0; - for (int k = 0; k < kNumIterations; k++) { - const int width = 4 * (rnd_(31) + 1); // Up to 128x128 - const int height = 4 * (rnd_(31) + 1); // Up to 128x128 - int stride = 4 << rnd_(7); // Up to 256 stride - while (stride < width) { // Make sure it's valid - stride = 4 << rnd_(7); - } - if (isRandom) { - GenRandomData(width, height, stride); - } else { - GenExtremeData(width, height, stride); - } - const uint64_t res_ref = params_.ref_func(src_, stride, width, height); - uint64_t res_tst; - ASM_REGISTER_STATE_CHECK(res_tst = - params_.tst_func(src_, stride, width, height)); - - if (!failed) { - failed = res_ref != res_tst; - EXPECT_EQ(res_ref, res_tst) - << "Error: Sum Squares Test [" << width << "x" << height - << "] C output does not match optimized output."; - } - } -} - -void SumSquaresTest::RunSpeedTest() { - for (int block = BLOCK_4X4; block < BLOCK_SIZES_ALL; block++) { - const int width = block_size_wide[block]; // Up to 128x128 - const int height = block_size_high[block]; // Up to 128x128 - int stride = 4 << rnd_(7); // Up to 256 stride - while (stride < width) { // Make sure it's valid - stride = 4 << rnd_(7); - } - GenExtremeData(width, height, stride); - const int num_loops = 1000000000 / (width + height); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - params_.ref_func(src_, stride, width, height); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("SumSquaresTest C %3dx%-3d: %7.2f ns\n", width, height, - 1000.0 * elapsed_time / num_loops); - - aom_usec_timer timer1; - aom_usec_timer_start(&timer1); - for (int i = 0; i < num_loops; ++i) - params_.tst_func(src_, stride, width, height); - aom_usec_timer_mark(&timer1); - const int elapsed_time1 = static_cast<int>(aom_usec_timer_elapsed(&timer1)); - printf("SumSquaresTest Test %3dx%-3d: %7.2f ns\n", width, height, - 1000.0 * elapsed_time1 / num_loops); - } -} - -TEST_P(SumSquaresTest, OperationCheck) { - RunTest(1); // GenRandomData -} - -TEST_P(SumSquaresTest, ExtremeValues) { - RunTest(0); // GenExtremeData -} - -TEST_P(SumSquaresTest, DISABLED_Speed) { RunSpeedTest(); } - -#if HAVE_SSE2 - -INSTANTIATE_TEST_CASE_P( - SSE2, SumSquaresTest, - ::testing::Values(TestFuncs(&aom_sum_squares_2d_i16_c, - &aom_sum_squares_2d_i16_sse2))); - -#endif // HAVE_SSE2 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P( - AVX2, SumSquaresTest, - ::testing::Values(TestFuncs(&aom_sum_squares_2d_i16_c, - &aom_sum_squares_2d_i16_avx2))); -#endif // HAVE_AVX2 - -////////////////////////////////////////////////////////////////////////////// -// 1D version -////////////////////////////////////////////////////////////////////////////// - -typedef uint64_t (*F1D)(const int16_t *src, uint32_t N); -typedef libaom_test::FuncParam<F1D> TestFuncs1D; - -class SumSquares1DTest : public FunctionEquivalenceTest<F1D> { - protected: - static const int kIterations = 1000; - static const int kMaxSize = 256; -}; - -TEST_P(SumSquares1DTest, RandomValues) { - DECLARE_ALIGNED(16, int16_t, src[kMaxSize * kMaxSize]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - for (int i = 0; i < kMaxSize * kMaxSize; ++i) - src[i] = rng_(kInt13Max * 2 + 1) - kInt13Max; - - const int N = rng_(2) ? rng_(kMaxSize * kMaxSize + 1 - kMaxSize) + kMaxSize - : rng_(kMaxSize) + 1; - - const uint64_t ref_res = params_.ref_func(src, N); - uint64_t tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(src, N)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -TEST_P(SumSquares1DTest, ExtremeValues) { - DECLARE_ALIGNED(16, int16_t, src[kMaxSize * kMaxSize]); - - for (int iter = 0; iter < kIterations && !HasFatalFailure(); ++iter) { - if (rng_(2)) { - for (int i = 0; i < kMaxSize * kMaxSize; ++i) src[i] = kInt13Max; - } else { - for (int i = 0; i < kMaxSize * kMaxSize; ++i) src[i] = -kInt13Max; - } - - const int N = rng_(2) ? rng_(kMaxSize * kMaxSize + 1 - kMaxSize) + kMaxSize - : rng_(kMaxSize) + 1; - - const uint64_t ref_res = params_.ref_func(src, N); - uint64_t tst_res; - ASM_REGISTER_STATE_CHECK(tst_res = params_.tst_func(src, N)); - - ASSERT_EQ(ref_res, tst_res); - } -} - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, SumSquares1DTest, - ::testing::Values(TestFuncs1D( - aom_sum_squares_i16_c, aom_sum_squares_i16_sse2))); - -#endif // HAVE_SSE2 -} // namespace diff --git a/third_party/aom/test/superframe_test.cc b/third_party/aom/test/superframe_test.cc deleted file mode 100644 index 7be18f72a..000000000 --- a/third_party/aom/test/superframe_test.cc +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <climits> -#include <vector> -#include "third_party/googletest/src/googletest/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 { - -const int kTestMode = 0; -const int kTileCols = 1; -const int kTileRows = 2; - -typedef ::testing::tuple<libaom_test::TestMode, int, int> SuperframeTestParam; - -class SuperframeTest - : public ::libaom_test::CodecTestWithParam<SuperframeTestParam>, - public ::libaom_test::EncoderTest { - protected: - SuperframeTest() : EncoderTest(GET_PARAM(0)), last_sf_pts_(0) {} - virtual ~SuperframeTest() {} - - virtual void SetUp() { - InitializeConfig(); - const SuperframeTestParam input = GET_PARAM(1); - const libaom_test::TestMode mode = ::testing::get<kTestMode>(input); - SetMode(mode); - sf_count_ = 0; - sf_count_max_ = INT_MAX; - n_tile_cols_ = ::testing::get<kTileCols>(input); - n_tile_rows_ = ::testing::get<kTileRows>(input); - } - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1); - encoder->Control(AOME_SET_CPUUSED, 2); - encoder->Control(AV1E_SET_TILE_COLUMNS, n_tile_cols_); - encoder->Control(AV1E_SET_TILE_ROWS, n_tile_rows_); - } - } - - virtual const aom_codec_cx_pkt_t *MutateEncoderOutputHook( - const aom_codec_cx_pkt_t *pkt) { - if (pkt->kind != AOM_CODEC_CX_FRAME_PKT) return pkt; - - const uint8_t *buffer = reinterpret_cast<uint8_t *>(pkt->data.frame.buf); - const uint8_t marker = buffer[0]; - const int frames = (marker & 0x7) + 1; - const int mag = ((marker >> 3) & 3) + 1; - const unsigned int index_sz = 2 + mag * (frames - 1); - if ((marker & 0xe0) == 0xc0 && pkt->data.frame.sz >= index_sz && - buffer[index_sz - 1] == marker) { - // frame is a superframe. strip off the index. - modified_buf_.resize(pkt->data.frame.sz - index_sz); - memcpy(&modified_buf_[0], (uint8_t *)pkt->data.frame.buf + index_sz, - pkt->data.frame.sz - index_sz); - modified_pkt_ = *pkt; - modified_pkt_.data.frame.buf = &modified_buf_[0]; - modified_pkt_.data.frame.sz -= index_sz; - - sf_count_++; - last_sf_pts_ = pkt->data.frame.pts; - return &modified_pkt_; - } - - // Make sure we do a few frames after the last SF - abort_ |= - sf_count_ > sf_count_max_ && pkt->data.frame.pts - last_sf_pts_ >= 5; - return pkt; - } - - int sf_count_; - int sf_count_max_; - aom_codec_cx_pkt_t modified_pkt_; - std::vector<uint8_t> modified_buf_; - aom_codec_pts_t last_sf_pts_; - - private: - int n_tile_cols_; - int n_tile_rows_; -}; - -TEST_P(SuperframeTest, TestSuperframeIndexIsOptional) { - sf_count_max_ = 0; // early exit on successful test. - cfg_.g_lag_in_frames = 25; - cfg_.large_scale_tile = 1; - ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - 30, 1, 0, 40); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - // NOTE: The use of BWDREF_FRAME will enable the coding of more non-show - // frames besides ALTREF_FRAME. - EXPECT_GE(sf_count_, 1); -} - -} // namespace diff --git a/third_party/aom/test/test-data.sha1 b/third_party/aom/test/test-data.sha1 deleted file mode 100644 index b6ee34701..000000000 --- a/third_party/aom/test/test-data.sha1 +++ /dev/null @@ -1,507 +0,0 @@ -d5dfb0151c9051f8c85999255645d7a23916d3c0 *hantro_collage_w352h288.yuv -b87815bf86020c592ccc7a846ba2e28ec8043902 *hantro_odd.yuv -26b7f64399b84db4b4c9c915d743ec5c2619d4b9 *invalid-bug-1814.ivf -d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-bug-1814.ivf.res -fa06784f23751d8c37be94160fb821e855199af4 *invalid-oss-fuzz-10061.ivf -b055f06b9a95aaa5697fa26497b592a47843a7c8 *invalid-oss-fuzz-10061.ivf.res -c9e06c4c7fb7d69fd635a1f606a5e478d60e99cf *invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf -88e18e61bd2b7457b4c71ebefbdff0029c41cc04 *invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf.res -91a5bedeb4832c1c2900736cc0f644bb63971bbc *invalid-oss-fuzz-10227.ivf -b055f06b9a95aaa5697fa26497b592a47843a7c8 *invalid-oss-fuzz-10227.ivf.res -c0960f032484579f967881cc025b71cfd7a79ee1 *invalid-oss-fuzz-9463.ivf -d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-oss-fuzz-9463.ivf.res -f448caf378e250b7eea4fa2d1c3cd7ef4a3211ce *invalid-oss-fuzz-9482.ivf -b055f06b9a95aaa5697fa26497b592a47843a7c8 *invalid-oss-fuzz-9482.ivf.res -a686989de79af89136f631fd630df639c7861851 *invalid-oss-fuzz-9720.ivf -d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-oss-fuzz-9720.ivf.res -a432f96ff0a787268e2f94a8092ab161a18d1b06 *park_joy_90p_10_420.y4m -0b194cc312c3a2e84d156a221b0a5eb615dfddc5 *park_joy_90p_10_422.y4m -ff0e0a21dc2adc95b8c1b37902713700655ced17 *park_joy_90p_10_444.y4m -c934da6fb8cc54ee2a8c17c54cf6076dac37ead0 *park_joy_90p_10_440.yuv -614c32ae1eca391e867c70d19974f0d62664dd99 *park_joy_90p_12_420.y4m -c92825f1ea25c5c37855083a69faac6ac4641a9e *park_joy_90p_12_422.y4m -b592189b885b6cc85db55cc98512a197d73d3b34 *park_joy_90p_12_444.y4m -82c1bfcca368c2f22bad7d693d690d5499ecdd11 *park_joy_90p_12_440.yuv -b9e1e90aece2be6e2c90d89e6ab2372d5f8c792d *park_joy_90p_8_420_a10-1.y4m -4e0eb61e76f0684188d9bc9f3ce61f6b6b77bb2c *park_joy_90p_8_420.y4m -7a193ff7dfeb96ba5f82b2afd7afa9e1fe83d947 *park_joy_90p_8_422.y4m -bdb7856e6bc93599bdda05c2e773a9f22b6c6d03 *park_joy_90p_8_444.y4m -81e1f3843748438b8f2e71db484eb22daf72e939 *park_joy_90p_8_440.yuv -b1f1c3ec79114b9a0651af24ce634afb44a9a419 *rush_hour_444.y4m -eb438c6540eb429f74404eedfa3228d409c57874 *desktop_640_360_30.yuv -89e70ebd22c27d275fe14dc2f1a41841a6d8b9ab *kirland_640_480_30.yuv -33c533192759e5bb4f07abfbac389dc259db4686 *macmarcomoving_640_480_30.yuv -8bfaab121080821b8f03b23467911e59ec59b8fe *macmarcostationary_640_480_30.yuv -70894878d916a599842d9ad0dcd24e10c13e5467 *niklas_640_480_30.yuv -8784b6df2d8cc946195a90ac00540500d2e522e4 *tacomanarrows_640_480_30.yuv -edd86a1f5e62fd9da9a9d46078247759c2638009 *tacomasmallcameramovement_640_480_30.yuv -9a70e8b7d14fba9234d0e51dce876635413ce444 *thaloundeskmtg_640_480_30.yuv -e7d315dbf4f3928779e0dc624311196d44491d32 *niklas_1280_720_30.yuv -717da707afcaa1f692ff1946f291054eb75a4f06 *screendata.y4m -9cfc855459e7549fd015c79e8eca512b2f2cb7e3 *niklas_1280_720_30.y4m -5b5763b388b1b52a81bb82b39f7ec25c4bd3d0e1 *desktop_credits.y4m -36ddab9b99eb7545aa0bf362d6f498212d596516 *vase10x10.yuv -c2e1ec9936b95254187a359e94aa32a9f3dad1b7 *av1-1-b8-00-quantizer-00.ivf -26cd2a0321d01d9db5f6dace8b43a40cd5b9d58d *av1-1-b8-00-quantizer-00.ivf.md5 -a56dd02c0258d4afea1ee358a22b54e99e39d5e1 *av1-1-b8-00-quantizer-01.ivf -b3d24124d81f1fbb26f5eb0036accb54f3ec69b2 *av1-1-b8-00-quantizer-01.ivf.md5 -3466327cb842a91d69839b11ef930a74f086f4c6 *av1-1-b8-00-quantizer-02.ivf -c111dce946100efeaad34203080eee1d55464df6 *av1-1-b8-00-quantizer-02.ivf.md5 -d3f1f32de5e2c0c19a58bb8ef096108388c6a820 *av1-1-b8-00-quantizer-03.ivf -6265321b31130545b4454982ca93e412a56845b8 *av1-1-b8-00-quantizer-03.ivf.md5 -f37c393ebe73266a5ec8508a2ca33c586ff28e64 *av1-1-b8-00-quantizer-04.ivf -c6e979da71aecc593c0abb40135dd304152b00dd *av1-1-b8-00-quantizer-04.ivf.md5 -ac9c5e93cb19942a9be259d0567ec96c54dcdc7c *av1-1-b8-00-quantizer-05.ivf -49e35a7399568a0e4f015ce323d5a45ea780ca87 *av1-1-b8-00-quantizer-05.ivf.md5 -461142b1b50ae74c6b698d23f5ed3b764eadfb89 *av1-1-b8-00-quantizer-06.ivf -6477ff260624e0f76c94ac872d1e7d5576af4177 *av1-1-b8-00-quantizer-06.ivf.md5 -7f8113cd13d8faaa06fdbaaa50dc328daf037e6d *av1-1-b8-00-quantizer-07.ivf -b26795c6cb408487c20737977cd6b77311772bf7 *av1-1-b8-00-quantizer-07.ivf.md5 -4218f7945a172e1fe4f9e77ec35085a394eda9f4 *av1-1-b8-00-quantizer-08.ivf -ea5d7d501e9a69d805251e4871515d28468d8676 *av1-1-b8-00-quantizer-08.ivf.md5 -837f3bcadfe56cf302db2ebaf9a990446fb35801 *av1-1-b8-00-quantizer-09.ivf -eede995cdac5fd01a411da2e74e86e8394138be1 *av1-1-b8-00-quantizer-09.ivf.md5 -adc229b3780a4968c18ded1bcbe72e3f04643833 *av1-1-b8-00-quantizer-10.ivf -0799b7e54e54ee97bf0e8aad2b75509ce59c7097 *av1-1-b8-00-quantizer-10.ivf.md5 -44bac8247160a8d9a0ab19f890fc89cc9298de1d *av1-1-b8-00-quantizer-11.ivf -cc6b2bf167e114599b242aba574e8c6f1fa2f047 *av1-1-b8-00-quantizer-11.ivf.md5 -ebb3af7dfc15567188bcb617021cdc95ebc560e3 *av1-1-b8-00-quantizer-12.ivf -b716ae29d56cd0c052dbfa1b5dcf850cd0fa8ca7 *av1-1-b8-00-quantizer-12.ivf.md5 -46159641f981a26fb9c374a5ca41e44f0ce0a9f0 *av1-1-b8-00-quantizer-13.ivf -c6db1b8b4a74f83e4a0647e053cea0fc00f6abab *av1-1-b8-00-quantizer-13.ivf.md5 -fadc909d18eb640760fbb075f922fb050e715470 *av1-1-b8-00-quantizer-14.ivf -e36bb6b23273633ba3ef7d28160a7258840a1476 *av1-1-b8-00-quantizer-14.ivf.md5 -8befbd9cc1601dcd36ec6911613855f68e6fd40e *av1-1-b8-00-quantizer-15.ivf -cfc2334b76fb5e7aa9d8607e89d37cbc7716d62e *av1-1-b8-00-quantizer-15.ivf.md5 -ca42e00ae27c6b7f684fe3d2a787d50d2827cb3f *av1-1-b8-00-quantizer-16.ivf -f11278218a7c3c73cfaab2332bab55f06cedcc81 *av1-1-b8-00-quantizer-16.ivf.md5 -05270d365bdc067f9446eda3029a6f41571a5229 *av1-1-b8-00-quantizer-17.ivf -fb6482f35e7ad04bf231ea1806226760abcb3c26 *av1-1-b8-00-quantizer-17.ivf.md5 -617bc72037165efbff478d5a0d342b3c20ffcafd *av1-1-b8-00-quantizer-18.ivf -1ff68d5424f91322123fe0d58f436b8e49cfa99d *av1-1-b8-00-quantizer-18.ivf.md5 -821c3b1ae6054c7a91b2f64428806e57f1157ca6 *av1-1-b8-00-quantizer-19.ivf -f2fd118e786697553d6987f786660a2bb9f00680 *av1-1-b8-00-quantizer-19.ivf.md5 -48bcf17c27d9a4eb73632a68c09f42eff9f9af99 *av1-1-b8-00-quantizer-20.ivf -64d55e4c858414bc2837c9c3e2d5fb6d2208c4b8 *av1-1-b8-00-quantizer-20.ivf.md5 -d61ecdd4f0950bc5c8bae1270b22e711bdd22763 *av1-1-b8-00-quantizer-21.ivf -9d447938596096704fd5f4d41bcdf6fabf9cdfb9 *av1-1-b8-00-quantizer-21.ivf.md5 -59b4b65d8e56ccdd1bddff26a03e991a63409334 *av1-1-b8-00-quantizer-22.ivf -aa1be0c7c7622d612af85f9bf96a212f6fe5ab56 *av1-1-b8-00-quantizer-22.ivf.md5 -95ed96988eb9916cad956db9b929718769de49f1 *av1-1-b8-00-quantizer-23.ivf -596b8a3aea468996d609624367465c412751f52b *av1-1-b8-00-quantizer-23.ivf.md5 -e6c2dc4ce725003152797b3d7b34d7eb34da50c8 *av1-1-b8-00-quantizer-24.ivf -1cd3d7e8b3813a9e5591b94eaeb72d471780e64a *av1-1-b8-00-quantizer-24.ivf.md5 -6734e353008824e523939d1a18daa3f2ab2d8ec6 *av1-1-b8-00-quantizer-25.ivf -c45cf440a05802c1f9e29472175ed397d130d988 *av1-1-b8-00-quantizer-25.ivf.md5 -3372b1c69fb39811156adcea4f6dba802c0918c2 *av1-1-b8-00-quantizer-26.ivf -b1751d55bb3fb788751fe28fb7434bee153bda68 *av1-1-b8-00-quantizer-26.ivf.md5 -e7ddb19a6e2a798d6a4e7dfdfc10b4df777b60e3 *av1-1-b8-00-quantizer-27.ivf -0e19d6b79cd71de69d03e0455349568af979b170 *av1-1-b8-00-quantizer-27.ivf.md5 -7f1c90a35543d6b673e353b3702baf3aa1caeaa7 *av1-1-b8-00-quantizer-28.ivf -d9a4f9cb88103249a05a7e6aa616bf0c16bf9c95 *av1-1-b8-00-quantizer-28.ivf.md5 -28d741b923011c7fcc50a7318256a638d3110a07 *av1-1-b8-00-quantizer-29.ivf -c68cacf2b2ff2694945a99ad836dcf1ee3961c09 *av1-1-b8-00-quantizer-29.ivf.md5 -9a5d9ea4bc76dd40d04e92f33f45e9c2e120e85d *av1-1-b8-00-quantizer-30.ivf -eb02bb8c16c4c0368ddff83e05e516e84ec9eaf3 *av1-1-b8-00-quantizer-30.ivf.md5 -20193c372f44f522e094c2c05fc7e4aaa0717fa8 *av1-1-b8-00-quantizer-31.ivf -a4c1a4ac332f4911f0d5abbd826ebecfb8432d6c *av1-1-b8-00-quantizer-31.ivf.md5 -9617bbd691f093d259dbc8a642a57a153c1fc00c *av1-1-b8-00-quantizer-32.ivf -73d60a348454b126ea6368ea604954bc23f210ae *av1-1-b8-00-quantizer-32.ivf.md5 -d9aea9d72a686c59b60584d827f60ca1ee8eee26 *av1-1-b8-00-quantizer-33.ivf -fbf64de376a63d2d3051da83b0e4e56579b55c0a *av1-1-b8-00-quantizer-33.ivf.md5 -791aaf067f125e5cf4a247cf06a2e29ab071ec90 *av1-1-b8-00-quantizer-34.ivf -8e2e6efe4c069e54844da19125c4280b95990c69 *av1-1-b8-00-quantizer-34.ivf.md5 -01ba67bba5cbf7c94c65da8f4c9bd6e7db24cf3a *av1-1-b8-00-quantizer-35.ivf -0c5e60704a4a6bd27e67b6fd72ca7d2cf7fff50f *av1-1-b8-00-quantizer-35.ivf.md5 -3e255b4a320c9522dcec539fef770b6920b9a102 *av1-1-b8-00-quantizer-36.ivf -1241aab865fd7b4bae73736cbeec1866ea9c90ec *av1-1-b8-00-quantizer-36.ivf.md5 -44fa6fca109747d8f43f6c6aa46d782e5d476d54 *av1-1-b8-00-quantizer-37.ivf -947f0f887c5ac9149cf85e8114a709d6f410fc32 *av1-1-b8-00-quantizer-37.ivf.md5 -8319ac1ddd6ce3279da5780175dff7a3a5fa1054 *av1-1-b8-00-quantizer-38.ivf -5f571b7f88678eab9e54f162cc9898f14e437770 *av1-1-b8-00-quantizer-38.ivf.md5 -5975e7056e17608593a8c40619b68e6576d373d9 *av1-1-b8-00-quantizer-39.ivf -7c870192d6eb70ce5367147a3d2c6a52e11f7bec *av1-1-b8-00-quantizer-39.ivf.md5 -47da942f1e455f1422fc65f06dd57304541d16ac *av1-1-b8-00-quantizer-40.ivf -6ea7116c9ce3a1641c7060bab2f5e06fd0910d61 *av1-1-b8-00-quantizer-40.ivf.md5 -ab35c15dfde21c2572b14e04dbfd5fac1adae449 *av1-1-b8-00-quantizer-41.ivf -19596f9849653b913186b9d6b7072984ede96177 *av1-1-b8-00-quantizer-41.ivf.md5 -23a5fa6c3d0eaffaf13f6402465f5dd33d8ea7f1 *av1-1-b8-00-quantizer-42.ivf -5a2726f0d1b1799d4f70883f1bfe5c9d976c6cf5 *av1-1-b8-00-quantizer-42.ivf.md5 -86cddfc463d2b186ec5a1aa25c4562c05201e3c3 *av1-1-b8-00-quantizer-43.ivf -674c64ec8487ee774ad09350380fa6ac43815807 *av1-1-b8-00-quantizer-43.ivf.md5 -6894c154eb56c4f3fe44d54fc4f9af468b03d175 *av1-1-b8-00-quantizer-44.ivf -eca679a2781eb894d18b3d578e3aaf4f48019a15 *av1-1-b8-00-quantizer-44.ivf.md5 -0960bf018ada4224b8344519cf091850d50a57bd *av1-1-b8-00-quantizer-45.ivf -291bb43b9e1ab167040b51019daf1ccf94fd1e50 *av1-1-b8-00-quantizer-45.ivf.md5 -ea644a4732f1a2534332802c2fa5073344f3c356 *av1-1-b8-00-quantizer-46.ivf -4c7915382b1d6d08709c95525b04ab8830f20ca1 *av1-1-b8-00-quantizer-46.ivf.md5 -d1f8832d33234e2c74a2280090850153ea24ea82 *av1-1-b8-00-quantizer-47.ivf -90eb9959e612602934dcc512fe6f54abf0c88d9c *av1-1-b8-00-quantizer-47.ivf.md5 -69c93f760e8b666eb5b98f510e09d90f9230ac9b *av1-1-b8-00-quantizer-48.ivf -931f869e14bd455de9dac2101b383c29e7d6f04c *av1-1-b8-00-quantizer-48.ivf.md5 -8b660c577d95c031d6711c1134b8d115097f8d7e *av1-1-b8-00-quantizer-49.ivf -0e3fe8b49d497050dc1a0eac5f3ad60f5fe068fe *av1-1-b8-00-quantizer-49.ivf.md5 -d40bb21448a6da0fc9b88cbcf76d2f4226573acb *av1-1-b8-00-quantizer-50.ivf -bcd2a9c9a021ba44fc5dc74ae02194fe49ca76a4 *av1-1-b8-00-quantizer-50.ivf.md5 -3b5a1d464aa89b0f1a6ad4f5a03602292b826172 *av1-1-b8-00-quantizer-51.ivf -49bcde0c56cf8b7fbe429336981be22d39025b74 *av1-1-b8-00-quantizer-51.ivf.md5 -38970a02fb38ddb4954fe4240164cb75de5fc744 *av1-1-b8-00-quantizer-52.ivf -fd02b034d79d4be150efb02bd4349edfd0e41311 *av1-1-b8-00-quantizer-52.ivf.md5 -2fde7a7cf3014d5196d011c47de4a144227ed122 *av1-1-b8-00-quantizer-53.ivf -0cb66e6d8fbb29962a69ae1703e22da50db2c92b *av1-1-b8-00-quantizer-53.ivf.md5 -89a69e9b9a601e40cb491ac3a1d32491f2468ac8 *av1-1-b8-00-quantizer-54.ivf -2f8af51acc73c99b5af81db2bdd1883b611ad311 *av1-1-b8-00-quantizer-54.ivf.md5 -31ee4f56fcb0043e95fff7af49e4ef82aafa5543 *av1-1-b8-00-quantizer-55.ivf -04a7104e02bdd0fa38c118202dbbecdbd11ace02 *av1-1-b8-00-quantizer-55.ivf.md5 -f262f0b234006a2652fceb77b1a8711aa53abb54 *av1-1-b8-00-quantizer-56.ivf -bdd54dc25bc5a147c76163af0bced45c56435d79 *av1-1-b8-00-quantizer-56.ivf.md5 -1ef00617091db4b2b839de623bd6b4fb0b2f5f83 *av1-1-b8-00-quantizer-57.ivf -714c65363a87ed5e6e4ad75c79ddb6af57d41fd9 *av1-1-b8-00-quantizer-57.ivf.md5 -43c9b02feccbb3c709d96015f126b7e3d4c24c64 *av1-1-b8-00-quantizer-58.ivf -bae22b8d6377862bff8219470c0d87205d186a68 *av1-1-b8-00-quantizer-58.ivf.md5 -ca5f780abe4c02e48cceb9c804f3625723c359bf *av1-1-b8-00-quantizer-59.ivf -c60a20bbf60b0b0a442ef3f7b682979053909d6e *av1-1-b8-00-quantizer-59.ivf.md5 -1f6f047e9f0e1da22fb514370d92c3c7c66dcf89 *av1-1-b8-00-quantizer-60.ivf -86dc7fa59d363cf1ae4b027a57b119bda893c1c1 *av1-1-b8-00-quantizer-60.ivf.md5 -bcf0c3353568c47a043f2dc34c9abd3fc04eebd4 *av1-1-b8-00-quantizer-61.ivf -66fc4f729c5915aa19939d1b6e28e5b398e747bb *av1-1-b8-00-quantizer-61.ivf.md5 -ac8d3c54451b52cf557ef435d33e7638088d66df *av1-1-b8-00-quantizer-62.ivf -b57f4e1276ead626a3662339a86111ae6fda49d2 *av1-1-b8-00-quantizer-62.ivf.md5 -2a8aa33513d8e01ae9410c4bf5fe1e471b775482 *av1-1-b8-00-quantizer-63.ivf -9f646ec35a168f495e144c64ba7ce9aeb41cd0a2 *av1-1-b8-00-quantizer-63.ivf.md5 -838388fbda4a1d91be81ff62694c3bf13c460d38 *av1-1-b8-01-size-16x16.ivf -4229c1caf8e25eb3073456fb90ceed206753901e *av1-1-b8-01-size-16x16.ivf.md5 -23f4253bf71e02b2e8ead66da4b3de875e879ef2 *av1-1-b8-01-size-18x16.ivf -af125644436d4b6897dade68336cedad663b6610 *av1-1-b8-01-size-18x16.ivf.md5 -94e4a75bd93052f79998e9e08e6b5dd73dc27e50 *av1-1-b8-01-size-32x16.ivf -e7b3fbc5e4b2469838e7ae36512bd3ce0a81040c *av1-1-b8-01-size-32x16.ivf.md5 -f297bde01c05ec5c07ff8118a0280bd36c52b246 *av1-1-b8-01-size-34x16.ivf -f6bbd94d6063c689de3c7cf94afa2c68b969d12c *av1-1-b8-01-size-34x16.ivf.md5 -1e18bdf68bab7e7282aacc77e423bc7d93d04a8e *av1-1-b8-01-size-64x16.ivf -de75732fccfb385294b23c17f0f1a57b455edcf7 *av1-1-b8-01-size-64x16.ivf.md5 -26b1f6ae80b161e971468085778cc1ece502b330 *av1-1-b8-01-size-66x16.ivf -48bd99813557c314d398e6952da78da07c79d416 *av1-1-b8-01-size-66x16.ivf.md5 -ff213ecf31b982a3a7f009c9739f64e066e1ffe9 *av1-1-b8-01-size-16x18.ivf -86b20a13b1939dc5f678e80491f190d376233d58 *av1-1-b8-01-size-16x18.ivf.md5 -c90bd878c59263a15c6a6f515d1c7e071f141559 *av1-1-b8-01-size-18x18.ivf -6f659036ffcd3dd380cf970cf1a06f7755e0b2de *av1-1-b8-01-size-18x18.ivf.md5 -e16a1411381b34817a4c0d8e5eeaeb8cddcc9c46 *av1-1-b8-01-size-32x18.ivf -fdb1c4ec56f5aa690eadbe897340fee86a06ae2f *av1-1-b8-01-size-32x18.ivf.md5 -fac7052b39bd2d0ae107e0e94050226712c770c2 *av1-1-b8-01-size-34x18.ivf -adb0d5a99228027eaa3b016963df447c9818c447 *av1-1-b8-01-size-34x18.ivf.md5 -b8be5e55d9be42746c2b547d0e26e80b21c9802a *av1-1-b8-01-size-64x18.ivf -8f8f6da34cdf78c5a6551c637e1afe279cc3884e *av1-1-b8-01-size-64x18.ivf.md5 -9e066bdcc2cd789cdf551bd4c9c85c178887b880 *av1-1-b8-01-size-66x18.ivf -e8ec6effa936423ae2eec2b60a3160720d2de912 *av1-1-b8-01-size-66x18.ivf.md5 -6ebe45085cdeebc2acd6da5abd542a59312c0ff4 *av1-1-b8-01-size-16x32.ivf -044695669103dbf158591dce9c649317a177d5f6 *av1-1-b8-01-size-16x32.ivf.md5 -9fabb4f60641b8c7995d1dc451419165d41258ff *av1-1-b8-01-size-18x32.ivf -7263764680dfec864c3fad5df824ab1973489a14 *av1-1-b8-01-size-18x32.ivf.md5 -3f72841a24a13e601d79cf029aa1fdb02970ce0b *av1-1-b8-01-size-32x32.ivf -bbe1ae2888d291ec6bc98cd0784937580c554103 *av1-1-b8-01-size-32x32.ivf.md5 -392131a7c7609acd0dba88fee14f1ed042d23ab1 *av1-1-b8-01-size-34x32.ivf -eea68165ebe9acd28693374bf2266374b9c77786 *av1-1-b8-01-size-34x32.ivf.md5 -78afdd96265811ab9466e906347b57161e5c010d *av1-1-b8-01-size-64x32.ivf -47b317af582700b67f6e77659db1dfaa26c8cde6 *av1-1-b8-01-size-64x32.ivf.md5 -2b4d01f2c9f23044c0d886482c7073bd4d5d37d1 *av1-1-b8-01-size-66x32.ivf -3ad5a58a0ee5086af370b22ab2b5b7592a4f33e7 *av1-1-b8-01-size-66x32.ivf.md5 -78ddae04eb8277ae605bd7017ad7ad27bfc82d39 *av1-1-b8-01-size-16x34.ivf -d0c18e679f1fc51e4f7409831321eed9c4858f6f *av1-1-b8-01-size-16x34.ivf.md5 -38d8ed885f46aead6ec1271d8a5d4aee79b8eb68 *av1-1-b8-01-size-18x34.ivf -097ddbd69b8f54826a35efeb0b8b07ec198bba6b *av1-1-b8-01-size-18x34.ivf.md5 -91a42720bc2e7ba701f4d97b463a098b6707cdbd *av1-1-b8-01-size-32x34.ivf -c590d43d37095bd2e8f8d12c9278477419b72d1a *av1-1-b8-01-size-32x34.ivf.md5 -4cc2a437dba56e8878113d9b390b980522542028 *av1-1-b8-01-size-34x34.ivf -57eeb971f00e64abde25be69dbcb4e3ce5065a57 *av1-1-b8-01-size-34x34.ivf.md5 -b36fee1b6ad69d1206466615d69c05e0a4407939 *av1-1-b8-01-size-64x34.ivf -a78aea0250d0b32657dc0eaf2d8394bc766c0e35 *av1-1-b8-01-size-64x34.ivf.md5 -10e441209262e082e31fef8c15b51579c9e81509 *av1-1-b8-01-size-66x34.ivf -558b46f6ef1662c208012d0b66d1857eeff3244e *av1-1-b8-01-size-66x34.ivf.md5 -dd44aad500c7ca0fc97e3d8f0abed3c83b24c79c *av1-1-b8-01-size-16x64.ivf -a5b64e8063abcf3e4872dc4baf1c32384dc5cf83 *av1-1-b8-01-size-16x64.ivf.md5 -aa849f0d09bcb2ead44719d63043536932d5c9f2 *av1-1-b8-01-size-18x64.ivf -bcdf2dea3590c7031158ffe7b907d9ee35e2fe57 *av1-1-b8-01-size-18x64.ivf.md5 -36e856d30e160ba2fbb00510296202f61afaae49 *av1-1-b8-01-size-32x64.ivf -99299f75b82c40c13f168adf2d124f57044a39a2 *av1-1-b8-01-size-32x64.ivf.md5 -e3e03ec5d38eb25e97e4ec3adc6ed40ecdebd278 *av1-1-b8-01-size-34x64.ivf -84625abf8a200a7d20dd3dd3b277b50b3d62ce32 *av1-1-b8-01-size-34x64.ivf.md5 -7d017daebef2d39ed42a505a8e6103ab0c0988c1 *av1-1-b8-01-size-64x64.ivf -1ff38d5ecba82fb2e6ac3b09c29c9fe74885ac29 *av1-1-b8-01-size-64x64.ivf.md5 -e1b58ba0b462508593399a2ed84db5f1c59ffcd2 *av1-1-b8-01-size-66x64.ivf -a6b2c84c94fe79ab0373d157d1203f8d66de0706 *av1-1-b8-01-size-66x64.ivf.md5 -7b4faa7eb7b73392b62de6613282a98dddc13bb6 *av1-1-b8-01-size-16x66.ivf -a2dacf2bae3c4ab352af66a9600946d29ab9a6ee *av1-1-b8-01-size-16x66.ivf.md5 -0f97805fa30497d4cf39665150f00dfdea52d862 *av1-1-b8-01-size-18x66.ivf -33d8ea0765953250f998da3fe161f2a8cfca2353 *av1-1-b8-01-size-18x66.ivf.md5 -c8bb00256de973e3b3ee31b924f554336d310cdb *av1-1-b8-01-size-32x66.ivf -6a6588e6edc68ff7739968a9e7cc6d9eaaeed356 *av1-1-b8-01-size-32x66.ivf.md5 -75ec54fec5c36eecde6d0a16e0389a5f7ad8ec22 *av1-1-b8-01-size-34x66.ivf -36101dfa9495c18696c0d7d61f25e748f4de7425 *av1-1-b8-01-size-34x66.ivf.md5 -7e5491716e70f8199156b8843513c935667b281e *av1-1-b8-01-size-64x66.ivf -da38755bb0c9ef56b81617835ddf1340242c6dce *av1-1-b8-01-size-64x66.ivf.md5 -68b47b386f61d67cb5b824a7e6bf87c8b9c2bf7b *av1-1-b8-01-size-66x66.ivf -25974893956ebd92df474325946130c34f880ea7 *av1-1-b8-01-size-66x66.ivf.md5 -9f386d19c87dbfd6ac84a06d2393dd88863ac003 *av1-1-b8-01-size-196x196.ivf -788f77f655f55de3db94dd69870316134c149116 *av1-1-b8-01-size-196x196.ivf.md5 -ed3bb2bb52a9d1786e233ef38142b15b85097875 *av1-1-b8-01-size-198x196.ivf -3bb6b6721ad9b2838b2d07e47b29d6c0117526b1 *av1-1-b8-01-size-198x196.ivf.md5 -49461772caaaa7b824d48f4e9c77a906b0dc02d5 *av1-1-b8-01-size-200x196.ivf -f1cba00c36909c56097c8785df476d42bc91f259 *av1-1-b8-01-size-200x196.ivf.md5 -44a656a22958e26ed169a69deb8f373117224f06 *av1-1-b8-01-size-202x196.ivf -69be876b52fe42811bba52d36d0bcc88d6c25b3f *av1-1-b8-01-size-202x196.ivf.md5 -0a6fe9b478363faedbfd465a75790b4c2661b9ba *av1-1-b8-01-size-208x196.ivf -fc8e95a6860a8a37ccdf1dfe49828502fcf96a08 *av1-1-b8-01-size-208x196.ivf.md5 -8e05b5a20ec95afd92bb615a7daa2e17a7ef55a8 *av1-1-b8-01-size-210x196.ivf -0add512bffbda3300d8f684a53b13b996fe2e46d *av1-1-b8-01-size-210x196.ivf.md5 -a15f12652c6b4d0c30f13a439c941bfc4a431d1a *av1-1-b8-01-size-224x196.ivf -b904b93252175f79e0e2b28896131ce93d5fc925 *av1-1-b8-01-size-224x196.ivf.md5 -1a57b913443b267f4a31a6925c39f5b58022f550 *av1-1-b8-01-size-226x196.ivf -7cf3087de5804763a82d2a798243a66459664772 *av1-1-b8-01-size-226x196.ivf.md5 -2cc28541a2a72e8b45a368f71e70fc294e2de3ab *av1-1-b8-01-size-196x198.ivf -bb736eedb4bd1e39bf9d60435b4b27a12842e112 *av1-1-b8-01-size-196x198.ivf.md5 -c4ebf93fbf3ae52108fd7b39ddef3afae48188ea *av1-1-b8-01-size-198x198.ivf -fa4de6881511728bafa15b5f441a0cfdf683cc75 *av1-1-b8-01-size-198x198.ivf.md5 -55fce983186d454b0eb15527393bb2465ba41c6b *av1-1-b8-01-size-200x198.ivf -1ac8fb1ee622cbc4aa1b83cb46b4731c85efae62 *av1-1-b8-01-size-200x198.ivf.md5 -67d276c67886f0a91a7ee06751a64f95eeb7bc1f *av1-1-b8-01-size-202x198.ivf -1633b62d9e4ea41737c42f70cbde9a5671da0cef *av1-1-b8-01-size-202x198.ivf.md5 -081cb3f29d3956d4d858d9661fd3d62c94b68867 *av1-1-b8-01-size-208x198.ivf -871d1c99167408dd32fa7603a7296c9b99ccda15 *av1-1-b8-01-size-208x198.ivf.md5 -b2d80b42468d5f296ae240cfb1fc0b3dd3d96bbc *av1-1-b8-01-size-210x198.ivf -6a3382656cb17b532a97b1061697f9a878fc58d1 *av1-1-b8-01-size-210x198.ivf.md5 -84d7994fa20fcf6c1d8dbd4c2060c988a6fce831 *av1-1-b8-01-size-224x198.ivf -42ea12e15de81f2e8617b6de7bae76de2da4d648 *av1-1-b8-01-size-224x198.ivf.md5 -c74a9281cf98c597121df6bff0ac5312b887f969 *av1-1-b8-01-size-226x198.ivf -4133aae0001804e2bbc7928fc065517a6dd8b288 *av1-1-b8-01-size-226x198.ivf.md5 -27adbf148c63f807bd617cfd78aeaedb8b0f2304 *av1-1-b8-01-size-196x200.ivf -9253e525e6207ef1ce0839b8f88ea781e9abe41e *av1-1-b8-01-size-196x200.ivf.md5 -21c9ea4d882e48353d3df66fcde0e4746168163f *av1-1-b8-01-size-198x200.ivf -3d5ee59fde9194f0eaff736051cfd1d7b7daeff1 *av1-1-b8-01-size-198x200.ivf.md5 -c27b0b57667910847122a0309c703315e444110f *av1-1-b8-01-size-200x200.ivf -7b2a15a17b421ef07e285ca4e8a224f0512c434d *av1-1-b8-01-size-200x200.ivf.md5 -780de549e4163a52590f7c0f488e027a8a4aa053 *av1-1-b8-01-size-202x200.ivf -cb0ec0969522ca60d79a639e9b9509363468ffd0 *av1-1-b8-01-size-202x200.ivf.md5 -2c59821904863e264ae61401cbd494a79bc04f13 *av1-1-b8-01-size-208x200.ivf -9963955966a52b65cdd13465c9fb2ba3b5356755 *av1-1-b8-01-size-208x200.ivf.md5 -ff63121611ea9c0628c7e5af13de5e7786611ca6 *av1-1-b8-01-size-210x200.ivf -2a5993be234e3af2af6d185b2a6f3aaf1979b83a *av1-1-b8-01-size-210x200.ivf.md5 -b8485ada95440d78b51153227231b1aced1a8273 *av1-1-b8-01-size-224x200.ivf -9c3cd32ea6c006a91eb37d69dbeccf878de5d214 *av1-1-b8-01-size-224x200.ivf.md5 -1aa0ce3e3a74f9b600a146e98b05547a0b454c48 *av1-1-b8-01-size-226x200.ivf -e045be96c3af16a9ddc10a9933e8ddfb3319d716 *av1-1-b8-01-size-226x200.ivf.md5 -e92b76480f4339855d998b97182f36b28deadcfa *av1-1-b8-01-size-196x202.ivf -480c707abcd2a650e2160ec397f8348cecb45770 *av1-1-b8-01-size-196x202.ivf.md5 -137b9c0d10a3bdbdf6f97b3e6331f3e8acaf8f91 *av1-1-b8-01-size-198x202.ivf -7429642146d0da55161ab13024a261094ee2ce87 *av1-1-b8-01-size-198x202.ivf.md5 -9cea71c44ad015ac702d675bacca17876e65cb1a *av1-1-b8-01-size-200x202.ivf -76b1ec6c42da55f47e389a561590d1a7c713e495 *av1-1-b8-01-size-200x202.ivf.md5 -26dffdcd0dac9becf68d12e31fcd91eddf1f7154 *av1-1-b8-01-size-202x202.ivf -ddb75e99123fed4ef05d9b85200cefd8985bc84c *av1-1-b8-01-size-202x202.ivf.md5 -04007e83bb66ba547d09f8926ea5bfc7fd9e4b2a *av1-1-b8-01-size-208x202.ivf -5b72eb58db22087ad416c499119f41e718395b52 *av1-1-b8-01-size-208x202.ivf.md5 -721ff7c0ae0e2ed896b5acac230113f1404e769c *av1-1-b8-01-size-210x202.ivf -187d2ef939fc26e1a1c7de65abe8e058d8aae17a *av1-1-b8-01-size-210x202.ivf.md5 -dba41421cc938bcf0234254f96be0325ab66186e *av1-1-b8-01-size-224x202.ivf -58856038c1eb13a7bf0353a30b1affe844cd31b1 *av1-1-b8-01-size-224x202.ivf.md5 -55eba14878d25dcc351ee5e92fa06e559035b409 *av1-1-b8-01-size-226x202.ivf -e295b3d791d40d7c1fff2c40a260078dccaef24a *av1-1-b8-01-size-226x202.ivf.md5 -6c777223990ddfd92040a8526646ed0f39299b0d *av1-1-b8-01-size-196x208.ivf -5210daff766cddaf3945610ee05ff242aef8175a *av1-1-b8-01-size-196x208.ivf.md5 -252831abfb9f4a9a8556c21cc3bf60adfe88210f *av1-1-b8-01-size-198x208.ivf -35ed9601e608a829980cec81e41b7bd3e5f4c2ce *av1-1-b8-01-size-198x208.ivf.md5 -e800ed893a88704a4576d4984957f3664560daa9 *av1-1-b8-01-size-200x208.ivf -82c038f9072a2fcf8d55fb4a474fdd791ba9a290 *av1-1-b8-01-size-200x208.ivf.md5 -9ce7bb932dd99f86da8ff2ab89fa4d3089a78da8 *av1-1-b8-01-size-202x208.ivf -0611bf0179abe3c820a447a2bd3a04c3790f3a87 *av1-1-b8-01-size-202x208.ivf.md5 -e5900d9150c8bebc49776227afd3b0a21f5a6ac6 *av1-1-b8-01-size-208x208.ivf -86d6b9a3840aa0a77938547c905bd6f45d069681 *av1-1-b8-01-size-208x208.ivf.md5 -2758ba5dad16f4a91334f2ed07a4a037201bb873 *av1-1-b8-01-size-210x208.ivf -78453b1fda2ccc6f35e0d762567807757bcddb16 *av1-1-b8-01-size-210x208.ivf.md5 -fff88fb8e833f6b4ad64cb591b219c7cceb7f2d2 *av1-1-b8-01-size-224x208.ivf -87266fc34aaed82cdb98cbc309b221ad52eccd81 *av1-1-b8-01-size-224x208.ivf.md5 -dec839fe64046461015b56cda191835284f42a52 *av1-1-b8-01-size-226x208.ivf -d7a15264fc3fd55d3aec0ccfaa7c434c6d90969f *av1-1-b8-01-size-226x208.ivf.md5 -584782e93ed1cb7797a90fece44becdd1e23bf0d *av1-1-b8-01-size-196x210.ivf -ed76ec841b18a457853e368576967c4768fc2730 *av1-1-b8-01-size-196x210.ivf.md5 -dab625599b9f01398b593e865d9a4a95a029d60f *av1-1-b8-01-size-198x210.ivf -b90e8d96a1f5b329b088b467a11fed2d055d74ca *av1-1-b8-01-size-198x210.ivf.md5 -6774bee17b9e50d2d8630e2e1afc30ded67e662d *av1-1-b8-01-size-200x210.ivf -343a86bd54eb3dd5e9902eb62a3d776dcff2f4f3 *av1-1-b8-01-size-200x210.ivf.md5 -0456c3b8e242eeee019ca97d155f81124de62c90 *av1-1-b8-01-size-202x210.ivf -5a6a6428c9858a0d3561db42ceaf981c143fe479 *av1-1-b8-01-size-202x210.ivf.md5 -6a3a8f65bf806b1be7726b983427880f772c9986 *av1-1-b8-01-size-208x210.ivf -5563ea6d8c65887553ff3000addc6418913f1650 *av1-1-b8-01-size-208x210.ivf.md5 -5a8b69489f8e9b917ea7718ad2645101cdbe5644 *av1-1-b8-01-size-210x210.ivf -f4b01604036fa23000d44fbf42097ae1181bcd62 *av1-1-b8-01-size-210x210.ivf.md5 -fb6f5b08a048698cfe324557ee8cd840c4a3f6ce *av1-1-b8-01-size-224x210.ivf -3ce5c404e3ca09c8e994b3043bad42cd555b00c0 *av1-1-b8-01-size-224x210.ivf.md5 -2e9fc8510d2131b2f3c9a93bececac985e4426d2 *av1-1-b8-01-size-226x210.ivf -897c537e259331ca86cdd6e4d2bd343f8538402e *av1-1-b8-01-size-226x210.ivf.md5 -8300512106fce3424eb74b5d4bc0f4f19f7c9af8 *av1-1-b8-01-size-196x224.ivf -43662ea025ea79afe4964fd4d12a77f4aa4e565e *av1-1-b8-01-size-196x224.ivf.md5 -640f8fda7ade8f2850e2275a9f5e233e33a0ba8d *av1-1-b8-01-size-198x224.ivf -9ac690bdbbce47d7b169128b568f955e70076f8c *av1-1-b8-01-size-198x224.ivf.md5 -ce2e9379c72fc924e364d5727605394a1438a211 *av1-1-b8-01-size-200x224.ivf -1ec35a53d88072b96b255202f678178bc7e5bb20 *av1-1-b8-01-size-200x224.ivf.md5 -5d3af7921623deccb578115c8ce207c019f97f50 *av1-1-b8-01-size-202x224.ivf -14eafd55b0cda3a3476cae7ad500dbd5ee899dd5 *av1-1-b8-01-size-202x224.ivf.md5 -6b6d78e466cf94a5ef8dfe252caa0948dd2ec175 *av1-1-b8-01-size-208x224.ivf -e178b0c272dfcfe614c6b49cb28dad11781af0b6 *av1-1-b8-01-size-208x224.ivf.md5 -dd2232b9e18971d7e19650a1e3218aef1010247f *av1-1-b8-01-size-210x224.ivf -40a66198c47820f5fa2d2e389ec0c1191ea4ffcc *av1-1-b8-01-size-210x224.ivf.md5 -9ec028b81a5ea311683328d856f436e6d0b0e6a0 *av1-1-b8-01-size-224x224.ivf -143b9530ce722385db2c2d883daa649ed42b8d40 *av1-1-b8-01-size-224x224.ivf.md5 -bf833947e62935c54e1e727ccb36157f7c1e9e5d *av1-1-b8-01-size-226x224.ivf -ca4f3b44463106e4f0bb54e490c3bd457d7d780b *av1-1-b8-01-size-226x224.ivf.md5 -5525f7e312ec073f480ed5a2be5bdc4f0ce51a09 *av1-1-b8-01-size-196x226.ivf -062d4b240741184458d2d2abd243ed7877631de8 *av1-1-b8-01-size-196x226.ivf.md5 -e6b911142394b94c23191eaa63c9eb41a00f80b0 *av1-1-b8-01-size-198x226.ivf -3b580d903dddf47082f5e055bfb01a4f05c09b7d *av1-1-b8-01-size-198x226.ivf.md5 -70feb5efeb28df25f7d1a661c73bf013c5ada9b4 *av1-1-b8-01-size-200x226.ivf -f0b894e7f787e62f1492be62f3dedeb065062160 *av1-1-b8-01-size-200x226.ivf.md5 -7f9a10831e2389b31497fad50080b4d5452d6e91 *av1-1-b8-01-size-202x226.ivf -45b7194eba9367c8059403c23ca4ae49e988dfaf *av1-1-b8-01-size-202x226.ivf.md5 -967837a2cfbf9aa3131f73aec6a52dcdd82926c7 *av1-1-b8-01-size-208x226.ivf -c8baedb48fd5d4c956aa8d73fd957370f718f047 *av1-1-b8-01-size-208x226.ivf.md5 -9c926226b9f6b015501d8ac1e3f95e8570283a05 *av1-1-b8-01-size-210x226.ivf -57d4837667fd4c5a7aeb908626d701b632852c60 *av1-1-b8-01-size-210x226.ivf.md5 -25a4940922761239809d82c45c2be1c5e4f48785 *av1-1-b8-01-size-224x226.ivf -87ae7e7558241bf3575a333f56fbad4dfdade8ff *av1-1-b8-01-size-224x226.ivf.md5 -40dd208eb525cd90d7c0674cf787097fb909afae *av1-1-b8-01-size-226x226.ivf -34bdef682a4eae0e0a05e4486a968af1df8b220a *av1-1-b8-01-size-226x226.ivf.md5 -9bbe8499796aa588ff02e313fb0d4349940d2fea *av1-1-b10-00-quantizer-00.ivf -36b402eedad2bacee8ac09acce44e2fc356dd80b *av1-1-b10-00-quantizer-00.ivf.md5 -1d5e1d2827624f328020bf123df213bb175577e0 *av1-1-b10-00-quantizer-01.ivf -16c529be5502369e43ce9c6fe99a9709968e3daf *av1-1-b10-00-quantizer-01.ivf.md5 -39abc20739242a8f05efd4b35d7603c8ad7ff45d *av1-1-b10-00-quantizer-02.ivf -81faa72c3d43b003966fe09ffaae51b07b1059be *av1-1-b10-00-quantizer-02.ivf.md5 -92ebf349b803333a43824a83d997b8cf76f656f9 *av1-1-b10-00-quantizer-03.ivf -5e7556dc998cb8b506a43cc078e30802d7e600e6 *av1-1-b10-00-quantizer-03.ivf.md5 -1c496177c66e49f2e3556af87ec67afb5060170b *av1-1-b10-00-quantizer-04.ivf -560fea4800a44fe19ed8d3e74f425bdbf1fb8abd *av1-1-b10-00-quantizer-04.ivf.md5 -7de864b8475ce0acd0ecb01827f2c9add815352b *av1-1-b10-00-quantizer-05.ivf -1c1aea3db3f54a91866d89fd3b1a0d285ca10310 *av1-1-b10-00-quantizer-05.ivf.md5 -b6501c165619b036d0f7864fd4739973d2d18970 *av1-1-b10-00-quantizer-06.ivf -d758c8eff275651006c41e7dd447cac13b489ad7 *av1-1-b10-00-quantizer-06.ivf.md5 -e4df6f588f156dffaafd9517b64f753cfc9ccf05 *av1-1-b10-00-quantizer-07.ivf -3c577f67dade4537de642fd457ea2b367424f336 *av1-1-b10-00-quantizer-07.ivf.md5 -07e9c4c18abb36c8699c1c12bebcc727f090b525 *av1-1-b10-00-quantizer-08.ivf -4981568ade3170f311cb114fa2689edc4bc35e67 *av1-1-b10-00-quantizer-08.ivf.md5 -2268ecd2899f1b41ae9898925b1d62cfefa30282 *av1-1-b10-00-quantizer-09.ivf -029b03029b65b7c4c208961f0820467ad42fd3d6 *av1-1-b10-00-quantizer-09.ivf.md5 -3d2adaf6441cfa9585dcbf7d19d65bf6992a29a3 *av1-1-b10-00-quantizer-10.ivf -017b7fb4c3ba0747c2d5688d493da33ef993d110 *av1-1-b10-00-quantizer-10.ivf.md5 -006535760bd7dc1cfc95e648b05215954a2e76c2 *av1-1-b10-00-quantizer-11.ivf -c0ae083deb8e820aa49034af4d100944dd977018 *av1-1-b10-00-quantizer-11.ivf.md5 -840e0cbfe1acc8a7a45c823dc55ab44a0b6b553e *av1-1-b10-00-quantizer-12.ivf -49232ea38bdef650c94808f53834f1137cd4bf39 *av1-1-b10-00-quantizer-12.ivf.md5 -04b0e5a7387e07474f51be4b2c3e05211b40f0d0 *av1-1-b10-00-quantizer-13.ivf -a51b5ec4b890df3a64f9f0d866b8c41296c9e081 *av1-1-b10-00-quantizer-13.ivf.md5 -5dc47a140fbcbf08bf91481ee3585e9e067561ab *av1-1-b10-00-quantizer-14.ivf -2625319eef69d6225e6ab6e5ce7790491406cb5d *av1-1-b10-00-quantizer-14.ivf.md5 -f866be86d8d8aa08ded30e42988b0936c1a16064 *av1-1-b10-00-quantizer-15.ivf -03b7c1eefb54d99e30051c7123c0453f04a6579d *av1-1-b10-00-quantizer-15.ivf.md5 -548df2371dfb485419ed9baf28e3f495c64f364a *av1-1-b10-00-quantizer-16.ivf -8a0d6bf1626b05b65c77331305414fe9be54e8c6 *av1-1-b10-00-quantizer-16.ivf.md5 -0077c82f96a2e095a3cb8de9bfa63715e3c9f438 *av1-1-b10-00-quantizer-17.ivf -5d85f77f3087f4b206930722a945c60039262be4 *av1-1-b10-00-quantizer-17.ivf.md5 -1e0f1245ecb4c903b5dc7072d959fc43a7bba381 *av1-1-b10-00-quantizer-18.ivf -06316ae2b45f2359a70cc3855ffd6ab81048b41a *av1-1-b10-00-quantizer-18.ivf.md5 -f197198f7ec058110185fda5297a1a43993654df *av1-1-b10-00-quantizer-19.ivf -bac522c7f234d506c75b5495d74b3fa57c83a4df *av1-1-b10-00-quantizer-19.ivf.md5 -c2f57324d000b349323f37d5ebebde8c2b861f30 *av1-1-b10-00-quantizer-20.ivf -999c6110786cbc25e67792234a5a02f2cb4553c7 *av1-1-b10-00-quantizer-20.ivf.md5 -2ffad9adfd19286fe2166ba877289d201c9a634f *av1-1-b10-00-quantizer-21.ivf -d55713eaa791cfd7bf69b6c26d5032029d9a0f06 *av1-1-b10-00-quantizer-21.ivf.md5 -382528db53328c1a38976f5d9b579eef35d839f4 *av1-1-b10-00-quantizer-22.ivf -cb5bd459e1a90126da9264cff4281515f95755b2 *av1-1-b10-00-quantizer-22.ivf.md5 -b52cc6160fc66f72ad66c198d275a1c73f925022 *av1-1-b10-00-quantizer-23.ivf -c0f9d6659e1f283e9356fd7b4ac9f7cc5544cdc2 *av1-1-b10-00-quantizer-23.ivf.md5 -e11f15e3b63e7606b1122bb3670ee77c09c04840 *av1-1-b10-00-quantizer-24.ivf -e9f141b924440e044270c81a68458fe498599a8e *av1-1-b10-00-quantizer-24.ivf.md5 -fb91793b69824c99b0218788dcea0a74ebd7e84e *av1-1-b10-00-quantizer-25.ivf -434e33d609b2683c3cfbcc3a2cdfc26339590fb6 *av1-1-b10-00-quantizer-25.ivf.md5 -d82e38f31cdcf8b43479e6ddaa83373de38f70a2 *av1-1-b10-00-quantizer-26.ivf -183943b851ba383a536f13c83b93f61ac8961ad5 *av1-1-b10-00-quantizer-26.ivf.md5 -6bf5e4e8e0aca699e493b9eb3672d2117494d74d *av1-1-b10-00-quantizer-27.ivf -f0fb7e0a99180828b0e38b2cfe0622eecc2d26b8 *av1-1-b10-00-quantizer-27.ivf.md5 -d5adee2567544c3ae4223b3f3528a770377878d2 *av1-1-b10-00-quantizer-28.ivf -14edf588efc67570e529b0ff8aeb8e7a0c69238b *av1-1-b10-00-quantizer-28.ivf.md5 -e6dcdc106847956035e3f00aabf4470f97e1887e *av1-1-b10-00-quantizer-29.ivf -413c5cb778611c7c1a810b53861b9ab1fb391f17 *av1-1-b10-00-quantizer-29.ivf.md5 -b5e98b3f6b1db04d46bf43064c6ac64f797aff00 *av1-1-b10-00-quantizer-30.ivf -d1a603661d76c28658c7cd2892b408e91d77893e *av1-1-b10-00-quantizer-30.ivf.md5 -80168371d1150e82e3f46bcbbcabba458b835b19 *av1-1-b10-00-quantizer-31.ivf -904ecd033d4af5239c4d5b3f86e51ed5c3c2e3fb *av1-1-b10-00-quantizer-31.ivf.md5 -96291f6ace85980892d135a5b74188cd629c325f *av1-1-b10-00-quantizer-32.ivf -a5ceace390d4a75d48281fe29060c21557e4f5ae *av1-1-b10-00-quantizer-32.ivf.md5 -0f80495de34eae07c4905b72573a315a879390ec *av1-1-b10-00-quantizer-33.ivf -72b8f662973a660412946687dff878b276ae518e *av1-1-b10-00-quantizer-33.ivf.md5 -24905e3be7db320994b7fb8311dfd50a7c9e54da *av1-1-b10-00-quantizer-34.ivf -cea514bb1b7b064c4d31914a2cb266611c278577 *av1-1-b10-00-quantizer-34.ivf.md5 -083012960dd7c17d3b00fa0e807759c98faded8f *av1-1-b10-00-quantizer-35.ivf -de5fdb9e1e581484af1cc7d2dd3c3e84c90cebb2 *av1-1-b10-00-quantizer-35.ivf.md5 -f725f179aeee5b413620c0dd81b007b245c2a7ed *av1-1-b10-00-quantizer-36.ivf -246b1931c04c02df1f168090e2650827cd5dbabd *av1-1-b10-00-quantizer-36.ivf.md5 -f6aa824156e9848f237481889a8103eb6130f31d *av1-1-b10-00-quantizer-37.ivf -a8f78dd15fc2994369a08c2ddddcd0760c62ea5b *av1-1-b10-00-quantizer-37.ivf.md5 -a8dd662338c493aea266b99203e70af25982633f *av1-1-b10-00-quantizer-38.ivf -09f36d998e85d0450060f540e50b075ae1432fc6 *av1-1-b10-00-quantizer-38.ivf.md5 -d97428871720ed658da6ed0e3f7c15da83387e4c *av1-1-b10-00-quantizer-39.ivf -8c5230048909ee8f86f87c116f153cd910d0141f *av1-1-b10-00-quantizer-39.ivf.md5 -86e754e55e9b63c6e0a4fef01761414f8a6b61ca *av1-1-b10-00-quantizer-40.ivf -99a71accf6457264e45ca80d3b1f082ee5acdecc *av1-1-b10-00-quantizer-40.ivf.md5 -9d18b7236506ab7e107c062620b64096ec0cf423 *av1-1-b10-00-quantizer-41.ivf -5771159a9a7c7b66c9e13bb13ec3d53b37860208 *av1-1-b10-00-quantizer-41.ivf.md5 -54b72bc879a80e66613f421e67db62bba1c0041b *av1-1-b10-00-quantizer-42.ivf -bf958236883ee7209ef4cb0b7503b430634a291e *av1-1-b10-00-quantizer-42.ivf.md5 -a06d5321a51d90404dd7085ae511d7df5d5e1e05 *av1-1-b10-00-quantizer-43.ivf -ddb25723d976043d863634b9dc3b5fb84a245803 *av1-1-b10-00-quantizer-43.ivf.md5 -2ea0b64c170d7299dae1c14a8a49349aee8e0d08 *av1-1-b10-00-quantizer-44.ivf -d18bde1b4893792173fa2014665e9364395ad5e9 *av1-1-b10-00-quantizer-44.ivf.md5 -73e506a32d3518e23424f231c7b5323d7a34a3d6 *av1-1-b10-00-quantizer-45.ivf -be6224ebc77a3e5fb9c1645b876007e584a09d89 *av1-1-b10-00-quantizer-45.ivf.md5 -841223871374464194edc739c48dc7cefd1ff255 *av1-1-b10-00-quantizer-46.ivf -4766d616f923496a8dc113c9b7f875f0c0735f9a *av1-1-b10-00-quantizer-46.ivf.md5 -8bbbbea130aaea453f7b826956a5520d10a0eccf *av1-1-b10-00-quantizer-47.ivf -3ea21fac0c492b03d8ec25e4ee0971cd57e5f71a *av1-1-b10-00-quantizer-47.ivf.md5 -3ce83e0f1e1835b9a6c10fe502a16fd3650839e0 *av1-1-b10-00-quantizer-48.ivf -b468de2c09fca5a6b2bb7a20bab4afd8d192c31d *av1-1-b10-00-quantizer-48.ivf.md5 -f3a757c678aa00f9a9c4c4658d37733fd935925a *av1-1-b10-00-quantizer-49.ivf -f888dc88db576122695d4eb41c486aacd28a2d1d *av1-1-b10-00-quantizer-49.ivf.md5 -a9d78aaef105cc5a95b7ebb54783f37e75673123 *av1-1-b10-00-quantizer-50.ivf -06d0c5e79cc794030c4be022089b1d12c1383f71 *av1-1-b10-00-quantizer-50.ivf.md5 -165c20ee372f83682d094541097e375227353239 *av1-1-b10-00-quantizer-51.ivf -b3d90214b8c6e6f6d9357bb5784d10081325c356 *av1-1-b10-00-quantizer-51.ivf.md5 -5b3ea7a18654d943065f5c176974c3960b56664e *av1-1-b10-00-quantizer-52.ivf -dc61a6e4e2549074130023b14b137fb4fe442ce3 *av1-1-b10-00-quantizer-52.ivf.md5 -74c3b5851b6a94d33b575a689eb8d34592e95d5f *av1-1-b10-00-quantizer-53.ivf -a80e43a0fb2b852426bd941b8d4b8f56690e9bc9 *av1-1-b10-00-quantizer-53.ivf.md5 -d05b8dea2cddd4f0d9e792f42f71afbd29f7811c *av1-1-b10-00-quantizer-54.ivf -432937893321f4bd25fa400b8988c5788cb06ecf *av1-1-b10-00-quantizer-54.ivf.md5 -4eaee0f1970426be0bbeb7d4fccdc7e804e9bea4 *av1-1-b10-00-quantizer-55.ivf -710ab95ce1dcd2540db4477ff4ee6ab771fe0759 *av1-1-b10-00-quantizer-55.ivf.md5 -fe637930c9faa8744cba37effc4cb5510315d1c0 *av1-1-b10-00-quantizer-56.ivf -2f9431b30523fb6a3e4122f22c6c3ff7b96a7987 *av1-1-b10-00-quantizer-56.ivf.md5 -ed54fc7fcec194eef1f50adbbe12a6a36ab6836b *av1-1-b10-00-quantizer-57.ivf -43bccac7800b399210cf15520a83739c23a5d9c7 *av1-1-b10-00-quantizer-57.ivf.md5 -a7b8d628ba3e4c5f37aa6a3d7b82afda73ac89dc *av1-1-b10-00-quantizer-58.ivf -b26638272b787df54f45a46629b852acbcb73e3d *av1-1-b10-00-quantizer-58.ivf.md5 -c077f22ff547fb5ffd020e8dac91d05942fb52df *av1-1-b10-00-quantizer-59.ivf -4efd99cc0891bf345b8cd2ae8e21709d61be497b *av1-1-b10-00-quantizer-59.ivf.md5 -301ab53039d75e1ffa8cc6a0874d9ea94e4a6a0d *av1-1-b10-00-quantizer-60.ivf -4729bd734a6edd2d8d0432a3f66b3d91d565050e *av1-1-b10-00-quantizer-60.ivf.md5 -c78640d3211034df9fcb273bdfc18625819652f2 *av1-1-b10-00-quantizer-61.ivf -3d823eb2b33ccfea68db506626bcbecf49b0f167 *av1-1-b10-00-quantizer-61.ivf.md5 -bf241a449a28773b93e6e529a06dfc28109577e4 *av1-1-b10-00-quantizer-62.ivf -75457d8476f1927f737d089dcf3d0f7f99f3c4fb *av1-1-b10-00-quantizer-62.ivf.md5 -8b6eb3fff2e0db7eac775b08c745250ca591e2d9 *av1-1-b10-00-quantizer-63.ivf -63ea689d025593e5d91760785b8e446d04d4671e *av1-1-b10-00-quantizer-63.ivf.md5 -a9f7ea6312a533cc6426a6145edd190d45813c37 *av1-1-b8-02-allintra.ivf -8fd8f789cfee1069d20f3e2c241f5cad7292239e *av1-1-b8-02-allintra.ivf.md5 -e69e41fee40b408b6eebcc79f266a95f2ee24f9e *av1-1-b8-03-sizedown.mkv -8c528fb3ccda959a29721566e132f730935ca32b *av1-1-b8-03-sizedown.mkv.md5 -1889da5ee1708007e47bb887470ac477e1d7ba01 *av1-1-b8-03-sizeup.mkv -8de81b170635d456602dc8923a8b39c534d01fa8 *av1-1-b8-03-sizeup.mkv.md5 -d3ed7de0aa8c155fe35e0f5f4203240710d31383 *park_joy_90p_8_420_monochrome.y4m -5b3f0907407b809aa66b62cb080feda8c92454ca *park_joy_90p_8_420_vertical_csp.y4m diff --git a/third_party/aom/test/test.cmake b/third_party/aom/test/test.cmake deleted file mode 100644 index b16ae14c3..000000000 --- a/third_party/aom/test/test.cmake +++ /dev/null @@ -1,438 +0,0 @@ -# -# Copyright (c) 2017, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and the -# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was -# not distributed with this source code in the LICENSE file, you can obtain it -# at www.aomedia.org/license/software. If the Alliance for Open Media Patent -# License 1.0 was not distributed with this source code in the PATENTS file, you -# can obtain it at www.aomedia.org/license/patent. -# -if(AOM_TEST_TEST_CMAKE_) - return() -endif() # AOM_TEST_TEST_CMAKE_ -set(AOM_TEST_TEST_CMAKE_ 1) - -include(FindPythonInterp) -include(ProcessorCount) - -include("${AOM_ROOT}/test/test_data_util.cmake") - -set(AOM_UNIT_TEST_DATA_LIST_FILE "${AOM_ROOT}/test/test-data.sha1") - -list(APPEND AOM_UNIT_TEST_WRAPPER_SOURCES "${AOM_GEN_SRC_DIR}/usage_exit.c" - "${AOM_ROOT}/test/test_libaom.cc") - -list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/acm_random.h" - "${AOM_ROOT}/test/aom_integer_test.cc" - "${AOM_ROOT}/test/av1_config_test.cc" - "${AOM_ROOT}/test/blockd_test.cc" - "${AOM_ROOT}/test/clear_system_state.h" - "${AOM_ROOT}/test/codec_factory.h" - "${AOM_ROOT}/test/decode_test_driver.cc" - "${AOM_ROOT}/test/decode_test_driver.h" - "${AOM_ROOT}/test/function_equivalence_test.h" - "${AOM_ROOT}/test/log2_test.cc" - "${AOM_ROOT}/test/md5_helper.h" - "${AOM_ROOT}/test/register_state_check.h" - "${AOM_ROOT}/test/test_vectors.cc" - "${AOM_ROOT}/test/test_vectors.h" - "${AOM_ROOT}/test/transform_test_base.h" - "${AOM_ROOT}/test/util.h" - "${AOM_ROOT}/test/video_source.h") - -if(CONFIG_INTERNAL_STATS) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/hbd_metrics_test.cc") -endif() - -list(APPEND AOM_UNIT_TEST_DECODER_SOURCES "${AOM_ROOT}/test/decode_api_test.cc" - "${AOM_ROOT}/test/external_frame_buffer_test.cc" - "${AOM_ROOT}/test/invalid_file_test.cc" - "${AOM_ROOT}/test/test_vector_test.cc" - "${AOM_ROOT}/test/ivf_video_source.h") - -list(APPEND AOM_UNIT_TEST_ENCODER_SOURCES - "${AOM_ROOT}/test/active_map_test.cc" - "${AOM_ROOT}/test/altref_test.cc" - "${AOM_ROOT}/test/aq_segment_test.cc" - "${AOM_ROOT}/test/borders_test.cc" - "${AOM_ROOT}/test/cpu_speed_test.cc" - "${AOM_ROOT}/test/datarate_test.cc" - "${AOM_ROOT}/test/encode_api_test.cc" - "${AOM_ROOT}/test/encode_test_driver.cc" - "${AOM_ROOT}/test/encode_test_driver.h" - "${AOM_ROOT}/test/end_to_end_test.cc" - "${AOM_ROOT}/test/error_resilience_test.cc" - "${AOM_ROOT}/test/frame_size_tests.cc" - "${AOM_ROOT}/test/horz_superres_test.cc" - "${AOM_ROOT}/test/i420_video_source.h" - "${AOM_ROOT}/test/lossless_test.cc" - "${AOM_ROOT}/test/monochrome_test.cc" - "${AOM_ROOT}/test/qm_test.cc" - "${AOM_ROOT}/test/resize_test.cc" - "${AOM_ROOT}/test/scalability_test.cc" - "${AOM_ROOT}/test/y4m_test.cc" - "${AOM_ROOT}/test/y4m_video_source.h" - "${AOM_ROOT}/test/yuv_video_source.h") - -list(APPEND AOM_DECODE_PERF_TEST_SOURCES "${AOM_ROOT}/test/decode_perf_test.cc") -list(APPEND AOM_ENCODE_PERF_TEST_SOURCES "${AOM_ROOT}/test/encode_perf_test.cc") -list(APPEND AOM_UNIT_TEST_WEBM_SOURCES "${AOM_ROOT}/test/webm_video_source.h") -list(APPEND AOM_TEST_INTRA_PRED_SPEED_SOURCES "${AOM_GEN_SRC_DIR}/usage_exit.c" - "${AOM_ROOT}/test/test_intra_pred_speed.cc") - -if(NOT BUILD_SHARED_LIBS) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/cdef_test.cc" - "${AOM_ROOT}/test/cfl_test.cc" - "${AOM_ROOT}/test/convolve_test.cc" - "${AOM_ROOT}/test/hiprec_convolve_test.cc" - "${AOM_ROOT}/test/hiprec_convolve_test_util.cc" - "${AOM_ROOT}/test/hiprec_convolve_test_util.h" - "${AOM_ROOT}/test/intrabc_test.cc" - "${AOM_ROOT}/test/intrapred_test.cc" - "${AOM_ROOT}/test/lpf_test.cc" - "${AOM_ROOT}/test/onyxc_int_test.cc" - "${AOM_ROOT}/test/scan_test.cc" - "${AOM_ROOT}/test/selfguided_filter_test.cc" - "${AOM_ROOT}/test/simd_cmp_impl.h" - "${AOM_ROOT}/test/simd_impl.h") - - if(CONFIG_ACCOUNTING) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/accounting_test.cc") - endif() - - if(CONFIG_AV1_DECODER AND CONFIG_AV1_ENCODER) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/av1_encoder_parms_get_to_decoder.cc" - "${AOM_ROOT}/test/av1_ext_tile_test.cc" - "${AOM_ROOT}/test/binary_codes_test.cc" - "${AOM_ROOT}/test/boolcoder_test.cc" - "${AOM_ROOT}/test/coding_path_sync.cc" - "${AOM_ROOT}/test/decode_multithreaded_test.cc" - "${AOM_ROOT}/test/divu_small_test.cc" - "${AOM_ROOT}/test/dr_prediction_test.cc" - "${AOM_ROOT}/test/ec_test.cc" - "${AOM_ROOT}/test/ethread_test.cc" - "${AOM_ROOT}/test/film_grain_table_test.cc" - "${AOM_ROOT}/test/segment_binarization_sync.cc" - "${AOM_ROOT}/test/superframe_test.cc" - "${AOM_ROOT}/test/tile_independence_test.cc") - endif() - - list(APPEND AOM_UNIT_TEST_COMMON_INTRIN_NEON - "${AOM_ROOT}/test/simd_cmp_neon.cc") - if(HAVE_NEON) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/simd_neon_test.cc") - endif() - - list(APPEND AOM_UNIT_TEST_COMMON_INTRIN_SSE2 - "${AOM_ROOT}/test/simd_cmp_sse2.cc") - if(HAVE_SSE2) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/simd_sse2_test.cc") - endif() - - list(APPEND AOM_UNIT_TEST_COMMON_INTRIN_SSSE3 - "${AOM_ROOT}/test/simd_cmp_ssse3.cc") - if(HAVE_SSSE3) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/simd_ssse3_test.cc") - endif() - - if(HAVE_SSE4) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/simd_sse4_test.cc") - endif() - - if(HAVE_SSE4_1) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/filterintra_test.cc") - endif() - - list(APPEND AOM_UNIT_TEST_COMMON_INTRIN_AVX2 - "${AOM_ROOT}/test/simd_cmp_avx2.cc") - if(HAVE_AVX2) - list(APPEND AOM_UNIT_TEST_COMMON_SOURCES - "${AOM_ROOT}/test/simd_avx2_test.cc") - endif() - - list(APPEND AOM_UNIT_TEST_ENCODER_SOURCES - "${AOM_ROOT}/test/arf_freq_test.cc" - "${AOM_ROOT}/test/av1_convolve_2d_test.cc" - "${AOM_ROOT}/test/av1_convolve_2d_test_util.cc" - "${AOM_ROOT}/test/av1_convolve_2d_test_util.h" - "${AOM_ROOT}/test/av1_fwd_txfm1d_test.cc" - "${AOM_ROOT}/test/av1_fwd_txfm2d_test.cc" - "${AOM_ROOT}/test/av1_inv_txfm1d_test.cc" - "${AOM_ROOT}/test/av1_inv_txfm2d_test.cc" - "${AOM_ROOT}/test/av1_round_shift_array_test.cc" - "${AOM_ROOT}/test/av1_txfm_test.cc" - "${AOM_ROOT}/test/av1_txfm_test.h" - "${AOM_ROOT}/test/av1_wedge_utils_test.cc" - "${AOM_ROOT}/test/blend_a64_mask_1d_test.cc" - "${AOM_ROOT}/test/blend_a64_mask_test.cc" - "${AOM_ROOT}/test/comp_avg_pred_test.cc" - "${AOM_ROOT}/test/comp_avg_pred_test.h" - "${AOM_ROOT}/test/comp_mask_variance_test.cc" - "${AOM_ROOT}/test/encodetxb_test.cc" - "${AOM_ROOT}/test/error_block_test.cc" - "${AOM_ROOT}/test/fft_test.cc" - "${AOM_ROOT}/test/fwht4x4_test.cc" - "${AOM_ROOT}/test/masked_sad_test.cc" - "${AOM_ROOT}/test/masked_variance_test.cc" - "${AOM_ROOT}/test/motion_vector_test.cc" - "${AOM_ROOT}/test/noise_model_test.cc" - "${AOM_ROOT}/test/obmc_sad_test.cc" - "${AOM_ROOT}/test/obmc_variance_test.cc" - "${AOM_ROOT}/test/pickrst_test.cc" - "${AOM_ROOT}/test/sad_test.cc" - "${AOM_ROOT}/test/subtract_test.cc" - "${AOM_ROOT}/test/reconinter_test.cc" - "${AOM_ROOT}/test/sum_squares_test.cc" - "${AOM_ROOT}/test/variance_test.cc" - "${AOM_ROOT}/test/wiener_test.cc" - "${AOM_ROOT}/test/warp_filter_test.cc" - "${AOM_ROOT}/test/warp_filter_test_util.cc" - "${AOM_ROOT}/test/warp_filter_test_util.h") - - list(APPEND AOM_UNIT_TEST_ENCODER_INTRIN_SSE4_1 - "${AOM_ROOT}/test/av1_highbd_iht_test.cc" - "${AOM_ROOT}/test/av1_quantize_test.cc" - "${AOM_ROOT}/test/corner_match_test.cc" - "${AOM_ROOT}/test/quantize_func_test.cc" - "${AOM_ROOT}/test/simd_cmp_sse4.cc") - - if(HAVE_SSE4_1) - list(APPEND AOM_UNIT_TEST_ENCODER_SOURCES - "${AOM_ROOT}/test/av1_convolve_scale_test.cc" - "${AOM_ROOT}/test/av1_horz_only_frame_superres_test.cc" - "${AOM_ROOT}/test/intra_edge_test.cc") - - endif() - - if(HAVE_SSE4_2) - list(APPEND AOM_UNIT_TEST_ENCODER_SOURCES "${AOM_ROOT}/test/hash_test.cc") - endif() - -endif() - -if(ENABLE_TESTS) - find_package(PythonInterp) - if(NOT PYTHONINTERP_FOUND) - message(FATAL_ERROR - "--- Unit tests require Python, rerun cmake with " - "-DENABLE_TESTS=0 to avoid this error, or install Python and " - "make sure it's in your PATH.") - endif() - - if(MSVC) # Force static run time to avoid collisions with googletest. - include("${AOM_ROOT}/build/cmake/msvc_runtime.cmake") - if(BUILD_SHARED_LIBS) - set(AOM_DISABLE_GTEST_CMAKE 1) - endif() - endif() - - if(BUILD_SHARED_LIBS AND APPLE) # Silence an RPATH warning. - set(CMAKE_MACOSX_RPATH 1) - endif() - - include_directories( - "${AOM_ROOT}/third_party/googletest/src/googletest/include") - - if(AOM_DISABLE_GTEST_CMAKE) - include_directories("${AOM_ROOT}/third_party/googletest/src/googletest") - add_library( - gtest - STATIC - "${AOM_ROOT}/third_party/googletest/src/googletest/src/gtest-all.cc") - else() - add_subdirectory("${AOM_ROOT}/third_party/googletest/src/googletest" - EXCLUDE_FROM_ALL) - endif() -endif() - -# Setup testdata download targets, test build targets, and test run targets. The -# libaom and app util targets must exist before this function is called. -function(setup_aom_test_targets) - - # TODO(tomfinegan): Build speed optimization. $AOM_UNIT_TEST_COMMON_SOURCES - # and $AOM_UNIT_TEST_ENCODER_SOURCES are very large. The build of test targets - # could be sped up (on multicore build machines) by compiling sources in each - # list into separate object library targets, and then linking them into - # test_libaom. - add_library(test_aom_common OBJECT ${AOM_UNIT_TEST_COMMON_SOURCES}) - add_dependencies(test_aom_common aom) - - if(CONFIG_AV1_DECODER) - add_library(test_aom_decoder OBJECT ${AOM_UNIT_TEST_DECODER_SOURCES}) - add_dependencies(test_aom_decoder aom) - endif() - - if(CONFIG_AV1_ENCODER) - add_library(test_aom_encoder OBJECT ${AOM_UNIT_TEST_ENCODER_SOURCES}) - add_dependencies(test_aom_encoder aom) - endif() - - add_executable(test_libaom ${AOM_UNIT_TEST_WRAPPER_SOURCES} - $<TARGET_OBJECTS:aom_common_app_util> - $<TARGET_OBJECTS:test_aom_common>) - list(APPEND AOM_APP_TARGETS test_libaom) - - if(CONFIG_AV1_DECODER) - target_sources(test_libaom PRIVATE $<TARGET_OBJECTS:aom_decoder_app_util> - $<TARGET_OBJECTS:test_aom_decoder>) - - if(ENABLE_DECODE_PERF_TESTS AND CONFIG_WEBM_IO) - target_sources(test_libaom PRIVATE ${AOM_DECODE_PERF_TEST_SOURCES}) - endif() - endif() - - if(CONFIG_AV1_ENCODER) - target_sources(test_libaom PRIVATE $<TARGET_OBJECTS:test_aom_encoder> - $<TARGET_OBJECTS:aom_encoder_app_util>) - - if(ENABLE_ENCODE_PERF_TESTS) - target_sources(test_libaom PRIVATE ${AOM_ENCODE_PERF_TEST_SOURCES}) - endif() - - if(NOT BUILD_SHARED_LIBS) - add_executable(test_intra_pred_speed ${AOM_TEST_INTRA_PRED_SPEED_SOURCES} - $<TARGET_OBJECTS:aom_common_app_util>) - target_link_libraries(test_intra_pred_speed ${AOM_LIB_LINK_TYPE} aom - gtest) - list(APPEND AOM_APP_TARGETS test_intra_pred_speed) - endif() - endif() - - target_link_libraries(test_libaom ${AOM_LIB_LINK_TYPE} aom gtest) - - if(CONFIG_LIBYUV) - target_sources(test_libaom PRIVATE $<TARGET_OBJECTS:yuv>) - endif() - if(CONFIG_WEBM_IO) - target_sources(test_libaom PRIVATE $<TARGET_OBJECTS:webm>) - endif() - if(HAVE_SSE2) - add_intrinsics_source_to_target("-msse2" "test_libaom" - "AOM_UNIT_TEST_COMMON_INTRIN_SSE2") - endif() - if(HAVE_SSSE3) - add_intrinsics_source_to_target("-mssse3" "test_libaom" - "AOM_UNIT_TEST_COMMON_INTRIN_SSSE3") - endif() - if(HAVE_SSE4_1) - add_intrinsics_source_to_target("-msse4.1" "test_libaom" - "AOM_UNIT_TEST_COMMON_INTRIN_SSE4_1") - if(CONFIG_AV1_ENCODER) - if(AOM_UNIT_TEST_ENCODER_INTRIN_SSE4_1) - add_intrinsics_source_to_target("-msse4.1" "test_libaom" - "AOM_UNIT_TEST_ENCODER_INTRIN_SSE4_1") - endif() - endif() - endif() - if(HAVE_AVX2) - add_intrinsics_source_to_target("-mavx2" "test_libaom" - "AOM_UNIT_TEST_COMMON_INTRIN_AVX2") - endif() - if(HAVE_NEON) - add_intrinsics_source_to_target("${AOM_NEON_INTRIN_FLAG}" "test_libaom" - "AOM_UNIT_TEST_COMMON_INTRIN_NEON") - endif() - - if(ENABLE_TESTDATA) - make_test_data_lists("${AOM_UNIT_TEST_DATA_LIST_FILE}" test_files - test_file_checksums) - list(LENGTH test_files num_test_files) - list(LENGTH test_file_checksums num_test_file_checksums) - - math(EXPR max_file_index "${num_test_files} - 1") - foreach(test_index RANGE ${max_file_index}) - list(GET test_files ${test_index} test_file) - list(GET test_file_checksums ${test_index} test_file_checksum) - add_custom_target(testdata_${test_index} - COMMAND - ${CMAKE_COMMAND} -DAOM_CONFIG_DIR="${AOM_CONFIG_DIR}" - -DAOM_ROOT="${AOM_ROOT}" - -DAOM_TEST_FILE="${test_file}" - -DAOM_TEST_CHECKSUM=${test_file_checksum} -P - "${AOM_ROOT}/test/test_data_download_worker.cmake") - list(APPEND testdata_targets testdata_${test_index}) - endforeach() - - # Create a custom build target for running each test data download target. - add_custom_target(testdata) - add_dependencies(testdata ${testdata_targets}) - - # Skip creation of test run targets when generating for Visual Studio and - # Xcode unless the user explicitly requests IDE test hosting. This is done - # to make build cycles in the IDE tolerable when the IDE command for build - # project is used to build AOM. Default behavior in IDEs is to build all - # targets, and the test run takes hours. - if(((NOT MSVC) AND (NOT XCODE)) OR ENABLE_IDE_TEST_HOSTING) - - # Pick a reasonable number of targets (this controls parallelization). - processorcount(num_test_targets) - if(num_test_targets EQUAL 0) # Just default to 10 targets when there's no - # processor count available. - set(num_test_targets 10) - endif() - - math(EXPR max_shard_index "${num_test_targets} - 1") - foreach(shard_index RANGE ${max_shard_index}) - set(test_name "test_${shard_index}") - add_custom_target(${test_name} - COMMAND ${CMAKE_COMMAND} - -DGTEST_SHARD_INDEX=${shard_index} - -DGTEST_TOTAL_SHARDS=${num_test_targets} - -DTEST_LIBAOM=$<TARGET_FILE:test_libaom> -P - "${AOM_ROOT}/test/test_runner.cmake" - DEPENDS testdata test_libaom) - list(APPEND test_targets ${test_name}) - endforeach() - add_custom_target(runtests) - add_dependencies(runtests ${test_targets}) - endif() - endif() - - # Collect all variables containing libaom test source files. - get_cmake_property(all_cmake_vars VARIABLES) - foreach(var ${all_cmake_vars}) - - # https://github.com/cheshirekow/cmake_format/issues/34 -# cmake-format: off - if (("${var}" MATCHES "_TEST_" AND NOT - "${var}" MATCHES - "_DATA_\|_CMAKE_\|INTRA_PRED\|_COMPILED\|_HOSTING\|_PERF_\|CODER_") - OR (CONFIG_AV1_ENCODER AND ENABLE_ENCODE_PERF_TESTS AND - "${var}" MATCHES "_ENCODE_PERF_TEST_") - OR (CONFIG_AV1_DECODER AND ENABLE_DECODE_PERF_TESTS AND - "${var}" MATCHES "_DECODE_PERF_TEST_") - OR (CONFIG_AV1_ENCODER AND "${var}" MATCHES "_TEST_ENCODER_") - OR (CONFIG_AV1_DECODER AND "${var}" MATCHES "_TEST_DECODER_")) - list(APPEND aom_test_source_vars ${var}) - endif() - # cmake-format: on - endforeach() - - # Libaom_test_srcs.txt generation. - set(libaom_test_srcs_txt_file "${AOM_CONFIG_DIR}/libaom_test_srcs.txt") - file(WRITE "${libaom_test_srcs_txt_file}" - "# This file is generated. DO NOT EDIT.\n") - - # Static source file list first. - foreach(aom_test_source_var ${aom_test_source_vars}) - foreach(file ${${aom_test_source_var}}) - if(NOT "${file}" MATCHES "${AOM_CONFIG_DIR}") - string(REPLACE "${AOM_ROOT}/" "" file "${file}") - file(APPEND "${libaom_test_srcs_txt_file}" "${file}\n") - endif() - endforeach() - endforeach() - - set(AOM_APP_TARGETS ${AOM_APP_TARGETS} PARENT_SCOPE) -endfunction() diff --git a/third_party/aom/test/test_data_download_worker.cmake b/third_party/aom/test/test_data_download_worker.cmake deleted file mode 100644 index dc803497d..000000000 --- a/third_party/aom/test/test_data_download_worker.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright (c) 2017, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and the -# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was -# not distributed with this source code in the LICENSE file, you can obtain it -# at www.aomedia.org/license/software. If the Alliance for Open Media Patent -# License 1.0 was not distributed with this source code in the PATENTS file, you -# can obtain it at www.aomedia.org/license/patent. -# -include("${AOM_ROOT}/test/test_data_util.cmake") - -# https://github.com/cheshirekow/cmake_format/issues/34 -# cmake-format: off -if (NOT AOM_ROOT OR NOT AOM_CONFIG_DIR OR NOT AOM_TEST_FILE - OR NOT AOM_TEST_CHECKSUM) - message(FATAL_ERROR - "AOM_ROOT, AOM_CONFIG_DIR, AOM_TEST_FILE and AOM_TEST_CHECKSUM must be - defined.") -endif () -# cmake-format: on - -set(AOM_TEST_DATA_URL "http://storage.googleapis.com/aom-test-data") - -if(NOT AOM_TEST_DATA_PATH) - set(AOM_TEST_DATA_PATH "$ENV{LIBAOM_TEST_DATA_PATH}") -endif() - -if("${AOM_TEST_DATA_PATH}" STREQUAL "") - message(WARNING - "Writing test data to ${AOM_CONFIG_DIR}, set " - "$LIBAOM_TEST_DATA_PATH in your environment to avoid this warning.") - set(AOM_TEST_DATA_PATH "${AOM_CONFIG_DIR}") -endif() - -if(NOT EXISTS "${AOM_TEST_DATA_PATH}") - file(MAKE_DIRECTORY "${AOM_TEST_DATA_PATH}") -endif() - -expand_test_file_paths("AOM_TEST_FILE" "${AOM_TEST_DATA_PATH}" "filepath") -expand_test_file_paths("AOM_TEST_FILE" "${AOM_TEST_DATA_URL}" "url") - -check_file("${filepath}" "${AOM_TEST_CHECKSUM}" "needs_download") -if(needs_download) - download_test_file("${url}" "${AOM_TEST_CHECKSUM}" "${filepath}") -endif() diff --git a/third_party/aom/test/test_data_util.cmake b/third_party/aom/test/test_data_util.cmake deleted file mode 100644 index 45c951478..000000000 --- a/third_party/aom/test/test_data_util.cmake +++ /dev/null @@ -1,598 +0,0 @@ -# -# Copyright (c) 2017, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and the -# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was -# not distributed with this source code in the LICENSE file, you can obtain it -# at www.aomedia.org/license/software. If the Alliance for Open Media Patent -# License 1.0 was not distributed with this source code in the PATENTS file, you -# can obtain it at www.aomedia.org/license/patent. -# - -list(APPEND AOM_TEST_DATA_FILE_NAMES - "hantro_collage_w352h288.yuv" - "hantro_odd.yuv" - "invalid-bug-1814.ivf" - "invalid-bug-1814.ivf.res" - "invalid-oss-fuzz-10061.ivf" - "invalid-oss-fuzz-10061.ivf.res" - "invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf" - "invalid-oss-fuzz-10117-mc-buf-use-highbd.ivf.res" - "invalid-oss-fuzz-10227.ivf" - "invalid-oss-fuzz-10227.ivf.res" - "invalid-oss-fuzz-9463.ivf" - "invalid-oss-fuzz-9463.ivf.res" - "invalid-oss-fuzz-9482.ivf" - "invalid-oss-fuzz-9482.ivf.res" - "invalid-oss-fuzz-9720.ivf" - "invalid-oss-fuzz-9720.ivf.res" - "park_joy_90p_10_420.y4m" - "park_joy_90p_10_422.y4m" - "park_joy_90p_10_444.y4m" - "park_joy_90p_12_420.y4m" - "park_joy_90p_12_422.y4m" - "park_joy_90p_12_444.y4m" - "park_joy_90p_8_420_a10-1.y4m" - "park_joy_90p_8_420.y4m" - "park_joy_90p_8_420_monochrome.y4m" - "park_joy_90p_8_420_vertical_csp.y4m" - "park_joy_90p_8_422.y4m" - "park_joy_90p_8_444.y4m" - "desktop_credits.y4m" - "niklas_1280_720_30.y4m" - "rush_hour_444.y4m" - "screendata.y4m" - "niklas_640_480_30.yuv" - "vase10x10.yuv") - -if(ENABLE_DECODE_PERF_TESTS AND CONFIG_AV1_ENCODER) - list(APPEND AOM_TEST_DATA_FILE_NAMES "niklas_1280_720_30.yuv") -endif() - -if(CONFIG_AV1_DECODER) - list(APPEND AOM_TEST_DATA_FILE_NAMES - "av1-1-b8-00-quantizer-00.ivf" - "av1-1-b8-00-quantizer-00.ivf.md5" - "av1-1-b8-00-quantizer-01.ivf" - "av1-1-b8-00-quantizer-01.ivf.md5" - "av1-1-b8-00-quantizer-02.ivf" - "av1-1-b8-00-quantizer-02.ivf.md5" - "av1-1-b8-00-quantizer-03.ivf" - "av1-1-b8-00-quantizer-03.ivf.md5" - "av1-1-b8-00-quantizer-04.ivf" - "av1-1-b8-00-quantizer-04.ivf.md5" - "av1-1-b8-00-quantizer-05.ivf" - "av1-1-b8-00-quantizer-05.ivf.md5" - "av1-1-b8-00-quantizer-06.ivf" - "av1-1-b8-00-quantizer-06.ivf.md5" - "av1-1-b8-00-quantizer-07.ivf" - "av1-1-b8-00-quantizer-07.ivf.md5" - "av1-1-b8-00-quantizer-08.ivf" - "av1-1-b8-00-quantizer-08.ivf.md5" - "av1-1-b8-00-quantizer-09.ivf" - "av1-1-b8-00-quantizer-09.ivf.md5" - "av1-1-b8-00-quantizer-10.ivf" - "av1-1-b8-00-quantizer-10.ivf.md5" - "av1-1-b8-00-quantizer-11.ivf" - "av1-1-b8-00-quantizer-11.ivf.md5" - "av1-1-b8-00-quantizer-12.ivf" - "av1-1-b8-00-quantizer-12.ivf.md5" - "av1-1-b8-00-quantizer-13.ivf" - "av1-1-b8-00-quantizer-13.ivf.md5" - "av1-1-b8-00-quantizer-14.ivf" - "av1-1-b8-00-quantizer-14.ivf.md5" - "av1-1-b8-00-quantizer-15.ivf" - "av1-1-b8-00-quantizer-15.ivf.md5" - "av1-1-b8-00-quantizer-16.ivf" - "av1-1-b8-00-quantizer-16.ivf.md5" - "av1-1-b8-00-quantizer-17.ivf" - "av1-1-b8-00-quantizer-17.ivf.md5" - "av1-1-b8-00-quantizer-18.ivf" - "av1-1-b8-00-quantizer-18.ivf.md5" - "av1-1-b8-00-quantizer-19.ivf" - "av1-1-b8-00-quantizer-19.ivf.md5" - "av1-1-b8-00-quantizer-20.ivf" - "av1-1-b8-00-quantizer-20.ivf.md5" - "av1-1-b8-00-quantizer-21.ivf" - "av1-1-b8-00-quantizer-21.ivf.md5" - "av1-1-b8-00-quantizer-22.ivf" - "av1-1-b8-00-quantizer-22.ivf.md5" - "av1-1-b8-00-quantizer-23.ivf" - "av1-1-b8-00-quantizer-23.ivf.md5" - "av1-1-b8-00-quantizer-24.ivf" - "av1-1-b8-00-quantizer-24.ivf.md5" - "av1-1-b8-00-quantizer-25.ivf" - "av1-1-b8-00-quantizer-25.ivf.md5" - "av1-1-b8-00-quantizer-26.ivf" - "av1-1-b8-00-quantizer-26.ivf.md5" - "av1-1-b8-00-quantizer-27.ivf" - "av1-1-b8-00-quantizer-27.ivf.md5" - "av1-1-b8-00-quantizer-28.ivf" - "av1-1-b8-00-quantizer-28.ivf.md5" - "av1-1-b8-00-quantizer-29.ivf" - "av1-1-b8-00-quantizer-29.ivf.md5" - "av1-1-b8-00-quantizer-30.ivf" - "av1-1-b8-00-quantizer-30.ivf.md5" - "av1-1-b8-00-quantizer-31.ivf" - "av1-1-b8-00-quantizer-31.ivf.md5" - "av1-1-b8-00-quantizer-32.ivf" - "av1-1-b8-00-quantizer-32.ivf.md5" - "av1-1-b8-00-quantizer-33.ivf" - "av1-1-b8-00-quantizer-33.ivf.md5" - "av1-1-b8-00-quantizer-34.ivf" - "av1-1-b8-00-quantizer-34.ivf.md5" - "av1-1-b8-00-quantizer-35.ivf" - "av1-1-b8-00-quantizer-35.ivf.md5" - "av1-1-b8-00-quantizer-36.ivf" - "av1-1-b8-00-quantizer-36.ivf.md5" - "av1-1-b8-00-quantizer-37.ivf" - "av1-1-b8-00-quantizer-37.ivf.md5" - "av1-1-b8-00-quantizer-38.ivf" - "av1-1-b8-00-quantizer-38.ivf.md5" - "av1-1-b8-00-quantizer-39.ivf" - "av1-1-b8-00-quantizer-39.ivf.md5" - "av1-1-b8-00-quantizer-40.ivf" - "av1-1-b8-00-quantizer-40.ivf.md5" - "av1-1-b8-00-quantizer-41.ivf" - "av1-1-b8-00-quantizer-41.ivf.md5" - "av1-1-b8-00-quantizer-42.ivf" - "av1-1-b8-00-quantizer-42.ivf.md5" - "av1-1-b8-00-quantizer-43.ivf" - "av1-1-b8-00-quantizer-43.ivf.md5" - "av1-1-b8-00-quantizer-44.ivf" - "av1-1-b8-00-quantizer-44.ivf.md5" - "av1-1-b8-00-quantizer-45.ivf" - "av1-1-b8-00-quantizer-45.ivf.md5" - "av1-1-b8-00-quantizer-46.ivf" - "av1-1-b8-00-quantizer-46.ivf.md5" - "av1-1-b8-00-quantizer-47.ivf" - "av1-1-b8-00-quantizer-47.ivf.md5" - "av1-1-b8-00-quantizer-48.ivf" - "av1-1-b8-00-quantizer-48.ivf.md5" - "av1-1-b8-00-quantizer-49.ivf" - "av1-1-b8-00-quantizer-49.ivf.md5" - "av1-1-b8-00-quantizer-50.ivf" - "av1-1-b8-00-quantizer-50.ivf.md5" - "av1-1-b8-00-quantizer-51.ivf" - "av1-1-b8-00-quantizer-51.ivf.md5" - "av1-1-b8-00-quantizer-52.ivf" - "av1-1-b8-00-quantizer-52.ivf.md5" - "av1-1-b8-00-quantizer-53.ivf" - "av1-1-b8-00-quantizer-53.ivf.md5" - "av1-1-b8-00-quantizer-54.ivf" - "av1-1-b8-00-quantizer-54.ivf.md5" - "av1-1-b8-00-quantizer-55.ivf" - "av1-1-b8-00-quantizer-55.ivf.md5" - "av1-1-b8-00-quantizer-56.ivf" - "av1-1-b8-00-quantizer-56.ivf.md5" - "av1-1-b8-00-quantizer-57.ivf" - "av1-1-b8-00-quantizer-57.ivf.md5" - "av1-1-b8-00-quantizer-58.ivf" - "av1-1-b8-00-quantizer-58.ivf.md5" - "av1-1-b8-00-quantizer-59.ivf" - "av1-1-b8-00-quantizer-59.ivf.md5" - "av1-1-b8-00-quantizer-60.ivf" - "av1-1-b8-00-quantizer-60.ivf.md5" - "av1-1-b8-00-quantizer-61.ivf" - "av1-1-b8-00-quantizer-61.ivf.md5" - "av1-1-b8-00-quantizer-62.ivf" - "av1-1-b8-00-quantizer-62.ivf.md5" - "av1-1-b8-00-quantizer-63.ivf" - "av1-1-b8-00-quantizer-63.ivf.md5" - "av1-1-b10-00-quantizer-00.ivf" - "av1-1-b10-00-quantizer-00.ivf.md5" - "av1-1-b10-00-quantizer-01.ivf" - "av1-1-b10-00-quantizer-01.ivf.md5" - "av1-1-b10-00-quantizer-02.ivf" - "av1-1-b10-00-quantizer-02.ivf.md5" - "av1-1-b10-00-quantizer-03.ivf" - "av1-1-b10-00-quantizer-03.ivf.md5" - "av1-1-b10-00-quantizer-04.ivf" - "av1-1-b10-00-quantizer-04.ivf.md5" - "av1-1-b10-00-quantizer-05.ivf" - "av1-1-b10-00-quantizer-05.ivf.md5" - "av1-1-b10-00-quantizer-06.ivf" - "av1-1-b10-00-quantizer-06.ivf.md5" - "av1-1-b10-00-quantizer-07.ivf" - "av1-1-b10-00-quantizer-07.ivf.md5" - "av1-1-b10-00-quantizer-08.ivf" - "av1-1-b10-00-quantizer-08.ivf.md5" - "av1-1-b10-00-quantizer-09.ivf" - "av1-1-b10-00-quantizer-09.ivf.md5" - "av1-1-b10-00-quantizer-10.ivf" - "av1-1-b10-00-quantizer-10.ivf.md5" - "av1-1-b10-00-quantizer-11.ivf" - "av1-1-b10-00-quantizer-11.ivf.md5" - "av1-1-b10-00-quantizer-12.ivf" - "av1-1-b10-00-quantizer-12.ivf.md5" - "av1-1-b10-00-quantizer-13.ivf" - "av1-1-b10-00-quantizer-13.ivf.md5" - "av1-1-b10-00-quantizer-14.ivf" - "av1-1-b10-00-quantizer-14.ivf.md5" - "av1-1-b10-00-quantizer-15.ivf" - "av1-1-b10-00-quantizer-15.ivf.md5" - "av1-1-b10-00-quantizer-16.ivf" - "av1-1-b10-00-quantizer-16.ivf.md5" - "av1-1-b10-00-quantizer-17.ivf" - "av1-1-b10-00-quantizer-17.ivf.md5" - "av1-1-b10-00-quantizer-18.ivf" - "av1-1-b10-00-quantizer-18.ivf.md5" - "av1-1-b10-00-quantizer-19.ivf" - "av1-1-b10-00-quantizer-19.ivf.md5" - "av1-1-b10-00-quantizer-20.ivf" - "av1-1-b10-00-quantizer-20.ivf.md5" - "av1-1-b10-00-quantizer-21.ivf" - "av1-1-b10-00-quantizer-21.ivf.md5" - "av1-1-b10-00-quantizer-22.ivf" - "av1-1-b10-00-quantizer-22.ivf.md5" - "av1-1-b10-00-quantizer-23.ivf" - "av1-1-b10-00-quantizer-23.ivf.md5" - "av1-1-b10-00-quantizer-24.ivf" - "av1-1-b10-00-quantizer-24.ivf.md5" - "av1-1-b10-00-quantizer-25.ivf" - "av1-1-b10-00-quantizer-25.ivf.md5" - "av1-1-b10-00-quantizer-26.ivf" - "av1-1-b10-00-quantizer-26.ivf.md5" - "av1-1-b10-00-quantizer-27.ivf" - "av1-1-b10-00-quantizer-27.ivf.md5" - "av1-1-b10-00-quantizer-28.ivf" - "av1-1-b10-00-quantizer-28.ivf.md5" - "av1-1-b10-00-quantizer-29.ivf" - "av1-1-b10-00-quantizer-29.ivf.md5" - "av1-1-b10-00-quantizer-30.ivf" - "av1-1-b10-00-quantizer-30.ivf.md5" - "av1-1-b10-00-quantizer-31.ivf" - "av1-1-b10-00-quantizer-31.ivf.md5" - "av1-1-b10-00-quantizer-32.ivf" - "av1-1-b10-00-quantizer-32.ivf.md5" - "av1-1-b10-00-quantizer-33.ivf" - "av1-1-b10-00-quantizer-33.ivf.md5" - "av1-1-b10-00-quantizer-34.ivf" - "av1-1-b10-00-quantizer-34.ivf.md5" - "av1-1-b10-00-quantizer-35.ivf" - "av1-1-b10-00-quantizer-35.ivf.md5" - "av1-1-b10-00-quantizer-36.ivf" - "av1-1-b10-00-quantizer-36.ivf.md5" - "av1-1-b10-00-quantizer-37.ivf" - "av1-1-b10-00-quantizer-37.ivf.md5" - "av1-1-b10-00-quantizer-38.ivf" - "av1-1-b10-00-quantizer-38.ivf.md5" - "av1-1-b10-00-quantizer-39.ivf" - "av1-1-b10-00-quantizer-39.ivf.md5" - "av1-1-b10-00-quantizer-40.ivf" - "av1-1-b10-00-quantizer-40.ivf.md5" - "av1-1-b10-00-quantizer-41.ivf" - "av1-1-b10-00-quantizer-41.ivf.md5" - "av1-1-b10-00-quantizer-42.ivf" - "av1-1-b10-00-quantizer-42.ivf.md5" - "av1-1-b10-00-quantizer-43.ivf" - "av1-1-b10-00-quantizer-43.ivf.md5" - "av1-1-b10-00-quantizer-44.ivf" - "av1-1-b10-00-quantizer-44.ivf.md5" - "av1-1-b10-00-quantizer-45.ivf" - "av1-1-b10-00-quantizer-45.ivf.md5" - "av1-1-b10-00-quantizer-46.ivf" - "av1-1-b10-00-quantizer-46.ivf.md5" - "av1-1-b10-00-quantizer-47.ivf" - "av1-1-b10-00-quantizer-47.ivf.md5" - "av1-1-b10-00-quantizer-48.ivf" - "av1-1-b10-00-quantizer-48.ivf.md5" - "av1-1-b10-00-quantizer-49.ivf" - "av1-1-b10-00-quantizer-49.ivf.md5" - "av1-1-b10-00-quantizer-50.ivf" - "av1-1-b10-00-quantizer-50.ivf.md5" - "av1-1-b10-00-quantizer-51.ivf" - "av1-1-b10-00-quantizer-51.ivf.md5" - "av1-1-b10-00-quantizer-52.ivf" - "av1-1-b10-00-quantizer-52.ivf.md5" - "av1-1-b10-00-quantizer-53.ivf" - "av1-1-b10-00-quantizer-53.ivf.md5" - "av1-1-b10-00-quantizer-54.ivf" - "av1-1-b10-00-quantizer-54.ivf.md5" - "av1-1-b10-00-quantizer-55.ivf" - "av1-1-b10-00-quantizer-55.ivf.md5" - "av1-1-b10-00-quantizer-56.ivf" - "av1-1-b10-00-quantizer-56.ivf.md5" - "av1-1-b10-00-quantizer-57.ivf" - "av1-1-b10-00-quantizer-57.ivf.md5" - "av1-1-b10-00-quantizer-58.ivf" - "av1-1-b10-00-quantizer-58.ivf.md5" - "av1-1-b10-00-quantizer-59.ivf" - "av1-1-b10-00-quantizer-59.ivf.md5" - "av1-1-b10-00-quantizer-60.ivf" - "av1-1-b10-00-quantizer-60.ivf.md5" - "av1-1-b10-00-quantizer-61.ivf" - "av1-1-b10-00-quantizer-61.ivf.md5" - "av1-1-b10-00-quantizer-62.ivf" - "av1-1-b10-00-quantizer-62.ivf.md5" - "av1-1-b10-00-quantizer-63.ivf" - "av1-1-b10-00-quantizer-63.ivf.md5" - "av1-1-b8-01-size-16x16.ivf" - "av1-1-b8-01-size-16x16.ivf.md5" - "av1-1-b8-01-size-16x18.ivf" - "av1-1-b8-01-size-16x18.ivf.md5" - "av1-1-b8-01-size-16x32.ivf" - "av1-1-b8-01-size-16x32.ivf.md5" - "av1-1-b8-01-size-16x34.ivf" - "av1-1-b8-01-size-16x34.ivf.md5" - "av1-1-b8-01-size-16x64.ivf" - "av1-1-b8-01-size-16x64.ivf.md5" - "av1-1-b8-01-size-16x66.ivf" - "av1-1-b8-01-size-16x66.ivf.md5" - "av1-1-b8-01-size-18x16.ivf" - "av1-1-b8-01-size-18x16.ivf.md5" - "av1-1-b8-01-size-18x18.ivf" - "av1-1-b8-01-size-18x18.ivf.md5" - "av1-1-b8-01-size-18x32.ivf" - "av1-1-b8-01-size-18x32.ivf.md5" - "av1-1-b8-01-size-18x34.ivf" - "av1-1-b8-01-size-18x34.ivf.md5" - "av1-1-b8-01-size-18x64.ivf" - "av1-1-b8-01-size-18x64.ivf.md5" - "av1-1-b8-01-size-18x66.ivf" - "av1-1-b8-01-size-18x66.ivf.md5" - "av1-1-b8-01-size-196x196.ivf" - "av1-1-b8-01-size-196x196.ivf.md5" - "av1-1-b8-01-size-196x198.ivf" - "av1-1-b8-01-size-196x198.ivf.md5" - "av1-1-b8-01-size-196x200.ivf" - "av1-1-b8-01-size-196x200.ivf.md5" - "av1-1-b8-01-size-196x202.ivf" - "av1-1-b8-01-size-196x202.ivf.md5" - "av1-1-b8-01-size-196x208.ivf" - "av1-1-b8-01-size-196x208.ivf.md5" - "av1-1-b8-01-size-196x210.ivf" - "av1-1-b8-01-size-196x210.ivf.md5" - "av1-1-b8-01-size-196x224.ivf" - "av1-1-b8-01-size-196x224.ivf.md5" - "av1-1-b8-01-size-196x226.ivf" - "av1-1-b8-01-size-196x226.ivf.md5" - "av1-1-b8-01-size-198x196.ivf" - "av1-1-b8-01-size-198x196.ivf.md5" - "av1-1-b8-01-size-198x198.ivf" - "av1-1-b8-01-size-198x198.ivf.md5" - "av1-1-b8-01-size-198x200.ivf" - "av1-1-b8-01-size-198x200.ivf.md5" - "av1-1-b8-01-size-198x202.ivf" - "av1-1-b8-01-size-198x202.ivf.md5" - "av1-1-b8-01-size-198x208.ivf" - "av1-1-b8-01-size-198x208.ivf.md5" - "av1-1-b8-01-size-198x210.ivf" - "av1-1-b8-01-size-198x210.ivf.md5" - "av1-1-b8-01-size-198x224.ivf" - "av1-1-b8-01-size-198x224.ivf.md5" - "av1-1-b8-01-size-198x226.ivf" - "av1-1-b8-01-size-198x226.ivf.md5" - "av1-1-b8-01-size-200x196.ivf" - "av1-1-b8-01-size-200x196.ivf.md5" - "av1-1-b8-01-size-200x198.ivf" - "av1-1-b8-01-size-200x198.ivf.md5" - "av1-1-b8-01-size-200x200.ivf" - "av1-1-b8-01-size-200x200.ivf.md5" - "av1-1-b8-01-size-200x202.ivf" - "av1-1-b8-01-size-200x202.ivf.md5" - "av1-1-b8-01-size-200x208.ivf" - "av1-1-b8-01-size-200x208.ivf.md5" - "av1-1-b8-01-size-200x210.ivf" - "av1-1-b8-01-size-200x210.ivf.md5" - "av1-1-b8-01-size-200x224.ivf" - "av1-1-b8-01-size-200x224.ivf.md5" - "av1-1-b8-01-size-200x226.ivf" - "av1-1-b8-01-size-200x226.ivf.md5" - "av1-1-b8-01-size-202x196.ivf" - "av1-1-b8-01-size-202x196.ivf.md5" - "av1-1-b8-01-size-202x198.ivf" - "av1-1-b8-01-size-202x198.ivf.md5" - "av1-1-b8-01-size-202x200.ivf" - "av1-1-b8-01-size-202x200.ivf.md5" - "av1-1-b8-01-size-202x202.ivf" - "av1-1-b8-01-size-202x202.ivf.md5" - "av1-1-b8-01-size-202x208.ivf" - "av1-1-b8-01-size-202x208.ivf.md5" - "av1-1-b8-01-size-202x210.ivf" - "av1-1-b8-01-size-202x210.ivf.md5" - "av1-1-b8-01-size-202x224.ivf" - "av1-1-b8-01-size-202x224.ivf.md5" - "av1-1-b8-01-size-202x226.ivf" - "av1-1-b8-01-size-202x226.ivf.md5" - "av1-1-b8-01-size-208x196.ivf" - "av1-1-b8-01-size-208x196.ivf.md5" - "av1-1-b8-01-size-208x198.ivf" - "av1-1-b8-01-size-208x198.ivf.md5" - "av1-1-b8-01-size-208x200.ivf" - "av1-1-b8-01-size-208x200.ivf.md5" - "av1-1-b8-01-size-208x202.ivf" - "av1-1-b8-01-size-208x202.ivf.md5" - "av1-1-b8-01-size-208x208.ivf" - "av1-1-b8-01-size-208x208.ivf.md5" - "av1-1-b8-01-size-208x210.ivf" - "av1-1-b8-01-size-208x210.ivf.md5" - "av1-1-b8-01-size-208x224.ivf" - "av1-1-b8-01-size-208x224.ivf.md5" - "av1-1-b8-01-size-208x226.ivf" - "av1-1-b8-01-size-208x226.ivf.md5" - "av1-1-b8-01-size-210x196.ivf" - "av1-1-b8-01-size-210x196.ivf.md5" - "av1-1-b8-01-size-210x198.ivf" - "av1-1-b8-01-size-210x198.ivf.md5" - "av1-1-b8-01-size-210x200.ivf" - "av1-1-b8-01-size-210x200.ivf.md5" - "av1-1-b8-01-size-210x202.ivf" - "av1-1-b8-01-size-210x202.ivf.md5" - "av1-1-b8-01-size-210x208.ivf" - "av1-1-b8-01-size-210x208.ivf.md5" - "av1-1-b8-01-size-210x210.ivf" - "av1-1-b8-01-size-210x210.ivf.md5" - "av1-1-b8-01-size-210x224.ivf" - "av1-1-b8-01-size-210x224.ivf.md5" - "av1-1-b8-01-size-210x226.ivf" - "av1-1-b8-01-size-210x226.ivf.md5" - "av1-1-b8-01-size-224x196.ivf" - "av1-1-b8-01-size-224x196.ivf.md5" - "av1-1-b8-01-size-224x198.ivf" - "av1-1-b8-01-size-224x198.ivf.md5" - "av1-1-b8-01-size-224x200.ivf" - "av1-1-b8-01-size-224x200.ivf.md5" - "av1-1-b8-01-size-224x202.ivf" - "av1-1-b8-01-size-224x202.ivf.md5" - "av1-1-b8-01-size-224x208.ivf" - "av1-1-b8-01-size-224x208.ivf.md5" - "av1-1-b8-01-size-224x210.ivf" - "av1-1-b8-01-size-224x210.ivf.md5" - "av1-1-b8-01-size-224x224.ivf" - "av1-1-b8-01-size-224x224.ivf.md5" - "av1-1-b8-01-size-224x226.ivf" - "av1-1-b8-01-size-224x226.ivf.md5" - "av1-1-b8-01-size-226x196.ivf" - "av1-1-b8-01-size-226x196.ivf.md5" - "av1-1-b8-01-size-226x198.ivf" - "av1-1-b8-01-size-226x198.ivf.md5" - "av1-1-b8-01-size-226x200.ivf" - "av1-1-b8-01-size-226x200.ivf.md5" - "av1-1-b8-01-size-226x202.ivf" - "av1-1-b8-01-size-226x202.ivf.md5" - "av1-1-b8-01-size-226x208.ivf" - "av1-1-b8-01-size-226x208.ivf.md5" - "av1-1-b8-01-size-226x210.ivf" - "av1-1-b8-01-size-226x210.ivf.md5" - "av1-1-b8-01-size-226x224.ivf" - "av1-1-b8-01-size-226x224.ivf.md5" - "av1-1-b8-01-size-226x226.ivf" - "av1-1-b8-01-size-226x226.ivf.md5" - "av1-1-b8-01-size-32x16.ivf" - "av1-1-b8-01-size-32x16.ivf.md5" - "av1-1-b8-01-size-32x18.ivf" - "av1-1-b8-01-size-32x18.ivf.md5" - "av1-1-b8-01-size-32x32.ivf" - "av1-1-b8-01-size-32x32.ivf.md5" - "av1-1-b8-01-size-32x34.ivf" - "av1-1-b8-01-size-32x34.ivf.md5" - "av1-1-b8-01-size-32x64.ivf" - "av1-1-b8-01-size-32x64.ivf.md5" - "av1-1-b8-01-size-32x66.ivf" - "av1-1-b8-01-size-32x66.ivf.md5" - "av1-1-b8-01-size-34x16.ivf" - "av1-1-b8-01-size-34x16.ivf.md5" - "av1-1-b8-01-size-34x18.ivf" - "av1-1-b8-01-size-34x18.ivf.md5" - "av1-1-b8-01-size-34x32.ivf" - "av1-1-b8-01-size-34x32.ivf.md5" - "av1-1-b8-01-size-34x34.ivf" - "av1-1-b8-01-size-34x34.ivf.md5" - "av1-1-b8-01-size-34x64.ivf" - "av1-1-b8-01-size-34x64.ivf.md5" - "av1-1-b8-01-size-34x66.ivf" - "av1-1-b8-01-size-34x66.ivf.md5" - "av1-1-b8-01-size-64x16.ivf" - "av1-1-b8-01-size-64x16.ivf.md5" - "av1-1-b8-01-size-64x18.ivf" - "av1-1-b8-01-size-64x18.ivf.md5" - "av1-1-b8-01-size-64x32.ivf" - "av1-1-b8-01-size-64x32.ivf.md5" - "av1-1-b8-01-size-64x34.ivf" - "av1-1-b8-01-size-64x34.ivf.md5" - "av1-1-b8-01-size-64x64.ivf" - "av1-1-b8-01-size-64x64.ivf.md5" - "av1-1-b8-01-size-64x66.ivf" - "av1-1-b8-01-size-64x66.ivf.md5" - "av1-1-b8-01-size-66x16.ivf" - "av1-1-b8-01-size-66x16.ivf.md5" - "av1-1-b8-01-size-66x18.ivf" - "av1-1-b8-01-size-66x18.ivf.md5" - "av1-1-b8-01-size-66x32.ivf" - "av1-1-b8-01-size-66x32.ivf.md5" - "av1-1-b8-01-size-66x34.ivf" - "av1-1-b8-01-size-66x34.ivf.md5" - "av1-1-b8-01-size-66x64.ivf" - "av1-1-b8-01-size-66x64.ivf.md5" - "av1-1-b8-01-size-66x66.ivf" - "av1-1-b8-01-size-66x66.ivf.md5" - "av1-1-b8-02-allintra.ivf" - "av1-1-b8-02-allintra.ivf.md5" - "av1-1-b8-03-sizeup.mkv" - "av1-1-b8-03-sizeup.mkv.md5" - "av1-1-b8-03-sizedown.mkv" - "av1-1-b8-03-sizedown.mkv.md5") -endif() - -if(ENABLE_ENCODE_PERF_TESTS AND CONFIG_AV1_ENCODER) - list(APPEND AOM_TEST_DATA_FILE_NAMES "desktop_640_360_30.yuv" - "kirland_640_480_30.yuv" "macmarcomoving_640_480_30.yuv" - "macmarcostationary_640_480_30.yuv" "niklas_1280_720_30.yuv" - "tacomanarrows_640_480_30.yuv" - "tacomasmallcameramovement_640_480_30.yuv" - "thaloundeskmtg_640_480_30.yuv") -endif() - -# Parses test/test-data.sha1 and writes captured file names and checksums to -# $out_files and $out_checksums as lists. -function(make_test_data_lists test_data_file out_files out_checksums) - if(NOT test_data_file OR NOT EXISTS "${test_data_file}") - message(FATAL_ERROR "Test info file missing or empty (${test_data_file})") - endif() - - # Read $test_data_file into $files_and_checksums. $files_and_checksums becomes - # a list with an entry for each line from $test_data_file. - file(STRINGS "${test_data_file}" files_and_checksums) - - # Iterate over the list of lines and split it into $checksums and $filenames. - foreach(line ${files_and_checksums}) - string(FIND "${line}" " *" delim_pos) - - math(EXPR filename_pos "${delim_pos} + 2") - string(SUBSTRING "${line}" 0 ${delim_pos} checksum) - string(SUBSTRING "${line}" ${filename_pos} -1 filename) - - list(FIND AOM_TEST_DATA_FILE_NAMES ${filename} list_index) - if(NOT ${list_index} EQUAL -1) - - # Include the name and checksum in output only when the file is needed. - set(checksums ${checksums} ${checksum}) - set(filenames ${filenames} ${filename}) - endif() - endforeach() - - list(LENGTH filenames num_files) - list(LENGTH checksums num_checksums) - if(NOT checksums OR NOT filenames OR NOT num_files EQUAL num_checksums) - message(FATAL_ERROR "Parsing of ${test_data_file} failed.") - endif() - - set(${out_checksums} ${checksums} PARENT_SCOPE) - set(${out_files} ${filenames} PARENT_SCOPE) -endfunction() - -# Appends each file name in $test_files to $test_dir and adds the result path to -# $out_path_list. -function(expand_test_file_paths test_files test_dir out_path_list) - foreach(filename ${${test_files}}) - set(path_list ${path_list} "${test_dir}/${filename}") - endforeach() - set(${out_path_list} ${path_list} PARENT_SCOPE) -endfunction() - -function(check_file local_path expected_checksum out_needs_update) - if(EXISTS "${local_path}") - file(SHA1 "${local_path}" file_checksum) - else() - set(${out_needs_update} 1 PARENT_SCOPE) - return() - endif() - - if("${file_checksum}" STREQUAL "${expected_checksum}") - unset(${out_needs_update} PARENT_SCOPE) - else() - set(${out_needs_update} 1 PARENT_SCOPE) - return() - endif() - message("${local_path} up to date.") -endfunction() - -# Downloads data from $file_url, confirms that $file_checksum matches, and -# writes it to $local_path. -function(download_test_file file_url file_checksum local_path) - message("Downloading ${file_url} ...") - file(DOWNLOAD "${file_url}" "${local_path}" SHOW_PROGRESS - EXPECTED_HASH SHA1=${file_checksum}) - message("Download of ${file_url} complete.") -endfunction() diff --git a/third_party/aom/test/test_intra_pred_speed.cc b/third_party/aom/test/test_intra_pred_speed.cc deleted file mode 100644 index b72ac1167..000000000 --- a/third_party/aom/test/test_intra_pred_speed.cc +++ /dev/null @@ -1,1464 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -// Test and time AOM intra-predictor functions - -#include <stdio.h> -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/md5_helper.h" -#include "aom/aom_integer.h" -#include "aom_ports/mem.h" -#include "aom_ports/aom_timer.h" -#include "av1/common/common_data.h" - -// ----------------------------------------------------------------------------- - -namespace { - -// Note: -// APPLY_UNIT_TESTS -// 1: Do unit tests -// 0: Generate MD5 array as required -#define APPLY_UNIT_TESTS 1 - -typedef void (*AvxPredFunc)(uint8_t *dst, ptrdiff_t y_stride, - const uint8_t *above, const uint8_t *left); - -const int kBPS = 64; -const int kTotalPixels = kBPS * kBPS; -// 4 DC variants, V, H, PAETH, SMOOTH, SMOOTH_V, SMOOTH_H -const int kNumAv1IntraFuncs = 10; - -#if APPLY_UNIT_TESTS -const char *kAv1IntraPredNames[kNumAv1IntraFuncs] = { - "DC_PRED", "DC_LEFT_PRED", "DC_TOP_PRED", "DC_128_PRED", "V_PRED", - "H_PRED", "PAETH_PRED", "SMOOTH_PRED", "SMOOTH_V_PRED", "SMOOTH_H_PRED", -}; -#endif // APPLY_UNIT_TESTS - -template <typename Pixel> -struct IntraPredTestMem { - void Init(int block_width, int block_height, int bd) { - ASSERT_LE(block_width, kBPS); - ASSERT_LE(block_height, kBPS); - // Note: for blocks having width <= 32 and height <= 32, we generate 32x32 - // random pixels as before to avoid having to recalculate all hashes again. - const int block_size_upto_32 = (block_width <= 32) && (block_height <= 32); - stride = block_size_upto_32 ? 32 : kBPS; - num_pixels = stride * stride; - libaom_test::ACMRandom rnd(libaom_test::ACMRandom::DeterministicSeed()); - above = above_mem + 16; - const int mask = (1 << bd) - 1; - for (int i = 0; i < num_pixels; ++i) ref_src[i] = rnd.Rand16() & mask; - for (int i = 0; i < stride; ++i) left[i] = rnd.Rand16() & mask; - for (int i = -1; i < stride; ++i) above[i] = rnd.Rand16() & mask; - - for (int i = stride; i < 2 * stride; ++i) { - left[i] = rnd.Rand16() & mask; - above[i] = rnd.Rand16() & mask; - } - } - - DECLARE_ALIGNED(16, Pixel, src[kTotalPixels]); - DECLARE_ALIGNED(16, Pixel, ref_src[kTotalPixels]); - DECLARE_ALIGNED(16, Pixel, left[2 * kBPS]); - Pixel *above; - int stride; - int num_pixels; - - private: - DECLARE_ALIGNED(16, Pixel, above_mem[2 * kBPS + 16]); -}; - -// ----------------------------------------------------------------------------- -// Low Bittdepth - -typedef IntraPredTestMem<uint8_t> Av1IntraPredTestMem; - -static const char *const kTxSizeStrings[TX_SIZES_ALL] = { - "4X4", "8X8", "16X16", "32X32", "64X64", "4X8", "8X4", - "8X16", "16X8", "16X32", "32X16", "32X64", "64X32", "4X16", - "16X4", "8X32", "32X8", "16X64", "64X16", -}; - -void CheckMd5Signature(TX_SIZE tx_size, bool is_hbd, - const char *const signatures[], const void *data, - size_t data_size, int elapsed_time, int idx) { - const std::string hbd_str = is_hbd ? "Hbd " : ""; - const std::string name_str = hbd_str + "Intra" + kTxSizeStrings[tx_size]; - libaom_test::MD5 md5; - md5.Add(reinterpret_cast<const uint8_t *>(data), data_size); -#if APPLY_UNIT_TESTS - printf("Mode %s[%13s]: %5d ms MD5: %s\n", name_str.c_str(), - kAv1IntraPredNames[idx], elapsed_time, md5.Get()); - EXPECT_STREQ(signatures[idx], md5.Get()); -#else - (void)signatures; - (void)elapsed_time; - (void)idx; - printf("\"%s\",\n", md5.Get()); -#endif -} - -void TestIntraPred(TX_SIZE tx_size, AvxPredFunc const *pred_funcs, - const char *const signatures[]) { - const int block_width = tx_size_wide[tx_size]; - const int block_height = tx_size_high[tx_size]; - const int num_pixels_per_test = - block_width * block_height * kNumAv1IntraFuncs; - const int kNumTests = static_cast<int>(2.e10 / num_pixels_per_test); - Av1IntraPredTestMem intra_pred_test_mem; - intra_pred_test_mem.Init(block_width, block_height, 8); - - for (int k = 0; k < kNumAv1IntraFuncs; ++k) { - if (pred_funcs[k] == NULL) continue; - memcpy(intra_pred_test_mem.src, intra_pred_test_mem.ref_src, - sizeof(intra_pred_test_mem.src)); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int num_tests = 0; num_tests < kNumTests; ++num_tests) { - pred_funcs[k](intra_pred_test_mem.src, intra_pred_test_mem.stride, - intra_pred_test_mem.above, intra_pred_test_mem.left); - } - libaom_test::ClearSystemState(); - aom_usec_timer_mark(&timer); - const int elapsed_time = - static_cast<int>(aom_usec_timer_elapsed(&timer) / 1000); - CheckMd5Signature( - tx_size, false, signatures, intra_pred_test_mem.src, - intra_pred_test_mem.num_pixels * sizeof(*intra_pred_test_mem.src), - elapsed_time, k); - } -} - -static const char *const kSignatures[TX_SIZES_ALL][kNumAv1IntraFuncs] = { - { - // 4X4 - "e7ed7353c3383fff942e500e9bfe82fe", - "2a4a26fcc6ce005eadc08354d196c8a9", - "269d92eff86f315d9c38fe7640d85b15", - "ae2960eea9f71ee3dabe08b282ec1773", - "6c1abcc44e90148998b51acd11144e9c", - "f7bb3186e1ef8a2b326037ff898cad8e", - "59fc0e923a08cfac0a493fb38988e2bb", - "9ff8bb37d9c830e6ab8ecb0c435d3c91", - "de6937fca02354f2874dbc5dbec5d5b3", - "723cf948137f7d8c7860d814e55ae67d", - }, - { - // 8X8 - "d8bbae5d6547cfc17e4f5f44c8730e88", - "373bab6d931868d41a601d9d88ce9ac3", - "6fdd5ff4ff79656c14747598ca9e3706", - "d9661c2811d6a73674f40ffb2b841847", - "7c722d10b19ccff0b8c171868e747385", - "f81dd986eb2b50f750d3a7da716b7e27", - "064404361748dd111a890a1470d7f0ea", - "dc29b7e1f78cc8e7525d5ea4c0ab9b78", - "97111eb1bc26bade6272015df829f1ae", - "d19a8a73cc46b807f2c5e817576cc1e1", - }, - { - // 16X16 - "50971c07ce26977d30298538fffec619", - "527a6b9e0dc5b21b98cf276305432bef", - "7eff2868f80ebc2c43a4f367281d80f7", - "67cd60512b54964ef6aff1bd4816d922", - "48371c87dc95c08a33b2048f89cf6468", - "b0acf2872ee411d7530af6d2625a7084", - "93d6b5352b571805ab16a55e1bbed86a", - "03764e4c0aebbc180e4e2c68fb06df2b", - "bb6c74c9076c9f266ab11fb57060d8e6", - "0c5162bc28489756ddb847b5678e6f07", - }, - { - // 32X32 - "a0a618c900e65ae521ccc8af789729f2", - "985aaa7c72b4a6c2fb431d32100cf13a", - "10662d09febc3ca13ee4e700120daeb5", - "b3b01379ba08916ef6b1b35f7d9ad51c", - "9f4261755795af97e34679c333ec7004", - "bc2c9da91ad97ef0d1610fb0a9041657", - "ef1653982b69e1f64bee3759f3e1ec45", - "1a51a675deba2c83282142eb48d3dc3d", - "866c224746dc260cda861a7b1b383fb3", - "cea23799fc3526e1b6a6ff02b42b82af", - }, - { - // 64X64 - "6e1094fa7b50bc813aa2ba29f5df8755", - "afe020786b83b793c2bbd9468097ff6e", - "be91585259bc37bf4dc1651936e90b3e", - "a1650dbcd56e10288c3e269eca37967d", - "9e5c34f3797e0cdd3cd9d4c05b0d8950", - "bc87be7ac899cc6a28f399d7516c49fe", - "9811fd0d2dd515f06122f5d1bd18b784", - "3c140e466f2c2c0d9cb7d2157ab8dc27", - "9543de76c925a8f6adc884cc7f98dc91", - "df1df0376cc944afe7e74e94f53e575a", - }, - { - // 4X8 - "d9fbebdc85f71ab1e18461b2db4a2adc", - "5ccb2a68284bc9714d94b8a06ccadbb2", - "735d059abc2744f3ff3f9590f7191b37", - "d9fbebdc85f71ab1e18461b2db4a2adc", - "6819497c44cd0ace120add83672996ee", - "7e3244f5a2d3edf81c7e962a842b97f9", - "809350f164cd4d1650850bb0f59c3260", - "1b60a394331eeab6927a6f8aaff57040", - "5307de1bd7329ba6b281d2c1b0b457f9", - "24c58a8138339846d95568efb91751db", - }, - { - // 8X4 - "23f9fc11344426c9bee2e06d57dfd628", - "2d71a26d1bae1fb34734de7b42fc5eb7", - "5af9c1b2fd9d5721fad67b67b3f7c816", - "00d71b17be662753813d515f197d145e", - "bef10ec984427e28f4390f43809d10af", - "77773cdfb7ed6bc882ab202a64b0a470", - "2cc48bd66d6b0121b5221d52ccd732af", - "b302155e1c9eeeafe2ba2bf68e807a46", - "561bc8d0e76d5041ebd5168fc6a115e1", - "81d0113fb1d0a9a24ffd6f1987b77948", - }, - { - // 8X16 - "c849de88b24f773dfcdd1d48d1209796", - "6cb807c1897b94866a0f3d3c56ed8695", - "d56db05a8ac7981762f5b877f486c4ef", - "b4bc01eb6e59a40922ad17715cafb04b", - "09d178439534f4062ae687c351f66d64", - "644501399cf73080ac606e5cef7ca09b", - "278076495180e17c065a95ab7278539a", - "9dd7f324816f242be408ffeb0c673732", - "f520c4a20acfa0bea1d253c6f0f040fd", - "85f38df809df2c2d7c8b4a157a65cd44", - }, - { - // 16X8 - "b4cbdbdf10ce13300b4063a3daf99e04", - "3731e1e6202064a9d0604d7c293ecee4", - "6c856188c4256a06452f0d5d70cac436", - "1f2192b4c8c497589484ea7bf9c944e8", - "84011bd4b7f565119d06787840e333a0", - "0e48949f7a6aa36f0d76b5d01f91124a", - "60eff8064634b6c73b10681356baeee9", - "1559aeb081a9c0c71111d6093c2ff9fd", - "c15479b739713773e5cabb748451987b", - "72e33ec12c9b67aea26d8d005fb82de2", - }, - { - // 16X32 - "abe5233d189cdbf79424721571bbaa7b", - "282759f81e3cfb2e2d396fe406b72a8b", - "e2224926c264f6f174cbc3167a233168", - "6814e85c2b33f8c9415d62e80394b47b", - "99cbbb60459c08a3061d72c4e4f6276a", - "1d1567d40b8e816f8c1f71e576fe0f87", - "36fdd371b624a075814d497c4832ec85", - "8ab8da61b727442b6ff692b40d0df018", - "e35a10ad7fdf2327e821504a90f6a6eb", - "1f7211e727dc1de7d6a55d082fbdd821", - }, - { - // 32X16 - "d1aeb8d5fdcfd3307922af01a798a4dc", - "b0bcb514ebfbee065faea9d34c12ae75", - "d6a18c63b4e909871c0137ca652fad23", - "fd047f2fc1b8ffb95d0eeef3e8796a45", - "645ab60779ea348fd93c81561c31bab9", - "4409633c9db8dff41ade4292a3a56e7f", - "5e36a11e069b31c2a739f3a9c7b37c24", - "e83b9483d702cfae496991c3c7fa92c0", - "12f6ddf98c7f30a277307f1ea935b030", - "354321d6c32bbdb0739e4fa2acbf41e1", - }, - { - // 32X64 - "0ce332b343934b34cd4417725faa85cb", - "4e2a2cfd8f56f15939bdfc753145b303", - "0f46d124ba9f48cdd5d5290acf786d6d", - "e1e8ed803236367821981500a3d9eebe", - "1d2f8e48e3adb7c448be05d9f66f4954", - "9fb2e176636a5689b26f73ca73fcc512", - "e720ebccae7e25e36f23da53ae5b5d6a", - "86fe4364734169aaa4520d799890d530", - "b1870290764bb1b100d1974e2bd70f1d", - "ce5b238e19d85ef69d85badfab4e63ae", - }, - { - // 64X32 - "a6c5aeb722615089efbca80b02951ceb", - "538424b24bd0830f21788e7238ca762f", - "80c15b303235f9bc2259027bb92dfdc4", - "e48e1ac15e97191a8fda08d62fff343e", - "12604b37875533665078405ef4582e35", - "0048afa17bd3e1632d68b96048836530", - "07a0cfcb56a5eed50c4bd6c26814336b", - "529d8a070de5bc6531fa3ee8f450c233", - "33c50a11c7d78f72434064f634305e95", - "e0ef7f0559c1a50ec5a8c12011b962f7", - }, - { - // 4X16 - "750491056568eb8fe15387b86bdf06b8", - "3a52dae9f599f08cfb3bd1b910dc0e11", - "af79f71e3e03dbeca44e2e13561f70c7", - "ca7dfd7624afc0c06fb5552f44398535", - "b591af115444bf43140c29c269f68fb2", - "483d942ae36e69e62f31eb215331416f", - "f14b58525e81870bc5d95c7ac71a347f", - "371208bb4027d9badb04095d1590bbc4", - "c7049c21b2924d70c7c12784d6b6b796", - "7d87233f4b5b0f12086045e5d7b2d4c2", - }, - { - // 16X4 - "7c6e325a65e77e732b3adbe237e045e4", - "24478f93ffcec47852e004d0fe948464", - "258d042c67d4ba3ecfa667f0adc9aebf", - "b2cd21d06959f159a1f3c4d9768ee7fb", - "b4e1f38157bf8410e7c3da02f687a343", - "869e703729eb0fc0711c254944ff5d5a", - "9638dd77105a640b146a8201ea7a0801", - "919d932c6af8a1cc7486e8ce996dd487", - "e1c9be493b6714c7ae48f30044c43140", - "bf0fe3889d654b2f6eb98c8fc751f9e4", - }, - { - // 8X32 - "8dfac4319fe0bd40013ffb3102da8c72", - "feb46b6dc4e2ca0a09533bfc51d4dcb0", - "850837ec714c37262216527aaf4cbbe9", - "4603c7800fb08361f163daca876e8bda", - "1ff95e7d2debc27b05806fb25abfd624", - "d81b9a51a062b23ca7823804cb7bec22", - "f1d8978158766f46335203608cb807e7", - "f3527096256258c0878d644a9d7d53ca", - "cbde98ac8b009953eb112807ad2ea29e", - "654fb1153415747feae599f538122af5", - }, - { - // 32X8 - "3d4ee16fab374357474f60b845327bc7", - "bc17c5059473a476df4e85f56395ad55", - "3d4ee16fab374357474f60b845327bc7", - "c14b8db34dc2355b84e3735c9ba16c7f", - "a71d25b5d47a92a8b9223c98f18458ee", - "6c1cfe2b1893f4576a80675687cb6426", - "92d11bbef8b85bb48d799bb055de3514", - "bcf81d1db8ae5cc03360467f44f498ec", - "79f8c564163555592e808e145eaf5c60", - "46fff139cef2ef773938bcc8b0e5abb8", - }, - { - // 16X64 - "3b2a053ee8b05a8ac35ad23b0422a151", - "12b0c69595328c465e0b25e0c9e3e9fc", - "f77c544ac8035e01920deae40cee7b07", - "727797ef15ccd8d325476fe8f12006a3", - "f3be77c0fe67eb5d9d515e92bec21eb7", - "f1ece6409e01e9dd98b800d49628247d", - "efd2ec9bfbbd4fd1f6604ea369df1894", - "ec703de918422b9e03197ba0ed60a199", - "739418efb89c07f700895deaa5d0b3e3", - "9943ae1bbeeebfe1d3a92dc39e049d63", - }, - { - // 64X16 - "821b76b1494d4f84d20817840f719a1a", - "69e462c3338a9aaf993c3f7cfbc15649", - "516d8f6eb054d74d150e7b444185b6b9", - "de1b736e9d99129609d6ef3a491507a0", - "fd9b4276e7affe1e0e4ce4f428058994", - "cd82fd361a4767ac29a9f406b480b8f3", - "2792c2f810157a4a6cb13c28529ff779", - "1220442d90c4255ba0969d28b91e93a6", - "c7253e10b45f7f67dfee3256c9b94825", - "879792198071c7e0b50b9b5010d8c18f", - }, -}; - -} // namespace - -// Defines a test case for |arch| (e.g., C, SSE2, ...) passing the predictors -// to TestIntraPred. The test name is 'arch.TestIntraPred_tx_size', e.g., -// C.TestIntraPred.0 -#define INTRA_PRED_TEST(arch, tx_size, dc, dc_left, dc_top, dc_128, v, h, \ - paeth, smooth, smooth_v, smooth_h) \ - TEST(arch, DISABLED_##TestIntraPred_##tx_size) { \ - static const AvxPredFunc aom_intra_pred[] = { \ - dc, dc_left, dc_top, dc_128, v, h, paeth, smooth, smooth_v, smooth_h \ - }; \ - TestIntraPred(tx_size, aom_intra_pred, kSignatures[tx_size]); \ - } - -// ----------------------------------------------------------------------------- -// 4x4, 4x8, 4x16 - -INTRA_PRED_TEST(C_1, TX_4X4, aom_dc_predictor_4x4_c, - aom_dc_left_predictor_4x4_c, aom_dc_top_predictor_4x4_c, - aom_dc_128_predictor_4x4_c, aom_v_predictor_4x4_c, - aom_h_predictor_4x4_c, aom_paeth_predictor_4x4_c, - aom_smooth_predictor_4x4_c, aom_smooth_v_predictor_4x4_c, - aom_smooth_h_predictor_4x4_c) - -INTRA_PRED_TEST(C_2, TX_4X8, aom_dc_predictor_4x8_c, - aom_dc_left_predictor_4x8_c, aom_dc_top_predictor_4x8_c, - aom_dc_128_predictor_4x8_c, aom_v_predictor_4x8_c, - aom_h_predictor_4x8_c, aom_paeth_predictor_4x8_c, - aom_smooth_predictor_4x8_c, aom_smooth_v_predictor_4x8_c, - aom_smooth_h_predictor_4x8_c) - -INTRA_PRED_TEST(C_3, TX_4X16, aom_dc_predictor_4x16_c, - aom_dc_left_predictor_4x16_c, aom_dc_top_predictor_4x16_c, - aom_dc_128_predictor_4x16_c, aom_v_predictor_4x16_c, - aom_h_predictor_4x16_c, aom_paeth_predictor_4x16_c, - aom_smooth_predictor_4x16_c, aom_smooth_v_predictor_4x16_c, - aom_smooth_h_predictor_4x16_c) - -#if HAVE_SSE2 -INTRA_PRED_TEST(SSE2_1, TX_4X4, aom_dc_predictor_4x4_sse2, - aom_dc_left_predictor_4x4_sse2, aom_dc_top_predictor_4x4_sse2, - aom_dc_128_predictor_4x4_sse2, aom_v_predictor_4x4_sse2, - aom_h_predictor_4x4_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_2, TX_4X8, aom_dc_predictor_4x8_sse2, - aom_dc_left_predictor_4x8_sse2, aom_dc_top_predictor_4x8_sse2, - aom_dc_128_predictor_4x8_sse2, aom_v_predictor_4x8_sse2, - aom_h_predictor_4x8_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_3, TX_4X16, aom_dc_predictor_4x16_sse2, - aom_dc_left_predictor_4x16_sse2, aom_dc_top_predictor_4x16_sse2, - aom_dc_128_predictor_4x16_sse2, aom_v_predictor_4x16_sse2, - aom_h_predictor_4x16_sse2, NULL, NULL, NULL, NULL) -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -INTRA_PRED_TEST(SSSE3_1, TX_4X4, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_4x4_ssse3, aom_smooth_predictor_4x4_ssse3, - aom_smooth_v_predictor_4x4_ssse3, - aom_smooth_h_predictor_4x4_ssse3) -INTRA_PRED_TEST(SSSE3_2, TX_4X8, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_4x8_ssse3, aom_smooth_predictor_4x8_ssse3, - aom_smooth_v_predictor_4x8_ssse3, - aom_smooth_h_predictor_4x8_ssse3) -INTRA_PRED_TEST(SSSE3_3, TX_4X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_4x16_ssse3, aom_smooth_predictor_4x16_ssse3, - aom_smooth_v_predictor_4x16_ssse3, - aom_smooth_h_predictor_4x16_ssse3) -#endif // HAVE_SSSE3 - -#if HAVE_DSPR2 -INTRA_PRED_TEST(DSPR2, TX_4X4, aom_dc_predictor_4x4_dspr2, NULL, NULL, NULL, - NULL, aom_h_predictor_4x4_dspr2, NULL, NULL, NULL, NULL) -#endif // HAVE_DSPR2 - -#if HAVE_NEON -INTRA_PRED_TEST(NEON, TX_4X4, aom_dc_predictor_4x4_neon, - aom_dc_left_predictor_4x4_neon, aom_dc_top_predictor_4x4_neon, - aom_dc_128_predictor_4x4_neon, aom_v_predictor_4x4_neon, - aom_h_predictor_4x4_neon, NULL, NULL, NULL, NULL) -#endif // HAVE_NEON - -#if HAVE_MSA -INTRA_PRED_TEST(MSA, TX_4X4, aom_dc_predictor_4x4_msa, - aom_dc_left_predictor_4x4_msa, aom_dc_top_predictor_4x4_msa, - aom_dc_128_predictor_4x4_msa, aom_v_predictor_4x4_msa, - aom_h_predictor_4x4_msa, NULL, NULL, NULL, NULL) -#endif // HAVE_MSA - -// ----------------------------------------------------------------------------- -// 8x8, 8x4, 8x16, 8x32 - -INTRA_PRED_TEST(C_1, TX_8X8, aom_dc_predictor_8x8_c, - aom_dc_left_predictor_8x8_c, aom_dc_top_predictor_8x8_c, - aom_dc_128_predictor_8x8_c, aom_v_predictor_8x8_c, - aom_h_predictor_8x8_c, aom_paeth_predictor_8x8_c, - aom_smooth_predictor_8x8_c, aom_smooth_v_predictor_8x8_c, - aom_smooth_h_predictor_8x8_c) - -INTRA_PRED_TEST(C_2, TX_8X4, aom_dc_predictor_8x4_c, - aom_dc_left_predictor_8x4_c, aom_dc_top_predictor_8x4_c, - aom_dc_128_predictor_8x4_c, aom_v_predictor_8x4_c, - aom_h_predictor_8x4_c, aom_paeth_predictor_8x4_c, - aom_smooth_predictor_8x4_c, aom_smooth_v_predictor_8x4_c, - aom_smooth_h_predictor_8x4_c) - -INTRA_PRED_TEST(C_3, TX_8X16, aom_dc_predictor_8x16_c, - aom_dc_left_predictor_8x16_c, aom_dc_top_predictor_8x16_c, - aom_dc_128_predictor_8x16_c, aom_v_predictor_8x16_c, - aom_h_predictor_8x16_c, aom_paeth_predictor_8x16_c, - aom_smooth_predictor_8x16_c, aom_smooth_v_predictor_8x16_c, - aom_smooth_h_predictor_8x16_c) - -INTRA_PRED_TEST(C_4, TX_8X32, aom_dc_predictor_8x32_c, - aom_dc_left_predictor_8x32_c, aom_dc_top_predictor_8x32_c, - aom_dc_128_predictor_8x32_c, aom_v_predictor_8x32_c, - aom_h_predictor_8x32_c, aom_paeth_predictor_8x32_c, - aom_smooth_predictor_8x32_c, aom_smooth_v_predictor_8x32_c, - aom_smooth_h_predictor_8x32_c) - -#if HAVE_SSE2 -INTRA_PRED_TEST(SSE2_1, TX_8X8, aom_dc_predictor_8x8_sse2, - aom_dc_left_predictor_8x8_sse2, aom_dc_top_predictor_8x8_sse2, - aom_dc_128_predictor_8x8_sse2, aom_v_predictor_8x8_sse2, - aom_h_predictor_8x8_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_2, TX_8X4, aom_dc_predictor_8x4_sse2, - aom_dc_left_predictor_8x4_sse2, aom_dc_top_predictor_8x4_sse2, - aom_dc_128_predictor_8x4_sse2, aom_v_predictor_8x4_sse2, - aom_h_predictor_8x4_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_3, TX_8X16, aom_dc_predictor_8x16_sse2, - aom_dc_left_predictor_8x16_sse2, aom_dc_top_predictor_8x16_sse2, - aom_dc_128_predictor_8x16_sse2, aom_v_predictor_8x16_sse2, - aom_h_predictor_8x16_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_4, TX_8X32, aom_dc_predictor_8x32_sse2, - aom_dc_left_predictor_8x32_sse2, aom_dc_top_predictor_8x32_sse2, - aom_dc_128_predictor_8x32_sse2, aom_v_predictor_8x32_sse2, - aom_h_predictor_8x32_sse2, NULL, NULL, NULL, NULL) -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -INTRA_PRED_TEST(SSSE3_1, TX_8X8, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_8x8_ssse3, aom_smooth_predictor_8x8_ssse3, - aom_smooth_v_predictor_8x8_ssse3, - aom_smooth_h_predictor_8x8_ssse3) -INTRA_PRED_TEST(SSSE3_2, TX_8X4, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_8x4_ssse3, aom_smooth_predictor_8x4_ssse3, - aom_smooth_v_predictor_8x4_ssse3, - aom_smooth_h_predictor_8x4_ssse3) -INTRA_PRED_TEST(SSSE3_3, TX_8X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_8x16_ssse3, aom_smooth_predictor_8x16_ssse3, - aom_smooth_v_predictor_8x16_ssse3, - aom_smooth_h_predictor_8x16_ssse3) -INTRA_PRED_TEST(SSSE3_4, TX_8X32, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_8x32_ssse3, aom_smooth_predictor_8x32_ssse3, - aom_smooth_v_predictor_8x32_ssse3, - aom_smooth_h_predictor_8x32_ssse3) -#endif // HAVE_SSSE3 - -#if HAVE_DSPR2 -INTRA_PRED_TEST(DSPR2, TX_8X8, aom_dc_predictor_8x8_dspr2, NULL, NULL, NULL, - NULL, aom_h_predictor_8x8_dspr2, NULL, NULL, NULL, NULL) -#endif // HAVE_DSPR2 - -#if HAVE_NEON -INTRA_PRED_TEST(NEON, TX_8X8, aom_dc_predictor_8x8_neon, - aom_dc_left_predictor_8x8_neon, aom_dc_top_predictor_8x8_neon, - aom_dc_128_predictor_8x8_neon, aom_v_predictor_8x8_neon, - aom_h_predictor_8x8_neon, NULL, NULL, NULL, NULL) -#endif // HAVE_NEON - -#if HAVE_MSA -INTRA_PRED_TEST(MSA, TX_8X8, aom_dc_predictor_8x8_msa, - aom_dc_left_predictor_8x8_msa, aom_dc_top_predictor_8x8_msa, - aom_dc_128_predictor_8x8_msa, aom_v_predictor_8x8_msa, - aom_h_predictor_8x8_msa, NULL, NULL, NULL, NULL) -#endif // HAVE_MSA - -// ----------------------------------------------------------------------------- -// 16x16, 16x8, 16x32, 16x4, 16x64 - -INTRA_PRED_TEST(C_1, TX_16X16, aom_dc_predictor_16x16_c, - aom_dc_left_predictor_16x16_c, aom_dc_top_predictor_16x16_c, - aom_dc_128_predictor_16x16_c, aom_v_predictor_16x16_c, - aom_h_predictor_16x16_c, aom_paeth_predictor_16x16_c, - aom_smooth_predictor_16x16_c, aom_smooth_v_predictor_16x16_c, - aom_smooth_h_predictor_16x16_c) - -INTRA_PRED_TEST(C_2, TX_16X8, aom_dc_predictor_16x8_c, - aom_dc_left_predictor_16x8_c, aom_dc_top_predictor_16x8_c, - aom_dc_128_predictor_16x8_c, aom_v_predictor_16x8_c, - aom_h_predictor_16x8_c, aom_paeth_predictor_16x8_c, - aom_smooth_predictor_16x8_c, aom_smooth_v_predictor_16x8_c, - aom_smooth_h_predictor_16x8_c) - -INTRA_PRED_TEST(C_3, TX_16X32, aom_dc_predictor_16x32_c, - aom_dc_left_predictor_16x32_c, aom_dc_top_predictor_16x32_c, - aom_dc_128_predictor_16x32_c, aom_v_predictor_16x32_c, - aom_h_predictor_16x32_c, aom_paeth_predictor_16x32_c, - aom_smooth_predictor_16x32_c, aom_smooth_v_predictor_16x32_c, - aom_smooth_h_predictor_16x32_c) - -INTRA_PRED_TEST(C_4, TX_16X4, aom_dc_predictor_16x4_c, - aom_dc_left_predictor_16x4_c, aom_dc_top_predictor_16x4_c, - aom_dc_128_predictor_16x4_c, aom_v_predictor_16x4_c, - aom_h_predictor_16x4_c, aom_paeth_predictor_16x4_c, - aom_smooth_predictor_16x4_c, aom_smooth_v_predictor_16x4_c, - aom_smooth_h_predictor_16x4_c) - -INTRA_PRED_TEST(C_5, TX_16X64, aom_dc_predictor_16x64_c, - aom_dc_left_predictor_16x64_c, aom_dc_top_predictor_16x64_c, - aom_dc_128_predictor_16x64_c, aom_v_predictor_16x64_c, - aom_h_predictor_16x64_c, aom_paeth_predictor_16x64_c, - aom_smooth_predictor_16x64_c, aom_smooth_v_predictor_16x64_c, - aom_smooth_h_predictor_16x64_c) - -#if HAVE_SSE2 -INTRA_PRED_TEST(SSE2_1, TX_16X16, aom_dc_predictor_16x16_sse2, - aom_dc_left_predictor_16x16_sse2, - aom_dc_top_predictor_16x16_sse2, - aom_dc_128_predictor_16x16_sse2, aom_v_predictor_16x16_sse2, - aom_h_predictor_16x16_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_2, TX_16X8, aom_dc_predictor_16x8_sse2, - aom_dc_left_predictor_16x8_sse2, aom_dc_top_predictor_16x8_sse2, - aom_dc_128_predictor_16x8_sse2, aom_v_predictor_16x8_sse2, - aom_h_predictor_16x8_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_3, TX_16X32, aom_dc_predictor_16x32_sse2, - aom_dc_left_predictor_16x32_sse2, - aom_dc_top_predictor_16x32_sse2, - aom_dc_128_predictor_16x32_sse2, aom_v_predictor_16x32_sse2, - aom_h_predictor_16x32_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_4, TX_16X64, aom_dc_predictor_16x64_sse2, - aom_dc_left_predictor_16x64_sse2, - aom_dc_top_predictor_16x64_sse2, - aom_dc_128_predictor_16x64_sse2, aom_v_predictor_16x64_sse2, - aom_h_predictor_16x64_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_5, TX_16X4, aom_dc_predictor_16x4_sse2, - aom_dc_left_predictor_16x4_sse2, aom_dc_top_predictor_16x4_sse2, - aom_dc_128_predictor_16x4_sse2, aom_v_predictor_16x4_sse2, - aom_h_predictor_16x4_sse2, NULL, NULL, NULL, NULL) -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -INTRA_PRED_TEST(SSSE3_1, TX_16X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x16_ssse3, - aom_smooth_predictor_16x16_ssse3, - aom_smooth_v_predictor_16x16_ssse3, - aom_smooth_h_predictor_16x16_ssse3) -INTRA_PRED_TEST(SSSE3_2, TX_16X8, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x8_ssse3, aom_smooth_predictor_16x8_ssse3, - aom_smooth_v_predictor_16x8_ssse3, - aom_smooth_h_predictor_16x8_ssse3) -INTRA_PRED_TEST(SSSE3_3, TX_16X32, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x32_ssse3, - aom_smooth_predictor_16x32_ssse3, - aom_smooth_v_predictor_16x32_ssse3, - aom_smooth_h_predictor_16x32_ssse3) -INTRA_PRED_TEST(SSSE3_4, TX_16X64, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x64_ssse3, - aom_smooth_predictor_16x64_ssse3, - aom_smooth_v_predictor_16x64_ssse3, - aom_smooth_h_predictor_16x64_ssse3) -INTRA_PRED_TEST(SSSE3_5, TX_16X4, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x4_ssse3, aom_smooth_predictor_16x4_ssse3, - aom_smooth_v_predictor_16x4_ssse3, - aom_smooth_h_predictor_16x4_ssse3) -#endif // HAVE_SSSE3 - -#if HAVE_AVX2 -INTRA_PRED_TEST(AVX2_1, TX_16X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x16_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_2, TX_16X8, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x8_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_3, TX_16X32, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x32_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_4, TX_16X64, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_16x64_avx2, NULL, NULL, NULL) -#endif // HAVE_AVX2 - -#if HAVE_DSPR2 -INTRA_PRED_TEST(DSPR2, TX_16X16, aom_dc_predictor_16x16_dspr2, NULL, NULL, NULL, - NULL, aom_h_predictor_16x16_dspr2, NULL, NULL, NULL, NULL) -#endif // HAVE_DSPR2 - -#if HAVE_NEON -INTRA_PRED_TEST(NEON, TX_16X16, aom_dc_predictor_16x16_neon, - aom_dc_left_predictor_16x16_neon, - aom_dc_top_predictor_16x16_neon, - aom_dc_128_predictor_16x16_neon, aom_v_predictor_16x16_neon, - aom_h_predictor_16x16_neon, NULL, NULL, NULL, NULL) -#endif // HAVE_NEON - -#if HAVE_MSA -INTRA_PRED_TEST(MSA, TX_16X16, aom_dc_predictor_16x16_msa, - aom_dc_left_predictor_16x16_msa, aom_dc_top_predictor_16x16_msa, - aom_dc_128_predictor_16x16_msa, aom_v_predictor_16x16_msa, - aom_h_predictor_16x16_msa, NULL, NULL, NULL, NULL) -#endif // HAVE_MSA - -// ----------------------------------------------------------------------------- -// 32x32, 32x16, 32x64, 32x8 - -INTRA_PRED_TEST(C_1, TX_32X32, aom_dc_predictor_32x32_c, - aom_dc_left_predictor_32x32_c, aom_dc_top_predictor_32x32_c, - aom_dc_128_predictor_32x32_c, aom_v_predictor_32x32_c, - aom_h_predictor_32x32_c, aom_paeth_predictor_32x32_c, - aom_smooth_predictor_32x32_c, aom_smooth_v_predictor_32x32_c, - aom_smooth_h_predictor_32x32_c) - -INTRA_PRED_TEST(C_2, TX_32X16, aom_dc_predictor_32x16_c, - aom_dc_left_predictor_32x16_c, aom_dc_top_predictor_32x16_c, - aom_dc_128_predictor_32x16_c, aom_v_predictor_32x16_c, - aom_h_predictor_32x16_c, aom_paeth_predictor_32x16_c, - aom_smooth_predictor_32x16_c, aom_smooth_v_predictor_32x16_c, - aom_smooth_h_predictor_32x16_c) - -INTRA_PRED_TEST(C_3, TX_32X64, aom_dc_predictor_32x64_c, - aom_dc_left_predictor_32x64_c, aom_dc_top_predictor_32x64_c, - aom_dc_128_predictor_32x64_c, aom_v_predictor_32x64_c, - aom_h_predictor_32x64_c, aom_paeth_predictor_32x64_c, - aom_smooth_predictor_32x64_c, aom_smooth_v_predictor_32x64_c, - aom_smooth_h_predictor_32x64_c) - -INTRA_PRED_TEST(C_4, TX_32X8, aom_dc_predictor_32x8_c, - aom_dc_left_predictor_32x8_c, aom_dc_top_predictor_32x8_c, - aom_dc_128_predictor_32x8_c, aom_v_predictor_32x8_c, - aom_h_predictor_32x8_c, aom_paeth_predictor_32x8_c, - aom_smooth_predictor_32x8_c, aom_smooth_v_predictor_32x8_c, - aom_smooth_h_predictor_32x8_c) - -#if HAVE_SSE2 -INTRA_PRED_TEST(SSE2_1, TX_32X32, aom_dc_predictor_32x32_sse2, - aom_dc_left_predictor_32x32_sse2, - aom_dc_top_predictor_32x32_sse2, - aom_dc_128_predictor_32x32_sse2, aom_v_predictor_32x32_sse2, - aom_h_predictor_32x32_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_2, TX_32X16, aom_dc_predictor_32x16_sse2, - aom_dc_left_predictor_32x16_sse2, - aom_dc_top_predictor_32x16_sse2, - aom_dc_128_predictor_32x16_sse2, aom_v_predictor_32x16_sse2, - aom_h_predictor_32x16_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_3, TX_32X64, aom_dc_predictor_32x64_sse2, - aom_dc_left_predictor_32x64_sse2, - aom_dc_top_predictor_32x64_sse2, - aom_dc_128_predictor_32x64_sse2, aom_v_predictor_32x64_sse2, - aom_h_predictor_32x64_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_4, TX_32X8, aom_dc_predictor_32x8_sse2, - aom_dc_left_predictor_32x8_sse2, aom_dc_top_predictor_32x8_sse2, - aom_dc_128_predictor_32x8_sse2, aom_v_predictor_32x8_sse2, - aom_h_predictor_32x8_sse2, NULL, NULL, NULL, NULL) -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -INTRA_PRED_TEST(SSSE3_1, TX_32X32, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_32x32_ssse3, - aom_smooth_predictor_32x32_ssse3, - aom_smooth_v_predictor_32x32_ssse3, - aom_smooth_h_predictor_32x32_ssse3) -INTRA_PRED_TEST(SSSE3_2, TX_32X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_32x16_ssse3, - aom_smooth_predictor_32x16_ssse3, - aom_smooth_v_predictor_32x16_ssse3, - aom_smooth_h_predictor_32x16_ssse3) -INTRA_PRED_TEST(SSSE3_3, TX_32X64, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_32x64_ssse3, - aom_smooth_predictor_32x64_ssse3, - aom_smooth_v_predictor_32x64_ssse3, - aom_smooth_h_predictor_32x64_ssse3) -INTRA_PRED_TEST(SSSE3_4, TX_32X8, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_32x8_ssse3, aom_smooth_predictor_32x8_ssse3, - aom_smooth_v_predictor_32x8_ssse3, - aom_smooth_h_predictor_32x8_ssse3) -#endif // HAVE_SSSE3 - -#if HAVE_AVX2 -INTRA_PRED_TEST(AVX2_1, TX_32X32, aom_dc_predictor_32x32_avx2, - aom_dc_left_predictor_32x32_avx2, - aom_dc_top_predictor_32x32_avx2, - aom_dc_128_predictor_32x32_avx2, aom_v_predictor_32x32_avx2, - aom_h_predictor_32x32_avx2, aom_paeth_predictor_32x32_avx2, - NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_2, TX_32X16, aom_dc_predictor_32x16_avx2, - aom_dc_left_predictor_32x16_avx2, - aom_dc_top_predictor_32x16_avx2, - aom_dc_128_predictor_32x16_avx2, aom_v_predictor_32x16_avx2, - NULL, aom_paeth_predictor_32x16_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_3, TX_32X64, aom_dc_predictor_32x64_avx2, - aom_dc_left_predictor_32x64_avx2, - aom_dc_top_predictor_32x64_avx2, - aom_dc_128_predictor_32x64_avx2, aom_v_predictor_32x64_avx2, - NULL, aom_paeth_predictor_32x64_avx2, NULL, NULL, NULL) -#endif // HAVE_AVX2 - -#if HAVE_NEON -INTRA_PRED_TEST(NEON, TX_32X32, aom_dc_predictor_32x32_neon, - aom_dc_left_predictor_32x32_neon, - aom_dc_top_predictor_32x32_neon, - aom_dc_128_predictor_32x32_neon, aom_v_predictor_32x32_neon, - aom_h_predictor_32x32_neon, NULL, NULL, NULL, NULL) -#endif // HAVE_NEON - -#if HAVE_MSA -INTRA_PRED_TEST(MSA, TX_32X32, aom_dc_predictor_32x32_msa, - aom_dc_left_predictor_32x32_msa, aom_dc_top_predictor_32x32_msa, - aom_dc_128_predictor_32x32_msa, aom_v_predictor_32x32_msa, - aom_h_predictor_32x32_msa, NULL, NULL, NULL, NULL) -#endif // HAVE_MSA - -// ----------------------------------------------------------------------------- -// 64x64, 64x32, 64x16 - -INTRA_PRED_TEST(C_1, TX_64X64, aom_dc_predictor_64x64_c, - aom_dc_left_predictor_64x64_c, aom_dc_top_predictor_64x64_c, - aom_dc_128_predictor_64x64_c, aom_v_predictor_64x64_c, - aom_h_predictor_64x64_c, aom_paeth_predictor_64x64_c, - aom_smooth_predictor_64x64_c, aom_smooth_v_predictor_64x64_c, - aom_smooth_h_predictor_64x64_c) - -INTRA_PRED_TEST(C_2, TX_64X32, aom_dc_predictor_64x32_c, - aom_dc_left_predictor_64x32_c, aom_dc_top_predictor_64x32_c, - aom_dc_128_predictor_64x32_c, aom_v_predictor_64x32_c, - aom_h_predictor_64x32_c, aom_paeth_predictor_64x32_c, - aom_smooth_predictor_64x32_c, aom_smooth_v_predictor_64x32_c, - aom_smooth_h_predictor_64x32_c) - -INTRA_PRED_TEST(C_3, TX_64X16, aom_dc_predictor_64x16_c, - aom_dc_left_predictor_64x16_c, aom_dc_top_predictor_64x16_c, - aom_dc_128_predictor_64x16_c, aom_v_predictor_64x16_c, - aom_h_predictor_64x16_c, aom_paeth_predictor_64x16_c, - aom_smooth_predictor_64x16_c, aom_smooth_v_predictor_64x16_c, - aom_smooth_h_predictor_64x16_c) - -#if HAVE_SSE2 -INTRA_PRED_TEST(SSE2_4, TX_64X64, aom_dc_predictor_64x64_sse2, - aom_dc_left_predictor_64x64_sse2, - aom_dc_top_predictor_64x64_sse2, - aom_dc_128_predictor_64x64_sse2, aom_v_predictor_64x64_sse2, - aom_h_predictor_64x64_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_5, TX_64X32, aom_dc_predictor_64x32_sse2, - aom_dc_left_predictor_64x32_sse2, - aom_dc_top_predictor_64x32_sse2, - aom_dc_128_predictor_64x32_sse2, aom_v_predictor_64x32_sse2, - aom_h_predictor_64x32_sse2, NULL, NULL, NULL, NULL) -INTRA_PRED_TEST(SSE2_6, TX_64X16, aom_dc_predictor_64x16_sse2, - aom_dc_left_predictor_64x16_sse2, - aom_dc_top_predictor_64x16_sse2, - aom_dc_128_predictor_64x16_sse2, aom_v_predictor_64x16_sse2, - aom_h_predictor_64x16_sse2, NULL, NULL, NULL, NULL) -#endif - -#if HAVE_SSSE3 -INTRA_PRED_TEST(SSSE3_4, TX_64X64, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_64x64_ssse3, - aom_smooth_predictor_64x64_ssse3, - aom_smooth_v_predictor_64x64_ssse3, - aom_smooth_h_predictor_64x64_ssse3) -INTRA_PRED_TEST(SSSE3_5, TX_64X32, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_64x32_ssse3, - aom_smooth_predictor_64x32_ssse3, - aom_smooth_v_predictor_64x32_ssse3, - aom_smooth_h_predictor_64x32_ssse3) -INTRA_PRED_TEST(SSSE3_6, TX_64X16, NULL, NULL, NULL, NULL, NULL, NULL, - aom_paeth_predictor_64x16_ssse3, - aom_smooth_predictor_64x16_ssse3, - aom_smooth_v_predictor_64x16_ssse3, - aom_smooth_h_predictor_64x16_ssse3) -#endif - -#if HAVE_AVX2 -INTRA_PRED_TEST(AVX2_4, TX_64X64, aom_dc_predictor_64x64_avx2, - aom_dc_left_predictor_64x64_avx2, - aom_dc_top_predictor_64x64_avx2, - aom_dc_128_predictor_64x64_avx2, aom_v_predictor_64x64_avx2, - NULL, aom_paeth_predictor_64x64_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_5, TX_64X32, aom_dc_predictor_64x32_avx2, - aom_dc_left_predictor_64x32_avx2, - aom_dc_top_predictor_64x32_avx2, - aom_dc_128_predictor_64x32_avx2, aom_v_predictor_64x32_avx2, - NULL, aom_paeth_predictor_64x32_avx2, NULL, NULL, NULL) -INTRA_PRED_TEST(AVX2_6, TX_64X16, aom_dc_predictor_64x16_avx2, - aom_dc_left_predictor_64x16_avx2, - aom_dc_top_predictor_64x16_avx2, - aom_dc_128_predictor_64x16_avx2, aom_v_predictor_64x16_avx2, - NULL, aom_paeth_predictor_64x16_avx2, NULL, NULL, NULL) -#endif -// ----------------------------------------------------------------------------- -// High Bitdepth -namespace { - -typedef void (*AvxHighbdPredFunc)(uint16_t *dst, ptrdiff_t y_stride, - const uint16_t *above, const uint16_t *left, - int bd); - -typedef IntraPredTestMem<uint16_t> Av1HighbdIntraPredTestMem; - -void TestHighbdIntraPred(TX_SIZE tx_size, AvxHighbdPredFunc const *pred_funcs, - const char *const signatures[]) { - const int block_width = tx_size_wide[tx_size]; - const int block_height = tx_size_high[tx_size]; - const int num_pixels_per_test = - block_width * block_height * kNumAv1IntraFuncs; - const int kNumTests = static_cast<int>(2.e10 / num_pixels_per_test); - Av1HighbdIntraPredTestMem intra_pred_test_mem; - const int bd = 12; - intra_pred_test_mem.Init(block_width, block_height, bd); - - for (int k = 0; k < kNumAv1IntraFuncs; ++k) { - if (pred_funcs[k] == NULL) continue; - memcpy(intra_pred_test_mem.src, intra_pred_test_mem.ref_src, - sizeof(intra_pred_test_mem.src)); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int num_tests = 0; num_tests < kNumTests; ++num_tests) { - pred_funcs[k](intra_pred_test_mem.src, intra_pred_test_mem.stride, - intra_pred_test_mem.above, intra_pred_test_mem.left, bd); - } - libaom_test::ClearSystemState(); - aom_usec_timer_mark(&timer); - const int elapsed_time = - static_cast<int>(aom_usec_timer_elapsed(&timer) / 1000); - CheckMd5Signature( - tx_size, true, signatures, intra_pred_test_mem.src, - intra_pred_test_mem.num_pixels * sizeof(*intra_pred_test_mem.src), - elapsed_time, k); - } -} - -static const char *const kHighbdSignatures[TX_SIZES_ALL][kNumAv1IntraFuncs] = { - { - // 4X4 - "11f74af6c5737df472f3275cbde062fa", - "51bea056b6447c93f6eb8f6b7e8f6f71", - "27e97f946766331795886f4de04c5594", - "53ab15974b049111fb596c5168ec7e3f", - "f0b640bb176fbe4584cf3d32a9b0320a", - "729783ca909e03afd4b47111c80d967b", - "6e30009c45474a22032678b1bd579c8f", - "e57cba016d808aa8a35619df2a65f049", - "55a6c37f39afcbbf5abca4a985b96459", - "a623d45b37dafec1f8a75c4c5218913d", - }, - { - // 8X8 - "03da8829fe94663047fd108c5fcaa71d", - "ecdb37b8120a2d3a4c706b016bd1bfd7", - "1d4543ed8d2b9368cb96898095fe8a75", - "f791c9a67b913cbd82d9da8ecede30e2", - "065c70646f4dbaff913282f55a45a441", - "51f87123616662ef7c35691497dfd0ba", - "85c01ba03df68f9ece7bd3fa0f8980e6", - "ad19b7dac092f56df6d054e1f67f21e7", - "0edc415b5dd7299f7a34fb9f71d31d78", - "2bc8ec19e9f4b77a64b8a0a1f6aec7e7", - }, - { - // 16X16 - "e33cb3f56a878e2fddb1b2fc51cdd275", - "c7bff6f04b6052c8ab335d726dbbd52d", - "d0b0b47b654a9bcc5c6008110a44589b", - "78f5da7b10b2b9ab39f114a33b6254e9", - "c78e31d23831abb40d6271a318fdd6f3", - "90d1347f4ec9198a0320daecb6ff90b8", - "e63ded54ab3d0e8728b6f24d4f01e53f", - "35ce21fbe0ea114c089fc3489a78155d", - "f277f6ef8e4d717f1f0dfe2706ac197d", - "e8014d3f41256976c02e0f1e622ba2b9", - }, - { - // 32X32 - "a3e8056ba7e36628cce4917cd956fedd", - "cc7d3024fe8748b512407edee045377e", - "2aab0a0f330a1d3e19b8ecb8f06387a3", - "a547bc3fb7b06910bf3973122a426661", - "26f712514da95042f93d6e8dc8e431dc", - "bb08c6e16177081daa3d936538dbc2e3", - "84bf83f94a51b33654ca940c6f8bc057", - "7168b03fc31bf29596a344d6a35d007c", - "b073a70d3672f1282236994f5d12e94b", - "c51607aebad5dcb3c1e3b58ef9e5b84e", - }, - { - // 64X64 - "a6baa0d4bfb2269a94c7a38f86a4bccf", - "3f1ef5f473a49eba743f17a3324adf9d", - "12ac11889ae5f55b7781454efd706a6a", - "d9a906c0e692b22e1b4414e71a704b7e", - "47d4cadd56f70c11ff8f3e5d8df81161", - "de997744cf24c16c5ac2a36b02b351cc", - "23781211ae178ddeb6c4bb97a6bd7d83", - "a79d2e28340ca34b9e37daabbf030f63", - "0372bd3ddfc258750a6ac106b70587f4", - "228ef625d9460cbf6fa253a16a730976", - }, - { - // 4X8 - "22d519b796d59644043466320e4ccd14", - "09513a738c49b3f9542d27f34abbe1d5", - "807ae5e8813443ff01e71be6efacfb69", - "cbfa18d0293430b6e9708b0be1fd2394", - "346c354c34ec7fa780b576db355dab88", - "f97dae85c35359632380b09ca98d611e", - "698ae351d8896d89ed9e4e67b6e53eda", - "dcc197034a9c45a3d8238bf085835f4e", - "7a35e2c42ffdc2efc2d6d1d75a100fc7", - "41ab6cebd4516c87a91b2a593e2c2506", - }, - { - // 8X4 - "d58cd4c4bf3b7bbaa5db5e1a5622ec78", - "6e572c35aa782d00cafcb99e9ea047ea", - "e8c22a3702b416dc9ab974505afbed09", - "aaa4e4762a795aad7ad74de0c662c4e4", - "a19f9101967383c3dcbd516dc317a291", - "9ab8cb91f1a595b9ebe3fe8de58031aa", - "2cf9021d5f1169268699807ee118b65f", - "ee9605fcbd6fb871f1c5cd81a6989327", - "b4871af8316089e3e23522175df7e93f", - "d33301e1c2cb173be46792a22d19881a", - }, - { - // 8X16 - "4562de1d0336610880fdd5685498a9ec", - "16310fa7076394f16fc85c4b149d89c9", - "0e94af88e1dc573b6f0f499cddd1f530", - "dfd245ee20d091c67809160340365aa9", - "d3562504327f70c096c5be23fd8a3747", - "601b853558502acbb5135eadd2da117a", - "3c624345a723a1b2b1bea05a6a08bc99", - "2a9c781de609e0184cc7ab442050f4e5", - "0ddc5035c22252747126b61fc238c74d", - "e43f5d83bab759af69c7b6773fc8f9b2", - }, - { - // 16X8 - "a57d6b5a9bfd30c29591d8717ace9c51", - "f5907ba97ee6c53e339e953fc8d845ee", - "ea3aa727913ce45af06f89dd1808db5f", - "408af4f23e48d14b48ee35ae094fcd18", - "85c41cbcb5d744f7961e8950026fbffe", - "8a4e588a837638887ba671f8d4910485", - "b792d8826b67a21757ea7097cff9e05b", - "f94ce7101bb87fd3bb9312112527dbf4", - "688c6660a6dc6fa61fa1aa38e708c209", - "0cdf641b4f81d69509c92ae0b93ef5ff", - }, - { - // 16X32 - "aee4b3b0e3cc02d48e2c40d77f807927", - "8baef2b2e789f79c8df9d90ad10f34a4", - "038c38ee3c4f090bb8d736eab136aafc", - "1a3de2aaeaffd68a9fd6c7f6557b83f3", - "385c6e0ea29421dd81011a2934641e26", - "6cf96c285d1a2d4787f955dad715b08c", - "2d7f75dcd73b9528c8396279ff09ff3a", - "5a63cd1841e4ed470e4ca5ef845f2281", - "610d899ca945fbead33287d4335a8b32", - "6bafaad81fce37be46730187e78d8b11", - }, - { - // 32X16 - "290b23c9f5a1de7905bfa71a942da29b", - "701e7b82593c66da5052fc4b6afd79ce", - "4da828c5455cd246735a663fbb204989", - "e3fbeaf234efece8dbd752b77226200c", - "4d1d8c969f05155a7e7e84cf7aad021b", - "c22e4877c2c946d5bdc0d542e29e70cf", - "8ac1ce815e7780500f842b0beb0bb980", - "9fee2e2502b507f25bfad30a55b0b610", - "4ced9c212ec6f9956e27f68a91b59fef", - "4a7a0b93f138bb0863e4e465b01ec0b1", - }, - { - // 32X64 - "ad9cfc395a5c5644a21d958c7274ac14", - "f29d6d03c143ddf96fef04c19f2c8333", - "a8bdc852ef704dd4975c61893e8fbc3f", - "7d0bd7dea26226741dbca9a97f27fa74", - "45c27c5cca9a91b6ae8379feb0881c9f", - "8a0b78df1e001b85c874d686eac4aa1b", - "ce9fa75fac54a3f6c0cc3f2083b938f1", - "c0dca10d88762c954af18dc9e3791a39", - "61df229eddfccab913b8fda4bb02f9ac", - "4f4df6bc8d50a5600b573f0e44d70e66", - }, - { - // 64X32 - "db9d82921fd88b24fdff6f849f2f9c87", - "5ecc7fdc52d2f575ad4f2d0e9e6b1e11", - "b4581311a0a73d95dfac7f8f44591032", - "68bd283cfd1a125f6b2ee47cee874d36", - "804179f05c032908a5e36077bb87c994", - "fc5fd041a8ee779015394d0c066ee43c", - "68f5579ccadfe9a1baafb158334a3db2", - "fe237e45e215ab06d79046da9ad71e84", - "9a8a938a6824551bf7d21b8fd1d70ea1", - "eb7332f2017cd96882c76e7136aeaf53", - }, - { - // 4X16 - "7bafa307d507747b8132e7735b7f1c73", - "e58bc2d8213a97d1fea9cfb73d7a9633", - "435f8a8e8bbf14dbf2fe16b2be9e97aa", - "1d0e767b68d84acbfb50b7a04e633836", - "5f713bd7b324fe73bb7063e35ee14e5e", - "0dac4e1fa3d59814202715468c01ed56", - "47709d1db4a330c7a8900f450e6fddd1", - "258e0b930bb27db28f05da9cf7d1ee7c", - "36cf030fbae767912593efea045bfff5", - "248d7aceabb7499febae663fae41a920", - }, - { - // 16X4 - "04dde98e632670e393704742c89f9067", - "8c72543f1664651ae1fa08e2ac0adb9b", - "2354a2cdc2773aa2df8ab4010db1be39", - "6300ad3221c26da39b10e0e6d87ee3be", - "8ea30b661c6ba60b28d3167f19e449b8", - "fb6c1e4ff101a371cede63c2955cdb7e", - "a517c06433d6d7927b16a72184a23e92", - "393828be5d62ab6c48668bea5e2f801a", - "b1e510c542013eb9d6fb188dea2ce90a", - "569a8f2fe01679ca216535ecbcdccb62", - }, - { - // 8X32 - "9d541865c185ca7607852852613ac1fc", - "b96be67f08c6b5fa5ebd3411299c2f7c", - "75a2dcf50004b9d188849b048239767e", - "429492ff415c9fd9b050d73b2ad500f8", - "64b3606c1ccd036bd766bd5711392cf4", - "cb59844a0f01660ac955bae3511f1100", - "3e076155b7a70e8828618e3f33b51e3d", - "ed2d1f597ab7c50beff690f737cf9726", - "7909c6a26aaf20c59d996d3e5b5f9c29", - "965798807240c98c6f7cc9b457ed0773", - }, - { - // 32X8 - "36f391aa31619eec1f4d9ee95ea454cc", - "b82648f14eeba2527357cb50bc3223cb", - "7a7b2adf429125e8bee9d1d00a66e13f", - "4198e4d6ba503b7cc2d7e96bb845f661", - "96c160d2ec1be9fe0cdea9682f14d257", - "19a450bcebaa75afb4fc6bd1fd6434af", - "2bd2e35967d43d0ec1c6587a36f204d5", - "49799a99aa4ccfbd989bee92a99422f1", - "955530e99813812a74659edeac3f5475", - "f0316b84e378a19cd11b19a6e40b2914", - }, - { - // 16X64 - "8cba1b70a0bde29e8ef235cedc5faa7d", - "96d00ddc7537bf7f196006591b733b4e", - "cbf69d5d157c9f3355a4757b1d6e3414", - "3ac1f642019493dec1b737d7a3a1b4e5", - "35f9ee300d7fa3c97338e81a6f21dcd4", - "aae335442e77c8ebc280f16ea50ba9c7", - "a6140fdac2278644328be094d88731db", - "2df93621b6ff100f7008432d509f4161", - "c77bf5aee39e7ed4a3dd715f816f452a", - "02109bd63557d90225c32a8f1338258e", - }, - { - // 64X16 - "a5e2f9fb685d5f4a048e9a96affd25a4", - "1348f249690d9eefe09d9ad7ead2c801", - "525da4b187acd81b1ff1116b60461141", - "e99d072de858094c98b01bd4a6772634", - "873bfa9dc24693f19721f7c8d527f7d3", - "0acfc6507bd3468e9679efc127d6e4b9", - "57d03f8d079c7264854e22ac1157cfae", - "6c2c4036f70c7d957a9399b5436c0774", - "42b8e4a97b7f8416c72a5148c031c0b1", - "a38a2c5f79993dfae8530e9e25800893", - }, -}; - -} // namespace - -#define HIGHBD_INTRA_PRED_TEST(arch, tx_size, dc, dc_left, dc_top, dc_128, v, \ - h, paeth, smooth, smooth_v, smooth_h) \ - TEST(arch, DISABLED_##TestHighbdIntraPred_##tx_size) { \ - static const AvxHighbdPredFunc aom_intra_pred[] = { \ - dc, dc_left, dc_top, dc_128, v, h, paeth, smooth, smooth_v, smooth_h \ - }; \ - TestHighbdIntraPred(tx_size, aom_intra_pred, kHighbdSignatures[tx_size]); \ - } - -// ----------------------------------------------------------------------------- -// 4x4, 4x8, 4x16 - -HIGHBD_INTRA_PRED_TEST( - C_1, TX_4X4, aom_highbd_dc_predictor_4x4_c, - aom_highbd_dc_left_predictor_4x4_c, aom_highbd_dc_top_predictor_4x4_c, - aom_highbd_dc_128_predictor_4x4_c, aom_highbd_v_predictor_4x4_c, - aom_highbd_h_predictor_4x4_c, aom_highbd_paeth_predictor_4x4_c, - aom_highbd_smooth_predictor_4x4_c, aom_highbd_smooth_v_predictor_4x4_c, - aom_highbd_smooth_h_predictor_4x4_c) - -HIGHBD_INTRA_PRED_TEST( - C_2, TX_4X8, aom_highbd_dc_predictor_4x8_c, - aom_highbd_dc_left_predictor_4x8_c, aom_highbd_dc_top_predictor_4x8_c, - aom_highbd_dc_128_predictor_4x8_c, aom_highbd_v_predictor_4x8_c, - aom_highbd_h_predictor_4x8_c, aom_highbd_paeth_predictor_4x8_c, - aom_highbd_smooth_predictor_4x8_c, aom_highbd_smooth_v_predictor_4x8_c, - aom_highbd_smooth_h_predictor_4x8_c) - -HIGHBD_INTRA_PRED_TEST( - C_3, TX_4X16, aom_highbd_dc_predictor_4x16_c, - aom_highbd_dc_left_predictor_4x16_c, aom_highbd_dc_top_predictor_4x16_c, - aom_highbd_dc_128_predictor_4x16_c, aom_highbd_v_predictor_4x16_c, - aom_highbd_h_predictor_4x16_c, aom_highbd_paeth_predictor_4x16_c, - aom_highbd_smooth_predictor_4x16_c, aom_highbd_smooth_v_predictor_4x16_c, - aom_highbd_smooth_h_predictor_4x16_c) - -#if HAVE_SSE2 -HIGHBD_INTRA_PRED_TEST(SSE2_1, TX_4X4, aom_highbd_dc_predictor_4x4_sse2, - aom_highbd_dc_left_predictor_4x4_sse2, - aom_highbd_dc_top_predictor_4x4_sse2, - aom_highbd_dc_128_predictor_4x4_sse2, - aom_highbd_v_predictor_4x4_sse2, - aom_highbd_h_predictor_4x4_sse2, NULL, NULL, NULL, NULL) - -HIGHBD_INTRA_PRED_TEST(SSE2_2, TX_4X8, aom_highbd_dc_predictor_4x8_sse2, - aom_highbd_dc_left_predictor_4x8_sse2, - aom_highbd_dc_top_predictor_4x8_sse2, - aom_highbd_dc_128_predictor_4x8_sse2, - aom_highbd_v_predictor_4x8_sse2, - aom_highbd_h_predictor_4x8_sse2, NULL, NULL, NULL, NULL) -#endif - -// ----------------------------------------------------------------------------- -// 8x8, 8x4, 8x16, 8x32 - -HIGHBD_INTRA_PRED_TEST( - C_1, TX_8X8, aom_highbd_dc_predictor_8x8_c, - aom_highbd_dc_left_predictor_8x8_c, aom_highbd_dc_top_predictor_8x8_c, - aom_highbd_dc_128_predictor_8x8_c, aom_highbd_v_predictor_8x8_c, - aom_highbd_h_predictor_8x8_c, aom_highbd_paeth_predictor_8x8_c, - aom_highbd_smooth_predictor_8x8_c, aom_highbd_smooth_v_predictor_8x8_c, - aom_highbd_smooth_h_predictor_8x8_c) - -HIGHBD_INTRA_PRED_TEST( - C_2, TX_8X4, aom_highbd_dc_predictor_8x4_c, - aom_highbd_dc_left_predictor_8x4_c, aom_highbd_dc_top_predictor_8x4_c, - aom_highbd_dc_128_predictor_8x4_c, aom_highbd_v_predictor_8x4_c, - aom_highbd_h_predictor_8x4_c, aom_highbd_paeth_predictor_8x4_c, - aom_highbd_smooth_predictor_8x4_c, aom_highbd_smooth_v_predictor_8x4_c, - aom_highbd_smooth_h_predictor_8x4_c) - -HIGHBD_INTRA_PRED_TEST( - C_3, TX_8X16, aom_highbd_dc_predictor_8x16_c, - aom_highbd_dc_left_predictor_8x16_c, aom_highbd_dc_top_predictor_8x16_c, - aom_highbd_dc_128_predictor_8x16_c, aom_highbd_v_predictor_8x16_c, - aom_highbd_h_predictor_8x16_c, aom_highbd_paeth_predictor_8x16_c, - aom_highbd_smooth_predictor_8x16_c, aom_highbd_smooth_v_predictor_8x16_c, - aom_highbd_smooth_h_predictor_8x16_c) - -HIGHBD_INTRA_PRED_TEST( - C_4, TX_8X32, aom_highbd_dc_predictor_8x32_c, - aom_highbd_dc_left_predictor_8x32_c, aom_highbd_dc_top_predictor_8x32_c, - aom_highbd_dc_128_predictor_8x32_c, aom_highbd_v_predictor_8x32_c, - aom_highbd_h_predictor_8x32_c, aom_highbd_paeth_predictor_8x32_c, - aom_highbd_smooth_predictor_8x32_c, aom_highbd_smooth_v_predictor_8x32_c, - aom_highbd_smooth_h_predictor_8x32_c) - -#if HAVE_SSE2 -HIGHBD_INTRA_PRED_TEST(SSE2_1, TX_8X8, aom_highbd_dc_predictor_8x8_sse2, - aom_highbd_dc_left_predictor_8x8_sse2, - aom_highbd_dc_top_predictor_8x8_sse2, - aom_highbd_dc_128_predictor_8x8_sse2, - aom_highbd_v_predictor_8x8_sse2, - aom_highbd_h_predictor_8x8_sse2, NULL, NULL, NULL, NULL) -HIGHBD_INTRA_PRED_TEST(SSE2_2, TX_8X4, aom_highbd_dc_predictor_8x4_sse2, - aom_highbd_dc_left_predictor_8x4_sse2, - aom_highbd_dc_top_predictor_8x4_sse2, - aom_highbd_dc_128_predictor_8x4_sse2, - aom_highbd_v_predictor_8x4_sse2, - aom_highbd_h_predictor_8x4_sse2, NULL, NULL, NULL, NULL) -HIGHBD_INTRA_PRED_TEST(SSE2_3, TX_8X16, aom_highbd_dc_predictor_8x16_sse2, - aom_highbd_dc_left_predictor_8x16_sse2, - aom_highbd_dc_top_predictor_8x16_sse2, - aom_highbd_dc_128_predictor_8x16_sse2, - aom_highbd_v_predictor_8x16_sse2, - aom_highbd_h_predictor_8x16_sse2, NULL, NULL, NULL, NULL) -#endif - -#if HAVE_SSSE3 -HIGHBD_INTRA_PRED_TEST(SSSE3, TX_8X8, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL) -#endif - -// ----------------------------------------------------------------------------- -// 16x16, 16x8, 16x32, 16x4, 16x64 - -HIGHBD_INTRA_PRED_TEST( - C_1, TX_16X16, aom_highbd_dc_predictor_16x16_c, - aom_highbd_dc_left_predictor_16x16_c, aom_highbd_dc_top_predictor_16x16_c, - aom_highbd_dc_128_predictor_16x16_c, aom_highbd_v_predictor_16x16_c, - aom_highbd_h_predictor_16x16_c, aom_highbd_paeth_predictor_16x16_c, - aom_highbd_smooth_predictor_16x16_c, aom_highbd_smooth_v_predictor_16x16_c, - aom_highbd_smooth_h_predictor_16x16_c) - -HIGHBD_INTRA_PRED_TEST( - C_2, TX_16X8, aom_highbd_dc_predictor_16x8_c, - aom_highbd_dc_left_predictor_16x8_c, aom_highbd_dc_top_predictor_16x8_c, - aom_highbd_dc_128_predictor_16x8_c, aom_highbd_v_predictor_16x8_c, - aom_highbd_h_predictor_16x8_c, aom_highbd_paeth_predictor_16x8_c, - aom_highbd_smooth_predictor_16x8_c, aom_highbd_smooth_v_predictor_16x8_c, - aom_highbd_smooth_h_predictor_16x8_c) - -HIGHBD_INTRA_PRED_TEST( - C_3, TX_16X32, aom_highbd_dc_predictor_16x32_c, - aom_highbd_dc_left_predictor_16x32_c, aom_highbd_dc_top_predictor_16x32_c, - aom_highbd_dc_128_predictor_16x32_c, aom_highbd_v_predictor_16x32_c, - aom_highbd_h_predictor_16x32_c, aom_highbd_paeth_predictor_16x32_c, - aom_highbd_smooth_predictor_16x32_c, aom_highbd_smooth_v_predictor_16x32_c, - aom_highbd_smooth_h_predictor_16x32_c) - -HIGHBD_INTRA_PRED_TEST( - C_4, TX_16X4, aom_highbd_dc_predictor_16x4_c, - aom_highbd_dc_left_predictor_16x4_c, aom_highbd_dc_top_predictor_16x4_c, - aom_highbd_dc_128_predictor_16x4_c, aom_highbd_v_predictor_16x4_c, - aom_highbd_h_predictor_16x4_c, aom_highbd_paeth_predictor_16x4_c, - aom_highbd_smooth_predictor_16x4_c, aom_highbd_smooth_v_predictor_16x4_c, - aom_highbd_smooth_h_predictor_16x4_c) - -HIGHBD_INTRA_PRED_TEST( - C_5, TX_16X64, aom_highbd_dc_predictor_16x64_c, - aom_highbd_dc_left_predictor_16x64_c, aom_highbd_dc_top_predictor_16x64_c, - aom_highbd_dc_128_predictor_16x64_c, aom_highbd_v_predictor_16x64_c, - aom_highbd_h_predictor_16x64_c, aom_highbd_paeth_predictor_16x64_c, - aom_highbd_smooth_predictor_16x64_c, aom_highbd_smooth_v_predictor_16x64_c, - aom_highbd_smooth_h_predictor_16x64_c) - -#if HAVE_SSE2 -HIGHBD_INTRA_PRED_TEST(SSE2_1, TX_16X16, aom_highbd_dc_predictor_16x16_sse2, - aom_highbd_dc_left_predictor_16x16_sse2, - aom_highbd_dc_top_predictor_16x16_sse2, - aom_highbd_dc_128_predictor_16x16_sse2, - aom_highbd_v_predictor_16x16_sse2, - aom_highbd_h_predictor_16x16_sse2, NULL, NULL, NULL, - NULL) -HIGHBD_INTRA_PRED_TEST(SSE2_2, TX_16X8, aom_highbd_dc_predictor_16x8_sse2, - aom_highbd_dc_left_predictor_16x8_sse2, - aom_highbd_dc_top_predictor_16x8_sse2, - aom_highbd_dc_128_predictor_16x8_sse2, - aom_highbd_v_predictor_16x8_sse2, - aom_highbd_h_predictor_16x8_sse2, NULL, NULL, NULL, NULL) -HIGHBD_INTRA_PRED_TEST(SSE2_3, TX_16X32, aom_highbd_dc_predictor_16x32_sse2, - aom_highbd_dc_left_predictor_16x32_sse2, - aom_highbd_dc_top_predictor_16x32_sse2, - aom_highbd_dc_128_predictor_16x32_sse2, - aom_highbd_v_predictor_16x32_sse2, - aom_highbd_h_predictor_16x32_sse2, NULL, NULL, NULL, - NULL) -#endif - -#if HAVE_SSSE3 -HIGHBD_INTRA_PRED_TEST(SSSE3_1, TX_16X16, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) -#endif - -#if HAVE_AVX2 -HIGHBD_INTRA_PRED_TEST(AVX2_1, TX_16X16, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) - -HIGHBD_INTRA_PRED_TEST(AVX2_2, TX_16X8, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) - -HIGHBD_INTRA_PRED_TEST(AVX2_3, TX_16X32, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) -#endif - -// ----------------------------------------------------------------------------- -// 32x32, 32x16, 32x64, 32x8 - -HIGHBD_INTRA_PRED_TEST( - C_1, TX_32X32, aom_highbd_dc_predictor_32x32_c, - aom_highbd_dc_left_predictor_32x32_c, aom_highbd_dc_top_predictor_32x32_c, - aom_highbd_dc_128_predictor_32x32_c, aom_highbd_v_predictor_32x32_c, - aom_highbd_h_predictor_32x32_c, aom_highbd_paeth_predictor_32x32_c, - aom_highbd_smooth_predictor_32x32_c, aom_highbd_smooth_v_predictor_32x32_c, - aom_highbd_smooth_h_predictor_32x32_c) - -HIGHBD_INTRA_PRED_TEST( - C_2, TX_32X16, aom_highbd_dc_predictor_32x16_c, - aom_highbd_dc_left_predictor_32x16_c, aom_highbd_dc_top_predictor_32x16_c, - aom_highbd_dc_128_predictor_32x16_c, aom_highbd_v_predictor_32x16_c, - aom_highbd_h_predictor_32x16_c, aom_highbd_paeth_predictor_32x16_c, - aom_highbd_smooth_predictor_32x16_c, aom_highbd_smooth_v_predictor_32x16_c, - aom_highbd_smooth_h_predictor_32x16_c) - -HIGHBD_INTRA_PRED_TEST( - C_3, TX_32X64, aom_highbd_dc_predictor_32x64_c, - aom_highbd_dc_left_predictor_32x64_c, aom_highbd_dc_top_predictor_32x64_c, - aom_highbd_dc_128_predictor_32x64_c, aom_highbd_v_predictor_32x64_c, - aom_highbd_h_predictor_32x64_c, aom_highbd_paeth_predictor_32x64_c, - aom_highbd_smooth_predictor_32x64_c, aom_highbd_smooth_v_predictor_32x64_c, - aom_highbd_smooth_h_predictor_32x64_c) - -HIGHBD_INTRA_PRED_TEST( - C_4, TX_32X8, aom_highbd_dc_predictor_32x8_c, - aom_highbd_dc_left_predictor_32x8_c, aom_highbd_dc_top_predictor_32x8_c, - aom_highbd_dc_128_predictor_32x8_c, aom_highbd_v_predictor_32x8_c, - aom_highbd_h_predictor_32x8_c, aom_highbd_paeth_predictor_32x8_c, - aom_highbd_smooth_predictor_32x8_c, aom_highbd_smooth_v_predictor_32x8_c, - aom_highbd_smooth_h_predictor_32x8_c) - -#if HAVE_SSE2 -HIGHBD_INTRA_PRED_TEST(SSE2_1, TX_32X32, aom_highbd_dc_predictor_32x32_sse2, - aom_highbd_dc_left_predictor_32x32_sse2, - aom_highbd_dc_top_predictor_32x32_sse2, - aom_highbd_dc_128_predictor_32x32_sse2, - aom_highbd_v_predictor_32x32_sse2, - aom_highbd_h_predictor_32x32_sse2, NULL, NULL, NULL, - NULL) -HIGHBD_INTRA_PRED_TEST(SSE2_2, TX_32X16, aom_highbd_dc_predictor_32x16_sse2, - aom_highbd_dc_left_predictor_32x16_sse2, - aom_highbd_dc_top_predictor_32x16_sse2, - aom_highbd_dc_128_predictor_32x16_sse2, - aom_highbd_v_predictor_32x16_sse2, - aom_highbd_h_predictor_32x16_sse2, NULL, NULL, NULL, - NULL) -#endif - -#if HAVE_SSSE3 -HIGHBD_INTRA_PRED_TEST(SSSE3_1, TX_32X32, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) -#endif - -#if HAVE_AVX2 -HIGHBD_INTRA_PRED_TEST(AVX2_1, TX_32X32, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) - -HIGHBD_INTRA_PRED_TEST(AVX2_2, TX_32X16, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL) -#endif - -// ----------------------------------------------------------------------------- -// 64x64, 64x32, 64x16 - -HIGHBD_INTRA_PRED_TEST( - C_1, TX_64X64, aom_highbd_dc_predictor_64x64_c, - aom_highbd_dc_left_predictor_64x64_c, aom_highbd_dc_top_predictor_64x64_c, - aom_highbd_dc_128_predictor_64x64_c, aom_highbd_v_predictor_64x64_c, - aom_highbd_h_predictor_64x64_c, aom_highbd_paeth_predictor_64x64_c, - aom_highbd_smooth_predictor_64x64_c, aom_highbd_smooth_v_predictor_64x64_c, - aom_highbd_smooth_h_predictor_64x64_c) - -HIGHBD_INTRA_PRED_TEST( - C_2, TX_64X32, aom_highbd_dc_predictor_64x32_c, - aom_highbd_dc_left_predictor_64x32_c, aom_highbd_dc_top_predictor_64x32_c, - aom_highbd_dc_128_predictor_64x32_c, aom_highbd_v_predictor_64x32_c, - aom_highbd_h_predictor_64x32_c, aom_highbd_paeth_predictor_64x32_c, - aom_highbd_smooth_predictor_64x32_c, aom_highbd_smooth_v_predictor_64x32_c, - aom_highbd_smooth_h_predictor_64x32_c) - -HIGHBD_INTRA_PRED_TEST( - C_3, TX_64X16, aom_highbd_dc_predictor_64x16_c, - aom_highbd_dc_left_predictor_64x16_c, aom_highbd_dc_top_predictor_64x16_c, - aom_highbd_dc_128_predictor_64x16_c, aom_highbd_v_predictor_64x16_c, - aom_highbd_h_predictor_64x16_c, aom_highbd_paeth_predictor_64x16_c, - aom_highbd_smooth_predictor_64x16_c, aom_highbd_smooth_v_predictor_64x16_c, - aom_highbd_smooth_h_predictor_64x16_c) - -// ----------------------------------------------------------------------------- - -#include "test/test_libaom.cc" diff --git a/third_party/aom/test/test_libaom.cc b/third_party/aom/test/test_libaom.cc deleted file mode 100644 index b55d76237..000000000 --- a/third_party/aom/test/test_libaom.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string.h> - -#include <string> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" - -#if ARCH_X86 || ARCH_X86_64 -#include "aom_ports/x86.h" -#endif -extern "C" { -extern void av1_rtcd(); -extern void aom_dsp_rtcd(); -extern void aom_scale_rtcd(); -} - -#if ARCH_X86 || ARCH_X86_64 -static void append_negative_gtest_filter(const char *str) { - std::string filter = ::testing::FLAGS_gtest_filter; - // Negative patterns begin with one '-' followed by a ':' separated list. - if (filter.find('-') == std::string::npos) filter += '-'; - // OPT.* matches TEST() functions - // OPT/* matches TEST_P() functions - // OPT_* matches tests which have been manually sharded. - // We do not match OPT* because of SSE/SSE2 collisions. - const char *search_terminators = "./_"; - for (size_t pos = 0; pos < strlen(search_terminators); ++pos) { - filter += ":"; - filter += str; - filter += search_terminators[pos]; - filter += "*"; - } - ::testing::FLAGS_gtest_filter = filter; -} -#endif // ARCH_X86 || ARCH_X86_64 - -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - -#if ARCH_X86 || ARCH_X86_64 - const int simd_caps = x86_simd_caps(); - if (!(simd_caps & HAS_MMX)) append_negative_gtest_filter("MMX"); - if (!(simd_caps & HAS_SSE)) append_negative_gtest_filter("SSE"); - if (!(simd_caps & HAS_SSE2)) append_negative_gtest_filter("SSE2"); - if (!(simd_caps & HAS_SSE3)) append_negative_gtest_filter("SSE3"); - if (!(simd_caps & HAS_SSSE3)) append_negative_gtest_filter("SSSE3"); - if (!(simd_caps & HAS_SSE4_1)) append_negative_gtest_filter("SSE4_1"); - if (!(simd_caps & HAS_SSE4_2)) append_negative_gtest_filter("SSE4_2"); - if (!(simd_caps & HAS_AVX)) append_negative_gtest_filter("AVX"); - if (!(simd_caps & HAS_AVX2)) append_negative_gtest_filter("AVX2"); -#endif // ARCH_X86 || ARCH_X86_64 - -// Shared library builds don't support whitebox tests that exercise internal -// symbols. -#if !CONFIG_SHARED - av1_rtcd(); - aom_dsp_rtcd(); - aom_scale_rtcd(); -#endif // !CONFIG_SHARED - - return RUN_ALL_TESTS(); -} diff --git a/third_party/aom/test/test_runner.cmake b/third_party/aom/test/test_runner.cmake deleted file mode 100644 index d3747b1e3..000000000 --- a/third_party/aom/test/test_runner.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copyright (c) 2017, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and the -# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was -# not distributed with this source code in the LICENSE file, you can obtain it -# at www.aomedia.org/license/software. If the Alliance for Open Media Patent -# License 1.0 was not distributed with this source code in the PATENTS file, you -# can obtain it at www.aomedia.org/license/patent. -# -if(NOT GTEST_TOTAL_SHARDS OR "${GTEST_SHARD_INDEX}" STREQUAL "" OR NOT - TEST_LIBAOM) - message( - FATAL_ERROR - "The variables GTEST_SHARD_INDEX, GTEST_TOTAL_SHARDS and TEST_LIBAOM - must be defined." - ) -endif() - -set($ENV{GTEST_SHARD_INDEX} ${GTEST_SHARD_INDEX}) -set($ENV{GTEST_TOTAL_SHARDS} ${GTEST_TOTAL_SHARDS}) -execute_process(COMMAND ${TEST_LIBAOM} RESULT_VARIABLE test_result) -set(test_message "Test shard ${GTEST_SHARD_INDEX}/${GTEST_TOTAL_SHARDS} result") -message("${test_message}: ${test_result}") - -if(NOT "${test_result}" STREQUAL "0") - message(FATAL_ERROR "${test_message}: FAILED, non-zero exit code.") -endif() diff --git a/third_party/aom/test/test_vector_test.cc b/third_party/aom/test/test_vector_test.cc deleted file mode 100644 index 286988b17..000000000 --- a/third_party/aom/test/test_vector_test.cc +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdio> -#include <cstdlib> -#include <set> -#include <string> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "common/tools_common.h" -#include "config/aom_config.h" -#include "test/codec_factory.h" -#include "test/decode_test_driver.h" -#include "test/ivf_video_source.h" -#include "test/md5_helper.h" -#include "test/test_vectors.h" -#include "test/util.h" -#if CONFIG_WEBM_IO -#include "test/webm_video_source.h" -#endif - -namespace { - -const int kThreads = 0; -const int kFileName = 1; -const int kRowMT = 2; - -typedef ::testing::tuple<int, const char *, int> DecodeParam; - -class TestVectorTest : public ::libaom_test::DecoderTest, - public ::libaom_test::CodecTestWithParam<DecodeParam> { - protected: - TestVectorTest() : DecoderTest(GET_PARAM(0)), md5_file_(NULL) {} - - virtual ~TestVectorTest() { - if (md5_file_) fclose(md5_file_); - } - - void OpenMD5File(const std::string &md5_file_name_) { - md5_file_ = libaom_test::OpenTestDataFile(md5_file_name_); - ASSERT_TRUE(md5_file_ != NULL) - << "Md5 file open failed. Filename: " << md5_file_name_; - } - - virtual void PreDecodeFrameHook( - const libaom_test::CompressedVideoSource &video, - libaom_test::Decoder *decoder) { - if (video.frame_number() == 0) decoder->Control(AV1D_SET_ROW_MT, row_mt_); - } - - virtual void DecompressedFrameHook(const aom_image_t &img, - const unsigned int frame_number) { - ASSERT_TRUE(md5_file_ != NULL); - char expected_md5[33]; - char junk[128]; - - // Read correct md5 checksums. - const int res = fscanf(md5_file_, "%s %s", expected_md5, junk); - ASSERT_NE(res, EOF) << "Read md5 data failed"; - expected_md5[32] = '\0'; - - ::libaom_test::MD5 md5_res; -#if !CONFIG_LOWBITDEPTH - const aom_img_fmt_t shifted_fmt = - (aom_img_fmt)(img.fmt & ~AOM_IMG_FMT_HIGHBITDEPTH); - if (img.bit_depth == 8 && shifted_fmt != img.fmt) { - aom_image_t *img_shifted = - aom_img_alloc(NULL, shifted_fmt, img.d_w, img.d_h, 16); - img_shifted->bit_depth = img.bit_depth; - img_shifted->monochrome = img.monochrome; - aom_img_downshift(img_shifted, &img, 0); - md5_res.Add(img_shifted); - aom_img_free(img_shifted); - } else { -#endif - md5_res.Add(&img); -#if !CONFIG_LOWBITDEPTH - } -#endif - - const char *actual_md5 = md5_res.Get(); - // Check md5 match. - ASSERT_STREQ(expected_md5, actual_md5) - << "Md5 checksums don't match: frame number = " << frame_number; - } - - unsigned int row_mt_; - - private: - FILE *md5_file_; -}; - -// This test runs through the whole set of test vectors, and decodes them. -// The md5 checksums are computed for each frame in the video file. If md5 -// checksums match the correct md5 data, then the test is passed. Otherwise, -// the test failed. -TEST_P(TestVectorTest, MD5Match) { - const DecodeParam input = GET_PARAM(1); - const std::string filename = ::testing::get<kFileName>(input); - aom_codec_flags_t flags = 0; - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - char str[256]; - - cfg.threads = ::testing::get<kThreads>(input); - row_mt_ = ::testing::get<kRowMT>(input); - - snprintf(str, sizeof(str) / sizeof(str[0]) - 1, "file: %s threads: %d", - filename.c_str(), cfg.threads); - SCOPED_TRACE(str); - - // Open compressed video file. - testing::internal::scoped_ptr<libaom_test::CompressedVideoSource> video; - if (filename.substr(filename.length() - 3, 3) == "ivf") { - video.reset(new libaom_test::IVFVideoSource(filename)); - } else if (filename.substr(filename.length() - 4, 4) == "webm" || - filename.substr(filename.length() - 3, 3) == "mkv") { -#if CONFIG_WEBM_IO - video.reset(new libaom_test::WebMVideoSource(filename)); -#else - fprintf(stderr, "WebM IO is disabled, skipping test vector %s\n", - filename.c_str()); - return; -#endif - } - ASSERT_TRUE(video.get() != NULL); - video->Init(); - - // Construct md5 file name. - const std::string md5_filename = filename + ".md5"; - OpenMD5File(md5_filename); - - // Set decode config and flags. - cfg.allow_lowbitdepth = CONFIG_LOWBITDEPTH; - set_cfg(cfg); - set_flags(flags); - - // Decode frame, and check the md5 matching. - ASSERT_NO_FATAL_FAILURE(RunLoop(video.get(), cfg)); -} - -#if CONFIG_AV1_DECODER -AV1_INSTANTIATE_TEST_CASE( - TestVectorTest, - ::testing::Combine(::testing::Values(1), // Single thread. - ::testing::ValuesIn(libaom_test::kAV1TestVectors, - libaom_test::kAV1TestVectors + - libaom_test::kNumAV1TestVectors), - ::testing::Values(0))); - -// Test AV1 decode in with different numbers of threads. -INSTANTIATE_TEST_CASE_P( - AV1MultiThreaded, TestVectorTest, - ::testing::Combine( - ::testing::Values( - static_cast<const libaom_test::CodecFactory *>(&libaom_test::kAV1)), - ::testing::Combine( - ::testing::Range(2, 9), // With 2 ~ 8 threads. - ::testing::ValuesIn(libaom_test::kAV1TestVectors, - libaom_test::kAV1TestVectors + - libaom_test::kNumAV1TestVectors), - ::testing::Range(0, 2)))); - -#endif // CONFIG_AV1_DECODER - -} // namespace diff --git a/third_party/aom/test/test_vectors.cc b/third_party/aom/test/test_vectors.cc deleted file mode 100644 index 71e431e18..000000000 --- a/third_party/aom/test/test_vectors.cc +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include "test/test_vectors.h" - -namespace libaom_test { - -#define NELEMENTS(x) static_cast<int>(sizeof(x) / sizeof(x[0])) - -#if CONFIG_AV1_DECODER -const char *const kAV1TestVectors[] = { - "av1-1-b8-00-quantizer-00.ivf", "av1-1-b8-00-quantizer-01.ivf", - "av1-1-b8-00-quantizer-02.ivf", "av1-1-b8-00-quantizer-03.ivf", - "av1-1-b8-00-quantizer-04.ivf", "av1-1-b8-00-quantizer-05.ivf", - "av1-1-b8-00-quantizer-06.ivf", "av1-1-b8-00-quantizer-07.ivf", - "av1-1-b8-00-quantizer-08.ivf", "av1-1-b8-00-quantizer-09.ivf", - "av1-1-b8-00-quantizer-10.ivf", "av1-1-b8-00-quantizer-11.ivf", - "av1-1-b8-00-quantizer-12.ivf", "av1-1-b8-00-quantizer-13.ivf", - "av1-1-b8-00-quantizer-14.ivf", "av1-1-b8-00-quantizer-15.ivf", - "av1-1-b8-00-quantizer-16.ivf", "av1-1-b8-00-quantizer-17.ivf", - "av1-1-b8-00-quantizer-18.ivf", "av1-1-b8-00-quantizer-19.ivf", - "av1-1-b8-00-quantizer-20.ivf", "av1-1-b8-00-quantizer-21.ivf", - "av1-1-b8-00-quantizer-22.ivf", "av1-1-b8-00-quantizer-23.ivf", - "av1-1-b8-00-quantizer-24.ivf", "av1-1-b8-00-quantizer-25.ivf", - "av1-1-b8-00-quantizer-26.ivf", "av1-1-b8-00-quantizer-27.ivf", - "av1-1-b8-00-quantizer-28.ivf", "av1-1-b8-00-quantizer-29.ivf", - "av1-1-b8-00-quantizer-30.ivf", "av1-1-b8-00-quantizer-31.ivf", - "av1-1-b8-00-quantizer-32.ivf", "av1-1-b8-00-quantizer-33.ivf", - "av1-1-b8-00-quantizer-34.ivf", "av1-1-b8-00-quantizer-35.ivf", - "av1-1-b8-00-quantizer-36.ivf", "av1-1-b8-00-quantizer-37.ivf", - "av1-1-b8-00-quantizer-38.ivf", "av1-1-b8-00-quantizer-39.ivf", - "av1-1-b8-00-quantizer-40.ivf", "av1-1-b8-00-quantizer-41.ivf", - "av1-1-b8-00-quantizer-42.ivf", "av1-1-b8-00-quantizer-43.ivf", - "av1-1-b8-00-quantizer-44.ivf", "av1-1-b8-00-quantizer-45.ivf", - "av1-1-b8-00-quantizer-46.ivf", "av1-1-b8-00-quantizer-47.ivf", - "av1-1-b8-00-quantizer-48.ivf", "av1-1-b8-00-quantizer-49.ivf", - "av1-1-b8-00-quantizer-50.ivf", "av1-1-b8-00-quantizer-51.ivf", - "av1-1-b8-00-quantizer-52.ivf", "av1-1-b8-00-quantizer-53.ivf", - "av1-1-b8-00-quantizer-54.ivf", "av1-1-b8-00-quantizer-55.ivf", - "av1-1-b8-00-quantizer-56.ivf", "av1-1-b8-00-quantizer-57.ivf", - "av1-1-b8-00-quantizer-58.ivf", "av1-1-b8-00-quantizer-59.ivf", - "av1-1-b8-00-quantizer-60.ivf", "av1-1-b8-00-quantizer-61.ivf", - "av1-1-b8-00-quantizer-62.ivf", "av1-1-b8-00-quantizer-63.ivf", - "av1-1-b10-00-quantizer-00.ivf", "av1-1-b10-00-quantizer-01.ivf", - "av1-1-b10-00-quantizer-02.ivf", "av1-1-b10-00-quantizer-03.ivf", - "av1-1-b10-00-quantizer-04.ivf", "av1-1-b10-00-quantizer-05.ivf", - "av1-1-b10-00-quantizer-06.ivf", "av1-1-b10-00-quantizer-07.ivf", - "av1-1-b10-00-quantizer-08.ivf", "av1-1-b10-00-quantizer-09.ivf", - "av1-1-b10-00-quantizer-10.ivf", "av1-1-b10-00-quantizer-11.ivf", - "av1-1-b10-00-quantizer-12.ivf", "av1-1-b10-00-quantizer-13.ivf", - "av1-1-b10-00-quantizer-14.ivf", "av1-1-b10-00-quantizer-15.ivf", - "av1-1-b10-00-quantizer-16.ivf", "av1-1-b10-00-quantizer-17.ivf", - "av1-1-b10-00-quantizer-18.ivf", "av1-1-b10-00-quantizer-19.ivf", - "av1-1-b10-00-quantizer-20.ivf", "av1-1-b10-00-quantizer-21.ivf", - "av1-1-b10-00-quantizer-22.ivf", "av1-1-b10-00-quantizer-23.ivf", - "av1-1-b10-00-quantizer-24.ivf", "av1-1-b10-00-quantizer-25.ivf", - "av1-1-b10-00-quantizer-26.ivf", "av1-1-b10-00-quantizer-27.ivf", - "av1-1-b10-00-quantizer-28.ivf", "av1-1-b10-00-quantizer-29.ivf", - "av1-1-b10-00-quantizer-30.ivf", "av1-1-b10-00-quantizer-31.ivf", - "av1-1-b10-00-quantizer-32.ivf", "av1-1-b10-00-quantizer-33.ivf", - "av1-1-b10-00-quantizer-34.ivf", "av1-1-b10-00-quantizer-35.ivf", - "av1-1-b10-00-quantizer-36.ivf", "av1-1-b10-00-quantizer-37.ivf", - "av1-1-b10-00-quantizer-38.ivf", "av1-1-b10-00-quantizer-39.ivf", - "av1-1-b10-00-quantizer-40.ivf", "av1-1-b10-00-quantizer-41.ivf", - "av1-1-b10-00-quantizer-42.ivf", "av1-1-b10-00-quantizer-43.ivf", - "av1-1-b10-00-quantizer-44.ivf", "av1-1-b10-00-quantizer-45.ivf", - "av1-1-b10-00-quantizer-46.ivf", "av1-1-b10-00-quantizer-47.ivf", - "av1-1-b10-00-quantizer-48.ivf", "av1-1-b10-00-quantizer-49.ivf", - "av1-1-b10-00-quantizer-50.ivf", "av1-1-b10-00-quantizer-51.ivf", - "av1-1-b10-00-quantizer-52.ivf", "av1-1-b10-00-quantizer-53.ivf", - "av1-1-b10-00-quantizer-54.ivf", "av1-1-b10-00-quantizer-55.ivf", - "av1-1-b10-00-quantizer-56.ivf", "av1-1-b10-00-quantizer-57.ivf", - "av1-1-b10-00-quantizer-58.ivf", "av1-1-b10-00-quantizer-59.ivf", - "av1-1-b10-00-quantizer-60.ivf", "av1-1-b10-00-quantizer-61.ivf", - "av1-1-b10-00-quantizer-62.ivf", "av1-1-b10-00-quantizer-63.ivf", - "av1-1-b8-01-size-16x16.ivf", "av1-1-b8-01-size-16x18.ivf", - "av1-1-b8-01-size-16x32.ivf", "av1-1-b8-01-size-16x34.ivf", - "av1-1-b8-01-size-16x64.ivf", "av1-1-b8-01-size-16x66.ivf", - "av1-1-b8-01-size-18x16.ivf", "av1-1-b8-01-size-18x18.ivf", - "av1-1-b8-01-size-18x32.ivf", "av1-1-b8-01-size-18x34.ivf", - "av1-1-b8-01-size-18x64.ivf", "av1-1-b8-01-size-18x66.ivf", - "av1-1-b8-01-size-196x196.ivf", "av1-1-b8-01-size-196x198.ivf", - "av1-1-b8-01-size-196x200.ivf", "av1-1-b8-01-size-196x202.ivf", - "av1-1-b8-01-size-196x208.ivf", "av1-1-b8-01-size-196x210.ivf", - "av1-1-b8-01-size-196x224.ivf", "av1-1-b8-01-size-196x226.ivf", - "av1-1-b8-01-size-198x196.ivf", "av1-1-b8-01-size-198x198.ivf", - "av1-1-b8-01-size-198x200.ivf", "av1-1-b8-01-size-198x202.ivf", - "av1-1-b8-01-size-198x208.ivf", "av1-1-b8-01-size-198x210.ivf", - "av1-1-b8-01-size-198x224.ivf", "av1-1-b8-01-size-198x226.ivf", - "av1-1-b8-01-size-200x196.ivf", "av1-1-b8-01-size-200x198.ivf", - "av1-1-b8-01-size-200x200.ivf", "av1-1-b8-01-size-200x202.ivf", - "av1-1-b8-01-size-200x208.ivf", "av1-1-b8-01-size-200x210.ivf", - "av1-1-b8-01-size-200x224.ivf", "av1-1-b8-01-size-200x226.ivf", - "av1-1-b8-01-size-202x196.ivf", "av1-1-b8-01-size-202x198.ivf", - "av1-1-b8-01-size-202x200.ivf", "av1-1-b8-01-size-202x202.ivf", - "av1-1-b8-01-size-202x208.ivf", "av1-1-b8-01-size-202x210.ivf", - "av1-1-b8-01-size-202x224.ivf", "av1-1-b8-01-size-202x226.ivf", - "av1-1-b8-01-size-208x196.ivf", "av1-1-b8-01-size-208x198.ivf", - "av1-1-b8-01-size-208x200.ivf", "av1-1-b8-01-size-208x202.ivf", - "av1-1-b8-01-size-208x208.ivf", "av1-1-b8-01-size-208x210.ivf", - "av1-1-b8-01-size-208x224.ivf", "av1-1-b8-01-size-208x226.ivf", - "av1-1-b8-01-size-210x196.ivf", "av1-1-b8-01-size-210x198.ivf", - "av1-1-b8-01-size-210x200.ivf", "av1-1-b8-01-size-210x202.ivf", - "av1-1-b8-01-size-210x208.ivf", "av1-1-b8-01-size-210x210.ivf", - "av1-1-b8-01-size-210x224.ivf", "av1-1-b8-01-size-210x226.ivf", - "av1-1-b8-01-size-224x196.ivf", "av1-1-b8-01-size-224x198.ivf", - "av1-1-b8-01-size-224x200.ivf", "av1-1-b8-01-size-224x202.ivf", - "av1-1-b8-01-size-224x208.ivf", "av1-1-b8-01-size-224x210.ivf", - "av1-1-b8-01-size-224x224.ivf", "av1-1-b8-01-size-224x226.ivf", - "av1-1-b8-01-size-226x196.ivf", "av1-1-b8-01-size-226x198.ivf", - "av1-1-b8-01-size-226x200.ivf", "av1-1-b8-01-size-226x202.ivf", - "av1-1-b8-01-size-226x208.ivf", "av1-1-b8-01-size-226x210.ivf", - "av1-1-b8-01-size-226x224.ivf", "av1-1-b8-01-size-226x226.ivf", - "av1-1-b8-01-size-32x16.ivf", "av1-1-b8-01-size-32x18.ivf", - "av1-1-b8-01-size-32x32.ivf", "av1-1-b8-01-size-32x34.ivf", - "av1-1-b8-01-size-32x64.ivf", "av1-1-b8-01-size-32x66.ivf", - "av1-1-b8-01-size-34x16.ivf", "av1-1-b8-01-size-34x18.ivf", - "av1-1-b8-01-size-34x32.ivf", "av1-1-b8-01-size-34x34.ivf", - "av1-1-b8-01-size-34x64.ivf", "av1-1-b8-01-size-34x66.ivf", - "av1-1-b8-01-size-64x16.ivf", "av1-1-b8-01-size-64x18.ivf", - "av1-1-b8-01-size-64x32.ivf", "av1-1-b8-01-size-64x34.ivf", - "av1-1-b8-01-size-64x64.ivf", "av1-1-b8-01-size-64x66.ivf", - "av1-1-b8-01-size-66x16.ivf", "av1-1-b8-01-size-66x18.ivf", - "av1-1-b8-01-size-66x32.ivf", "av1-1-b8-01-size-66x34.ivf", - "av1-1-b8-01-size-66x64.ivf", "av1-1-b8-01-size-66x66.ivf", - "av1-1-b8-02-allintra.ivf", "av1-1-b8-03-sizedown.mkv", - "av1-1-b8-03-sizeup.mkv" -}; -const int kNumAV1TestVectors = NELEMENTS(kAV1TestVectors); -#endif // CONFIG_AV1_DECODER - -} // namespace libaom_test diff --git a/third_party/aom/test/test_vectors.h b/third_party/aom/test/test_vectors.h deleted file mode 100644 index be37f6e37..000000000 --- a/third_party/aom/test/test_vectors.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_TEST_VECTORS_H_ -#define AOM_TEST_TEST_VECTORS_H_ - -#include "config/aom_config.h" - -namespace libaom_test { - -#if CONFIG_AV1_DECODER -extern const int kNumAV1TestVectors; -extern const char *const kAV1TestVectors[]; -#endif - -} // namespace libaom_test - -#endif // AOM_TEST_TEST_VECTORS_H_ diff --git a/third_party/aom/test/tile_independence_test.cc b/third_party/aom/test/tile_independence_test.cc deleted file mode 100644 index cf534c0c5..000000000 --- a/third_party/aom/test/tile_independence_test.cc +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdio> -#include <cstdlib> -#include <string> -#include "third_party/googletest/src/googletest/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" -#include "test/md5_helper.h" -#include "aom_mem/aom_mem.h" - -namespace { -class TileIndependenceTest - : public ::libaom_test::CodecTestWith3Params<int, int, int>, - public ::libaom_test::EncoderTest { - protected: - TileIndependenceTest() - : EncoderTest(GET_PARAM(0)), md5_fw_order_(), md5_inv_order_(), - n_tile_cols_(GET_PARAM(1)), n_tile_rows_(GET_PARAM(2)), - n_tile_groups_(GET_PARAM(3)) { - init_flags_ = AOM_CODEC_USE_PSNR; - aom_codec_dec_cfg_t cfg = aom_codec_dec_cfg_t(); - cfg.w = 704; - cfg.h = 576; - cfg.threads = 1; - cfg.allow_lowbitdepth = 1; - fw_dec_ = codec_->CreateDecoder(cfg, 0); - inv_dec_ = codec_->CreateDecoder(cfg, 0); - inv_dec_->Control(AV1_INVERT_TILE_DECODE_ORDER, 1); - - if (fw_dec_->IsAV1() && inv_dec_->IsAV1()) { - fw_dec_->Control(AV1_SET_DECODE_TILE_ROW, -1); - fw_dec_->Control(AV1_SET_DECODE_TILE_COL, -1); - inv_dec_->Control(AV1_SET_DECODE_TILE_ROW, -1); - inv_dec_->Control(AV1_SET_DECODE_TILE_COL, -1); - } - } - - virtual ~TileIndependenceTest() { - delete fw_dec_; - delete inv_dec_; - } - - virtual void SetUp() { - InitializeConfig(); - SetMode(libaom_test::kTwoPassGood); - } - - virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, - libaom_test::Encoder *encoder) { - if (video->frame() == 1) { - encoder->Control(AV1E_SET_TILE_COLUMNS, n_tile_cols_); - encoder->Control(AV1E_SET_TILE_ROWS, n_tile_rows_); - SetCpuUsed(encoder); - } else if (video->frame() == 3) { - encoder->Control(AV1E_SET_NUM_TG, n_tile_groups_); - } - } - - virtual void SetCpuUsed(libaom_test::Encoder *encoder) { - static const int kCpuUsed = 3; - encoder->Control(AOME_SET_CPUUSED, kCpuUsed); - } - - void UpdateMD5(::libaom_test::Decoder *dec, const aom_codec_cx_pkt_t *pkt, - ::libaom_test::MD5 *md5) { - const aom_codec_err_t res = dec->DecodeFrame( - reinterpret_cast<uint8_t *>(pkt->data.frame.buf), pkt->data.frame.sz); - if (res != AOM_CODEC_OK) { - abort_ = true; - ASSERT_EQ(AOM_CODEC_OK, res); - } - const aom_image_t *img = dec->GetDxData().Next(); - md5->Add(img); - } - - virtual void FramePktHook(const aom_codec_cx_pkt_t *pkt) { - UpdateMD5(fw_dec_, pkt, &md5_fw_order_); - UpdateMD5(inv_dec_, pkt, &md5_inv_order_); - } - - void DoTest() { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 500; - cfg_.g_lag_in_frames = 12; - cfg_.rc_end_usage = AOM_VBR; - - libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 704, 576, - timebase.den, timebase.num, 0, 5); - ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); - - const char *md5_fw_str = md5_fw_order_.Get(); - const char *md5_inv_str = md5_inv_order_.Get(); - ASSERT_STREQ(md5_fw_str, md5_inv_str); - } - - ::libaom_test::MD5 md5_fw_order_, md5_inv_order_; - ::libaom_test::Decoder *fw_dec_, *inv_dec_; - - private: - int n_tile_cols_; - int n_tile_rows_; - int n_tile_groups_; -}; - -// run an encode with 2 or 4 tiles, and do the decode both in normal and -// inverted tile ordering. Ensure that the MD5 of the output in both cases -// is identical. If so, tiles are considered independent and the test passes. -TEST_P(TileIndependenceTest, MD5Match) { - cfg_.large_scale_tile = 0; - fw_dec_->Control(AV1_SET_TILE_MODE, 0); - inv_dec_->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -class TileIndependenceTestLarge : public TileIndependenceTest { - virtual void SetCpuUsed(libaom_test::Encoder *encoder) { - static const int kCpuUsed = 0; - encoder->Control(AOME_SET_CPUUSED, kCpuUsed); - } -}; - -TEST_P(TileIndependenceTestLarge, MD5Match) { - cfg_.large_scale_tile = 0; - fw_dec_->Control(AV1_SET_TILE_MODE, 0); - inv_dec_->Control(AV1_SET_TILE_MODE, 0); - DoTest(); -} - -AV1_INSTANTIATE_TEST_CASE(TileIndependenceTest, ::testing::Values(0, 1), - ::testing::Values(0, 1), ::testing::Values(1, 2, 4)); -AV1_INSTANTIATE_TEST_CASE(TileIndependenceTestLarge, ::testing::Values(0, 1), - ::testing::Values(0, 1), ::testing::Values(1, 2, 4)); - -class TileIndependenceLSTest : public TileIndependenceTest {}; - -TEST_P(TileIndependenceLSTest, MD5Match) { - cfg_.large_scale_tile = 1; - fw_dec_->Control(AV1_SET_TILE_MODE, 1); - fw_dec_->Control(AV1D_EXT_TILE_DEBUG, 1); - inv_dec_->Control(AV1_SET_TILE_MODE, 1); - inv_dec_->Control(AV1D_EXT_TILE_DEBUG, 1); - DoTest(); -} - -class TileIndependenceLSTestLarge : public TileIndependenceTestLarge {}; - -TEST_P(TileIndependenceLSTestLarge, MD5Match) { - cfg_.large_scale_tile = 1; - fw_dec_->Control(AV1_SET_TILE_MODE, 1); - fw_dec_->Control(AV1D_EXT_TILE_DEBUG, 1); - inv_dec_->Control(AV1_SET_TILE_MODE, 1); - inv_dec_->Control(AV1D_EXT_TILE_DEBUG, 1); - DoTest(); -} - -AV1_INSTANTIATE_TEST_CASE(TileIndependenceLSTest, ::testing::Values(6), - ::testing::Values(6), ::testing::Values(1)); -AV1_INSTANTIATE_TEST_CASE(TileIndependenceLSTestLarge, ::testing::Values(6), - ::testing::Values(6), ::testing::Values(1)); -} // namespace diff --git a/third_party/aom/test/tools_common.sh b/third_party/aom/test/tools_common.sh deleted file mode 100755 index c08710606..000000000 --- a/third_party/aom/test/tools_common.sh +++ /dev/null @@ -1,477 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file contains shell code shared by test scripts for libaom tools. - -# Use $AOM_TEST_TOOLS_COMMON_SH as a pseudo include guard. -if [ -z "${AOM_TEST_TOOLS_COMMON_SH}" ]; then -AOM_TEST_TOOLS_COMMON_SH=included - -set -e -devnull='> /dev/null 2>&1' -AOM_TEST_PREFIX="" - -elog() { - echo "$@" 1>&2 -} - -vlog() { - if [ "${AOM_TEST_VERBOSE_OUTPUT}" = "yes" ]; then - echo "$@" - fi -} - -# Sets $AOM_TOOL_TEST to the name specified by positional parameter one. -test_begin() { - AOM_TOOL_TEST="${1}" -} - -# Clears the AOM_TOOL_TEST variable after confirming that $AOM_TOOL_TEST matches -# positional parameter one. -test_end() { - if [ "$1" != "${AOM_TOOL_TEST}" ]; then - echo "FAIL completed test mismatch!." - echo " completed test: ${1}" - echo " active test: ${AOM_TOOL_TEST}." - return 1 - fi - AOM_TOOL_TEST='<unset>' -} - -# Echoes the target configuration being tested. -test_configuration_target() { - aom_config_c="${LIBAOM_CONFIG_PATH}/config/aom_config.c" - # Clean up the cfg pointer line from aom_config.c for easier re-use by - # someone examining a failure in the example tests. - # 1. Run grep on aom_config.c for cfg and limit the results to 1. - # 2. Split the line using ' = ' as separator. - # 3. Abuse sed to consume the leading " and trailing "; from the assignment - # to the cfg pointer. - cmake_config=$(awk -F ' = ' '/cfg/ { print $NF; exit }' "${aom_config_c}" \ - | sed -e s/\"// -e s/\"\;//) - echo cmake generated via command: cmake path/to/aom ${cmake_config} -} - -# Trap function used for failure reports and tool output directory removal. -# When the contents of $AOM_TOOL_TEST do not match the string '<unset>', reports -# failure of test stored in $AOM_TOOL_TEST. -cleanup() { - if [ -n "${AOM_TOOL_TEST}" ] && [ "${AOM_TOOL_TEST}" != '<unset>' ]; then - echo "FAIL: $AOM_TOOL_TEST" - fi - if [ "${AOM_TEST_PRESERVE_OUTPUT}" = "yes" ]; then - return - fi - if [ -n "${AOM_TEST_OUTPUT_DIR}" ] && [ -d "${AOM_TEST_OUTPUT_DIR}" ]; then - rm -rf "${AOM_TEST_OUTPUT_DIR}" - fi -} - -# Echoes the version string assigned to the VERSION_STRING_NOSP variable defined -# in $LIBAOM_CONFIG_PATH/config/aom_version.h to stdout. -cmake_version() { - aom_version_h="${LIBAOM_CONFIG_PATH}/config/aom_version.h" - - # Find VERSION_STRING_NOSP line, split it with '"' and print the next to last - # field to output the version string to stdout. - aom_version=$(awk -F \" '/VERSION_STRING_NOSP/ {print $(NF-1)}' \ - "${aom_version_h}") - echo "v${aom_version}" -} - -# Echoes current git version as reported by running 'git describe', or the -# version used by the cmake build when git is unavailable. -source_version() { - if git --version > /dev/null 2>&1; then - (cd "$(dirname "${0}")" - git describe) - else - cmake_version - fi -} - -# Echoes warnings to stdout when source version and CMake build generated -# version are out of sync. -check_version_strings() { - cmake_version=$(cmake_version) - source_version=$(source_version) - - if [ "${cmake_version}" != "${source_version}" ]; then - echo "Warning: version has changed since last cmake run." - vlog " cmake version: ${cmake_version} version now: ${source_version}" - fi -} - -# $1 is the name of an environment variable containing a directory name to -# test. -test_env_var_dir() { - local dir=$(eval echo "\${$1}") - if [ ! -d "${dir}" ]; then - elog "'${dir}': No such directory" - elog "The $1 environment variable must be set to a valid directory." - return 1 - fi -} - -# This script requires that the LIBAOM_BIN_PATH, LIBAOM_CONFIG_PATH, and -# LIBAOM_TEST_DATA_PATH variables are in the environment: Confirm that -# the variables are set and that they all evaluate to directory paths. -verify_aom_test_environment() { - test_env_var_dir "LIBAOM_BIN_PATH" \ - && test_env_var_dir "LIBAOM_CONFIG_PATH" \ - && test_env_var_dir "LIBAOM_TEST_DATA_PATH" -} - -# Greps aom_config.h in LIBAOM_CONFIG_PATH for positional parameter one, which -# should be a LIBAOM preprocessor flag. Echoes yes to stdout when the feature -# is available. -aom_config_option_enabled() { - aom_config_option="${1}" - aom_config_file="${LIBAOM_CONFIG_PATH}/config/aom_config.h" - config_line=$(grep "${aom_config_option}" "${aom_config_file}") - if echo "${config_line}" | egrep -q '1$'; then - echo yes - fi -} - -# Echoes yes when output of test_configuration_target() contains win32 or win64. -is_windows_target() { - if test_configuration_target \ - | grep -q -e win32 -e win64 > /dev/null 2>&1; then - echo yes - fi -} - -# Echoes path to $1 when it's executable and exists in one of the directories -# included in $tool_paths, or an empty string. Caller is responsible for testing -# the string once the function returns. -aom_tool_path() { - local tool_name="$1" - local root_path="${LIBAOM_BIN_PATH}" - local suffix="${AOM_TEST_EXE_SUFFIX}" - local tool_paths="\ - ${root_path}/${tool_name}${suffix} \ - ${root_path}/../${tool_name}${suffix} \ - ${root_path}/tools/${tool_name}${suffix} \ - ${root_path}/../tools/${tool_name}${suffix}" - - local toolpath="" - - for tool_path in ${tool_paths}; do - if [ -x "${tool_path}" ] && [ -f "${tool_path}" ]; then - echo "${tool_path}" - return 0 - fi - done - - return 1 -} - -# Echoes yes to stdout when the file named by positional parameter one exists -# in LIBAOM_BIN_PATH, and is executable. -aom_tool_available() { - local tool_name="$1" - local tool="${LIBAOM_BIN_PATH}/${tool_name}${AOM_TEST_EXE_SUFFIX}" - [ -x "${tool}" ] && echo yes -} - -# Echoes yes to stdout when aom_config_option_enabled() reports yes for -# CONFIG_AV1_DECODER. -av1_decode_available() { - [ "$(aom_config_option_enabled CONFIG_AV1_DECODER)" = "yes" ] && echo yes -} - -# Echoes yes to stdout when aom_config_option_enabled() reports yes for -# CONFIG_AV1_ENCODER. -av1_encode_available() { - [ "$(aom_config_option_enabled CONFIG_AV1_ENCODER)" = "yes" ] && echo yes -} - -# Echoes "fast" encode params for use with aomenc. -aomenc_encode_test_fast_params() { - echo "--cpu-used=1 - --limit=${AV1_ENCODE_TEST_FRAME_LIMIT} - --lag-in-frames=0 - --test-decode=fatal" -} - -# Echoes yes to stdout when aom_config_option_enabled() reports yes for -# CONFIG_WEBM_IO. -webm_io_available() { - [ "$(aom_config_option_enabled CONFIG_WEBM_IO)" = "yes" ] && echo yes -} - -# Filters strings from $1 using the filter specified by $2. Filter behavior -# depends on the presence of $3. When $3 is present, strings that match the -# filter are excluded. When $3 is omitted, strings matching the filter are -# included. -# The filtered result is echoed to stdout. -filter_strings() { - strings=${1} - filter=${2} - exclude=${3} - - if [ -n "${exclude}" ]; then - # When positional parameter three exists the caller wants to remove strings. - # Tell grep to invert matches using the -v argument. - exclude='-v' - else - unset exclude - fi - - if [ -n "${filter}" ]; then - for s in ${strings}; do - if echo "${s}" | egrep -q ${exclude} "${filter}" > /dev/null 2>&1; then - filtered_strings="${filtered_strings} ${s}" - fi - done - else - filtered_strings="${strings}" - fi - echo "${filtered_strings}" -} - -# Runs user test functions passed via positional parameters one and two. -# Functions in positional parameter one are treated as environment verification -# functions and are run unconditionally. Functions in positional parameter two -# are run according to the rules specified in aom_test_usage(). -run_tests() { - local env_tests="verify_aom_test_environment $1" - local tests_to_filter="$2" - local test_name="${AOM_TEST_NAME}" - - if [ -z "${test_name}" ]; then - test_name="$(basename "${0%.*}")" - fi - - if [ "${AOM_TEST_RUN_DISABLED_TESTS}" != "yes" ]; then - # Filter out DISABLED tests. - tests_to_filter=$(filter_strings "${tests_to_filter}" ^DISABLED exclude) - fi - - if [ -n "${AOM_TEST_FILTER}" ]; then - # Remove tests not matching the user's filter. - tests_to_filter=$(filter_strings "${tests_to_filter}" ${AOM_TEST_FILTER}) - fi - - # User requested test listing: Dump test names and return. - if [ "${AOM_TEST_LIST_TESTS}" = "yes" ]; then - for test_name in $tests_to_filter; do - echo ${test_name} - done - return - fi - - # Don't bother with the environment tests if everything else was disabled. - [ -z "${tests_to_filter}" ] && return - - # Combine environment and actual tests. - local tests_to_run="${env_tests} ${tests_to_filter}" - - check_version_strings - - # Run tests. - for test in ${tests_to_run}; do - test_begin "${test}" - vlog " RUN ${test}" - "${test}" - vlog " PASS ${test}" - test_end "${test}" - done - - local tested_config="$(test_configuration_target) @ $(source_version)" - echo "${test_name}: Done, all tests pass for ${tested_config}." -} - -aom_test_usage() { -cat << EOF - Usage: ${0##*/} [arguments] - --bin-path <path to libaom binaries directory> - --config-path <path to libaom config directory> - --filter <filter>: User test filter. Only tests matching filter are run. - --run-disabled-tests: Run disabled tests. - --help: Display this message and exit. - --test-data-path <path to libaom 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. - --list-tests: List all test names and exit without actually running tests. - --verbose: Verbose output. - - When the --bin-path option is not specified the script attempts to use - \$LIBAOM_BIN_PATH and then the current directory. - - When the --config-path option is not specified the script attempts to use - \$LIBAOM_CONFIG_PATH and then the current directory. - - When the -test-data-path option is not specified the script attempts to use - \$LIBAOM_TEST_DATA_PATH and then the current directory. -EOF -} - -# Returns non-zero (failure) when required environment variables are empty -# strings. -aom_test_check_environment() { - if [ -z "${LIBAOM_BIN_PATH}" ] || \ - [ -z "${LIBAOM_CONFIG_PATH}" ] || \ - [ -z "${LIBAOM_TEST_DATA_PATH}" ]; then - return 1 - fi -} - -# Echo aomenc command line parameters allowing use of a raw yuv file as -# input to aomenc. -yuv_raw_input() { - echo ""${YUV_RAW_INPUT}" - --width="${YUV_RAW_INPUT_WIDTH}" - --height="${YUV_RAW_INPUT_HEIGHT}"" -} - -# Do a small encode for testing decoders. -encode_yuv_raw_input_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - local output="$1" - local encoder="$(aom_tool_path aomenc)" - shift - eval "${encoder}" $(yuv_raw_input) \ - $(aomenc_encode_test_fast_params) \ - --output="${output}" \ - $@ \ - ${devnull} - - if [ ! -e "${output}" ]; then - elog "Output file does not exist." - return 1 - fi - fi -} - -# Parse the command line. -while [ -n "$1" ]; do - case "$1" in - --bin-path) - LIBAOM_BIN_PATH="$2" - shift - ;; - --config-path) - LIBAOM_CONFIG_PATH="$2" - shift - ;; - --filter) - AOM_TEST_FILTER="$2" - shift - ;; - --run-disabled-tests) - AOM_TEST_RUN_DISABLED_TESTS=yes - ;; - --help) - aom_test_usage - exit - ;; - --test-data-path) - LIBAOM_TEST_DATA_PATH="$2" - shift - ;; - --prefix) - AOM_TEST_PREFIX="$2" - shift - ;; - --verbose) - AOM_TEST_VERBOSE_OUTPUT=yes - ;; - --show-program-output) - devnull= - ;; - --list-tests) - AOM_TEST_LIST_TESTS=yes - ;; - *) - aom_test_usage - exit 1 - ;; - esac - shift -done - -# Handle running the tests from a build directory without arguments when running -# the tests on *nix/macosx. -LIBAOM_BIN_PATH="${LIBAOM_BIN_PATH:-.}" -LIBAOM_CONFIG_PATH="${LIBAOM_CONFIG_PATH:-.}" -LIBAOM_TEST_DATA_PATH="${LIBAOM_TEST_DATA_PATH:-.}" - -# Create a temporary directory for output files, and a trap to clean it up. -if [ -n "${TMPDIR}" ]; then - AOM_TEST_TEMP_ROOT="${TMPDIR}" -elif [ -n "${TEMPDIR}" ]; then - AOM_TEST_TEMP_ROOT="${TEMPDIR}" -else - AOM_TEST_TEMP_ROOT=/tmp -fi - -AOM_TEST_OUTPUT_DIR="${AOM_TEST_OUTPUT_DIR:-${AOM_TEST_TEMP_ROOT}/aom_test_$$}" - -if ! mkdir -p "${AOM_TEST_OUTPUT_DIR}" || \ - [ ! -d "${AOM_TEST_OUTPUT_DIR}" ]; then - echo "${0##*/}: Cannot create output directory, giving up." - echo "${0##*/}: AOM_TEST_OUTPUT_DIR=${AOM_TEST_OUTPUT_DIR}" - exit 1 -fi - -AOM_TEST_PRESERVE_OUTPUT=${AOM_TEST_PRESERVE_OUTPUT:-no} - -if [ "$(is_windows_target)" = "yes" ]; then - AOM_TEST_EXE_SUFFIX=".exe" -fi - -# Variables shared by tests. -AV1_ENCODE_CPU_USED=${AV1_ENCODE_CPU_USED:-1} -AV1_ENCODE_TEST_FRAME_LIMIT=${AV1_ENCODE_TEST_FRAME_LIMIT:-5} -AV1_IVF_FILE="${AV1_IVF_FILE:-${AOM_TEST_OUTPUT_DIR}/av1.ivf}" -AV1_OBU_ANNEXB_FILE="${AV1_OBU_ANNEXB_FILE:-${AOM_TEST_OUTPUT_DIR}/av1.annexb.obu}" -AV1_OBU_SEC5_FILE="${AV1_OBU_SEC5_FILE:-${AOM_TEST_OUTPUT_DIR}/av1.section5.obu}" -AV1_WEBM_FILE="${AV1_WEBM_FILE:-${AOM_TEST_OUTPUT_DIR}/av1.webm}" - -YUV_RAW_INPUT="${LIBAOM_TEST_DATA_PATH}/hantro_collage_w352h288.yuv" -YUV_RAW_INPUT_WIDTH=352 -YUV_RAW_INPUT_HEIGHT=288 - -Y4M_NOSQ_PAR_INPUT="${LIBAOM_TEST_DATA_PATH}/park_joy_90p_8_420_a10-1.y4m" -Y4M_720P_INPUT="${LIBAOM_TEST_DATA_PATH}/niklas_1280_720_30.y4m" - -# Setup a trap function to clean up after tests complete. -trap cleanup EXIT - -vlog "$(basename "${0%.*}") test configuration: - LIBAOM_BIN_PATH=${LIBAOM_BIN_PATH} - LIBAOM_CONFIG_PATH=${LIBAOM_CONFIG_PATH} - LIBAOM_TEST_DATA_PATH=${LIBAOM_TEST_DATA_PATH} - AOM_TEST_EXE_SUFFIX=${AOM_TEST_EXE_SUFFIX} - AOM_TEST_FILTER=${AOM_TEST_FILTER} - AOM_TEST_LIST_TESTS=${AOM_TEST_LIST_TESTS} - AOM_TEST_OUTPUT_DIR=${AOM_TEST_OUTPUT_DIR} - AOM_TEST_PREFIX=${AOM_TEST_PREFIX} - AOM_TEST_PRESERVE_OUTPUT=${AOM_TEST_PRESERVE_OUTPUT} - AOM_TEST_RUN_DISABLED_TESTS=${AOM_TEST_RUN_DISABLED_TESTS} - AOM_TEST_SHOW_PROGRAM_OUTPUT=${AOM_TEST_SHOW_PROGRAM_OUTPUT} - AOM_TEST_TEMP_ROOT=${AOM_TEST_TEMP_ROOT} - AOM_TEST_VERBOSE_OUTPUT=${AOM_TEST_VERBOSE_OUTPUT} - AV1_ENCODE_CPU_USED=${AV1_ENCODE_CPU_USED} - AV1_ENCODE_TEST_FRAME_LIMIT=${AV1_ENCODE_TEST_FRAME_LIMIT} - AV1_IVF_FILE=${AV1_IVF_FILE} - AV1_OBU_ANNEXB_FILE=${AV1_OBU_ANNEXB_FILE} - AV1_OBU_SEC5_FILE=${AV1_OBU_SEC5_FILE} - AV1_WEBM_FILE=${AV1_WEBM_FILE} - YUV_RAW_INPUT=${YUV_RAW_INPUT} - YUV_RAW_INPUT_WIDTH=${YUV_RAW_INPUT_WIDTH} - YUV_RAW_INPUT_HEIGHT=${YUV_RAW_INPUT_HEIGHT} - Y4M_NOSQ_PAR_INPUT=${Y4M_NOSQ_PAR_INPUT}" - -fi # End $AOM_TEST_TOOLS_COMMON_SH pseudo include guard. diff --git a/third_party/aom/test/transform_test_base.h b/third_party/aom/test/transform_test_base.h deleted file mode 100644 index 8ebcf5ff7..000000000 --- a/third_party/aom/test/transform_test_base.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_TRANSFORM_TEST_BASE_H_ -#define AOM_TEST_TRANSFORM_TEST_BASE_H_ - -#include "config/aom_config.h" - -#include "aom_mem/aom_mem.h" -#include "aom/aom_codec.h" -#include "aom_dsp/txfm_common.h" - -namespace libaom_test { - -// Note: -// Same constant are defined in av1/common/av1_entropy.h and -// av1/common/entropy.h. Goal is to make this base class -// to use for future codec transform testing. But including -// either of them would lead to compiling error when we do -// unit test for another codec. Suggest to move the definition -// to a aom header file. -const int kDctMaxValue = 16384; - -typedef void (*FhtFunc)(const int16_t *in, tran_low_t *out, int stride, - TxfmParam *txfm_param); - -typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride, - const TxfmParam *txfm_param); - -class TransformTestBase { - public: - virtual ~TransformTestBase() {} - - protected: - virtual void RunFwdTxfm(const int16_t *in, tran_low_t *out, int stride) = 0; - - virtual void RunInvTxfm(const tran_low_t *out, uint8_t *dst, int stride) = 0; - - void RunAccuracyCheck(uint32_t ref_max_error, double ref_avg_error) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - uint32_t max_error = 0; - int64_t total_error = 0; - const int count_test_block = 10000; - - int16_t *test_input_block = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(int16_t) * num_coeffs_)); - tran_low_t *test_temp_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - uint8_t *dst = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * num_coeffs_)); - uint8_t *src = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * num_coeffs_)); - uint16_t *dst16 = reinterpret_cast<uint16_t *>( - aom_memalign(16, sizeof(uint16_t) * num_coeffs_)); - uint16_t *src16 = reinterpret_cast<uint16_t *>( - aom_memalign(16, sizeof(uint16_t) * num_coeffs_)); - - for (int i = 0; i < count_test_block; ++i) { - // Initialize a test block with input range [-255, 255]. - for (int j = 0; j < num_coeffs_; ++j) { - if (bit_depth_ == AOM_BITS_8) { - src[j] = rnd.Rand8(); - dst[j] = rnd.Rand8(); - test_input_block[j] = src[j] - dst[j]; - } else { - src16[j] = rnd.Rand16() & mask_; - dst16[j] = rnd.Rand16() & mask_; - test_input_block[j] = src16[j] - dst16[j]; - } - } - - ASM_REGISTER_STATE_CHECK( - RunFwdTxfm(test_input_block, test_temp_block, pitch_)); - if (bit_depth_ == AOM_BITS_8) { - ASM_REGISTER_STATE_CHECK(RunInvTxfm(test_temp_block, dst, pitch_)); - } else { - ASM_REGISTER_STATE_CHECK( - RunInvTxfm(test_temp_block, CONVERT_TO_BYTEPTR(dst16), pitch_)); - } - - for (int j = 0; j < num_coeffs_; ++j) { - const int diff = - bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; - const uint32_t error = diff * diff; - if (max_error < error) max_error = error; - total_error += error; - } - } - - double avg_error = total_error * 1. / count_test_block / num_coeffs_; - - EXPECT_GE(ref_max_error, max_error) - << "Error: FHT/IHT has an individual round trip error > " - << ref_max_error; - - EXPECT_GE(ref_avg_error, avg_error) - << "Error: FHT/IHT has average round trip error > " << ref_avg_error - << " per block"; - - aom_free(test_input_block); - aom_free(test_temp_block); - aom_free(dst); - aom_free(src); - aom_free(dst16); - aom_free(src16); - } - - void RunCoeffCheck() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int count_test_block = 5000; - - // Use a stride value which is not the width of any transform, to catch - // cases where the transforms use the stride incorrectly. - int stride = 96; - - int16_t *input_block = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(int16_t) * stride * height_)); - tran_low_t *output_ref_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - tran_low_t *output_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - - for (int i = 0; i < count_test_block; ++i) { - int j, k; - for (j = 0; j < height_; ++j) { - for (k = 0; k < pitch_; ++k) { - int in_idx = j * stride + k; - int out_idx = j * pitch_ + k; - input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_); - if (bit_depth_ == AOM_BITS_8) { - output_block[out_idx] = output_ref_block[out_idx] = rnd.Rand8(); - } else { - output_block[out_idx] = output_ref_block[out_idx] = - rnd.Rand16() & mask_; - } - } - } - - fwd_txfm_ref(input_block, output_ref_block, stride, &txfm_param_); - ASM_REGISTER_STATE_CHECK(RunFwdTxfm(input_block, output_block, stride)); - - // The minimum quant value is 4. - for (j = 0; j < height_; ++j) { - for (k = 0; k < pitch_; ++k) { - int out_idx = j * pitch_ + k; - ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx]) - << "Error: not bit-exact result at index: " << out_idx - << " at test block: " << i; - } - } - } - aom_free(input_block); - aom_free(output_ref_block); - aom_free(output_block); - } - - void RunInvCoeffCheck() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int count_test_block = 5000; - - // Use a stride value which is not the width of any transform, to catch - // cases where the transforms use the stride incorrectly. - int stride = 96; - - int16_t *input_block = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(int16_t) * num_coeffs_)); - tran_low_t *trans_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - uint8_t *output_block = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * stride * height_)); - uint8_t *output_ref_block = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * stride * height_)); - - for (int i = 0; i < count_test_block; ++i) { - // Initialize a test block with input range [-mask_, mask_]. - int j, k; - for (j = 0; j < height_; ++j) { - for (k = 0; k < pitch_; ++k) { - int in_idx = j * pitch_ + k; - int out_idx = j * stride + k; - input_block[in_idx] = (rnd.Rand16() & mask_) - (rnd.Rand16() & mask_); - output_ref_block[out_idx] = rnd.Rand16() & mask_; - output_block[out_idx] = output_ref_block[out_idx]; - } - } - - fwd_txfm_ref(input_block, trans_block, pitch_, &txfm_param_); - - inv_txfm_ref(trans_block, output_ref_block, stride, &txfm_param_); - ASM_REGISTER_STATE_CHECK(RunInvTxfm(trans_block, output_block, stride)); - - for (j = 0; j < height_; ++j) { - for (k = 0; k < pitch_; ++k) { - int out_idx = j * stride + k; - ASSERT_EQ(output_block[out_idx], output_ref_block[out_idx]) - << "Error: not bit-exact result at index: " << out_idx - << " j = " << j << " k = " << k << " at test block: " << i; - } - } - } - aom_free(input_block); - aom_free(trans_block); - aom_free(output_ref_block); - aom_free(output_block); - } - - void RunMemCheck() { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int count_test_block = 5000; - - int16_t *input_extreme_block = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(int16_t) * num_coeffs_)); - tran_low_t *output_ref_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - tran_low_t *output_block = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - - for (int i = 0; i < count_test_block; ++i) { - // Initialize a test block with input range [-mask_, mask_]. - for (int j = 0; j < num_coeffs_; ++j) { - input_extreme_block[j] = rnd.Rand8() % 2 ? mask_ : -mask_; - } - if (i == 0) { - for (int j = 0; j < num_coeffs_; ++j) input_extreme_block[j] = mask_; - } else if (i == 1) { - for (int j = 0; j < num_coeffs_; ++j) input_extreme_block[j] = -mask_; - } - - fwd_txfm_ref(input_extreme_block, output_ref_block, pitch_, &txfm_param_); - ASM_REGISTER_STATE_CHECK( - RunFwdTxfm(input_extreme_block, output_block, pitch_)); - - int row_length = FindRowLength(); - // The minimum quant value is 4. - for (int j = 0; j < num_coeffs_; ++j) { - ASSERT_EQ(output_block[j], output_ref_block[j]) - << "Not bit-exact at test index: " << i << ", " - << "j = " << j << std::endl; - EXPECT_GE(row_length * kDctMaxValue << (bit_depth_ - 8), - abs(output_block[j])) - << "Error: NxN FDCT has coefficient larger than N*DCT_MAX_VALUE"; - } - } - aom_free(input_extreme_block); - aom_free(output_ref_block); - aom_free(output_block); - } - - void RunInvAccuracyCheck(int limit) { - ACMRandom rnd(ACMRandom::DeterministicSeed()); - const int count_test_block = 1000; - - int16_t *in = reinterpret_cast<int16_t *>( - aom_memalign(16, sizeof(int16_t) * num_coeffs_)); - tran_low_t *coeff = reinterpret_cast<tran_low_t *>( - aom_memalign(16, sizeof(tran_low_t) * num_coeffs_)); - uint8_t *dst = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * num_coeffs_)); - uint8_t *src = reinterpret_cast<uint8_t *>( - aom_memalign(16, sizeof(uint8_t) * num_coeffs_)); - - uint16_t *dst16 = reinterpret_cast<uint16_t *>( - aom_memalign(16, sizeof(uint16_t) * num_coeffs_)); - uint16_t *src16 = reinterpret_cast<uint16_t *>( - aom_memalign(16, sizeof(uint16_t) * num_coeffs_)); - - for (int i = 0; i < count_test_block; ++i) { - // Initialize a test block with input range [-mask_, mask_]. - for (int j = 0; j < num_coeffs_; ++j) { - if (bit_depth_ == AOM_BITS_8) { - src[j] = rnd.Rand8(); - dst[j] = rnd.Rand8(); - in[j] = src[j] - dst[j]; - } else { - src16[j] = rnd.Rand16() & mask_; - dst16[j] = rnd.Rand16() & mask_; - in[j] = src16[j] - dst16[j]; - } - } - - fwd_txfm_ref(in, coeff, pitch_, &txfm_param_); - - if (bit_depth_ == AOM_BITS_8) { - ASM_REGISTER_STATE_CHECK(RunInvTxfm(coeff, dst, pitch_)); - } else { - ASM_REGISTER_STATE_CHECK( - RunInvTxfm(coeff, CONVERT_TO_BYTEPTR(dst16), pitch_)); - } - - for (int j = 0; j < num_coeffs_; ++j) { - const int diff = - bit_depth_ == AOM_BITS_8 ? dst[j] - src[j] : dst16[j] - src16[j]; - const uint32_t error = diff * diff; - ASSERT_GE(static_cast<uint32_t>(limit), error) - << "Error: 4x4 IDCT has error " << error << " at index " << j; - } - } - aom_free(in); - aom_free(coeff); - aom_free(dst); - aom_free(src); - aom_free(src16); - aom_free(dst16); - } - - int pitch_; - int height_; - FhtFunc fwd_txfm_ref; - IhtFunc inv_txfm_ref; - aom_bit_depth_t bit_depth_; - int mask_; - int num_coeffs_; - TxfmParam txfm_param_; - - private: - // Assume transform size is 4x4, 8x8, 16x16,... - int FindRowLength() const { - int row = 4; - if (16 == num_coeffs_) { - row = 4; - } else if (64 == num_coeffs_) { - row = 8; - } else if (256 == num_coeffs_) { - row = 16; - } else if (1024 == num_coeffs_) { - row = 32; - } - return row; - } -}; - -} // namespace libaom_test - -#endif // AOM_TEST_TRANSFORM_TEST_BASE_H_ diff --git a/third_party/aom/test/twopass_encoder.sh b/third_party/aom/test/twopass_encoder.sh deleted file mode 100755 index cca44ced8..000000000 --- a/third_party/aom/test/twopass_encoder.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -## Copyright (c) 2016, Alliance for Open Media. All rights reserved -## -## This source code is subject to the terms of the BSD 2 Clause License and -## the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -## was not distributed with this source code in the LICENSE file, you can -## obtain it at www.aomedia.org/license/software. If the Alliance for Open -## Media Patent License 1.0 was not distributed with this source code in the -## PATENTS file, you can obtain it at www.aomedia.org/license/patent. -## -## This file tests the libaom twopass_encoder example. To add new tests to this -## file, do the following: -## 1. Write a shell function (this is your test). -## 2. Add the function to twopass_encoder_tests (on a new line). -## -. $(dirname $0)/tools_common.sh - -# Environment check: $YUV_RAW_INPUT is required. -twopass_encoder_verify_environment() { - if [ ! -e "${YUV_RAW_INPUT}" ]; then - echo "Libaom test data must exist in LIBAOM_TEST_DATA_PATH." - return 1 - fi -} - -# Runs twopass_encoder using the codec specified by $1 with a frame limit of -# 100. -twopass_encoder() { - local encoder="$(aom_tool_path twopass_encoder)" - local codec="$1" - local output_file="${AOM_TEST_OUTPUT_DIR}/twopass_encoder_${codec}.ivf" - local limit=7 - - if [ ! -x "${encoder}" ]; then - elog "${encoder} does not exist or is not executable." - return 1 - fi - - eval "${AOM_TEST_PREFIX}" "${encoder}" "${codec}" "${YUV_RAW_INPUT_WIDTH}" \ - "${YUV_RAW_INPUT_HEIGHT}" "${YUV_RAW_INPUT}" "${output_file}" "${limit}" \ - ${devnull} - - [ -e "${output_file}" ] || return 1 -} - -twopass_encoder_av1() { - if [ "$(av1_encode_available)" = "yes" ]; then - twopass_encoder av1 || return 1 - fi -} - -twopass_encoder_tests="twopass_encoder_av1" - -run_tests twopass_encoder_verify_environment "${twopass_encoder_tests}" diff --git a/third_party/aom/test/util.h b/third_party/aom/test/util.h deleted file mode 100644 index c3f4e4442..000000000 --- a/third_party/aom/test/util.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_UTIL_H_ -#define AOM_TEST_UTIL_H_ - -#include <stdio.h> -#include <math.h> -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "aom/aom_integer.h" -#include "aom/aom_image.h" -#include "aom_ports/aom_timer.h" - -// Macros -#define GET_PARAM(k) ::testing::get<k>(GetParam()) - -inline double compute_psnr(const aom_image_t *img1, const aom_image_t *img2) { - assert((img1->fmt == img2->fmt) && (img1->d_w == img2->d_w) && - (img1->d_h == img2->d_h)); - - const unsigned int width_y = img1->d_w; - const unsigned int height_y = img1->d_h; - unsigned int i, j; - - int64_t sqrerr = 0; - for (i = 0; i < height_y; ++i) - for (j = 0; j < width_y; ++j) { - int64_t d = img1->planes[AOM_PLANE_Y][i * img1->stride[AOM_PLANE_Y] + j] - - img2->planes[AOM_PLANE_Y][i * img2->stride[AOM_PLANE_Y] + j]; - sqrerr += d * d; - } - double mse = static_cast<double>(sqrerr) / (width_y * height_y); - double psnr = 100.0; - if (mse > 0.0) { - psnr = 10 * log10(255.0 * 255.0 / mse); - } - return psnr; -} - -static INLINE double get_time_mark(aom_usec_timer *t) { - aom_usec_timer_mark(t); - return static_cast<double>(aom_usec_timer_elapsed(t)); -} - -#endif // AOM_TEST_UTIL_H_ diff --git a/third_party/aom/test/variance_test.cc b/third_party/aom/test/variance_test.cc deleted file mode 100644 index 0df314b0f..000000000 --- a/third_party/aom/test/variance_test.cc +++ /dev/null @@ -1,2064 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <cstdlib> -#include <new> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "test/acm_random.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" -#include "aom/aom_codec.h" -#include "aom/aom_integer.h" -#include "aom_mem/aom_mem.h" -#include "aom_ports/aom_timer.h" -#include "aom_ports/mem.h" - -namespace { - -typedef unsigned int (*VarianceMxNFunc)(const uint8_t *a, int a_stride, - const uint8_t *b, int b_stride, - unsigned int *sse); -typedef unsigned int (*SubpixVarMxNFunc)(const uint8_t *a, int a_stride, - int xoffset, int yoffset, - const uint8_t *b, int b_stride, - unsigned int *sse); -typedef unsigned int (*SubpixAvgVarMxNFunc)(const uint8_t *a, int a_stride, - int xoffset, int yoffset, - const uint8_t *b, int b_stride, - uint32_t *sse, - const uint8_t *second_pred); -typedef unsigned int (*Get4x4SseFunc)(const uint8_t *a, int a_stride, - const uint8_t *b, int b_stride); -typedef unsigned int (*SumOfSquaresFunction)(const int16_t *src); -typedef unsigned int (*JntSubpixAvgVarMxNFunc)( - const uint8_t *a, int a_stride, int xoffset, int yoffset, const uint8_t *b, - int b_stride, uint32_t *sse, const uint8_t *second_pred, - const JNT_COMP_PARAMS *jcp_param); -typedef uint32_t (*ObmcSubpelVarFunc)(const uint8_t *pre, int pre_stride, - int xoffset, int yoffset, - const int32_t *wsrc, const int32_t *mask, - unsigned int *sse); - -using libaom_test::ACMRandom; - -// Truncate high bit depth results by downshifting (with rounding) by: -// 2 * (bit_depth - 8) for sse -// (bit_depth - 8) for se -static void RoundHighBitDepth(int bit_depth, int64_t *se, uint64_t *sse) { - switch (bit_depth) { - case AOM_BITS_12: - *sse = (*sse + 128) >> 8; - *se = (*se + 8) >> 4; - break; - case AOM_BITS_10: - *sse = (*sse + 8) >> 4; - *se = (*se + 2) >> 2; - break; - case AOM_BITS_8: - default: break; - } -} - -static unsigned int mb_ss_ref(const int16_t *src) { - unsigned int res = 0; - for (int i = 0; i < 256; ++i) { - res += src[i] * src[i]; - } - return res; -} - -/* Note: - * Our codebase calculates the "diff" value in the variance algorithm by - * (src - ref). - */ -static uint32_t variance_ref(const uint8_t *src, const uint8_t *ref, int l2w, - int l2h, int src_stride, int ref_stride, - uint32_t *sse_ptr, bool use_high_bit_depth_, - aom_bit_depth_t bit_depth) { - int64_t se = 0; - uint64_t sse = 0; - const int w = 1 << l2w; - const int h = 1 << l2h; - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - int diff; - if (!use_high_bit_depth_) { - diff = src[y * src_stride + x] - ref[y * ref_stride + x]; - se += diff; - sse += diff * diff; - } else { - diff = CONVERT_TO_SHORTPTR(src)[y * src_stride + x] - - CONVERT_TO_SHORTPTR(ref)[y * ref_stride + x]; - se += diff; - sse += diff * diff; - } - } - } - RoundHighBitDepth(bit_depth, &se, &sse); - *sse_ptr = static_cast<uint32_t>(sse); - return static_cast<uint32_t>(sse - ((se * se) >> (l2w + l2h))); -} - -/* The subpel reference functions differ from the codec version in one aspect: - * they calculate the bilinear factors directly instead of using a lookup table - * and therefore upshift xoff and yoff by 1. Only every other calculated value - * is used so the codec version shrinks the table to save space and maintain - * compatibility with vp8. - */ -static uint32_t subpel_variance_ref(const uint8_t *ref, const uint8_t *src, - int l2w, int l2h, int xoff, int yoff, - uint32_t *sse_ptr, bool use_high_bit_depth_, - aom_bit_depth_t bit_depth) { - int64_t se = 0; - uint64_t sse = 0; - const int w = 1 << l2w; - const int h = 1 << l2h; - - xoff <<= 1; - yoff <<= 1; - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - // Bilinear interpolation at a 16th pel step. - if (!use_high_bit_depth_) { - const int a1 = ref[(w + 1) * (y + 0) + x + 0]; - const int a2 = ref[(w + 1) * (y + 0) + x + 1]; - const int b1 = ref[(w + 1) * (y + 1) + x + 0]; - const int b2 = ref[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = r - src[w * y + x]; - se += diff; - sse += diff * diff; - } else { - uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref); - uint16_t *src16 = CONVERT_TO_SHORTPTR(src); - const int a1 = ref16[(w + 1) * (y + 0) + x + 0]; - const int a2 = ref16[(w + 1) * (y + 0) + x + 1]; - const int b1 = ref16[(w + 1) * (y + 1) + x + 0]; - const int b2 = ref16[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = r - src16[w * y + x]; - se += diff; - sse += diff * diff; - } - } - } - RoundHighBitDepth(bit_depth, &se, &sse); - *sse_ptr = static_cast<uint32_t>(sse); - return static_cast<uint32_t>(sse - ((se * se) >> (l2w + l2h))); -} - -static uint32_t subpel_avg_variance_ref(const uint8_t *ref, const uint8_t *src, - const uint8_t *second_pred, int l2w, - int l2h, int xoff, int yoff, - uint32_t *sse_ptr, - bool use_high_bit_depth, - aom_bit_depth_t bit_depth) { - int64_t se = 0; - uint64_t sse = 0; - const int w = 1 << l2w; - const int h = 1 << l2h; - - xoff <<= 1; - yoff <<= 1; - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - // bilinear interpolation at a 16th pel step - if (!use_high_bit_depth) { - const int a1 = ref[(w + 1) * (y + 0) + x + 0]; - const int a2 = ref[(w + 1) * (y + 0) + x + 1]; - const int b1 = ref[(w + 1) * (y + 1) + x + 0]; - const int b2 = ref[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = - ((r + second_pred[w * y + x] + 1) >> 1) - src[w * y + x]; - se += diff; - sse += diff * diff; - } else { - const uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref); - const uint16_t *src16 = CONVERT_TO_SHORTPTR(src); - const uint16_t *sec16 = CONVERT_TO_SHORTPTR(second_pred); - const int a1 = ref16[(w + 1) * (y + 0) + x + 0]; - const int a2 = ref16[(w + 1) * (y + 0) + x + 1]; - const int b1 = ref16[(w + 1) * (y + 1) + x + 0]; - const int b2 = ref16[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = ((r + sec16[w * y + x] + 1) >> 1) - src16[w * y + x]; - se += diff; - sse += diff * diff; - } - } - } - RoundHighBitDepth(bit_depth, &se, &sse); - *sse_ptr = static_cast<uint32_t>(sse); - return static_cast<uint32_t>(sse - ((se * se) >> (l2w + l2h))); -} - -static uint32_t jnt_subpel_avg_variance_ref( - const uint8_t *ref, const uint8_t *src, const uint8_t *second_pred, int l2w, - int l2h, int xoff, int yoff, uint32_t *sse_ptr, bool use_high_bit_depth, - aom_bit_depth_t bit_depth, JNT_COMP_PARAMS *jcp_param) { - int64_t se = 0; - uint64_t sse = 0; - const int w = 1 << l2w; - const int h = 1 << l2h; - - xoff <<= 1; - yoff <<= 1; - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - // bilinear interpolation at a 16th pel step - if (!use_high_bit_depth) { - const int a1 = ref[(w + 0) * (y + 0) + x + 0]; - const int a2 = ref[(w + 0) * (y + 0) + x + 1]; - const int b1 = ref[(w + 0) * (y + 1) + x + 0]; - const int b2 = ref[(w + 0) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int avg = ROUND_POWER_OF_TWO( - r * jcp_param->fwd_offset + - second_pred[w * y + x] * jcp_param->bck_offset, - DIST_PRECISION_BITS); - const int diff = avg - src[w * y + x]; - - se += diff; - sse += diff * diff; - } else { - const uint16_t *ref16 = CONVERT_TO_SHORTPTR(ref); - const uint16_t *src16 = CONVERT_TO_SHORTPTR(src); - const uint16_t *sec16 = CONVERT_TO_SHORTPTR(second_pred); - const int a1 = ref16[(w + 0) * (y + 0) + x + 0]; - const int a2 = ref16[(w + 0) * (y + 0) + x + 1]; - const int b1 = ref16[(w + 0) * (y + 1) + x + 0]; - const int b2 = ref16[(w + 0) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int avg = - ROUND_POWER_OF_TWO(r * jcp_param->fwd_offset + - sec16[w * y + x] * jcp_param->bck_offset, - DIST_PRECISION_BITS); - const int diff = avg - src16[w * y + x]; - - se += diff; - sse += diff * diff; - } - } - } - RoundHighBitDepth(bit_depth, &se, &sse); - *sse_ptr = static_cast<uint32_t>(sse); - return static_cast<uint32_t>(sse - ((se * se) >> (l2w + l2h))); -} - -static uint32_t obmc_subpel_variance_ref(const uint8_t *pre, int l2w, int l2h, - int xoff, int yoff, - const int32_t *wsrc, - const int32_t *mask, uint32_t *sse_ptr, - bool use_high_bit_depth_, - aom_bit_depth_t bit_depth) { - int64_t se = 0; - uint64_t sse = 0; - const int w = 1 << l2w; - const int h = 1 << l2h; - - xoff <<= 1; - yoff <<= 1; - - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++) { - // Bilinear interpolation at a 16th pel step. - if (!use_high_bit_depth_) { - const int a1 = pre[(w + 1) * (y + 0) + x + 0]; - const int a2 = pre[(w + 1) * (y + 0) + x + 1]; - const int b1 = pre[(w + 1) * (y + 1) + x + 0]; - const int b2 = pre[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = ROUND_POWER_OF_TWO_SIGNED( - wsrc[w * y + x] - r * mask[w * y + x], 12); - se += diff; - sse += diff * diff; - } else { - uint16_t *pre16 = CONVERT_TO_SHORTPTR(pre); - const int a1 = pre16[(w + 1) * (y + 0) + x + 0]; - const int a2 = pre16[(w + 1) * (y + 0) + x + 1]; - const int b1 = pre16[(w + 1) * (y + 1) + x + 0]; - const int b2 = pre16[(w + 1) * (y + 1) + x + 1]; - const int a = a1 + (((a2 - a1) * xoff + 8) >> 4); - const int b = b1 + (((b2 - b1) * xoff + 8) >> 4); - const int r = a + (((b - a) * yoff + 8) >> 4); - const int diff = ROUND_POWER_OF_TWO_SIGNED( - wsrc[w * y + x] - r * mask[w * y + x], 12); - se += diff; - sse += diff * diff; - } - } - } - RoundHighBitDepth(bit_depth, &se, &sse); - *sse_ptr = static_cast<uint32_t>(sse); - return static_cast<uint32_t>(sse - ((se * se) >> (l2w + l2h))); -} - -//////////////////////////////////////////////////////////////////////////////// - -class SumOfSquaresTest : public ::testing::TestWithParam<SumOfSquaresFunction> { - public: - SumOfSquaresTest() : func_(GetParam()) {} - - virtual ~SumOfSquaresTest() { libaom_test::ClearSystemState(); } - - protected: - void ConstTest(); - void RefTest(); - - SumOfSquaresFunction func_; - ACMRandom rnd_; -}; - -void SumOfSquaresTest::ConstTest() { - int16_t mem[256]; - unsigned int res; - for (int v = 0; v < 256; ++v) { - for (int i = 0; i < 256; ++i) { - mem[i] = v; - } - ASM_REGISTER_STATE_CHECK(res = func_(mem)); - EXPECT_EQ(256u * (v * v), res); - } -} - -void SumOfSquaresTest::RefTest() { - int16_t mem[256]; - for (int i = 0; i < 100; ++i) { - for (int j = 0; j < 256; ++j) { - mem[j] = rnd_.Rand8() - rnd_.Rand8(); - } - - const unsigned int expected = mb_ss_ref(mem); - unsigned int res; - ASM_REGISTER_STATE_CHECK(res = func_(mem)); - EXPECT_EQ(expected, res); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Encapsulating struct to store the function to test along with -// some testing context. -// Can be used for MSE, SSE, Variance, etc. - -template <typename Func> -struct TestParams { - TestParams(int log2w = 0, int log2h = 0, Func function = NULL, - int bit_depth_value = 0) - : log2width(log2w), log2height(log2h), func(function) { - use_high_bit_depth = (bit_depth_value > 0); - if (use_high_bit_depth) { - bit_depth = static_cast<aom_bit_depth_t>(bit_depth_value); - } else { - bit_depth = AOM_BITS_8; - } - width = 1 << log2width; - height = 1 << log2height; - block_size = width * height; - mask = (1u << bit_depth) - 1; - } - - int log2width, log2height; - int width, height; - int block_size; - Func func; - aom_bit_depth_t bit_depth; - bool use_high_bit_depth; - uint32_t mask; -}; - -template <typename Func> -std::ostream &operator<<(std::ostream &os, const TestParams<Func> &p) { - return os << "width/height:" << p.width << "/" << p.height - << " function:" << reinterpret_cast<const void *>(p.func) - << " bit-depth:" << p.bit_depth; -} - -// Main class for testing a function type -template <typename FunctionType> -class MainTestClass - : public ::testing::TestWithParam<TestParams<FunctionType> > { - public: - virtual void SetUp() { - params_ = this->GetParam(); - - rnd_.Reset(ACMRandom::DeterministicSeed()); - const size_t unit = - use_high_bit_depth() ? sizeof(uint16_t) : sizeof(uint8_t); - src_ = reinterpret_cast<uint8_t *>(aom_memalign(16, block_size() * unit)); - ref_ = new uint8_t[block_size() * unit]; - ASSERT_TRUE(src_ != NULL); - ASSERT_TRUE(ref_ != NULL); - if (use_high_bit_depth()) { - // TODO(skal): remove! - src_ = CONVERT_TO_BYTEPTR(src_); - ref_ = CONVERT_TO_BYTEPTR(ref_); - } - } - - virtual void TearDown() { - if (use_high_bit_depth()) { - // TODO(skal): remove! - src_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(src_)); - ref_ = reinterpret_cast<uint8_t *>(CONVERT_TO_SHORTPTR(ref_)); - } - - aom_free(src_); - delete[] ref_; - src_ = NULL; - ref_ = NULL; - libaom_test::ClearSystemState(); - } - - protected: - // We could sub-class MainTestClass into dedicated class for Variance - // and MSE/SSE, but it involves a lot of 'this->xxx' dereferencing - // to access top class fields xxx. That's cumbersome, so for now we'll just - // implement the testing methods here: - - // Variance tests - void ZeroTest(); - void RefTest(); - void RefStrideTest(); - void OneQuarterTest(); - void SpeedTest(); - - // MSE/SSE tests - void RefTestMse(); - void RefTestSse(); - void MaxTestMse(); - void MaxTestSse(); - - protected: - ACMRandom rnd_; - uint8_t *src_; - uint8_t *ref_; - TestParams<FunctionType> params_; - - // some relay helpers - bool use_high_bit_depth() const { return params_.use_high_bit_depth; } - int byte_shift() const { return params_.bit_depth - 8; } - int block_size() const { return params_.block_size; } - int width() const { return params_.width; } - int height() const { return params_.height; } - uint32_t mask() const { return params_.mask; } -}; - -//////////////////////////////////////////////////////////////////////////////// -// Tests related to variance. - -template <typename VarianceFunctionType> -void MainTestClass<VarianceFunctionType>::ZeroTest() { - for (int i = 0; i <= 255; ++i) { - if (!use_high_bit_depth()) { - memset(src_, i, block_size()); - } else { - uint16_t *const src16 = CONVERT_TO_SHORTPTR(src_); - for (int k = 0; k < block_size(); ++k) src16[k] = i << byte_shift(); - } - for (int j = 0; j <= 255; ++j) { - if (!use_high_bit_depth()) { - memset(ref_, j, block_size()); - } else { - uint16_t *const ref16 = CONVERT_TO_SHORTPTR(ref_); - for (int k = 0; k < block_size(); ++k) ref16[k] = j << byte_shift(); - } - unsigned int sse, var; - ASM_REGISTER_STATE_CHECK( - var = params_.func(src_, width(), ref_, width(), &sse)); - EXPECT_EQ(0u, var) << "src values: " << i << " ref values: " << j; - } - } -} - -template <typename VarianceFunctionType> -void MainTestClass<VarianceFunctionType>::RefTest() { - for (int i = 0; i < 10; ++i) { - for (int j = 0; j < block_size(); j++) { - if (!use_high_bit_depth()) { - src_[j] = rnd_.Rand8(); - ref_[j] = rnd_.Rand8(); - } else { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask(); - CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask(); - } - } - unsigned int sse1, sse2, var1, var2; - const int stride = width(); - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(src_, stride, ref_, stride, &sse1)); - var2 = - variance_ref(src_, ref_, params_.log2width, params_.log2height, stride, - stride, &sse2, use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "Error at test index: " << i; - EXPECT_EQ(var1, var2) << "Error at test index: " << i; - } -} - -template <typename VarianceFunctionType> -void MainTestClass<VarianceFunctionType>::RefStrideTest() { - for (int i = 0; i < 10; ++i) { - const int ref_stride = (i & 1) * width(); - const int src_stride = ((i >> 1) & 1) * width(); - for (int j = 0; j < block_size(); j++) { - const int ref_ind = (j / width()) * ref_stride + j % width(); - const int src_ind = (j / width()) * src_stride + j % width(); - if (!use_high_bit_depth()) { - src_[src_ind] = rnd_.Rand8(); - ref_[ref_ind] = rnd_.Rand8(); - } else { - CONVERT_TO_SHORTPTR(src_)[src_ind] = rnd_.Rand16() & mask(); - CONVERT_TO_SHORTPTR(ref_)[ref_ind] = rnd_.Rand16() & mask(); - } - } - unsigned int sse1, sse2; - unsigned int var1, var2; - - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(src_, src_stride, ref_, ref_stride, &sse1)); - var2 = variance_ref(src_, ref_, params_.log2width, params_.log2height, - src_stride, ref_stride, &sse2, use_high_bit_depth(), - params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "Error at test index: " << i; - EXPECT_EQ(var1, var2) << "Error at test index: " << i; - } -} - -template <typename VarianceFunctionType> -void MainTestClass<VarianceFunctionType>::OneQuarterTest() { - const int half = block_size() / 2; - if (!use_high_bit_depth()) { - memset(src_, 255, block_size()); - memset(ref_, 255, half); - memset(ref_ + half, 0, half); - } else { - aom_memset16(CONVERT_TO_SHORTPTR(src_), 255 << byte_shift(), block_size()); - aom_memset16(CONVERT_TO_SHORTPTR(ref_), 255 << byte_shift(), half); - aom_memset16(CONVERT_TO_SHORTPTR(ref_) + half, 0, half); - } - unsigned int sse, var, expected; - ASM_REGISTER_STATE_CHECK( - var = params_.func(src_, width(), ref_, width(), &sse)); - expected = block_size() * 255 * 255 / 4; - EXPECT_EQ(expected, var); -} - -template <typename VarianceFunctionType> -void MainTestClass<VarianceFunctionType>::SpeedTest() { - for (int j = 0; j < block_size(); j++) { - if (!use_high_bit_depth()) { - src_[j] = rnd_.Rand8(); - ref_[j] = rnd_.Rand8(); - } else { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask(); - CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask(); - } - } - unsigned int sse; - const int stride = width(); - int run_time = 1000000000 / block_size(); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_time; ++i) { - params_.func(src_, stride, ref_, stride, &sse); - } - - aom_usec_timer_mark(&timer); - const double elapsed_time = - static_cast<double>(aom_usec_timer_elapsed(&timer)); - printf("Variance %dx%d : %7.2fns\n", width(), height(), elapsed_time); -} - -//////////////////////////////////////////////////////////////////////////////// -// Tests related to MSE / SSE. - -template <typename FunctionType> -void MainTestClass<FunctionType>::RefTestMse() { - for (int i = 0; i < 10; ++i) { - for (int j = 0; j < block_size(); ++j) { - src_[j] = rnd_.Rand8(); - ref_[j] = rnd_.Rand8(); - } - unsigned int sse1, sse2; - const int stride = width(); - ASM_REGISTER_STATE_CHECK(params_.func(src_, stride, ref_, stride, &sse1)); - variance_ref(src_, ref_, params_.log2width, params_.log2height, stride, - stride, &sse2, false, AOM_BITS_8); - EXPECT_EQ(sse1, sse2); - } -} - -template <typename FunctionType> -void MainTestClass<FunctionType>::RefTestSse() { - for (int i = 0; i < 10; ++i) { - for (int j = 0; j < block_size(); ++j) { - src_[j] = rnd_.Rand8(); - ref_[j] = rnd_.Rand8(); - } - unsigned int sse2; - unsigned int var1; - const int stride = width(); - ASM_REGISTER_STATE_CHECK(var1 = params_.func(src_, stride, ref_, stride)); - variance_ref(src_, ref_, params_.log2width, params_.log2height, stride, - stride, &sse2, false, AOM_BITS_8); - EXPECT_EQ(var1, sse2); - } -} - -template <typename FunctionType> -void MainTestClass<FunctionType>::MaxTestMse() { - memset(src_, 255, block_size()); - memset(ref_, 0, block_size()); - unsigned int sse; - ASM_REGISTER_STATE_CHECK(params_.func(src_, width(), ref_, width(), &sse)); - const unsigned int expected = block_size() * 255 * 255; - EXPECT_EQ(expected, sse); -} - -template <typename FunctionType> -void MainTestClass<FunctionType>::MaxTestSse() { - memset(src_, 255, block_size()); - memset(ref_, 0, block_size()); - unsigned int var; - ASM_REGISTER_STATE_CHECK(var = params_.func(src_, width(), ref_, width())); - const unsigned int expected = block_size() * 255 * 255; - EXPECT_EQ(expected, var); -} - -//////////////////////////////////////////////////////////////////////////////// - -using ::testing::get; -using ::testing::make_tuple; -using ::testing::tuple; - -template <typename FunctionType> -class SubpelVarianceTest - : public ::testing::TestWithParam<TestParams<FunctionType> > { - public: - virtual void SetUp() { - params_ = this->GetParam(); - - rnd_.Reset(ACMRandom::DeterministicSeed()); - if (!use_high_bit_depth()) { - src_ = reinterpret_cast<uint8_t *>(aom_memalign(32, block_size())); - sec_ = reinterpret_cast<uint8_t *>(aom_memalign(32, block_size())); - ref_ = reinterpret_cast<uint8_t *>( - aom_memalign(32, block_size() + width() + height() + 1)); - } else { - src_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>( - aom_memalign(32, block_size() * sizeof(uint16_t)))); - sec_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>( - aom_memalign(32, block_size() * sizeof(uint16_t)))); - ref_ = CONVERT_TO_BYTEPTR(aom_memalign( - 32, (block_size() + width() + height() + 1) * sizeof(uint16_t))); - } - ASSERT_TRUE(src_ != NULL); - ASSERT_TRUE(sec_ != NULL); - ASSERT_TRUE(ref_ != NULL); - } - - virtual void TearDown() { - if (!use_high_bit_depth()) { - aom_free(src_); - aom_free(ref_); - aom_free(sec_); - } else { - aom_free(CONVERT_TO_SHORTPTR(src_)); - aom_free(CONVERT_TO_SHORTPTR(ref_)); - aom_free(CONVERT_TO_SHORTPTR(sec_)); - } - libaom_test::ClearSystemState(); - } - - protected: - void RefTest(); - void ExtremeRefTest(); - - ACMRandom rnd_; - uint8_t *src_; - uint8_t *ref_; - uint8_t *sec_; - TestParams<FunctionType> params_; - JNT_COMP_PARAMS jcp_param_; - - // some relay helpers - bool use_high_bit_depth() const { return params_.use_high_bit_depth; } - int byte_shift() const { return params_.bit_depth - 8; } - int block_size() const { return params_.block_size; } - int width() const { return params_.width; } - int height() const { return params_.height; } - uint32_t mask() const { return params_.mask; } -}; - -template <typename SubpelVarianceFunctionType> -void SubpelVarianceTest<SubpelVarianceFunctionType>::RefTest() { - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - if (!use_high_bit_depth()) { - for (int j = 0; j < block_size(); j++) { - src_[j] = rnd_.Rand8(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - ref_[j] = rnd_.Rand8(); - } - } else { - for (int j = 0; j < block_size(); j++) { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask(); - } - } - unsigned int sse1, sse2; - unsigned int var1; - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1)); - const unsigned int var2 = subpel_variance_ref( - ref_, src_, params_.log2width, params_.log2height, x, y, &sse2, - use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y; - EXPECT_EQ(var1, var2) << "at position " << x << ", " << y; - } - } -} - -template <typename SubpelVarianceFunctionType> -void SubpelVarianceTest<SubpelVarianceFunctionType>::ExtremeRefTest() { - // Compare against reference. - // Src: Set the first half of values to 0, the second half to the maximum. - // Ref: Set the first half of values to the maximum, the second half to 0. - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - const int half = block_size() / 2; - if (!use_high_bit_depth()) { - memset(src_, 0, half); - memset(src_ + half, 255, half); - memset(ref_, 255, half); - memset(ref_ + half, 0, half + width() + height() + 1); - } else { - aom_memset16(CONVERT_TO_SHORTPTR(src_), mask(), half); - aom_memset16(CONVERT_TO_SHORTPTR(src_) + half, 0, half); - aom_memset16(CONVERT_TO_SHORTPTR(ref_), 0, half); - aom_memset16(CONVERT_TO_SHORTPTR(ref_) + half, mask(), - half + width() + height() + 1); - } - unsigned int sse1, sse2; - unsigned int var1; - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(ref_, width() + 1, x, y, src_, width(), &sse1)); - const unsigned int var2 = subpel_variance_ref( - ref_, src_, params_.log2width, params_.log2height, x, y, &sse2, - use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "for xoffset " << x << " and yoffset " << y; - EXPECT_EQ(var1, var2) << "for xoffset " << x << " and yoffset " << y; - } - } -} - -template <> -void SubpelVarianceTest<SubpixAvgVarMxNFunc>::RefTest() { - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - if (!use_high_bit_depth()) { - for (int j = 0; j < block_size(); j++) { - src_[j] = rnd_.Rand8(); - sec_[j] = rnd_.Rand8(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - ref_[j] = rnd_.Rand8(); - } - } else { - for (int j = 0; j < block_size(); j++) { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask(); - CONVERT_TO_SHORTPTR(sec_)[j] = rnd_.Rand16() & mask(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask(); - } - } - uint32_t sse1, sse2; - uint32_t var1, var2; - ASM_REGISTER_STATE_CHECK(var1 = params_.func(ref_, width() + 1, x, y, - src_, width(), &sse1, sec_)); - var2 = subpel_avg_variance_ref(ref_, src_, sec_, params_.log2width, - params_.log2height, x, y, &sse2, - use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y; - EXPECT_EQ(var1, var2) << "at position " << x << ", " << y; - } - } -} - -template <> -void SubpelVarianceTest<JntSubpixAvgVarMxNFunc>::RefTest() { - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - if (!use_high_bit_depth()) { - for (int j = 0; j < block_size(); j++) { - src_[j] = rnd_.Rand8(); - sec_[j] = rnd_.Rand8(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - ref_[j] = rnd_.Rand8(); - } - } else { - for (int j = 0; j < block_size(); j++) { - CONVERT_TO_SHORTPTR(src_)[j] = rnd_.Rand16() & mask(); - CONVERT_TO_SHORTPTR(sec_)[j] = rnd_.Rand16() & mask(); - } - for (int j = 0; j < block_size() + width() + height() + 1; j++) { - CONVERT_TO_SHORTPTR(ref_)[j] = rnd_.Rand16() & mask(); - } - } - for (int x0 = 0; x0 < 2; ++x0) { - for (int y0 = 0; y0 < 4; ++y0) { - uint32_t sse1, sse2; - uint32_t var1, var2; - jcp_param_.fwd_offset = quant_dist_lookup_table[x0][y0][0]; - jcp_param_.bck_offset = quant_dist_lookup_table[x0][y0][1]; - ASM_REGISTER_STATE_CHECK(var1 = params_.func(ref_, width() + 0, x, y, - src_, width(), &sse1, - sec_, &jcp_param_)); - var2 = jnt_subpel_avg_variance_ref( - ref_, src_, sec_, params_.log2width, params_.log2height, x, y, - &sse2, use_high_bit_depth(), params_.bit_depth, &jcp_param_); - EXPECT_EQ(sse1, sse2) << "at position " << x << ", " << y; - EXPECT_EQ(var1, var2) << "at position " << x << ", " << y; - } - } - } - } -} - -//////////////////////////////////////////////////////////////////////////////// - -static const int kMaskMax = 64; - -typedef TestParams<ObmcSubpelVarFunc> ObmcSubpelVarianceParams; - -template <typename FunctionType> -class ObmcVarianceTest - : public ::testing::TestWithParam<TestParams<FunctionType> > { - public: - virtual void SetUp() { - params_ = this->GetParam(); - - rnd_.Reset(ACMRandom::DeterministicSeed()); - if (!use_high_bit_depth()) { - pre_ = reinterpret_cast<uint8_t *>( - aom_memalign(32, block_size() + width() + height() + 1)); - } else { - pre_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(aom_memalign( - 32, block_size() + width() + height() + 1 * sizeof(uint16_t)))); - } - wsrc_ = reinterpret_cast<int32_t *>( - aom_memalign(32, block_size() * sizeof(uint32_t))); - mask_ = reinterpret_cast<int32_t *>( - aom_memalign(32, block_size() * sizeof(uint32_t))); - ASSERT_TRUE(pre_ != NULL); - ASSERT_TRUE(wsrc_ != NULL); - ASSERT_TRUE(mask_ != NULL); - } - - virtual void TearDown() { - if (!use_high_bit_depth()) { - aom_free(pre_); - } else { - aom_free(CONVERT_TO_SHORTPTR(pre_)); - } - aom_free(wsrc_); - aom_free(mask_); - libaom_test::ClearSystemState(); - } - - protected: - void RefTest(); - void ExtremeRefTest(); - void SpeedTest(); - - ACMRandom rnd_; - uint8_t *pre_; - int32_t *wsrc_; - int32_t *mask_; - TestParams<FunctionType> params_; - - // some relay helpers - bool use_high_bit_depth() const { return params_.use_high_bit_depth; } - int byte_shift() const { return params_.bit_depth - 8; } - int block_size() const { return params_.block_size; } - int width() const { return params_.width; } - int height() const { return params_.height; } - uint32_t bd_mask() const { return params_.mask; } -}; - -template <> -void ObmcVarianceTest<ObmcSubpelVarFunc>::RefTest() { - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - if (!use_high_bit_depth()) - for (int j = 0; j < block_size() + width() + height() + 1; j++) - pre_[j] = rnd_.Rand8(); - else - for (int j = 0; j < block_size() + width() + height() + 1; j++) - CONVERT_TO_SHORTPTR(pre_)[j] = rnd_.Rand16() & bd_mask(); - for (int j = 0; j < block_size(); j++) { - wsrc_[j] = (rnd_.Rand16() & bd_mask()) * rnd_(kMaskMax * kMaskMax + 1); - mask_[j] = rnd_(kMaskMax * kMaskMax + 1); - } - - uint32_t sse1, sse2; - uint32_t var1, var2; - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(pre_, width() + 1, x, y, wsrc_, mask_, &sse1)); - var2 = obmc_subpel_variance_ref( - pre_, params_.log2width, params_.log2height, x, y, wsrc_, mask_, - &sse2, use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "for xoffset " << x << " and yoffset " << y; - EXPECT_EQ(var1, var2) << "for xoffset " << x << " and yoffset " << y; - } - } -} - -template <> -void ObmcVarianceTest<ObmcSubpelVarFunc>::ExtremeRefTest() { - // Pre: Set the first half of values to the maximum, the second half to 0. - // Mask: same as above - // WSrc: Set the first half of values to 0, the second half to the maximum. - for (int x = 0; x < 8; ++x) { - for (int y = 0; y < 8; ++y) { - const int half = block_size() / 2; - if (!use_high_bit_depth()) { - memset(pre_, 255, half); - memset(pre_ + half, 0, half + width() + height() + 1); - } else { - aom_memset16(CONVERT_TO_SHORTPTR(pre_), bd_mask(), half); - aom_memset16(CONVERT_TO_SHORTPTR(pre_) + half, 0, half); - } - for (int j = 0; j < half; j++) { - wsrc_[j] = bd_mask() * kMaskMax * kMaskMax; - mask_[j] = 0; - } - for (int j = half; j < block_size(); j++) { - wsrc_[j] = 0; - mask_[j] = kMaskMax * kMaskMax; - } - - uint32_t sse1, sse2; - uint32_t var1, var2; - ASM_REGISTER_STATE_CHECK( - var1 = params_.func(pre_, width() + 1, x, y, wsrc_, mask_, &sse1)); - var2 = obmc_subpel_variance_ref( - pre_, params_.log2width, params_.log2height, x, y, wsrc_, mask_, - &sse2, use_high_bit_depth(), params_.bit_depth); - EXPECT_EQ(sse1, sse2) << "for xoffset " << x << " and yoffset " << y; - EXPECT_EQ(var1, var2) << "for xoffset " << x << " and yoffset " << y; - } - } -} - -template <> -void ObmcVarianceTest<ObmcSubpelVarFunc>::SpeedTest() { - if (!use_high_bit_depth()) - for (int j = 0; j < block_size() + width() + height() + 1; j++) - pre_[j] = rnd_.Rand8(); - else - for (int j = 0; j < block_size() + width() + height() + 1; j++) - CONVERT_TO_SHORTPTR(pre_)[j] = rnd_.Rand16() & bd_mask(); - for (int j = 0; j < block_size(); j++) { - wsrc_[j] = (rnd_.Rand16() & bd_mask()) * rnd_(kMaskMax * kMaskMax + 1); - mask_[j] = rnd_(kMaskMax * kMaskMax + 1); - } - unsigned int sse1; - const int stride = width() + 1; - int run_time = 1000000000 / block_size(); - aom_usec_timer timer; - - aom_usec_timer_start(&timer); - for (int i = 0; i < run_time; ++i) { - int x = rnd_(8); - int y = rnd_(8); - ASM_REGISTER_STATE_CHECK( - params_.func(pre_, stride, x, y, wsrc_, mask_, &sse1)); - } - aom_usec_timer_mark(&timer); - - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("obmc_sub_pixel_variance_%dx%d_%d: %d us\n", width(), height(), - params_.bit_depth, elapsed_time); -} - -typedef MainTestClass<Get4x4SseFunc> AvxSseTest; -typedef MainTestClass<VarianceMxNFunc> AvxMseTest; -typedef MainTestClass<VarianceMxNFunc> AvxVarianceTest; -typedef SubpelVarianceTest<SubpixVarMxNFunc> AvxSubpelVarianceTest; -typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> AvxSubpelAvgVarianceTest; -typedef SubpelVarianceTest<JntSubpixAvgVarMxNFunc> AvxJntSubpelAvgVarianceTest; -typedef ObmcVarianceTest<ObmcSubpelVarFunc> AvxObmcSubpelVarianceTest; - -TEST_P(AvxSseTest, RefSse) { RefTestSse(); } -TEST_P(AvxSseTest, MaxSse) { MaxTestSse(); } -TEST_P(AvxMseTest, RefMse) { RefTestMse(); } -TEST_P(AvxMseTest, MaxMse) { MaxTestMse(); } -TEST_P(AvxVarianceTest, Zero) { ZeroTest(); } -TEST_P(AvxVarianceTest, Ref) { RefTest(); } -TEST_P(AvxVarianceTest, RefStride) { RefStrideTest(); } -TEST_P(AvxVarianceTest, OneQuarter) { OneQuarterTest(); } -TEST_P(AvxVarianceTest, DISABLED_Speed) { SpeedTest(); } -TEST_P(SumOfSquaresTest, Const) { ConstTest(); } -TEST_P(SumOfSquaresTest, Ref) { RefTest(); } -TEST_P(AvxSubpelVarianceTest, Ref) { RefTest(); } -TEST_P(AvxSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); } -TEST_P(AvxSubpelAvgVarianceTest, Ref) { RefTest(); } -TEST_P(AvxJntSubpelAvgVarianceTest, Ref) { RefTest(); } -TEST_P(AvxObmcSubpelVarianceTest, Ref) { RefTest(); } -TEST_P(AvxObmcSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); } -TEST_P(AvxObmcSubpelVarianceTest, DISABLED_Speed) { SpeedTest(); } - -INSTANTIATE_TEST_CASE_P(C, SumOfSquaresTest, - ::testing::Values(aom_get_mb_ss_c)); - -typedef TestParams<Get4x4SseFunc> SseParams; -INSTANTIATE_TEST_CASE_P(C, AvxSseTest, - ::testing::Values(SseParams(2, 2, - &aom_get4x4sse_cs_c))); - -typedef TestParams<VarianceMxNFunc> MseParams; -INSTANTIATE_TEST_CASE_P(C, AvxMseTest, - ::testing::Values(MseParams(4, 4, &aom_mse16x16_c), - MseParams(4, 3, &aom_mse16x8_c), - MseParams(3, 4, &aom_mse8x16_c), - MseParams(3, 3, &aom_mse8x8_c))); - -typedef TestParams<VarianceMxNFunc> VarianceParams; -INSTANTIATE_TEST_CASE_P( - C, AvxVarianceTest, - ::testing::Values(VarianceParams(7, 7, &aom_variance128x128_c), - VarianceParams(7, 6, &aom_variance128x64_c), - VarianceParams(6, 7, &aom_variance64x128_c), - VarianceParams(6, 6, &aom_variance64x64_c), - VarianceParams(6, 5, &aom_variance64x32_c), - VarianceParams(5, 6, &aom_variance32x64_c), - VarianceParams(5, 5, &aom_variance32x32_c), - VarianceParams(5, 4, &aom_variance32x16_c), - VarianceParams(4, 5, &aom_variance16x32_c), - VarianceParams(4, 4, &aom_variance16x16_c), - VarianceParams(4, 3, &aom_variance16x8_c), - VarianceParams(3, 4, &aom_variance8x16_c), - VarianceParams(3, 3, &aom_variance8x8_c), - VarianceParams(3, 2, &aom_variance8x4_c), - VarianceParams(2, 3, &aom_variance4x8_c), - VarianceParams(2, 2, &aom_variance4x4_c))); - -typedef TestParams<SubpixVarMxNFunc> SubpelVarianceParams; -INSTANTIATE_TEST_CASE_P( - C, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(7, 7, &aom_sub_pixel_variance128x128_c, 0), - SubpelVarianceParams(7, 6, &aom_sub_pixel_variance128x64_c, 0), - SubpelVarianceParams(6, 7, &aom_sub_pixel_variance64x128_c, 0), - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_c, 0), - SubpelVarianceParams(6, 5, &aom_sub_pixel_variance64x32_c, 0), - SubpelVarianceParams(5, 6, &aom_sub_pixel_variance32x64_c, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_c, 0), - SubpelVarianceParams(5, 4, &aom_sub_pixel_variance32x16_c, 0), - SubpelVarianceParams(4, 5, &aom_sub_pixel_variance16x32_c, 0), - SubpelVarianceParams(4, 4, &aom_sub_pixel_variance16x16_c, 0), - SubpelVarianceParams(4, 3, &aom_sub_pixel_variance16x8_c, 0), - SubpelVarianceParams(3, 4, &aom_sub_pixel_variance8x16_c, 0), - SubpelVarianceParams(3, 3, &aom_sub_pixel_variance8x8_c, 0), - SubpelVarianceParams(3, 2, &aom_sub_pixel_variance8x4_c, 0), - SubpelVarianceParams(2, 3, &aom_sub_pixel_variance4x8_c, 0), - SubpelVarianceParams(2, 2, &aom_sub_pixel_variance4x4_c, 0))); - -typedef TestParams<SubpixAvgVarMxNFunc> SubpelAvgVarianceParams; -INSTANTIATE_TEST_CASE_P( - C, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(7, 7, &aom_sub_pixel_avg_variance128x128_c, 0), - SubpelAvgVarianceParams(7, 6, &aom_sub_pixel_avg_variance128x64_c, 0), - SubpelAvgVarianceParams(6, 7, &aom_sub_pixel_avg_variance64x128_c, 0), - SubpelAvgVarianceParams(6, 6, &aom_sub_pixel_avg_variance64x64_c, 0), - SubpelAvgVarianceParams(6, 5, &aom_sub_pixel_avg_variance64x32_c, 0), - SubpelAvgVarianceParams(5, 6, &aom_sub_pixel_avg_variance32x64_c, 0), - SubpelAvgVarianceParams(5, 5, &aom_sub_pixel_avg_variance32x32_c, 0), - SubpelAvgVarianceParams(5, 4, &aom_sub_pixel_avg_variance32x16_c, 0), - SubpelAvgVarianceParams(4, 5, &aom_sub_pixel_avg_variance16x32_c, 0), - SubpelAvgVarianceParams(4, 4, &aom_sub_pixel_avg_variance16x16_c, 0), - SubpelAvgVarianceParams(4, 3, &aom_sub_pixel_avg_variance16x8_c, 0), - SubpelAvgVarianceParams(3, 4, &aom_sub_pixel_avg_variance8x16_c, 0), - SubpelAvgVarianceParams(3, 3, &aom_sub_pixel_avg_variance8x8_c, 0), - SubpelAvgVarianceParams(3, 2, &aom_sub_pixel_avg_variance8x4_c, 0), - SubpelAvgVarianceParams(2, 3, &aom_sub_pixel_avg_variance4x8_c, 0), - SubpelAvgVarianceParams(2, 2, &aom_sub_pixel_avg_variance4x4_c, 0))); - -typedef TestParams<JntSubpixAvgVarMxNFunc> JntSubpelAvgVarianceParams; -INSTANTIATE_TEST_CASE_P( - C, AvxJntSubpelAvgVarianceTest, - ::testing::Values( - JntSubpelAvgVarianceParams(6, 6, &aom_jnt_sub_pixel_avg_variance64x64_c, - 0), - JntSubpelAvgVarianceParams(6, 5, &aom_jnt_sub_pixel_avg_variance64x32_c, - 0), - JntSubpelAvgVarianceParams(5, 6, &aom_jnt_sub_pixel_avg_variance32x64_c, - 0), - JntSubpelAvgVarianceParams(5, 5, &aom_jnt_sub_pixel_avg_variance32x32_c, - 0), - JntSubpelAvgVarianceParams(5, 4, &aom_jnt_sub_pixel_avg_variance32x16_c, - 0), - JntSubpelAvgVarianceParams(4, 5, &aom_jnt_sub_pixel_avg_variance16x32_c, - 0), - JntSubpelAvgVarianceParams(4, 4, &aom_jnt_sub_pixel_avg_variance16x16_c, - 0), - JntSubpelAvgVarianceParams(4, 3, &aom_jnt_sub_pixel_avg_variance16x8_c, - 0), - JntSubpelAvgVarianceParams(3, 4, &aom_jnt_sub_pixel_avg_variance8x16_c, - 0), - JntSubpelAvgVarianceParams(3, 3, &aom_jnt_sub_pixel_avg_variance8x8_c, - 0), - JntSubpelAvgVarianceParams(3, 2, &aom_jnt_sub_pixel_avg_variance8x4_c, - 0), - JntSubpelAvgVarianceParams(2, 3, &aom_jnt_sub_pixel_avg_variance4x8_c, - 0), - JntSubpelAvgVarianceParams(2, 2, &aom_jnt_sub_pixel_avg_variance4x4_c, - 0))); - -INSTANTIATE_TEST_CASE_P( - C, AvxObmcSubpelVarianceTest, - ::testing::Values( - ObmcSubpelVarianceParams(7, 7, &aom_obmc_sub_pixel_variance128x128_c, - 0), - ObmcSubpelVarianceParams(7, 6, &aom_obmc_sub_pixel_variance128x64_c, 0), - ObmcSubpelVarianceParams(6, 7, &aom_obmc_sub_pixel_variance64x128_c, 0), - ObmcSubpelVarianceParams(6, 6, &aom_obmc_sub_pixel_variance64x64_c, 0), - ObmcSubpelVarianceParams(6, 5, &aom_obmc_sub_pixel_variance64x32_c, 0), - ObmcSubpelVarianceParams(5, 6, &aom_obmc_sub_pixel_variance32x64_c, 0), - ObmcSubpelVarianceParams(5, 5, &aom_obmc_sub_pixel_variance32x32_c, 0), - ObmcSubpelVarianceParams(5, 4, &aom_obmc_sub_pixel_variance32x16_c, 0), - ObmcSubpelVarianceParams(4, 5, &aom_obmc_sub_pixel_variance16x32_c, 0), - ObmcSubpelVarianceParams(4, 4, &aom_obmc_sub_pixel_variance16x16_c, 0), - ObmcSubpelVarianceParams(4, 3, &aom_obmc_sub_pixel_variance16x8_c, 0), - ObmcSubpelVarianceParams(3, 4, &aom_obmc_sub_pixel_variance8x16_c, 0), - ObmcSubpelVarianceParams(3, 3, &aom_obmc_sub_pixel_variance8x8_c, 0), - ObmcSubpelVarianceParams(3, 2, &aom_obmc_sub_pixel_variance8x4_c, 0), - ObmcSubpelVarianceParams(2, 3, &aom_obmc_sub_pixel_variance4x8_c, 0), - ObmcSubpelVarianceParams(2, 2, &aom_obmc_sub_pixel_variance4x4_c, 0))); - -typedef MainTestClass<VarianceMxNFunc> AvxHBDMseTest; -typedef MainTestClass<VarianceMxNFunc> AvxHBDVarianceTest; -typedef SubpelVarianceTest<SubpixVarMxNFunc> AvxHBDSubpelVarianceTest; -typedef SubpelVarianceTest<SubpixAvgVarMxNFunc> AvxHBDSubpelAvgVarianceTest; -typedef ObmcVarianceTest<ObmcSubpelVarFunc> AvxHBDObmcSubpelVarianceTest; - -TEST_P(AvxHBDMseTest, RefMse) { RefTestMse(); } -TEST_P(AvxHBDMseTest, MaxMse) { MaxTestMse(); } -TEST_P(AvxHBDVarianceTest, Zero) { ZeroTest(); } -TEST_P(AvxHBDVarianceTest, Ref) { RefTest(); } -TEST_P(AvxHBDVarianceTest, RefStride) { RefStrideTest(); } -TEST_P(AvxHBDVarianceTest, OneQuarter) { OneQuarterTest(); } -TEST_P(AvxHBDVarianceTest, DISABLED_Speed) { SpeedTest(); } -TEST_P(AvxHBDSubpelVarianceTest, Ref) { RefTest(); } -TEST_P(AvxHBDSubpelVarianceTest, ExtremeRef) { ExtremeRefTest(); } -TEST_P(AvxHBDSubpelAvgVarianceTest, Ref) { RefTest(); } - -/* TODO(debargha): This test does not support the highbd version -INSTANTIATE_TEST_CASE_P( - C, AvxHBDMseTest, - ::testing::Values(make_tuple(4, 4, &aom_highbd_12_mse16x16_c), - make_tuple(4, 4, &aom_highbd_12_mse16x8_c), - make_tuple(4, 4, &aom_highbd_12_mse8x16_c), - make_tuple(4, 4, &aom_highbd_12_mse8x8_c), - make_tuple(4, 4, &aom_highbd_10_mse16x16_c), - make_tuple(4, 4, &aom_highbd_10_mse16x8_c), - make_tuple(4, 4, &aom_highbd_10_mse8x16_c), - make_tuple(4, 4, &aom_highbd_10_mse8x8_c), - make_tuple(4, 4, &aom_highbd_8_mse16x16_c), - make_tuple(4, 4, &aom_highbd_8_mse16x8_c), - make_tuple(4, 4, &aom_highbd_8_mse8x16_c), - make_tuple(4, 4, &aom_highbd_8_mse8x8_c))); -*/ - -const VarianceParams kArrayHBDVariance_c[] = { - VarianceParams(7, 7, &aom_highbd_12_variance128x128_c, 12), - VarianceParams(7, 6, &aom_highbd_12_variance128x64_c, 12), - VarianceParams(6, 7, &aom_highbd_12_variance64x128_c, 12), - VarianceParams(6, 6, &aom_highbd_12_variance64x64_c, 12), - VarianceParams(6, 5, &aom_highbd_12_variance64x32_c, 12), - VarianceParams(5, 6, &aom_highbd_12_variance32x64_c, 12), - VarianceParams(5, 5, &aom_highbd_12_variance32x32_c, 12), - VarianceParams(5, 4, &aom_highbd_12_variance32x16_c, 12), - VarianceParams(4, 5, &aom_highbd_12_variance16x32_c, 12), - VarianceParams(4, 4, &aom_highbd_12_variance16x16_c, 12), - VarianceParams(4, 3, &aom_highbd_12_variance16x8_c, 12), - VarianceParams(3, 4, &aom_highbd_12_variance8x16_c, 12), - VarianceParams(3, 3, &aom_highbd_12_variance8x8_c, 12), - VarianceParams(3, 2, &aom_highbd_12_variance8x4_c, 12), - VarianceParams(2, 3, &aom_highbd_12_variance4x8_c, 12), - VarianceParams(2, 2, &aom_highbd_12_variance4x4_c, 12), - VarianceParams(7, 7, &aom_highbd_10_variance128x128_c, 10), - VarianceParams(7, 6, &aom_highbd_10_variance128x64_c, 10), - VarianceParams(6, 7, &aom_highbd_10_variance64x128_c, 10), - VarianceParams(6, 6, &aom_highbd_10_variance64x64_c, 10), - VarianceParams(6, 5, &aom_highbd_10_variance64x32_c, 10), - VarianceParams(5, 6, &aom_highbd_10_variance32x64_c, 10), - VarianceParams(5, 5, &aom_highbd_10_variance32x32_c, 10), - VarianceParams(5, 4, &aom_highbd_10_variance32x16_c, 10), - VarianceParams(4, 5, &aom_highbd_10_variance16x32_c, 10), - VarianceParams(4, 4, &aom_highbd_10_variance16x16_c, 10), - VarianceParams(4, 3, &aom_highbd_10_variance16x8_c, 10), - VarianceParams(3, 4, &aom_highbd_10_variance8x16_c, 10), - VarianceParams(3, 3, &aom_highbd_10_variance8x8_c, 10), - VarianceParams(3, 2, &aom_highbd_10_variance8x4_c, 10), - VarianceParams(2, 3, &aom_highbd_10_variance4x8_c, 10), - VarianceParams(2, 2, &aom_highbd_10_variance4x4_c, 10), - VarianceParams(7, 7, &aom_highbd_8_variance128x128_c, 8), - VarianceParams(7, 6, &aom_highbd_8_variance128x64_c, 8), - VarianceParams(6, 7, &aom_highbd_8_variance64x128_c, 8), - VarianceParams(6, 6, &aom_highbd_8_variance64x64_c, 8), - VarianceParams(6, 5, &aom_highbd_8_variance64x32_c, 8), - VarianceParams(5, 6, &aom_highbd_8_variance32x64_c, 8), - VarianceParams(5, 5, &aom_highbd_8_variance32x32_c, 8), - VarianceParams(5, 4, &aom_highbd_8_variance32x16_c, 8), - VarianceParams(4, 5, &aom_highbd_8_variance16x32_c, 8), - VarianceParams(4, 4, &aom_highbd_8_variance16x16_c, 8), - VarianceParams(4, 3, &aom_highbd_8_variance16x8_c, 8), - VarianceParams(3, 4, &aom_highbd_8_variance8x16_c, 8), - VarianceParams(3, 3, &aom_highbd_8_variance8x8_c, 8), - VarianceParams(3, 2, &aom_highbd_8_variance8x4_c, 8), - VarianceParams(2, 3, &aom_highbd_8_variance4x8_c, 8), - VarianceParams(2, 2, &aom_highbd_8_variance4x4_c, 8) -}; -INSTANTIATE_TEST_CASE_P(C, AvxHBDVarianceTest, - ::testing::ValuesIn(kArrayHBDVariance_c)); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, AvxHBDVarianceTest, - ::testing::Values( - VarianceParams(2, 2, &aom_highbd_8_variance4x4_sse4_1, 8), - VarianceParams(2, 2, &aom_highbd_10_variance4x4_sse4_1, 10), - VarianceParams(2, 2, &aom_highbd_12_variance4x4_sse4_1, 12))); -#endif // HAVE_SSE4_1 - -const SubpelVarianceParams kArrayHBDSubpelVariance_c[] = { - SubpelVarianceParams(7, 7, &aom_highbd_8_sub_pixel_variance128x128_c, 8), - SubpelVarianceParams(7, 6, &aom_highbd_8_sub_pixel_variance128x64_c, 8), - SubpelVarianceParams(6, 7, &aom_highbd_8_sub_pixel_variance64x128_c, 8), - SubpelVarianceParams(6, 6, &aom_highbd_8_sub_pixel_variance64x64_c, 8), - SubpelVarianceParams(6, 5, &aom_highbd_8_sub_pixel_variance64x32_c, 8), - SubpelVarianceParams(5, 6, &aom_highbd_8_sub_pixel_variance32x64_c, 8), - SubpelVarianceParams(5, 5, &aom_highbd_8_sub_pixel_variance32x32_c, 8), - SubpelVarianceParams(5, 4, &aom_highbd_8_sub_pixel_variance32x16_c, 8), - SubpelVarianceParams(4, 5, &aom_highbd_8_sub_pixel_variance16x32_c, 8), - SubpelVarianceParams(4, 4, &aom_highbd_8_sub_pixel_variance16x16_c, 8), - SubpelVarianceParams(4, 3, &aom_highbd_8_sub_pixel_variance16x8_c, 8), - SubpelVarianceParams(3, 4, &aom_highbd_8_sub_pixel_variance8x16_c, 8), - SubpelVarianceParams(3, 3, &aom_highbd_8_sub_pixel_variance8x8_c, 8), - SubpelVarianceParams(3, 2, &aom_highbd_8_sub_pixel_variance8x4_c, 8), - SubpelVarianceParams(2, 3, &aom_highbd_8_sub_pixel_variance4x8_c, 8), - SubpelVarianceParams(2, 2, &aom_highbd_8_sub_pixel_variance4x4_c, 8), - SubpelVarianceParams(7, 7, &aom_highbd_10_sub_pixel_variance128x128_c, 10), - SubpelVarianceParams(7, 6, &aom_highbd_10_sub_pixel_variance128x64_c, 10), - SubpelVarianceParams(6, 7, &aom_highbd_10_sub_pixel_variance64x128_c, 10), - SubpelVarianceParams(6, 6, &aom_highbd_10_sub_pixel_variance64x64_c, 10), - SubpelVarianceParams(6, 5, &aom_highbd_10_sub_pixel_variance64x32_c, 10), - SubpelVarianceParams(5, 6, &aom_highbd_10_sub_pixel_variance32x64_c, 10), - SubpelVarianceParams(5, 5, &aom_highbd_10_sub_pixel_variance32x32_c, 10), - SubpelVarianceParams(5, 4, &aom_highbd_10_sub_pixel_variance32x16_c, 10), - SubpelVarianceParams(4, 5, &aom_highbd_10_sub_pixel_variance16x32_c, 10), - SubpelVarianceParams(4, 4, &aom_highbd_10_sub_pixel_variance16x16_c, 10), - SubpelVarianceParams(4, 3, &aom_highbd_10_sub_pixel_variance16x8_c, 10), - SubpelVarianceParams(3, 4, &aom_highbd_10_sub_pixel_variance8x16_c, 10), - SubpelVarianceParams(3, 3, &aom_highbd_10_sub_pixel_variance8x8_c, 10), - SubpelVarianceParams(3, 2, &aom_highbd_10_sub_pixel_variance8x4_c, 10), - SubpelVarianceParams(2, 3, &aom_highbd_10_sub_pixel_variance4x8_c, 10), - SubpelVarianceParams(2, 2, &aom_highbd_10_sub_pixel_variance4x4_c, 10), - SubpelVarianceParams(7, 7, &aom_highbd_12_sub_pixel_variance128x128_c, 12), - SubpelVarianceParams(7, 6, &aom_highbd_12_sub_pixel_variance128x64_c, 12), - SubpelVarianceParams(6, 7, &aom_highbd_12_sub_pixel_variance64x128_c, 12), - SubpelVarianceParams(6, 6, &aom_highbd_12_sub_pixel_variance64x64_c, 12), - SubpelVarianceParams(6, 5, &aom_highbd_12_sub_pixel_variance64x32_c, 12), - SubpelVarianceParams(5, 6, &aom_highbd_12_sub_pixel_variance32x64_c, 12), - SubpelVarianceParams(5, 5, &aom_highbd_12_sub_pixel_variance32x32_c, 12), - SubpelVarianceParams(5, 4, &aom_highbd_12_sub_pixel_variance32x16_c, 12), - SubpelVarianceParams(4, 5, &aom_highbd_12_sub_pixel_variance16x32_c, 12), - SubpelVarianceParams(4, 4, &aom_highbd_12_sub_pixel_variance16x16_c, 12), - SubpelVarianceParams(4, 3, &aom_highbd_12_sub_pixel_variance16x8_c, 12), - SubpelVarianceParams(3, 4, &aom_highbd_12_sub_pixel_variance8x16_c, 12), - SubpelVarianceParams(3, 3, &aom_highbd_12_sub_pixel_variance8x8_c, 12), - SubpelVarianceParams(3, 2, &aom_highbd_12_sub_pixel_variance8x4_c, 12), - SubpelVarianceParams(2, 3, &aom_highbd_12_sub_pixel_variance4x8_c, 12), - SubpelVarianceParams(2, 2, &aom_highbd_12_sub_pixel_variance4x4_c, 12), -}; -INSTANTIATE_TEST_CASE_P(C, AvxHBDSubpelVarianceTest, - ::testing::ValuesIn(kArrayHBDSubpelVariance_c)); - -const SubpelAvgVarianceParams kArrayHBDSubpelAvgVariance_c[] = { - SubpelAvgVarianceParams(7, 7, &aom_highbd_8_sub_pixel_avg_variance128x128_c, - 8), - SubpelAvgVarianceParams(7, 6, &aom_highbd_8_sub_pixel_avg_variance128x64_c, - 8), - SubpelAvgVarianceParams(6, 7, &aom_highbd_8_sub_pixel_avg_variance64x128_c, - 8), - SubpelAvgVarianceParams(6, 6, &aom_highbd_8_sub_pixel_avg_variance64x64_c, 8), - SubpelAvgVarianceParams(6, 5, &aom_highbd_8_sub_pixel_avg_variance64x32_c, 8), - SubpelAvgVarianceParams(5, 6, &aom_highbd_8_sub_pixel_avg_variance32x64_c, 8), - SubpelAvgVarianceParams(5, 5, &aom_highbd_8_sub_pixel_avg_variance32x32_c, 8), - SubpelAvgVarianceParams(5, 4, &aom_highbd_8_sub_pixel_avg_variance32x16_c, 8), - SubpelAvgVarianceParams(4, 5, &aom_highbd_8_sub_pixel_avg_variance16x32_c, 8), - SubpelAvgVarianceParams(4, 4, &aom_highbd_8_sub_pixel_avg_variance16x16_c, 8), - SubpelAvgVarianceParams(4, 3, &aom_highbd_8_sub_pixel_avg_variance16x8_c, 8), - SubpelAvgVarianceParams(3, 4, &aom_highbd_8_sub_pixel_avg_variance8x16_c, 8), - SubpelAvgVarianceParams(3, 3, &aom_highbd_8_sub_pixel_avg_variance8x8_c, 8), - SubpelAvgVarianceParams(3, 2, &aom_highbd_8_sub_pixel_avg_variance8x4_c, 8), - SubpelAvgVarianceParams(2, 3, &aom_highbd_8_sub_pixel_avg_variance4x8_c, 8), - SubpelAvgVarianceParams(2, 2, &aom_highbd_8_sub_pixel_avg_variance4x4_c, 8), - SubpelAvgVarianceParams(7, 7, &aom_highbd_10_sub_pixel_avg_variance128x128_c, - 10), - SubpelAvgVarianceParams(7, 6, &aom_highbd_10_sub_pixel_avg_variance128x64_c, - 10), - SubpelAvgVarianceParams(6, 7, &aom_highbd_10_sub_pixel_avg_variance64x128_c, - 10), - SubpelAvgVarianceParams(6, 6, &aom_highbd_10_sub_pixel_avg_variance64x64_c, - 10), - SubpelAvgVarianceParams(6, 5, &aom_highbd_10_sub_pixel_avg_variance64x32_c, - 10), - SubpelAvgVarianceParams(5, 6, &aom_highbd_10_sub_pixel_avg_variance32x64_c, - 10), - SubpelAvgVarianceParams(5, 5, &aom_highbd_10_sub_pixel_avg_variance32x32_c, - 10), - SubpelAvgVarianceParams(5, 4, &aom_highbd_10_sub_pixel_avg_variance32x16_c, - 10), - SubpelAvgVarianceParams(4, 5, &aom_highbd_10_sub_pixel_avg_variance16x32_c, - 10), - SubpelAvgVarianceParams(4, 4, &aom_highbd_10_sub_pixel_avg_variance16x16_c, - 10), - SubpelAvgVarianceParams(4, 3, &aom_highbd_10_sub_pixel_avg_variance16x8_c, - 10), - SubpelAvgVarianceParams(3, 4, &aom_highbd_10_sub_pixel_avg_variance8x16_c, - 10), - SubpelAvgVarianceParams(3, 3, &aom_highbd_10_sub_pixel_avg_variance8x8_c, 10), - SubpelAvgVarianceParams(3, 2, &aom_highbd_10_sub_pixel_avg_variance8x4_c, 10), - SubpelAvgVarianceParams(2, 3, &aom_highbd_10_sub_pixel_avg_variance4x8_c, 10), - SubpelAvgVarianceParams(2, 2, &aom_highbd_10_sub_pixel_avg_variance4x4_c, 10), - SubpelAvgVarianceParams(7, 7, &aom_highbd_12_sub_pixel_avg_variance128x128_c, - 12), - SubpelAvgVarianceParams(7, 6, &aom_highbd_12_sub_pixel_avg_variance128x64_c, - 12), - SubpelAvgVarianceParams(6, 7, &aom_highbd_12_sub_pixel_avg_variance64x128_c, - 12), - SubpelAvgVarianceParams(6, 6, &aom_highbd_12_sub_pixel_avg_variance64x64_c, - 12), - SubpelAvgVarianceParams(6, 5, &aom_highbd_12_sub_pixel_avg_variance64x32_c, - 12), - SubpelAvgVarianceParams(5, 6, &aom_highbd_12_sub_pixel_avg_variance32x64_c, - 12), - SubpelAvgVarianceParams(5, 5, &aom_highbd_12_sub_pixel_avg_variance32x32_c, - 12), - SubpelAvgVarianceParams(5, 4, &aom_highbd_12_sub_pixel_avg_variance32x16_c, - 12), - SubpelAvgVarianceParams(4, 5, &aom_highbd_12_sub_pixel_avg_variance16x32_c, - 12), - SubpelAvgVarianceParams(4, 4, &aom_highbd_12_sub_pixel_avg_variance16x16_c, - 12), - SubpelAvgVarianceParams(4, 3, &aom_highbd_12_sub_pixel_avg_variance16x8_c, - 12), - SubpelAvgVarianceParams(3, 4, &aom_highbd_12_sub_pixel_avg_variance8x16_c, - 12), - SubpelAvgVarianceParams(3, 3, &aom_highbd_12_sub_pixel_avg_variance8x8_c, 12), - SubpelAvgVarianceParams(3, 2, &aom_highbd_12_sub_pixel_avg_variance8x4_c, 12), - SubpelAvgVarianceParams(2, 3, &aom_highbd_12_sub_pixel_avg_variance4x8_c, 12), - SubpelAvgVarianceParams(2, 2, &aom_highbd_12_sub_pixel_avg_variance4x4_c, 12) -}; -INSTANTIATE_TEST_CASE_P(C, AvxHBDSubpelAvgVarianceTest, - ::testing::ValuesIn(kArrayHBDSubpelAvgVariance_c)); - -const ObmcSubpelVarianceParams kArrayHBDObmcSubpelVariance_c[] = { - ObmcSubpelVarianceParams(7, 7, &aom_highbd_obmc_sub_pixel_variance128x128_c, - 8), - ObmcSubpelVarianceParams(7, 6, &aom_highbd_obmc_sub_pixel_variance128x64_c, - 8), - ObmcSubpelVarianceParams(6, 7, &aom_highbd_obmc_sub_pixel_variance64x128_c, - 8), - ObmcSubpelVarianceParams(6, 6, &aom_highbd_obmc_sub_pixel_variance64x64_c, 8), - ObmcSubpelVarianceParams(6, 5, &aom_highbd_obmc_sub_pixel_variance64x32_c, 8), - ObmcSubpelVarianceParams(5, 6, &aom_highbd_obmc_sub_pixel_variance32x64_c, 8), - ObmcSubpelVarianceParams(5, 5, &aom_highbd_obmc_sub_pixel_variance32x32_c, 8), - ObmcSubpelVarianceParams(5, 4, &aom_highbd_obmc_sub_pixel_variance32x16_c, 8), - ObmcSubpelVarianceParams(4, 5, &aom_highbd_obmc_sub_pixel_variance16x32_c, 8), - ObmcSubpelVarianceParams(4, 4, &aom_highbd_obmc_sub_pixel_variance16x16_c, 8), - ObmcSubpelVarianceParams(4, 3, &aom_highbd_obmc_sub_pixel_variance16x8_c, 8), - ObmcSubpelVarianceParams(3, 4, &aom_highbd_obmc_sub_pixel_variance8x16_c, 8), - ObmcSubpelVarianceParams(3, 3, &aom_highbd_obmc_sub_pixel_variance8x8_c, 8), - ObmcSubpelVarianceParams(3, 2, &aom_highbd_obmc_sub_pixel_variance8x4_c, 8), - ObmcSubpelVarianceParams(2, 3, &aom_highbd_obmc_sub_pixel_variance4x8_c, 8), - ObmcSubpelVarianceParams(2, 2, &aom_highbd_obmc_sub_pixel_variance4x4_c, 8), - ObmcSubpelVarianceParams(7, 7, - &aom_highbd_10_obmc_sub_pixel_variance128x128_c, 10), - ObmcSubpelVarianceParams(7, 6, &aom_highbd_10_obmc_sub_pixel_variance128x64_c, - 10), - ObmcSubpelVarianceParams(6, 7, &aom_highbd_10_obmc_sub_pixel_variance64x128_c, - 10), - ObmcSubpelVarianceParams(6, 6, &aom_highbd_10_obmc_sub_pixel_variance64x64_c, - 10), - ObmcSubpelVarianceParams(6, 5, &aom_highbd_10_obmc_sub_pixel_variance64x32_c, - 10), - ObmcSubpelVarianceParams(5, 6, &aom_highbd_10_obmc_sub_pixel_variance32x64_c, - 10), - ObmcSubpelVarianceParams(5, 5, &aom_highbd_10_obmc_sub_pixel_variance32x32_c, - 10), - ObmcSubpelVarianceParams(5, 4, &aom_highbd_10_obmc_sub_pixel_variance32x16_c, - 10), - ObmcSubpelVarianceParams(4, 5, &aom_highbd_10_obmc_sub_pixel_variance16x32_c, - 10), - ObmcSubpelVarianceParams(4, 4, &aom_highbd_10_obmc_sub_pixel_variance16x16_c, - 10), - ObmcSubpelVarianceParams(4, 3, &aom_highbd_10_obmc_sub_pixel_variance16x8_c, - 10), - ObmcSubpelVarianceParams(3, 4, &aom_highbd_10_obmc_sub_pixel_variance8x16_c, - 10), - ObmcSubpelVarianceParams(3, 3, &aom_highbd_10_obmc_sub_pixel_variance8x8_c, - 10), - ObmcSubpelVarianceParams(3, 2, &aom_highbd_10_obmc_sub_pixel_variance8x4_c, - 10), - ObmcSubpelVarianceParams(2, 3, &aom_highbd_10_obmc_sub_pixel_variance4x8_c, - 10), - ObmcSubpelVarianceParams(2, 2, &aom_highbd_10_obmc_sub_pixel_variance4x4_c, - 10), - ObmcSubpelVarianceParams(7, 7, - &aom_highbd_12_obmc_sub_pixel_variance128x128_c, 12), - ObmcSubpelVarianceParams(7, 6, &aom_highbd_12_obmc_sub_pixel_variance128x64_c, - 12), - ObmcSubpelVarianceParams(6, 7, &aom_highbd_12_obmc_sub_pixel_variance64x128_c, - 12), - ObmcSubpelVarianceParams(6, 6, &aom_highbd_12_obmc_sub_pixel_variance64x64_c, - 12), - ObmcSubpelVarianceParams(6, 5, &aom_highbd_12_obmc_sub_pixel_variance64x32_c, - 12), - ObmcSubpelVarianceParams(5, 6, &aom_highbd_12_obmc_sub_pixel_variance32x64_c, - 12), - ObmcSubpelVarianceParams(5, 5, &aom_highbd_12_obmc_sub_pixel_variance32x32_c, - 12), - ObmcSubpelVarianceParams(5, 4, &aom_highbd_12_obmc_sub_pixel_variance32x16_c, - 12), - ObmcSubpelVarianceParams(4, 5, &aom_highbd_12_obmc_sub_pixel_variance16x32_c, - 12), - ObmcSubpelVarianceParams(4, 4, &aom_highbd_12_obmc_sub_pixel_variance16x16_c, - 12), - ObmcSubpelVarianceParams(4, 3, &aom_highbd_12_obmc_sub_pixel_variance16x8_c, - 12), - ObmcSubpelVarianceParams(3, 4, &aom_highbd_12_obmc_sub_pixel_variance8x16_c, - 12), - ObmcSubpelVarianceParams(3, 3, &aom_highbd_12_obmc_sub_pixel_variance8x8_c, - 12), - ObmcSubpelVarianceParams(3, 2, &aom_highbd_12_obmc_sub_pixel_variance8x4_c, - 12), - ObmcSubpelVarianceParams(2, 3, &aom_highbd_12_obmc_sub_pixel_variance4x8_c, - 12), - ObmcSubpelVarianceParams(2, 2, &aom_highbd_12_obmc_sub_pixel_variance4x4_c, - 12) -}; -INSTANTIATE_TEST_CASE_P(C, AvxHBDObmcSubpelVarianceTest, - ::testing::ValuesIn(kArrayHBDObmcSubpelVariance_c)); - -#if HAVE_SSE2 -INSTANTIATE_TEST_CASE_P(SSE2, SumOfSquaresTest, - ::testing::Values(aom_get_mb_ss_sse2)); - -INSTANTIATE_TEST_CASE_P(SSE2, AvxMseTest, - ::testing::Values(MseParams(4, 4, &aom_mse16x16_sse2), - MseParams(4, 3, &aom_mse16x8_sse2), - MseParams(3, 4, &aom_mse8x16_sse2), - MseParams(3, 3, &aom_mse8x8_sse2))); - -INSTANTIATE_TEST_CASE_P( - SSE2, AvxVarianceTest, - ::testing::Values(VarianceParams(7, 7, &aom_variance128x128_sse2), - VarianceParams(7, 6, &aom_variance128x64_sse2), - VarianceParams(6, 7, &aom_variance64x128_sse2), - VarianceParams(6, 6, &aom_variance64x64_sse2), - VarianceParams(6, 5, &aom_variance64x32_sse2), - VarianceParams(6, 4, &aom_variance64x16_sse2), - VarianceParams(5, 6, &aom_variance32x64_sse2), - VarianceParams(5, 5, &aom_variance32x32_sse2), - VarianceParams(5, 4, &aom_variance32x16_sse2), - VarianceParams(5, 3, &aom_variance32x8_sse2), - VarianceParams(4, 6, &aom_variance16x64_sse2), - VarianceParams(4, 5, &aom_variance16x32_sse2), - VarianceParams(4, 4, &aom_variance16x16_sse2), - VarianceParams(4, 3, &aom_variance16x8_sse2), - VarianceParams(4, 2, &aom_variance16x4_sse2), - VarianceParams(3, 5, &aom_variance8x32_sse2), - VarianceParams(3, 4, &aom_variance8x16_sse2), - VarianceParams(3, 3, &aom_variance8x8_sse2), - VarianceParams(3, 2, &aom_variance8x4_sse2), - VarianceParams(2, 4, &aom_variance4x16_sse2), - VarianceParams(2, 3, &aom_variance4x8_sse2), - VarianceParams(2, 2, &aom_variance4x4_sse2))); - -INSTANTIATE_TEST_CASE_P( - SSE2, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(7, 7, &aom_sub_pixel_variance128x128_sse2, 0), - SubpelVarianceParams(7, 6, &aom_sub_pixel_variance128x64_sse2, 0), - SubpelVarianceParams(6, 7, &aom_sub_pixel_variance64x128_sse2, 0), - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_sse2, 0), - SubpelVarianceParams(6, 5, &aom_sub_pixel_variance64x32_sse2, 0), - SubpelVarianceParams(5, 6, &aom_sub_pixel_variance32x64_sse2, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_sse2, 0), - SubpelVarianceParams(5, 4, &aom_sub_pixel_variance32x16_sse2, 0), - SubpelVarianceParams(4, 5, &aom_sub_pixel_variance16x32_sse2, 0), - SubpelVarianceParams(4, 4, &aom_sub_pixel_variance16x16_sse2, 0), - SubpelVarianceParams(4, 3, &aom_sub_pixel_variance16x8_sse2, 0), - SubpelVarianceParams(3, 4, &aom_sub_pixel_variance8x16_sse2, 0), - SubpelVarianceParams(3, 3, &aom_sub_pixel_variance8x8_sse2, 0), - SubpelVarianceParams(3, 2, &aom_sub_pixel_variance8x4_sse2, 0), - SubpelVarianceParams(2, 3, &aom_sub_pixel_variance4x8_sse2, 0), - SubpelVarianceParams(2, 2, &aom_sub_pixel_variance4x4_sse2, 0))); - -INSTANTIATE_TEST_CASE_P( - SSE2, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(7, 7, &aom_sub_pixel_avg_variance128x128_sse2, - 0), - SubpelAvgVarianceParams(7, 6, &aom_sub_pixel_avg_variance128x64_sse2, - 0), - SubpelAvgVarianceParams(6, 7, &aom_sub_pixel_avg_variance64x128_sse2, - 0), - SubpelAvgVarianceParams(6, 6, &aom_sub_pixel_avg_variance64x64_sse2, 0), - SubpelAvgVarianceParams(6, 5, &aom_sub_pixel_avg_variance64x32_sse2, 0), - SubpelAvgVarianceParams(5, 6, &aom_sub_pixel_avg_variance32x64_sse2, 0), - SubpelAvgVarianceParams(5, 5, &aom_sub_pixel_avg_variance32x32_sse2, 0), - SubpelAvgVarianceParams(5, 4, &aom_sub_pixel_avg_variance32x16_sse2, 0), - SubpelAvgVarianceParams(4, 5, &aom_sub_pixel_avg_variance16x32_sse2, 0), - SubpelAvgVarianceParams(4, 4, &aom_sub_pixel_avg_variance16x16_sse2, 0), - SubpelAvgVarianceParams(4, 3, &aom_sub_pixel_avg_variance16x8_sse2, 0), - SubpelAvgVarianceParams(3, 4, &aom_sub_pixel_avg_variance8x16_sse2, 0), - SubpelAvgVarianceParams(3, 3, &aom_sub_pixel_avg_variance8x8_sse2, 0), - SubpelAvgVarianceParams(3, 2, &aom_sub_pixel_avg_variance8x4_sse2, 0), - SubpelAvgVarianceParams(2, 3, &aom_sub_pixel_avg_variance4x8_sse2, 0), - SubpelAvgVarianceParams(2, 2, &aom_sub_pixel_avg_variance4x4_sse2, 0))); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(2, 2, &aom_highbd_8_sub_pixel_variance4x4_sse4_1, - 8), - SubpelVarianceParams(2, 2, &aom_highbd_10_sub_pixel_variance4x4_sse4_1, - 10), - SubpelVarianceParams(2, 2, &aom_highbd_12_sub_pixel_variance4x4_sse4_1, - 12))); - -INSTANTIATE_TEST_CASE_P( - SSE4_1, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(2, 2, - &aom_highbd_8_sub_pixel_avg_variance4x4_sse4_1, - 8), - SubpelAvgVarianceParams(2, 2, - &aom_highbd_10_sub_pixel_avg_variance4x4_sse4_1, - 10), - SubpelAvgVarianceParams(2, 2, - &aom_highbd_12_sub_pixel_avg_variance4x4_sse4_1, - 12))); -#endif // HAVE_SSE4_1 - -/* TODO(debargha): This test does not support the highbd version -INSTANTIATE_TEST_CASE_P( - SSE2, AvxHBDMseTest, - ::testing::Values(MseParams(4, 4, &aom_highbd_12_mse16x16_sse2), - MseParams(4, 3, &aom_highbd_12_mse16x8_sse2), - MseParams(3, 4, &aom_highbd_12_mse8x16_sse2), - MseParams(3, 3, &aom_highbd_12_mse8x8_sse2), - MseParams(4, 4, &aom_highbd_10_mse16x16_sse2), - MseParams(4, 3, &aom_highbd_10_mse16x8_sse2), - MseParams(3, 4, &aom_highbd_10_mse8x16_sse2), - MseParams(3, 3, &aom_highbd_10_mse8x8_sse2), - MseParams(4, 4, &aom_highbd_8_mse16x16_sse2), - MseParams(4, 3, &aom_highbd_8_mse16x8_sse2), - MseParams(3, 4, &aom_highbd_8_mse8x16_sse2), - MseParams(3, 3, &aom_highbd_8_mse8x8_sse2))); -*/ - -const VarianceParams kArrayHBDVariance_sse2[] = { - VarianceParams(7, 7, &aom_highbd_12_variance128x128_sse2, 12), - VarianceParams(7, 6, &aom_highbd_12_variance128x64_sse2, 12), - VarianceParams(6, 7, &aom_highbd_12_variance64x128_sse2, 12), - VarianceParams(6, 6, &aom_highbd_12_variance64x64_sse2, 12), - VarianceParams(6, 5, &aom_highbd_12_variance64x32_sse2, 12), - VarianceParams(5, 6, &aom_highbd_12_variance32x64_sse2, 12), - VarianceParams(5, 5, &aom_highbd_12_variance32x32_sse2, 12), - VarianceParams(5, 4, &aom_highbd_12_variance32x16_sse2, 12), - VarianceParams(4, 5, &aom_highbd_12_variance16x32_sse2, 12), - VarianceParams(4, 4, &aom_highbd_12_variance16x16_sse2, 12), - VarianceParams(4, 3, &aom_highbd_12_variance16x8_sse2, 12), - VarianceParams(3, 4, &aom_highbd_12_variance8x16_sse2, 12), - VarianceParams(3, 3, &aom_highbd_12_variance8x8_sse2, 12), - VarianceParams(7, 7, &aom_highbd_10_variance128x128_sse2, 10), - VarianceParams(7, 6, &aom_highbd_10_variance128x64_sse2, 10), - VarianceParams(6, 7, &aom_highbd_10_variance64x128_sse2, 10), - VarianceParams(6, 6, &aom_highbd_10_variance64x64_sse2, 10), - VarianceParams(6, 5, &aom_highbd_10_variance64x32_sse2, 10), - VarianceParams(5, 6, &aom_highbd_10_variance32x64_sse2, 10), - VarianceParams(5, 5, &aom_highbd_10_variance32x32_sse2, 10), - VarianceParams(5, 4, &aom_highbd_10_variance32x16_sse2, 10), - VarianceParams(4, 5, &aom_highbd_10_variance16x32_sse2, 10), - VarianceParams(4, 4, &aom_highbd_10_variance16x16_sse2, 10), - VarianceParams(4, 3, &aom_highbd_10_variance16x8_sse2, 10), - VarianceParams(3, 4, &aom_highbd_10_variance8x16_sse2, 10), - VarianceParams(3, 3, &aom_highbd_10_variance8x8_sse2, 10), - VarianceParams(7, 7, &aom_highbd_8_variance128x128_sse2, 8), - VarianceParams(7, 6, &aom_highbd_8_variance128x64_sse2, 8), - VarianceParams(6, 7, &aom_highbd_8_variance64x128_sse2, 8), - VarianceParams(6, 6, &aom_highbd_8_variance64x64_sse2, 8), - VarianceParams(6, 5, &aom_highbd_8_variance64x32_sse2, 8), - VarianceParams(5, 6, &aom_highbd_8_variance32x64_sse2, 8), - VarianceParams(5, 5, &aom_highbd_8_variance32x32_sse2, 8), - VarianceParams(5, 4, &aom_highbd_8_variance32x16_sse2, 8), - VarianceParams(4, 5, &aom_highbd_8_variance16x32_sse2, 8), - VarianceParams(4, 4, &aom_highbd_8_variance16x16_sse2, 8), - VarianceParams(4, 3, &aom_highbd_8_variance16x8_sse2, 8), - VarianceParams(3, 4, &aom_highbd_8_variance8x16_sse2, 8), - VarianceParams(3, 3, &aom_highbd_8_variance8x8_sse2, 8) -}; -INSTANTIATE_TEST_CASE_P(SSE2, AvxHBDVarianceTest, - ::testing::ValuesIn(kArrayHBDVariance_sse2)); - -#if HAVE_AVX2 - -const VarianceParams kArrayHBDVariance_avx2[] = { - VarianceParams(7, 7, &aom_highbd_10_variance128x128_avx2, 10), - VarianceParams(7, 6, &aom_highbd_10_variance128x64_avx2, 10), - VarianceParams(6, 7, &aom_highbd_10_variance64x128_avx2, 10), - VarianceParams(6, 6, &aom_highbd_10_variance64x64_avx2, 10), - VarianceParams(6, 5, &aom_highbd_10_variance64x32_avx2, 10), - VarianceParams(5, 6, &aom_highbd_10_variance32x64_avx2, 10), - VarianceParams(5, 5, &aom_highbd_10_variance32x32_avx2, 10), - VarianceParams(5, 4, &aom_highbd_10_variance32x16_avx2, 10), - VarianceParams(4, 5, &aom_highbd_10_variance16x32_avx2, 10), - VarianceParams(4, 4, &aom_highbd_10_variance16x16_avx2, 10), - VarianceParams(4, 3, &aom_highbd_10_variance16x8_avx2, 10), - VarianceParams(3, 4, &aom_highbd_10_variance8x16_avx2, 10), - VarianceParams(3, 3, &aom_highbd_10_variance8x8_avx2, 10) -}; - -INSTANTIATE_TEST_CASE_P(AVX2, AvxHBDVarianceTest, - ::testing::ValuesIn(kArrayHBDVariance_avx2)); -#endif // HAVE_AVX2 - -const SubpelVarianceParams kArrayHBDSubpelVariance_sse2[] = { - SubpelVarianceParams(6, 6, &aom_highbd_12_sub_pixel_variance64x64_sse2, 12), - SubpelVarianceParams(6, 5, &aom_highbd_12_sub_pixel_variance64x32_sse2, 12), - SubpelVarianceParams(5, 6, &aom_highbd_12_sub_pixel_variance32x64_sse2, 12), - SubpelVarianceParams(5, 5, &aom_highbd_12_sub_pixel_variance32x32_sse2, 12), - SubpelVarianceParams(5, 4, &aom_highbd_12_sub_pixel_variance32x16_sse2, 12), - SubpelVarianceParams(4, 5, &aom_highbd_12_sub_pixel_variance16x32_sse2, 12), - SubpelVarianceParams(4, 4, &aom_highbd_12_sub_pixel_variance16x16_sse2, 12), - SubpelVarianceParams(4, 3, &aom_highbd_12_sub_pixel_variance16x8_sse2, 12), - SubpelVarianceParams(3, 4, &aom_highbd_12_sub_pixel_variance8x16_sse2, 12), - SubpelVarianceParams(3, 3, &aom_highbd_12_sub_pixel_variance8x8_sse2, 12), - SubpelVarianceParams(3, 2, &aom_highbd_12_sub_pixel_variance8x4_sse2, 12), - SubpelVarianceParams(6, 6, &aom_highbd_10_sub_pixel_variance64x64_sse2, 10), - SubpelVarianceParams(6, 5, &aom_highbd_10_sub_pixel_variance64x32_sse2, 10), - SubpelVarianceParams(5, 6, &aom_highbd_10_sub_pixel_variance32x64_sse2, 10), - SubpelVarianceParams(5, 5, &aom_highbd_10_sub_pixel_variance32x32_sse2, 10), - SubpelVarianceParams(5, 4, &aom_highbd_10_sub_pixel_variance32x16_sse2, 10), - SubpelVarianceParams(4, 5, &aom_highbd_10_sub_pixel_variance16x32_sse2, 10), - SubpelVarianceParams(4, 4, &aom_highbd_10_sub_pixel_variance16x16_sse2, 10), - SubpelVarianceParams(4, 3, &aom_highbd_10_sub_pixel_variance16x8_sse2, 10), - SubpelVarianceParams(3, 4, &aom_highbd_10_sub_pixel_variance8x16_sse2, 10), - SubpelVarianceParams(3, 3, &aom_highbd_10_sub_pixel_variance8x8_sse2, 10), - SubpelVarianceParams(3, 2, &aom_highbd_10_sub_pixel_variance8x4_sse2, 10), - SubpelVarianceParams(6, 6, &aom_highbd_8_sub_pixel_variance64x64_sse2, 8), - SubpelVarianceParams(6, 5, &aom_highbd_8_sub_pixel_variance64x32_sse2, 8), - SubpelVarianceParams(5, 6, &aom_highbd_8_sub_pixel_variance32x64_sse2, 8), - SubpelVarianceParams(5, 5, &aom_highbd_8_sub_pixel_variance32x32_sse2, 8), - SubpelVarianceParams(5, 4, &aom_highbd_8_sub_pixel_variance32x16_sse2, 8), - SubpelVarianceParams(4, 5, &aom_highbd_8_sub_pixel_variance16x32_sse2, 8), - SubpelVarianceParams(4, 4, &aom_highbd_8_sub_pixel_variance16x16_sse2, 8), - SubpelVarianceParams(4, 3, &aom_highbd_8_sub_pixel_variance16x8_sse2, 8), - SubpelVarianceParams(3, 4, &aom_highbd_8_sub_pixel_variance8x16_sse2, 8), - SubpelVarianceParams(3, 3, &aom_highbd_8_sub_pixel_variance8x8_sse2, 8), - SubpelVarianceParams(3, 2, &aom_highbd_8_sub_pixel_variance8x4_sse2, 8) -}; - -INSTANTIATE_TEST_CASE_P(SSE2, AvxHBDSubpelVarianceTest, - ::testing::ValuesIn(kArrayHBDSubpelVariance_sse2)); - -const SubpelAvgVarianceParams kArrayHBDSubpelAvgVariance_sse2[] = { - SubpelAvgVarianceParams(6, 6, &aom_highbd_12_sub_pixel_avg_variance64x64_sse2, - 12), - SubpelAvgVarianceParams(6, 5, &aom_highbd_12_sub_pixel_avg_variance64x32_sse2, - 12), - SubpelAvgVarianceParams(5, 6, &aom_highbd_12_sub_pixel_avg_variance32x64_sse2, - 12), - SubpelAvgVarianceParams(5, 5, &aom_highbd_12_sub_pixel_avg_variance32x32_sse2, - 12), - SubpelAvgVarianceParams(5, 4, &aom_highbd_12_sub_pixel_avg_variance32x16_sse2, - 12), - SubpelAvgVarianceParams(4, 5, &aom_highbd_12_sub_pixel_avg_variance16x32_sse2, - 12), - SubpelAvgVarianceParams(4, 4, &aom_highbd_12_sub_pixel_avg_variance16x16_sse2, - 12), - SubpelAvgVarianceParams(4, 3, &aom_highbd_12_sub_pixel_avg_variance16x8_sse2, - 12), - SubpelAvgVarianceParams(3, 4, &aom_highbd_12_sub_pixel_avg_variance8x16_sse2, - 12), - SubpelAvgVarianceParams(3, 3, &aom_highbd_12_sub_pixel_avg_variance8x8_sse2, - 12), - SubpelAvgVarianceParams(3, 2, &aom_highbd_12_sub_pixel_avg_variance8x4_sse2, - 12), - SubpelAvgVarianceParams(6, 6, &aom_highbd_10_sub_pixel_avg_variance64x64_sse2, - 10), - SubpelAvgVarianceParams(6, 5, &aom_highbd_10_sub_pixel_avg_variance64x32_sse2, - 10), - SubpelAvgVarianceParams(5, 6, &aom_highbd_10_sub_pixel_avg_variance32x64_sse2, - 10), - SubpelAvgVarianceParams(5, 5, &aom_highbd_10_sub_pixel_avg_variance32x32_sse2, - 10), - SubpelAvgVarianceParams(5, 4, &aom_highbd_10_sub_pixel_avg_variance32x16_sse2, - 10), - SubpelAvgVarianceParams(4, 5, &aom_highbd_10_sub_pixel_avg_variance16x32_sse2, - 10), - SubpelAvgVarianceParams(4, 4, &aom_highbd_10_sub_pixel_avg_variance16x16_sse2, - 10), - SubpelAvgVarianceParams(4, 3, &aom_highbd_10_sub_pixel_avg_variance16x8_sse2, - 10), - SubpelAvgVarianceParams(3, 4, &aom_highbd_10_sub_pixel_avg_variance8x16_sse2, - 10), - SubpelAvgVarianceParams(3, 3, &aom_highbd_10_sub_pixel_avg_variance8x8_sse2, - 10), - SubpelAvgVarianceParams(3, 2, &aom_highbd_10_sub_pixel_avg_variance8x4_sse2, - 10), - SubpelAvgVarianceParams(6, 6, &aom_highbd_8_sub_pixel_avg_variance64x64_sse2, - 8), - SubpelAvgVarianceParams(6, 5, &aom_highbd_8_sub_pixel_avg_variance64x32_sse2, - 8), - SubpelAvgVarianceParams(5, 6, &aom_highbd_8_sub_pixel_avg_variance32x64_sse2, - 8), - SubpelAvgVarianceParams(5, 5, &aom_highbd_8_sub_pixel_avg_variance32x32_sse2, - 8), - SubpelAvgVarianceParams(5, 4, &aom_highbd_8_sub_pixel_avg_variance32x16_sse2, - 8), - SubpelAvgVarianceParams(4, 5, &aom_highbd_8_sub_pixel_avg_variance16x32_sse2, - 8), - SubpelAvgVarianceParams(4, 4, &aom_highbd_8_sub_pixel_avg_variance16x16_sse2, - 8), - SubpelAvgVarianceParams(4, 3, &aom_highbd_8_sub_pixel_avg_variance16x8_sse2, - 8), - SubpelAvgVarianceParams(3, 4, &aom_highbd_8_sub_pixel_avg_variance8x16_sse2, - 8), - SubpelAvgVarianceParams(3, 3, &aom_highbd_8_sub_pixel_avg_variance8x8_sse2, - 8), - SubpelAvgVarianceParams(3, 2, &aom_highbd_8_sub_pixel_avg_variance8x4_sse2, 8) -}; - -INSTANTIATE_TEST_CASE_P(SSE2, AvxHBDSubpelAvgVarianceTest, - ::testing::ValuesIn(kArrayHBDSubpelAvgVariance_sse2)); -#endif // HAVE_SSE2 - -#if HAVE_SSSE3 -INSTANTIATE_TEST_CASE_P( - SSSE3, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(7, 7, &aom_sub_pixel_variance128x128_ssse3, 0), - SubpelVarianceParams(7, 6, &aom_sub_pixel_variance128x64_ssse3, 0), - SubpelVarianceParams(6, 7, &aom_sub_pixel_variance64x128_ssse3, 0), - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_ssse3, 0), - SubpelVarianceParams(6, 5, &aom_sub_pixel_variance64x32_ssse3, 0), - SubpelVarianceParams(5, 6, &aom_sub_pixel_variance32x64_ssse3, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_ssse3, 0), - SubpelVarianceParams(5, 4, &aom_sub_pixel_variance32x16_ssse3, 0), - SubpelVarianceParams(4, 5, &aom_sub_pixel_variance16x32_ssse3, 0), - SubpelVarianceParams(4, 4, &aom_sub_pixel_variance16x16_ssse3, 0), - SubpelVarianceParams(4, 3, &aom_sub_pixel_variance16x8_ssse3, 0), - SubpelVarianceParams(3, 4, &aom_sub_pixel_variance8x16_ssse3, 0), - SubpelVarianceParams(3, 3, &aom_sub_pixel_variance8x8_ssse3, 0), - SubpelVarianceParams(3, 2, &aom_sub_pixel_variance8x4_ssse3, 0), - SubpelVarianceParams(2, 3, &aom_sub_pixel_variance4x8_ssse3, 0), - SubpelVarianceParams(2, 2, &aom_sub_pixel_variance4x4_ssse3, 0))); - -INSTANTIATE_TEST_CASE_P( - SSSE3, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(7, 7, &aom_sub_pixel_avg_variance128x128_ssse3, - 0), - SubpelAvgVarianceParams(7, 6, &aom_sub_pixel_avg_variance128x64_ssse3, - 0), - SubpelAvgVarianceParams(6, 7, &aom_sub_pixel_avg_variance64x128_ssse3, - 0), - SubpelAvgVarianceParams(6, 6, &aom_sub_pixel_avg_variance64x64_ssse3, - 0), - SubpelAvgVarianceParams(6, 5, &aom_sub_pixel_avg_variance64x32_ssse3, - 0), - SubpelAvgVarianceParams(5, 6, &aom_sub_pixel_avg_variance32x64_ssse3, - 0), - SubpelAvgVarianceParams(5, 5, &aom_sub_pixel_avg_variance32x32_ssse3, - 0), - SubpelAvgVarianceParams(5, 4, &aom_sub_pixel_avg_variance32x16_ssse3, - 0), - SubpelAvgVarianceParams(4, 5, &aom_sub_pixel_avg_variance16x32_ssse3, - 0), - SubpelAvgVarianceParams(4, 4, &aom_sub_pixel_avg_variance16x16_ssse3, - 0), - SubpelAvgVarianceParams(4, 3, &aom_sub_pixel_avg_variance16x8_ssse3, 0), - SubpelAvgVarianceParams(3, 4, &aom_sub_pixel_avg_variance8x16_ssse3, 0), - SubpelAvgVarianceParams(3, 3, &aom_sub_pixel_avg_variance8x8_ssse3, 0), - SubpelAvgVarianceParams(3, 2, &aom_sub_pixel_avg_variance8x4_ssse3, 0), - SubpelAvgVarianceParams(2, 3, &aom_sub_pixel_avg_variance4x8_ssse3, 0), - SubpelAvgVarianceParams(2, 2, &aom_sub_pixel_avg_variance4x4_ssse3, - 0))); - -INSTANTIATE_TEST_CASE_P( - SSSE3, AvxJntSubpelAvgVarianceTest, - ::testing::Values( - JntSubpelAvgVarianceParams(6, 6, - &aom_jnt_sub_pixel_avg_variance64x64_ssse3, - 0), - JntSubpelAvgVarianceParams(6, 5, - &aom_jnt_sub_pixel_avg_variance64x32_ssse3, - 0), - JntSubpelAvgVarianceParams(5, 6, - &aom_jnt_sub_pixel_avg_variance32x64_ssse3, - 0), - JntSubpelAvgVarianceParams(5, 5, - &aom_jnt_sub_pixel_avg_variance32x32_ssse3, - 0), - JntSubpelAvgVarianceParams(5, 4, - &aom_jnt_sub_pixel_avg_variance32x16_ssse3, - 0), - JntSubpelAvgVarianceParams(4, 5, - &aom_jnt_sub_pixel_avg_variance16x32_ssse3, - 0), - JntSubpelAvgVarianceParams(4, 4, - &aom_jnt_sub_pixel_avg_variance16x16_ssse3, - 0), - JntSubpelAvgVarianceParams(4, 3, - &aom_jnt_sub_pixel_avg_variance16x8_ssse3, - 0), - JntSubpelAvgVarianceParams(3, 4, - &aom_jnt_sub_pixel_avg_variance8x16_ssse3, - 0), - JntSubpelAvgVarianceParams(3, 3, - &aom_jnt_sub_pixel_avg_variance8x8_ssse3, 0), - JntSubpelAvgVarianceParams(3, 2, - &aom_jnt_sub_pixel_avg_variance8x4_ssse3, 0), - JntSubpelAvgVarianceParams(2, 3, - &aom_jnt_sub_pixel_avg_variance4x8_ssse3, 0), - JntSubpelAvgVarianceParams(2, 2, - &aom_jnt_sub_pixel_avg_variance4x4_ssse3, - 0))); -#endif // HAVE_SSSE3 - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, AvxObmcSubpelVarianceTest, - ::testing::Values( - ObmcSubpelVarianceParams(7, 7, - &aom_obmc_sub_pixel_variance128x128_sse4_1, 0), - ObmcSubpelVarianceParams(7, 6, - &aom_obmc_sub_pixel_variance128x64_sse4_1, 0), - ObmcSubpelVarianceParams(6, 7, - &aom_obmc_sub_pixel_variance64x128_sse4_1, 0), - ObmcSubpelVarianceParams(6, 6, &aom_obmc_sub_pixel_variance64x64_sse4_1, - 0), - ObmcSubpelVarianceParams(6, 5, &aom_obmc_sub_pixel_variance64x32_sse4_1, - 0), - ObmcSubpelVarianceParams(5, 6, &aom_obmc_sub_pixel_variance32x64_sse4_1, - 0), - ObmcSubpelVarianceParams(5, 5, &aom_obmc_sub_pixel_variance32x32_sse4_1, - 0), - ObmcSubpelVarianceParams(5, 4, &aom_obmc_sub_pixel_variance32x16_sse4_1, - 0), - ObmcSubpelVarianceParams(4, 5, &aom_obmc_sub_pixel_variance16x32_sse4_1, - 0), - ObmcSubpelVarianceParams(4, 4, &aom_obmc_sub_pixel_variance16x16_sse4_1, - 0), - ObmcSubpelVarianceParams(4, 3, &aom_obmc_sub_pixel_variance16x8_sse4_1, - 0), - ObmcSubpelVarianceParams(3, 4, &aom_obmc_sub_pixel_variance8x16_sse4_1, - 0), - ObmcSubpelVarianceParams(3, 3, &aom_obmc_sub_pixel_variance8x8_sse4_1, - 0), - ObmcSubpelVarianceParams(3, 2, &aom_obmc_sub_pixel_variance8x4_sse4_1, - 0), - ObmcSubpelVarianceParams(2, 3, &aom_obmc_sub_pixel_variance4x8_sse4_1, - 0), - ObmcSubpelVarianceParams(2, 2, &aom_obmc_sub_pixel_variance4x4_sse4_1, - 0))); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 -INSTANTIATE_TEST_CASE_P(AVX2, AvxMseTest, - ::testing::Values(MseParams(4, 4, &aom_mse16x16_avx2))); - -INSTANTIATE_TEST_CASE_P( - AVX2, AvxVarianceTest, - ::testing::Values(VarianceParams(7, 7, &aom_variance128x128_avx2), - VarianceParams(7, 6, &aom_variance128x64_avx2), - VarianceParams(6, 7, &aom_variance64x128_avx2), - VarianceParams(6, 6, &aom_variance64x64_avx2), - VarianceParams(6, 5, &aom_variance64x32_avx2), - VarianceParams(6, 4, &aom_variance64x16_avx2), - VarianceParams(5, 6, &aom_variance32x64_avx2), - VarianceParams(5, 5, &aom_variance32x32_avx2), - VarianceParams(5, 4, &aom_variance32x16_avx2), - VarianceParams(5, 3, &aom_variance32x8_avx2), - VarianceParams(4, 6, &aom_variance16x64_avx2), - VarianceParams(4, 5, &aom_variance16x32_avx2), - VarianceParams(4, 4, &aom_variance16x16_avx2), - VarianceParams(4, 3, &aom_variance16x8_avx2), - VarianceParams(4, 2, &aom_variance16x4_avx2))); - -INSTANTIATE_TEST_CASE_P( - AVX2, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(7, 7, &aom_sub_pixel_variance128x128_avx2, 0), - SubpelVarianceParams(7, 6, &aom_sub_pixel_variance128x64_avx2, 0), - SubpelVarianceParams(6, 7, &aom_sub_pixel_variance64x128_avx2, 0), - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_avx2, 0), - SubpelVarianceParams(6, 5, &aom_sub_pixel_variance64x32_avx2, 0), - SubpelVarianceParams(5, 6, &aom_sub_pixel_variance32x64_avx2, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_avx2, 0), - SubpelVarianceParams(5, 4, &aom_sub_pixel_variance32x16_avx2, 0))); - -INSTANTIATE_TEST_CASE_P( - AVX2, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(7, 7, &aom_sub_pixel_avg_variance128x128_avx2, - 0), - SubpelAvgVarianceParams(7, 6, &aom_sub_pixel_avg_variance128x64_avx2, - 0), - SubpelAvgVarianceParams(6, 7, &aom_sub_pixel_avg_variance64x128_avx2, - 0), - SubpelAvgVarianceParams(6, 6, &aom_sub_pixel_avg_variance64x64_avx2, 0), - SubpelAvgVarianceParams(6, 5, &aom_sub_pixel_avg_variance64x32_avx2, 0), - SubpelAvgVarianceParams(5, 6, &aom_sub_pixel_avg_variance32x64_avx2, 0), - SubpelAvgVarianceParams(5, 5, &aom_sub_pixel_avg_variance32x32_avx2, 0), - SubpelAvgVarianceParams(5, 4, &aom_sub_pixel_avg_variance32x16_avx2, - 0))); -#endif // HAVE_AVX2 - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P(NEON, AvxSseTest, - ::testing::Values(SseParams(2, 2, - &aom_get4x4sse_cs_neon))); - -INSTANTIATE_TEST_CASE_P(NEON, AvxMseTest, - ::testing::Values(MseParams(4, 4, &aom_mse16x16_neon))); - -INSTANTIATE_TEST_CASE_P( - NEON, AvxVarianceTest, - ::testing::Values(VarianceParams(6, 6, &aom_variance64x64_neon), - VarianceParams(6, 5, &aom_variance64x32_neon), - VarianceParams(5, 6, &aom_variance32x64_neon), - VarianceParams(5, 5, &aom_variance32x32_neon), - VarianceParams(4, 4, &aom_variance16x16_neon), - VarianceParams(4, 3, &aom_variance16x8_neon), - VarianceParams(3, 4, &aom_variance8x16_neon), - VarianceParams(3, 3, &aom_variance8x8_neon))); - -INSTANTIATE_TEST_CASE_P( - NEON, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_neon, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_neon, 0), - SubpelVarianceParams(4, 4, &aom_sub_pixel_variance16x16_neon, 0), - SubpelVarianceParams(3, 3, &aom_sub_pixel_variance8x8_neon, 0))); -#endif // HAVE_NEON - -#if HAVE_MSA -INSTANTIATE_TEST_CASE_P(MSA, SumOfSquaresTest, - ::testing::Values(aom_get_mb_ss_msa)); - -INSTANTIATE_TEST_CASE_P(MSA, AvxSseTest, - ::testing::Values(SseParams(2, 2, - &aom_get4x4sse_cs_msa))); - -INSTANTIATE_TEST_CASE_P(MSA, AvxMseTest, - ::testing::Values(MseParams(4, 4, &aom_mse16x16_msa), - MseParams(4, 3, &aom_mse16x8_msa), - MseParams(3, 4, &aom_mse8x16_msa), - MseParams(3, 3, &aom_mse8x8_msa))); - -INSTANTIATE_TEST_CASE_P( - MSA, AvxVarianceTest, - ::testing::Values(VarianceParams(6, 6, &aom_variance64x64_msa), - VarianceParams(6, 5, &aom_variance64x32_msa), - VarianceParams(5, 6, &aom_variance32x64_msa), - VarianceParams(5, 5, &aom_variance32x32_msa), - VarianceParams(5, 4, &aom_variance32x16_msa), - VarianceParams(4, 5, &aom_variance16x32_msa), - VarianceParams(4, 4, &aom_variance16x16_msa), - VarianceParams(4, 3, &aom_variance16x8_msa), - VarianceParams(3, 4, &aom_variance8x16_msa), - VarianceParams(3, 3, &aom_variance8x8_msa), - VarianceParams(3, 2, &aom_variance8x4_msa), - VarianceParams(2, 3, &aom_variance4x8_msa), - VarianceParams(2, 2, &aom_variance4x4_msa))); - -INSTANTIATE_TEST_CASE_P( - MSA, AvxSubpelVarianceTest, - ::testing::Values( - SubpelVarianceParams(2, 2, &aom_sub_pixel_variance4x4_msa, 0), - SubpelVarianceParams(2, 3, &aom_sub_pixel_variance4x8_msa, 0), - SubpelVarianceParams(3, 2, &aom_sub_pixel_variance8x4_msa, 0), - SubpelVarianceParams(3, 3, &aom_sub_pixel_variance8x8_msa, 0), - SubpelVarianceParams(3, 4, &aom_sub_pixel_variance8x16_msa, 0), - SubpelVarianceParams(4, 3, &aom_sub_pixel_variance16x8_msa, 0), - SubpelVarianceParams(4, 4, &aom_sub_pixel_variance16x16_msa, 0), - SubpelVarianceParams(4, 5, &aom_sub_pixel_variance16x32_msa, 0), - SubpelVarianceParams(5, 4, &aom_sub_pixel_variance32x16_msa, 0), - SubpelVarianceParams(5, 5, &aom_sub_pixel_variance32x32_msa, 0), - SubpelVarianceParams(5, 6, &aom_sub_pixel_variance32x64_msa, 0), - SubpelVarianceParams(6, 5, &aom_sub_pixel_variance64x32_msa, 0), - SubpelVarianceParams(6, 6, &aom_sub_pixel_variance64x64_msa, 0))); - -INSTANTIATE_TEST_CASE_P( - MSA, AvxSubpelAvgVarianceTest, - ::testing::Values( - SubpelAvgVarianceParams(6, 6, &aom_sub_pixel_avg_variance64x64_msa, 0), - SubpelAvgVarianceParams(6, 5, &aom_sub_pixel_avg_variance64x32_msa, 0), - SubpelAvgVarianceParams(5, 6, &aom_sub_pixel_avg_variance32x64_msa, 0), - SubpelAvgVarianceParams(5, 5, &aom_sub_pixel_avg_variance32x32_msa, 0), - SubpelAvgVarianceParams(5, 4, &aom_sub_pixel_avg_variance32x16_msa, 0), - SubpelAvgVarianceParams(4, 5, &aom_sub_pixel_avg_variance16x32_msa, 0), - SubpelAvgVarianceParams(4, 4, &aom_sub_pixel_avg_variance16x16_msa, 0), - SubpelAvgVarianceParams(4, 3, &aom_sub_pixel_avg_variance16x8_msa, 0), - SubpelAvgVarianceParams(3, 4, &aom_sub_pixel_avg_variance8x16_msa, 0), - SubpelAvgVarianceParams(3, 3, &aom_sub_pixel_avg_variance8x8_msa, 0), - SubpelAvgVarianceParams(3, 2, &aom_sub_pixel_avg_variance8x4_msa, 0), - SubpelAvgVarianceParams(2, 3, &aom_sub_pixel_avg_variance4x8_msa, 0), - SubpelAvgVarianceParams(2, 2, &aom_sub_pixel_avg_variance4x4_msa, 0))); -#endif // HAVE_MSA -} // namespace diff --git a/third_party/aom/test/video_source.h b/third_party/aom/test/video_source.h deleted file mode 100644 index 3c1c5e559..000000000 --- a/third_party/aom/test/video_source.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_VIDEO_SOURCE_H_ -#define AOM_TEST_VIDEO_SOURCE_H_ - -#if defined(_WIN32) -#undef NOMINMAX -#define NOMINMAX -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#endif -#include <cstdio> -#include <cstdlib> -#include <string> -#include "test/acm_random.h" -#include "aom/aom_encoder.h" - -namespace libaom_test { - -// Helper macros to ensure LIBAOM_TEST_DATA_PATH is a quoted string. -// These are undefined right below GetDataPath -// NOTE: LIBAOM_TEST_DATA_PATH MUST NOT be a quoted string before -// Stringification or the GetDataPath will fail at runtime -#define TO_STRING(S) #S -#define STRINGIFY(S) TO_STRING(S) - -// A simple function to encapsulate cross platform retrieval of test data path -static std::string GetDataPath() { - const char *const data_path = getenv("LIBAOM_TEST_DATA_PATH"); - if (data_path == NULL) { -#ifdef LIBAOM_TEST_DATA_PATH - // In some environments, we cannot set environment variables - // Instead, we set the data path by using a preprocessor symbol - // which can be set from make files - return STRINGIFY(LIBAOM_TEST_DATA_PATH); -#else - return "."; -#endif - } - return data_path; -} - -// Undefining stringification macros because they are not used elsewhere -#undef TO_STRING -#undef STRINGIFY - -inline FILE *OpenTestDataFile(const std::string &file_name) { - const std::string path_to_source = GetDataPath() + "/" + file_name; - return fopen(path_to_source.c_str(), "rb"); -} - -static FILE *GetTempOutFile(std::string *file_name) { - file_name->clear(); -#if defined(_WIN32) - char fname[MAX_PATH]; - char tmppath[MAX_PATH]; - if (GetTempPathA(MAX_PATH, tmppath)) { - // Assume for now that the filename generated is unique per process - if (GetTempFileNameA(tmppath, "lvx", 0, fname)) { - file_name->assign(fname); - return fopen(fname, "wb+"); - } - } - return NULL; -#else - char name_template[] = "/tmp/libaomtest.XXXXXX"; - const int fd = mkstemp(name_template); - *file_name = name_template; - return fdopen(fd, "wb+"); -#endif -} - -class TempOutFile { - public: - TempOutFile() { file_ = GetTempOutFile(&file_name_); } - ~TempOutFile() { - CloseFile(); - if (!file_name_.empty()) { - EXPECT_EQ(0, remove(file_name_.c_str())); - } - } - FILE *file() { return file_; } - const std::string &file_name() { return file_name_; } - - protected: - void CloseFile() { - if (file_) { - fclose(file_); - file_ = NULL; - } - } - FILE *file_; - std::string file_name_; -}; - -// Abstract base class for test video sources, which provide a stream of -// aom_image_t images with associated timestamps and duration. -class VideoSource { - public: - virtual ~VideoSource() {} - - // Prepare the stream for reading, rewind/open as necessary. - virtual void Begin() = 0; - - // Advance the cursor to the next frame - virtual void Next() = 0; - - // Get the current video frame, or NULL on End-Of-Stream. - virtual aom_image_t *img() const = 0; - - // Get the presentation timestamp of the current frame. - virtual aom_codec_pts_t pts() const = 0; - - // Get the current frame's duration - virtual unsigned long duration() const = 0; - - // Get the timebase for the stream - virtual aom_rational_t timebase() const = 0; - - // Get the current frame counter, starting at 0. - virtual unsigned int frame() const = 0; - - // Get the current file limit. - virtual unsigned int limit() const = 0; -}; - -class DummyVideoSource : public VideoSource { - public: - DummyVideoSource() - : img_(NULL), limit_(100), width_(80), height_(64), - format_(AOM_IMG_FMT_I420) { - ReallocImage(); - } - - virtual ~DummyVideoSource() { aom_img_free(img_); } - - virtual void Begin() { - frame_ = 0; - FillFrame(); - } - - virtual void Next() { - ++frame_; - FillFrame(); - } - - virtual aom_image_t *img() const { return (frame_ < limit_) ? img_ : NULL; } - - // Models a stream where Timebase = 1/FPS, so pts == frame. - virtual aom_codec_pts_t pts() const { return frame_; } - - virtual unsigned long duration() const { return 1; } - - virtual aom_rational_t timebase() const { - const aom_rational_t t = { 1, 30 }; - return t; - } - - virtual unsigned int frame() const { return frame_; } - - 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_) { - width_ = width; - height_ = height; - ReallocImage(); - } - } - - void SetImageFormat(aom_img_fmt_t format) { - if (format_ != format) { - format_ = format; - ReallocImage(); - } - } - - protected: - virtual void FillFrame() { - if (img_) memset(img_->img_data, 0, raw_sz_); - } - - void ReallocImage() { - aom_img_free(img_); - img_ = aom_img_alloc(NULL, format_, width_, height_, 32); - raw_sz_ = ((img_->w + 31) & ~31) * img_->h * img_->bps / 8; - } - - aom_image_t *img_; - size_t raw_sz_; - unsigned int limit_; - unsigned int frame_; - unsigned int width_; - unsigned int height_; - aom_img_fmt_t format_; -}; - -class RandomVideoSource : public DummyVideoSource { - public: - RandomVideoSource(int seed = ACMRandom::DeterministicSeed()) - : rnd_(seed), seed_(seed) {} - - protected: - // Reset the RNG to get a matching stream for the second pass - virtual void Begin() { - frame_ = 0; - rnd_.Reset(seed_); - FillFrame(); - } - - // 15 frames of noise, followed by 15 static frames. Reset to 0 rather - // than holding previous frames to encourage keyframes to be thrown. - virtual void FillFrame() { - if (img_) { - if (frame_ % 30 < 15) - for (size_t i = 0; i < raw_sz_; ++i) img_->img_data[i] = rnd_.Rand8(); - else - memset(img_->img_data, 0, raw_sz_); - } - } - - ACMRandom rnd_; - int seed_; -}; - -// Abstract base class for test video sources, which provide a stream of -// decompressed images to the decoder. -class CompressedVideoSource { - public: - virtual ~CompressedVideoSource() {} - - virtual void Init() = 0; - - // Prepare the stream for reading, rewind/open as necessary. - virtual void Begin() = 0; - - // Advance the cursor to the next frame - virtual void Next() = 0; - - virtual const uint8_t *cxdata() const = 0; - - virtual size_t frame_size() const = 0; - - virtual unsigned int frame_number() const = 0; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_VIDEO_SOURCE_H_ diff --git a/third_party/aom/test/visual_metrics.py b/third_party/aom/test/visual_metrics.py deleted file mode 100755 index 9055feb33..000000000 --- a/third_party/aom/test/visual_metrics.py +++ /dev/null @@ -1,466 +0,0 @@ -#!/usr/bin/python -# -# Copyright (c) 2016, Alliance for Open Media. All rights reserved -# -# This source code is subject to the terms of the BSD 2 Clause License and -# the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License -# was not distributed with this source code in the LICENSE file, you can -# obtain it at www.aomedia.org/license/software. If the Alliance for Open -# Media Patent License 1.0 was not distributed with this source code in the -# PATENTS file, you can obtain it at www.aomedia.org/license/patent. -# - -"""Converts video encoding result data from text files to visualization -data source.""" - -__author__ = "jzern@google.com (James Zern)," -__author__ += "jimbankoski@google.com (Jim Bankoski)" - -import fnmatch -import numpy as np -import scipy as sp -import scipy.interpolate -import os -import re -import string -import sys -import math -import warnings - -import gviz_api - -from os.path import basename -from os.path import splitext - -warnings.simplefilter('ignore', np.RankWarning) -warnings.simplefilter('ignore', RuntimeWarning) - -def bdsnr2(metric_set1, metric_set2): - """ - BJONTEGAARD Bjontegaard metric calculation adapted - Bjontegaard's snr metric allows to compute the average % saving in decibels - between two rate-distortion curves [1]. This is an adaptation of that - method that fixes inconsistencies when the curve fit operation goes awry - by replacing the curve fit function with a Piecewise Cubic Hermite - Interpolating Polynomial and then integrating that by evaluating that - function at small intervals using the trapezoid method to calculate - the integral. - - metric_set1 - list of tuples ( bitrate, metric ) for first graph - metric_set2 - list of tuples ( bitrate, metric ) for second graph - """ - - if not metric_set1 or not metric_set2: - return 0.0 - - try: - - # pchip_interlopate requires keys sorted by x axis. x-axis will - # be our metric not the bitrate so sort by metric. - metric_set1.sort() - metric_set2.sort() - - # Pull the log of the rate and clamped psnr from metric_sets. - log_rate1 = [math.log(x[0]) for x in metric_set1] - metric1 = [100.0 if x[1] == float('inf') else x[1] for x in metric_set1] - log_rate2 = [math.log(x[0]) for x in metric_set2] - metric2 = [100.0 if x[1] == float('inf') else x[1] for x in metric_set2] - - # Integration interval. This metric only works on the area that's - # overlapping. Extrapolation of these things is sketchy so we avoid. - min_int = max([min(log_rate1), min(log_rate2)]) - max_int = min([max(log_rate1), max(log_rate2)]) - - # No overlap means no sensible metric possible. - if max_int <= min_int: - return 0.0 - - # Use Piecewise Cubic Hermite Interpolating Polynomial interpolation to - # create 100 new samples points separated by interval. - lin = np.linspace(min_int, max_int, num=100, retstep=True) - interval = lin[1] - samples = lin[0] - v1 = scipy.interpolate.pchip_interpolate(log_rate1, metric1, samples) - v2 = scipy.interpolate.pchip_interpolate(log_rate2, metric2, samples) - - # Calculate the integral using the trapezoid method on the samples. - int_v1 = np.trapz(v1, dx=interval) - int_v2 = np.trapz(v2, dx=interval) - - # Calculate the average improvement. - avg_exp_diff = (int_v2 - int_v1) / (max_int - min_int) - - except (TypeError, ZeroDivisionError, ValueError, np.RankWarning) as e: - return 0 - - return avg_exp_diff - -def bdrate2(metric_set1, metric_set2): - """ - BJONTEGAARD Bjontegaard metric calculation adapted - Bjontegaard's metric allows to compute the average % saving in bitrate - between two rate-distortion curves [1]. This is an adaptation of that - method that fixes inconsistencies when the curve fit operation goes awry - by replacing the curve fit function with a Piecewise Cubic Hermite - Interpolating Polynomial and then integrating that by evaluating that - function at small intervals using the trapezoid method to calculate - the integral. - - metric_set1 - list of tuples ( bitrate, metric ) for first graph - metric_set2 - list of tuples ( bitrate, metric ) for second graph - """ - - if not metric_set1 or not metric_set2: - return 0.0 - - try: - - # pchip_interlopate requires keys sorted by x axis. x-axis will - # be our metric not the bitrate so sort by metric. - metric_set1.sort(key=lambda tup: tup[1]) - metric_set2.sort(key=lambda tup: tup[1]) - - # Pull the log of the rate and clamped psnr from metric_sets. - log_rate1 = [math.log(x[0]) for x in metric_set1] - metric1 = [100.0 if x[1] == float('inf') else x[1] for x in metric_set1] - log_rate2 = [math.log(x[0]) for x in metric_set2] - metric2 = [100.0 if x[1] == float('inf') else x[1] for x in metric_set2] - - # Integration interval. This metric only works on the area that's - # overlapping. Extrapolation of these things is sketchy so we avoid. - min_int = max([min(metric1), min(metric2)]) - max_int = min([max(metric1), max(metric2)]) - - # No overlap means no sensible metric possible. - if max_int <= min_int: - return 0.0 - - # Use Piecewise Cubic Hermite Interpolating Polynomial interpolation to - # create 100 new samples points separated by interval. - lin = np.linspace(min_int, max_int, num=100, retstep=True) - interval = lin[1] - samples = lin[0] - v1 = scipy.interpolate.pchip_interpolate(metric1, log_rate1, samples) - v2 = scipy.interpolate.pchip_interpolate(metric2, log_rate2, samples) - - # Calculate the integral using the trapezoid method on the samples. - int_v1 = np.trapz(v1, dx=interval) - int_v2 = np.trapz(v2, dx=interval) - - # Calculate the average improvement. - avg_exp_diff = (int_v2 - int_v1) / (max_int - min_int) - - except (TypeError, ZeroDivisionError, ValueError, np.RankWarning) as e: - return 0 - - # Convert to a percentage. - avg_diff = (math.exp(avg_exp_diff) - 1) * 100 - - return avg_diff - - - -def FillForm(string_for_substitution, dictionary_of_vars): - """ - This function substitutes all matches of the command string //%% ... %%// - with the variable represented by ... . - """ - return_string = string_for_substitution - for i in re.findall("//%%(.*)%%//", string_for_substitution): - return_string = re.sub("//%%" + i + "%%//", dictionary_of_vars[i], - return_string) - return return_string - - -def HasMetrics(line): - """ - The metrics files produced by aomenc are started with a B for headers. - """ - # If the first char of the first word on the line is a digit - if len(line) == 0: - return False - if len(line.split()) == 0: - return False - if line.split()[0][0:1].isdigit(): - return True - return False - -def GetMetrics(file_name): - metric_file = open(file_name, "r") - return metric_file.readline().split(); - -def ParseMetricFile(file_name, metric_column): - metric_set1 = set([]) - metric_file = open(file_name, "r") - for line in metric_file: - metrics = string.split(line) - if HasMetrics(line): - if metric_column < len(metrics): - try: - tuple = float(metrics[0]), float(metrics[metric_column]) - except: - tuple = float(metrics[0]), 0 - else: - tuple = float(metrics[0]), 0 - metric_set1.add(tuple) - metric_set1_sorted = sorted(metric_set1) - return metric_set1_sorted - - -def FileBetter(file_name_1, file_name_2, metric_column, method): - """ - Compares two data files and determines which is better and by how - much. Also produces a histogram of how much better, by PSNR. - metric_column is the metric. - """ - # Store and parse our two files into lists of unique tuples. - - # Read the two files, parsing out lines starting with bitrate. - metric_set1_sorted = ParseMetricFile(file_name_1, metric_column) - metric_set2_sorted = ParseMetricFile(file_name_2, metric_column) - - - def GraphBetter(metric_set1_sorted, metric_set2_sorted, base_is_set_2): - """ - Search through the sorted metric file for metrics on either side of - the metric from file 1. Since both lists are sorted we really - should not have to search through the entire range, but these - are small files.""" - total_bitrate_difference_ratio = 0.0 - count = 0 - for bitrate, metric in metric_set1_sorted: - if bitrate == 0: - continue - for i in range(len(metric_set2_sorted) - 1): - s2_bitrate_0, s2_metric_0 = metric_set2_sorted[i] - s2_bitrate_1, s2_metric_1 = metric_set2_sorted[i + 1] - # We have a point on either side of our metric range. - if metric > s2_metric_0 and metric <= s2_metric_1: - - # Calculate a slope. - if s2_metric_1 - s2_metric_0 != 0: - metric_slope = ((s2_bitrate_1 - s2_bitrate_0) / - (s2_metric_1 - s2_metric_0)) - else: - metric_slope = 0 - - estimated_s2_bitrate = (s2_bitrate_0 + (metric - s2_metric_0) * - metric_slope) - - if estimated_s2_bitrate == 0: - continue - # Calculate percentage difference as given by base. - if base_is_set_2 == 0: - bitrate_difference_ratio = ((bitrate - estimated_s2_bitrate) / - bitrate) - else: - bitrate_difference_ratio = ((bitrate - estimated_s2_bitrate) / - estimated_s2_bitrate) - - total_bitrate_difference_ratio += bitrate_difference_ratio - count += 1 - break - - # Calculate the average improvement between graphs. - if count != 0: - avg = total_bitrate_difference_ratio / count - - else: - avg = 0.0 - - return avg - - # Be fair to both graphs by testing all the points in each. - if method == 'avg': - avg_improvement = 50 * ( - GraphBetter(metric_set1_sorted, metric_set2_sorted, 1) - - GraphBetter(metric_set2_sorted, metric_set1_sorted, 0)) - elif method == 'dsnr': - avg_improvement = bdsnr2(metric_set1_sorted, metric_set2_sorted) - else: - avg_improvement = bdrate2(metric_set2_sorted, metric_set1_sorted) - - return avg_improvement - - -def HandleFiles(variables): - """ - This script creates html for displaying metric data produced from data - in a video stats file, as created by the AOM project when enable_psnr - is turned on: - - Usage: visual_metrics.py template.html pattern base_dir sub_dir [ sub_dir2 ..] - - The script parses each metrics file [see below] that matches the - statfile_pattern in the baseline directory and looks for the file that - matches that same file in each of the sub_dirs, and compares the resultant - metrics bitrate, avg psnr, glb psnr, and ssim. " - - It provides a table in which each row is a file in the line directory, - and a column for each subdir, with the cells representing how that clip - compares to baseline for that subdir. A graph is given for each which - compares filesize to that metric. If you click on a point in the graph it - zooms in on that point. - - a SAMPLE metrics file: - - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 25.911 38.242 38.104 38.258 38.121 75.790 14103 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 49.982 41.264 41.129 41.255 41.122 83.993 19817 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 74.967 42.911 42.767 42.899 42.756 87.928 17332 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 100.012 43.983 43.838 43.881 43.738 89.695 25389 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 149.980 45.338 45.203 45.184 45.043 91.591 25438 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 199.852 46.225 46.123 46.113 45.999 92.679 28302 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 249.922 46.864 46.773 46.777 46.673 93.334 27244 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 299.998 47.366 47.281 47.317 47.220 93.844 27137 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 349.769 47.746 47.677 47.722 47.648 94.178 32226 - Bitrate AVGPsnr GLBPsnr AVPsnrP GLPsnrP VPXSSIM Time(us) - 399.773 48.032 47.971 48.013 47.946 94.362 36203 - - sample use: - visual_metrics.py template.html "*stt" aom aom_b aom_c > metrics.html - """ - - # The template file is the html file into which we will write the - # data from the stats file, formatted correctly for the gviz_api. - template_file = open(variables[1], "r") - page_template = template_file.read() - template_file.close() - - # This is the path match pattern for finding stats files amongst - # all the other files it could be. eg: *.stt - file_pattern = variables[2] - - # This is the directory with files that we will use to do the comparison - # against. - baseline_dir = variables[3] - snrs = '' - filestable = {} - - filestable['dsnr'] = '' - filestable['drate'] = '' - filestable['avg'] = '' - - # Dirs is directories after the baseline to compare to the base. - dirs = variables[4:len(variables)] - - # Find the metric files in the baseline directory. - dir_list = sorted(fnmatch.filter(os.listdir(baseline_dir), file_pattern)) - - metrics = GetMetrics(baseline_dir + "/" + dir_list[0]) - - metrics_js = 'metrics = ["' + '", "'.join(metrics) + '"];' - - for column in range(1, len(metrics)): - - for metric in ['avg','dsnr','drate']: - description = {"file": ("string", "File")} - - # Go through each directory and add a column header to our description. - countoverall = {} - sumoverall = {} - - for directory in dirs: - description[directory] = ("number", directory) - countoverall[directory] = 0 - sumoverall[directory] = 0 - - # Data holds the data for the visualization, name given comes from - # gviz_api sample code. - data = [] - for filename in dir_list: - row = {'file': splitext(basename(filename))[0] } - baseline_file_name = baseline_dir + "/" + filename - - # Read the metric file from each of the directories in our list. - for directory in dirs: - metric_file_name = directory + "/" + filename - - # If there is a metric file in the current directory, open it - # and calculate its overall difference between it and the baseline - # directory's metric file. - if os.path.isfile(metric_file_name): - overall = FileBetter(baseline_file_name, metric_file_name, - column, metric) - row[directory] = overall - - sumoverall[directory] += overall - countoverall[directory] += 1 - - data.append(row) - - # Add the overall numbers. - row = {"file": "OVERALL" } - for directory in dirs: - row[directory] = sumoverall[directory] / countoverall[directory] - data.append(row) - - # write the tables out - data_table = gviz_api.DataTable(description) - data_table.LoadData(data) - - filestable[metric] = ( filestable[metric] + "filestable_" + metric + - "[" + str(column) + "]=" + - data_table.ToJSon(columns_order=["file"]+dirs) + "\n" ) - - filestable_avg = filestable['avg'] - filestable_dpsnr = filestable['dsnr'] - filestable_drate = filestable['drate'] - - # Now we collect all the data for all the graphs. First the column - # headers which will be Datarate and then each directory. - columns = ("datarate",baseline_dir) - description = {"datarate":("number", "Datarate")} - for directory in dirs: - description[directory] = ("number", directory) - - description[baseline_dir] = ("number", baseline_dir) - - snrs = snrs + "snrs[" + str(column) + "] = [" - - # Now collect the data for the graphs, file by file. - for filename in dir_list: - - data = [] - - # Collect the file in each directory and store all of its metrics - # in the associated gviz metrics table. - all_dirs = dirs + [baseline_dir] - for directory in all_dirs: - - metric_file_name = directory + "/" + filename - if not os.path.isfile(metric_file_name): - continue - - # Read and parse the metrics file storing it to the data we'll - # use for the gviz_api.Datatable. - metrics = ParseMetricFile(metric_file_name, column) - for bitrate, metric in metrics: - data.append({"datarate": bitrate, directory: metric}) - - data_table = gviz_api.DataTable(description) - data_table.LoadData(data) - snrs = snrs + "'" + data_table.ToJSon( - columns_order=tuple(["datarate",baseline_dir]+dirs)) + "'," - - snrs = snrs + "]\n" - - formatters = "" - for i in range(len(dirs)): - formatters = "%s formatter.format(better, %d);" % (formatters, i+1) - - print FillForm(page_template, vars()) - return - -if len(sys.argv) < 3: - print HandleFiles.__doc__ -else: - HandleFiles(sys.argv) diff --git a/third_party/aom/test/warp_filter_test.cc b/third_party/aom/test/warp_filter_test.cc deleted file mode 100644 index 19a4e8b6a..000000000 --- a/third_party/aom/test/warp_filter_test.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/warp_filter_test_util.h" -using ::testing::make_tuple; -using ::testing::tuple; -using libaom_test::ACMRandom; -using libaom_test::AV1HighbdWarpFilter::AV1HighbdWarpFilterTest; -using libaom_test::AV1WarpFilter::AV1WarpFilterTest; - -namespace { - -TEST_P(AV1WarpFilterTest, CheckOutput) { - RunCheckOutput(::testing::get<3>(GET_PARAM(0))); -} -TEST_P(AV1WarpFilterTest, DISABLED_Speed) { - RunSpeedTest(::testing::get<3>(GET_PARAM(0))); -} - -INSTANTIATE_TEST_CASE_P( - C, AV1WarpFilterTest, - libaom_test::AV1WarpFilter::BuildParams(av1_warp_affine_c)); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P( - SSE4_1, AV1WarpFilterTest, - libaom_test::AV1WarpFilter::BuildParams(av1_warp_affine_sse4_1)); - -TEST_P(AV1HighbdWarpFilterTest, CheckOutput) { - RunCheckOutput(::testing::get<4>(GET_PARAM(0))); -} -TEST_P(AV1HighbdWarpFilterTest, DISABLED_Speed) { - RunSpeedTest(::testing::get<4>(GET_PARAM(0))); -} - -INSTANTIATE_TEST_CASE_P(SSE4_1, AV1HighbdWarpFilterTest, - libaom_test::AV1HighbdWarpFilter::BuildParams( - av1_highbd_warp_affine_sse4_1)); - -#endif // HAVE_SSE4_1 - -#if HAVE_NEON -INSTANTIATE_TEST_CASE_P( - NEON, AV1WarpFilterTest, - libaom_test::AV1WarpFilter::BuildParams(av1_warp_affine_neon)); -#endif // HAVE_NEON - -} // namespace diff --git a/third_party/aom/test/warp_filter_test_util.cc b/third_party/aom/test/warp_filter_test_util.cc deleted file mode 100644 index 69b2ed4af..000000000 --- a/third_party/aom/test/warp_filter_test_util.cc +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#include "aom_ports/aom_timer.h" -#include "test/warp_filter_test_util.h" - -using ::testing::make_tuple; -using ::testing::tuple; - -namespace libaom_test { - -int32_t random_warped_param(libaom_test::ACMRandom *rnd, int bits) { - // 1 in 8 chance of generating zero (arbitrarily chosen) - if (((rnd->Rand8()) & 7) == 0) return 0; - // Otherwise, enerate uniform values in the range - // [-(1 << bits), 1] U [1, 1<<bits] - int32_t v = 1 + (rnd->Rand16() & ((1 << bits) - 1)); - if ((rnd->Rand8()) & 1) return -v; - return v; -} - -void generate_warped_model(libaom_test::ACMRandom *rnd, int32_t *mat, - int16_t *alpha, int16_t *beta, int16_t *gamma, - int16_t *delta, const int is_alpha_zero, - const int is_beta_zero, const int is_gamma_zero, - const int is_delta_zero) { - while (1) { - int rnd8 = rnd->Rand8() & 3; - mat[0] = random_warped_param(rnd, WARPEDMODEL_PREC_BITS + 6); - mat[1] = random_warped_param(rnd, WARPEDMODEL_PREC_BITS + 6); - mat[2] = (random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3)) + - (1 << WARPEDMODEL_PREC_BITS); - mat[3] = random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3); - - if (rnd8 <= 1) { - // AFFINE - mat[4] = random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3); - mat[5] = (random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3)) + - (1 << WARPEDMODEL_PREC_BITS); - } else if (rnd8 == 2) { - mat[4] = -mat[3]; - mat[5] = mat[2]; - } else { - mat[4] = random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3); - mat[5] = (random_warped_param(rnd, WARPEDMODEL_PREC_BITS - 3)) + - (1 << WARPEDMODEL_PREC_BITS); - if (is_alpha_zero == 1) mat[2] = 1 << WARPEDMODEL_PREC_BITS; - if (is_beta_zero == 1) mat[3] = 0; - if (is_gamma_zero == 1) mat[4] = 0; - if (is_delta_zero == 1) - mat[5] = (((int64_t)mat[3] * mat[4] + (mat[2] / 2)) / mat[2]) + - (1 << WARPEDMODEL_PREC_BITS); - } - - // Calculate the derived parameters and check that they are suitable - // for the warp filter. - assert(mat[2] != 0); - - *alpha = clamp(mat[2] - (1 << WARPEDMODEL_PREC_BITS), INT16_MIN, INT16_MAX); - *beta = clamp(mat[3], INT16_MIN, INT16_MAX); - *gamma = clamp(((int64_t)mat[4] * (1 << WARPEDMODEL_PREC_BITS)) / mat[2], - INT16_MIN, INT16_MAX); - *delta = - clamp(mat[5] - (((int64_t)mat[3] * mat[4] + (mat[2] / 2)) / mat[2]) - - (1 << WARPEDMODEL_PREC_BITS), - INT16_MIN, INT16_MAX); - - if ((4 * abs(*alpha) + 7 * abs(*beta) >= (1 << WARPEDMODEL_PREC_BITS)) || - (4 * abs(*gamma) + 4 * abs(*delta) >= (1 << WARPEDMODEL_PREC_BITS))) - continue; - - *alpha = ROUND_POWER_OF_TWO_SIGNED(*alpha, WARP_PARAM_REDUCE_BITS) * - (1 << WARP_PARAM_REDUCE_BITS); - *beta = ROUND_POWER_OF_TWO_SIGNED(*beta, WARP_PARAM_REDUCE_BITS) * - (1 << WARP_PARAM_REDUCE_BITS); - *gamma = ROUND_POWER_OF_TWO_SIGNED(*gamma, WARP_PARAM_REDUCE_BITS) * - (1 << WARP_PARAM_REDUCE_BITS); - *delta = ROUND_POWER_OF_TWO_SIGNED(*delta, WARP_PARAM_REDUCE_BITS) * - (1 << WARP_PARAM_REDUCE_BITS); - - // We have a valid model, so finish - return; - } -} - -namespace AV1WarpFilter { -::testing::internal::ParamGenerator<WarpTestParams> BuildParams( - warp_affine_func filter) { - WarpTestParam params[] = { - make_tuple(4, 4, 50000, filter), make_tuple(8, 8, 50000, filter), - make_tuple(64, 64, 1000, filter), make_tuple(4, 16, 20000, filter), - make_tuple(32, 8, 10000, filter), - }; - return ::testing::Combine(::testing::ValuesIn(params), - ::testing::Values(0, 1), ::testing::Values(0, 1), - ::testing::Values(0, 1), ::testing::Values(0, 1)); -} - -AV1WarpFilterTest::~AV1WarpFilterTest() {} -void AV1WarpFilterTest::SetUp() { rnd_.Reset(ACMRandom::DeterministicSeed()); } - -void AV1WarpFilterTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1WarpFilterTest::RunSpeedTest(warp_affine_func test_impl) { - const int w = 128, h = 128; - const int border = 16; - const int stride = w + 2 * border; - WarpTestParam params = GET_PARAM(0); - const int out_w = ::testing::get<0>(params), - out_h = ::testing::get<1>(params); - const int is_alpha_zero = GET_PARAM(1); - const int is_beta_zero = GET_PARAM(2); - const int is_gamma_zero = GET_PARAM(3); - const int is_delta_zero = GET_PARAM(4); - int sub_x, sub_y; - const int bd = 8; - - uint8_t *input_ = new uint8_t[h * stride]; - uint8_t *input = input_ + border; - - // The warp functions always write rows with widths that are multiples of 8. - // So to avoid a buffer overflow, we may need to pad rows to a multiple of 8. - int output_n = ((out_w + 7) & ~7) * out_h; - uint8_t *output = new uint8_t[output_n]; - int32_t mat[8]; - int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, bd); - CONV_BUF_TYPE *dsta = new CONV_BUF_TYPE[output_n]; - generate_warped_model(&rnd_, mat, &alpha, &beta, &gamma, &delta, - is_alpha_zero, is_beta_zero, is_gamma_zero, - is_delta_zero); - - for (int r = 0; r < h; ++r) - for (int c = 0; c < w; ++c) input[r * stride + c] = rnd_.Rand8(); - for (int r = 0; r < h; ++r) { - memset(input + r * stride - border, input[r * stride], border); - memset(input + r * stride + w, input[r * stride + (w - 1)], border); - } - - sub_x = 0; - sub_y = 0; - int do_average = 0; - - conv_params = get_conv_params_no_round(do_average, 0, dsta, out_w, 1, bd); - conv_params.use_jnt_comp_avg = 0; - - const int num_loops = 1000000000 / (out_w + out_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < num_loops; ++i) - test_impl(mat, input, w, h, stride, output, 32, 32, out_w, out_h, out_w, - sub_x, sub_y, &conv_params, alpha, beta, gamma, delta); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("warp %3dx%-3d: %7.2f ns\n", out_w, out_h, - 1000.0 * elapsed_time / num_loops); - - delete[] input_; - delete[] output; - delete[] dsta; -} - -void AV1WarpFilterTest::RunCheckOutput(warp_affine_func test_impl) { - const int w = 128, h = 128; - const int border = 16; - const int stride = w + 2 * border; - WarpTestParam params = GET_PARAM(0); - const int is_alpha_zero = GET_PARAM(1); - const int is_beta_zero = GET_PARAM(2); - const int is_gamma_zero = GET_PARAM(3); - const int is_delta_zero = GET_PARAM(4); - const int out_w = ::testing::get<0>(params), - out_h = ::testing::get<1>(params); - const int num_iters = ::testing::get<2>(params); - int i, j, sub_x, sub_y; - const int bd = 8; - - // The warp functions always write rows with widths that are multiples of 8. - // So to avoid a buffer overflow, we may need to pad rows to a multiple of 8. - int output_n = ((out_w + 7) & ~7) * out_h; - uint8_t *input_ = new uint8_t[h * stride]; - uint8_t *input = input_ + border; - uint8_t *output = new uint8_t[output_n]; - uint8_t *output2 = new uint8_t[output_n]; - int32_t mat[8]; - int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, bd); - CONV_BUF_TYPE *dsta = new CONV_BUF_TYPE[output_n]; - CONV_BUF_TYPE *dstb = new CONV_BUF_TYPE[output_n]; - for (int i = 0; i < output_n; ++i) output[i] = output2[i] = rnd_.Rand8(); - - for (i = 0; i < num_iters; ++i) { - // Generate an input block and extend its borders horizontally - for (int r = 0; r < h; ++r) - for (int c = 0; c < w; ++c) input[r * stride + c] = rnd_.Rand8(); - for (int r = 0; r < h; ++r) { - memset(input + r * stride - border, input[r * stride], border); - memset(input + r * stride + w, input[r * stride + (w - 1)], border); - } - const int use_no_round = rnd_.Rand8() & 1; - for (sub_x = 0; sub_x < 2; ++sub_x) - for (sub_y = 0; sub_y < 2; ++sub_y) { - generate_warped_model(&rnd_, mat, &alpha, &beta, &gamma, &delta, - is_alpha_zero, is_beta_zero, is_gamma_zero, - is_delta_zero); - - for (int ii = 0; ii < 2; ++ii) { - for (int jj = 0; jj < 5; ++jj) { - for (int do_average = 0; do_average <= 1; ++do_average) { - if (use_no_round) { - conv_params = - get_conv_params_no_round(do_average, 0, dsta, out_w, 1, bd); - } else { - conv_params = get_conv_params(0, 0, bd); - } - if (jj >= 4) { - conv_params.use_jnt_comp_avg = 0; - } else { - conv_params.use_jnt_comp_avg = 1; - conv_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - conv_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - } - av1_warp_affine_c(mat, input, w, h, stride, output, 32, 32, out_w, - out_h, out_w, sub_x, sub_y, &conv_params, alpha, - beta, gamma, delta); - if (use_no_round) { - conv_params = - get_conv_params_no_round(do_average, 0, dstb, out_w, 1, bd); - } - if (jj >= 4) { - conv_params.use_jnt_comp_avg = 0; - } else { - conv_params.use_jnt_comp_avg = 1; - conv_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - conv_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - } - test_impl(mat, input, w, h, stride, output2, 32, 32, out_w, out_h, - out_w, sub_x, sub_y, &conv_params, alpha, beta, gamma, - delta); - if (use_no_round) { - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(dsta[j], dstb[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - } else { - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - } - } - } - } - } - } - delete[] input_; - delete[] output; - delete[] output2; - delete[] dsta; - delete[] dstb; -} -} // namespace AV1WarpFilter - -namespace AV1HighbdWarpFilter { -::testing::internal::ParamGenerator<HighbdWarpTestParams> BuildParams( - highbd_warp_affine_func filter) { - const HighbdWarpTestParam params[] = { - make_tuple(4, 4, 100, 8, filter), make_tuple(8, 8, 100, 8, filter), - make_tuple(64, 64, 100, 8, filter), make_tuple(4, 16, 100, 8, filter), - make_tuple(32, 8, 100, 8, filter), make_tuple(4, 4, 100, 10, filter), - make_tuple(8, 8, 100, 10, filter), make_tuple(64, 64, 100, 10, filter), - make_tuple(4, 16, 100, 10, filter), make_tuple(32, 8, 100, 10, filter), - make_tuple(4, 4, 100, 12, filter), make_tuple(8, 8, 100, 12, filter), - make_tuple(64, 64, 100, 12, filter), make_tuple(4, 16, 100, 12, filter), - make_tuple(32, 8, 100, 12, filter), - }; - return ::testing::Combine(::testing::ValuesIn(params), - ::testing::Values(0, 1), ::testing::Values(0, 1), - ::testing::Values(0, 1), ::testing::Values(0, 1)); -} - -AV1HighbdWarpFilterTest::~AV1HighbdWarpFilterTest() {} -void AV1HighbdWarpFilterTest::SetUp() { - rnd_.Reset(ACMRandom::DeterministicSeed()); -} - -void AV1HighbdWarpFilterTest::TearDown() { libaom_test::ClearSystemState(); } - -void AV1HighbdWarpFilterTest::RunSpeedTest(highbd_warp_affine_func test_impl) { - const int w = 128, h = 128; - const int border = 16; - const int stride = w + 2 * border; - HighbdWarpTestParam param = GET_PARAM(0); - const int is_alpha_zero = GET_PARAM(1); - const int is_beta_zero = GET_PARAM(2); - const int is_gamma_zero = GET_PARAM(3); - const int is_delta_zero = GET_PARAM(4); - const int out_w = ::testing::get<0>(param), out_h = ::testing::get<1>(param); - const int bd = ::testing::get<3>(param); - const int mask = (1 << bd) - 1; - int sub_x, sub_y; - - // The warp functions always write rows with widths that are multiples of 8. - // So to avoid a buffer overflow, we may need to pad rows to a multiple of 8. - int output_n = ((out_w + 7) & ~7) * out_h; - uint16_t *input_ = new uint16_t[h * stride]; - uint16_t *input = input_ + border; - uint16_t *output = new uint16_t[output_n]; - int32_t mat[8]; - int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, bd); - CONV_BUF_TYPE *dsta = new CONV_BUF_TYPE[output_n]; - - generate_warped_model(&rnd_, mat, &alpha, &beta, &gamma, &delta, - is_alpha_zero, is_beta_zero, is_gamma_zero, - is_delta_zero); - // Generate an input block and extend its borders horizontally - for (int r = 0; r < h; ++r) - for (int c = 0; c < w; ++c) input[r * stride + c] = rnd_.Rand16() & mask; - for (int r = 0; r < h; ++r) { - for (int c = 0; c < border; ++c) { - input[r * stride - border + c] = input[r * stride]; - input[r * stride + w + c] = input[r * stride + (w - 1)]; - } - } - - sub_x = 0; - sub_y = 0; - int do_average = 0; - conv_params.use_jnt_comp_avg = 0; - conv_params = get_conv_params_no_round(do_average, 0, dsta, out_w, 1, bd); - - const int num_loops = 1000000000 / (out_w + out_h); - aom_usec_timer timer; - aom_usec_timer_start(&timer); - - for (int i = 0; i < num_loops; ++i) - test_impl(mat, input, w, h, stride, output, 32, 32, out_w, out_h, out_w, - sub_x, sub_y, bd, &conv_params, alpha, beta, gamma, delta); - - aom_usec_timer_mark(&timer); - const int elapsed_time = static_cast<int>(aom_usec_timer_elapsed(&timer)); - printf("highbd warp %3dx%-3d: %7.2f ns\n", out_w, out_h, - 1000.0 * elapsed_time / num_loops); - - delete[] input_; - delete[] output; - delete[] dsta; -} - -void AV1HighbdWarpFilterTest::RunCheckOutput( - highbd_warp_affine_func test_impl) { - const int w = 128, h = 128; - const int border = 16; - const int stride = w + 2 * border; - HighbdWarpTestParam param = GET_PARAM(0); - const int is_alpha_zero = GET_PARAM(1); - const int is_beta_zero = GET_PARAM(2); - const int is_gamma_zero = GET_PARAM(3); - const int is_delta_zero = GET_PARAM(4); - const int out_w = ::testing::get<0>(param), out_h = ::testing::get<1>(param); - const int bd = ::testing::get<3>(param); - const int num_iters = ::testing::get<2>(param); - const int mask = (1 << bd) - 1; - int i, j, sub_x, sub_y; - - // The warp functions always write rows with widths that are multiples of 8. - // So to avoid a buffer overflow, we may need to pad rows to a multiple of 8. - int output_n = ((out_w + 7) & ~7) * out_h; - uint16_t *input_ = new uint16_t[h * stride]; - uint16_t *input = input_ + border; - uint16_t *output = new uint16_t[output_n]; - uint16_t *output2 = new uint16_t[output_n]; - int32_t mat[8]; - int16_t alpha, beta, gamma, delta; - ConvolveParams conv_params = get_conv_params(0, 0, bd); - CONV_BUF_TYPE *dsta = new CONV_BUF_TYPE[output_n]; - CONV_BUF_TYPE *dstb = new CONV_BUF_TYPE[output_n]; - for (int i = 0; i < output_n; ++i) output[i] = output2[i] = rnd_.Rand16(); - - for (i = 0; i < num_iters; ++i) { - // Generate an input block and extend its borders horizontally - for (int r = 0; r < h; ++r) - for (int c = 0; c < w; ++c) input[r * stride + c] = rnd_.Rand16() & mask; - for (int r = 0; r < h; ++r) { - for (int c = 0; c < border; ++c) { - input[r * stride - border + c] = input[r * stride]; - input[r * stride + w + c] = input[r * stride + (w - 1)]; - } - } - const int use_no_round = rnd_.Rand8() & 1; - for (sub_x = 0; sub_x < 2; ++sub_x) - for (sub_y = 0; sub_y < 2; ++sub_y) { - generate_warped_model(&rnd_, mat, &alpha, &beta, &gamma, &delta, - is_alpha_zero, is_beta_zero, is_gamma_zero, - is_delta_zero); - for (int ii = 0; ii < 2; ++ii) { - for (int jj = 0; jj < 5; ++jj) { - for (int do_average = 0; do_average <= 1; ++do_average) { - if (use_no_round) { - conv_params = - get_conv_params_no_round(do_average, 0, dsta, out_w, 1, bd); - } else { - conv_params = get_conv_params(0, 0, bd); - } - if (jj >= 4) { - conv_params.use_jnt_comp_avg = 0; - } else { - conv_params.use_jnt_comp_avg = 1; - conv_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - conv_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - } - - av1_highbd_warp_affine_c(mat, input, w, h, stride, output, 32, 32, - out_w, out_h, out_w, sub_x, sub_y, bd, - &conv_params, alpha, beta, gamma, delta); - if (use_no_round) { - // TODO(angiebird): Change this to test_impl once we have SIMD - // implementation - conv_params = - get_conv_params_no_round(do_average, 0, dstb, out_w, 1, bd); - } - if (jj >= 4) { - conv_params.use_jnt_comp_avg = 0; - } else { - conv_params.use_jnt_comp_avg = 1; - conv_params.fwd_offset = quant_dist_lookup_table[ii][jj][0]; - conv_params.bck_offset = quant_dist_lookup_table[ii][jj][1]; - } - test_impl(mat, input, w, h, stride, output2, 32, 32, out_w, out_h, - out_w, sub_x, sub_y, bd, &conv_params, alpha, beta, - gamma, delta); - - if (use_no_round) { - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(dsta[j], dstb[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - } else { - for (j = 0; j < out_w * out_h; ++j) - ASSERT_EQ(output[j], output2[j]) - << "Pixel mismatch at index " << j << " = (" - << (j % out_w) << ", " << (j / out_w) << ") on iteration " - << i; - } - } - } - } - } - } - - delete[] input_; - delete[] output; - delete[] output2; - delete[] dsta; - delete[] dstb; -} -} // namespace AV1HighbdWarpFilter -} // namespace libaom_test diff --git a/third_party/aom/test/warp_filter_test_util.h b/third_party/aom/test/warp_filter_test_util.h deleted file mode 100644 index b8998e5c8..000000000 --- a/third_party/aom/test/warp_filter_test_util.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#ifndef AOM_TEST_WARP_FILTER_TEST_UTIL_H_ -#define AOM_TEST_WARP_FILTER_TEST_UTIL_H_ - -#include "config/av1_rtcd.h" -#include "config/aom_dsp_rtcd.h" - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" -#include "test/acm_random.h" -#include "test/util.h" -#include "test/clear_system_state.h" -#include "test/register_state_check.h" - -#include "av1/common/mv.h" -#include "av1/common/common_data.h" - -namespace libaom_test { - -void generate_warped_model(libaom_test::ACMRandom *rnd, int32_t *mat, - int16_t *alpha, int16_t *beta, int16_t *gamma, - int16_t *delta, int is_alpha_zero, int is_beta_zero, - int is_gamma_zero, int is_delta_zero); - -namespace AV1WarpFilter { - -typedef void (*warp_affine_func)(const int32_t *mat, const uint8_t *ref, - int width, int height, int stride, - uint8_t *pred, int p_col, int p_row, - int p_width, int p_height, int p_stride, - int subsampling_x, int subsampling_y, - ConvolveParams *conv_params, int16_t alpha, - int16_t beta, int16_t gamma, int16_t delta); - -typedef ::testing::tuple<int, int, int, warp_affine_func> WarpTestParam; -typedef ::testing::tuple<WarpTestParam, int, int, int, int> WarpTestParams; - -::testing::internal::ParamGenerator<WarpTestParams> BuildParams( - warp_affine_func filter); - -class AV1WarpFilterTest : public ::testing::TestWithParam<WarpTestParams> { - public: - virtual ~AV1WarpFilterTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(warp_affine_func test_impl); - void RunSpeedTest(warp_affine_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -} // namespace AV1WarpFilter - -namespace AV1HighbdWarpFilter { -typedef void (*highbd_warp_affine_func)(const int32_t *mat, const uint16_t *ref, - int width, int height, int stride, - uint16_t *pred, int p_col, int p_row, - int p_width, int p_height, int p_stride, - int subsampling_x, int subsampling_y, - int bd, ConvolveParams *conv_params, - int16_t alpha, int16_t beta, - int16_t gamma, int16_t delta); - -typedef ::testing::tuple<int, int, int, int, highbd_warp_affine_func> - HighbdWarpTestParam; -typedef ::testing::tuple<HighbdWarpTestParam, int, int, int, int> - HighbdWarpTestParams; - -::testing::internal::ParamGenerator<HighbdWarpTestParams> BuildParams( - highbd_warp_affine_func filter); - -class AV1HighbdWarpFilterTest - : public ::testing::TestWithParam<HighbdWarpTestParams> { - public: - virtual ~AV1HighbdWarpFilterTest(); - virtual void SetUp(); - - virtual void TearDown(); - - protected: - void RunCheckOutput(highbd_warp_affine_func test_impl); - void RunSpeedTest(highbd_warp_affine_func test_impl); - - libaom_test::ACMRandom rnd_; -}; - -} // namespace AV1HighbdWarpFilter - -} // namespace libaom_test - -#endif // AOM_TEST_WARP_FILTER_TEST_UTIL_H_ diff --git a/third_party/aom/test/webm_video_source.h b/third_party/aom/test/webm_video_source.h deleted file mode 100644 index bb3d11735..000000000 --- a/third_party/aom/test/webm_video_source.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_WEBM_VIDEO_SOURCE_H_ -#define AOM_TEST_WEBM_VIDEO_SOURCE_H_ -#include <cstdarg> -#include <cstdio> -#include <cstdlib> -#include <new> -#include <string> -#include "common/tools_common.h" -#include "common/webmdec.h" -#include "test/video_source.h" - -namespace libaom_test { - -// This class extends VideoSource to allow parsing of WebM files, -// so that we can do actual file decodes. -class WebMVideoSource : public CompressedVideoSource { - public: - explicit WebMVideoSource(const std::string &file_name) - : file_name_(file_name), aom_ctx_(new AvxInputContext()), - webm_ctx_(new WebmInputContext()), buf_(NULL), buf_sz_(0), frame_sz_(0), - frame_number_(0), end_of_file_(false) {} - - virtual ~WebMVideoSource() { - if (aom_ctx_->file != NULL) fclose(aom_ctx_->file); - webm_free(webm_ctx_); - delete aom_ctx_; - delete webm_ctx_; - } - - virtual void Init() {} - - virtual void Begin() { - aom_ctx_->file = OpenTestDataFile(file_name_); - ASSERT_TRUE(aom_ctx_->file != NULL) - << "Input file open failed. Filename: " << file_name_; - - ASSERT_EQ(file_is_webm(webm_ctx_, aom_ctx_), 1) << "file is not WebM"; - - FillFrame(); - } - - virtual void Next() { - ++frame_number_; - FillFrame(); - } - - void FillFrame() { - ASSERT_TRUE(aom_ctx_->file != NULL); - const int status = webm_read_frame(webm_ctx_, &buf_, &frame_sz_, &buf_sz_); - ASSERT_GE(status, 0) << "webm_read_frame failed"; - if (status == 1) { - end_of_file_ = true; - } - } - - void SeekToNextKeyFrame() { - ASSERT_TRUE(aom_ctx_->file != NULL); - do { - const int status = - webm_read_frame(webm_ctx_, &buf_, &frame_sz_, &buf_sz_); - ASSERT_GE(status, 0) << "webm_read_frame failed"; - ++frame_number_; - if (status == 1) { - end_of_file_ = true; - } - } while (!webm_ctx_->is_key_frame && !end_of_file_); - } - - virtual const uint8_t *cxdata() const { return end_of_file_ ? NULL : buf_; } - virtual size_t frame_size() const { return frame_sz_; } - virtual unsigned int frame_number() const { return frame_number_; } - - protected: - std::string file_name_; - AvxInputContext *aom_ctx_; - WebmInputContext *webm_ctx_; - uint8_t *buf_; // Owned by webm_ctx_ and freed when webm_ctx_ is freed. - size_t buf_sz_; - size_t frame_sz_; - unsigned int frame_number_; - bool end_of_file_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_WEBM_VIDEO_SOURCE_H_ diff --git a/third_party/aom/test/wiener_test.cc b/third_party/aom/test/wiener_test.cc deleted file mode 100644 index dfec09119..000000000 --- a/third_party/aom/test/wiener_test.cc +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (c) 2018, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <vector> - -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -#include "test/function_equivalence_test.h" -#include "test/register_state_check.h" - -#include "config/aom_config.h" -#include "config/aom_dsp_rtcd.h" - -#include "aom/aom_integer.h" -#include "av1/encoder/pickrst.h" - -#define MAX_WIENER_BLOCK 384 -#define MAX_DATA_BLOCK (MAX_WIENER_BLOCK + WIENER_WIN) -using libaom_test::FunctionEquivalenceTest; - -namespace { - -static void compute_stats_win_opt_c(int wiener_win, const uint8_t *dgd, - const uint8_t *src, int h_start, int h_end, - int v_start, int v_end, int dgd_stride, - int src_stride, double *M, double *H) { - ASSERT_TRUE(wiener_win == WIENER_WIN || wiener_win == WIENER_WIN_CHROMA); - int i, j, k, l, m, n; - const int pixel_count = (h_end - h_start) * (v_end - v_start); - const int wiener_win2 = wiener_win * wiener_win; - const int wiener_halfwin = (wiener_win >> 1); - const double avg = - find_average(dgd, h_start, h_end, v_start, v_end, dgd_stride); - - std::vector<std::vector<int64_t> > M_int(wiener_win, - std::vector<int64_t>(wiener_win, 0)); - std::vector<std::vector<int64_t> > H_int( - wiener_win * wiener_win, std::vector<int64_t>(wiener_win * 8, 0)); - std::vector<std::vector<int32_t> > sumY(wiener_win, - std::vector<int32_t>(wiener_win, 0)); - int32_t sumX = 0; - const uint8_t *dgd_win = dgd - wiener_halfwin * dgd_stride - wiener_halfwin; - - for (i = v_start; i < v_end; i++) { - for (j = h_start; j < h_end; j += 2) { - const uint8_t X1 = src[i * src_stride + j]; - const uint8_t X2 = src[i * src_stride + j + 1]; - sumX += X1 + X2; - - const uint8_t *dgd_ij = dgd_win + i * dgd_stride + j; - for (k = 0; k < wiener_win; k++) { - for (l = 0; l < wiener_win; l++) { - const uint8_t *dgd_ijkl = dgd_ij + k * dgd_stride + l; - int64_t *H_int_temp = &H_int[(l * wiener_win + k)][0]; - const uint8_t D1 = dgd_ijkl[0]; - const uint8_t D2 = dgd_ijkl[1]; - sumY[k][l] += D1 + D2; - M_int[l][k] += D1 * X1 + D2 * X2; - for (m = 0; m < wiener_win; m++) { - for (n = 0; n < wiener_win; n++) { - H_int_temp[m * 8 + n] += D1 * dgd_ij[n + dgd_stride * m] + - D2 * dgd_ij[n + dgd_stride * m + 1]; - } - } - } - } - } - } - - const double avg_square_sum = avg * avg * pixel_count; - for (k = 0; k < wiener_win; k++) { - for (l = 0; l < wiener_win; l++) { - M[l * wiener_win + k] = - M_int[l][k] + avg_square_sum - avg * (sumX + sumY[k][l]); - for (m = 0; m < wiener_win; m++) { - for (n = 0; n < wiener_win; n++) { - H[(l * wiener_win + k) * wiener_win2 + m * wiener_win + n] = - H_int[(l * wiener_win + k)][n * 8 + m] + avg_square_sum - - avg * (sumY[k][l] + sumY[n][m]); - } - } - } - } -} - -void compute_stats_opt_c(int wiener_win, const uint8_t *dgd, const uint8_t *src, - int h_start, int h_end, int v_start, int v_end, - int dgd_stride, int src_stride, double *M, double *H) { - if (wiener_win == WIENER_WIN || wiener_win == WIENER_WIN_CHROMA) { - compute_stats_win_opt_c(wiener_win, dgd, src, h_start, h_end, v_start, - v_end, dgd_stride, src_stride, M, H); - } else { - av1_compute_stats_c(wiener_win, dgd, src, h_start, h_end, v_start, v_end, - dgd_stride, src_stride, M, H); - } -} - -static const int kIterations = 100; -static const double min_error = (double)(0.01); -typedef void (*compute_stats_Func)(int wiener_win, const uint8_t *dgd, - const uint8_t *src, int h_start, int h_end, - int v_start, int v_end, int dgd_stride, - int src_stride, double *M, double *H); - -typedef libaom_test::FuncParam<compute_stats_Func> TestFuncs; - -//////////////////////////////////////////////////////////////////////////////// -// 8 bit -//////////////////////////////////////////////////////////////////////////////// - -typedef ::testing::tuple<const compute_stats_Func> WienerTestParam; - -class WienerTest : public ::testing::TestWithParam<WienerTestParam> { - public: - virtual void SetUp() { target_func_ = GET_PARAM(0); } - void runWienerTest(const int32_t wiener_win, int32_t run_times); - void runWienerTest_ExtremeValues(const int32_t wiener_win); - - private: - compute_stats_Func target_func_; - ACMRandom rng_; -}; - -void WienerTest::runWienerTest(const int32_t wiener_win, int32_t run_times) { - const int32_t wiener_halfwin = wiener_win >> 1; - const int32_t wiener_win2 = wiener_win * wiener_win; - DECLARE_ALIGNED(32, uint8_t, dgd_buf[MAX_DATA_BLOCK * MAX_DATA_BLOCK]); - DECLARE_ALIGNED(32, uint8_t, src_buf[MAX_DATA_BLOCK * MAX_DATA_BLOCK]); - DECLARE_ALIGNED(32, double, M_ref[WIENER_WIN2]); - DECLARE_ALIGNED(32, double, H_ref[WIENER_WIN2 * WIENER_WIN2]); - DECLARE_ALIGNED(32, double, M_test[WIENER_WIN2]); - DECLARE_ALIGNED(32, double, H_test[WIENER_WIN2 * WIENER_WIN2]); - const int h_start = ((rng_.Rand16() % (MAX_WIENER_BLOCK / 2)) & (~7)); - int h_end = - run_times != 1 ? 256 : ((rng_.Rand16() % MAX_WIENER_BLOCK) & (~7)) + 8; - const int v_start = ((rng_.Rand16() % (MAX_WIENER_BLOCK / 2)) & (~7)); - int v_end = - run_times != 1 ? 256 : ((rng_.Rand16() % MAX_WIENER_BLOCK) & (~7)) + 8; - const int dgd_stride = h_end; - const int src_stride = MAX_DATA_BLOCK; - const int iters = run_times == 1 ? kIterations : 2; - for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) { - dgd_buf[i] = rng_.Rand8(); - src_buf[i] = rng_.Rand8(); - } - uint8_t *dgd = dgd_buf + wiener_halfwin * MAX_DATA_BLOCK + wiener_halfwin; - uint8_t *src = src_buf; - - aom_usec_timer timer; - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - av1_compute_stats_c(wiener_win, dgd, src, h_start, h_end, v_start, v_end, - dgd_stride, src_stride, M_ref, H_ref); - } - aom_usec_timer_mark(&timer); - const double time1 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - aom_usec_timer_start(&timer); - for (int i = 0; i < run_times; ++i) { - target_func_(wiener_win, dgd, src, h_start, h_end, v_start, v_end, - dgd_stride, src_stride, M_test, H_test); - } - aom_usec_timer_mark(&timer); - const double time2 = static_cast<double>(aom_usec_timer_elapsed(&timer)); - if (run_times > 10) { - printf("win %d %3dx%-3d:%7.2f/%7.2fns", wiener_win, h_end, v_end, time1, - time2); - printf("(%3.2f)\n", time1 / time2); - } - int failed = 0; - for (int i = 0; i < wiener_win2; ++i) { - if (fabs(M_ref[i] - M_test[i]) > min_error) { - failed = 1; - printf("win %d M iter %d [%4d] ref %6.0f test %6.0f \n", wiener_win, - iter, i, M_ref[i], M_test[i]); - break; - } - } - // ASSERT_EQ(failed, 0); - for (int i = 0; i < wiener_win2 * wiener_win2; ++i) { - if (fabs(H_ref[i] - H_test[i]) > min_error) { - failed = 1; - printf("win %d H iter %d [%4d] ref %6.0f test %6.0f \n", wiener_win, - iter, i, H_ref[i], H_test[i]); - break; - } - } - ASSERT_EQ(failed, 0); - } -} - -void WienerTest::runWienerTest_ExtremeValues(const int32_t wiener_win) { - const int32_t wiener_halfwin = wiener_win >> 1; - const int32_t wiener_win2 = wiener_win * wiener_win; - DECLARE_ALIGNED(32, uint8_t, dgd_buf[MAX_DATA_BLOCK * MAX_DATA_BLOCK]); - DECLARE_ALIGNED(32, uint8_t, src_buf[MAX_DATA_BLOCK * MAX_DATA_BLOCK]); - DECLARE_ALIGNED(32, double, M_ref[WIENER_WIN2]); - DECLARE_ALIGNED(32, double, H_ref[WIENER_WIN2 * WIENER_WIN2]); - DECLARE_ALIGNED(32, double, M_test[WIENER_WIN2]); - DECLARE_ALIGNED(32, double, H_test[WIENER_WIN2 * WIENER_WIN2]); - const int h_start = 16; - const int h_end = MAX_WIENER_BLOCK; - const int v_start = 16; - const int v_end = MAX_WIENER_BLOCK; - const int dgd_stride = h_end; - const int src_stride = MAX_DATA_BLOCK; - const int iters = 1; - for (int iter = 0; iter < iters && !HasFatalFailure(); ++iter) { - for (int i = 0; i < MAX_DATA_BLOCK * MAX_DATA_BLOCK; ++i) { - dgd_buf[i] = 255; - src_buf[i] = 255; - } - uint8_t *dgd = dgd_buf + wiener_halfwin * MAX_DATA_BLOCK + wiener_halfwin; - uint8_t *src = src_buf; - - av1_compute_stats_c(wiener_win, dgd, src, h_start, h_end, v_start, v_end, - dgd_stride, src_stride, M_ref, H_ref); - - target_func_(wiener_win, dgd, src, h_start, h_end, v_start, v_end, - dgd_stride, src_stride, M_test, H_test); - - int failed = 0; - for (int i = 0; i < wiener_win2; ++i) { - if (fabs(M_ref[i] - M_test[i]) > min_error) { - failed = 1; - printf("win %d M iter %d [%4d] ref %6.0f test %6.0f \n", wiener_win, - iter, i, M_ref[i], M_test[i]); - break; - } - } - // ASSERT_EQ(failed, 0); - for (int i = 0; i < wiener_win2 * wiener_win2; ++i) { - if (fabs(H_ref[i] - H_test[i]) > min_error) { - failed = 1; - printf("win %d H iter %d [%4d] ref %6.0f test %6.0f \n", wiener_win, - iter, i, H_ref[i], H_test[i]); - break; - } - } - ASSERT_EQ(failed, 0); - } -} - -TEST_P(WienerTest, RandomValues) { - runWienerTest(WIENER_WIN, 1); - runWienerTest(WIENER_WIN_CHROMA, 1); -} - -TEST_P(WienerTest, ExtremeValues) { - runWienerTest_ExtremeValues(WIENER_WIN); - runWienerTest_ExtremeValues(WIENER_WIN_CHROMA); -} - -TEST_P(WienerTest, DISABLED_Speed) { - runWienerTest(WIENER_WIN, 200); - runWienerTest(WIENER_WIN_CHROMA, 200); -} - -INSTANTIATE_TEST_CASE_P(C, WienerTest, ::testing::Values(compute_stats_opt_c)); - -#if HAVE_SSE4_1 -INSTANTIATE_TEST_CASE_P(SSE4_1, WienerTest, - ::testing::Values(av1_compute_stats_sse4_1)); -#endif // HAVE_SSE4_1 - -#if HAVE_AVX2 - -INSTANTIATE_TEST_CASE_P(AVX2, WienerTest, - ::testing::Values(av1_compute_stats_avx2)); -#endif // HAVE_AVX2 - -} // namespace diff --git a/third_party/aom/test/y4m_test.cc b/third_party/aom/test/y4m_test.cc deleted file mode 100644 index 6cc75ef5b..000000000 --- a/third_party/aom/test/y4m_test.cc +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ - -#include <string> - -#include "config/aom_config.h" - -#include "common/y4menc.h" -#include "test/md5_helper.h" -#include "test/util.h" -#include "test/y4m_video_source.h" -#include "third_party/googletest/src/googletest/include/gtest/gtest.h" - -namespace { - -using std::string; - -static const unsigned int kWidth = 160; -static const unsigned int kHeight = 90; -static const unsigned int kFrames = 10; - -struct Y4mTestParam { - const char *filename; - unsigned int bit_depth; - aom_img_fmt format; - const char *md5raw; -}; - -const Y4mTestParam kY4mTestVectors[] = { - { "park_joy_90p_8_420.y4m", 8, AOM_IMG_FMT_I420, - "e5406275b9fc6bb3436c31d4a05c1cab" }, - { "park_joy_90p_8_420_monochrome.y4m", 8, AOM_IMG_FMT_I420, - "95ef5bf6218580588be24a5271bb6a7f" }, - { "park_joy_90p_8_420_vertical_csp.y4m", 8, AOM_IMG_FMT_I420, - "f53a40fec15254ac312527339d9c686b" }, - { "park_joy_90p_8_422.y4m", 8, AOM_IMG_FMT_I422, - "284a47a47133b12884ec3a14e959a0b6" }, - { "park_joy_90p_8_444.y4m", 8, AOM_IMG_FMT_I444, - "90517ff33843d85de712fd4fe60dbed0" }, - { "park_joy_90p_10_420.y4m", 10, AOM_IMG_FMT_I42016, - "63f21f9f717d8b8631bd2288ee87137b" }, - { "park_joy_90p_10_422.y4m", 10, AOM_IMG_FMT_I42216, - "48ab51fb540aed07f7ff5af130c9b605" }, - { "park_joy_90p_10_444.y4m", 10, AOM_IMG_FMT_I44416, - "067bfd75aa85ff9bae91fa3e0edd1e3e" }, - { "park_joy_90p_12_420.y4m", 12, AOM_IMG_FMT_I42016, - "9e6d8f6508c6e55625f6b697bc461cef" }, - { "park_joy_90p_12_422.y4m", 12, AOM_IMG_FMT_I42216, - "b239c6b301c0b835485be349ca83a7e3" }, - { "park_joy_90p_12_444.y4m", 12, AOM_IMG_FMT_I44416, - "5a6481a550821dab6d0192f5c63845e9" }, -}; - -static const int PLANES_YUV[] = { AOM_PLANE_Y, AOM_PLANE_U, AOM_PLANE_V }; - -class Y4mVideoSourceTest : public ::testing::TestWithParam<Y4mTestParam>, - public ::libaom_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, aom_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_.aom_fmt, fmt); - if (fmt == AOM_IMG_FMT_I420 || fmt == AOM_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 == AOM_IMG_FMT_I422 || fmt == AOM_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 == AOM_IMG_FMT_I444 || fmt == AOM_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); - libaom_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 Y4mTestParam 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() : tmpfile_(NULL) {} - - virtual ~Y4mVideoWriteTest() { - delete tmpfile_; - input_file_ = NULL; - } - - void ReplaceInputFile(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 AvxRational framerate = { y4m_.fps_n, y4m_.fps_d }; - tmpfile_ = new libaom_test::TempOutFile; - ASSERT_TRUE(tmpfile_->file() != NULL); - y4m_write_file_header(buf, sizeof(buf), kWidth, kHeight, &framerate, - img()->monochrome, img()->csp, y4m_.aom_fmt, - y4m_.bit_depth); - fputs(buf, tmpfile_->file()); - for (unsigned int i = start_; i < limit_; i++) { - y4m_write_frame_header(buf, sizeof(buf)); - fputs(buf, tmpfile_->file()); - y4m_write_image_file(img(), PLANES_YUV, tmpfile_->file()); - Next(); - } - ReplaceInputFile(tmpfile_->file()); - } - - virtual void Init(const std::string &file_name, int limit) { - Y4mVideoSourceTest::Init(file_name, limit); - WriteY4mAndReadBack(); - } - libaom_test::TempOutFile *tmpfile_; -}; - -TEST_P(Y4mVideoWriteTest, WriteTest) { - const Y4mTestParam 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/third_party/aom/test/y4m_video_source.h b/third_party/aom/test/y4m_video_source.h deleted file mode 100644 index 3dea901e6..000000000 --- a/third_party/aom/test/y4m_video_source.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_Y4M_VIDEO_SOURCE_H_ -#define AOM_TEST_Y4M_VIDEO_SOURCE_H_ -#include <algorithm> -#include <string> - -#include "common/y4minput.h" -#include "test/video_source.h" - -namespace libaom_test { - -// This class extends VideoSource to allow parsing of raw yv12 -// so that we can do actual file encodes. -class Y4mVideoSource : public VideoSource { - public: - Y4mVideoSource(const std::string &file_name, unsigned int start, int limit) - : file_name_(file_name), input_file_(NULL), img_(new aom_image_t()), - start_(start), limit_(limit), frame_(0), framerate_numerator_(0), - framerate_denominator_(0), y4m_() {} - - virtual ~Y4mVideoSource() { - aom_img_free(img_.get()); - CloseSource(); - } - - virtual void OpenSource() { - CloseSource(); - input_file_ = OpenTestDataFile(file_name_); - ASSERT_TRUE(input_file_ != NULL) - << "Input file open failed. Filename: " << file_name_; - } - - 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(); - } - FillFrame(); - } - - virtual void Begin() { - OpenSource(); - ReadSourceToStart(); - } - - virtual void Next() { - ++frame_; - FillFrame(); - } - - virtual aom_image_t *img() const { - return (frame_ < limit_) ? img_.get() : NULL; - } - - // Models a stream where Timebase = 1/FPS, so pts == frame. - virtual aom_codec_pts_t pts() const { return frame_; } - - virtual unsigned long duration() const { return 1; } - - virtual aom_rational_t timebase() const { - const aom_rational_t t = { framerate_denominator_, framerate_numerator_ }; - return t; - } - - virtual unsigned int frame() const { return frame_; } - - virtual unsigned int limit() const { return limit_; } - - virtual void FillFrame() { - ASSERT_TRUE(input_file_ != NULL); - // Read a frame from input_file. - y4m_input_fetch_frame(&y4m_, input_file_, img_.get()); - } - - // Swap buffers with another y4m source. This allows reading a new frame - // while keeping the old frame around. A whole Y4mSource is required and - // not just a aom_image_t because of how the y4m reader manipulates - // aom_image_t internals, - void SwapBuffers(Y4mVideoSource *other) { - std::swap(other->y4m_.dst_buf, y4m_.dst_buf); - aom_image_t *tmp; - tmp = other->img_.release(); - other->img_.reset(img_.release()); - img_.reset(tmp); - } - - protected: - void CloseSource() { - y4m_input_close(&y4m_); - y4m_ = y4m_input(); - if (input_file_ != NULL) { - fclose(input_file_); - input_file_ = NULL; - } - } - - std::string file_name_; - FILE *input_file_; - testing::internal::scoped_ptr<aom_image_t> img_; - unsigned int start_; - unsigned int limit_; - unsigned int frame_; - int framerate_numerator_; - int framerate_denominator_; - y4m_input y4m_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_Y4M_VIDEO_SOURCE_H_ diff --git a/third_party/aom/test/yuv_video_source.h b/third_party/aom/test/yuv_video_source.h deleted file mode 100644 index 774ecc008..000000000 --- a/third_party/aom/test/yuv_video_source.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2016, Alliance for Open Media. All rights reserved - * - * This source code is subject to the terms of the BSD 2 Clause License and - * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License - * was not distributed with this source code in the LICENSE file, you can - * obtain it at www.aomedia.org/license/software. If the Alliance for Open - * Media Patent License 1.0 was not distributed with this source code in the - * PATENTS file, you can obtain it at www.aomedia.org/license/patent. - */ -#ifndef AOM_TEST_YUV_VIDEO_SOURCE_H_ -#define AOM_TEST_YUV_VIDEO_SOURCE_H_ - -#include <cstdio> -#include <cstdlib> -#include <string> - -#include "test/video_source.h" -#include "aom/aom_image.h" - -namespace libaom_test { - -// This class extends VideoSource to allow parsing of raw YUV -// formats of various color sampling and bit-depths so that we can -// do actual file encodes. -class YUVVideoSource : public VideoSource { - public: - YUVVideoSource(const std::string &file_name, aom_img_fmt format, - unsigned int width, unsigned int height, int rate_numerator, - int rate_denominator, unsigned int start, int limit) - : file_name_(file_name), input_file_(NULL), img_(NULL), start_(start), - limit_(limit), frame_(0), width_(0), height_(0), - format_(AOM_IMG_FMT_NONE), framerate_numerator_(rate_numerator), - framerate_denominator_(rate_denominator) { - // This initializes format_, raw_size_, width_, height_ and allocates img. - SetSize(width, height, format); - } - - virtual ~YUVVideoSource() { - aom_img_free(img_); - if (input_file_) fclose(input_file_); - } - - virtual void Begin() { - if (input_file_) fclose(input_file_); - input_file_ = OpenTestDataFile(file_name_); - ASSERT_TRUE(input_file_ != NULL) - << "Input file open failed. Filename: " << file_name_; - if (start_) - fseek(input_file_, static_cast<unsigned>(raw_size_) * start_, SEEK_SET); - - frame_ = start_; - FillFrame(); - } - - virtual void Next() { - ++frame_; - FillFrame(); - } - - virtual aom_image_t *img() const { return (frame_ < limit_) ? img_ : NULL; } - - // Models a stream where Timebase = 1/FPS, so pts == frame. - virtual aom_codec_pts_t pts() const { return frame_; } - - virtual unsigned long duration() const { return 1; } - - virtual aom_rational_t timebase() const { - const aom_rational_t t = { framerate_denominator_, framerate_numerator_ }; - return t; - } - - virtual unsigned int frame() const { return frame_; } - - virtual unsigned int limit() const { return limit_; } - - virtual void SetSize(unsigned int width, unsigned int height, - aom_img_fmt format) { - if (width != width_ || height != height_ || format != format_) { - aom_img_free(img_); - img_ = aom_img_alloc(NULL, format, width, height, 1); - ASSERT_TRUE(img_ != NULL); - width_ = width; - height_ = height; - format_ = format; - switch (format) { - case AOM_IMG_FMT_I420: raw_size_ = width * height * 3 / 2; break; - case AOM_IMG_FMT_I422: raw_size_ = width * height * 2; break; - case AOM_IMG_FMT_I444: raw_size_ = width * height * 3; break; - case AOM_IMG_FMT_I42016: raw_size_ = width * height * 3; break; - case AOM_IMG_FMT_I42216: raw_size_ = width * height * 4; break; - case AOM_IMG_FMT_I44416: raw_size_ = width * height * 6; break; - default: ASSERT_TRUE(0); - } - } - } - - virtual void FillFrame() { - ASSERT_TRUE(input_file_ != NULL); - // Read a frame from input_file. - if (fread(img_->img_data, raw_size_, 1, input_file_) == 0) { - limit_ = frame_; - } - } - - protected: - std::string file_name_; - FILE *input_file_; - aom_image_t *img_; - size_t raw_size_; - unsigned int start_; - unsigned int limit_; - unsigned int frame_; - unsigned int width_; - unsigned int height_; - aom_img_fmt format_; - int framerate_numerator_; - int framerate_denominator_; -}; - -} // namespace libaom_test - -#endif // AOM_TEST_YUV_VIDEO_SOURCE_H_ |