1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2017, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker *
4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker */
11*77c1e3ccSAndroid Build Coastguard Worker
12*77c1e3ccSAndroid Build Coastguard Worker #include <tuple>
13*77c1e3ccSAndroid Build Coastguard Worker
14*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*77c1e3ccSAndroid Build Coastguard Worker
16*77c1e3ccSAndroid Build Coastguard Worker #include "config/av1_rtcd.h"
17*77c1e3ccSAndroid Build Coastguard Worker
18*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/aom_timer.h"
19*77c1e3ccSAndroid Build Coastguard Worker #include "test/util.h"
20*77c1e3ccSAndroid Build Coastguard Worker #include "test/acm_random.h"
21*77c1e3ccSAndroid Build Coastguard Worker
22*77c1e3ccSAndroid Build Coastguard Worker using std::make_tuple;
23*77c1e3ccSAndroid Build Coastguard Worker
24*77c1e3ccSAndroid Build Coastguard Worker using libaom_test::ACMRandom;
25*77c1e3ccSAndroid Build Coastguard Worker
26*77c1e3ccSAndroid Build Coastguard Worker #define NUM_ITERATIONS (100)
27*77c1e3ccSAndroid Build Coastguard Worker #define NUM_ITERATIONS_SPEED (INT16_MAX)
28*77c1e3ccSAndroid Build Coastguard Worker
29*77c1e3ccSAndroid Build Coastguard Worker #define ALL_CFL_TX_SIZES(function) \
30*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X4), &function), \
31*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X8), &function), \
32*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X16), &function), \
33*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X4), &function), \
34*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X8), &function), \
35*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X16), &function), \
36*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X32), &function), \
37*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X4), &function), \
38*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X8), &function), \
39*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X16), &function), \
40*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X32), &function), \
41*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X8), &function), \
42*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X16), &function), \
43*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X32), &function)
44*77c1e3ccSAndroid Build Coastguard Worker
45*77c1e3ccSAndroid Build Coastguard Worker #define ALL_CFL_TX_SIZES_SUBSAMPLE(fun420, fun422, fun444) \
46*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X4), &fun420, &fun422, &fun444), \
47*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X8), &fun420, &fun422, &fun444), \
48*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_4X16), &fun420, &fun422, &fun444), \
49*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X4), &fun420, &fun422, &fun444), \
50*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X8), &fun420, &fun422, &fun444), \
51*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X16), &fun420, &fun422, &fun444), \
52*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_8X32), &fun420, &fun422, &fun444), \
53*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X4), &fun420, &fun422, &fun444), \
54*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X8), &fun420, &fun422, &fun444), \
55*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X16), &fun420, &fun422, &fun444), \
56*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_16X32), &fun420, &fun422, &fun444), \
57*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X8), &fun420, &fun422, &fun444), \
58*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X16), &fun420, &fun422, &fun444), \
59*77c1e3ccSAndroid Build Coastguard Worker make_tuple(static_cast<TX_SIZE>(TX_32X32), &fun420, &fun422, &fun444)
60*77c1e3ccSAndroid Build Coastguard Worker
61*77c1e3ccSAndroid Build Coastguard Worker namespace {
62*77c1e3ccSAndroid Build Coastguard Worker
63*77c1e3ccSAndroid Build Coastguard Worker template <typename A>
assert_eq(const A * a,const A * b,int width,int height)64*77c1e3ccSAndroid Build Coastguard Worker static void assert_eq(const A *a, const A *b, int width, int height) {
65*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < height; j++) {
66*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < width; i++) {
67*77c1e3ccSAndroid Build Coastguard Worker ASSERT_EQ(a[j * CFL_BUF_LINE + i], b[j * CFL_BUF_LINE + i]);
68*77c1e3ccSAndroid Build Coastguard Worker }
69*77c1e3ccSAndroid Build Coastguard Worker }
70*77c1e3ccSAndroid Build Coastguard Worker }
71*77c1e3ccSAndroid Build Coastguard Worker
assertFaster(int ref_elapsed_time,int elapsed_time)72*77c1e3ccSAndroid Build Coastguard Worker static void assertFaster(int ref_elapsed_time, int elapsed_time) {
73*77c1e3ccSAndroid Build Coastguard Worker EXPECT_GT(ref_elapsed_time, elapsed_time)
74*77c1e3ccSAndroid Build Coastguard Worker << "Error: CFLSubtractSpeedTest, SIMD slower than C." << std::endl
75*77c1e3ccSAndroid Build Coastguard Worker << "C time: " << ref_elapsed_time << " us" << std::endl
76*77c1e3ccSAndroid Build Coastguard Worker << "SIMD time: " << elapsed_time << " us" << std::endl;
77*77c1e3ccSAndroid Build Coastguard Worker }
78*77c1e3ccSAndroid Build Coastguard Worker
printSpeed(int ref_elapsed_time,int elapsed_time,int width,int height)79*77c1e3ccSAndroid Build Coastguard Worker static void printSpeed(int ref_elapsed_time, int elapsed_time, int width,
80*77c1e3ccSAndroid Build Coastguard Worker int height) {
81*77c1e3ccSAndroid Build Coastguard Worker std::cout.precision(2);
82*77c1e3ccSAndroid Build Coastguard Worker std::cout << "[ ] " << width << "x" << height
83*77c1e3ccSAndroid Build Coastguard Worker << ": C time = " << ref_elapsed_time
84*77c1e3ccSAndroid Build Coastguard Worker << " us, SIMD time = " << elapsed_time << " us"
85*77c1e3ccSAndroid Build Coastguard Worker << " (~" << ref_elapsed_time / (double)elapsed_time << "x) "
86*77c1e3ccSAndroid Build Coastguard Worker << std::endl;
87*77c1e3ccSAndroid Build Coastguard Worker }
88*77c1e3ccSAndroid Build Coastguard Worker
89*77c1e3ccSAndroid Build Coastguard Worker class CFLTest {
90*77c1e3ccSAndroid Build Coastguard Worker public:
91*77c1e3ccSAndroid Build Coastguard Worker virtual ~CFLTest() = default;
init(TX_SIZE tx)92*77c1e3ccSAndroid Build Coastguard Worker void init(TX_SIZE tx) {
93*77c1e3ccSAndroid Build Coastguard Worker tx_size = tx;
94*77c1e3ccSAndroid Build Coastguard Worker width = tx_size_wide[tx_size];
95*77c1e3ccSAndroid Build Coastguard Worker height = tx_size_high[tx_size];
96*77c1e3ccSAndroid Build Coastguard Worker rnd.Reset(ACMRandom::DeterministicSeed());
97*77c1e3ccSAndroid Build Coastguard Worker }
98*77c1e3ccSAndroid Build Coastguard Worker
99*77c1e3ccSAndroid Build Coastguard Worker protected:
100*77c1e3ccSAndroid Build Coastguard Worker TX_SIZE tx_size;
101*77c1e3ccSAndroid Build Coastguard Worker int width;
102*77c1e3ccSAndroid Build Coastguard Worker int height;
103*77c1e3ccSAndroid Build Coastguard Worker ACMRandom rnd;
104*77c1e3ccSAndroid Build Coastguard Worker };
105*77c1e3ccSAndroid Build Coastguard Worker
106*77c1e3ccSAndroid Build Coastguard Worker template <typename I>
107*77c1e3ccSAndroid Build Coastguard Worker class CFLTestWithData : public CFLTest {
108*77c1e3ccSAndroid Build Coastguard Worker public:
109*77c1e3ccSAndroid Build Coastguard Worker ~CFLTestWithData() override = default;
110*77c1e3ccSAndroid Build Coastguard Worker
111*77c1e3ccSAndroid Build Coastguard Worker protected:
112*77c1e3ccSAndroid Build Coastguard Worker I data[CFL_BUF_SQUARE];
113*77c1e3ccSAndroid Build Coastguard Worker I data_ref[CFL_BUF_SQUARE];
randData(I (ACMRandom::* random)())114*77c1e3ccSAndroid Build Coastguard Worker void randData(I (ACMRandom::*random)()) {
115*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < this->height; j++) {
116*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < this->width; i++) {
117*77c1e3ccSAndroid Build Coastguard Worker const I d = (this->rnd.*random)();
118*77c1e3ccSAndroid Build Coastguard Worker data[j * CFL_BUF_LINE + i] = d;
119*77c1e3ccSAndroid Build Coastguard Worker data_ref[j * CFL_BUF_LINE + i] = d;
120*77c1e3ccSAndroid Build Coastguard Worker }
121*77c1e3ccSAndroid Build Coastguard Worker }
122*77c1e3ccSAndroid Build Coastguard Worker }
123*77c1e3ccSAndroid Build Coastguard Worker };
124*77c1e3ccSAndroid Build Coastguard Worker
125*77c1e3ccSAndroid Build Coastguard Worker template <typename I>
126*77c1e3ccSAndroid Build Coastguard Worker class CFLTestWithAlignedData : public CFLTest {
127*77c1e3ccSAndroid Build Coastguard Worker public:
~CFLTestWithAlignedData()128*77c1e3ccSAndroid Build Coastguard Worker ~CFLTestWithAlignedData() override {
129*77c1e3ccSAndroid Build Coastguard Worker aom_free(chroma_pels_ref);
130*77c1e3ccSAndroid Build Coastguard Worker aom_free(sub_luma_pels_ref);
131*77c1e3ccSAndroid Build Coastguard Worker aom_free(chroma_pels);
132*77c1e3ccSAndroid Build Coastguard Worker aom_free(sub_luma_pels);
133*77c1e3ccSAndroid Build Coastguard Worker }
134*77c1e3ccSAndroid Build Coastguard Worker
135*77c1e3ccSAndroid Build Coastguard Worker protected:
init()136*77c1e3ccSAndroid Build Coastguard Worker void init() {
137*77c1e3ccSAndroid Build Coastguard Worker chroma_pels_ref =
138*77c1e3ccSAndroid Build Coastguard Worker reinterpret_cast<I *>(aom_memalign(32, sizeof(I) * CFL_BUF_SQUARE));
139*77c1e3ccSAndroid Build Coastguard Worker ASSERT_NE(chroma_pels_ref, nullptr);
140*77c1e3ccSAndroid Build Coastguard Worker chroma_pels =
141*77c1e3ccSAndroid Build Coastguard Worker reinterpret_cast<I *>(aom_memalign(32, sizeof(I) * CFL_BUF_SQUARE));
142*77c1e3ccSAndroid Build Coastguard Worker ASSERT_NE(chroma_pels, nullptr);
143*77c1e3ccSAndroid Build Coastguard Worker sub_luma_pels_ref = reinterpret_cast<int16_t *>(
144*77c1e3ccSAndroid Build Coastguard Worker aom_memalign(32, sizeof(int16_t) * CFL_BUF_SQUARE));
145*77c1e3ccSAndroid Build Coastguard Worker ASSERT_NE(sub_luma_pels_ref, nullptr);
146*77c1e3ccSAndroid Build Coastguard Worker sub_luma_pels = reinterpret_cast<int16_t *>(
147*77c1e3ccSAndroid Build Coastguard Worker aom_memalign(32, sizeof(int16_t) * CFL_BUF_SQUARE));
148*77c1e3ccSAndroid Build Coastguard Worker ASSERT_NE(sub_luma_pels, nullptr);
149*77c1e3ccSAndroid Build Coastguard Worker memset(chroma_pels_ref, 0, sizeof(I) * CFL_BUF_SQUARE);
150*77c1e3ccSAndroid Build Coastguard Worker memset(chroma_pels, 0, sizeof(I) * CFL_BUF_SQUARE);
151*77c1e3ccSAndroid Build Coastguard Worker memset(sub_luma_pels_ref, 0, sizeof(int16_t) * CFL_BUF_SQUARE);
152*77c1e3ccSAndroid Build Coastguard Worker memset(sub_luma_pels, 0, sizeof(int16_t) * CFL_BUF_SQUARE);
153*77c1e3ccSAndroid Build Coastguard Worker }
154*77c1e3ccSAndroid Build Coastguard Worker
155*77c1e3ccSAndroid Build Coastguard Worker I *chroma_pels_ref;
156*77c1e3ccSAndroid Build Coastguard Worker I *chroma_pels;
157*77c1e3ccSAndroid Build Coastguard Worker int16_t *sub_luma_pels_ref;
158*77c1e3ccSAndroid Build Coastguard Worker int16_t *sub_luma_pels;
159*77c1e3ccSAndroid Build Coastguard Worker int alpha_q3;
160*77c1e3ccSAndroid Build Coastguard Worker I dc;
randData(int bd)161*77c1e3ccSAndroid Build Coastguard Worker void randData(int bd) {
162*77c1e3ccSAndroid Build Coastguard Worker alpha_q3 = this->rnd(33) - 16;
163*77c1e3ccSAndroid Build Coastguard Worker dc = this->rnd(1 << bd);
164*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < this->height; j++) {
165*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < this->width; i++) {
166*77c1e3ccSAndroid Build Coastguard Worker chroma_pels[j * CFL_BUF_LINE + i] = dc;
167*77c1e3ccSAndroid Build Coastguard Worker chroma_pels_ref[j * CFL_BUF_LINE + i] = dc;
168*77c1e3ccSAndroid Build Coastguard Worker sub_luma_pels_ref[j * CFL_BUF_LINE + i] =
169*77c1e3ccSAndroid Build Coastguard Worker sub_luma_pels[j * CFL_BUF_LINE + i] = this->rnd(1 << (bd + 3));
170*77c1e3ccSAndroid Build Coastguard Worker }
171*77c1e3ccSAndroid Build Coastguard Worker }
172*77c1e3ccSAndroid Build Coastguard Worker }
173*77c1e3ccSAndroid Build Coastguard Worker };
174*77c1e3ccSAndroid Build Coastguard Worker
175*77c1e3ccSAndroid Build Coastguard Worker typedef cfl_subtract_average_fn (*sub_avg_fn)(TX_SIZE tx_size);
176*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<TX_SIZE, sub_avg_fn> sub_avg_param;
177*77c1e3ccSAndroid Build Coastguard Worker class CFLSubAvgTest : public ::testing::TestWithParam<sub_avg_param>,
178*77c1e3ccSAndroid Build Coastguard Worker public CFLTestWithData<int16_t> {
179*77c1e3ccSAndroid Build Coastguard Worker public:
SetUp()180*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
181*77c1e3ccSAndroid Build Coastguard Worker CFLTest::init(std::get<0>(this->GetParam()));
182*77c1e3ccSAndroid Build Coastguard Worker sub_avg = std::get<1>(this->GetParam())(tx_size);
183*77c1e3ccSAndroid Build Coastguard Worker sub_avg_ref = cfl_get_subtract_average_fn_c(tx_size);
184*77c1e3ccSAndroid Build Coastguard Worker }
185*77c1e3ccSAndroid Build Coastguard Worker ~CFLSubAvgTest() override = default;
186*77c1e3ccSAndroid Build Coastguard Worker
187*77c1e3ccSAndroid Build Coastguard Worker protected:
188*77c1e3ccSAndroid Build Coastguard Worker cfl_subtract_average_fn sub_avg;
189*77c1e3ccSAndroid Build Coastguard Worker cfl_subtract_average_fn sub_avg_ref;
190*77c1e3ccSAndroid Build Coastguard Worker };
191*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CFLSubAvgTest);
192*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubAvgTest,SubAvgTest)193*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubAvgTest, SubAvgTest) {
194*77c1e3ccSAndroid Build Coastguard Worker for (int it = 0; it < NUM_ITERATIONS; it++) {
195*77c1e3ccSAndroid Build Coastguard Worker randData(&ACMRandom::Rand15);
196*77c1e3ccSAndroid Build Coastguard Worker sub_avg((uint16_t *)data, data);
197*77c1e3ccSAndroid Build Coastguard Worker sub_avg_ref((uint16_t *)data_ref, data_ref);
198*77c1e3ccSAndroid Build Coastguard Worker assert_eq<int16_t>(data, data_ref, width, height);
199*77c1e3ccSAndroid Build Coastguard Worker }
200*77c1e3ccSAndroid Build Coastguard Worker }
201*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubAvgTest,DISABLED_SubAvgSpeedTest)202*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubAvgTest, DISABLED_SubAvgSpeedTest) {
203*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer ref_timer;
204*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer timer;
205*77c1e3ccSAndroid Build Coastguard Worker randData(&ACMRandom::Rand15);
206*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&ref_timer);
207*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
208*77c1e3ccSAndroid Build Coastguard Worker sub_avg_ref((uint16_t *)data_ref, data_ref);
209*77c1e3ccSAndroid Build Coastguard Worker }
210*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&ref_timer);
211*77c1e3ccSAndroid Build Coastguard Worker int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer);
212*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&timer);
213*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
214*77c1e3ccSAndroid Build Coastguard Worker sub_avg((uint16_t *)data, data);
215*77c1e3ccSAndroid Build Coastguard Worker }
216*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&timer);
217*77c1e3ccSAndroid Build Coastguard Worker int elapsed_time = (int)aom_usec_timer_elapsed(&timer);
218*77c1e3ccSAndroid Build Coastguard Worker printSpeed(ref_elapsed_time, elapsed_time, width, height);
219*77c1e3ccSAndroid Build Coastguard Worker assertFaster(ref_elapsed_time, elapsed_time);
220*77c1e3ccSAndroid Build Coastguard Worker }
221*77c1e3ccSAndroid Build Coastguard Worker
222*77c1e3ccSAndroid Build Coastguard Worker template <typename S, typename T, typename I>
223*77c1e3ccSAndroid Build Coastguard Worker class CFLSubsampleTest : public ::testing::TestWithParam<S>,
224*77c1e3ccSAndroid Build Coastguard Worker public CFLTestWithData<I> {
225*77c1e3ccSAndroid Build Coastguard Worker public:
SetUp()226*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
227*77c1e3ccSAndroid Build Coastguard Worker CFLTest::init(std::get<0>(this->GetParam()));
228*77c1e3ccSAndroid Build Coastguard Worker fun_420 = std::get<1>(this->GetParam())(this->tx_size);
229*77c1e3ccSAndroid Build Coastguard Worker fun_422 = std::get<2>(this->GetParam())(this->tx_size);
230*77c1e3ccSAndroid Build Coastguard Worker fun_444 = std::get<3>(this->GetParam())(this->tx_size);
231*77c1e3ccSAndroid Build Coastguard Worker }
232*77c1e3ccSAndroid Build Coastguard Worker
233*77c1e3ccSAndroid Build Coastguard Worker protected:
234*77c1e3ccSAndroid Build Coastguard Worker T fun_420;
235*77c1e3ccSAndroid Build Coastguard Worker T fun_422;
236*77c1e3ccSAndroid Build Coastguard Worker T fun_444;
237*77c1e3ccSAndroid Build Coastguard Worker T fun_420_ref;
238*77c1e3ccSAndroid Build Coastguard Worker T fun_422_ref;
239*77c1e3ccSAndroid Build Coastguard Worker T fun_444_ref;
240*77c1e3ccSAndroid Build Coastguard Worker
subsampleTest(T fun,T fun_ref,int sub_width,int sub_height,I (ACMRandom::* random)())241*77c1e3ccSAndroid Build Coastguard Worker void subsampleTest(T fun, T fun_ref, int sub_width, int sub_height,
242*77c1e3ccSAndroid Build Coastguard Worker I (ACMRandom::*random)()) {
243*77c1e3ccSAndroid Build Coastguard Worker uint16_t sub_luma_pels[CFL_BUF_SQUARE];
244*77c1e3ccSAndroid Build Coastguard Worker uint16_t sub_luma_pels_ref[CFL_BUF_SQUARE];
245*77c1e3ccSAndroid Build Coastguard Worker
246*77c1e3ccSAndroid Build Coastguard Worker for (int it = 0; it < NUM_ITERATIONS; it++) {
247*77c1e3ccSAndroid Build Coastguard Worker CFLTestWithData<I>::randData(random);
248*77c1e3ccSAndroid Build Coastguard Worker fun(this->data, CFL_BUF_LINE, sub_luma_pels);
249*77c1e3ccSAndroid Build Coastguard Worker fun_ref(this->data_ref, CFL_BUF_LINE, sub_luma_pels_ref);
250*77c1e3ccSAndroid Build Coastguard Worker assert_eq<uint16_t>(sub_luma_pels, sub_luma_pels_ref, sub_width,
251*77c1e3ccSAndroid Build Coastguard Worker sub_height);
252*77c1e3ccSAndroid Build Coastguard Worker }
253*77c1e3ccSAndroid Build Coastguard Worker }
254*77c1e3ccSAndroid Build Coastguard Worker
subsampleSpeedTest(T fun,T fun_ref,I (ACMRandom::* random)())255*77c1e3ccSAndroid Build Coastguard Worker void subsampleSpeedTest(T fun, T fun_ref, I (ACMRandom::*random)()) {
256*77c1e3ccSAndroid Build Coastguard Worker uint16_t sub_luma_pels[CFL_BUF_SQUARE];
257*77c1e3ccSAndroid Build Coastguard Worker uint16_t sub_luma_pels_ref[CFL_BUF_SQUARE];
258*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer ref_timer;
259*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer timer;
260*77c1e3ccSAndroid Build Coastguard Worker
261*77c1e3ccSAndroid Build Coastguard Worker CFLTestWithData<I>::randData(random);
262*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&ref_timer);
263*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
264*77c1e3ccSAndroid Build Coastguard Worker fun_ref(this->data_ref, CFL_BUF_LINE, sub_luma_pels);
265*77c1e3ccSAndroid Build Coastguard Worker }
266*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&ref_timer);
267*77c1e3ccSAndroid Build Coastguard Worker int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer);
268*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&timer);
269*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
270*77c1e3ccSAndroid Build Coastguard Worker fun(this->data, CFL_BUF_LINE, sub_luma_pels_ref);
271*77c1e3ccSAndroid Build Coastguard Worker }
272*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&timer);
273*77c1e3ccSAndroid Build Coastguard Worker int elapsed_time = (int)aom_usec_timer_elapsed(&timer);
274*77c1e3ccSAndroid Build Coastguard Worker printSpeed(ref_elapsed_time, elapsed_time, this->width, this->height);
275*77c1e3ccSAndroid Build Coastguard Worker assertFaster(ref_elapsed_time, elapsed_time);
276*77c1e3ccSAndroid Build Coastguard Worker }
277*77c1e3ccSAndroid Build Coastguard Worker };
278*77c1e3ccSAndroid Build Coastguard Worker
279*77c1e3ccSAndroid Build Coastguard Worker typedef cfl_subsample_lbd_fn (*get_subsample_lbd_fn)(TX_SIZE tx_size);
280*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<TX_SIZE, get_subsample_lbd_fn, get_subsample_lbd_fn,
281*77c1e3ccSAndroid Build Coastguard Worker get_subsample_lbd_fn>
282*77c1e3ccSAndroid Build Coastguard Worker subsample_lbd_param;
283*77c1e3ccSAndroid Build Coastguard Worker class CFLSubsampleLBDTest
284*77c1e3ccSAndroid Build Coastguard Worker : public CFLSubsampleTest<subsample_lbd_param, cfl_subsample_lbd_fn,
285*77c1e3ccSAndroid Build Coastguard Worker uint8_t> {
286*77c1e3ccSAndroid Build Coastguard Worker public:
287*77c1e3ccSAndroid Build Coastguard Worker ~CFLSubsampleLBDTest() override = default;
SetUp()288*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
289*77c1e3ccSAndroid Build Coastguard Worker CFLSubsampleTest::SetUp();
290*77c1e3ccSAndroid Build Coastguard Worker fun_420_ref = cfl_get_luma_subsampling_420_lbd_c(tx_size);
291*77c1e3ccSAndroid Build Coastguard Worker fun_422_ref = cfl_get_luma_subsampling_422_lbd_c(tx_size);
292*77c1e3ccSAndroid Build Coastguard Worker fun_444_ref = cfl_get_luma_subsampling_444_lbd_c(tx_size);
293*77c1e3ccSAndroid Build Coastguard Worker }
294*77c1e3ccSAndroid Build Coastguard Worker };
295*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CFLSubsampleLBDTest);
296*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,SubsampleLBD420Test)297*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, SubsampleLBD420Test) {
298*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_420, fun_420_ref, width >> 1, height >> 1,
299*77c1e3ccSAndroid Build Coastguard Worker &ACMRandom::Rand8);
300*77c1e3ccSAndroid Build Coastguard Worker }
301*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,DISABLED_SubsampleLBD420SpeedTest)302*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD420SpeedTest) {
303*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_420, fun_420_ref, &ACMRandom::Rand8);
304*77c1e3ccSAndroid Build Coastguard Worker }
305*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,SubsampleLBD422Test)306*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, SubsampleLBD422Test) {
307*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_422, fun_422_ref, width >> 1, height, &ACMRandom::Rand8);
308*77c1e3ccSAndroid Build Coastguard Worker }
309*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,DISABLED_SubsampleLBD422SpeedTest)310*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD422SpeedTest) {
311*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_422, fun_422_ref, &ACMRandom::Rand8);
312*77c1e3ccSAndroid Build Coastguard Worker }
313*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,SubsampleLBD444Test)314*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, SubsampleLBD444Test) {
315*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_444, fun_444_ref, width, height, &ACMRandom::Rand8);
316*77c1e3ccSAndroid Build Coastguard Worker }
317*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleLBDTest,DISABLED_SubsampleLBD444SpeedTest)318*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleLBDTest, DISABLED_SubsampleLBD444SpeedTest) {
319*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_444, fun_444_ref, &ACMRandom::Rand8);
320*77c1e3ccSAndroid Build Coastguard Worker }
321*77c1e3ccSAndroid Build Coastguard Worker
322*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
323*77c1e3ccSAndroid Build Coastguard Worker typedef cfl_subsample_hbd_fn (*get_subsample_hbd_fn)(TX_SIZE tx_size);
324*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<TX_SIZE, get_subsample_hbd_fn, get_subsample_hbd_fn,
325*77c1e3ccSAndroid Build Coastguard Worker get_subsample_hbd_fn>
326*77c1e3ccSAndroid Build Coastguard Worker subsample_hbd_param;
327*77c1e3ccSAndroid Build Coastguard Worker class CFLSubsampleHBDTest
328*77c1e3ccSAndroid Build Coastguard Worker : public CFLSubsampleTest<subsample_hbd_param, cfl_subsample_hbd_fn,
329*77c1e3ccSAndroid Build Coastguard Worker uint16_t> {
330*77c1e3ccSAndroid Build Coastguard Worker public:
331*77c1e3ccSAndroid Build Coastguard Worker ~CFLSubsampleHBDTest() override = default;
SetUp()332*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
333*77c1e3ccSAndroid Build Coastguard Worker CFLSubsampleTest::SetUp();
334*77c1e3ccSAndroid Build Coastguard Worker fun_420_ref = cfl_get_luma_subsampling_420_hbd_c(tx_size);
335*77c1e3ccSAndroid Build Coastguard Worker fun_422_ref = cfl_get_luma_subsampling_422_hbd_c(tx_size);
336*77c1e3ccSAndroid Build Coastguard Worker fun_444_ref = cfl_get_luma_subsampling_444_hbd_c(tx_size);
337*77c1e3ccSAndroid Build Coastguard Worker }
338*77c1e3ccSAndroid Build Coastguard Worker };
339*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CFLSubsampleHBDTest);
340*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,SubsampleHBD420Test)341*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, SubsampleHBD420Test) {
342*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_420, fun_420_ref, width >> 1, height >> 1,
343*77c1e3ccSAndroid Build Coastguard Worker &ACMRandom::Rand12);
344*77c1e3ccSAndroid Build Coastguard Worker }
345*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,DISABLED_SubsampleHBD420SpeedTest)346*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD420SpeedTest) {
347*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_420, fun_420_ref, &ACMRandom::Rand12);
348*77c1e3ccSAndroid Build Coastguard Worker }
349*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,SubsampleHBD422Test)350*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, SubsampleHBD422Test) {
351*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_422, fun_422_ref, width >> 1, height, &ACMRandom::Rand12);
352*77c1e3ccSAndroid Build Coastguard Worker }
353*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,DISABLED_SubsampleHBD422SpeedTest)354*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD422SpeedTest) {
355*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_422, fun_422_ref, &ACMRandom::Rand12);
356*77c1e3ccSAndroid Build Coastguard Worker }
357*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,SubsampleHBD444Test)358*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, SubsampleHBD444Test) {
359*77c1e3ccSAndroid Build Coastguard Worker subsampleTest(fun_444, fun_444_ref, width, height, &ACMRandom::Rand12);
360*77c1e3ccSAndroid Build Coastguard Worker }
361*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLSubsampleHBDTest,DISABLED_SubsampleHBD444SpeedTest)362*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLSubsampleHBDTest, DISABLED_SubsampleHBD444SpeedTest) {
363*77c1e3ccSAndroid Build Coastguard Worker subsampleSpeedTest(fun_444, fun_444_ref, &ACMRandom::Rand12);
364*77c1e3ccSAndroid Build Coastguard Worker }
365*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
366*77c1e3ccSAndroid Build Coastguard Worker
367*77c1e3ccSAndroid Build Coastguard Worker typedef cfl_predict_lbd_fn (*get_predict_fn)(TX_SIZE tx_size);
368*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<TX_SIZE, get_predict_fn> predict_param;
369*77c1e3ccSAndroid Build Coastguard Worker class CFLPredictTest : public ::testing::TestWithParam<predict_param>,
370*77c1e3ccSAndroid Build Coastguard Worker public CFLTestWithAlignedData<uint8_t> {
371*77c1e3ccSAndroid Build Coastguard Worker public:
SetUp()372*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
373*77c1e3ccSAndroid Build Coastguard Worker CFLTest::init(std::get<0>(this->GetParam()));
374*77c1e3ccSAndroid Build Coastguard Worker CFLTestWithAlignedData::init();
375*77c1e3ccSAndroid Build Coastguard Worker predict = std::get<1>(this->GetParam())(tx_size);
376*77c1e3ccSAndroid Build Coastguard Worker predict_ref = cfl_get_predict_lbd_fn_c(tx_size);
377*77c1e3ccSAndroid Build Coastguard Worker }
378*77c1e3ccSAndroid Build Coastguard Worker ~CFLPredictTest() override = default;
379*77c1e3ccSAndroid Build Coastguard Worker
380*77c1e3ccSAndroid Build Coastguard Worker protected:
381*77c1e3ccSAndroid Build Coastguard Worker cfl_predict_lbd_fn predict;
382*77c1e3ccSAndroid Build Coastguard Worker cfl_predict_lbd_fn predict_ref;
383*77c1e3ccSAndroid Build Coastguard Worker };
384*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CFLPredictTest);
385*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLPredictTest,PredictTest)386*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLPredictTest, PredictTest) {
387*77c1e3ccSAndroid Build Coastguard Worker for (int it = 0; it < NUM_ITERATIONS; it++) {
388*77c1e3ccSAndroid Build Coastguard Worker randData(8);
389*77c1e3ccSAndroid Build Coastguard Worker predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3);
390*77c1e3ccSAndroid Build Coastguard Worker predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3);
391*77c1e3ccSAndroid Build Coastguard Worker assert_eq<uint8_t>(chroma_pels, chroma_pels_ref, width, height);
392*77c1e3ccSAndroid Build Coastguard Worker }
393*77c1e3ccSAndroid Build Coastguard Worker }
TEST_P(CFLPredictTest,DISABLED_PredictSpeedTest)394*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLPredictTest, DISABLED_PredictSpeedTest) {
395*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer ref_timer;
396*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer timer;
397*77c1e3ccSAndroid Build Coastguard Worker randData(8);
398*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&ref_timer);
399*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
400*77c1e3ccSAndroid Build Coastguard Worker predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3);
401*77c1e3ccSAndroid Build Coastguard Worker }
402*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&ref_timer);
403*77c1e3ccSAndroid Build Coastguard Worker int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer);
404*77c1e3ccSAndroid Build Coastguard Worker
405*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&timer);
406*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
407*77c1e3ccSAndroid Build Coastguard Worker predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3);
408*77c1e3ccSAndroid Build Coastguard Worker }
409*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&timer);
410*77c1e3ccSAndroid Build Coastguard Worker int elapsed_time = (int)aom_usec_timer_elapsed(&timer);
411*77c1e3ccSAndroid Build Coastguard Worker printSpeed(ref_elapsed_time, elapsed_time, width, height);
412*77c1e3ccSAndroid Build Coastguard Worker assertFaster(ref_elapsed_time, elapsed_time);
413*77c1e3ccSAndroid Build Coastguard Worker }
414*77c1e3ccSAndroid Build Coastguard Worker
415*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
416*77c1e3ccSAndroid Build Coastguard Worker typedef cfl_predict_hbd_fn (*get_predict_fn_hbd)(TX_SIZE tx_size);
417*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<TX_SIZE, get_predict_fn_hbd> predict_param_hbd;
418*77c1e3ccSAndroid Build Coastguard Worker class CFLPredictHBDTest : public ::testing::TestWithParam<predict_param_hbd>,
419*77c1e3ccSAndroid Build Coastguard Worker public CFLTestWithAlignedData<uint16_t> {
420*77c1e3ccSAndroid Build Coastguard Worker public:
SetUp()421*77c1e3ccSAndroid Build Coastguard Worker void SetUp() override {
422*77c1e3ccSAndroid Build Coastguard Worker CFLTest::init(std::get<0>(this->GetParam()));
423*77c1e3ccSAndroid Build Coastguard Worker CFLTestWithAlignedData::init();
424*77c1e3ccSAndroid Build Coastguard Worker predict = std::get<1>(this->GetParam())(tx_size);
425*77c1e3ccSAndroid Build Coastguard Worker predict_ref = cfl_get_predict_hbd_fn_c(tx_size);
426*77c1e3ccSAndroid Build Coastguard Worker }
427*77c1e3ccSAndroid Build Coastguard Worker ~CFLPredictHBDTest() override = default;
428*77c1e3ccSAndroid Build Coastguard Worker
429*77c1e3ccSAndroid Build Coastguard Worker protected:
430*77c1e3ccSAndroid Build Coastguard Worker cfl_predict_hbd_fn predict;
431*77c1e3ccSAndroid Build Coastguard Worker cfl_predict_hbd_fn predict_ref;
432*77c1e3ccSAndroid Build Coastguard Worker };
433*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CFLPredictHBDTest);
434*77c1e3ccSAndroid Build Coastguard Worker
TEST_P(CFLPredictHBDTest,PredictHBDTest)435*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLPredictHBDTest, PredictHBDTest) {
436*77c1e3ccSAndroid Build Coastguard Worker int bd = 12;
437*77c1e3ccSAndroid Build Coastguard Worker for (int it = 0; it < NUM_ITERATIONS; it++) {
438*77c1e3ccSAndroid Build Coastguard Worker randData(bd);
439*77c1e3ccSAndroid Build Coastguard Worker predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3, bd);
440*77c1e3ccSAndroid Build Coastguard Worker predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3, bd);
441*77c1e3ccSAndroid Build Coastguard Worker assert_eq<uint16_t>(chroma_pels, chroma_pels_ref, width, height);
442*77c1e3ccSAndroid Build Coastguard Worker }
443*77c1e3ccSAndroid Build Coastguard Worker }
TEST_P(CFLPredictHBDTest,DISABLED_PredictHBDSpeedTest)444*77c1e3ccSAndroid Build Coastguard Worker TEST_P(CFLPredictHBDTest, DISABLED_PredictHBDSpeedTest) {
445*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer ref_timer;
446*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer timer;
447*77c1e3ccSAndroid Build Coastguard Worker const int bd = 12;
448*77c1e3ccSAndroid Build Coastguard Worker randData(bd);
449*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&ref_timer);
450*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
451*77c1e3ccSAndroid Build Coastguard Worker predict_ref(sub_luma_pels_ref, chroma_pels_ref, CFL_BUF_LINE, alpha_q3, bd);
452*77c1e3ccSAndroid Build Coastguard Worker }
453*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&ref_timer);
454*77c1e3ccSAndroid Build Coastguard Worker int ref_elapsed_time = (int)aom_usec_timer_elapsed(&ref_timer);
455*77c1e3ccSAndroid Build Coastguard Worker
456*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_start(&timer);
457*77c1e3ccSAndroid Build Coastguard Worker for (int k = 0; k < NUM_ITERATIONS_SPEED; k++) {
458*77c1e3ccSAndroid Build Coastguard Worker predict(sub_luma_pels, chroma_pels, CFL_BUF_LINE, alpha_q3, bd);
459*77c1e3ccSAndroid Build Coastguard Worker }
460*77c1e3ccSAndroid Build Coastguard Worker aom_usec_timer_mark(&timer);
461*77c1e3ccSAndroid Build Coastguard Worker int elapsed_time = (int)aom_usec_timer_elapsed(&timer);
462*77c1e3ccSAndroid Build Coastguard Worker printSpeed(ref_elapsed_time, elapsed_time, width, height);
463*77c1e3ccSAndroid Build Coastguard Worker assertFaster(ref_elapsed_time, elapsed_time);
464*77c1e3ccSAndroid Build Coastguard Worker }
465*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
466*77c1e3ccSAndroid Build Coastguard Worker
467*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_SSE2
468*77c1e3ccSAndroid Build Coastguard Worker const sub_avg_param sub_avg_sizes_sse2[] = { ALL_CFL_TX_SIZES(
469*77c1e3ccSAndroid Build Coastguard Worker cfl_get_subtract_average_fn_sse2) };
470*77c1e3ccSAndroid Build Coastguard Worker
471*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSE2, CFLSubAvgTest,
472*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(sub_avg_sizes_sse2));
473*77c1e3ccSAndroid Build Coastguard Worker
474*77c1e3ccSAndroid Build Coastguard Worker #endif
475*77c1e3ccSAndroid Build Coastguard Worker
476*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_SSSE3
477*77c1e3ccSAndroid Build Coastguard Worker const subsample_lbd_param subsample_lbd_sizes_ssse3[] = {
478*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_ssse3,
479*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_lbd_ssse3,
480*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_lbd_ssse3)
481*77c1e3ccSAndroid Build Coastguard Worker };
482*77c1e3ccSAndroid Build Coastguard Worker
483*77c1e3ccSAndroid Build Coastguard Worker const predict_param predict_sizes_ssse3[] = { ALL_CFL_TX_SIZES(
484*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_lbd_fn_ssse3) };
485*77c1e3ccSAndroid Build Coastguard Worker
486*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, CFLSubsampleLBDTest,
487*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_lbd_sizes_ssse3));
488*77c1e3ccSAndroid Build Coastguard Worker
489*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, CFLPredictTest,
490*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_ssse3));
491*77c1e3ccSAndroid Build Coastguard Worker
492*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
493*77c1e3ccSAndroid Build Coastguard Worker const subsample_hbd_param subsample_hbd_sizes_ssse3[] = {
494*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_ssse3,
495*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_hbd_ssse3,
496*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_hbd_ssse3)
497*77c1e3ccSAndroid Build Coastguard Worker };
498*77c1e3ccSAndroid Build Coastguard Worker
499*77c1e3ccSAndroid Build Coastguard Worker const predict_param_hbd predict_sizes_hbd_ssse3[] = { ALL_CFL_TX_SIZES(
500*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_hbd_fn_ssse3) };
501*77c1e3ccSAndroid Build Coastguard Worker
502*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, CFLSubsampleHBDTest,
503*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_hbd_sizes_ssse3));
504*77c1e3ccSAndroid Build Coastguard Worker
505*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SSSE3, CFLPredictHBDTest,
506*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_hbd_ssse3));
507*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
508*77c1e3ccSAndroid Build Coastguard Worker #endif // HAVE_SSSE3
509*77c1e3ccSAndroid Build Coastguard Worker
510*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_AVX2
511*77c1e3ccSAndroid Build Coastguard Worker const sub_avg_param sub_avg_sizes_avx2[] = { ALL_CFL_TX_SIZES(
512*77c1e3ccSAndroid Build Coastguard Worker cfl_get_subtract_average_fn_avx2) };
513*77c1e3ccSAndroid Build Coastguard Worker
514*77c1e3ccSAndroid Build Coastguard Worker const subsample_lbd_param subsample_lbd_sizes_avx2[] = {
515*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_avx2,
516*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_lbd_avx2,
517*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_lbd_avx2)
518*77c1e3ccSAndroid Build Coastguard Worker };
519*77c1e3ccSAndroid Build Coastguard Worker
520*77c1e3ccSAndroid Build Coastguard Worker const predict_param predict_sizes_avx2[] = { ALL_CFL_TX_SIZES(
521*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_lbd_fn_avx2) };
522*77c1e3ccSAndroid Build Coastguard Worker
523*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CFLSubAvgTest,
524*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(sub_avg_sizes_avx2));
525*77c1e3ccSAndroid Build Coastguard Worker
526*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CFLSubsampleLBDTest,
527*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_lbd_sizes_avx2));
528*77c1e3ccSAndroid Build Coastguard Worker
529*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CFLPredictTest,
530*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_avx2));
531*77c1e3ccSAndroid Build Coastguard Worker
532*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
533*77c1e3ccSAndroid Build Coastguard Worker const subsample_hbd_param subsample_hbd_sizes_avx2[] = {
534*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_avx2,
535*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_hbd_avx2,
536*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_hbd_avx2)
537*77c1e3ccSAndroid Build Coastguard Worker };
538*77c1e3ccSAndroid Build Coastguard Worker
539*77c1e3ccSAndroid Build Coastguard Worker const predict_param_hbd predict_sizes_hbd_avx2[] = { ALL_CFL_TX_SIZES(
540*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_hbd_fn_avx2) };
541*77c1e3ccSAndroid Build Coastguard Worker
542*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CFLSubsampleHBDTest,
543*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_hbd_sizes_avx2));
544*77c1e3ccSAndroid Build Coastguard Worker
545*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(AVX2, CFLPredictHBDTest,
546*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_hbd_avx2));
547*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
548*77c1e3ccSAndroid Build Coastguard Worker #endif // HAVE_AVX2
549*77c1e3ccSAndroid Build Coastguard Worker
550*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_NEON
551*77c1e3ccSAndroid Build Coastguard Worker const sub_avg_param sub_avg_sizes_neon[] = { ALL_CFL_TX_SIZES(
552*77c1e3ccSAndroid Build Coastguard Worker cfl_get_subtract_average_fn_neon) };
553*77c1e3ccSAndroid Build Coastguard Worker
554*77c1e3ccSAndroid Build Coastguard Worker const predict_param predict_sizes_neon[] = { ALL_CFL_TX_SIZES(
555*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_lbd_fn_neon) };
556*77c1e3ccSAndroid Build Coastguard Worker
557*77c1e3ccSAndroid Build Coastguard Worker const subsample_lbd_param subsample_lbd_sizes_neon[] = {
558*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_lbd_neon,
559*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_lbd_neon,
560*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_lbd_neon)
561*77c1e3ccSAndroid Build Coastguard Worker };
562*77c1e3ccSAndroid Build Coastguard Worker
563*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CFLSubAvgTest,
564*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(sub_avg_sizes_neon));
565*77c1e3ccSAndroid Build Coastguard Worker
566*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CFLSubsampleLBDTest,
567*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_lbd_sizes_neon));
568*77c1e3ccSAndroid Build Coastguard Worker
569*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CFLPredictTest,
570*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_neon));
571*77c1e3ccSAndroid Build Coastguard Worker
572*77c1e3ccSAndroid Build Coastguard Worker #if CONFIG_AV1_HIGHBITDEPTH
573*77c1e3ccSAndroid Build Coastguard Worker const subsample_hbd_param subsample_hbd_sizes_neon[] = {
574*77c1e3ccSAndroid Build Coastguard Worker ALL_CFL_TX_SIZES_SUBSAMPLE(cfl_get_luma_subsampling_420_hbd_neon,
575*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_422_hbd_neon,
576*77c1e3ccSAndroid Build Coastguard Worker cfl_get_luma_subsampling_444_hbd_neon)
577*77c1e3ccSAndroid Build Coastguard Worker };
578*77c1e3ccSAndroid Build Coastguard Worker
579*77c1e3ccSAndroid Build Coastguard Worker const predict_param_hbd predict_sizes_hbd_neon[] = { ALL_CFL_TX_SIZES(
580*77c1e3ccSAndroid Build Coastguard Worker cfl_get_predict_hbd_fn_neon) };
581*77c1e3ccSAndroid Build Coastguard Worker
582*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CFLSubsampleHBDTest,
583*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(subsample_hbd_sizes_neon));
584*77c1e3ccSAndroid Build Coastguard Worker
585*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(NEON, CFLPredictHBDTest,
586*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(predict_sizes_hbd_neon));
587*77c1e3ccSAndroid Build Coastguard Worker #endif // CONFIG_AV1_HIGHBITDEPTH
588*77c1e3ccSAndroid Build Coastguard Worker #endif // HAVE_NEON
589*77c1e3ccSAndroid Build Coastguard Worker
590*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_VSX
591*77c1e3ccSAndroid Build Coastguard Worker const sub_avg_param sub_avg_sizes_vsx[] = { ALL_CFL_TX_SIZES(
592*77c1e3ccSAndroid Build Coastguard Worker cfl_get_subtract_average_fn_vsx) };
593*77c1e3ccSAndroid Build Coastguard Worker
594*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(VSX, CFLSubAvgTest,
595*77c1e3ccSAndroid Build Coastguard Worker ::testing::ValuesIn(sub_avg_sizes_vsx));
596*77c1e3ccSAndroid Build Coastguard Worker #endif
597*77c1e3ccSAndroid Build Coastguard Worker } // namespace
598