1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <limits.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <tuple>
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
17*fb1b10abSAndroid Build Coastguard Worker
18*fb1b10abSAndroid Build Coastguard Worker #include "./vp9_rtcd.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "test/clear_system_state.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "test/register_state_check.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
27*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
28*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/vpx_timer.h"
29*fb1b10abSAndroid Build Coastguard Worker
30*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
31*fb1b10abSAndroid Build Coastguard Worker
32*fb1b10abSAndroid Build Coastguard Worker namespace {
33*fb1b10abSAndroid Build Coastguard Worker
34*fb1b10abSAndroid Build Coastguard Worker template <typename Pixel>
35*fb1b10abSAndroid Build Coastguard Worker class AverageTestBase : public ::testing::Test {
36*fb1b10abSAndroid Build Coastguard Worker public:
AverageTestBase(int width,int height)37*fb1b10abSAndroid Build Coastguard Worker AverageTestBase(int width, int height)
38*fb1b10abSAndroid Build Coastguard Worker : width_(width), height_(height), source_data_(nullptr),
39*fb1b10abSAndroid Build Coastguard Worker source_stride_(0), bit_depth_(8) {}
40*fb1b10abSAndroid Build Coastguard Worker
TearDown()41*fb1b10abSAndroid Build Coastguard Worker void TearDown() override {
42*fb1b10abSAndroid Build Coastguard Worker vpx_free(source_data_);
43*fb1b10abSAndroid Build Coastguard Worker source_data_ = nullptr;
44*fb1b10abSAndroid Build Coastguard Worker libvpx_test::ClearSystemState();
45*fb1b10abSAndroid Build Coastguard Worker }
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker protected:
48*fb1b10abSAndroid Build Coastguard Worker // Handle blocks up to 4 blocks 64x64 with stride up to 128
49*fb1b10abSAndroid Build Coastguard Worker static const int kDataAlignment = 16;
50*fb1b10abSAndroid Build Coastguard Worker static const int kDataBlockSize = 64 * 128;
51*fb1b10abSAndroid Build Coastguard Worker
SetUp()52*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
53*fb1b10abSAndroid Build Coastguard Worker source_data_ = reinterpret_cast<Pixel *>(
54*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(source_data_[0])));
55*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(source_data_, nullptr);
56*fb1b10abSAndroid Build Coastguard Worker source_stride_ = (width_ + 31) & ~31;
57*fb1b10abSAndroid Build Coastguard Worker bit_depth_ = 8;
58*fb1b10abSAndroid Build Coastguard Worker rnd_.Reset(ACMRandom::DeterministicSeed());
59*fb1b10abSAndroid Build Coastguard Worker }
60*fb1b10abSAndroid Build Coastguard Worker
61*fb1b10abSAndroid Build Coastguard Worker // Sum Pixels
ReferenceAverage8x8(const Pixel * source,int pitch)62*fb1b10abSAndroid Build Coastguard Worker static unsigned int ReferenceAverage8x8(const Pixel *source, int pitch) {
63*fb1b10abSAndroid Build Coastguard Worker unsigned int average = 0;
64*fb1b10abSAndroid Build Coastguard Worker for (int h = 0; h < 8; ++h) {
65*fb1b10abSAndroid Build Coastguard Worker for (int w = 0; w < 8; ++w) average += source[h * pitch + w];
66*fb1b10abSAndroid Build Coastguard Worker }
67*fb1b10abSAndroid Build Coastguard Worker return ((average + 32) >> 6);
68*fb1b10abSAndroid Build Coastguard Worker }
69*fb1b10abSAndroid Build Coastguard Worker
ReferenceAverage4x4(const Pixel * source,int pitch)70*fb1b10abSAndroid Build Coastguard Worker static unsigned int ReferenceAverage4x4(const Pixel *source, int pitch) {
71*fb1b10abSAndroid Build Coastguard Worker unsigned int average = 0;
72*fb1b10abSAndroid Build Coastguard Worker for (int h = 0; h < 4; ++h) {
73*fb1b10abSAndroid Build Coastguard Worker for (int w = 0; w < 4; ++w) average += source[h * pitch + w];
74*fb1b10abSAndroid Build Coastguard Worker }
75*fb1b10abSAndroid Build Coastguard Worker return ((average + 8) >> 4);
76*fb1b10abSAndroid Build Coastguard Worker }
77*fb1b10abSAndroid Build Coastguard Worker
FillConstant(Pixel fill_constant)78*fb1b10abSAndroid Build Coastguard Worker void FillConstant(Pixel fill_constant) {
79*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < width_ * height_; ++i) {
80*fb1b10abSAndroid Build Coastguard Worker source_data_[i] = fill_constant;
81*fb1b10abSAndroid Build Coastguard Worker }
82*fb1b10abSAndroid Build Coastguard Worker }
83*fb1b10abSAndroid Build Coastguard Worker
FillRandom()84*fb1b10abSAndroid Build Coastguard Worker void FillRandom() {
85*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < width_ * height_; ++i) {
86*fb1b10abSAndroid Build Coastguard Worker source_data_[i] = rnd_.Rand16() & ((1 << bit_depth_) - 1);
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker }
89*fb1b10abSAndroid Build Coastguard Worker
90*fb1b10abSAndroid Build Coastguard Worker int width_, height_;
91*fb1b10abSAndroid Build Coastguard Worker Pixel *source_data_;
92*fb1b10abSAndroid Build Coastguard Worker int source_stride_;
93*fb1b10abSAndroid Build Coastguard Worker int bit_depth_;
94*fb1b10abSAndroid Build Coastguard Worker
95*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd_;
96*fb1b10abSAndroid Build Coastguard Worker };
97*fb1b10abSAndroid Build Coastguard Worker typedef unsigned int (*AverageFunction)(const uint8_t *s, int pitch);
98*fb1b10abSAndroid Build Coastguard Worker
99*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, int, int, int, AverageFunction> AvgFunc;
100*fb1b10abSAndroid Build Coastguard Worker
101*fb1b10abSAndroid Build Coastguard Worker class AverageTest : public AverageTestBase<uint8_t>,
102*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<AvgFunc> {
103*fb1b10abSAndroid Build Coastguard Worker public:
AverageTest()104*fb1b10abSAndroid Build Coastguard Worker AverageTest() : AverageTestBase(GET_PARAM(0), GET_PARAM(1)) {}
105*fb1b10abSAndroid Build Coastguard Worker
106*fb1b10abSAndroid Build Coastguard Worker protected:
CheckAverages()107*fb1b10abSAndroid Build Coastguard Worker void CheckAverages() {
108*fb1b10abSAndroid Build Coastguard Worker const int block_size = GET_PARAM(3);
109*fb1b10abSAndroid Build Coastguard Worker unsigned int expected = 0;
110*fb1b10abSAndroid Build Coastguard Worker if (block_size == 8) {
111*fb1b10abSAndroid Build Coastguard Worker expected =
112*fb1b10abSAndroid Build Coastguard Worker ReferenceAverage8x8(source_data_ + GET_PARAM(2), source_stride_);
113*fb1b10abSAndroid Build Coastguard Worker } else if (block_size == 4) {
114*fb1b10abSAndroid Build Coastguard Worker expected =
115*fb1b10abSAndroid Build Coastguard Worker ReferenceAverage4x4(source_data_ + GET_PARAM(2), source_stride_);
116*fb1b10abSAndroid Build Coastguard Worker }
117*fb1b10abSAndroid Build Coastguard Worker
118*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
119*fb1b10abSAndroid Build Coastguard Worker GET_PARAM(4)(source_data_ + GET_PARAM(2), source_stride_));
120*fb1b10abSAndroid Build Coastguard Worker unsigned int actual =
121*fb1b10abSAndroid Build Coastguard Worker GET_PARAM(4)(source_data_ + GET_PARAM(2), source_stride_);
122*fb1b10abSAndroid Build Coastguard Worker
123*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
124*fb1b10abSAndroid Build Coastguard Worker }
125*fb1b10abSAndroid Build Coastguard Worker };
126*fb1b10abSAndroid Build Coastguard Worker
127*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
128*fb1b10abSAndroid Build Coastguard Worker class AverageTestHBD : public AverageTestBase<uint16_t>,
129*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<AvgFunc> {
130*fb1b10abSAndroid Build Coastguard Worker public:
AverageTestHBD()131*fb1b10abSAndroid Build Coastguard Worker AverageTestHBD() : AverageTestBase(GET_PARAM(0), GET_PARAM(1)) {}
132*fb1b10abSAndroid Build Coastguard Worker
133*fb1b10abSAndroid Build Coastguard Worker protected:
CheckAverages()134*fb1b10abSAndroid Build Coastguard Worker void CheckAverages() {
135*fb1b10abSAndroid Build Coastguard Worker const int block_size = GET_PARAM(3);
136*fb1b10abSAndroid Build Coastguard Worker unsigned int expected = 0;
137*fb1b10abSAndroid Build Coastguard Worker if (block_size == 8) {
138*fb1b10abSAndroid Build Coastguard Worker expected =
139*fb1b10abSAndroid Build Coastguard Worker ReferenceAverage8x8(source_data_ + GET_PARAM(2), source_stride_);
140*fb1b10abSAndroid Build Coastguard Worker } else if (block_size == 4) {
141*fb1b10abSAndroid Build Coastguard Worker expected =
142*fb1b10abSAndroid Build Coastguard Worker ReferenceAverage4x4(source_data_ + GET_PARAM(2), source_stride_);
143*fb1b10abSAndroid Build Coastguard Worker }
144*fb1b10abSAndroid Build Coastguard Worker
145*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(GET_PARAM(4)(
146*fb1b10abSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(source_data_ + GET_PARAM(2)), source_stride_));
147*fb1b10abSAndroid Build Coastguard Worker unsigned int actual = GET_PARAM(4)(
148*fb1b10abSAndroid Build Coastguard Worker CONVERT_TO_BYTEPTR(source_data_ + GET_PARAM(2)), source_stride_);
149*fb1b10abSAndroid Build Coastguard Worker
150*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(expected, actual);
151*fb1b10abSAndroid Build Coastguard Worker }
152*fb1b10abSAndroid Build Coastguard Worker };
153*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
154*fb1b10abSAndroid Build Coastguard Worker
155*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON || HAVE_SSE2 || HAVE_MSA
156*fb1b10abSAndroid Build Coastguard Worker typedef void (*IntProRowFunc)(int16_t hbuf[16], uint8_t const *ref,
157*fb1b10abSAndroid Build Coastguard Worker const int ref_stride, const int height);
158*fb1b10abSAndroid Build Coastguard Worker
159*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, IntProRowFunc, IntProRowFunc> IntProRowParam;
160*fb1b10abSAndroid Build Coastguard Worker
161*fb1b10abSAndroid Build Coastguard Worker class IntProRowTest : public AverageTestBase<uint8_t>,
162*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<IntProRowParam> {
163*fb1b10abSAndroid Build Coastguard Worker public:
IntProRowTest()164*fb1b10abSAndroid Build Coastguard Worker IntProRowTest()
165*fb1b10abSAndroid Build Coastguard Worker : AverageTestBase(16, GET_PARAM(0)), hbuf_asm_(nullptr),
166*fb1b10abSAndroid Build Coastguard Worker hbuf_c_(nullptr) {
167*fb1b10abSAndroid Build Coastguard Worker asm_func_ = GET_PARAM(1);
168*fb1b10abSAndroid Build Coastguard Worker c_func_ = GET_PARAM(2);
169*fb1b10abSAndroid Build Coastguard Worker }
170*fb1b10abSAndroid Build Coastguard Worker
171*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()172*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
173*fb1b10abSAndroid Build Coastguard Worker source_data_ = reinterpret_cast<uint8_t *>(
174*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(kDataAlignment, kDataBlockSize * sizeof(source_data_[0])));
175*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(source_data_, nullptr);
176*fb1b10abSAndroid Build Coastguard Worker
177*fb1b10abSAndroid Build Coastguard Worker hbuf_asm_ = reinterpret_cast<int16_t *>(
178*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(kDataAlignment, sizeof(*hbuf_asm_) * 16));
179*fb1b10abSAndroid Build Coastguard Worker hbuf_c_ = reinterpret_cast<int16_t *>(
180*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(kDataAlignment, sizeof(*hbuf_c_) * 16));
181*fb1b10abSAndroid Build Coastguard Worker }
182*fb1b10abSAndroid Build Coastguard Worker
TearDown()183*fb1b10abSAndroid Build Coastguard Worker void TearDown() override {
184*fb1b10abSAndroid Build Coastguard Worker vpx_free(source_data_);
185*fb1b10abSAndroid Build Coastguard Worker source_data_ = nullptr;
186*fb1b10abSAndroid Build Coastguard Worker vpx_free(hbuf_c_);
187*fb1b10abSAndroid Build Coastguard Worker hbuf_c_ = nullptr;
188*fb1b10abSAndroid Build Coastguard Worker vpx_free(hbuf_asm_);
189*fb1b10abSAndroid Build Coastguard Worker hbuf_asm_ = nullptr;
190*fb1b10abSAndroid Build Coastguard Worker }
191*fb1b10abSAndroid Build Coastguard Worker
RunComparison()192*fb1b10abSAndroid Build Coastguard Worker void RunComparison() {
193*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(c_func_(hbuf_c_, source_data_, width_, height_));
194*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
195*fb1b10abSAndroid Build Coastguard Worker asm_func_(hbuf_asm_, source_data_, width_, height_));
196*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(hbuf_c_, hbuf_asm_, sizeof(*hbuf_c_) * 16))
197*fb1b10abSAndroid Build Coastguard Worker << "Output mismatch";
198*fb1b10abSAndroid Build Coastguard Worker }
199*fb1b10abSAndroid Build Coastguard Worker
200*fb1b10abSAndroid Build Coastguard Worker private:
201*fb1b10abSAndroid Build Coastguard Worker IntProRowFunc asm_func_;
202*fb1b10abSAndroid Build Coastguard Worker IntProRowFunc c_func_;
203*fb1b10abSAndroid Build Coastguard Worker int16_t *hbuf_asm_;
204*fb1b10abSAndroid Build Coastguard Worker int16_t *hbuf_c_;
205*fb1b10abSAndroid Build Coastguard Worker };
206*fb1b10abSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IntProRowTest);
207*fb1b10abSAndroid Build Coastguard Worker
208*fb1b10abSAndroid Build Coastguard Worker typedef int16_t (*IntProColFunc)(uint8_t const *ref, const int width);
209*fb1b10abSAndroid Build Coastguard Worker
210*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, IntProColFunc, IntProColFunc> IntProColParam;
211*fb1b10abSAndroid Build Coastguard Worker
212*fb1b10abSAndroid Build Coastguard Worker class IntProColTest : public AverageTestBase<uint8_t>,
213*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<IntProColParam> {
214*fb1b10abSAndroid Build Coastguard Worker public:
IntProColTest()215*fb1b10abSAndroid Build Coastguard Worker IntProColTest() : AverageTestBase(GET_PARAM(0), 1), sum_asm_(0), sum_c_(0) {
216*fb1b10abSAndroid Build Coastguard Worker asm_func_ = GET_PARAM(1);
217*fb1b10abSAndroid Build Coastguard Worker c_func_ = GET_PARAM(2);
218*fb1b10abSAndroid Build Coastguard Worker }
219*fb1b10abSAndroid Build Coastguard Worker
220*fb1b10abSAndroid Build Coastguard Worker protected:
RunComparison()221*fb1b10abSAndroid Build Coastguard Worker void RunComparison() {
222*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(sum_c_ = c_func_(source_data_, width_));
223*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(sum_asm_ = asm_func_(source_data_, width_));
224*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(sum_c_, sum_asm_) << "Output mismatch";
225*fb1b10abSAndroid Build Coastguard Worker }
226*fb1b10abSAndroid Build Coastguard Worker
227*fb1b10abSAndroid Build Coastguard Worker private:
228*fb1b10abSAndroid Build Coastguard Worker IntProColFunc asm_func_;
229*fb1b10abSAndroid Build Coastguard Worker IntProColFunc c_func_;
230*fb1b10abSAndroid Build Coastguard Worker int16_t sum_asm_;
231*fb1b10abSAndroid Build Coastguard Worker int16_t sum_c_;
232*fb1b10abSAndroid Build Coastguard Worker };
233*fb1b10abSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(IntProColTest);
234*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_NEON || HAVE_SSE2 || HAVE_MSA
235*fb1b10abSAndroid Build Coastguard Worker
236*fb1b10abSAndroid Build Coastguard Worker typedef int (*SatdFunc)(const tran_low_t *coeffs, int length);
237*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, SatdFunc> SatdTestParam;
238*fb1b10abSAndroid Build Coastguard Worker
239*fb1b10abSAndroid Build Coastguard Worker class SatdTest : public ::testing::Test,
240*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<SatdTestParam> {
241*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()242*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
243*fb1b10abSAndroid Build Coastguard Worker satd_size_ = GET_PARAM(0);
244*fb1b10abSAndroid Build Coastguard Worker satd_func_ = GET_PARAM(1);
245*fb1b10abSAndroid Build Coastguard Worker rnd_.Reset(ACMRandom::DeterministicSeed());
246*fb1b10abSAndroid Build Coastguard Worker src_ = reinterpret_cast<tran_low_t *>(
247*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(16, sizeof(*src_) * satd_size_));
248*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(src_, nullptr);
249*fb1b10abSAndroid Build Coastguard Worker }
250*fb1b10abSAndroid Build Coastguard Worker
TearDown()251*fb1b10abSAndroid Build Coastguard Worker void TearDown() override {
252*fb1b10abSAndroid Build Coastguard Worker libvpx_test::ClearSystemState();
253*fb1b10abSAndroid Build Coastguard Worker vpx_free(src_);
254*fb1b10abSAndroid Build Coastguard Worker }
255*fb1b10abSAndroid Build Coastguard Worker
FillConstant(const tran_low_t val)256*fb1b10abSAndroid Build Coastguard Worker void FillConstant(const tran_low_t val) {
257*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < satd_size_; ++i) src_[i] = val;
258*fb1b10abSAndroid Build Coastguard Worker }
259*fb1b10abSAndroid Build Coastguard Worker
260*fb1b10abSAndroid Build Coastguard Worker virtual void FillRandom() = 0;
261*fb1b10abSAndroid Build Coastguard Worker
Check(const int expected)262*fb1b10abSAndroid Build Coastguard Worker void Check(const int expected) {
263*fb1b10abSAndroid Build Coastguard Worker int total;
264*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(total = satd_func_(src_, satd_size_));
265*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(expected, total);
266*fb1b10abSAndroid Build Coastguard Worker }
267*fb1b10abSAndroid Build Coastguard Worker
GetCoeff() const268*fb1b10abSAndroid Build Coastguard Worker tran_low_t *GetCoeff() const { return src_; }
269*fb1b10abSAndroid Build Coastguard Worker
270*fb1b10abSAndroid Build Coastguard Worker int satd_size_;
271*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd_;
272*fb1b10abSAndroid Build Coastguard Worker tran_low_t *src_;
273*fb1b10abSAndroid Build Coastguard Worker
274*fb1b10abSAndroid Build Coastguard Worker private:
275*fb1b10abSAndroid Build Coastguard Worker SatdFunc satd_func_;
276*fb1b10abSAndroid Build Coastguard Worker };
277*fb1b10abSAndroid Build Coastguard Worker
278*fb1b10abSAndroid Build Coastguard Worker class SatdLowbdTest : public SatdTest {
279*fb1b10abSAndroid Build Coastguard Worker protected:
FillRandom()280*fb1b10abSAndroid Build Coastguard Worker void FillRandom() override {
281*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < satd_size_; ++i) {
282*fb1b10abSAndroid Build Coastguard Worker const int16_t tmp = rnd_.Rand16Signed();
283*fb1b10abSAndroid Build Coastguard Worker src_[i] = (tran_low_t)tmp;
284*fb1b10abSAndroid Build Coastguard Worker }
285*fb1b10abSAndroid Build Coastguard Worker }
286*fb1b10abSAndroid Build Coastguard Worker };
287*fb1b10abSAndroid Build Coastguard Worker
288*fb1b10abSAndroid Build Coastguard Worker typedef int64_t (*BlockErrorFunc)(const tran_low_t *coeff,
289*fb1b10abSAndroid Build Coastguard Worker const tran_low_t *dqcoeff, int block_size);
290*fb1b10abSAndroid Build Coastguard Worker typedef std::tuple<int, BlockErrorFunc> BlockErrorTestFPParam;
291*fb1b10abSAndroid Build Coastguard Worker
292*fb1b10abSAndroid Build Coastguard Worker class BlockErrorTestFP
293*fb1b10abSAndroid Build Coastguard Worker : public ::testing::Test,
294*fb1b10abSAndroid Build Coastguard Worker public ::testing::WithParamInterface<BlockErrorTestFPParam> {
295*fb1b10abSAndroid Build Coastguard Worker protected:
SetUp()296*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
297*fb1b10abSAndroid Build Coastguard Worker txfm_size_ = GET_PARAM(0);
298*fb1b10abSAndroid Build Coastguard Worker block_error_func_ = GET_PARAM(1);
299*fb1b10abSAndroid Build Coastguard Worker rnd_.Reset(ACMRandom::DeterministicSeed());
300*fb1b10abSAndroid Build Coastguard Worker coeff_ = reinterpret_cast<tran_low_t *>(
301*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(16, sizeof(*coeff_) * txfm_size_));
302*fb1b10abSAndroid Build Coastguard Worker dqcoeff_ = reinterpret_cast<tran_low_t *>(
303*fb1b10abSAndroid Build Coastguard Worker vpx_memalign(16, sizeof(*dqcoeff_) * txfm_size_));
304*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(coeff_, nullptr);
305*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(dqcoeff_, nullptr);
306*fb1b10abSAndroid Build Coastguard Worker }
307*fb1b10abSAndroid Build Coastguard Worker
TearDown()308*fb1b10abSAndroid Build Coastguard Worker void TearDown() override {
309*fb1b10abSAndroid Build Coastguard Worker libvpx_test::ClearSystemState();
310*fb1b10abSAndroid Build Coastguard Worker vpx_free(coeff_);
311*fb1b10abSAndroid Build Coastguard Worker vpx_free(dqcoeff_);
312*fb1b10abSAndroid Build Coastguard Worker }
313*fb1b10abSAndroid Build Coastguard Worker
FillConstant(const tran_low_t coeff_val,const tran_low_t dqcoeff_val)314*fb1b10abSAndroid Build Coastguard Worker void FillConstant(const tran_low_t coeff_val, const tran_low_t dqcoeff_val) {
315*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < txfm_size_; ++i) coeff_[i] = coeff_val;
316*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < txfm_size_; ++i) dqcoeff_[i] = dqcoeff_val;
317*fb1b10abSAndroid Build Coastguard Worker }
318*fb1b10abSAndroid Build Coastguard Worker
FillRandom()319*fb1b10abSAndroid Build Coastguard Worker void FillRandom() {
320*fb1b10abSAndroid Build Coastguard Worker // Just two fixed seeds
321*fb1b10abSAndroid Build Coastguard Worker rnd_.Reset(0xb0b9);
322*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < txfm_size_; ++i) coeff_[i] = rnd_.Rand16() >> 1;
323*fb1b10abSAndroid Build Coastguard Worker rnd_.Reset(0xb0c8);
324*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < txfm_size_; ++i) dqcoeff_[i] = rnd_.Rand16() >> 1;
325*fb1b10abSAndroid Build Coastguard Worker }
326*fb1b10abSAndroid Build Coastguard Worker
Check(const int64_t expected)327*fb1b10abSAndroid Build Coastguard Worker void Check(const int64_t expected) {
328*fb1b10abSAndroid Build Coastguard Worker int64_t total;
329*fb1b10abSAndroid Build Coastguard Worker ASM_REGISTER_STATE_CHECK(
330*fb1b10abSAndroid Build Coastguard Worker total = block_error_func_(coeff_, dqcoeff_, txfm_size_));
331*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(expected, total);
332*fb1b10abSAndroid Build Coastguard Worker }
333*fb1b10abSAndroid Build Coastguard Worker
GetCoeff() const334*fb1b10abSAndroid Build Coastguard Worker tran_low_t *GetCoeff() const { return coeff_; }
335*fb1b10abSAndroid Build Coastguard Worker
GetDQCoeff() const336*fb1b10abSAndroid Build Coastguard Worker tran_low_t *GetDQCoeff() const { return dqcoeff_; }
337*fb1b10abSAndroid Build Coastguard Worker
338*fb1b10abSAndroid Build Coastguard Worker int txfm_size_;
339*fb1b10abSAndroid Build Coastguard Worker
340*fb1b10abSAndroid Build Coastguard Worker private:
341*fb1b10abSAndroid Build Coastguard Worker tran_low_t *coeff_;
342*fb1b10abSAndroid Build Coastguard Worker tran_low_t *dqcoeff_;
343*fb1b10abSAndroid Build Coastguard Worker BlockErrorFunc block_error_func_;
344*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd_;
345*fb1b10abSAndroid Build Coastguard Worker };
346*fb1b10abSAndroid Build Coastguard Worker
TEST_P(AverageTest,MinValue)347*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTest, MinValue) {
348*fb1b10abSAndroid Build Coastguard Worker FillConstant(0);
349*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
350*fb1b10abSAndroid Build Coastguard Worker }
351*fb1b10abSAndroid Build Coastguard Worker
TEST_P(AverageTest,MaxValue)352*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTest, MaxValue) {
353*fb1b10abSAndroid Build Coastguard Worker FillConstant(255);
354*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
355*fb1b10abSAndroid Build Coastguard Worker }
356*fb1b10abSAndroid Build Coastguard Worker
TEST_P(AverageTest,Random)357*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTest, Random) {
358*fb1b10abSAndroid Build Coastguard Worker // The reference frame, but not the source frame, may be unaligned for
359*fb1b10abSAndroid Build Coastguard Worker // certain types of searches.
360*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) {
361*fb1b10abSAndroid Build Coastguard Worker FillRandom();
362*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
363*fb1b10abSAndroid Build Coastguard Worker }
364*fb1b10abSAndroid Build Coastguard Worker }
365*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
TEST_P(AverageTestHBD,MinValue)366*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTestHBD, MinValue) {
367*fb1b10abSAndroid Build Coastguard Worker FillConstant(0);
368*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
369*fb1b10abSAndroid Build Coastguard Worker }
370*fb1b10abSAndroid Build Coastguard Worker
TEST_P(AverageTestHBD,MaxValue)371*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTestHBD, MaxValue) {
372*fb1b10abSAndroid Build Coastguard Worker FillConstant((1 << VPX_BITS_12) - 1);
373*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
374*fb1b10abSAndroid Build Coastguard Worker }
375*fb1b10abSAndroid Build Coastguard Worker
TEST_P(AverageTestHBD,Random)376*fb1b10abSAndroid Build Coastguard Worker TEST_P(AverageTestHBD, Random) {
377*fb1b10abSAndroid Build Coastguard Worker bit_depth_ = VPX_BITS_12;
378*fb1b10abSAndroid Build Coastguard Worker // The reference frame, but not the source frame, may be unaligned for
379*fb1b10abSAndroid Build Coastguard Worker // certain types of searches.
380*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) {
381*fb1b10abSAndroid Build Coastguard Worker FillRandom();
382*fb1b10abSAndroid Build Coastguard Worker CheckAverages();
383*fb1b10abSAndroid Build Coastguard Worker }
384*fb1b10abSAndroid Build Coastguard Worker }
385*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
386*fb1b10abSAndroid Build Coastguard Worker
387*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON || HAVE_SSE2 || HAVE_MSA
TEST_P(IntProRowTest,MinValue)388*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProRowTest, MinValue) {
389*fb1b10abSAndroid Build Coastguard Worker FillConstant(0);
390*fb1b10abSAndroid Build Coastguard Worker RunComparison();
391*fb1b10abSAndroid Build Coastguard Worker }
392*fb1b10abSAndroid Build Coastguard Worker
TEST_P(IntProRowTest,MaxValue)393*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProRowTest, MaxValue) {
394*fb1b10abSAndroid Build Coastguard Worker FillConstant(255);
395*fb1b10abSAndroid Build Coastguard Worker RunComparison();
396*fb1b10abSAndroid Build Coastguard Worker }
397*fb1b10abSAndroid Build Coastguard Worker
TEST_P(IntProRowTest,Random)398*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProRowTest, Random) {
399*fb1b10abSAndroid Build Coastguard Worker FillRandom();
400*fb1b10abSAndroid Build Coastguard Worker RunComparison();
401*fb1b10abSAndroid Build Coastguard Worker }
402*fb1b10abSAndroid Build Coastguard Worker
TEST_P(IntProColTest,MinValue)403*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProColTest, MinValue) {
404*fb1b10abSAndroid Build Coastguard Worker FillConstant(0);
405*fb1b10abSAndroid Build Coastguard Worker RunComparison();
406*fb1b10abSAndroid Build Coastguard Worker }
407*fb1b10abSAndroid Build Coastguard Worker
TEST_P(IntProColTest,MaxValue)408*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProColTest, MaxValue) {
409*fb1b10abSAndroid Build Coastguard Worker FillConstant(255);
410*fb1b10abSAndroid Build Coastguard Worker RunComparison();
411*fb1b10abSAndroid Build Coastguard Worker }
412*fb1b10abSAndroid Build Coastguard Worker
TEST_P(IntProColTest,Random)413*fb1b10abSAndroid Build Coastguard Worker TEST_P(IntProColTest, Random) {
414*fb1b10abSAndroid Build Coastguard Worker FillRandom();
415*fb1b10abSAndroid Build Coastguard Worker RunComparison();
416*fb1b10abSAndroid Build Coastguard Worker }
417*fb1b10abSAndroid Build Coastguard Worker #endif
418*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdLowbdTest,MinValue)419*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdLowbdTest, MinValue) {
420*fb1b10abSAndroid Build Coastguard Worker const int kMin = -32640;
421*fb1b10abSAndroid Build Coastguard Worker const int expected = -kMin * satd_size_;
422*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMin);
423*fb1b10abSAndroid Build Coastguard Worker Check(expected);
424*fb1b10abSAndroid Build Coastguard Worker }
425*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdLowbdTest,MaxValue)426*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdLowbdTest, MaxValue) {
427*fb1b10abSAndroid Build Coastguard Worker const int kMax = 32640;
428*fb1b10abSAndroid Build Coastguard Worker const int expected = kMax * satd_size_;
429*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMax);
430*fb1b10abSAndroid Build Coastguard Worker Check(expected);
431*fb1b10abSAndroid Build Coastguard Worker }
432*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdLowbdTest,Random)433*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdLowbdTest, Random) {
434*fb1b10abSAndroid Build Coastguard Worker int expected;
435*fb1b10abSAndroid Build Coastguard Worker switch (satd_size_) {
436*fb1b10abSAndroid Build Coastguard Worker case 16: expected = 261036; break;
437*fb1b10abSAndroid Build Coastguard Worker case 64: expected = 991732; break;
438*fb1b10abSAndroid Build Coastguard Worker case 256: expected = 4136358; break;
439*fb1b10abSAndroid Build Coastguard Worker case 1024: expected = 16677592; break;
440*fb1b10abSAndroid Build Coastguard Worker default:
441*fb1b10abSAndroid Build Coastguard Worker FAIL() << "Invalid satd size (" << satd_size_
442*fb1b10abSAndroid Build Coastguard Worker << ") valid: 16/64/256/1024";
443*fb1b10abSAndroid Build Coastguard Worker }
444*fb1b10abSAndroid Build Coastguard Worker FillRandom();
445*fb1b10abSAndroid Build Coastguard Worker Check(expected);
446*fb1b10abSAndroid Build Coastguard Worker }
447*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdLowbdTest,DISABLED_Speed)448*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdLowbdTest, DISABLED_Speed) {
449*fb1b10abSAndroid Build Coastguard Worker const int kCountSpeedTestBlock = 20000;
450*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer timer;
451*fb1b10abSAndroid Build Coastguard Worker const int blocksize = GET_PARAM(0);
452*fb1b10abSAndroid Build Coastguard Worker FillRandom();
453*fb1b10abSAndroid Build Coastguard Worker tran_low_t *coeff = GetCoeff();
454*fb1b10abSAndroid Build Coastguard Worker
455*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_start(&timer);
456*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kCountSpeedTestBlock; ++i) {
457*fb1b10abSAndroid Build Coastguard Worker GET_PARAM(1)(coeff, blocksize);
458*fb1b10abSAndroid Build Coastguard Worker }
459*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_mark(&timer);
460*fb1b10abSAndroid Build Coastguard Worker const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
461*fb1b10abSAndroid Build Coastguard Worker printf("blocksize: %4d time: %4d us\n", blocksize, elapsed_time);
462*fb1b10abSAndroid Build Coastguard Worker }
463*fb1b10abSAndroid Build Coastguard Worker
464*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
465*fb1b10abSAndroid Build Coastguard Worker class SatdHighbdTest : public SatdTest {
466*fb1b10abSAndroid Build Coastguard Worker protected:
FillRandom()467*fb1b10abSAndroid Build Coastguard Worker void FillRandom() override {
468*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < satd_size_; ++i) {
469*fb1b10abSAndroid Build Coastguard Worker src_[i] = rnd_.Rand20Signed();
470*fb1b10abSAndroid Build Coastguard Worker }
471*fb1b10abSAndroid Build Coastguard Worker }
472*fb1b10abSAndroid Build Coastguard Worker };
473*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdHighbdTest,MinValue)474*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdHighbdTest, MinValue) {
475*fb1b10abSAndroid Build Coastguard Worker const int kMin = -524280;
476*fb1b10abSAndroid Build Coastguard Worker const int expected = -kMin * satd_size_;
477*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMin);
478*fb1b10abSAndroid Build Coastguard Worker Check(expected);
479*fb1b10abSAndroid Build Coastguard Worker }
480*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdHighbdTest,MaxValue)481*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdHighbdTest, MaxValue) {
482*fb1b10abSAndroid Build Coastguard Worker const int kMax = 524280;
483*fb1b10abSAndroid Build Coastguard Worker const int expected = kMax * satd_size_;
484*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMax);
485*fb1b10abSAndroid Build Coastguard Worker Check(expected);
486*fb1b10abSAndroid Build Coastguard Worker }
487*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdHighbdTest,Random)488*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdHighbdTest, Random) {
489*fb1b10abSAndroid Build Coastguard Worker int expected;
490*fb1b10abSAndroid Build Coastguard Worker switch (satd_size_) {
491*fb1b10abSAndroid Build Coastguard Worker case 16: expected = 5249712; break;
492*fb1b10abSAndroid Build Coastguard Worker case 64: expected = 18362120; break;
493*fb1b10abSAndroid Build Coastguard Worker case 256: expected = 66100520; break;
494*fb1b10abSAndroid Build Coastguard Worker case 1024: expected = 266094734; break;
495*fb1b10abSAndroid Build Coastguard Worker default:
496*fb1b10abSAndroid Build Coastguard Worker FAIL() << "Invalid satd size (" << satd_size_
497*fb1b10abSAndroid Build Coastguard Worker << ") valid: 16/64/256/1024";
498*fb1b10abSAndroid Build Coastguard Worker }
499*fb1b10abSAndroid Build Coastguard Worker FillRandom();
500*fb1b10abSAndroid Build Coastguard Worker Check(expected);
501*fb1b10abSAndroid Build Coastguard Worker }
502*fb1b10abSAndroid Build Coastguard Worker
TEST_P(SatdHighbdTest,DISABLED_Speed)503*fb1b10abSAndroid Build Coastguard Worker TEST_P(SatdHighbdTest, DISABLED_Speed) {
504*fb1b10abSAndroid Build Coastguard Worker const int kCountSpeedTestBlock = 20000;
505*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer timer;
506*fb1b10abSAndroid Build Coastguard Worker const int blocksize = GET_PARAM(0);
507*fb1b10abSAndroid Build Coastguard Worker FillRandom();
508*fb1b10abSAndroid Build Coastguard Worker tran_low_t *coeff = GetCoeff();
509*fb1b10abSAndroid Build Coastguard Worker
510*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_start(&timer);
511*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kCountSpeedTestBlock; ++i) {
512*fb1b10abSAndroid Build Coastguard Worker GET_PARAM(1)(coeff, blocksize);
513*fb1b10abSAndroid Build Coastguard Worker }
514*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_mark(&timer);
515*fb1b10abSAndroid Build Coastguard Worker const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
516*fb1b10abSAndroid Build Coastguard Worker printf("blocksize: %4d time: %4d us\n", blocksize, elapsed_time);
517*fb1b10abSAndroid Build Coastguard Worker }
518*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
519*fb1b10abSAndroid Build Coastguard Worker
TEST_P(BlockErrorTestFP,MinValue)520*fb1b10abSAndroid Build Coastguard Worker TEST_P(BlockErrorTestFP, MinValue) {
521*fb1b10abSAndroid Build Coastguard Worker const int64_t kMin = -32640;
522*fb1b10abSAndroid Build Coastguard Worker const int64_t expected = kMin * kMin * txfm_size_;
523*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMin, 0);
524*fb1b10abSAndroid Build Coastguard Worker Check(expected);
525*fb1b10abSAndroid Build Coastguard Worker }
526*fb1b10abSAndroid Build Coastguard Worker
TEST_P(BlockErrorTestFP,MaxValue)527*fb1b10abSAndroid Build Coastguard Worker TEST_P(BlockErrorTestFP, MaxValue) {
528*fb1b10abSAndroid Build Coastguard Worker const int64_t kMax = 32640;
529*fb1b10abSAndroid Build Coastguard Worker const int64_t expected = kMax * kMax * txfm_size_;
530*fb1b10abSAndroid Build Coastguard Worker FillConstant(kMax, 0);
531*fb1b10abSAndroid Build Coastguard Worker Check(expected);
532*fb1b10abSAndroid Build Coastguard Worker }
533*fb1b10abSAndroid Build Coastguard Worker
TEST_P(BlockErrorTestFP,Random)534*fb1b10abSAndroid Build Coastguard Worker TEST_P(BlockErrorTestFP, Random) {
535*fb1b10abSAndroid Build Coastguard Worker int64_t expected;
536*fb1b10abSAndroid Build Coastguard Worker switch (txfm_size_) {
537*fb1b10abSAndroid Build Coastguard Worker case 16: expected = 2051681432; break;
538*fb1b10abSAndroid Build Coastguard Worker case 64: expected = 11075114379; break;
539*fb1b10abSAndroid Build Coastguard Worker case 256: expected = 44386271116; break;
540*fb1b10abSAndroid Build Coastguard Worker case 1024: expected = 184774996089; break;
541*fb1b10abSAndroid Build Coastguard Worker default:
542*fb1b10abSAndroid Build Coastguard Worker FAIL() << "Invalid satd size (" << txfm_size_
543*fb1b10abSAndroid Build Coastguard Worker << ") valid: 16/64/256/1024";
544*fb1b10abSAndroid Build Coastguard Worker }
545*fb1b10abSAndroid Build Coastguard Worker FillRandom();
546*fb1b10abSAndroid Build Coastguard Worker Check(expected);
547*fb1b10abSAndroid Build Coastguard Worker }
548*fb1b10abSAndroid Build Coastguard Worker
TEST_P(BlockErrorTestFP,DISABLED_Speed)549*fb1b10abSAndroid Build Coastguard Worker TEST_P(BlockErrorTestFP, DISABLED_Speed) {
550*fb1b10abSAndroid Build Coastguard Worker const int kCountSpeedTestBlock = 20000;
551*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer timer;
552*fb1b10abSAndroid Build Coastguard Worker const int blocksize = GET_PARAM(0);
553*fb1b10abSAndroid Build Coastguard Worker FillRandom();
554*fb1b10abSAndroid Build Coastguard Worker tran_low_t *coeff = GetCoeff();
555*fb1b10abSAndroid Build Coastguard Worker tran_low_t *dqcoeff = GetDQCoeff();
556*fb1b10abSAndroid Build Coastguard Worker
557*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_start(&timer);
558*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kCountSpeedTestBlock; ++i) {
559*fb1b10abSAndroid Build Coastguard Worker GET_PARAM(1)(coeff, dqcoeff, blocksize);
560*fb1b10abSAndroid Build Coastguard Worker }
561*fb1b10abSAndroid Build Coastguard Worker vpx_usec_timer_mark(&timer);
562*fb1b10abSAndroid Build Coastguard Worker const int elapsed_time = static_cast<int>(vpx_usec_timer_elapsed(&timer));
563*fb1b10abSAndroid Build Coastguard Worker printf("blocksize: %4d time: %4d us\n", blocksize, elapsed_time);
564*fb1b10abSAndroid Build Coastguard Worker }
565*fb1b10abSAndroid Build Coastguard Worker
566*fb1b10abSAndroid Build Coastguard Worker using std::make_tuple;
567*fb1b10abSAndroid Build Coastguard Worker
568*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
569*fb1b10abSAndroid Build Coastguard Worker C, AverageTest,
570*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 1, 8, &vpx_avg_8x8_c),
571*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 1, 4, &vpx_avg_4x4_c)));
572*fb1b10abSAndroid Build Coastguard Worker
573*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
574*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
575*fb1b10abSAndroid Build Coastguard Worker C, AverageTestHBD,
576*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 1, 8, &vpx_highbd_avg_8x8_c),
577*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 1, 4, &vpx_highbd_avg_4x4_c)));
578*fb1b10abSAndroid Build Coastguard Worker
579*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
580*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
581*fb1b10abSAndroid Build Coastguard Worker SSE2, AverageTestHBD,
582*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 1, 8, &vpx_highbd_avg_8x8_sse2),
583*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 1, 4, &vpx_highbd_avg_4x4_sse2)));
584*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2
585*fb1b10abSAndroid Build Coastguard Worker
586*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
587*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
588*fb1b10abSAndroid Build Coastguard Worker NEON, AverageTestHBD,
589*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 1, 8, &vpx_highbd_avg_8x8_neon),
590*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 1, 4, &vpx_highbd_avg_4x4_neon)));
591*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_NEON
592*fb1b10abSAndroid Build Coastguard Worker
593*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, SatdHighbdTest,
594*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_c),
595*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_c),
596*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_c),
597*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_c)));
598*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
599*fb1b10abSAndroid Build Coastguard Worker
600*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(C, SatdLowbdTest,
601*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_c),
602*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_c),
603*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_c),
604*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_c)));
605*fb1b10abSAndroid Build Coastguard Worker
606*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
607*fb1b10abSAndroid Build Coastguard Worker C, BlockErrorTestFP,
608*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vp9_block_error_fp_c),
609*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vp9_block_error_fp_c),
610*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vp9_block_error_fp_c),
611*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vp9_block_error_fp_c)));
612*fb1b10abSAndroid Build Coastguard Worker
613*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SSE2
614*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
615*fb1b10abSAndroid Build Coastguard Worker SSE2, AverageTest,
616*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 0, 8, &vpx_avg_8x8_sse2),
617*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 8, &vpx_avg_8x8_sse2),
618*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 8, &vpx_avg_8x8_sse2),
619*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 0, 4, &vpx_avg_4x4_sse2),
620*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 4, &vpx_avg_4x4_sse2),
621*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 4, &vpx_avg_4x4_sse2)));
622*fb1b10abSAndroid Build Coastguard Worker
623*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
624*fb1b10abSAndroid Build Coastguard Worker SSE2, IntProRowTest,
625*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_row_sse2, &vpx_int_pro_row_c),
626*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_row_sse2, &vpx_int_pro_row_c),
627*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_row_sse2,
628*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_row_c)));
629*fb1b10abSAndroid Build Coastguard Worker
630*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
631*fb1b10abSAndroid Build Coastguard Worker SSE2, IntProColTest,
632*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_col_sse2, &vpx_int_pro_col_c),
633*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_col_sse2, &vpx_int_pro_col_c),
634*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_col_sse2,
635*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_col_c)));
636*fb1b10abSAndroid Build Coastguard Worker
637*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, SatdLowbdTest,
638*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_sse2),
639*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_sse2),
640*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_sse2),
641*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_sse2)));
642*fb1b10abSAndroid Build Coastguard Worker
643*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
644*fb1b10abSAndroid Build Coastguard Worker SSE2, BlockErrorTestFP,
645*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vp9_block_error_fp_sse2),
646*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vp9_block_error_fp_sse2),
647*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vp9_block_error_fp_sse2),
648*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vp9_block_error_fp_sse2)));
649*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SSE2
650*fb1b10abSAndroid Build Coastguard Worker
651*fb1b10abSAndroid Build Coastguard Worker #if HAVE_AVX2
652*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, SatdLowbdTest,
653*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_avx2),
654*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_avx2),
655*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_avx2),
656*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_avx2)));
657*fb1b10abSAndroid Build Coastguard Worker
658*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
659*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
660*fb1b10abSAndroid Build Coastguard Worker AVX2, SatdHighbdTest,
661*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_highbd_satd_avx2),
662*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_highbd_satd_avx2),
663*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_highbd_satd_avx2),
664*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_highbd_satd_avx2)));
665*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
666*fb1b10abSAndroid Build Coastguard Worker
667*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
668*fb1b10abSAndroid Build Coastguard Worker AVX2, BlockErrorTestFP,
669*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vp9_block_error_fp_avx2),
670*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vp9_block_error_fp_avx2),
671*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vp9_block_error_fp_avx2),
672*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vp9_block_error_fp_avx2)));
673*fb1b10abSAndroid Build Coastguard Worker #endif
674*fb1b10abSAndroid Build Coastguard Worker
675*fb1b10abSAndroid Build Coastguard Worker #if HAVE_NEON
676*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
677*fb1b10abSAndroid Build Coastguard Worker NEON, AverageTest,
678*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 0, 8, &vpx_avg_8x8_neon),
679*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 8, &vpx_avg_8x8_neon),
680*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 8, &vpx_avg_8x8_neon),
681*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 0, 4, &vpx_avg_4x4_neon),
682*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 4, &vpx_avg_4x4_neon),
683*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 4, &vpx_avg_4x4_neon)));
684*fb1b10abSAndroid Build Coastguard Worker
685*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
686*fb1b10abSAndroid Build Coastguard Worker NEON, IntProRowTest,
687*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_row_neon, &vpx_int_pro_row_c),
688*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_row_neon, &vpx_int_pro_row_c),
689*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_row_neon,
690*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_row_c)));
691*fb1b10abSAndroid Build Coastguard Worker
692*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
693*fb1b10abSAndroid Build Coastguard Worker NEON, IntProColTest,
694*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_col_neon, &vpx_int_pro_col_c),
695*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_col_neon, &vpx_int_pro_col_c),
696*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_col_neon,
697*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_col_c)));
698*fb1b10abSAndroid Build Coastguard Worker
699*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, SatdLowbdTest,
700*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_neon),
701*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_neon),
702*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_neon),
703*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_neon)));
704*fb1b10abSAndroid Build Coastguard Worker
705*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
706*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
707*fb1b10abSAndroid Build Coastguard Worker NEON, SatdHighbdTest,
708*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_highbd_satd_neon),
709*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_highbd_satd_neon),
710*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_highbd_satd_neon),
711*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_highbd_satd_neon)));
712*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_VP9_HIGHBITDEPTH
713*fb1b10abSAndroid Build Coastguard Worker
714*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
715*fb1b10abSAndroid Build Coastguard Worker NEON, BlockErrorTestFP,
716*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vp9_block_error_fp_neon),
717*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vp9_block_error_fp_neon),
718*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vp9_block_error_fp_neon),
719*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vp9_block_error_fp_neon)));
720*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_NEON
721*fb1b10abSAndroid Build Coastguard Worker
722*fb1b10abSAndroid Build Coastguard Worker #if HAVE_SVE
723*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
724*fb1b10abSAndroid Build Coastguard Worker SVE, BlockErrorTestFP,
725*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vp9_block_error_fp_sve),
726*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vp9_block_error_fp_sve),
727*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vp9_block_error_fp_sve),
728*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vp9_block_error_fp_sve)));
729*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_SVE
730*fb1b10abSAndroid Build Coastguard Worker
731*fb1b10abSAndroid Build Coastguard Worker #if HAVE_MSA
732*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
733*fb1b10abSAndroid Build Coastguard Worker MSA, AverageTest,
734*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, 16, 0, 8, &vpx_avg_8x8_msa),
735*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 8, &vpx_avg_8x8_msa),
736*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 8, &vpx_avg_8x8_msa),
737*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 0, 4, &vpx_avg_4x4_msa),
738*fb1b10abSAndroid Build Coastguard Worker make_tuple(16, 16, 5, 4, &vpx_avg_4x4_msa),
739*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, 32, 15, 4, &vpx_avg_4x4_msa)));
740*fb1b10abSAndroid Build Coastguard Worker
741*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
742*fb1b10abSAndroid Build Coastguard Worker MSA, IntProRowTest,
743*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_row_msa, &vpx_int_pro_row_c),
744*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_row_msa, &vpx_int_pro_row_c),
745*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_row_msa,
746*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_row_c)));
747*fb1b10abSAndroid Build Coastguard Worker
748*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
749*fb1b10abSAndroid Build Coastguard Worker MSA, IntProColTest,
750*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_int_pro_col_msa, &vpx_int_pro_col_c),
751*fb1b10abSAndroid Build Coastguard Worker make_tuple(32, &vpx_int_pro_col_msa, &vpx_int_pro_col_c),
752*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_int_pro_col_msa,
753*fb1b10abSAndroid Build Coastguard Worker &vpx_int_pro_col_c)));
754*fb1b10abSAndroid Build Coastguard Worker
755*fb1b10abSAndroid Build Coastguard Worker // TODO(jingning): Remove the highbitdepth flag once the SIMD functions are
756*fb1b10abSAndroid Build Coastguard Worker // in place.
757*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_VP9_HIGHBITDEPTH
758*fb1b10abSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(MSA, SatdLowbdTest,
759*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(make_tuple(16, &vpx_satd_msa),
760*fb1b10abSAndroid Build Coastguard Worker make_tuple(64, &vpx_satd_msa),
761*fb1b10abSAndroid Build Coastguard Worker make_tuple(256, &vpx_satd_msa),
762*fb1b10abSAndroid Build Coastguard Worker make_tuple(1024, &vpx_satd_msa)));
763*fb1b10abSAndroid Build Coastguard Worker #endif // !CONFIG_VP9_HIGHBITDEPTH
764*fb1b10abSAndroid Build Coastguard Worker #endif // HAVE_MSA
765*fb1b10abSAndroid Build Coastguard Worker
766*fb1b10abSAndroid Build Coastguard Worker } // namespace
767