1*4e366538SXin Li /*
2*4e366538SXin Li * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3*4e366538SXin Li *
4*4e366538SXin Li * Use of this source code is governed by a BSD-style license
5*4e366538SXin Li * that can be found in the LICENSE file in the root of the source
6*4e366538SXin Li * tree. An additional intellectual property rights grant can be found
7*4e366538SXin Li * in the file PATENTS. All contributing project authors may
8*4e366538SXin Li * be found in the AUTHORS file in the root of the source tree.
9*4e366538SXin Li */
10*4e366538SXin Li
11*4e366538SXin Li #include "../unit_test/unit_test.h"
12*4e366538SXin Li
13*4e366538SXin Li #include <stdlib.h> // For getenv()
14*4e366538SXin Li
15*4e366538SXin Li #include <cstring>
16*4e366538SXin Li
17*4e366538SXin Li #ifdef LIBYUV_USE_ABSL_FLAGS
18*4e366538SXin Li #include "absl/flags/flag.h"
19*4e366538SXin Li #include "absl/flags/parse.h"
20*4e366538SXin Li #endif
21*4e366538SXin Li #include "libyuv/cpu_id.h"
22*4e366538SXin Li
23*4e366538SXin Li unsigned int fastrand_seed = 0xfb;
24*4e366538SXin Li
25*4e366538SXin Li #ifdef LIBYUV_USE_ABSL_FLAGS
26*4e366538SXin Li ABSL_FLAG(int32_t, libyuv_width, 0, "width of test image.");
27*4e366538SXin Li ABSL_FLAG(int32_t, libyuv_height, 0, "height of test image.");
28*4e366538SXin Li ABSL_FLAG(int32_t, libyuv_repeat, 0, "number of times to repeat test.");
29*4e366538SXin Li ABSL_FLAG(int32_t,
30*4e366538SXin Li libyuv_flags,
31*4e366538SXin Li 0,
32*4e366538SXin Li "cpu flags for reference code. 1 = C, -1 = SIMD");
33*4e366538SXin Li ABSL_FLAG(int32_t,
34*4e366538SXin Li libyuv_cpu_info,
35*4e366538SXin Li 0,
36*4e366538SXin Li "cpu flags for benchmark code. 1 = C, -1 = SIMD");
37*4e366538SXin Li #else
38*4e366538SXin Li // Disable command line parameters if absl/flags disabled.
39*4e366538SXin Li static const int32_t FLAGS_libyuv_width = 0;
40*4e366538SXin Li static const int32_t FLAGS_libyuv_height = 0;
41*4e366538SXin Li static const int32_t FLAGS_libyuv_repeat = 0;
42*4e366538SXin Li static const int32_t FLAGS_libyuv_flags = 0;
43*4e366538SXin Li static const int32_t FLAGS_libyuv_cpu_info = 0;
44*4e366538SXin Li #endif
45*4e366538SXin Li
46*4e366538SXin Li #ifdef LIBYUV_USE_ABSL_FLAGS
47*4e366538SXin Li #define LIBYUV_GET_FLAG(f) absl::GetFlag(f)
48*4e366538SXin Li #else
49*4e366538SXin Li #define LIBYUV_GET_FLAG(f) f
50*4e366538SXin Li #endif
51*4e366538SXin Li
52*4e366538SXin Li // Test environment variable for disabling CPU features. Any non-zero value
53*4e366538SXin Li // to disable. Zero ignored to make it easy to set the variable on/off.
54*4e366538SXin Li #if !defined(__native_client__) && !defined(_M_ARM)
TestEnv(const char * name)55*4e366538SXin Li static LIBYUV_BOOL TestEnv(const char* name) {
56*4e366538SXin Li const char* var = getenv(name);
57*4e366538SXin Li if (var) {
58*4e366538SXin Li if (var[0] != '0') {
59*4e366538SXin Li return LIBYUV_TRUE;
60*4e366538SXin Li }
61*4e366538SXin Li }
62*4e366538SXin Li return LIBYUV_FALSE;
63*4e366538SXin Li }
64*4e366538SXin Li #else // nacl does not support getenv().
TestEnv(const char *)65*4e366538SXin Li static LIBYUV_BOOL TestEnv(const char*) {
66*4e366538SXin Li return LIBYUV_FALSE;
67*4e366538SXin Li }
68*4e366538SXin Li #endif
69*4e366538SXin Li
TestCpuEnv(int cpu_info)70*4e366538SXin Li int TestCpuEnv(int cpu_info) {
71*4e366538SXin Li #if defined(__arm__) || defined(__aarch64__)
72*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_NEON")) {
73*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasNEON;
74*4e366538SXin Li }
75*4e366538SXin Li #endif
76*4e366538SXin Li #if defined(__mips__) && defined(__linux__)
77*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_MSA")) {
78*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasMSA;
79*4e366538SXin Li }
80*4e366538SXin Li #endif
81*4e366538SXin Li #if defined(__longarch__) && defined(__linux__)
82*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_LSX")) {
83*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasLSX;
84*4e366538SXin Li }
85*4e366538SXin Li #endif
86*4e366538SXin Li #if defined(__longarch__) && defined(__linux__)
87*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_LASX")) {
88*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasLASX;
89*4e366538SXin Li }
90*4e366538SXin Li #endif
91*4e366538SXin Li #if defined(__riscv) && defined(__linux__)
92*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_RVV")) {
93*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasRVV;
94*4e366538SXin Li }
95*4e366538SXin Li #endif
96*4e366538SXin Li #if !defined(__pnacl__) && !defined(__CLR_VER) && \
97*4e366538SXin Li (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \
98*4e366538SXin Li defined(_M_IX86))
99*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_X86")) {
100*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasX86;
101*4e366538SXin Li }
102*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_SSE2")) {
103*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasSSE2;
104*4e366538SXin Li }
105*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_SSSE3")) {
106*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasSSSE3;
107*4e366538SXin Li }
108*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_SSE41")) {
109*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasSSE41;
110*4e366538SXin Li }
111*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_SSE42")) {
112*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasSSE42;
113*4e366538SXin Li }
114*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX")) {
115*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX;
116*4e366538SXin Li }
117*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX2")) {
118*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX2;
119*4e366538SXin Li }
120*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_ERMS")) {
121*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasERMS;
122*4e366538SXin Li }
123*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_FMA3")) {
124*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasFMA3;
125*4e366538SXin Li }
126*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_F16C")) {
127*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasF16C;
128*4e366538SXin Li }
129*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512BW")) {
130*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512BW;
131*4e366538SXin Li }
132*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512VL")) {
133*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512VL;
134*4e366538SXin Li }
135*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512VNNI")) {
136*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512VNNI;
137*4e366538SXin Li }
138*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512VBMI")) {
139*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512VBMI;
140*4e366538SXin Li }
141*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512VBMI2")) {
142*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512VBMI2;
143*4e366538SXin Li }
144*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX512VBITALG")) {
145*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX512VBITALG;
146*4e366538SXin Li }
147*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVX10")) {
148*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVX10;
149*4e366538SXin Li }
150*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVXVNNI")) {
151*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVXVNNI;
152*4e366538SXin Li }
153*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_AVXVNNIINT8")) {
154*4e366538SXin Li cpu_info &= ~libyuv::kCpuHasAVXVNNIINT8;
155*4e366538SXin Li }
156*4e366538SXin Li #endif
157*4e366538SXin Li if (TestEnv("LIBYUV_DISABLE_ASM")) {
158*4e366538SXin Li cpu_info = libyuv::kCpuInitialized;
159*4e366538SXin Li }
160*4e366538SXin Li return cpu_info;
161*4e366538SXin Li }
162*4e366538SXin Li
163*4e366538SXin Li // For quicker unittests, default is 128 x 72. But when benchmarking,
164*4e366538SXin Li // default to 720p. Allow size to specify.
165*4e366538SXin Li // Set flags to -1 for benchmarking to avoid slower C code.
166*4e366538SXin Li
LibYUVConvertTest()167*4e366538SXin Li LibYUVConvertTest::LibYUVConvertTest()
168*4e366538SXin Li : benchmark_iterations_(1),
169*4e366538SXin Li benchmark_width_(128),
170*4e366538SXin Li benchmark_height_(72),
171*4e366538SXin Li disable_cpu_flags_(1),
172*4e366538SXin Li benchmark_cpu_info_(-1) {
173*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
174*4e366538SXin Li if (repeat) {
175*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
176*4e366538SXin Li }
177*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
178*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
179*4e366538SXin Li }
180*4e366538SXin Li if (benchmark_iterations_ > 1) {
181*4e366538SXin Li benchmark_width_ = 1280;
182*4e366538SXin Li benchmark_height_ = 720;
183*4e366538SXin Li }
184*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
185*4e366538SXin Li if (width) {
186*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
187*4e366538SXin Li }
188*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
189*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
190*4e366538SXin Li }
191*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
192*4e366538SXin Li if (height) {
193*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
194*4e366538SXin Li }
195*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
196*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
197*4e366538SXin Li }
198*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
199*4e366538SXin Li if (cpu_flags) {
200*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
201*4e366538SXin Li }
202*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
203*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
204*4e366538SXin Li }
205*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
206*4e366538SXin Li if (cpu_info) {
207*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
208*4e366538SXin Li }
209*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
210*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
211*4e366538SXin Li }
212*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
213*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
214*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
215*4e366538SXin Li benchmark_pixels_div1280_ =
216*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
217*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
218*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
219*4e366538SXin Li 1279.0) /
220*4e366538SXin Li 1280.0);
221*4e366538SXin Li }
222*4e366538SXin Li
LibYUVColorTest()223*4e366538SXin Li LibYUVColorTest::LibYUVColorTest()
224*4e366538SXin Li : benchmark_iterations_(1),
225*4e366538SXin Li benchmark_width_(128),
226*4e366538SXin Li benchmark_height_(72),
227*4e366538SXin Li disable_cpu_flags_(1),
228*4e366538SXin Li benchmark_cpu_info_(-1) {
229*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
230*4e366538SXin Li if (repeat) {
231*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
232*4e366538SXin Li }
233*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
234*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
235*4e366538SXin Li }
236*4e366538SXin Li if (benchmark_iterations_ > 1) {
237*4e366538SXin Li benchmark_width_ = 1280;
238*4e366538SXin Li benchmark_height_ = 720;
239*4e366538SXin Li }
240*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
241*4e366538SXin Li if (width) {
242*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
243*4e366538SXin Li }
244*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
245*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
246*4e366538SXin Li }
247*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
248*4e366538SXin Li if (height) {
249*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
250*4e366538SXin Li }
251*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
252*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
253*4e366538SXin Li }
254*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
255*4e366538SXin Li if (cpu_flags) {
256*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
257*4e366538SXin Li }
258*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
259*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
260*4e366538SXin Li }
261*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
262*4e366538SXin Li if (cpu_info) {
263*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
264*4e366538SXin Li }
265*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
266*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
267*4e366538SXin Li }
268*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
269*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
270*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
271*4e366538SXin Li benchmark_pixels_div1280_ =
272*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
273*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
274*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
275*4e366538SXin Li 1279.0) /
276*4e366538SXin Li 1280.0);
277*4e366538SXin Li }
278*4e366538SXin Li
LibYUVScaleTest()279*4e366538SXin Li LibYUVScaleTest::LibYUVScaleTest()
280*4e366538SXin Li : benchmark_iterations_(1),
281*4e366538SXin Li benchmark_width_(128),
282*4e366538SXin Li benchmark_height_(72),
283*4e366538SXin Li disable_cpu_flags_(1),
284*4e366538SXin Li benchmark_cpu_info_(-1) {
285*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
286*4e366538SXin Li if (repeat) {
287*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
288*4e366538SXin Li }
289*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
290*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
291*4e366538SXin Li }
292*4e366538SXin Li if (benchmark_iterations_ > 1) {
293*4e366538SXin Li benchmark_width_ = 1280;
294*4e366538SXin Li benchmark_height_ = 720;
295*4e366538SXin Li }
296*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
297*4e366538SXin Li if (width) {
298*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
299*4e366538SXin Li }
300*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
301*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
302*4e366538SXin Li }
303*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
304*4e366538SXin Li if (height) {
305*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
306*4e366538SXin Li }
307*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
308*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
309*4e366538SXin Li }
310*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
311*4e366538SXin Li if (cpu_flags) {
312*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
313*4e366538SXin Li }
314*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
315*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
316*4e366538SXin Li }
317*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
318*4e366538SXin Li if (cpu_info) {
319*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
320*4e366538SXin Li }
321*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
322*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
323*4e366538SXin Li }
324*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
325*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
326*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
327*4e366538SXin Li benchmark_pixels_div1280_ =
328*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
329*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
330*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
331*4e366538SXin Li 1279.0) /
332*4e366538SXin Li 1280.0);
333*4e366538SXin Li }
334*4e366538SXin Li
LibYUVRotateTest()335*4e366538SXin Li LibYUVRotateTest::LibYUVRotateTest()
336*4e366538SXin Li : benchmark_iterations_(1),
337*4e366538SXin Li benchmark_width_(128),
338*4e366538SXin Li benchmark_height_(72),
339*4e366538SXin Li disable_cpu_flags_(1),
340*4e366538SXin Li benchmark_cpu_info_(-1) {
341*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
342*4e366538SXin Li if (repeat) {
343*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
344*4e366538SXin Li }
345*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
346*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
347*4e366538SXin Li }
348*4e366538SXin Li if (benchmark_iterations_ > 1) {
349*4e366538SXin Li benchmark_width_ = 1280;
350*4e366538SXin Li benchmark_height_ = 720;
351*4e366538SXin Li }
352*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
353*4e366538SXin Li if (width) {
354*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
355*4e366538SXin Li }
356*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
357*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
358*4e366538SXin Li }
359*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
360*4e366538SXin Li if (height) {
361*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
362*4e366538SXin Li }
363*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
364*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
365*4e366538SXin Li }
366*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
367*4e366538SXin Li if (cpu_flags) {
368*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
369*4e366538SXin Li }
370*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
371*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
372*4e366538SXin Li }
373*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
374*4e366538SXin Li if (cpu_info) {
375*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
376*4e366538SXin Li }
377*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
378*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
379*4e366538SXin Li }
380*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
381*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
382*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
383*4e366538SXin Li benchmark_pixels_div1280_ =
384*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
385*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
386*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
387*4e366538SXin Li 1279.0) /
388*4e366538SXin Li 1280.0);
389*4e366538SXin Li }
390*4e366538SXin Li
LibYUVPlanarTest()391*4e366538SXin Li LibYUVPlanarTest::LibYUVPlanarTest()
392*4e366538SXin Li : benchmark_iterations_(1),
393*4e366538SXin Li benchmark_width_(128),
394*4e366538SXin Li benchmark_height_(72),
395*4e366538SXin Li disable_cpu_flags_(1),
396*4e366538SXin Li benchmark_cpu_info_(-1) {
397*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
398*4e366538SXin Li if (repeat) {
399*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
400*4e366538SXin Li }
401*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
402*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
403*4e366538SXin Li }
404*4e366538SXin Li if (benchmark_iterations_ > 1) {
405*4e366538SXin Li benchmark_width_ = 1280;
406*4e366538SXin Li benchmark_height_ = 720;
407*4e366538SXin Li }
408*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
409*4e366538SXin Li if (width) {
410*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
411*4e366538SXin Li }
412*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
413*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
414*4e366538SXin Li }
415*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
416*4e366538SXin Li if (height) {
417*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
418*4e366538SXin Li }
419*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
420*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
421*4e366538SXin Li }
422*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
423*4e366538SXin Li if (cpu_flags) {
424*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
425*4e366538SXin Li }
426*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
427*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
428*4e366538SXin Li }
429*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
430*4e366538SXin Li if (cpu_info) {
431*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
432*4e366538SXin Li }
433*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
434*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
435*4e366538SXin Li }
436*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
437*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
438*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
439*4e366538SXin Li benchmark_pixels_div1280_ =
440*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
441*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
442*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
443*4e366538SXin Li 1279.0) /
444*4e366538SXin Li 1280.0);
445*4e366538SXin Li }
446*4e366538SXin Li
LibYUVBaseTest()447*4e366538SXin Li LibYUVBaseTest::LibYUVBaseTest()
448*4e366538SXin Li : benchmark_iterations_(1),
449*4e366538SXin Li benchmark_width_(128),
450*4e366538SXin Li benchmark_height_(72),
451*4e366538SXin Li disable_cpu_flags_(1),
452*4e366538SXin Li benchmark_cpu_info_(-1) {
453*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
454*4e366538SXin Li if (repeat) {
455*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
456*4e366538SXin Li }
457*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
458*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
459*4e366538SXin Li }
460*4e366538SXin Li if (benchmark_iterations_ > 1) {
461*4e366538SXin Li benchmark_width_ = 1280;
462*4e366538SXin Li benchmark_height_ = 720;
463*4e366538SXin Li }
464*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
465*4e366538SXin Li if (width) {
466*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
467*4e366538SXin Li }
468*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
469*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
470*4e366538SXin Li }
471*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
472*4e366538SXin Li if (height) {
473*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
474*4e366538SXin Li }
475*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
476*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
477*4e366538SXin Li }
478*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
479*4e366538SXin Li if (cpu_flags) {
480*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
481*4e366538SXin Li }
482*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
483*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
484*4e366538SXin Li }
485*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
486*4e366538SXin Li if (cpu_info) {
487*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
488*4e366538SXin Li }
489*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
490*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
491*4e366538SXin Li }
492*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
493*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
494*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
495*4e366538SXin Li benchmark_pixels_div1280_ =
496*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
497*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
498*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
499*4e366538SXin Li 1279.0) /
500*4e366538SXin Li 1280.0);
501*4e366538SXin Li }
502*4e366538SXin Li
LibYUVCompareTest()503*4e366538SXin Li LibYUVCompareTest::LibYUVCompareTest()
504*4e366538SXin Li : benchmark_iterations_(1),
505*4e366538SXin Li benchmark_width_(128),
506*4e366538SXin Li benchmark_height_(72),
507*4e366538SXin Li disable_cpu_flags_(1),
508*4e366538SXin Li benchmark_cpu_info_(-1) {
509*4e366538SXin Li const char* repeat = getenv("LIBYUV_REPEAT");
510*4e366538SXin Li if (repeat) {
511*4e366538SXin Li benchmark_iterations_ = atoi(repeat); // NOLINT
512*4e366538SXin Li }
513*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) {
514*4e366538SXin Li benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat);
515*4e366538SXin Li }
516*4e366538SXin Li if (benchmark_iterations_ > 1) {
517*4e366538SXin Li benchmark_width_ = 1280;
518*4e366538SXin Li benchmark_height_ = 720;
519*4e366538SXin Li }
520*4e366538SXin Li const char* width = getenv("LIBYUV_WIDTH");
521*4e366538SXin Li if (width) {
522*4e366538SXin Li benchmark_width_ = atoi(width); // NOLINT
523*4e366538SXin Li }
524*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) {
525*4e366538SXin Li benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width);
526*4e366538SXin Li }
527*4e366538SXin Li const char* height = getenv("LIBYUV_HEIGHT");
528*4e366538SXin Li if (height) {
529*4e366538SXin Li benchmark_height_ = atoi(height); // NOLINT
530*4e366538SXin Li }
531*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) {
532*4e366538SXin Li benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height);
533*4e366538SXin Li }
534*4e366538SXin Li const char* cpu_flags = getenv("LIBYUV_FLAGS");
535*4e366538SXin Li if (cpu_flags) {
536*4e366538SXin Li disable_cpu_flags_ = atoi(cpu_flags); // NOLINT
537*4e366538SXin Li }
538*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) {
539*4e366538SXin Li disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags);
540*4e366538SXin Li }
541*4e366538SXin Li const char* cpu_info = getenv("LIBYUV_CPU_INFO");
542*4e366538SXin Li if (cpu_info) {
543*4e366538SXin Li benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT
544*4e366538SXin Li }
545*4e366538SXin Li if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) {
546*4e366538SXin Li benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info);
547*4e366538SXin Li }
548*4e366538SXin Li disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_);
549*4e366538SXin Li benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_);
550*4e366538SXin Li libyuv::MaskCpuFlags(benchmark_cpu_info_);
551*4e366538SXin Li benchmark_pixels_div1280_ =
552*4e366538SXin Li static_cast<int>((static_cast<double>(Abs(benchmark_width_)) *
553*4e366538SXin Li static_cast<double>(Abs(benchmark_height_)) *
554*4e366538SXin Li static_cast<double>(benchmark_iterations_) +
555*4e366538SXin Li 1279.0) /
556*4e366538SXin Li 1280.0);
557*4e366538SXin Li }
558*4e366538SXin Li
main(int argc,char ** argv)559*4e366538SXin Li int main(int argc, char** argv) {
560*4e366538SXin Li ::testing::InitGoogleTest(&argc, argv);
561*4e366538SXin Li #ifdef LIBYUV_USE_ABSL_FLAGS
562*4e366538SXin Li absl::ParseCommandLine(argc, argv);
563*4e366538SXin Li #endif
564*4e366538SXin Li return RUN_ALL_TESTS();
565*4e366538SXin Li }
566