xref: /aosp_15_r20/external/libaom/test/av1_k_means_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2020, 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 <cstdlib>
13*77c1e3ccSAndroid Build Coastguard Worker #include <new>
14*77c1e3ccSAndroid Build Coastguard Worker #include <tuple>
15*77c1e3ccSAndroid Build Coastguard Worker 
16*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_config.h"
17*77c1e3ccSAndroid Build Coastguard Worker #include "config/av1_rtcd.h"
18*77c1e3ccSAndroid Build Coastguard Worker 
19*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_codec.h"
20*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h"
21*77c1e3ccSAndroid Build Coastguard Worker #include "aom_mem/aom_mem.h"
22*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/aom_timer.h"
23*77c1e3ccSAndroid Build Coastguard Worker #include "aom_ports/mem.h"
24*77c1e3ccSAndroid Build Coastguard Worker #include "av1/encoder/palette.h"
25*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
26*77c1e3ccSAndroid Build Coastguard Worker #include "test/acm_random.h"
27*77c1e3ccSAndroid Build Coastguard Worker #include "test/register_state_check.h"
28*77c1e3ccSAndroid Build Coastguard Worker #include "test/util.h"
29*77c1e3ccSAndroid Build Coastguard Worker 
30*77c1e3ccSAndroid Build Coastguard Worker namespace AV1Kmeans {
31*77c1e3ccSAndroid Build Coastguard Worker typedef void (*av1_calc_indices_dim1_func)(const int16_t *data,
32*77c1e3ccSAndroid Build Coastguard Worker                                            const int16_t *centroids,
33*77c1e3ccSAndroid Build Coastguard Worker                                            uint8_t *indices,
34*77c1e3ccSAndroid Build Coastguard Worker                                            int64_t *total_dist, int n, int k);
35*77c1e3ccSAndroid Build Coastguard Worker typedef void (*av1_calc_indices_dim2_func)(const int16_t *data,
36*77c1e3ccSAndroid Build Coastguard Worker                                            const int16_t *centroids,
37*77c1e3ccSAndroid Build Coastguard Worker                                            uint8_t *indices,
38*77c1e3ccSAndroid Build Coastguard Worker                                            int64_t *total_dist, int n, int k);
39*77c1e3ccSAndroid Build Coastguard Worker 
40*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<av1_calc_indices_dim1_func, BLOCK_SIZE>
41*77c1e3ccSAndroid Build Coastguard Worker     av1_calc_indices_dim1Param;
42*77c1e3ccSAndroid Build Coastguard Worker 
43*77c1e3ccSAndroid Build Coastguard Worker typedef std::tuple<av1_calc_indices_dim2_func, BLOCK_SIZE>
44*77c1e3ccSAndroid Build Coastguard Worker     av1_calc_indices_dim2Param;
45*77c1e3ccSAndroid Build Coastguard Worker 
46*77c1e3ccSAndroid Build Coastguard Worker class AV1KmeansTest1
47*77c1e3ccSAndroid Build Coastguard Worker     : public ::testing::TestWithParam<av1_calc_indices_dim1Param> {
48*77c1e3ccSAndroid Build Coastguard Worker  public:
49*77c1e3ccSAndroid Build Coastguard Worker   ~AV1KmeansTest1() override;
50*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override;
51*77c1e3ccSAndroid Build Coastguard Worker 
52*77c1e3ccSAndroid Build Coastguard Worker  protected:
53*77c1e3ccSAndroid Build Coastguard Worker   void RunCheckOutput(av1_calc_indices_dim1_func test_impl, BLOCK_SIZE bsize,
54*77c1e3ccSAndroid Build Coastguard Worker                       int centroids);
55*77c1e3ccSAndroid Build Coastguard Worker   void RunSpeedTest(av1_calc_indices_dim1_func test_impl, BLOCK_SIZE bsize,
56*77c1e3ccSAndroid Build Coastguard Worker                     int centroids);
CheckResult(int n)57*77c1e3ccSAndroid Build Coastguard Worker   bool CheckResult(int n) {
58*77c1e3ccSAndroid Build Coastguard Worker     for (int idx = 0; idx < n; ++idx) {
59*77c1e3ccSAndroid Build Coastguard Worker       if (indices1_[idx] != indices2_[idx]) {
60*77c1e3ccSAndroid Build Coastguard Worker         printf("%d ", idx);
61*77c1e3ccSAndroid Build Coastguard Worker         printf("%d != %d ", indices1_[idx], indices2_[idx]);
62*77c1e3ccSAndroid Build Coastguard Worker         return false;
63*77c1e3ccSAndroid Build Coastguard Worker       }
64*77c1e3ccSAndroid Build Coastguard Worker     }
65*77c1e3ccSAndroid Build Coastguard Worker     return true;
66*77c1e3ccSAndroid Build Coastguard Worker   }
67*77c1e3ccSAndroid Build Coastguard Worker 
68*77c1e3ccSAndroid Build Coastguard Worker   libaom_test::ACMRandom rnd_;
69*77c1e3ccSAndroid Build Coastguard Worker   int16_t data_[4096];
70*77c1e3ccSAndroid Build Coastguard Worker   int16_t centroids_[8];
71*77c1e3ccSAndroid Build Coastguard Worker   uint8_t indices1_[4096];
72*77c1e3ccSAndroid Build Coastguard Worker   uint8_t indices2_[4096];
73*77c1e3ccSAndroid Build Coastguard Worker };
74*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AV1KmeansTest1);
75*77c1e3ccSAndroid Build Coastguard Worker 
76*77c1e3ccSAndroid Build Coastguard Worker AV1KmeansTest1::~AV1KmeansTest1() = default;
77*77c1e3ccSAndroid Build Coastguard Worker 
SetUp()78*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest1::SetUp() {
79*77c1e3ccSAndroid Build Coastguard Worker   rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed());
80*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 4096; ++i) {
81*77c1e3ccSAndroid Build Coastguard Worker     data_[i] = (int)rnd_.Rand8() << 4;
82*77c1e3ccSAndroid Build Coastguard Worker   }
83*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 8; i++) {
84*77c1e3ccSAndroid Build Coastguard Worker     centroids_[i] = (int)rnd_.Rand8() << 4;
85*77c1e3ccSAndroid Build Coastguard Worker   }
86*77c1e3ccSAndroid Build Coastguard Worker }
87*77c1e3ccSAndroid Build Coastguard Worker 
RunCheckOutput(av1_calc_indices_dim1_func test_impl,BLOCK_SIZE bsize,int k)88*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest1::RunCheckOutput(av1_calc_indices_dim1_func test_impl,
89*77c1e3ccSAndroid Build Coastguard Worker                                     BLOCK_SIZE bsize, int k) {
90*77c1e3ccSAndroid Build Coastguard Worker   const int w = block_size_wide[bsize];
91*77c1e3ccSAndroid Build Coastguard Worker   const int h = block_size_high[bsize];
92*77c1e3ccSAndroid Build Coastguard Worker   const int n = w * h;
93*77c1e3ccSAndroid Build Coastguard Worker   int64_t total_dist_dim1, total_dist_impl;
94*77c1e3ccSAndroid Build Coastguard Worker   av1_calc_indices_dim1_c(data_, centroids_, indices1_, &total_dist_dim1, n, k);
95*77c1e3ccSAndroid Build Coastguard Worker   test_impl(data_, centroids_, indices2_, &total_dist_impl, n, k);
96*77c1e3ccSAndroid Build Coastguard Worker 
97*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(total_dist_dim1, total_dist_impl);
98*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(CheckResult(n), true)
99*77c1e3ccSAndroid Build Coastguard Worker       << " block " << bsize << " index " << n << " Centroids " << k;
100*77c1e3ccSAndroid Build Coastguard Worker }
101*77c1e3ccSAndroid Build Coastguard Worker 
RunSpeedTest(av1_calc_indices_dim1_func test_impl,BLOCK_SIZE bsize,int k)102*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest1::RunSpeedTest(av1_calc_indices_dim1_func test_impl,
103*77c1e3ccSAndroid Build Coastguard Worker                                   BLOCK_SIZE bsize, int k) {
104*77c1e3ccSAndroid Build Coastguard Worker   const int w = block_size_wide[bsize];
105*77c1e3ccSAndroid Build Coastguard Worker   const int h = block_size_high[bsize];
106*77c1e3ccSAndroid Build Coastguard Worker   const int n = w * h;
107*77c1e3ccSAndroid Build Coastguard Worker   const int num_loops = 1000000000 / n;
108*77c1e3ccSAndroid Build Coastguard Worker 
109*77c1e3ccSAndroid Build Coastguard Worker   av1_calc_indices_dim1_func funcs[2] = { av1_calc_indices_dim1_c, test_impl };
110*77c1e3ccSAndroid Build Coastguard Worker   double elapsed_time[2] = { 0 };
111*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
112*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer timer;
113*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_start(&timer);
114*77c1e3ccSAndroid Build Coastguard Worker     av1_calc_indices_dim1_func func = funcs[i];
115*77c1e3ccSAndroid Build Coastguard Worker     for (int j = 0; j < num_loops; ++j) {
116*77c1e3ccSAndroid Build Coastguard Worker       func(data_, centroids_, indices1_, /*total_dist=*/nullptr, n, k);
117*77c1e3ccSAndroid Build Coastguard Worker     }
118*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_mark(&timer);
119*77c1e3ccSAndroid Build Coastguard Worker     double time = static_cast<double>(aom_usec_timer_elapsed(&timer));
120*77c1e3ccSAndroid Build Coastguard Worker     elapsed_time[i] = 1000.0 * time / num_loops;
121*77c1e3ccSAndroid Build Coastguard Worker   }
122*77c1e3ccSAndroid Build Coastguard Worker   printf("av1_calc_indices_dim1 indices= %d centroids=%d: %7.2f/%7.2fns", n, k,
123*77c1e3ccSAndroid Build Coastguard Worker          elapsed_time[0], elapsed_time[1]);
124*77c1e3ccSAndroid Build Coastguard Worker   printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]);
125*77c1e3ccSAndroid Build Coastguard Worker }
126*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(AV1KmeansTest1,CheckOutput)127*77c1e3ccSAndroid Build Coastguard Worker TEST_P(AV1KmeansTest1, CheckOutput) {
128*77c1e3ccSAndroid Build Coastguard Worker   // centroids = 2..8
129*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 2);
130*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 3);
131*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 4);
132*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 5);
133*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 6);
134*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 7);
135*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 8);
136*77c1e3ccSAndroid Build Coastguard Worker }
137*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(AV1KmeansTest1,DISABLED_Speed)138*77c1e3ccSAndroid Build Coastguard Worker TEST_P(AV1KmeansTest1, DISABLED_Speed) {
139*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 2);
140*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 3);
141*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 4);
142*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 5);
143*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 6);
144*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 7);
145*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 8);
146*77c1e3ccSAndroid Build Coastguard Worker }
147*77c1e3ccSAndroid Build Coastguard Worker 
148*77c1e3ccSAndroid Build Coastguard Worker class AV1KmeansTest2
149*77c1e3ccSAndroid Build Coastguard Worker     : public ::testing::TestWithParam<av1_calc_indices_dim2Param> {
150*77c1e3ccSAndroid Build Coastguard Worker  public:
151*77c1e3ccSAndroid Build Coastguard Worker   ~AV1KmeansTest2() override;
152*77c1e3ccSAndroid Build Coastguard Worker   void SetUp() override;
153*77c1e3ccSAndroid Build Coastguard Worker 
154*77c1e3ccSAndroid Build Coastguard Worker  protected:
155*77c1e3ccSAndroid Build Coastguard Worker   void RunCheckOutput(av1_calc_indices_dim2_func test_impl, BLOCK_SIZE bsize,
156*77c1e3ccSAndroid Build Coastguard Worker                       int centroids);
157*77c1e3ccSAndroid Build Coastguard Worker   void RunSpeedTest(av1_calc_indices_dim2_func test_impl, BLOCK_SIZE bsize,
158*77c1e3ccSAndroid Build Coastguard Worker                     int centroids);
CheckResult(int n)159*77c1e3ccSAndroid Build Coastguard Worker   bool CheckResult(int n) {
160*77c1e3ccSAndroid Build Coastguard Worker     bool flag = true;
161*77c1e3ccSAndroid Build Coastguard Worker     for (int idx = 0; idx < n; ++idx) {
162*77c1e3ccSAndroid Build Coastguard Worker       if (indices1_[idx] != indices2_[idx]) {
163*77c1e3ccSAndroid Build Coastguard Worker         printf("%d ", idx);
164*77c1e3ccSAndroid Build Coastguard Worker         printf("%d != %d ", indices1_[idx], indices2_[idx]);
165*77c1e3ccSAndroid Build Coastguard Worker         flag = false;
166*77c1e3ccSAndroid Build Coastguard Worker       }
167*77c1e3ccSAndroid Build Coastguard Worker     }
168*77c1e3ccSAndroid Build Coastguard Worker     if (flag == false) {
169*77c1e3ccSAndroid Build Coastguard Worker       return false;
170*77c1e3ccSAndroid Build Coastguard Worker     }
171*77c1e3ccSAndroid Build Coastguard Worker     return true;
172*77c1e3ccSAndroid Build Coastguard Worker   }
173*77c1e3ccSAndroid Build Coastguard Worker 
174*77c1e3ccSAndroid Build Coastguard Worker   libaom_test::ACMRandom rnd_;
175*77c1e3ccSAndroid Build Coastguard Worker   int16_t data_[4096 * 2];
176*77c1e3ccSAndroid Build Coastguard Worker   int16_t centroids_[8 * 2];
177*77c1e3ccSAndroid Build Coastguard Worker   uint8_t indices1_[4096];
178*77c1e3ccSAndroid Build Coastguard Worker   uint8_t indices2_[4096];
179*77c1e3ccSAndroid Build Coastguard Worker };
180*77c1e3ccSAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AV1KmeansTest2);
181*77c1e3ccSAndroid Build Coastguard Worker 
182*77c1e3ccSAndroid Build Coastguard Worker AV1KmeansTest2::~AV1KmeansTest2() = default;
183*77c1e3ccSAndroid Build Coastguard Worker 
SetUp()184*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest2::SetUp() {
185*77c1e3ccSAndroid Build Coastguard Worker   rnd_.Reset(libaom_test::ACMRandom::DeterministicSeed());
186*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 4096 * 2; ++i) {
187*77c1e3ccSAndroid Build Coastguard Worker     data_[i] = (int)rnd_.Rand8();
188*77c1e3ccSAndroid Build Coastguard Worker   }
189*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 8 * 2; i++) {
190*77c1e3ccSAndroid Build Coastguard Worker     centroids_[i] = (int)rnd_.Rand8();
191*77c1e3ccSAndroid Build Coastguard Worker   }
192*77c1e3ccSAndroid Build Coastguard Worker }
193*77c1e3ccSAndroid Build Coastguard Worker 
RunCheckOutput(av1_calc_indices_dim2_func test_impl,BLOCK_SIZE bsize,int k)194*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest2::RunCheckOutput(av1_calc_indices_dim2_func test_impl,
195*77c1e3ccSAndroid Build Coastguard Worker                                     BLOCK_SIZE bsize, int k) {
196*77c1e3ccSAndroid Build Coastguard Worker   const int w = block_size_wide[bsize];
197*77c1e3ccSAndroid Build Coastguard Worker   const int h = block_size_high[bsize];
198*77c1e3ccSAndroid Build Coastguard Worker   const int n = w * h;
199*77c1e3ccSAndroid Build Coastguard Worker   int64_t total_dist_dim2, total_dist_impl;
200*77c1e3ccSAndroid Build Coastguard Worker   av1_calc_indices_dim2_c(data_, centroids_, indices1_, &total_dist_dim2, n, k);
201*77c1e3ccSAndroid Build Coastguard Worker   test_impl(data_, centroids_, indices2_, &total_dist_impl, n, k);
202*77c1e3ccSAndroid Build Coastguard Worker 
203*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(total_dist_dim2, total_dist_impl);
204*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(CheckResult(n), true)
205*77c1e3ccSAndroid Build Coastguard Worker       << " block " << bsize << " index " << n << " Centroids " << k;
206*77c1e3ccSAndroid Build Coastguard Worker }
207*77c1e3ccSAndroid Build Coastguard Worker 
RunSpeedTest(av1_calc_indices_dim2_func test_impl,BLOCK_SIZE bsize,int k)208*77c1e3ccSAndroid Build Coastguard Worker void AV1KmeansTest2::RunSpeedTest(av1_calc_indices_dim2_func test_impl,
209*77c1e3ccSAndroid Build Coastguard Worker                                   BLOCK_SIZE bsize, int k) {
210*77c1e3ccSAndroid Build Coastguard Worker   const int w = block_size_wide[bsize];
211*77c1e3ccSAndroid Build Coastguard Worker   const int h = block_size_high[bsize];
212*77c1e3ccSAndroid Build Coastguard Worker   const int n = w * h;
213*77c1e3ccSAndroid Build Coastguard Worker   const int num_loops = 1000000000 / n;
214*77c1e3ccSAndroid Build Coastguard Worker 
215*77c1e3ccSAndroid Build Coastguard Worker   av1_calc_indices_dim2_func funcs[2] = { av1_calc_indices_dim2_c, test_impl };
216*77c1e3ccSAndroid Build Coastguard Worker   double elapsed_time[2] = { 0 };
217*77c1e3ccSAndroid Build Coastguard Worker   for (int i = 0; i < 2; ++i) {
218*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer timer;
219*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_start(&timer);
220*77c1e3ccSAndroid Build Coastguard Worker     av1_calc_indices_dim2_func func = funcs[i];
221*77c1e3ccSAndroid Build Coastguard Worker     for (int j = 0; j < num_loops; ++j) {
222*77c1e3ccSAndroid Build Coastguard Worker       func(data_, centroids_, indices1_, /*total_dist=*/nullptr, n, k);
223*77c1e3ccSAndroid Build Coastguard Worker     }
224*77c1e3ccSAndroid Build Coastguard Worker     aom_usec_timer_mark(&timer);
225*77c1e3ccSAndroid Build Coastguard Worker     double time = static_cast<double>(aom_usec_timer_elapsed(&timer));
226*77c1e3ccSAndroid Build Coastguard Worker     elapsed_time[i] = 1000.0 * time / num_loops;
227*77c1e3ccSAndroid Build Coastguard Worker   }
228*77c1e3ccSAndroid Build Coastguard Worker   printf("av1_calc_indices_dim2 indices= %d centroids=%d: %7.2f/%7.2fns", n, k,
229*77c1e3ccSAndroid Build Coastguard Worker          elapsed_time[0], elapsed_time[1]);
230*77c1e3ccSAndroid Build Coastguard Worker   printf("(%3.2f)\n", elapsed_time[0] / elapsed_time[1]);
231*77c1e3ccSAndroid Build Coastguard Worker }
232*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(AV1KmeansTest2,CheckOutput)233*77c1e3ccSAndroid Build Coastguard Worker TEST_P(AV1KmeansTest2, CheckOutput) {
234*77c1e3ccSAndroid Build Coastguard Worker   // centroids = 2..8
235*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 2);
236*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 3);
237*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 4);
238*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 5);
239*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 6);
240*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 7);
241*77c1e3ccSAndroid Build Coastguard Worker   RunCheckOutput(GET_PARAM(0), GET_PARAM(1), 8);
242*77c1e3ccSAndroid Build Coastguard Worker }
243*77c1e3ccSAndroid Build Coastguard Worker 
TEST_P(AV1KmeansTest2,DISABLED_Speed)244*77c1e3ccSAndroid Build Coastguard Worker TEST_P(AV1KmeansTest2, DISABLED_Speed) {
245*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 2);
246*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 3);
247*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 4);
248*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 5);
249*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 6);
250*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 7);
251*77c1e3ccSAndroid Build Coastguard Worker   RunSpeedTest(GET_PARAM(0), GET_PARAM(1), 8);
252*77c1e3ccSAndroid Build Coastguard Worker }
253*77c1e3ccSAndroid Build Coastguard Worker 
254*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_SSE2 || HAVE_AVX2 || HAVE_NEON
255*77c1e3ccSAndroid Build Coastguard Worker const BLOCK_SIZE kValidBlockSize[] = { BLOCK_8X8,   BLOCK_8X16,  BLOCK_8X32,
256*77c1e3ccSAndroid Build Coastguard Worker                                        BLOCK_16X8,  BLOCK_16X16, BLOCK_16X32,
257*77c1e3ccSAndroid Build Coastguard Worker                                        BLOCK_32X8,  BLOCK_32X16, BLOCK_32X32,
258*77c1e3ccSAndroid Build Coastguard Worker                                        BLOCK_32X64, BLOCK_64X32, BLOCK_64X64,
259*77c1e3ccSAndroid Build Coastguard Worker                                        BLOCK_16X64, BLOCK_64X16 };
260*77c1e3ccSAndroid Build Coastguard Worker #endif
261*77c1e3ccSAndroid Build Coastguard Worker 
262*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_SSE2
263*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
264*77c1e3ccSAndroid Build Coastguard Worker     SSE2, AV1KmeansTest1,
265*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim1_sse2),
266*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
267*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
268*77c1e3ccSAndroid Build Coastguard Worker     SSE2, AV1KmeansTest2,
269*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim2_sse2),
270*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
271*77c1e3ccSAndroid Build Coastguard Worker #endif
272*77c1e3ccSAndroid Build Coastguard Worker 
273*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_AVX2
274*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
275*77c1e3ccSAndroid Build Coastguard Worker     AVX2, AV1KmeansTest1,
276*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim1_avx2),
277*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
278*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
279*77c1e3ccSAndroid Build Coastguard Worker     AVX2, AV1KmeansTest2,
280*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim2_avx2),
281*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
282*77c1e3ccSAndroid Build Coastguard Worker #endif
283*77c1e3ccSAndroid Build Coastguard Worker 
284*77c1e3ccSAndroid Build Coastguard Worker #if HAVE_NEON
285*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
286*77c1e3ccSAndroid Build Coastguard Worker     NEON, AV1KmeansTest1,
287*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim1_neon),
288*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
289*77c1e3ccSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
290*77c1e3ccSAndroid Build Coastguard Worker     NEON, AV1KmeansTest2,
291*77c1e3ccSAndroid Build Coastguard Worker     ::testing::Combine(::testing::Values(&av1_calc_indices_dim2_neon),
292*77c1e3ccSAndroid Build Coastguard Worker                        ::testing::ValuesIn(kValidBlockSize)));
293*77c1e3ccSAndroid Build Coastguard Worker #endif
294*77c1e3ccSAndroid Build Coastguard Worker 
295*77c1e3ccSAndroid Build Coastguard Worker }  // namespace AV1Kmeans
296