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