xref: /aosp_15_r20/external/libyuv/unit_test/unit_test.h (revision 4e366538070a3a6c5c163c31b791eab742e1657a)
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 #ifndef UNIT_TEST_UNIT_TEST_H_  // NOLINT
12*4e366538SXin Li #define UNIT_TEST_UNIT_TEST_H_
13*4e366538SXin Li 
14*4e366538SXin Li #include <stddef.h>  // For NULL
15*4e366538SXin Li #ifdef _WIN32
16*4e366538SXin Li #include <windows.h>
17*4e366538SXin Li #else
18*4e366538SXin Li #include <sys/time.h>
19*4e366538SXin Li #endif
20*4e366538SXin Li 
21*4e366538SXin Li #include <gtest/gtest.h>
22*4e366538SXin Li 
23*4e366538SXin Li #include "libyuv/basic_types.h"
24*4e366538SXin Li 
25*4e366538SXin Li #ifndef SIMD_ALIGNED
26*4e366538SXin Li #if defined(_MSC_VER) && !defined(__CLR_VER)
27*4e366538SXin Li #define SIMD_ALIGNED(var) __declspec(align(16)) var
28*4e366538SXin Li #elif defined(__GNUC__) && !defined(__pnacl__)
29*4e366538SXin Li #define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
30*4e366538SXin Li #else
31*4e366538SXin Li #define SIMD_ALIGNED(var) var
32*4e366538SXin Li #endif
33*4e366538SXin Li #endif
34*4e366538SXin Li 
Abs(int v)35*4e366538SXin Li static __inline int Abs(int v) {
36*4e366538SXin Li   return v >= 0 ? v : -v;
37*4e366538SXin Li }
38*4e366538SXin Li 
FAbs(float v)39*4e366538SXin Li static __inline float FAbs(float v) {
40*4e366538SXin Li   return v >= 0 ? v : -v;
41*4e366538SXin Li }
42*4e366538SXin Li #define OFFBY 0
43*4e366538SXin Li 
44*4e366538SXin Li // Scaling uses 16.16 fixed point to step thru the source image, so a
45*4e366538SXin Li // maximum size of 32767.999 can be expressed.  32768 is valid because
46*4e366538SXin Li // the step is 1 beyond the image but not used.
47*4e366538SXin Li // Destination size is mainly constrained by valid scale step not the
48*4e366538SXin Li // absolute size, so it may be possible to relax the destination size
49*4e366538SXin Li // constraint.
50*4e366538SXin Li // Source size is unconstrained for most specialized scalers.  e.g.
51*4e366538SXin Li // An image of 65536 scaled to half size would be valid.  The test
52*4e366538SXin Li // could be relaxed for special scale factors.
53*4e366538SXin Li // If this test is removed, the scaling function should gracefully
54*4e366538SXin Li // fail with a return code.  The test could be changed to know that
55*4e366538SXin Li // libyuv failed in a controlled way.
56*4e366538SXin Li 
57*4e366538SXin Li static const int kMaxWidth = 32768;
58*4e366538SXin Li static const int kMaxHeight = 32768;
59*4e366538SXin Li 
SizeValid(int src_width,int src_height,int dst_width,int dst_height)60*4e366538SXin Li static inline bool SizeValid(int src_width,
61*4e366538SXin Li                              int src_height,
62*4e366538SXin Li                              int dst_width,
63*4e366538SXin Li                              int dst_height) {
64*4e366538SXin Li   if (src_width > kMaxWidth || src_height > kMaxHeight ||
65*4e366538SXin Li       dst_width > kMaxWidth || dst_height > kMaxHeight) {
66*4e366538SXin Li     printf("Warning - size too large to test.  Skipping\n");
67*4e366538SXin Li     return false;
68*4e366538SXin Li   }
69*4e366538SXin Li   return true;
70*4e366538SXin Li }
71*4e366538SXin Li 
72*4e366538SXin Li #define align_buffer_page_end(var, size)                                \
73*4e366538SXin Li   uint8_t* var##_mem =                                                  \
74*4e366538SXin Li       reinterpret_cast<uint8_t*>(malloc(((size) + 4095 + 63) & ~4095)); \
75*4e366538SXin Li   uint8_t* var = reinterpret_cast<uint8_t*>(                            \
76*4e366538SXin Li       (intptr_t)(var##_mem + (((size) + 4095 + 63) & ~4095) - (size)) & ~63)
77*4e366538SXin Li 
78*4e366538SXin Li #define free_aligned_buffer_page_end(var) \
79*4e366538SXin Li   free(var##_mem);                        \
80*4e366538SXin Li   var = NULL
81*4e366538SXin Li 
82*4e366538SXin Li #define align_buffer_page_end_16(var, size)                                 \
83*4e366538SXin Li   uint8_t* var##_mem =                                                      \
84*4e366538SXin Li       reinterpret_cast<uint8_t*>(malloc(((size)*2 + 4095 + 63) & ~4095));   \
85*4e366538SXin Li   uint16_t* var = reinterpret_cast<uint16_t*>(                              \
86*4e366538SXin Li       (intptr_t)(var##_mem + (((size)*2 + 4095 + 63) & ~4095) - (size)*2) & \
87*4e366538SXin Li       ~63)
88*4e366538SXin Li 
89*4e366538SXin Li #define free_aligned_buffer_page_end_16(var) \
90*4e366538SXin Li   free(var##_mem);                           \
91*4e366538SXin Li   var = NULL
92*4e366538SXin Li 
93*4e366538SXin Li #ifdef WIN32
get_time()94*4e366538SXin Li static inline double get_time() {
95*4e366538SXin Li   LARGE_INTEGER t, f;
96*4e366538SXin Li   QueryPerformanceCounter(&t);
97*4e366538SXin Li   QueryPerformanceFrequency(&f);
98*4e366538SXin Li   return static_cast<double>(t.QuadPart) / static_cast<double>(f.QuadPart);
99*4e366538SXin Li }
100*4e366538SXin Li #else
get_time()101*4e366538SXin Li static inline double get_time() {
102*4e366538SXin Li   struct timeval t;
103*4e366538SXin Li   struct timezone tzp;
104*4e366538SXin Li   gettimeofday(&t, &tzp);
105*4e366538SXin Li   return t.tv_sec + t.tv_usec * 1e-6;
106*4e366538SXin Li }
107*4e366538SXin Li #endif
108*4e366538SXin Li 
109*4e366538SXin Li #ifndef SIMD_ALIGNED
110*4e366538SXin Li #if defined(_MSC_VER) && !defined(__CLR_VER)
111*4e366538SXin Li #define SIMD_ALIGNED(var) __declspec(align(16)) var
112*4e366538SXin Li #elif defined(__GNUC__) && !defined(__pnacl__)
113*4e366538SXin Li #define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
114*4e366538SXin Li #else
115*4e366538SXin Li #define SIMD_ALIGNED(var) var
116*4e366538SXin Li #endif
117*4e366538SXin Li #endif
118*4e366538SXin Li 
119*4e366538SXin Li extern unsigned int fastrand_seed;
fastrand()120*4e366538SXin Li inline int fastrand() {
121*4e366538SXin Li   fastrand_seed = fastrand_seed * 214013u + 2531011u;
122*4e366538SXin Li   return static_cast<int>((fastrand_seed >> 16) & 0xffff);
123*4e366538SXin Li }
124*4e366538SXin Li 
125*4e366538SXin Li // ubsan fails if dst is unaligned unless we use uint8
MemRandomize(uint8_t * dst,int64_t len)126*4e366538SXin Li static inline void MemRandomize(uint8_t* dst, int64_t len) {
127*4e366538SXin Li   int64_t i;
128*4e366538SXin Li   for (i = 0; i < len - 1; i += 2) {
129*4e366538SXin Li     int r = fastrand();
130*4e366538SXin Li     dst[0] = static_cast<uint8_t>(r);
131*4e366538SXin Li     dst[1] = static_cast<uint8_t>(r >> 8);
132*4e366538SXin Li     dst += 2;
133*4e366538SXin Li   }
134*4e366538SXin Li   for (; i < len; ++i) {
135*4e366538SXin Li     *dst++ = fastrand();
136*4e366538SXin Li   }
137*4e366538SXin Li }
138*4e366538SXin Li 
139*4e366538SXin Li class LibYUVColorTest : public ::testing::Test {
140*4e366538SXin Li  protected:
141*4e366538SXin Li   LibYUVColorTest();
142*4e366538SXin Li 
143*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
144*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
145*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
146*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
147*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
148*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
149*4e366538SXin Li };
150*4e366538SXin Li 
151*4e366538SXin Li class LibYUVConvertTest : public ::testing::Test {
152*4e366538SXin Li  protected:
153*4e366538SXin Li   LibYUVConvertTest();
154*4e366538SXin Li 
155*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
156*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
157*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
158*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
159*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
160*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
161*4e366538SXin Li };
162*4e366538SXin Li 
163*4e366538SXin Li class LibYUVScaleTest : public ::testing::Test {
164*4e366538SXin Li  protected:
165*4e366538SXin Li   LibYUVScaleTest();
166*4e366538SXin Li 
167*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
168*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
169*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
170*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
171*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
172*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
173*4e366538SXin Li };
174*4e366538SXin Li 
175*4e366538SXin Li class LibYUVRotateTest : public ::testing::Test {
176*4e366538SXin Li  protected:
177*4e366538SXin Li   LibYUVRotateTest();
178*4e366538SXin Li 
179*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
180*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
181*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
182*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
183*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
184*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
185*4e366538SXin Li };
186*4e366538SXin Li 
187*4e366538SXin Li class LibYUVPlanarTest : public ::testing::Test {
188*4e366538SXin Li  protected:
189*4e366538SXin Li   LibYUVPlanarTest();
190*4e366538SXin Li 
191*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
192*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
193*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
194*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
195*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
196*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
197*4e366538SXin Li };
198*4e366538SXin Li 
199*4e366538SXin Li class LibYUVBaseTest : public ::testing::Test {
200*4e366538SXin Li  protected:
201*4e366538SXin Li   LibYUVBaseTest();
202*4e366538SXin Li 
203*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
204*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
205*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
206*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
207*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
208*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
209*4e366538SXin Li };
210*4e366538SXin Li 
211*4e366538SXin Li class LibYUVCompareTest : public ::testing::Test {
212*4e366538SXin Li  protected:
213*4e366538SXin Li   LibYUVCompareTest();
214*4e366538SXin Li 
215*4e366538SXin Li   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
216*4e366538SXin Li   int benchmark_width_;       // Default 1280.  Use 640 for benchmarking VGA.
217*4e366538SXin Li   int benchmark_height_;      // Default 720.  Use 360 for benchmarking VGA.
218*4e366538SXin Li   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
219*4e366538SXin Li   int disable_cpu_flags_;         // Default 1.  Use -1 for benchmarking.
220*4e366538SXin Li   int benchmark_cpu_info_;        // Default -1.  Use 1 to disable SIMD.
221*4e366538SXin Li };
222*4e366538SXin Li 
223*4e366538SXin Li #endif  // UNIT_TEST_UNIT_TEST_H_  NOLINT
224