Update aom to slightly newer commit ID

This commit is contained in:
trav90 2018-10-17 05:59:08 -05:00 committed by Roy Tam
commit 76f1e6edca
311 changed files with 55292 additions and 33790 deletions

View file

@ -92,6 +92,6 @@ TEST_P(AltRefForcedKeyTestLarge, ForcedFrameIsKey) {
AV1_INSTANTIATE_TEST_CASE(AltRefForcedKeyTestLarge,
::testing::Values(::libaom_test::kOnePassGood),
::testing::Range(0, 9));
::testing::Values(2, 5));
} // namespace

View file

@ -98,7 +98,7 @@ TEST_P(AqSegmentTest, TestNoMisMatchAQ4) {
aq_mode_ = 4;
::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
30, 1, 0, 100);
30, 1, 0, 15);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
}
@ -112,7 +112,7 @@ TEST_P(AqSegmentTest, TestNoMisMatchExtDeltaQ) {
aq_mode_ = 0;
deltaq_mode_ = 2;
::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
30, 1, 0, 100);
30, 1, 0, 15);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
}

View file

@ -218,7 +218,7 @@ const BlockDimension kBlockDim[] = {
};
// 10/12-tap filters
const InterpFilter kFilter[] = { FILTER_REGULAR_UV, BILINEAR, MULTITAP_SHARP };
const InterpFilter kFilter[] = { EIGHTTAP_REGULAR, BILINEAR, MULTITAP_SHARP };
const int kSubpelQ4[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

View file

@ -262,6 +262,7 @@ INSTANTIATE_TEST_CASE_P(
::testing::ValuesIn(filter_ls)));
#if CONFIG_HIGHBITDEPTH
#ifndef __clang_analyzer__
TEST(AV1ConvolveTest, av1_highbd_convolve) {
ACMRandom rnd(ACMRandom::DeterministicSeed());
#if CONFIG_DUAL_FILTER
@ -322,6 +323,7 @@ TEST(AV1ConvolveTest, av1_highbd_convolve) {
}
}
}
#endif
TEST(AV1ConvolveTest, av1_highbd_convolve_avg) {
ACMRandom rnd(ACMRandom::DeterministicSeed());

View file

@ -49,7 +49,7 @@ void highbd_fht32x32_ref(const int16_t *in, int32_t *out, int stride,
}
#endif // CONFIG_HIGHBITDEPTH
#if HAVE_AVX2
#if HAVE_SSE2 || HAVE_AVX2
void dummy_inv_txfm(const tran_low_t *in, uint8_t *out, int stride,
int tx_type) {
(void)in;

View file

@ -0,0 +1,108 @@
/*
* 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_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/transform_test_base.h"
#include "test/util.h"
#if CONFIG_TX64X64
using libaom_test::ACMRandom;
namespace {
typedef void (*IhtFunc)(const tran_low_t *in, uint8_t *out, int stride,
int tx_type);
using std::tr1::tuple;
using libaom_test::FhtFunc;
typedef tuple<FhtFunc, IhtFunc, int, aom_bit_depth_t, int> Ht64x64Param;
void fht64x64_ref(const int16_t *in, tran_low_t *out, int stride, int tx_type) {
av1_fht64x64_c(in, out, stride, tx_type);
}
void iht64x64_ref(const tran_low_t *in, uint8_t *dest, int stride,
int tx_type) {
av1_iht64x64_4096_add_c(in, dest, stride, tx_type);
}
class AV1Trans64x64HT : public libaom_test::TransformTestBase,
public ::testing::TestWithParam<Ht64x64Param> {
public:
virtual ~AV1Trans64x64HT() {}
virtual void SetUp() {
fwd_txfm_ = GET_PARAM(0);
inv_txfm_ = GET_PARAM(1);
tx_type_ = GET_PARAM(2);
pitch_ = 64;
height_ = 64;
fwd_txfm_ref = fht64x64_ref;
inv_txfm_ref = iht64x64_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, tx_type_);
}
void RunInvTxfm(const tran_low_t *out, uint8_t *dst, int stride) {
inv_txfm_(out, dst, stride, tx_type_);
}
FhtFunc fwd_txfm_;
IhtFunc inv_txfm_;
};
TEST_P(AV1Trans64x64HT, AccuracyCheck) { RunAccuracyCheck(4, 0.2); }
TEST_P(AV1Trans64x64HT, CoeffCheck) { RunCoeffCheck(); }
TEST_P(AV1Trans64x64HT, MemCheck) { RunMemCheck(); }
TEST_P(AV1Trans64x64HT, InvCoeffCheck) { RunInvCoeffCheck(); }
TEST_P(AV1Trans64x64HT, InvAccuracyCheck) { RunInvAccuracyCheck(4); }
using std::tr1::make_tuple;
const Ht64x64Param kArrayHt64x64Param_c[] = {
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 0, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 1, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 2, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 3, AOM_BITS_8, 4096),
#if CONFIG_EXT_TX
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 4, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 5, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 6, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 7, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 8, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 9, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 10, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 11, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 12, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 13, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 14, AOM_BITS_8, 4096),
make_tuple(&av1_fht64x64_c, &av1_iht64x64_4096_add_c, 15, AOM_BITS_8, 4096)
#endif // CONFIG_EXT_TX
};
INSTANTIATE_TEST_CASE_P(C, AV1Trans64x64HT,
::testing::ValuesIn(kArrayHt64x64Param_c));
} // namespace
#endif // CONFIG_TX64X64

View file

@ -56,10 +56,10 @@ TEST(av1_fwd_txfm1d, get_max_bit) {
EXPECT_EQ(max_bit, 3);
}
TEST(av1_fwd_txfm1d, cospi_arr) {
TEST(av1_fwd_txfm1d, cospi_arr_data) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 64; j++) {
EXPECT_EQ(cospi_arr[i][j],
EXPECT_EQ(cospi_arr_data[i][j],
(int32_t)round(cos(M_PI * j / 128) * (1 << (cos_bit_min + i))));
}
}

View file

@ -41,9 +41,11 @@ class AV1FwdTxfm2d : public ::testing::TestWithParam<AV1FwdTxfm2dParam> {
count_ = 500;
TXFM_2D_FLIP_CFG fwd_txfm_flip_cfg =
av1_get_fwd_txfm_cfg(tx_type_, tx_size_);
const TXFM_2D_CFG *fwd_txfm_cfg = fwd_txfm_flip_cfg.cfg;
int amplify_bit = fwd_txfm_cfg->shift[0] + fwd_txfm_cfg->shift[1] +
fwd_txfm_cfg->shift[2];
// TODO(sarahparker) this test will need to be updated when these
// functions are extended to support rectangular transforms
int amplify_bit = fwd_txfm_flip_cfg.row_cfg->shift[0] +
fwd_txfm_flip_cfg.row_cfg->shift[1] +
fwd_txfm_flip_cfg.row_cfg->shift[2];
ud_flip_ = fwd_txfm_flip_cfg.ud_flip;
lr_flip_ = fwd_txfm_flip_cfg.lr_flip;
amplify_factor_ =

View file

@ -17,7 +17,7 @@
#include "test/acm_random.h"
#include "test/util.h"
#include "test/av1_txfm_test.h"
#include "av1/common/av1_inv_txfm2d_cfg.h"
#include "av1/common/av1_inv_txfm1d_cfg.h"
using libaom_test::ACMRandom;
using libaom_test::input_base;

View file

@ -196,16 +196,18 @@ TEST_P(AV1QuantizeTest, EobVerify) { RunEobTest(); }
#if HAVE_SSE4_1
#if !CONFIG_AOM_QM
INSTANTIATE_TEST_CASE_P(
SSE4_1, AV1QuantizeTest,
::testing::Values(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)));
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 // !CONFIG_AOM_QM
#endif // HAVE_SSE4_1
} // namespace

View file

@ -79,7 +79,7 @@ static const int input_base = (1 << bd);
#if CONFIG_HIGHBITDEPTH
#if CONFIG_AV1_ENCODER
static const Fwd_Txfm2d_Func fwd_txfm_func_ls[TX_SIZES] = {
#if CONFIG_CB4X4
#if CONFIG_CHROMA_2X2
NULL,
#endif
av1_fwd_txfm2d_4x4_c, av1_fwd_txfm2d_8x8_c, av1_fwd_txfm2d_16x16_c,
@ -88,7 +88,7 @@ static const Fwd_Txfm2d_Func fwd_txfm_func_ls[TX_SIZES] = {
#endif
static const Inv_Txfm2d_Func inv_txfm_func_ls[TX_SIZES] = {
#if CONFIG_CB4X4
#if CONFIG_CHROMA_2X2
NULL,
#endif
av1_inv_txfm2d_add_4x4_c, av1_inv_txfm2d_add_8x8_c,

View file

@ -53,21 +53,6 @@ class AverageTestBase : public ::testing::Test {
rnd_.Reset(ACMRandom::DeterministicSeed());
}
// Sum Pixels
static unsigned int ReferenceAverage8x8(const uint8_t *source, int pitch) {
unsigned int average = 0;
for (int h = 0; h < 8; ++h)
for (int w = 0; w < 8; ++w) average += source[h * pitch + w];
return ((average + 32) >> 6);
}
static unsigned int ReferenceAverage4x4(const uint8_t *source, int pitch) {
unsigned int average = 0;
for (int h = 0; h < 4; ++h)
for (int w = 0; w < 4; ++w) average += source[h * pitch + w];
return ((average + 8) >> 4);
}
void FillConstant(uint8_t fill_constant) {
for (int i = 0; i < width_ * height_; ++i) {
source_data_[i] = fill_constant;
@ -86,35 +71,6 @@ class AverageTestBase : public ::testing::Test {
ACMRandom rnd_;
};
typedef unsigned int (*AverageFunction)(const uint8_t *s, int pitch);
typedef std::tr1::tuple<int, int, int, int, AverageFunction> AvgFunc;
class AverageTest : public AverageTestBase,
public ::testing::WithParamInterface<AvgFunc> {
public:
AverageTest() : AverageTestBase(GET_PARAM(0), GET_PARAM(1)) {}
protected:
void CheckAverages() {
const int block_size = GET_PARAM(3);
unsigned int expected = 0;
if (block_size == 8) {
expected =
ReferenceAverage8x8(source_data_ + GET_PARAM(2), source_stride_);
} else if (block_size == 4) {
expected =
ReferenceAverage4x4(source_data_ + GET_PARAM(2), source_stride_);
}
ASM_REGISTER_STATE_CHECK(
GET_PARAM(4)(source_data_ + GET_PARAM(2), source_stride_));
unsigned int actual =
GET_PARAM(4)(source_data_ + GET_PARAM(2), source_stride_);
EXPECT_EQ(expected, actual);
}
};
typedef void (*IntProRowFunc)(int16_t hbuf[16], uint8_t const *ref,
const int ref_stride, const int height);
@ -229,25 +185,6 @@ class SatdTest : public ::testing::Test,
uint8_t *AverageTestBase::source_data_ = NULL;
TEST_P(AverageTest, MinValue) {
FillConstant(0);
CheckAverages();
}
TEST_P(AverageTest, MaxValue) {
FillConstant(255);
CheckAverages();
}
TEST_P(AverageTest, Random) {
// The reference frame, but not the source frame, may be unaligned for
// certain types of searches.
for (int i = 0; i < 1000; i++) {
FillRandom();
CheckAverages();
}
}
TEST_P(IntProRowTest, MinValue) {
FillConstant(0);
RunComparison();
@ -309,11 +246,6 @@ TEST_P(SatdTest, Random) {
using std::tr1::make_tuple;
INSTANTIATE_TEST_CASE_P(
C, AverageTest,
::testing::Values(make_tuple(16, 16, 1, 8, &aom_avg_8x8_c),
make_tuple(16, 16, 1, 4, &aom_avg_4x4_c)));
INSTANTIATE_TEST_CASE_P(C, SatdTest,
::testing::Values(make_tuple(16, &aom_satd_c),
make_tuple(64, &aom_satd_c),
@ -321,15 +253,6 @@ INSTANTIATE_TEST_CASE_P(C, SatdTest,
make_tuple(1024, &aom_satd_c)));
#if HAVE_SSE2
INSTANTIATE_TEST_CASE_P(
SSE2, AverageTest,
::testing::Values(make_tuple(16, 16, 0, 8, &aom_avg_8x8_sse2),
make_tuple(16, 16, 5, 8, &aom_avg_8x8_sse2),
make_tuple(32, 32, 15, 8, &aom_avg_8x8_sse2),
make_tuple(16, 16, 0, 4, &aom_avg_4x4_sse2),
make_tuple(16, 16, 5, 4, &aom_avg_4x4_sse2),
make_tuple(32, 32, 15, 4, &aom_avg_4x4_sse2)));
INSTANTIATE_TEST_CASE_P(
SSE2, IntProRowTest,
::testing::Values(make_tuple(16, &aom_int_pro_row_sse2, &aom_int_pro_row_c),
@ -352,15 +275,6 @@ INSTANTIATE_TEST_CASE_P(SSE2, SatdTest,
#endif
#if HAVE_NEON
INSTANTIATE_TEST_CASE_P(
NEON, AverageTest,
::testing::Values(make_tuple(16, 16, 0, 8, &aom_avg_8x8_neon),
make_tuple(16, 16, 5, 8, &aom_avg_8x8_neon),
make_tuple(32, 32, 15, 8, &aom_avg_8x8_neon),
make_tuple(16, 16, 0, 4, &aom_avg_4x4_neon),
make_tuple(16, 16, 5, 4, &aom_avg_4x4_neon),
make_tuple(32, 32, 15, 4, &aom_avg_4x4_neon)));
INSTANTIATE_TEST_CASE_P(
NEON, IntProRowTest,
::testing::Values(make_tuple(16, &aom_int_pro_row_neon, &aom_int_pro_row_c),
@ -382,15 +296,4 @@ INSTANTIATE_TEST_CASE_P(NEON, SatdTest,
make_tuple(1024, &aom_satd_neon)));
#endif
#if HAVE_MSA
INSTANTIATE_TEST_CASE_P(
MSA, AverageTest,
::testing::Values(make_tuple(16, 16, 0, 8, &aom_avg_8x8_msa),
make_tuple(16, 16, 5, 8, &aom_avg_8x8_msa),
make_tuple(32, 32, 15, 8, &aom_avg_8x8_msa),
make_tuple(16, 16, 0, 4, &aom_avg_4x4_msa),
make_tuple(16, 16, 5, 4, &aom_avg_4x4_msa),
make_tuple(32, 32, 15, 4, &aom_avg_4x4_msa)));
#endif
} // namespace

View file

@ -15,6 +15,7 @@
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"
#include "./aom_config.h"
#include "test/acm_random.h"
#include "aom/aom_integer.h"
#include "aom_dsp/bitreader.h"
@ -22,6 +23,8 @@
#include "aom_dsp/binary_codes_reader.h"
#include "aom_dsp/binary_codes_writer.h"
#define ACCT_STR __func__
using libaom_test::ACMRandom;
namespace {
@ -68,8 +71,8 @@ TEST(AV1, TestPrimitiveRefbilivel) {
const uint16_t range = enc_values[n][p][r][v][0];
const uint16_t near_range = enc_values[n][p][r][v][1];
const uint16_t ref = enc_values[n][p][r][v][2];
const uint16_t value =
aom_read_primitive_refbilevel(&br, range, near_range, ref);
const uint16_t value = aom_read_primitive_refbilevel(
&br, range, near_range, ref, ACCT_STR);
GTEST_ASSERT_EQ(value, enc_values[n][p][r][v][3]);
}
}
@ -119,7 +122,7 @@ TEST(AV1, TestPrimitiveRefsubexpfin) {
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);
aom_read_primitive_refsubexpfin(&br, range, k, ref, ACCT_STR);
GTEST_ASSERT_EQ(value, enc_values[n][k][r][v][3]);
}
}

View file

@ -68,11 +68,6 @@ TEST(AV1, TestBitIO) {
aom_stop_encode(&bw);
#if !CONFIG_DAALA_EC
// First bit should be zero
GTEST_ASSERT_EQ(bw_buffer[0] & 0x80, 0);
#endif
aom_reader br;
aom_reader_init(&br, bw_buffer, bw.pos, NULL, NULL);
bit_rnd.Reset(random_seed);
@ -91,10 +86,10 @@ TEST(AV1, TestBitIO) {
}
}
#if CONFIG_DAALA_EC
#define FRAC_DIFF_TOTAL_ERROR 0.07
#if CONFIG_EC_SMALLMUL
#define FRAC_DIFF_TOTAL_ERROR 0.16
#else
#define FRAC_DIFF_TOTAL_ERROR 0.2
#define FRAC_DIFF_TOTAL_ERROR 0.07
#endif
TEST(AV1, TestTell) {

View file

@ -59,7 +59,7 @@ TEST_P(BordersTest, TestEncodeHighBitrate) {
cfg_.rc_max_quantizer = 10;
::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
40);
10);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
}
@ -75,7 +75,7 @@ TEST_P(BordersTest, TestLowBitrate) {
cfg_.rc_min_quantizer = 40;
::libaom_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0,
40);
10);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
}

View file

@ -212,7 +212,7 @@ void highbd_filter_block2d_8_c(const uint16_t *src_ptr,
* = 23
* and filter_max_width = 16
*/
uint16_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension];
uint16_t intermediate_buffer[(kMaxDimension + 8) * kMaxDimension] = { 0 };
const int intermediate_next_stride =
1 - static_cast<int>(intermediate_height * output_width);
@ -368,10 +368,17 @@ class ConvolveTest : public ::testing::TestWithParam<ConvolveParam> {
#endif
/* Set up guard blocks for an inner block centered in the outer block */
for (int i = 0; i < kOutputBufferSize; ++i) {
if (IsIndexInBorder(i))
if (IsIndexInBorder(i)) {
output_[i] = 255;
else
#if CONFIG_HIGHBITDEPTH
output16_[i] = mask_;
#endif
} else {
output_[i] = 0;
#if CONFIG_HIGHBITDEPTH
output16_[i] = 0;
#endif
}
}
::libaom_test::ACMRandom prng;

View file

@ -0,0 +1,100 @@
/*
* 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/util.h"
#include "./av1_rtcd.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 std::tr1::tuple;
using std::tr1::make_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

View file

@ -94,7 +94,7 @@ void CpuSpeedTest::TestQ0() {
}
void CpuSpeedTest::TestScreencastQ0() {
::libaom_test::Y4mVideoSource video("screendata.y4m", 0, 10);
::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;
@ -109,7 +109,7 @@ void CpuSpeedTest::TestScreencastQ0() {
}
void CpuSpeedTest::TestTuneScreen() {
::libaom_test::Y4mVideoSource video("screendata.y4m", 0, 10);
::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;

View file

@ -249,5 +249,5 @@ TEST_P(DatarateTestLarge, ChangingDropFrameThresh) {
AV1_INSTANTIATE_TEST_CASE(DatarateTestLarge,
::testing::Values(::libaom_test::kOnePassGood,
::libaom_test::kRealTime),
::testing::Range(2, 9, 2));
::testing::Values(2, 5));
} // namespace

View file

@ -82,8 +82,6 @@ void DecoderTest::RunLoop(CompressedVideoSource *video,
PreDecodeFrameHook(*video, decoder);
aom_codec_stream_info_t stream_info;
stream_info.sz = sizeof(stream_info);
if (video->cxdata() != NULL) {
const aom_codec_err_t res_peek = decoder->PeekStream(
video->cxdata(), video->frame_size(), &stream_info);

View file

@ -150,7 +150,7 @@ TEST_P(ErrorResilienceTestLarge, OnVersusOff) {
init_flags_ = AOM_CODEC_USE_PSNR;
libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
timebase.den, timebase.num, 0, 30);
timebase.den, timebase.num, 0, 12);
// Error resilient mode OFF.
cfg_.g_error_resilient = 0;
@ -187,7 +187,7 @@ TEST_P(ErrorResilienceTestLarge, DropFramesWithoutRecovery) {
init_flags_ = AOM_CODEC_USE_PSNR;
libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
timebase.den, timebase.num, 0, 40);
timebase.den, timebase.num, 0, 20);
// Error resilient mode ON.
cfg_.g_error_resilient = 1;
@ -196,9 +196,8 @@ TEST_P(ErrorResilienceTestLarge, DropFramesWithoutRecovery) {
// Set an arbitrary set of error frames same as droppable frames.
// In addition to isolated loss/drop, add a long consecutive series
// (of size 9) of dropped frames.
unsigned int num_droppable_frames = 11;
unsigned int droppable_frame_list[] = { 5, 16, 22, 23, 24, 25,
26, 27, 28, 29, 30 };
unsigned int num_droppable_frames = 5;
unsigned int droppable_frame_list[] = { 5, 10, 13, 16, 19 };
SetDroppableFrames(num_droppable_frames, droppable_frame_list);
SetErrorFrames(num_droppable_frames, droppable_frame_list);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));

View file

@ -46,43 +46,25 @@ class AV1FrameSizeTests : public ::libaom_test::EncoderTest,
int expected_res_;
};
#if CONFIG_SIZE_LIMIT
TEST_F(AV1FrameSizeTests, TestInvalidSizes) {
::libaom_test::RandomVideoSource video;
#if CONFIG_SIZE_LIMIT
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));
#endif
}
TEST_F(AV1FrameSizeTests, LargeValidSizes) {
::libaom_test::RandomVideoSource video;
#if CONFIG_SIZE_LIMIT
video.SetSize(DECODE_WIDTH_LIMIT, DECODE_HEIGHT_LIMIT);
video.set_limit(2);
expected_res_ = AOM_CODEC_OK;
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
#else
// This test produces a pretty large single frame allocation, (roughly
// 25 megabits). The encoder allocates a good number of these frames
// one for each lag in frames (for 2 pass), and then one for each possible
// reference buffer (8) - we can end up with up to 30 buffers of roughly this
// size or almost 1 gig of memory.
// In total the allocations will exceed 2GiB which may cause a failure with
// non-64 bit platforms, use a smaller size in that case.
if (sizeof(void *) < 8)
video.SetSize(2560, 1440);
else
video.SetSize(4096, 4096);
video.set_limit(2);
expected_res_ = AOM_CODEC_OK;
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
#endif
}
#endif
TEST_F(AV1FrameSizeTests, OneByOneVideo) {
::libaom_test::RandomVideoSource video;

View file

@ -0,0 +1,42 @@
/*
* 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 std::tr1::tuple;
using std::tr1::make_tuple;
using libaom_test::ACMRandom;
using libaom_test::AV1HiprecConvolve::AV1HiprecConvolveTest;
#if CONFIG_HIGHBITDEPTH
using libaom_test::AV1HighbdHiprecConvolve::AV1HighbdHiprecConvolveTest;
#endif
namespace {
TEST_P(AV1HiprecConvolveTest, CheckOutput) { RunCheckOutput(GET_PARAM(3)); }
INSTANTIATE_TEST_CASE_P(SSE2, AV1HiprecConvolveTest,
libaom_test::AV1HiprecConvolve::BuildParams(
aom_convolve8_add_src_hip_sse2));
#if CONFIG_HIGHBITDEPTH && HAVE_SSSE3
TEST_P(AV1HighbdHiprecConvolveTest, CheckOutput) {
RunCheckOutput(GET_PARAM(4));
}
INSTANTIATE_TEST_CASE_P(SSSE3, AV1HighbdHiprecConvolveTest,
libaom_test::AV1HighbdHiprecConvolve::BuildParams(
aom_highbd_convolve8_add_src_hip_ssse3));
#endif
} // namespace

View file

@ -0,0 +1,188 @@
/*
* 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 std::tr1::tuple;
using std::tr1::make_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(64, 64, 1000, filter),
make_tuple(32, 8, 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;
uint8_t *input_ = new uint8_t[h * w];
uint8_t *input = input_;
// The convolve 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];
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(w - out_w - 7);
int offset_c = 3 + rnd_.PseudoUniform(h - out_h - 7);
aom_convolve8_add_src_hip_c(input + offset_r * w + offset_c, w, output,
out_w, hkernel, 16, vkernel, 16, out_w, out_h);
test_impl(input + offset_r * w + offset_c, w, output2, out_w, hkernel, 16,
vkernel, 16, out_w, out_h);
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;
}
} // namespace AV1HiprecConvolve
#if CONFIG_HIGHBITDEPTH
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;
uint16_t *input = new uint16_t[h * w];
// The convolve 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 *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(w - out_w - 7);
int offset_c = 3 + rnd_.PseudoUniform(h - out_h - 7);
aom_highbd_convolve8_add_src_hip_c(input_ptr + offset_r * w + offset_c, w,
output_ptr, out_w, hkernel, 16, vkernel,
16, out_w, out_h, bd);
test_impl(input_ptr + offset_r * w + offset_c, w, output2_ptr, out_w,
hkernel, 16, vkernel, 16, out_w, out_h, 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;
}
} // namespace AV1HighbdHiprecConvolve
#endif // CONFIG_HIGHBITDEPTH
} // namespace libaom_test

View file

@ -0,0 +1,89 @@
/*
* 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 TEST_HIPREC_CONVOLVE_TEST_UTIL_H_
#define TEST_HIPREC_CONVOLVE_TEST_UTIL_H_
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"
#include "test/acm_random.h"
#include "test/util.h"
#include "./av1_rtcd.h"
#include "./aom_dsp_rtcd.h"
#include "test/clear_system_state.h"
#include "test/register_state_check.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);
typedef std::tr1::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);
libaom_test::ACMRandom rnd_;
};
} // namespace AV1HiprecConvolve
#if CONFIG_HIGHBITDEPTH
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, int bps);
typedef std::tr1::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);
libaom_test::ACMRandom rnd_;
};
} // namespace AV1HighbdHiprecConvolve
#endif // CONFIG_HIGHBITDEPTH
} // namespace libaom_test
#endif // TEST_HIPREC_CONVOLVE_TEST_UTIL_H_

View file

@ -126,105 +126,111 @@ TEST_P(AV1IntraPredTest, IntraPredTests) {
#if HAVE_SSE2
#if CONFIG_HIGHBITDEPTH
INSTANTIATE_TEST_CASE_P(
SSE2_TO_C_8, AV1IntraPredTest,
::testing::Values(IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 8),
const IntraPredFunc IntraPredTestVector8[] = {
IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 8),
#if !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 8),
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 8),
#endif // !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 8),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 8),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2,
&aom_highbd_v_predictor_4x4_c, 4, 8),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2,
&aom_highbd_v_predictor_8x8_c, 8, 8),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 8)
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 8),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 8),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2, &aom_highbd_v_predictor_4x4_c,
4, 8),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2, &aom_highbd_v_predictor_8x8_c,
8, 8),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 8),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 8)
#if !CONFIG_ALT_INTRA
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 8),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 8)
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 8),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 8)
#endif // !CONFIG_ALT_INTRA
));
};
INSTANTIATE_TEST_CASE_P(
SSE2_TO_C_10, AV1IntraPredTest,
::testing::Values(IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 10),
#if !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 10),
#endif // !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 10),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 10),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2,
&aom_highbd_v_predictor_4x4_c, 4, 10),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2,
&aom_highbd_v_predictor_8x8_c, 8, 10),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 10)
#if !CONFIG_ALT_INTRA
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 10),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 10)
#endif // !CONFIG_ALT_INTRA
));
INSTANTIATE_TEST_CASE_P(SSE2_TO_C_8, AV1IntraPredTest,
::testing::ValuesIn(IntraPredTestVector8));
INSTANTIATE_TEST_CASE_P(
SSE2_TO_C_12, AV1IntraPredTest,
::testing::Values(IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 12),
const IntraPredFunc IntraPredTestVector10[] = {
IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 10),
#if !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 12),
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 10),
#endif // !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 12),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 12),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2,
&aom_highbd_v_predictor_4x4_c, 4, 12),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2,
&aom_highbd_v_predictor_8x8_c, 8, 12),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 12)
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 10),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 10),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2, &aom_highbd_v_predictor_4x4_c,
4, 10),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2, &aom_highbd_v_predictor_8x8_c,
8, 10),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 10),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 10)
#if !CONFIG_ALT_INTRA
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 12),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 12)
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 10),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 10)
#endif // !CONFIG_ALT_INTRA
));
};
INSTANTIATE_TEST_CASE_P(SSE2_TO_C_10, AV1IntraPredTest,
::testing::ValuesIn(IntraPredTestVector10));
const IntraPredFunc IntraPredTestVector12[] = {
IntraPredFunc(&aom_highbd_dc_predictor_32x32_sse2,
&aom_highbd_dc_predictor_32x32_c, 32, 12),
#if !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_tm_predictor_16x16_sse2,
&aom_highbd_tm_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_tm_predictor_32x32_sse2,
&aom_highbd_tm_predictor_32x32_c, 32, 12),
#endif // !CONFIG_ALT_INTRA
IntraPredFunc(&aom_highbd_dc_predictor_4x4_sse2,
&aom_highbd_dc_predictor_4x4_c, 4, 12),
IntraPredFunc(&aom_highbd_dc_predictor_8x8_sse2,
&aom_highbd_dc_predictor_8x8_c, 8, 12),
IntraPredFunc(&aom_highbd_dc_predictor_16x16_sse2,
&aom_highbd_dc_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_v_predictor_4x4_sse2, &aom_highbd_v_predictor_4x4_c,
4, 12),
IntraPredFunc(&aom_highbd_v_predictor_8x8_sse2, &aom_highbd_v_predictor_8x8_c,
8, 12),
IntraPredFunc(&aom_highbd_v_predictor_16x16_sse2,
&aom_highbd_v_predictor_16x16_c, 16, 12),
IntraPredFunc(&aom_highbd_v_predictor_32x32_sse2,
&aom_highbd_v_predictor_32x32_c, 32, 12)
#if !CONFIG_ALT_INTRA
,
IntraPredFunc(&aom_highbd_tm_predictor_4x4_sse2,
&aom_highbd_tm_predictor_4x4_c, 4, 12),
IntraPredFunc(&aom_highbd_tm_predictor_8x8_sse2,
&aom_highbd_tm_predictor_8x8_c, 8, 12)
#endif // !CONFIG_ALT_INTRA
};
INSTANTIATE_TEST_CASE_P(SSE2_TO_C_12, AV1IntraPredTest,
::testing::ValuesIn(IntraPredTestVector12));
#endif // CONFIG_HIGHBITDEPTH
#endif // HAVE_SSE2

View file

@ -25,11 +25,13 @@
using libaom_test::ACMRandom;
namespace {
const int number_of_iterations = 500;
const int number_of_iterations = 200;
typedef unsigned int (*MaskedSADFunc)(const uint8_t *a, int a_stride,
const uint8_t *b, int b_stride,
const uint8_t *m, int m_stride);
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 std::tr1::tuple<MaskedSADFunc, MaskedSADFunc> MaskedSADParam;
class MaskedSADTest : public ::testing::TestWithParam<MaskedSADParam> {
@ -52,6 +54,7 @@ TEST_P(MaskedSADTest, OperationCheck) {
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;
@ -62,18 +65,23 @@ TEST_P(MaskedSADTest, OperationCheck) {
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);
}
ref_ret = ref_maskedSAD_op_(src_ptr, src_stride, ref_ptr, ref_stride,
msk_ptr, msk_stride);
ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src_ptr, src_stride, ref_ptr,
ref_stride, msk_ptr,
msk_stride));
if (ret != ref_ret) {
err_count++;
if (first_failure == -1) first_failure = i;
for (int invert_mask = 0; invert_mask < 2; ++invert_mask) {
ref_ret =
ref_maskedSAD_op_(src_ptr, src_stride, ref_ptr, ref_stride,
second_pred_ptr, msk_ptr, msk_stride, invert_mask);
ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src_ptr, src_stride, ref_ptr,
ref_stride, second_pred_ptr,
msk_ptr, msk_stride,
invert_mask));
if (ret != ref_ret) {
err_count++;
if (first_failure == -1) first_failure = i;
}
}
}
EXPECT_EQ(0, err_count)
@ -82,9 +90,11 @@ TEST_P(MaskedSADTest, OperationCheck) {
}
#if CONFIG_HIGHBITDEPTH
typedef unsigned int (*HighbdMaskedSADFunc)(const uint8_t *a, int a_stride,
const uint8_t *b, int b_stride,
const uint8_t *m, int m_stride);
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 std::tr1::tuple<HighbdMaskedSADFunc, HighbdMaskedSADFunc>
HighbdMaskedSADParam;
@ -109,9 +119,11 @@ TEST_P(HighbdMaskedSADTest, OperationCheck) {
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;
@ -121,17 +133,22 @@ TEST_P(HighbdMaskedSADTest, OperationCheck) {
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;
}
ref_ret = ref_maskedSAD_op_(src8_ptr, src_stride, ref8_ptr, ref_stride,
msk_ptr, msk_stride);
ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src8_ptr, src_stride, ref8_ptr,
ref_stride, msk_ptr,
msk_stride));
if (ret != ref_ret) {
err_count++;
if (first_failure == -1) first_failure = i;
for (int invert_mask = 0; invert_mask < 2; ++invert_mask) {
ref_ret =
ref_maskedSAD_op_(src8_ptr, src_stride, ref8_ptr, ref_stride,
second_pred8_ptr, msk_ptr, msk_stride, invert_mask);
ASM_REGISTER_STATE_CHECK(ret = maskedSAD_op_(src8_ptr, src_stride,
ref8_ptr, ref_stride,
second_pred8_ptr, msk_ptr,
msk_stride, invert_mask));
if (ret != ref_ret) {
err_count++;
if (first_failure == -1) first_failure = i;
}
}
}
EXPECT_EQ(0, err_count)

View file

@ -29,107 +29,12 @@
using libaom_test::ACMRandom;
namespace {
const int number_of_iterations = 500;
typedef unsigned int (*MaskedVarianceFunc)(const uint8_t *a, int a_stride,
const uint8_t *b, int b_stride,
const uint8_t *m, int m_stride,
unsigned int *sse);
typedef std::tr1::tuple<MaskedVarianceFunc, MaskedVarianceFunc>
MaskedVarianceParam;
class MaskedVarianceTest
: public ::testing::TestWithParam<MaskedVarianceParam> {
public:
virtual ~MaskedVarianceTest() {}
virtual void SetUp() {
opt_func_ = GET_PARAM(0);
ref_func_ = GET_PARAM(1);
}
virtual void TearDown() { libaom_test::ClearSystemState(); }
protected:
MaskedVarianceFunc opt_func_;
MaskedVarianceFunc ref_func_;
};
TEST_P(MaskedVarianceTest, OperationCheck) {
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 * MAX_SB_SIZE]);
DECLARE_ALIGNED(16, uint8_t, ref_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;
for (int i = 0; i < number_of_iterations; ++i) {
for (int j = 0; j < MAX_SB_SIZE * MAX_SB_SIZE; j++) {
src_ptr[j] = rnd.Rand8();
ref_ptr[j] = rnd.Rand8();
msk_ptr[j] = rnd(65);
}
ref_ret = ref_func_(src_ptr, src_stride, ref_ptr, ref_stride, msk_ptr,
msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret = opt_func_(src_ptr, src_stride, ref_ptr,
ref_stride, msk_ptr,
msk_stride, &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 Variance Test OperationCheck,"
<< "C output doesn't match SSSE3 output. "
<< "First failed at test case " << first_failure;
}
TEST_P(MaskedVarianceTest, 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 * MAX_SB_SIZE]);
DECLARE_ALIGNED(16, uint8_t, ref_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;
for (int i = 0; i < 8; ++i) {
memset(src_ptr, (i & 0x1) ? 255 : 0, MAX_SB_SIZE * MAX_SB_SIZE);
memset(ref_ptr, (i & 0x2) ? 255 : 0, MAX_SB_SIZE * MAX_SB_SIZE);
memset(msk_ptr, (i & 0x4) ? 64 : 0, MAX_SB_SIZE * MAX_SB_SIZE);
ref_ret = ref_func_(src_ptr, src_stride, ref_ptr, ref_stride, msk_ptr,
msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret = opt_func_(src_ptr, src_stride, ref_ptr,
ref_stride, msk_ptr,
msk_stride, &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 Variance Test ExtremeValues,"
<< "C output doesn't match SSSE3 output. "
<< "First failed at test case " << first_failure;
}
const int number_of_iterations = 200;
typedef unsigned int (*MaskedSubPixelVarianceFunc)(
const uint8_t *a, int a_stride, int xoffset, int yoffset, const uint8_t *b,
int b_stride, const uint8_t *m, int m_stride, unsigned int *sse);
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 std::tr1::tuple<MaskedSubPixelVarianceFunc, MaskedSubPixelVarianceFunc>
MaskedSubPixelVarianceParam;
@ -154,9 +59,18 @@ TEST_P(MaskedSubPixelVarianceTest, OperationCheck) {
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 + 1)]);
DECLARE_ALIGNED(16, uint8_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
// Note: We pad the input arrays out with 15 extra elements, since the SSE
// implementations can read up to 15 elements off the end of the main data.
// The extra data is never actually used, but it simplifies the code
// if we can do this.
DECLARE_ALIGNED(16, uint8_t,
src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
int err_count = 0;
int first_failure = -1;
int src_stride = (MAX_SB_SIZE + 1);
@ -171,23 +85,26 @@ TEST_P(MaskedSubPixelVarianceTest, OperationCheck) {
for (int j = 0; j < (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1); 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++) {
xoffset = xoffsets[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));
ref_ret = ref_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr,
ref_stride, msk_ptr, msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(
opt_ret = opt_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr,
ref_stride, msk_ptr, msk_stride, &opt_sse));
if (opt_ret != ref_ret || opt_sse != ref_sse) {
err_count++;
if (first_failure == -1) first_failure = i;
if (opt_ret != ref_ret || opt_sse != ref_sse) {
err_count++;
if (first_failure == -1) first_failure = i;
}
}
}
}
@ -203,9 +120,14 @@ 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 + 1)]);
DECLARE_ALIGNED(16, uint8_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint8_t,
src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
DECLARE_ALIGNED(16, uint8_t,
msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 15]);
int first_failure_x = -1;
int first_failure_y = -1;
int err_count = 0;
@ -216,26 +138,32 @@ TEST_P(MaskedSubPixelVarianceTest, ExtremeValues) {
for (int xoffset = 0; xoffset < BIL_SUBPEL_SHIFTS; xoffset++) {
for (int yoffset = 0; yoffset < BIL_SUBPEL_SHIFTS; yoffset++) {
for (int i = 0; i < 8; ++i) {
for (int i = 0; i < 16; ++i) {
memset(src_ptr, (i & 0x1) ? 255 : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
memset(ref_ptr, (i & 0x2) ? 255 : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
memset(msk_ptr, (i & 0x4) ? 64 : 0,
memset(second_pred_ptr, (i & 0x4) ? 255 : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
memset(msk_ptr, (i & 0x8) ? 64 : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
ref_ret = ref_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr,
ref_stride, msk_ptr, msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(
opt_ret = opt_func_(src_ptr, src_stride, xoffset, yoffset, ref_ptr,
ref_stride, msk_ptr, msk_stride, &opt_sse));
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;
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;
}
}
}
}
@ -250,105 +178,6 @@ TEST_P(MaskedSubPixelVarianceTest, ExtremeValues) {
}
#if CONFIG_HIGHBITDEPTH
typedef std::tr1::tuple<MaskedVarianceFunc, MaskedVarianceFunc, aom_bit_depth_t>
HighbdMaskedVarianceParam;
class HighbdMaskedVarianceTest
: public ::testing::TestWithParam<HighbdMaskedVarianceParam> {
public:
virtual ~HighbdMaskedVarianceTest() {}
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:
MaskedVarianceFunc opt_func_;
MaskedVarianceFunc ref_func_;
aom_bit_depth_t bit_depth_;
};
TEST_P(HighbdMaskedVarianceTest, 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 * MAX_SB_SIZE]);
DECLARE_ALIGNED(16, uint16_t, ref_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);
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;
for (int i = 0; i < number_of_iterations; ++i) {
for (int j = 0; j < MAX_SB_SIZE * MAX_SB_SIZE; j++) {
src_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1);
ref_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1);
msk_ptr[j] = rnd(65);
}
ref_ret = ref_func_(src8_ptr, src_stride, ref8_ptr, ref_stride, msk_ptr,
msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret = opt_func_(src8_ptr, src_stride, ref8_ptr,
ref_stride, msk_ptr,
msk_stride, &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 Variance Test OperationCheck,"
<< "C output doesn't match SSSE3 output. "
<< "First failed at test case " << first_failure;
}
TEST_P(HighbdMaskedVarianceTest, 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 * MAX_SB_SIZE]);
DECLARE_ALIGNED(16, uint16_t, ref_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);
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;
for (int i = 0; i < 8; ++i) {
aom_memset16(src_ptr, (i & 0x1) ? ((1 << bit_depth_) - 1) : 0,
MAX_SB_SIZE * MAX_SB_SIZE);
aom_memset16(ref_ptr, (i & 0x2) ? ((1 << bit_depth_) - 1) : 0,
MAX_SB_SIZE * MAX_SB_SIZE);
memset(msk_ptr, (i & 0x4) ? 64 : 0, MAX_SB_SIZE * MAX_SB_SIZE);
ref_ret = ref_func_(src8_ptr, src_stride, ref8_ptr, ref_stride, msk_ptr,
msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret = opt_func_(src8_ptr, src_stride, ref8_ptr,
ref_stride, msk_ptr,
msk_stride, &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 Variance Test ExtremeValues,"
<< "C output doesn't match SSSE3 output. "
<< "First failed at test case " << first_failure;
}
typedef std::tr1::tuple<MaskedSubPixelVarianceFunc, MaskedSubPixelVarianceFunc,
aom_bit_depth_t>
HighbdMaskedSubPixelVarianceParam;
@ -375,11 +204,21 @@ 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 + 1)]);
DECLARE_ALIGNED(16, uint16_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
// Note: We pad the input arrays out with 7 extra elements, since the SSE
// implementations can read up to 7 elements off the end of the main data.
// The extra data is never actually used, but it simplifies the code
// if we can do this.
DECLARE_ALIGNED(16, uint16_t,
src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint16_t,
ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint16_t,
second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint8_t,
msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
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;
@ -390,27 +229,30 @@ TEST_P(HighbdMaskedSubPixelVarianceTest, OperationCheck) {
int xoffset, yoffset;
for (int i = 0; i < number_of_iterations; ++i) {
for (int j = 0; j < (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1); 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 j = 0; j < (MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1); j++) {
src_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1);
ref_ptr[j] = rnd.Rand16() & ((1 << bit_depth_) - 1);
msk_ptr[j] = rnd(65);
}
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));
ref_ret = ref_func_(src8_ptr, src_stride, xoffset, yoffset, ref8_ptr,
ref_stride, msk_ptr, msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret =
opt_func_(src8_ptr, src_stride, xoffset,
yoffset, ref8_ptr, ref_stride,
msk_ptr, msk_stride, &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;
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;
}
}
}
}
@ -428,11 +270,17 @@ 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 + 1)]);
DECLARE_ALIGNED(16, uint16_t, ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint8_t, msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1)]);
DECLARE_ALIGNED(16, uint16_t,
src_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint16_t,
ref_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint8_t,
msk_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
DECLARE_ALIGNED(16, uint16_t,
second_pred_ptr[(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1) + 7]);
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;
@ -443,27 +291,32 @@ TEST_P(HighbdMaskedSubPixelVarianceTest, ExtremeValues) {
for (int xoffset = 0; xoffset < BIL_SUBPEL_SHIFTS; xoffset++) {
for (int yoffset = 0; yoffset < BIL_SUBPEL_SHIFTS; yoffset++) {
for (int i = 0; i < 8; ++i) {
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 + 1));
aom_memset16(ref_ptr, (i & 0x2) ? ((1 << bit_depth_) - 1) : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
memset(msk_ptr, (i & 0x4) ? 64 : 0,
aom_memset16(second_pred_ptr, (i & 0x4) ? ((1 << bit_depth_) - 1) : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
memset(msk_ptr, (i & 0x8) ? 64 : 0,
(MAX_SB_SIZE + 1) * (MAX_SB_SIZE + 1));
ref_ret = ref_func_(src8_ptr, src_stride, xoffset, yoffset, ref8_ptr,
ref_stride, msk_ptr, msk_stride, &ref_sse);
ASM_REGISTER_STATE_CHECK(opt_ret =
opt_func_(src8_ptr, src_stride, xoffset,
yoffset, ref8_ptr, ref_stride,
msk_ptr, msk_stride, &opt_sse));
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;
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;
}
}
}
}
@ -481,38 +334,6 @@ TEST_P(HighbdMaskedSubPixelVarianceTest, ExtremeValues) {
using std::tr1::make_tuple;
#if HAVE_SSSE3
INSTANTIATE_TEST_CASE_P(
SSSE3_C_COMPARE, MaskedVarianceTest,
::testing::Values(
#if CONFIG_EXT_PARTITION
make_tuple(&aom_masked_variance128x128_ssse3,
&aom_masked_variance128x128_c),
make_tuple(&aom_masked_variance128x64_ssse3,
&aom_masked_variance128x64_c),
make_tuple(&aom_masked_variance64x128_ssse3,
&aom_masked_variance64x128_c),
#endif // CONFIG_EXT_PARTITION
make_tuple(&aom_masked_variance64x64_ssse3,
&aom_masked_variance64x64_c),
make_tuple(&aom_masked_variance64x32_ssse3,
&aom_masked_variance64x32_c),
make_tuple(&aom_masked_variance32x64_ssse3,
&aom_masked_variance32x64_c),
make_tuple(&aom_masked_variance32x32_ssse3,
&aom_masked_variance32x32_c),
make_tuple(&aom_masked_variance32x16_ssse3,
&aom_masked_variance32x16_c),
make_tuple(&aom_masked_variance16x32_ssse3,
&aom_masked_variance16x32_c),
make_tuple(&aom_masked_variance16x16_ssse3,
&aom_masked_variance16x16_c),
make_tuple(&aom_masked_variance16x8_ssse3, &aom_masked_variance16x8_c),
make_tuple(&aom_masked_variance8x16_ssse3, &aom_masked_variance8x16_c),
make_tuple(&aom_masked_variance8x8_ssse3, &aom_masked_variance8x8_c),
make_tuple(&aom_masked_variance8x4_ssse3, &aom_masked_variance8x4_c),
make_tuple(&aom_masked_variance4x8_ssse3, &aom_masked_variance4x8_c),
make_tuple(&aom_masked_variance4x4_ssse3, &aom_masked_variance4x4_c)));
INSTANTIATE_TEST_CASE_P(
SSSE3_C_COMPARE, MaskedSubPixelVarianceTest,
::testing::Values(
@ -552,149 +373,44 @@ INSTANTIATE_TEST_CASE_P(
&aom_masked_sub_pixel_variance4x4_c)));
#if CONFIG_HIGHBITDEPTH
INSTANTIATE_TEST_CASE_P(
SSSE3_C_COMPARE, HighbdMaskedVarianceTest,
::testing::Values(
#if CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_masked_variance128x128_ssse3,
&aom_highbd_masked_variance128x128_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance128x64_ssse3,
&aom_highbd_masked_variance128x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance64x128_ssse3,
&aom_highbd_masked_variance64x128_c, AOM_BITS_8),
#endif // CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_masked_variance64x64_ssse3,
&aom_highbd_masked_variance64x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance64x32_ssse3,
&aom_highbd_masked_variance64x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance32x64_ssse3,
&aom_highbd_masked_variance32x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance32x32_ssse3,
&aom_highbd_masked_variance32x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance32x16_ssse3,
&aom_highbd_masked_variance32x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance16x32_ssse3,
&aom_highbd_masked_variance16x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance16x16_ssse3,
&aom_highbd_masked_variance16x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance16x8_ssse3,
&aom_highbd_masked_variance16x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance8x16_ssse3,
&aom_highbd_masked_variance8x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance8x8_ssse3,
&aom_highbd_masked_variance8x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance8x4_ssse3,
&aom_highbd_masked_variance8x4_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance4x8_ssse3,
&aom_highbd_masked_variance4x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_variance4x4_ssse3,
&aom_highbd_masked_variance4x4_c, AOM_BITS_8),
#if CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_10_masked_variance128x128_ssse3,
&aom_highbd_10_masked_variance128x128_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance128x64_ssse3,
&aom_highbd_10_masked_variance128x64_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance64x128_ssse3,
&aom_highbd_10_masked_variance64x128_c, AOM_BITS_10),
#endif // CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_10_masked_variance64x64_ssse3,
&aom_highbd_10_masked_variance64x64_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance64x32_ssse3,
&aom_highbd_10_masked_variance64x32_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance32x64_ssse3,
&aom_highbd_10_masked_variance32x64_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance32x32_ssse3,
&aom_highbd_10_masked_variance32x32_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance32x16_ssse3,
&aom_highbd_10_masked_variance32x16_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance16x32_ssse3,
&aom_highbd_10_masked_variance16x32_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance16x16_ssse3,
&aom_highbd_10_masked_variance16x16_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance16x8_ssse3,
&aom_highbd_10_masked_variance16x8_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance8x16_ssse3,
&aom_highbd_10_masked_variance8x16_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance8x8_ssse3,
&aom_highbd_10_masked_variance8x8_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance8x4_ssse3,
&aom_highbd_10_masked_variance8x4_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance4x8_ssse3,
&aom_highbd_10_masked_variance4x8_c, AOM_BITS_10),
make_tuple(&aom_highbd_10_masked_variance4x4_ssse3,
&aom_highbd_10_masked_variance4x4_c, AOM_BITS_10),
#if CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_12_masked_variance128x128_ssse3,
&aom_highbd_12_masked_variance128x128_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance128x64_ssse3,
&aom_highbd_12_masked_variance128x64_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance64x128_ssse3,
&aom_highbd_12_masked_variance64x128_c, AOM_BITS_12),
#endif // CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_12_masked_variance64x64_ssse3,
&aom_highbd_12_masked_variance64x64_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance64x32_ssse3,
&aom_highbd_12_masked_variance64x32_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance32x64_ssse3,
&aom_highbd_12_masked_variance32x64_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance32x32_ssse3,
&aom_highbd_12_masked_variance32x32_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance32x16_ssse3,
&aom_highbd_12_masked_variance32x16_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance16x32_ssse3,
&aom_highbd_12_masked_variance16x32_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance16x16_ssse3,
&aom_highbd_12_masked_variance16x16_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance16x8_ssse3,
&aom_highbd_12_masked_variance16x8_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance8x16_ssse3,
&aom_highbd_12_masked_variance8x16_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance8x8_ssse3,
&aom_highbd_12_masked_variance8x8_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance8x4_ssse3,
&aom_highbd_12_masked_variance8x4_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance4x8_ssse3,
&aom_highbd_12_masked_variance4x8_c, AOM_BITS_12),
make_tuple(&aom_highbd_12_masked_variance4x4_ssse3,
&aom_highbd_12_masked_variance4x4_c, AOM_BITS_12)));
INSTANTIATE_TEST_CASE_P(
SSSE3_C_COMPARE, HighbdMaskedSubPixelVarianceTest,
::testing::Values(
#if CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_masked_sub_pixel_variance128x128_ssse3,
&aom_highbd_masked_sub_pixel_variance128x128_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance128x64_ssse3,
&aom_highbd_masked_sub_pixel_variance128x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance64x128_ssse3,
&aom_highbd_masked_sub_pixel_variance64x128_c, AOM_BITS_8),
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),
#endif // CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_masked_sub_pixel_variance64x64_ssse3,
&aom_highbd_masked_sub_pixel_variance64x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance64x32_ssse3,
&aom_highbd_masked_sub_pixel_variance64x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance32x64_ssse3,
&aom_highbd_masked_sub_pixel_variance32x64_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance32x32_ssse3,
&aom_highbd_masked_sub_pixel_variance32x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance32x16_ssse3,
&aom_highbd_masked_sub_pixel_variance32x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance16x32_ssse3,
&aom_highbd_masked_sub_pixel_variance16x32_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance16x16_ssse3,
&aom_highbd_masked_sub_pixel_variance16x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance16x8_ssse3,
&aom_highbd_masked_sub_pixel_variance16x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance8x16_ssse3,
&aom_highbd_masked_sub_pixel_variance8x16_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance8x8_ssse3,
&aom_highbd_masked_sub_pixel_variance8x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance8x4_ssse3,
&aom_highbd_masked_sub_pixel_variance8x4_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance4x8_ssse3,
&aom_highbd_masked_sub_pixel_variance4x8_c, AOM_BITS_8),
make_tuple(&aom_highbd_masked_sub_pixel_variance4x4_ssse3,
&aom_highbd_masked_sub_pixel_variance4x4_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),
#if CONFIG_EXT_PARTITION
make_tuple(&aom_highbd_10_masked_sub_pixel_variance128x128_ssse3,
&aom_highbd_10_masked_sub_pixel_variance128x128_c,

View file

@ -17,12 +17,6 @@
#include "test/yuv_video_source.h"
namespace {
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define BUILDING_WITH_ASAN
#endif
#endif
#define MAX_EXTREME_MV 1
#define MIN_EXTREME_MV 2
@ -32,7 +26,7 @@ const libaom_test::TestMode kEncodingModeVectors[] = {
};
// Encoding speeds
const int kCpuUsedVectors[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
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 };
@ -85,16 +79,11 @@ TEST_P(MotionVectorTestLarge, OverallTest) {
int width = 3840;
int height = 2160;
#ifdef BUILDING_WITH_ASAN
// On the 32-bit system, if using 4k test clip, an "out of memory" error
// occurs because of the AddressSanitizer instrumentation memory overhead.
// Here, reduce the test clip's resolution while testing on 32-bit system
// and AddressSanitizer is enabled.
// Reduce the test clip's resolution while testing on 32-bit system.
if (sizeof(void *) == 4) {
width = 2048;
height = 1080;
}
#endif
cfg_.rc_target_bitrate = 24000;
cfg_.g_profile = 0;
@ -102,7 +91,7 @@ TEST_P(MotionVectorTestLarge, OverallTest) {
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, 5));
"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()));

View file

@ -52,7 +52,7 @@ typedef std::tr1::tuple<FwdTxfmFunc, InvTxfmWithBdFunc, InvTxfmWithBdFunc,
TX_SIZE, int, int, int>
PartialInvTxfmParam;
const int kMaxNumCoeffs = 1024;
const int kCountTestBlock = 1000;
const int kCountTestBlock = 10000;
class PartialIDctTest : public ::testing::TestWithParam<PartialInvTxfmParam> {
public:
@ -231,8 +231,8 @@ TEST_P(PartialIDctTest, AddOutputBlock) {
}
TEST_P(PartialIDctTest, SingleExtremeCoeff) {
const int16_t max_coeff = std::numeric_limits<int16_t>::max();
const int16_t min_coeff = std::numeric_limits<int16_t>::min();
const int16_t max_coeff = INT16_MAX;
const int16_t min_coeff = INT16_MIN;
for (int i = 0; i < last_nonzero_; ++i) {
memset(input_block_, 0, sizeof(*input_block_) * input_block_size_);
// Run once for min and once for max.
@ -418,6 +418,30 @@ INSTANTIATE_TEST_CASE_P(SSSE3, PartialIDctTest,
::testing::ValuesIn(ssse3_partial_idct_tests));
#endif // HAVE_SSSE3
#if HAVE_AVX2
const PartialInvTxfmParam avx2_partial_idct_tests[] = {
make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
&wrapper<aom_idct16x16_256_add_avx2>, TX_16X16, 256, 8, 1),
make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
&wrapper<aom_idct16x16_38_add_avx2>, TX_16X16, 38, 8, 1),
make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
&wrapper<aom_idct16x16_10_add_avx2>, TX_16X16, 10, 8, 1),
make_tuple(&aom_fdct16x16_c, &wrapper<aom_idct16x16_256_add_c>,
&wrapper<aom_idct16x16_1_add_avx2>, TX_16X16, 1, 8, 1),
make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
&wrapper<aom_idct32x32_1024_add_avx2>, TX_32X32, 1024, 8, 1),
make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
&wrapper<aom_idct32x32_135_add_avx2>, TX_32X32, 135, 8, 1),
make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
&wrapper<aom_idct32x32_34_add_avx2>, TX_32X32, 34, 8, 1),
make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,
&wrapper<aom_idct32x32_1_add_avx2>, TX_32X32, 1, 8, 1),
};
INSTANTIATE_TEST_CASE_P(AVX2, PartialIDctTest,
::testing::ValuesIn(avx2_partial_idct_tests));
#endif // HAVE_AVX2
#if HAVE_DSPR2 && !CONFIG_HIGHBITDEPTH
const PartialInvTxfmParam dspr2_partial_idct_tests[] = {
make_tuple(&aom_fdct32x32_c, &wrapper<aom_idct32x32_1024_add_c>,

View file

@ -0,0 +1,236 @@
/*
* 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 "./aom_config.h"
#include "./av1_rtcd.h"
#include "aom/aom_codec.h"
#include "av1/encoder/encoder.h"
#include "av1/encoder/av1_quantize.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;
#if !CONFIG_AOM_QM
typedef void (*QuantizeFunc)(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
int skip_block, 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);
#else
typedef void (*QuantizeFunc)(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
int skip_block, 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,
const qm_val_t *qm_ptr, const qm_val_t *iqm_ptr);
#endif
typedef std::tr1::tuple<QuantizeFunc, QuantizeFunc, TX_SIZE, 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)),
bd_(GET_PARAM(3)) {}
virtual ~QuantizeTest() {}
virtual void SetUp() {
qtab_ = reinterpret_cast<QuanTable *>(aom_memalign(16, sizeof(*qtab_)));
const int n_coeffs = getCoeffNum();
coeff_ = reinterpret_cast<tran_low_t *>(
aom_memalign(16, 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, &qtab_->quant, &qtab_->dequant);
}
void QuantizeRun(bool isLoop, int q = 0, int testNum = 1) {
tran_low_t *coeff_ptr = coeff_;
const intptr_t n_coeffs = getCoeffNum();
const int skip_block = 0;
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, 0);
// Testing uses luminance quantization table
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[q];
const size_t bufferSize = n_coeffs;
int i = 0;
while (i < testNum) {
if (isLoop) FillCoeffRandom();
memset(qcoeff_ref, 0, 5 * n_coeffs * sizeof(*qcoeff_ref));
quant_ref_(coeff_ptr, n_coeffs, skip_block, zbin, round_fp, quant_fp,
quant_shift, qcoeff_ref, dqcoeff_ref, dequant, &eob[0],
sc->scan, sc->iscan);
ASM_REGISTER_STATE_CHECK(quant_(
coeff_ptr, n_coeffs, skip_block, zbin, round_fp, quant_fp,
quant_shift, qcoeff, dqcoeff, dequant, &eob[1], sc->scan, sc->iscan));
CompareResults(qcoeff_ref, qcoeff, bufferSize, "Qcoeff", q, i);
CompareResults(dqcoeff_ref, dqcoeff, bufferSize, "Dqcoeff", q, i);
ASSERT_EQ(eob[0], eob[1]) << "eobs mismatch on test: " << i;
i++;
}
}
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 getCoeffNum() { return tx_size_2d[tx_size_]; }
void FillCoeffGeneric(bool isConstant, tran_low_t c = 0) {
const int n_coeffs = getCoeffNum();
int i;
if (isConstant) {
for (i = 0; i < n_coeffs; ++i) {
coeff_[i] = c;
}
} else {
FillCoeffZero();
int num = rnd_.Rand16() % n_coeffs;
for (i = 0; i < num; ++i) {
coeff_[i] = GetRandomCoeff();
}
}
}
void FillCoeffZero() { FillCoeffGeneric(true); }
void FillCoeffConstant() {
tran_low_t c = GetRandomCoeff();
FillCoeffGeneric(true, 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;
}
void FillCoeffRandom() { FillCoeffGeneric(false); }
tran_low_t GetRandomCoeff() {
return clamp((int16_t)rnd_.Rand16(), INT16_MIN + 1, INT16_MAX);
}
ACMRandom rnd_;
QuanTable *qtab_;
tran_low_t *coeff_;
QuantizeFunc quant_ref_;
QuantizeFunc quant_;
TX_SIZE tx_size_;
aom_bit_depth_t bd_;
};
TEST_P(QuantizeTest, ZeroInput) {
FillCoeffZero();
QuantizeRun(false);
}
TEST_P(QuantizeTest, LargeNegativeInput) {
FillDcLargeNegative();
QuantizeRun(false);
}
TEST_P(QuantizeTest, DcOnlyInput) {
FillDcOnly();
QuantizeRun(false);
}
TEST_P(QuantizeTest, RandomInput) { QuantizeRun(true, 0, kTestNum); }
TEST_P(QuantizeTest, MultipleQ) {
for (int q = 0; q < QINDEX_RANGE; ++q) {
QuantizeRun(true, q, kTestNum);
}
}
using std::tr1::make_tuple;
#if HAVE_SSE2
const QuantizeParam kQParamArraySSE2[] = { make_tuple(
&av1_quantize_fp_c, &av1_quantize_fp_sse2, TX_16X16, AOM_BITS_8) };
INSTANTIATE_TEST_CASE_P(SSE2, QuantizeTest,
::testing::ValuesIn(kQParamArraySSE2));
#endif
#if !CONFIG_HIGHBITDEPTH && HAVE_SSSE3 && ARCH_X86_64
const QuantizeParam kQParamArraySSSE3[] = {
make_tuple(&av1_quantize_fp_c, &av1_quantize_fp_ssse3, TX_16X16, AOM_BITS_8),
// TODO(any):
// The following test couldn't pass yet
// make_tuple(av1_quantize_fp_c, av1_quantize_fp_32x32_ssse3, TX_32X32,
// AOM_BITS_8)
};
INSTANTIATE_TEST_CASE_P(SSSE3, QuantizeTest,
::testing::ValuesIn(kQParamArraySSSE3));
#endif
} // namespace

View file

@ -740,13 +740,6 @@ INSTANTIATE_TEST_CASE_P(C, SADx4Test, ::testing::ValuesIn(x4d_c_tests));
//------------------------------------------------------------------------------
// ARM functions
#if HAVE_MEDIA
const SadMxNParam media_tests[] = {
make_tuple(16, 16, &aom_sad16x16_media, -1),
};
INSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::ValuesIn(media_tests));
#endif // HAVE_MEDIA
#if HAVE_NEON
const SadMxNParam neon_tests[] = {
make_tuple(64, 64, &aom_sad64x64_neon, -1),

15
third_party/aom/test/simd_avx2_test.cc vendored Normal file
View file

@ -0,0 +1,15 @@
/*
* 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 "./simd_impl.h"

15
third_party/aom/test/simd_cmp_avx2.cc vendored Normal file
View file

@ -0,0 +1,15 @@
/*
* 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 "./simd_cmp_impl.h"

View file

@ -16,7 +16,7 @@
#include "aom_dsp/aom_simd.h"
#undef SIMD_INLINE
#define SIMD_INLINE static // Don't enforce inlining
#include "aom_dsp/simd/v128_intrinsics_c.h"
#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
@ -224,6 +224,104 @@ 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_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_align(v256 a, v256 b) {
return v256_align(a, b, 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_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));
@ -250,6 +348,18 @@ uint32_t c_v128_sad_u8(c_v128 a, c_v128 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 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));
}
namespace {
@ -657,6 +767,265 @@ const mapping m[] = { MAP(v64_sad_u8),
MAP(v64_store_unaligned),
MAP(v128_load_unaligned),
MAP(v128_store_unaligned),
MAP(v256_sad_u8),
MAP(v256_ssd_u8),
MAP(v256_hadd_u8),
MAP(v256_dotp_s16),
MAP(v256_add_8),
MAP(v256_add_16),
MAP(v256_sadd_s16),
MAP(v256_add_32),
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_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_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_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_cmpgt_s8),
MAP(v256_cmplt_s8),
MAP(v256_cmpeq_8),
MAP(v256_cmpgt_s16),
MAP(v256_cmplt_s16),
MAP(v256_cmpeq_16),
MAP(v256_shuffle_8),
MAP(v256_pshuffle_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_abs_s8),
MAP(v256_abs_s16),
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_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(v256_zero),
MAP(v256_dup_8),
MAP(v256_dup_16),
MAP(v256_dup_32),
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),
{ NULL, NULL, NULL } };
#undef MAP
@ -922,6 +1291,14 @@ void TestSimd1Arg(uint32_t iterations, uint32_t mask, uint32_t maskwidth,
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
@ -970,6 +1347,62 @@ void TestSimd1Arg(uint32_t iterations, uint32_t mask, uint32_t maskwidth,
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_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(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()
@ -1140,6 +1573,67 @@ void TestSimd2Args(uint32_t iterations, uint32_t mask, uint32_t maskwidth,
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(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>(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(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 << "("
@ -1208,5 +1702,31 @@ 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 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<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<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 *);
} // namespace SIMD_NAMESPACE

View file

@ -14,7 +14,7 @@
#include "test/clear_system_state.h"
#include "test/register_state_check.h"
#include "aom_dsp/aom_simd_inline.h"
#include "aom_dsp/simd/v128_intrinsics_c.h"
#include "aom_dsp/simd/v256_intrinsics_c.h"
namespace SIMD_NAMESPACE {
@ -67,6 +67,19 @@ TYPEDEF_SIMD(V128_V128V128);
TYPEDEF_SIMD(S64_V128V128);
TYPEDEF_SIMD(V128_V128U32);
TYPEDEF_SIMD(U32_V128V128);
TYPEDEF_SIMD(V256_V128);
TYPEDEF_SIMD(V256_V256);
TYPEDEF_SIMD(U64_V256);
TYPEDEF_SIMD(V256_V128V128);
TYPEDEF_SIMD(V256_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(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);
@ -74,6 +87,9 @@ 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_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_V256V256) ARCH_POSTFIX(V256_V256V256_Part2);
// These functions are machine tuned located elsewhere
template <typename c_ret, typename c_arg>
@ -219,6 +235,70 @@ MY_TEST_P(ARCH_POSTFIX(V128_V128_Part3), 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_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(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_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(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, ...) \
@ -591,4 +671,252 @@ INSTANTIATE(ARCH, ARCH_POSTFIX(V128_U32), SIMD_TUPLE(v128_dup_32, 0U, 0U));
INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V128V128),
SIMD_TUPLE(v128_dotp_s16, 0U, 0U));
INSTANTIATE(ARCH, ARCH_POSTFIX(U32_V256V256), SIMD_TUPLE(v256_sad_u8, 0U, 0U),
SIMD_TUPLE(v256_ssd_u8, 0U, 0U));
INSTANTIATE(ARCH, ARCH_POSTFIX(U64_V256), SIMD_TUPLE(v256_hadd_u8, 0U, 0U));
INSTANTIATE(ARCH, ARCH_POSTFIX(S64_V256V256),
SIMD_TUPLE(v256_dotp_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_cmpgt_s16, 0U, 0U), SIMD_TUPLE(v256_cmplt_s16, 0U, 0U),
SIMD_TUPLE(v256_cmpeq_16, 0U, 0U), SIMD_TUPLE(v256_shuffle_8, 15U, 8U),
SIMD_TUPLE(v256_pshuffle_8, 15U, 8U), SIMD_TUPLE(imm_v256_align<1>, 0U, 0U),
SIMD_TUPLE(imm_v256_align<2>, 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));
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_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(U32_V256), SIMD_TUPLE(v256_low_u32, 0U, 0U));
INSTANTIATE(ARCH, ARCH_POSTFIX(V64_V256), SIMD_TUPLE(v256_low_v64, 0U, 0U));
} // namespace SIMD_NAMESPACE

View file

@ -119,23 +119,12 @@ TEST_P(SuperframeTest, TestSuperframeIndexIsOptional) {
// to the decoder starting at the end of the buffer.
#if CONFIG_EXT_TILE
// Single tile does not work with ANS (see comment above).
#if CONFIG_ANS || CONFIG_DAALA_EC
const int tile_col_values[] = { 1, 2 };
#else
const int tile_col_values[] = { 1, 2, 32 };
#endif
const int tile_row_values[] = { 1, 2, 32 };
AV1_INSTANTIATE_TEST_CASE(
SuperframeTest,
::testing::Combine(::testing::Values(::libaom_test::kTwoPassGood),
::testing::ValuesIn(tile_col_values),
::testing::ValuesIn(tile_row_values)));
#else
#if !CONFIG_ANS && !CONFIG_DAALA_EC
AV1_INSTANTIATE_TEST_CASE(
SuperframeTest,
::testing::Combine(::testing::Values(::libaom_test::kTwoPassGood),
::testing::Values(0), ::testing::Values(0)));
#endif // !CONFIG_ANS
#endif // CONFIG_EXT_TILE
} // namespace

View file

@ -1,22 +1,22 @@
LIBAOM_TEST_SRCS-yes += test-data.mk
# Encoder test source
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += hantro_collage_w352h288.yuv
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += hantro_odd.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += hantro_collage_w352h288.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += hantro_odd.yuv
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_10_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_12_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_420_a10-1.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_ENCODERS) += park_joy_90p_8_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_10_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_10_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_10_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_10_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_12_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_12_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_12_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_12_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_8_420_a10-1.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_8_420.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_8_422.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_8_444.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += park_joy_90p_8_440.yuv
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += desktop_credits.y4m
LIBAOM_TEST_DATA-$(CONFIG_AV1_ENCODER) += niklas_1280_720_30.y4m

View file

@ -8,8 +8,15 @@
## 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 AOM_TEST_TEST_CMAKE_)
set(AOM_TEST_TEST_CMAKE_ 1)
include(ProcessorCount)
include("${AOM_ROOT}/test/test_data_util.cmake")
set(AOM_UNIT_TEST_DATA_LIST_FILE "${AOM_ROOT}/test/test-data.sha1")
set(AOM_UNIT_TEST_WRAPPER_SOURCES
"${AOM_CONFIG_DIR}/usage_exit.c"
"${AOM_ROOT}/test/test_libaom.cc")
@ -19,6 +26,8 @@ set(AOM_UNIT_TEST_COMMON_SOURCES
"${AOM_ROOT}/test/clear_system_state.h"
"${AOM_ROOT}/test/codec_factory.h"
"${AOM_ROOT}/test/convolve_test.cc"
"${AOM_ROOT}/test/decode_test_driver.cc"
"${AOM_ROOT}/test/decode_test_driver.h"
"${AOM_ROOT}/test/function_equivalence_test.h"
"${AOM_ROOT}/test/md5_helper.h"
"${AOM_ROOT}/test/register_state_check.h"
@ -50,8 +59,6 @@ endif ()
set(AOM_UNIT_TEST_DECODER_SOURCES
"${AOM_ROOT}/test/decode_api_test.cc"
"${AOM_ROOT}/test/decode_test_driver.cc"
"${AOM_ROOT}/test/decode_test_driver.h"
"${AOM_ROOT}/test/ivf_video_source.h")
set(AOM_UNIT_TEST_ENCODER_SOURCES
@ -83,10 +90,6 @@ if (CONFIG_AV1)
${AOM_UNIT_TEST_COMMON_SOURCES}
"${AOM_ROOT}/test/av1_convolve_optimz_test.cc"
"${AOM_ROOT}/test/av1_convolve_test.cc"
"${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_txfm_test.cc"
"${AOM_ROOT}/test/av1_txfm_test.h"
"${AOM_ROOT}/test/intrapred_test.cc"
@ -103,9 +106,7 @@ if (CONFIG_AV1)
if (HAVE_SSE4_1)
set(AOM_UNIT_TEST_COMMON_SOURCES
${AOM_UNIT_TEST_COMMON_SOURCES}
# TODO: not sure if this intrinsics or a wrapper calling intrin/asm.
#"${AOM_ROOT}/test/filterintra_predictors_test.cc")
)
"${AOM_ROOT}/test/filterintra_predictors_test.cc")
endif ()
endif ()
@ -131,8 +132,13 @@ if (CONFIG_AV1_ENCODER)
"${AOM_ROOT}/test/arf_freq_test.cc"
"${AOM_ROOT}/test/av1_dct_test.cc"
"${AOM_ROOT}/test/av1_fht16x16_test.cc"
"${AOM_ROOT}/test/av1_fht32x32_test.cc"
"${AOM_ROOT}/test/av1_fht8x8_test.cc"
"${AOM_ROOT}/test/av1_inv_txfm_test.cc"
"${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/avg_test.cc"
"${AOM_ROOT}/test/blend_a64_mask_1d_test.cc"
"${AOM_ROOT}/test/blend_a64_mask_test.cc"
@ -167,8 +173,14 @@ if (CONFIG_AV1_ENCODER)
"${AOM_ROOT}/test/av1_fht4x4_test.cc"
"${AOM_ROOT}/test/av1_fht4x8_test.cc"
"${AOM_ROOT}/test/av1_fht8x16_test.cc"
"${AOM_ROOT}/test/av1_fht8x4_test.cc"
"${AOM_ROOT}/test/fht32x32_test.cc")
"${AOM_ROOT}/test/av1_fht8x4_test.cc")
endif ()
if (CONFIG_GLOBAL_MOTION)
set(AOM_UNIT_TEST_ENCODER_INTRIN_SSE4_1
${AOM_UNIT_TEST_ENCODER_INTRIN_SSE4_1}
"${AOM_ROOT}/test/corner_match_test.cc")
endif ()
if (CONFIG_MOTION_VAR)
@ -177,6 +189,12 @@ if (CONFIG_AV1_ENCODER)
"${AOM_ROOT}/test/obmc_sad_test.cc"
"${AOM_ROOT}/test/obmc_variance_test.cc")
endif ()
if (CONFIG_TX64X64)
set(AOM_UNIT_TEST_ENCODER_SOURCES
${AOM_UNIT_TEST_ENCODER_SOURCES}
"${AOM_ROOT}/test/av1_fht64x64_test.cc")
endif ()
endif ()
if (CONFIG_AV1_DECODER AND CONFIG_AV1_ENCODER)
@ -209,7 +227,7 @@ if (CONFIG_AV1_DECODER AND CONFIG_AV1_ENCODER)
endif ()
if (CONFIG_HIGHBITDEPTH)
if (CONFIG_AV1)
if (CONFIG_AV1_ENCODER)
set(AOM_UNIT_TEST_COMMON_INTRIN_SSE4_1
${AOM_UNIT_TEST_COMMON_INTRIN_SSE4_1}
"${AOM_ROOT}/test/av1_highbd_iht_test.cc"
@ -245,8 +263,14 @@ endif ()
# exist before this function is called.
function (setup_aom_test_targets)
add_library(test_aom_common OBJECT ${AOM_UNIT_TEST_COMMON_SOURCES})
add_library(test_aom_decoder OBJECT ${AOM_UNIT_TEST_DECODER_SOURCES})
add_library(test_aom_encoder OBJECT ${AOM_UNIT_TEST_ENCODER_SOURCES})
if (CONFIG_AV1_DECODER)
add_library(test_aom_decoder OBJECT ${AOM_UNIT_TEST_DECODER_SOURCES})
endif ()
if (CONFIG_AV1_ENCODER)
add_library(test_aom_encoder OBJECT ${AOM_UNIT_TEST_ENCODER_SOURCES})
endif ()
set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} test_aom_common test_aom_decoder
test_aom_encoder PARENT_SCOPE)
@ -255,7 +279,7 @@ function (setup_aom_test_targets)
$<TARGET_OBJECTS:aom_common_app_util>
$<TARGET_OBJECTS:test_aom_common>)
if (CONFIG_DECODERS)
if (CONFIG_AV1_DECODER)
target_sources(test_libaom PUBLIC
$<TARGET_OBJECTS:aom_decoder_app_util>
$<TARGET_OBJECTS:test_aom_decoder>)
@ -265,7 +289,7 @@ function (setup_aom_test_targets)
endif ()
endif ()
if (CONFIG_ENCODERS)
if (CONFIG_AV1_ENCODER)
target_sources(test_libaom PUBLIC
$<TARGET_OBJECTS:test_aom_encoder>
$<TARGET_OBJECTS:aom_encoder_app_util>)
@ -273,14 +297,14 @@ function (setup_aom_test_targets)
if (CONFIG_ENCODE_PERF_TESTS)
target_sources(test_libaom PUBLIC ${AOM_ENCODE_PERF_TEST_SOURCES})
endif ()
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)
endif ()
target_link_libraries(test_libaom PUBLIC aom gtest)
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 PUBLIC aom gtest)
target_link_libraries(test_libaom ${AOM_LIB_LINK_TYPE} aom gtest)
if (CONFIG_LIBYUV)
target_sources(test_libaom PUBLIC $<TARGET_OBJECTS:yuv>)
@ -300,16 +324,73 @@ function (setup_aom_test_targets)
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_NEON)
add_intrinsics_source_to_target("${AOM_NEON_INTRIN_FLAG}" "test_libaom"
"AOM_UNIT_TEST_COMMON_INTRIN_NEON")
endif ()
add_custom_target(testdata
COMMAND ${CMAKE_COMMAND}
-DAOM_CONFIG_DIR="${AOM_CONFIG_DIR}"
-DAOM_ROOT="${AOM_ROOT}"
-P "${AOM_ROOT}/test/test_worker.cmake"
SOURCES ${AOM_TEST_DATA_LIST})
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")
set(testdata_targets ${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})
# 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 ()
# TODO(tomfinegan): This needs some work for MSVC and Xcode. Executable suffix
# and config based executable output paths are the obvious issues.
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)
set(test_targets ${test_targets} ${test_name})
endforeach ()
add_custom_target(runtests)
add_dependencies(runtests ${test_targets})
if (MSVC)
set_target_properties(${testdata_targets} PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD TRUE)
set_target_properties(${test_targets} PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD TRUE)
set_target_properties(testdata runtests PROPERTIES
EXCLUDE_FROM_DEFAULT_BUILD TRUE)
endif ()
endfunction ()
endif () # AOM_TEST_TEST_CMAKE_

View file

@ -20,7 +20,6 @@ LIBAOM_TEST_SRCS-yes += util.h
LIBAOM_TEST_SRCS-yes += video_source.h
LIBAOM_TEST_SRCS-yes += transform_test_base.h
LIBAOM_TEST_SRCS-yes += function_equivalence_test.h
LIBAOM_TEST_SRCS-yes += warp_filter_test_util.h
##
## BLACK BOX TESTS
@ -28,18 +27,18 @@ LIBAOM_TEST_SRCS-yes += warp_filter_test_util.h
## Black box tests only use the public API.
##
LIBAOM_TEST_SRCS-yes += ../md5_utils.h ../md5_utils.c
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += ivf_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += ../y4minput.h ../y4minput.c
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += altref_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += aq_segment_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += datarate_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += encode_api_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += error_resilience_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += i420_video_source.h
#LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += realtime_test.cc
#LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += resize_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += y4m_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += yuv_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += ivf_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += ../y4minput.h ../y4minput.c
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += altref_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += aq_segment_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += datarate_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += encode_api_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += error_resilience_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += i420_video_source.h
#LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += realtime_test.cc
#LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += resize_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += y4m_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += yuv_video_source.h
#LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += level_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += active_map_refresh_test.cc
@ -51,14 +50,14 @@ LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += lossless_test.cc
LIBAOM_TEST_SRCS-yes += decode_test_driver.cc
LIBAOM_TEST_SRCS-yes += decode_test_driver.h
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += encode_test_driver.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += encode_test_driver.cc
LIBAOM_TEST_SRCS-yes += encode_test_driver.h
## IVF writing.
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += ../ivfenc.c ../ivfenc.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += ../ivfenc.c ../ivfenc.h
## Y4m parsing.
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += y4m_test.cc ../y4menc.c ../y4menc.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += y4m_test.cc ../y4menc.c ../y4menc.h
## WebM Parsing
ifeq ($(CONFIG_WEBM_IO), yes)
@ -66,14 +65,14 @@ LIBWEBM_PARSER_SRCS += ../third_party/libwebm/mkvparser/mkvparser.cc
LIBWEBM_PARSER_SRCS += ../third_party/libwebm/mkvparser/mkvreader.cc
LIBWEBM_PARSER_SRCS += ../third_party/libwebm/mkvparser/mkvparser.h
LIBWEBM_PARSER_SRCS += ../third_party/libwebm/mkvparser/mkvreader.h
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += $(LIBWEBM_PARSER_SRCS)
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += ../tools_common.h
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += ../webmdec.cc
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += ../webmdec.h
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += webm_video_source.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += $(LIBWEBM_PARSER_SRCS)
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += ../tools_common.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += ../webmdec.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += ../webmdec.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += webm_video_source.h
endif
LIBAOM_TEST_SRCS-$(CONFIG_DECODERS) += decode_api_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_DECODER) += decode_api_test.cc
# Currently we only support decoder perf tests for av1. Also they read from WebM
# files, so WebM IO is required.
@ -82,7 +81,6 @@ ifeq ($(CONFIG_DECODE_PERF_TESTS)$(CONFIG_AV1_DECODER)$(CONFIG_WEBM_IO), \
LIBAOM_TEST_SRCS-yes += decode_perf_test.cc
endif
# encode perf tests are av1 only
ifeq ($(CONFIG_ENCODE_PERF_TESTS)$(CONFIG_AV1_ENCODER), yesyes)
LIBAOM_TEST_SRCS-yes += encode_perf_test.cc
endif
@ -142,11 +140,13 @@ LIBAOM_TEST_SRCS-yes += simd_cmp_impl.h
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += simd_cmp_sse2.cc
LIBAOM_TEST_SRCS-$(HAVE_SSSE3) += simd_cmp_ssse3.cc
LIBAOM_TEST_SRCS-$(HAVE_SSE4_1) += simd_cmp_sse4.cc
LIBAOM_TEST_SRCS-$(HAVE_AVX2) += simd_cmp_avx2.cc
LIBAOM_TEST_SRCS-$(HAVE_NEON) += simd_cmp_neon.cc
LIBAOM_TEST_SRCS-yes += simd_impl.h
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += simd_sse2_test.cc
LIBAOM_TEST_SRCS-$(HAVE_SSSE3) += simd_ssse3_test.cc
LIBAOM_TEST_SRCS-$(HAVE_SSE4_1) += simd_sse4_test.cc
LIBAOM_TEST_SRCS-$(HAVE_AVX2) += simd_avx2_test.cc
LIBAOM_TEST_SRCS-$(HAVE_NEON) += simd_neon_test.cc
LIBAOM_TEST_SRCS-yes += intrapred_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_INTRABC) += intrabc_test.cc
@ -162,13 +162,21 @@ LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += error_block_test.cc
#LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_quantize_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += subtract_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += arf_freq_test.cc
ifneq ($(CONFIG_AOM_QM), yes)
ifneq ($(CONFIG_NEW_QUANT), yes)
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += quantize_func_test.cc
endif
endif
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_inv_txfm_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_dct_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht4x4_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht8x8_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht16x16_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht32x32_test.cc
ifeq ($(CONFIG_TX64X64),yes)
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht64x64_test.cc
endif
ifeq ($(CONFIG_EXT_TX),yes)
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht4x8_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht8x4_test.cc
@ -176,7 +184,6 @@ LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht8x16_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht16x8_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht16x32_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fht32x16_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += fht32x32_test.cc
endif
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += sum_squares_test.cc
@ -185,8 +192,8 @@ LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += blend_a64_mask_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += blend_a64_mask_1d_test.cc
ifeq ($(CONFIG_EXT_INTER),yes)
LIBAOM_TEST_SRCS-$(HAVE_SSSE3) += masked_variance_test.cc
LIBAOM_TEST_SRCS-$(HAVE_SSSE3) += masked_sad_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += masked_variance_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += masked_sad_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_wedge_utils_test.cc
endif
@ -217,7 +224,7 @@ endif
ifeq ($(CONFIG_INTERNAL_STATS),yes)
LIBAOM_TEST_SRCS-$(CONFIG_HIGHBITDEPTH) += hbd_metrics_test.cc
endif
LIBAOM_TEST_SRCS-$(CONFIG_ENCODERS) += sad_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += sad_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1) += av1_txfm_test.h
LIBAOM_TEST_SRCS-$(CONFIG_AV1) += av1_txfm_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fwd_txfm1d_test.cc
@ -226,13 +233,21 @@ LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_fwd_txfm2d_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1_ENCODER) += av1_inv_txfm2d_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1) += av1_convolve_test.cc
LIBAOM_TEST_SRCS-$(CONFIG_AV1) += av1_convolve_optimz_test.cc
ifneq ($(findstring yes,$(CONFIG_GLOBAL_MOTION) $(CONFIG_WARPED_MOTION)),)
ifneq ($(findstring yes,$(CONFIG_GLOBAL_MOTION)$(CONFIG_WARPED_MOTION)),)
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += warp_filter_test_util.h
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += warp_filter_test.cc warp_filter_test_util.cc
endif
ifeq ($(CONFIG_LOOP_RESTORATION),yes)
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += hiprec_convolve_test_util.h
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += hiprec_convolve_test.cc
LIBAOM_TEST_SRCS-$(HAVE_SSE2) += hiprec_convolve_test_util.cc
LIBAOM_TEST_SRCS-$(HAVE_SSE4_1) += selfguided_filter_test.cc
endif
ifeq ($(CONFIG_GLOBAL_MOTION)$(CONFIG_AV1_ENCODER),yesyes)
LIBAOM_TEST_SRCS-$(HAVE_SSE4_1) += corner_match_test.cc
endif
TEST_INTRA_PRED_SPEED_SRCS-yes := test_intra_pred_speed.cc
TEST_INTRA_PRED_SPEED_SRCS-yes += ../md5_utils.h ../md5_utils.c

View file

@ -0,0 +1,40 @@
##
## 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")
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 ()
set(AOM_TEST_DATA_URL
"https://storage.googleapis.com/downloads.webmproject.org/test_data/libvpx")
set(AOM_TEST_DATA_PATH "$ENV{LIBAOM_TEST_DATA_PATH}")
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 ()

View file

@ -11,15 +11,14 @@
# 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 out_files out_checksums)
if (NOT AOM_TEST_DATA_LIST OR NOT EXISTS "${AOM_TEST_DATA_LIST}")
message(FATAL_ERROR "AOM_TEST_DATA_LIST (${AOM_TEST_DATA_LIST}) missing or "
"variable empty.")
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.sha1 into $files_and_checksums. $files_and_checksums becomes
# a list with an entry for each line from $AOM_TEST_DATA_LIST.
file(STRINGS "${AOM_TEST_DATA_LIST}" files_and_checksums)
# 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})
@ -33,8 +32,10 @@ function (make_test_data_lists out_files out_checksums)
set(filenames ${filenames} ${filename})
endforeach ()
if (NOT checksums OR NOT filenames)
message(FATAL_ERROR "Parsing of ${AOM_TEST_DATA_LIST} failed.")
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)
@ -62,7 +63,9 @@ function (check_file local_path expected_checksum out_needs_update)
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

View file

@ -31,17 +31,16 @@ namespace {
typedef void (*AvxPredFunc)(uint8_t *dst, ptrdiff_t y_stride,
const uint8_t *above, const uint8_t *left);
#if CONFIG_ALT_INTRA
const int kNumAv1IntraFuncs = 14;
#else
const int kNumAv1IntraFuncs = 13;
#endif // CONFIG_ALT_INTRA
const int kNumAv1IntraFuncs = INTRA_MODES + 3; // 4 DC predictor variants.
const char *kAv1IntraPredNames[kNumAv1IntraFuncs] = {
"DC_PRED", "DC_LEFT_PRED", "DC_TOP_PRED", "DC_128_PRED", "V_PRED",
"H_PRED", "D45_PRED", "D135_PRED", "D117_PRED", "D153_PRED",
"D207_PRED", "D63_PRED", "TM_PRED",
"DC_PRED", "DC_LEFT_PRED", "DC_TOP_PRED", "DC_128_PRED", "V_PRED",
"H_PRED", "D45_PRED", "D135_PRED", "D117_PRED", "D153_PRED",
"D207_PRED", "D63_PRED", "TM_PRED",
#if CONFIG_ALT_INTRA
"SMOOTH_PRED"
"SMOOTH_PRED",
#if CONFIG_SMOOTH_HV
"SMOOTH_V_PRED", "SMOOTH_H_PRED",
#endif // CONFIG_SMOOTH_HV
#endif // CONFIG_ALT_INTRA
};
@ -104,7 +103,11 @@ void TestIntraPred4(AvxPredFunc const *pred_funcs) {
"b852f42e6c4991d415400332d567872f",
#if CONFIG_ALT_INTRA
"828c49a4248993cce4876fa26eab697f",
"718c8cee9011f92ef31f77a9a7560010"
"718c8cee9011f92ef31f77a9a7560010",
#if CONFIG_SMOOTH_HV
"b37eeadbbd9e3bdff023a5097b59213a",
"d6fb9c659d82c78f0d0c891da6cba87f",
#endif // CONFIG_SMOOTH_HV
#else
"309a618577b27c648f9c5ee45252bc8f",
#endif // CONFIG_ALT_INTRA
@ -129,7 +132,11 @@ void TestIntraPred8(AvxPredFunc const *pred_funcs) {
"7a09adb0fa6c2bf889a99dd816622feb",
#if CONFIG_ALT_INTRA
"f6ade499c626d38eb70661184b79bc57",
"1ad5b106c79b792e514ba25e87139b5e"
"1ad5b106c79b792e514ba25e87139b5e",
#if CONFIG_SMOOTH_HV
"fe0d359b91a1d8141483d2e032f1b75f",
"0cfd7603ced02829d1ce18b6795d73d0",
#endif // CONFIG_SMOOTH_HV
#else
"815b75c8e0d91cc1ae766dc5d3e445a3",
#endif // CONFIG_ALT_INTRA
@ -154,7 +161,11 @@ void TestIntraPred16(AvxPredFunc const *pred_funcs) {
"f7063ccbc29f87303d5c3d0555b08944",
#if CONFIG_ALT_INTRA
"7adcaaa3554eb71a81fc48cb9043984b",
"c0acea4397c1b4d54a21bbcec5731dff"
"c0acea4397c1b4d54a21bbcec5731dff",
#if CONFIG_SMOOTH_HV
"f15b8712f0f064e98a7d804d3074afa7",
"01a09cdb8edd06d840c84643032fc02f",
#endif // CONFIG_SMOOTH_HV
#else
"b8a41aa968ec108af447af4217cba91b",
#endif // CONFIG_ALT_INTRA
@ -179,7 +190,11 @@ void TestIntraPred32(AvxPredFunc const *pred_funcs) {
"d520125ebd512c63c301bf67fea8e059",
#if CONFIG_ALT_INTRA
"297e8fbb5d33c29b12b228fa9d7c40a4",
"31b9296d70dd82238c87173e6d5e65fd"
"31b9296d70dd82238c87173e6d5e65fd",
#if CONFIG_SMOOTH_HV
"f1041f77a34e86aaf30ea779ba84a2e8",
"83e2b744a6a3d82321744442b1db945c",
#endif // CONFIG_SMOOTH_HV
#else
"9e1370c6d42e08d357d9612c93a71cfc",
#endif // CONFIG_ALT_INTRA
@ -193,11 +208,12 @@ void TestIntraPred32(AvxPredFunc const *pred_funcs) {
// Defines a test case for |arch| (e.g., C, SSE2, ...) passing the predictors
// to |test_func|. The test name is 'arch.test_func', e.g., C.TestIntraPred4.
#define INTRA_PRED_TEST(arch, test_func, dc, dc_left, dc_top, dc_128, v, h, \
d45e, d135, d117, d153, d207e, d63e, tm, smooth) \
d45e, d135, d117, d153, d207e, d63e, tm, smooth, \
smooth_v, smooth_h) \
TEST(arch, test_func) { \
static const AvxPredFunc aom_intra_pred[] = { \
dc, dc_left, dc_top, dc_128, v, h, d45e, \
d135, d117, d153, d207e, d63e, tm, smooth \
dc, dc_left, dc_top, dc_128, v, h, d45e, d135, \
d117, d153, d207e, d63e, tm, smooth, smooth_v, smooth_h \
}; \
test_func(aom_intra_pred); \
}
@ -208,9 +224,18 @@ void TestIntraPred32(AvxPredFunc const *pred_funcs) {
#if CONFIG_ALT_INTRA
#define tm_pred_func aom_paeth_predictor_4x4_c
#define smooth_pred_func aom_smooth_predictor_4x4_c
#if CONFIG_SMOOTH_HV
#define smooth_v_pred_func aom_smooth_v_predictor_4x4_c
#define smooth_h_pred_func aom_smooth_h_predictor_4x4_c
#else
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_SMOOTH_HV
#else
#define tm_pred_func aom_tm_predictor_4x4_c
#define smooth_pred_func NULL
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(C, TestIntraPred4, aom_dc_predictor_4x4_c,
@ -219,10 +244,13 @@ INTRA_PRED_TEST(C, TestIntraPred4, aom_dc_predictor_4x4_c,
aom_h_predictor_4x4_c, aom_d45e_predictor_4x4_c,
aom_d135_predictor_4x4_c, aom_d117_predictor_4x4_c,
aom_d153_predictor_4x4_c, aom_d207e_predictor_4x4_c,
aom_d63e_predictor_4x4_c, tm_pred_func, smooth_pred_func)
aom_d63e_predictor_4x4_c, tm_pred_func, smooth_pred_func,
smooth_v_pred_func, smooth_h_pred_func)
#undef tm_pred_func
#undef smooth_pred_func
#undef smooth_v_pred_func
#undef smooth_h_pred_func
#if HAVE_SSE2
#if CONFIG_ALT_INTRA
@ -235,7 +263,7 @@ INTRA_PRED_TEST(SSE2, TestIntraPred4, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_SSE2
@ -243,7 +271,7 @@ INTRA_PRED_TEST(SSE2, TestIntraPred4, aom_dc_predictor_4x4_sse2,
#if HAVE_SSSE3
INTRA_PRED_TEST(SSSE3, TestIntraPred4, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, aom_d153_predictor_4x4_ssse3, NULL,
aom_d63e_predictor_4x4_ssse3, NULL, NULL)
aom_d63e_predictor_4x4_ssse3, NULL, NULL, NULL, NULL)
#endif // HAVE_SSSE3
#if HAVE_DSPR2
@ -254,7 +282,7 @@ INTRA_PRED_TEST(SSSE3, TestIntraPred4, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(DSPR2, TestIntraPred4, aom_dc_predictor_4x4_dspr2, NULL, NULL,
NULL, NULL, aom_h_predictor_4x4_dspr2, NULL, NULL, NULL, NULL,
NULL, NULL, tm_pred_func, NULL)
NULL, NULL, tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_DSPR2
@ -268,7 +296,7 @@ INTRA_PRED_TEST(NEON, TestIntraPred4, 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, aom_d135_predictor_4x4_neon,
NULL, NULL, NULL, NULL, tm_pred_func, NULL)
NULL, NULL, NULL, NULL, tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_NEON
@ -282,7 +310,7 @@ INTRA_PRED_TEST(MSA, TestIntraPred4, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_MSA
@ -292,9 +320,18 @@ INTRA_PRED_TEST(MSA, TestIntraPred4, aom_dc_predictor_4x4_msa,
#if CONFIG_ALT_INTRA
#define tm_pred_func aom_paeth_predictor_8x8_c
#define smooth_pred_func aom_smooth_predictor_8x8_c
#if CONFIG_SMOOTH_HV
#define smooth_v_pred_func aom_smooth_v_predictor_8x8_c
#define smooth_h_pred_func aom_smooth_h_predictor_8x8_c
#else
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_SMOOTH_HV
#else
#define tm_pred_func aom_tm_predictor_8x8_c
#define smooth_pred_func NULL
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(C, TestIntraPred8, aom_dc_predictor_8x8_c,
aom_dc_left_predictor_8x8_c, aom_dc_top_predictor_8x8_c,
@ -302,9 +339,12 @@ INTRA_PRED_TEST(C, TestIntraPred8, aom_dc_predictor_8x8_c,
aom_h_predictor_8x8_c, aom_d45e_predictor_8x8_c,
aom_d135_predictor_8x8_c, aom_d117_predictor_8x8_c,
aom_d153_predictor_8x8_c, aom_d207e_predictor_8x8_c,
aom_d63e_predictor_8x8_c, tm_pred_func, smooth_pred_func)
aom_d63e_predictor_8x8_c, tm_pred_func, smooth_pred_func,
smooth_v_pred_func, smooth_h_pred_func)
#undef tm_pred_func
#undef smooth_pred_func
#undef smooth_v_pred_func
#undef smooth_h_pred_func
#if HAVE_SSE2
#if CONFIG_ALT_INTRA
@ -316,14 +356,14 @@ INTRA_PRED_TEST(SSE2, TestIntraPred8, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_SSE2
#if HAVE_SSSE3
INTRA_PRED_TEST(SSSE3, TestIntraPred8, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, aom_d153_predictor_8x8_ssse3, NULL, NULL, NULL,
NULL)
NULL, NULL, NULL)
#endif // HAVE_SSSE3
#if HAVE_DSPR2
@ -334,7 +374,7 @@ INTRA_PRED_TEST(SSSE3, TestIntraPred8, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(DSPR2, TestIntraPred8, aom_dc_predictor_8x8_dspr2, NULL, NULL,
NULL, NULL, aom_h_predictor_8x8_dspr2, NULL, NULL, NULL, NULL,
NULL, NULL, tm_pred_func, NULL)
NULL, NULL, tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_DSPR2
@ -348,7 +388,7 @@ INTRA_PRED_TEST(NEON, TestIntraPred8, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_NEON
@ -362,7 +402,7 @@ INTRA_PRED_TEST(MSA, TestIntraPred8, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_MSA
@ -372,9 +412,18 @@ INTRA_PRED_TEST(MSA, TestIntraPred8, aom_dc_predictor_8x8_msa,
#if CONFIG_ALT_INTRA
#define tm_pred_func aom_paeth_predictor_16x16_c
#define smooth_pred_func aom_smooth_predictor_16x16_c
#if CONFIG_SMOOTH_HV
#define smooth_v_pred_func aom_smooth_v_predictor_16x16_c
#define smooth_h_pred_func aom_smooth_h_predictor_16x16_c
#else
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_SMOOTH_HV
#else
#define tm_pred_func aom_tm_predictor_16x16_c
#define smooth_pred_func NULL
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(C, TestIntraPred16, aom_dc_predictor_16x16_c,
aom_dc_left_predictor_16x16_c, aom_dc_top_predictor_16x16_c,
@ -382,9 +431,12 @@ INTRA_PRED_TEST(C, TestIntraPred16, aom_dc_predictor_16x16_c,
aom_h_predictor_16x16_c, aom_d45e_predictor_16x16_c,
aom_d135_predictor_16x16_c, aom_d117_predictor_16x16_c,
aom_d153_predictor_16x16_c, aom_d207e_predictor_16x16_c,
aom_d63e_predictor_16x16_c, tm_pred_func, smooth_pred_func)
aom_d63e_predictor_16x16_c, tm_pred_func, smooth_pred_func,
smooth_v_pred_func, smooth_h_pred_func)
#undef tm_pred_func
#undef smooth_pred_func
#undef smooth_v_pred_func
#undef smooth_h_pred_func
#if HAVE_SSE2
#if CONFIG_ALT_INTRA
@ -397,20 +449,20 @@ INTRA_PRED_TEST(SSE2, TestIntraPred16, aom_dc_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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_SSE2
#if HAVE_SSSE3
INTRA_PRED_TEST(SSSE3, TestIntraPred16, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, aom_d153_predictor_16x16_ssse3, NULL, NULL,
NULL, NULL)
NULL, NULL, NULL, NULL)
#endif // HAVE_SSSE3
#if HAVE_DSPR2
INTRA_PRED_TEST(DSPR2, TestIntraPred16, aom_dc_predictor_16x16_dspr2, NULL,
NULL, NULL, NULL, aom_h_predictor_16x16_dspr2, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL)
NULL, NULL, NULL, NULL, NULL, NULL, NULL)
#endif // HAVE_DSPR2
#if HAVE_NEON
@ -424,7 +476,7 @@ INTRA_PRED_TEST(NEON, TestIntraPred16, aom_dc_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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_NEON
@ -438,7 +490,7 @@ INTRA_PRED_TEST(MSA, TestIntraPred16, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_MSA
@ -448,9 +500,18 @@ INTRA_PRED_TEST(MSA, TestIntraPred16, aom_dc_predictor_16x16_msa,
#if CONFIG_ALT_INTRA
#define tm_pred_func aom_paeth_predictor_32x32_c
#define smooth_pred_func aom_smooth_predictor_32x32_c
#if CONFIG_SMOOTH_HV
#define smooth_v_pred_func aom_smooth_v_predictor_32x32_c
#define smooth_h_pred_func aom_smooth_h_predictor_32x32_c
#else
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_SMOOTH_HV
#else
#define tm_pred_func aom_tm_predictor_32x32_c
#define smooth_pred_func NULL
#define smooth_v_pred_func NULL
#define smooth_h_pred_func NULL
#endif // CONFIG_ALT_INTRA
INTRA_PRED_TEST(C, TestIntraPred32, aom_dc_predictor_32x32_c,
aom_dc_left_predictor_32x32_c, aom_dc_top_predictor_32x32_c,
@ -458,9 +519,12 @@ INTRA_PRED_TEST(C, TestIntraPred32, aom_dc_predictor_32x32_c,
aom_h_predictor_32x32_c, aom_d45e_predictor_32x32_c,
aom_d135_predictor_32x32_c, aom_d117_predictor_32x32_c,
aom_d153_predictor_32x32_c, aom_d207e_predictor_32x32_c,
aom_d63e_predictor_32x32_c, tm_pred_func, smooth_pred_func)
aom_d63e_predictor_32x32_c, tm_pred_func, smooth_pred_func,
smooth_v_pred_func, smooth_h_pred_func)
#undef tm_pred_func
#undef smooth_pred_func
#undef smooth_v_pred_func
#undef smooth_h_pred_func
#if HAVE_SSE2
#if CONFIG_ALT_INTRA
@ -473,14 +537,14 @@ INTRA_PRED_TEST(SSE2, TestIntraPred32, aom_dc_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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_SSE2
#if HAVE_SSSE3
INTRA_PRED_TEST(SSSE3, TestIntraPred32, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, aom_d153_predictor_32x32_ssse3, NULL, NULL,
NULL, NULL)
NULL, NULL, NULL, NULL)
#endif // HAVE_SSSE3
#if HAVE_NEON
@ -494,7 +558,7 @@ INTRA_PRED_TEST(NEON, TestIntraPred32, aom_dc_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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_NEON
@ -508,7 +572,7 @@ INTRA_PRED_TEST(MSA, TestIntraPred32, 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, NULL, NULL,
tm_pred_func, NULL)
tm_pred_func, NULL, NULL, NULL)
#undef tm_pred_func
#endif // HAVE_MSA

20
third_party/aom/test/test_runner.cmake vendored Normal file
View file

@ -0,0 +1,20 @@
##
## 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})

View file

@ -1,49 +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 AOM_ROOT OR NOT AOM_CONFIG_DIR)
message(FATAL_ERROR "AOM_ROOT AND AOM_CONFIG_DIR must be defined.")
endif ()
set(AOM_TEST_DATA_LIST "${AOM_ROOT}/test/test-data.sha1")
set(AOM_TEST_DATA_URL "http://downloads.webmproject.org/test_data/libvpx")
set(AOM_TEST_DATA_PATH "$ENV{LIBAOM_TEST_DATA_PATH}")
include("${AOM_ROOT}/test/test_data_util.cmake")
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 ()
make_test_data_lists("AOM_TEST_DATA_FILES" "AOM_TEST_DATA_CHECKSUMS")
expand_test_file_paths("AOM_TEST_DATA_FILES" "${AOM_TEST_DATA_PATH}"
"AOM_TEST_DATA_FILE_PATHS")
expand_test_file_paths("AOM_TEST_DATA_FILES" "${AOM_TEST_DATA_URL}"
"AOM_TEST_DATA_URLS")
list(LENGTH AOM_TEST_DATA_FILES num_files)
math(EXPR num_files "${num_files} - 1")
foreach (file_num RANGE ${num_files})
list(GET AOM_TEST_DATA_FILES ${file_num} filename)
list(GET AOM_TEST_DATA_CHECKSUMS ${file_num} checksum)
list(GET AOM_TEST_DATA_FILE_PATHS ${file_num} filepath)
list(GET AOM_TEST_DATA_URLS ${file_num} url)
check_file("${filepath}" "${checksum}" "needs_download")
if (needs_download)
download_test_file("${url}" "${checksum}" "${filepath}")
endif ()
endforeach ()

View file

@ -565,8 +565,8 @@ class SubpelVarianceTest
aom_memalign(16, block_size_ * sizeof(uint16_t))));
sec_ = CONVERT_TO_BYTEPTR(reinterpret_cast<uint16_t *>(
aom_memalign(16, block_size_ * sizeof(uint16_t))));
ref_ =
CONVERT_TO_BYTEPTR(new uint16_t[block_size_ + width_ + height_ + 1]);
ref_ = CONVERT_TO_BYTEPTR(aom_memalign(
16, (block_size_ + width_ + height_ + 1) * sizeof(uint16_t)));
#endif // CONFIG_HIGHBITDEPTH
}
ASSERT_TRUE(src_ != NULL);
@ -582,7 +582,7 @@ class SubpelVarianceTest
#if CONFIG_HIGHBITDEPTH
} else {
aom_free(CONVERT_TO_SHORTPTR(src_));
delete[] CONVERT_TO_SHORTPTR(ref_);
aom_free(CONVERT_TO_SHORTPTR(ref_));
aom_free(CONVERT_TO_SHORTPTR(sec_));
#endif // CONFIG_HIGHBITDEPTH
}
@ -1277,22 +1277,6 @@ INSTANTIATE_TEST_CASE_P(
make_tuple(5, 5, &aom_sub_pixel_avg_variance32x32_avx2, 0)));
#endif // HAVE_AVX2
#if HAVE_MEDIA
INSTANTIATE_TEST_CASE_P(MEDIA, AvxMseTest,
::testing::Values(MseParams(4, 4,
&aom_mse16x16_media)));
INSTANTIATE_TEST_CASE_P(
MEDIA, AvxVarianceTest,
::testing::Values(VarianceParams(4, 4, &aom_variance16x16_media),
VarianceParams(3, 3, &aom_variance8x8_media)));
INSTANTIATE_TEST_CASE_P(
MEDIA, AvxSubpelVarianceTest,
::testing::Values(make_tuple(4, 4, &aom_sub_pixel_variance16x16_media, 0),
make_tuple(3, 3, &aom_sub_pixel_variance8x8_media, 0)));
#endif // HAVE_MEDIA
#if HAVE_NEON
INSTANTIATE_TEST_CASE_P(NEON, AvxSseTest,
::testing::Values(SseParams(2, 2,

View file

@ -22,12 +22,17 @@ using libaom_test::AV1HighbdWarpFilter::AV1HighbdWarpFilterTest;
namespace {
TEST_P(AV1WarpFilterTest, CheckOutput) { RunCheckOutput(av1_warp_affine_sse2); }
TEST_P(AV1WarpFilterTest, CheckOutput) { RunCheckOutput(GET_PARAM(3)); }
INSTANTIATE_TEST_CASE_P(SSE2, AV1WarpFilterTest,
libaom_test::AV1WarpFilter::GetDefaultParams());
INSTANTIATE_TEST_CASE_P(
SSE2, AV1WarpFilterTest,
libaom_test::AV1WarpFilter::BuildParams(av1_warp_affine_sse2));
#if CONFIG_HIGHBITDEPTH
INSTANTIATE_TEST_CASE_P(
SSSE3, AV1WarpFilterTest,
libaom_test::AV1WarpFilter::BuildParams(av1_warp_affine_ssse3));
#if CONFIG_HIGHBITDEPTH && HAVE_SSSE3
TEST_P(AV1HighbdWarpFilterTest, CheckOutput) {
RunCheckOutput(av1_highbd_warp_affine_ssse3);
}

View file

@ -13,23 +13,19 @@
using std::tr1::tuple;
using std::tr1::make_tuple;
using std::vector;
using libaom_test::ACMRandom;
using libaom_test::AV1WarpFilter::AV1WarpFilterTest;
using libaom_test::AV1WarpFilter::WarpTestParam;
#if CONFIG_HIGHBITDEPTH
using libaom_test::AV1HighbdWarpFilter::AV1HighbdWarpFilterTest;
using libaom_test::AV1HighbdWarpFilter::HighbdWarpTestParam;
#endif
::testing::internal::ParamGenerator<WarpTestParam>
libaom_test::AV1WarpFilter::GetDefaultParams() {
const WarpTestParam defaultParams[] = {
make_tuple(4, 4, 50000), make_tuple(8, 8, 50000),
make_tuple(64, 64, 1000), make_tuple(4, 16, 20000),
make_tuple(32, 8, 10000),
namespace libaom_test {
namespace AV1WarpFilter {
::testing::internal::ParamGenerator<WarpTestParam> BuildParams(
warp_affine_func filter) {
const 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::ValuesIn(defaultParams);
return ::testing::ValuesIn(params);
}
AV1WarpFilterTest::~AV1WarpFilterTest() {}
@ -84,6 +80,15 @@ void AV1WarpFilterTest::generate_model(int32_t *mat, int16_t *alpha,
(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;
}
@ -136,10 +141,12 @@ void AV1WarpFilterTest::RunCheckOutput(warp_affine_func test_impl) {
delete[] output;
delete[] output2;
}
} // namespace AV1WarpFilter
#if CONFIG_HIGHBITDEPTH
::testing::internal::ParamGenerator<HighbdWarpTestParam>
libaom_test::AV1HighbdWarpFilter::GetDefaultParams() {
namespace AV1HighbdWarpFilter {
::testing::internal::ParamGenerator<HighbdWarpTestParam> GetDefaultParams() {
const HighbdWarpTestParam defaultParams[] = {
make_tuple(4, 4, 50000, 8), make_tuple(8, 8, 50000, 8),
make_tuple(64, 64, 1000, 8), make_tuple(4, 16, 20000, 8),
@ -207,6 +214,15 @@ void AV1HighbdWarpFilterTest::generate_model(int32_t *mat, int16_t *alpha,
(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;
}
@ -265,4 +281,6 @@ void AV1HighbdWarpFilterTest::RunCheckOutput(
delete[] output;
delete[] output2;
}
} // namespace AV1HighbdWarpFilter
#endif // CONFIG_HIGHBITDEPTH
} // namespace libaom_test

View file

@ -26,16 +26,18 @@ namespace libaom_test {
namespace AV1WarpFilter {
typedef void (*warp_affine_func)(int32_t *mat, 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, int ref_frm, int16_t alpha,
int16_t beta, int16_t gamma, int16_t delta);
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,
int ref_frm, int16_t alpha, int16_t beta,
int16_t gamma, int16_t delta);
typedef std::tr1::tuple<int, int, int> WarpTestParam;
typedef std::tr1::tuple<int, int, int, warp_affine_func> WarpTestParam;
::testing::internal::ParamGenerator<WarpTestParam> GetDefaultParams();
::testing::internal::ParamGenerator<WarpTestParam> BuildParams(
warp_affine_func filter);
class AV1WarpFilterTest : public ::testing::TestWithParam<WarpTestParam> {
public:
@ -59,7 +61,7 @@ class AV1WarpFilterTest : public ::testing::TestWithParam<WarpTestParam> {
#if CONFIG_HIGHBITDEPTH
namespace AV1HighbdWarpFilter {
typedef void (*highbd_warp_affine_func)(
int32_t *mat, uint16_t *ref, int width, int height, int stride,
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, int ref_frm,
int16_t alpha, int16_t beta, int16_t gamma, int16_t delta);