Home | History | Annotate | Download | only in unit_test
      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/time.h>
     18 #include <sys/resource.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 
     35 static __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 
     54 static const int kMaxWidth = 32768;
     55 static const int kMaxHeight = 32768;
     56 
     57 static inline bool SizeValid(int src_width, int src_height,
     58                              int dst_width, int dst_height) {
     59   if (src_width > kMaxWidth || src_height > kMaxHeight ||
     60       dst_width > kMaxWidth || dst_height > kMaxHeight) {
     61     printf("Warning - size too large to test.  Skipping\n");
     62     return false;
     63   }
     64   return true;
     65 }
     66 
     67 #define align_buffer_page_end(var, size)                                       \
     68   uint8* var;                                                                  \
     69   uint8* var##_mem;                                                            \
     70   var##_mem = reinterpret_cast<uint8*>(malloc(((size) + 4095 + 63) & ~4095));  \
     71   var = (uint8*)((intptr_t)(var##_mem + (((size) + 4095 + 63) & ~4095) -       \
     72       (size)) & ~63);
     73 
     74 #define free_aligned_buffer_page_end(var) \
     75   free(var##_mem);  \
     76   var = 0;
     77 
     78 #ifdef WIN32
     79 static inline double get_time() {
     80   LARGE_INTEGER t, f;
     81   QueryPerformanceCounter(&t);
     82   QueryPerformanceFrequency(&f);
     83   return static_cast<double>(t.QuadPart) / static_cast<double>(f.QuadPart);
     84 }
     85 #else
     86 static inline double get_time() {
     87   struct timeval t;
     88   struct timezone tzp;
     89   gettimeofday(&t, &tzp);
     90   return t.tv_sec + t.tv_usec * 1e-6;
     91 }
     92 #endif
     93 
     94 #ifndef SIMD_ALIGNED
     95 #if defined(_MSC_VER) && !defined(__CLR_VER)
     96 #define SIMD_ALIGNED(var) __declspec(align(16)) var
     97 #elif defined(__GNUC__) && !defined(__pnacl__)
     98 #define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
     99 #else
    100 #define SIMD_ALIGNED(var) var
    101 #endif
    102 #endif
    103 
    104 extern unsigned int fastrand_seed;
    105 inline int fastrand() {
    106   fastrand_seed = fastrand_seed * 214013u + 2531011u;
    107   return static_cast<int>((fastrand_seed >> 16) & 0xffff);
    108 }
    109 
    110 static inline void MemRandomize(uint8* dst, int64 len) {
    111   int64 i;
    112   for (i = 0; i < len - 1; i += 2) {
    113     *reinterpret_cast<uint16*>(dst) = fastrand();
    114     dst += 2;
    115   }
    116   for (; i < len; ++i) {
    117     *dst++ = fastrand();
    118   }
    119 }
    120 
    121 class LibYUVColorTest : public ::testing::Test {
    122  protected:
    123   LibYUVColorTest();
    124 
    125   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    126   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    127   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    128   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    129   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    130   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    131   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    132 };
    133 
    134 class LibYUVConvertTest : public ::testing::Test {
    135  protected:
    136   LibYUVConvertTest();
    137 
    138   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    139   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    140   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    141   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    142   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    143   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    144   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    145 };
    146 
    147 class LibYUVScaleTest : public ::testing::Test {
    148  protected:
    149   LibYUVScaleTest();
    150 
    151   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    152   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    153   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    154   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    155   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    156   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    157   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    158 };
    159 
    160 class LibYUVRotateTest : public ::testing::Test {
    161  protected:
    162   LibYUVRotateTest();
    163 
    164   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    165   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    166   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    167   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    168   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    169   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    170   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    171 };
    172 
    173 class LibYUVPlanarTest : public ::testing::Test {
    174  protected:
    175   LibYUVPlanarTest();
    176 
    177   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    178   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    179   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    180   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    181   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    182   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    183   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    184 };
    185 
    186 class LibYUVBaseTest : public ::testing::Test {
    187  protected:
    188   LibYUVBaseTest();
    189 
    190   int benchmark_iterations_;  // Default 1. Use 1000 for benchmarking.
    191   int benchmark_width_;  // Default 1280.  Use 640 for benchmarking VGA.
    192   int benchmark_height_;  // Default 720.  Use 360 for benchmarking VGA.
    193   int benchmark_pixels_div256_;  // Total pixels to benchmark / 256.
    194   int benchmark_pixels_div1280_;  // Total pixels to benchmark / 1280.
    195   int disable_cpu_flags_;  // Default 1.  Use -1 for benchmarking.
    196   int benchmark_cpu_info_;  // Default -1.  Use 1 to disable SIMD.
    197 };
    198 
    199 #endif  // UNIT_TEST_UNIT_TEST_H_  NOLINT
    200