1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libyuv/unit_test/math_test.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,158 @@ 1.4 +/* 1.5 + * Copyright 2013 The LibYuv Project Authors. All rights reserved. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license 1.8 + * that can be found in the LICENSE file in the root of the source 1.9 + * tree. An additional intellectual property rights grant can be found 1.10 + * in the file PATENTS. All contributing project authors may 1.11 + * be found in the AUTHORS file in the root of the source tree. 1.12 + */ 1.13 + 1.14 +#include <stdlib.h> 1.15 +#include <string.h> 1.16 + 1.17 +#include "libyuv/basic_types.h" 1.18 +#include "libyuv/cpu_id.h" 1.19 +#include "libyuv/row.h" 1.20 +#include "libyuv/scale.h" 1.21 +#include "libyuv/scale_row.h" 1.22 +#include "../unit_test/unit_test.h" 1.23 + 1.24 +namespace libyuv { 1.25 + 1.26 +TEST_F(libyuvTest, TestFixedDiv) { 1.27 + int num[1280]; 1.28 + int div[1280]; 1.29 + int result_opt[1280]; 1.30 + int result_c[1280]; 1.31 + 1.32 + EXPECT_EQ(0x10000, libyuv::FixedDiv(1, 1)); 1.33 + EXPECT_EQ(0x7fff0000, libyuv::FixedDiv(0x7fff, 1)); 1.34 + // TODO(fbarchard): Avoid the following that throw exceptions. 1.35 + // EXPECT_EQ(0x100000000, libyuv::FixedDiv(0x10000, 1)); 1.36 + // EXPECT_EQ(0x80000000, libyuv::FixedDiv(0x8000, 1)); 1.37 + 1.38 + EXPECT_EQ(0x20000, libyuv::FixedDiv(640 * 2, 640)); 1.39 + EXPECT_EQ(0x30000, libyuv::FixedDiv(640 * 3, 640)); 1.40 + EXPECT_EQ(0x40000, libyuv::FixedDiv(640 * 4, 640)); 1.41 + EXPECT_EQ(0x50000, libyuv::FixedDiv(640 * 5, 640)); 1.42 + EXPECT_EQ(0x60000, libyuv::FixedDiv(640 * 6, 640)); 1.43 + EXPECT_EQ(0x70000, libyuv::FixedDiv(640 * 7, 640)); 1.44 + EXPECT_EQ(0x80000, libyuv::FixedDiv(640 * 8, 640)); 1.45 + EXPECT_EQ(0xa0000, libyuv::FixedDiv(640 * 10, 640)); 1.46 + EXPECT_EQ(0x20000, libyuv::FixedDiv(960 * 2, 960)); 1.47 + EXPECT_EQ(0x08000, libyuv::FixedDiv(640 / 2, 640)); 1.48 + EXPECT_EQ(0x04000, libyuv::FixedDiv(640 / 4, 640)); 1.49 + EXPECT_EQ(0x20000, libyuv::FixedDiv(1080 * 2, 1080)); 1.50 + EXPECT_EQ(0x20000, libyuv::FixedDiv(200000, 100000)); 1.51 + EXPECT_EQ(0x18000, libyuv::FixedDiv(150000, 100000)); 1.52 + EXPECT_EQ(0x20000, libyuv::FixedDiv(40000, 20000)); 1.53 + EXPECT_EQ(0x20000, libyuv::FixedDiv(-40000, -20000)); 1.54 + EXPECT_EQ(-0x20000, libyuv::FixedDiv(40000, -20000)); 1.55 + EXPECT_EQ(-0x20000, libyuv::FixedDiv(-40000, 20000)); 1.56 + EXPECT_EQ(0x10000, libyuv::FixedDiv(4095, 4095)); 1.57 + EXPECT_EQ(0x10000, libyuv::FixedDiv(4096, 4096)); 1.58 + EXPECT_EQ(0x10000, libyuv::FixedDiv(4097, 4097)); 1.59 + EXPECT_EQ(123 * 65536, libyuv::FixedDiv(123, 1)); 1.60 + 1.61 + for (int i = 1; i < 4100; ++i) { 1.62 + EXPECT_EQ(0x10000, libyuv::FixedDiv(i, i)); 1.63 + EXPECT_EQ(0x20000, libyuv::FixedDiv(i * 2, i)); 1.64 + EXPECT_EQ(0x30000, libyuv::FixedDiv(i * 3, i)); 1.65 + EXPECT_EQ(0x40000, libyuv::FixedDiv(i * 4, i)); 1.66 + EXPECT_EQ(0x08000, libyuv::FixedDiv(i, i * 2)); 1.67 + EXPECT_NEAR(16384 * 65536 / i, libyuv::FixedDiv(16384, i), 1); 1.68 + } 1.69 + EXPECT_EQ(123 * 65536, libyuv::FixedDiv(123, 1)); 1.70 + 1.71 + srandom(time(NULL)); 1.72 + MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num)); 1.73 + MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div)); 1.74 + for (int j = 0; j < 1280; ++j) { 1.75 + if (div[j] == 0) { 1.76 + div[j] = 1280; 1.77 + } 1.78 + num[j] &= 0xffff; // Clamp to avoid divide overflow. 1.79 + } 1.80 + for (int i = 0; i < benchmark_pixels_div1280_; ++i) { 1.81 + for (int j = 0; j < 1280; ++j) { 1.82 + result_opt[j] = libyuv::FixedDiv(num[j], div[j]); 1.83 + } 1.84 + } 1.85 + for (int j = 0; j < 1280; ++j) { 1.86 + result_c[j] = libyuv::FixedDiv_C(num[j], div[j]); 1.87 + EXPECT_NEAR(result_c[j], result_opt[j], 1); 1.88 + } 1.89 +} 1.90 + 1.91 +TEST_F(libyuvTest, TestFixedDiv_Opt) { 1.92 + int num[1280]; 1.93 + int div[1280]; 1.94 + int result_opt[1280]; 1.95 + int result_c[1280]; 1.96 + 1.97 + srandom(time(NULL)); 1.98 + MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num)); 1.99 + MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div)); 1.100 + for (int j = 0; j < 1280; ++j) { 1.101 + num[j] &= 4095; // Make numerator smaller. 1.102 + div[j] &= 4095; // Make divisor smaller. 1.103 + if (div[j] == 0) { 1.104 + div[j] = 1280; 1.105 + } 1.106 + } 1.107 + 1.108 + int has_x86 = TestCpuFlag(kCpuHasX86); 1.109 + for (int i = 0; i < benchmark_pixels_div1280_; ++i) { 1.110 + if (has_x86) { 1.111 + for (int j = 0; j < 1280; ++j) { 1.112 + result_opt[j] = libyuv::FixedDiv(num[j], div[j]); 1.113 + } 1.114 + } else { 1.115 + for (int j = 0; j < 1280; ++j) { 1.116 + result_opt[j] = libyuv::FixedDiv_C(num[j], div[j]); 1.117 + } 1.118 + } 1.119 + } 1.120 + for (int j = 0; j < 1280; ++j) { 1.121 + result_c[j] = libyuv::FixedDiv_C(num[j], div[j]); 1.122 + EXPECT_NEAR(result_c[j], result_opt[j], 1); 1.123 + } 1.124 +} 1.125 + 1.126 +TEST_F(libyuvTest, TestFixedDiv1_Opt) { 1.127 + int num[1280]; 1.128 + int div[1280]; 1.129 + int result_opt[1280]; 1.130 + int result_c[1280]; 1.131 + 1.132 + srandom(time(NULL)); 1.133 + MemRandomize(reinterpret_cast<uint8*>(&num[0]), sizeof(num)); 1.134 + MemRandomize(reinterpret_cast<uint8*>(&div[0]), sizeof(div)); 1.135 + for (int j = 0; j < 1280; ++j) { 1.136 + num[j] &= 4095; // Make numerator smaller. 1.137 + div[j] &= 4095; // Make divisor smaller. 1.138 + if (div[j] <= 1) { 1.139 + div[j] = 1280; 1.140 + } 1.141 + } 1.142 + 1.143 + int has_x86 = TestCpuFlag(kCpuHasX86); 1.144 + for (int i = 0; i < benchmark_pixels_div1280_; ++i) { 1.145 + if (has_x86) { 1.146 + for (int j = 0; j < 1280; ++j) { 1.147 + result_opt[j] = libyuv::FixedDiv1(num[j], div[j]); 1.148 + } 1.149 + } else { 1.150 + for (int j = 0; j < 1280; ++j) { 1.151 + result_opt[j] = libyuv::FixedDiv1_C(num[j], div[j]); 1.152 + } 1.153 + } 1.154 + } 1.155 + for (int j = 0; j < 1280; ++j) { 1.156 + result_c[j] = libyuv::FixedDiv1_C(num[j], div[j]); 1.157 + EXPECT_NEAR(result_c[j], result_opt[j], 1); 1.158 + } 1.159 +} 1.160 + 1.161 +} // namespace libyuv