react-native-vision-camera-spoof-detector 1.1.23 → 1.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/android/CMakeLists.txt +12 -0
  2. package/android/build.gradle +10 -9
  3. package/android/src/main/cpp/cpp-adapter.cpp +6 -3
  4. package/package.json +1 -1
  5. package/android/src/main/cpp/CMakeLists.txt +0 -33
  6. package/android/src/main/cpp/FaceAntiSpoofJSI.cpp +0 -142
  7. package/android/src/main/cpp/FastYuvJni.cpp +0 -111
  8. package/android/src/main/cpp/fast_yuv.cpp +0 -342
  9. package/android/src/main/cpp/fast_yuv.h +0 -23
  10. package/android/src/main/cpp/libyuv/.clang-format +0 -6
  11. package/android/src/main/cpp/libyuv/.gn +0 -40
  12. package/android/src/main/cpp/libyuv/.vpython3 +0 -410
  13. package/android/src/main/cpp/libyuv/AUTHORS +0 -7
  14. package/android/src/main/cpp/libyuv/Android.bp +0 -202
  15. package/android/src/main/cpp/libyuv/Android.mk +0 -106
  16. package/android/src/main/cpp/libyuv/BUILD.gn +0 -490
  17. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +0 -70
  18. package/android/src/main/cpp/libyuv/CMakeLists.txt +0 -259
  19. package/android/src/main/cpp/libyuv/DEPS +0 -935
  20. package/android/src/main/cpp/libyuv/DIR_METADATA +0 -3
  21. package/android/src/main/cpp/libyuv/LICENSE +0 -29
  22. package/android/src/main/cpp/libyuv/OWNERS +0 -11
  23. package/android/src/main/cpp/libyuv/PATENTS +0 -24
  24. package/android/src/main/cpp/libyuv/PRESUBMIT.py +0 -65
  25. package/android/src/main/cpp/libyuv/README.chromium +0 -11
  26. package/android/src/main/cpp/libyuv/README.md +0 -19
  27. package/android/src/main/cpp/libyuv/build_overrides/build.gni +0 -60
  28. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +0 -19
  29. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +0 -17
  30. package/android/src/main/cpp/libyuv/codereview.settings +0 -5
  31. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +0 -409
  32. package/android/src/main/cpp/libyuv/docs/environment_variables.md +0 -64
  33. package/android/src/main/cpp/libyuv/docs/feature_detection.md +0 -108
  34. package/android/src/main/cpp/libyuv/docs/filtering.md +0 -196
  35. package/android/src/main/cpp/libyuv/docs/formats.md +0 -208
  36. package/android/src/main/cpp/libyuv/docs/getting_started.md +0 -296
  37. package/android/src/main/cpp/libyuv/docs/rotation.md +0 -107
  38. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +0 -29
  39. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +0 -68
  40. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +0 -111
  41. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +0 -112
  42. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +0 -1117
  43. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +0 -2335
  44. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +0 -203
  45. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +0 -394
  46. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +0 -147
  47. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +0 -99
  48. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +0 -1949
  49. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +0 -195
  50. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +0 -1131
  51. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +0 -296
  52. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +0 -37
  53. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +0 -265
  54. package/android/src/main/cpp/libyuv/include/libyuv/row.h +0 -6738
  55. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +0 -2154
  56. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +0 -336
  57. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +0 -76
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +0 -42
  59. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +0 -1726
  60. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +0 -51
  61. package/android/src/main/cpp/libyuv/include/libyuv/version.h +0 -16
  62. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +0 -222
  63. package/android/src/main/cpp/libyuv/include/libyuv.h +0 -33
  64. package/android/src/main/cpp/libyuv/infra/config/OWNERS +0 -3
  65. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +0 -17
  66. package/android/src/main/cpp/libyuv/infra/config/README.md +0 -2
  67. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +0 -6
  68. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +0 -144
  69. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +0 -1185
  70. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +0 -9
  71. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +0 -246
  72. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +0 -385
  73. package/android/src/main/cpp/libyuv/infra/config/main.star +0 -402
  74. package/android/src/main/cpp/libyuv/infra/config/project.cfg +0 -16
  75. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +0 -111
  76. package/android/src/main/cpp/libyuv/libyuv.gni +0 -34
  77. package/android/src/main/cpp/libyuv/libyuv.gyp +0 -149
  78. package/android/src/main/cpp/libyuv/libyuv.gypi +0 -87
  79. package/android/src/main/cpp/libyuv/linux.mk +0 -96
  80. package/android/src/main/cpp/libyuv/public.mk +0 -13
  81. package/android/src/main/cpp/libyuv/pylintrc +0 -49
  82. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +0 -74
  83. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +0 -56
  84. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +0 -15
  85. package/android/src/main/cpp/libyuv/source/compare.cc +0 -435
  86. package/android/src/main/cpp/libyuv/source/compare_common.cc +0 -74
  87. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +0 -362
  88. package/android/src/main/cpp/libyuv/source/compare_neon.cc +0 -96
  89. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +0 -223
  90. package/android/src/main/cpp/libyuv/source/compare_win.cc +0 -241
  91. package/android/src/main/cpp/libyuv/source/convert.cc +0 -4746
  92. package/android/src/main/cpp/libyuv/source/convert_argb.cc +0 -9179
  93. package/android/src/main/cpp/libyuv/source/convert_from.cc +0 -866
  94. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +0 -3671
  95. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +0 -602
  96. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +0 -391
  97. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +0 -288
  98. package/android/src/main/cpp/libyuv/source/cpu_id.cc +0 -496
  99. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +0 -580
  100. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +0 -71
  101. package/android/src/main/cpp/libyuv/source/planar_functions.cc +0 -5663
  102. package/android/src/main/cpp/libyuv/source/rotate.cc +0 -1241
  103. package/android/src/main/cpp/libyuv/source/rotate_any.cc +0 -76
  104. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +0 -259
  105. package/android/src/main/cpp/libyuv/source/rotate_common.cc +0 -208
  106. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +0 -505
  107. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +0 -233
  108. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +0 -219
  109. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +0 -273
  110. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +0 -174
  111. package/android/src/main/cpp/libyuv/source/rotate_win.cc +0 -253
  112. package/android/src/main/cpp/libyuv/source/row_any.cc +0 -2519
  113. package/android/src/main/cpp/libyuv/source/row_common.cc +0 -4461
  114. package/android/src/main/cpp/libyuv/source/row_gcc.cc +0 -9570
  115. package/android/src/main/cpp/libyuv/source/row_lasx.cc +0 -2343
  116. package/android/src/main/cpp/libyuv/source/row_lsx.cc +0 -3030
  117. package/android/src/main/cpp/libyuv/source/row_neon.cc +0 -4026
  118. package/android/src/main/cpp/libyuv/source/row_neon64.cc +0 -5617
  119. package/android/src/main/cpp/libyuv/source/row_rvv.cc +0 -2599
  120. package/android/src/main/cpp/libyuv/source/row_sme.cc +0 -1183
  121. package/android/src/main/cpp/libyuv/source/row_sve.cc +0 -1088
  122. package/android/src/main/cpp/libyuv/source/row_win.cc +0 -6453
  123. package/android/src/main/cpp/libyuv/source/scale.cc +0 -2710
  124. package/android/src/main/cpp/libyuv/source/scale_any.cc +0 -991
  125. package/android/src/main/cpp/libyuv/source/scale_argb.cc +0 -1158
  126. package/android/src/main/cpp/libyuv/source/scale_common.cc +0 -1977
  127. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +0 -2947
  128. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +0 -739
  129. package/android/src/main/cpp/libyuv/source/scale_neon.cc +0 -1449
  130. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +0 -1552
  131. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +0 -82
  132. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +0 -1971
  133. package/android/src/main/cpp/libyuv/source/scale_sme.cc +0 -555
  134. package/android/src/main/cpp/libyuv/source/scale_uv.cc +0 -1159
  135. package/android/src/main/cpp/libyuv/source/scale_win.cc +0 -1392
  136. package/android/src/main/cpp/libyuv/source/test.sh +0 -35
  137. package/android/src/main/cpp/libyuv/source/video_common.cc +0 -62
  138. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +0 -4
  139. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +0 -931
  140. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +0 -164
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +0 -21
  142. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +0 -13
  143. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +0 -13
  144. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +0 -38
  145. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +0 -3
  146. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +0 -9
  147. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +0 -3
  148. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +0 -15
  149. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +0 -25
  150. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +0 -43
  151. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +0 -848
  152. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +0 -739
  153. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +0 -2867
  154. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +0 -2133
  155. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +0 -427
  156. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +0 -63
  157. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +0 -160
  158. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +0 -4731
  159. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +0 -334
  160. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +0 -962
  161. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +0 -590
  162. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +0 -465
  163. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +0 -280
  164. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +0 -1135
  165. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +0 -249
  166. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +0 -12
  167. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +0 -7
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +0 -5
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +0 -10
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +0 -7
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +0 -4
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +0 -4
  173. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +0 -4
  174. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +0 -23
  175. package/android/src/main/cpp/libyuv/unit_test/testdata/test0.jpg +0 -0
  176. package/android/src/main/cpp/libyuv/unit_test/testdata/test1.jpg +0 -0
  177. package/android/src/main/cpp/libyuv/unit_test/testdata/test2.jpg +0 -0
  178. package/android/src/main/cpp/libyuv/unit_test/testdata/test3.jpg +0 -0
  179. package/android/src/main/cpp/libyuv/unit_test/testdata/test4.jpg +0 -0
  180. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +0 -581
  181. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +0 -232
  182. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +0 -112
  183. package/android/src/main/cpp/libyuv/util/Makefile +0 -9
  184. package/android/src/main/cpp/libyuv/util/color.cc +0 -120
  185. package/android/src/main/cpp/libyuv/util/compare.cc +0 -67
  186. package/android/src/main/cpp/libyuv/util/cpuid.c +0 -211
  187. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +0 -28
  188. package/android/src/main/cpp/libyuv/util/psnr.cc +0 -291
  189. package/android/src/main/cpp/libyuv/util/psnr.h +0 -47
  190. package/android/src/main/cpp/libyuv/util/psnr_main.cc +0 -620
  191. package/android/src/main/cpp/libyuv/util/ssim.cc +0 -364
  192. package/android/src/main/cpp/libyuv/util/ssim.h +0 -38
  193. package/android/src/main/cpp/libyuv/util/yuvconstants.c +0 -114
  194. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +0 -367
  195. package/android/src/main/cpp/libyuv/winarm.mk +0 -47
  196. package/android/src/main/java/com/faceantispoof/ByteBufferPool.kt +0 -68
  197. package/android/src/main/java/com/faceantispoof/FastYuv.kt +0 -51
  198. package/android/src/main/java/com/faceantispoof/YuvToFloatArrayConverter.kt +0 -584
  199. package/android/src/main/java/com/faceantispoof/YuvToRgbConverter.kt +0 -73
@@ -1,4731 +0,0 @@
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
- #include <math.h>
12
- #include <stdlib.h>
13
- #include <time.h>
14
-
15
- #include "../unit_test/unit_test.h"
16
- #include "libyuv/compare.h"
17
- #include "libyuv/convert.h"
18
- #include "libyuv/convert_argb.h"
19
- #include "libyuv/convert_from.h"
20
- #include "libyuv/convert_from_argb.h"
21
- #include "libyuv/cpu_id.h"
22
- #include "libyuv/planar_functions.h"
23
- #include "libyuv/rotate.h"
24
- #include "libyuv/scale.h"
25
-
26
- #ifdef ENABLE_ROW_TESTS
27
- // row.h defines SIMD_ALIGNED, overriding unit_test.h
28
- // TODO(fbarchard): Remove row.h from unittests. Test public functions.
29
- #include "libyuv/row.h" /* For ScaleSumSamples_Neon */
30
- #endif
31
-
32
- #if defined(LIBYUV_BIT_EXACT)
33
- #define EXPECTED_UNATTENUATE_DIFF 0
34
- #else
35
- #define EXPECTED_UNATTENUATE_DIFF 2
36
- #endif
37
-
38
- namespace libyuv {
39
-
40
- TEST_F(LibYUVPlanarTest, TestAttenuate) {
41
- const int kSize = 1280 * 4;
42
- align_buffer_page_end(orig_pixels, kSize);
43
- align_buffer_page_end(atten_pixels, kSize);
44
- align_buffer_page_end(unatten_pixels, kSize);
45
- align_buffer_page_end(atten2_pixels, kSize);
46
-
47
- // Test unattenuation clamps
48
- orig_pixels[0 * 4 + 0] = 200u;
49
- orig_pixels[0 * 4 + 1] = 129u;
50
- orig_pixels[0 * 4 + 2] = 127u;
51
- orig_pixels[0 * 4 + 3] = 128u;
52
- // Test unattenuation transparent and opaque are unaffected
53
- orig_pixels[1 * 4 + 0] = 16u;
54
- orig_pixels[1 * 4 + 1] = 64u;
55
- orig_pixels[1 * 4 + 2] = 192u;
56
- orig_pixels[1 * 4 + 3] = 0u;
57
- orig_pixels[2 * 4 + 0] = 16u;
58
- orig_pixels[2 * 4 + 1] = 64u;
59
- orig_pixels[2 * 4 + 2] = 192u;
60
- orig_pixels[2 * 4 + 3] = 128u;
61
- orig_pixels[3 * 4 + 0] = 16u;
62
- orig_pixels[3 * 4 + 1] = 64u;
63
- orig_pixels[3 * 4 + 2] = 192u;
64
- orig_pixels[3 * 4 + 3] = 255u;
65
- orig_pixels[4 * 4 + 0] = 255u;
66
- orig_pixels[4 * 4 + 1] = 255u;
67
- orig_pixels[4 * 4 + 2] = 255u;
68
- orig_pixels[4 * 4 + 3] = 255u;
69
-
70
- ARGBUnattenuate(orig_pixels, 0, unatten_pixels, 0, 5, 1);
71
- EXPECT_EQ(255u, unatten_pixels[0 * 4 + 0]);
72
- EXPECT_EQ(255u, unatten_pixels[0 * 4 + 1]);
73
- EXPECT_EQ(254u, unatten_pixels[0 * 4 + 2]);
74
- EXPECT_EQ(128u, unatten_pixels[0 * 4 + 3]);
75
- EXPECT_EQ(0u, unatten_pixels[1 * 4 + 0]);
76
- EXPECT_EQ(0u, unatten_pixels[1 * 4 + 1]);
77
- EXPECT_EQ(0u, unatten_pixels[1 * 4 + 2]);
78
- EXPECT_EQ(0u, unatten_pixels[1 * 4 + 3]);
79
- EXPECT_EQ(32u, unatten_pixels[2 * 4 + 0]);
80
- EXPECT_EQ(128u, unatten_pixels[2 * 4 + 1]);
81
- EXPECT_EQ(255u, unatten_pixels[2 * 4 + 2]);
82
- EXPECT_EQ(128u, unatten_pixels[2 * 4 + 3]);
83
- EXPECT_EQ(16u, unatten_pixels[3 * 4 + 0]);
84
- EXPECT_EQ(64u, unatten_pixels[3 * 4 + 1]);
85
- EXPECT_EQ(192u, unatten_pixels[3 * 4 + 2]);
86
- EXPECT_EQ(255u, unatten_pixels[3 * 4 + 3]);
87
- EXPECT_EQ(255u, unatten_pixels[4 * 4 + 0]);
88
- EXPECT_EQ(255u, unatten_pixels[4 * 4 + 1]);
89
- EXPECT_EQ(255u, unatten_pixels[4 * 4 + 2]);
90
- EXPECT_EQ(255u, unatten_pixels[4 * 4 + 3]);
91
-
92
- ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 5, 1);
93
- EXPECT_EQ(100u, atten_pixels[0 * 4 + 0]);
94
- EXPECT_EQ(65u, atten_pixels[0 * 4 + 1]);
95
- EXPECT_EQ(64u, atten_pixels[0 * 4 + 2]);
96
- EXPECT_EQ(128u, atten_pixels[0 * 4 + 3]);
97
- EXPECT_EQ(0u, atten_pixels[1 * 4 + 0]);
98
- EXPECT_EQ(0u, atten_pixels[1 * 4 + 1]);
99
- EXPECT_EQ(0u, atten_pixels[1 * 4 + 2]);
100
- EXPECT_EQ(0u, atten_pixels[1 * 4 + 3]);
101
- EXPECT_EQ(8u, atten_pixels[2 * 4 + 0]);
102
- EXPECT_EQ(32u, atten_pixels[2 * 4 + 1]);
103
- EXPECT_EQ(96u, atten_pixels[2 * 4 + 2]);
104
- EXPECT_EQ(128u, atten_pixels[2 * 4 + 3]);
105
- EXPECT_EQ(16u, atten_pixels[3 * 4 + 0]);
106
- EXPECT_EQ(64u, atten_pixels[3 * 4 + 1]);
107
- EXPECT_EQ(192u, atten_pixels[3 * 4 + 2]);
108
- EXPECT_EQ(255u, atten_pixels[3 * 4 + 3]);
109
- EXPECT_EQ(255u, atten_pixels[4 * 4 + 0]);
110
- EXPECT_EQ(255u, atten_pixels[4 * 4 + 1]);
111
- EXPECT_EQ(255u, atten_pixels[4 * 4 + 2]);
112
- EXPECT_EQ(255u, atten_pixels[4 * 4 + 3]);
113
-
114
- // test 255
115
- for (int i = 0; i < 256; ++i) {
116
- orig_pixels[i * 4 + 0] = i;
117
- orig_pixels[i * 4 + 1] = 0;
118
- orig_pixels[i * 4 + 2] = 0;
119
- orig_pixels[i * 4 + 3] = 255;
120
- }
121
- ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 256, 1);
122
- for (int i = 0; i < 256; ++i) {
123
- EXPECT_EQ(orig_pixels[i * 4 + 0], atten_pixels[i * 4 + 0]);
124
- EXPECT_EQ(0, atten_pixels[i * 4 + 1]);
125
- EXPECT_EQ(0, atten_pixels[i * 4 + 2]);
126
- EXPECT_EQ(255, atten_pixels[i * 4 + 3]);
127
- }
128
-
129
- for (int i = 0; i < 1280; ++i) {
130
- orig_pixels[i * 4 + 0] = i;
131
- orig_pixels[i * 4 + 1] = i / 2;
132
- orig_pixels[i * 4 + 2] = i / 3;
133
- orig_pixels[i * 4 + 3] = i;
134
- }
135
- ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 1280, 1);
136
- ARGBUnattenuate(atten_pixels, 0, unatten_pixels, 0, 1280, 1);
137
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
138
- ARGBAttenuate(unatten_pixels, 0, atten2_pixels, 0, 1280, 1);
139
- }
140
- for (int i = 0; i < 1280; ++i) {
141
- EXPECT_NEAR(atten_pixels[i * 4 + 0], atten2_pixels[i * 4 + 0], 1);
142
- EXPECT_NEAR(atten_pixels[i * 4 + 1], atten2_pixels[i * 4 + 1], 1);
143
- EXPECT_NEAR(atten_pixels[i * 4 + 2], atten2_pixels[i * 4 + 2], 1);
144
- EXPECT_NEAR(atten_pixels[i * 4 + 3], atten2_pixels[i * 4 + 3], 1);
145
- }
146
- // Make sure transparent, 50% and opaque are fully accurate.
147
- EXPECT_EQ(0, atten_pixels[0 * 4 + 0]);
148
- EXPECT_EQ(0, atten_pixels[0 * 4 + 1]);
149
- EXPECT_EQ(0, atten_pixels[0 * 4 + 2]);
150
- EXPECT_EQ(0, atten_pixels[0 * 4 + 3]);
151
- EXPECT_EQ(64, atten_pixels[128 * 4 + 0]);
152
- EXPECT_EQ(32, atten_pixels[128 * 4 + 1]);
153
- EXPECT_EQ(21, atten_pixels[128 * 4 + 2]);
154
- EXPECT_EQ(128, atten_pixels[128 * 4 + 3]);
155
- EXPECT_EQ(255, atten_pixels[255 * 4 + 0]);
156
- EXPECT_EQ(127, atten_pixels[255 * 4 + 1]);
157
- EXPECT_EQ(85, atten_pixels[255 * 4 + 2]);
158
- EXPECT_EQ(255, atten_pixels[255 * 4 + 3]);
159
-
160
- free_aligned_buffer_page_end(atten2_pixels);
161
- free_aligned_buffer_page_end(unatten_pixels);
162
- free_aligned_buffer_page_end(atten_pixels);
163
- free_aligned_buffer_page_end(orig_pixels);
164
- }
165
-
166
- static int TestAttenuateI(int width,
167
- int height,
168
- int benchmark_iterations,
169
- int disable_cpu_flags,
170
- int benchmark_cpu_info,
171
- int invert,
172
- int off) {
173
- if (width < 1) {
174
- width = 1;
175
- }
176
- const int kBpp = 4;
177
- const int kStride = width * kBpp;
178
- align_buffer_page_end(src_argb, kStride * height + off);
179
- align_buffer_page_end(dst_argb_c, kStride * height);
180
- align_buffer_page_end(dst_argb_opt, kStride * height);
181
- for (int i = 0; i < kStride * height; ++i) {
182
- src_argb[i + off] = (fastrand() & 0xff);
183
- }
184
- memset(dst_argb_c, 0, kStride * height);
185
- memset(dst_argb_opt, 0, kStride * height);
186
-
187
- MaskCpuFlags(disable_cpu_flags);
188
- ARGBAttenuate(src_argb + off, kStride, dst_argb_c, kStride, width,
189
- invert * height);
190
- MaskCpuFlags(benchmark_cpu_info);
191
- for (int i = 0; i < benchmark_iterations; ++i) {
192
- ARGBAttenuate(src_argb + off, kStride, dst_argb_opt, kStride, width,
193
- invert * height);
194
- }
195
- int max_diff = 0;
196
- for (int i = 0; i < kStride * height; ++i) {
197
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
198
- static_cast<int>(dst_argb_opt[i]));
199
- if (abs_diff > max_diff) {
200
- max_diff = abs_diff;
201
- }
202
- }
203
- free_aligned_buffer_page_end(src_argb);
204
- free_aligned_buffer_page_end(dst_argb_c);
205
- free_aligned_buffer_page_end(dst_argb_opt);
206
- return max_diff;
207
- }
208
-
209
- TEST_F(LibYUVPlanarTest, ARGBAttenuate_Any) {
210
- int max_diff = TestAttenuateI(benchmark_width_ + 1, benchmark_height_,
211
- benchmark_iterations_, disable_cpu_flags_,
212
- benchmark_cpu_info_, +1, 0);
213
-
214
- EXPECT_EQ(max_diff, 0);
215
- }
216
-
217
- TEST_F(LibYUVPlanarTest, ARGBAttenuate_Unaligned) {
218
- int max_diff =
219
- TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
220
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
221
- EXPECT_EQ(max_diff, 0);
222
- }
223
-
224
- TEST_F(LibYUVPlanarTest, ARGBAttenuate_Invert) {
225
- int max_diff =
226
- TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
227
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
228
- EXPECT_EQ(max_diff, 0);
229
- }
230
-
231
- TEST_F(LibYUVPlanarTest, ARGBAttenuate_Opt) {
232
- int max_diff =
233
- TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
234
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
235
- EXPECT_EQ(max_diff, 0);
236
- }
237
-
238
- static int TestUnattenuateI(int width,
239
- int height,
240
- int benchmark_iterations,
241
- int disable_cpu_flags,
242
- int benchmark_cpu_info,
243
- int invert,
244
- int off) {
245
- if (width < 1) {
246
- width = 1;
247
- }
248
- const int kBpp = 4;
249
- const int kStride = width * kBpp;
250
- align_buffer_page_end(src_argb, kStride * height + off);
251
- align_buffer_page_end(dst_argb_c, kStride * height);
252
- align_buffer_page_end(dst_argb_opt, kStride * height);
253
- for (int i = 0; i < kStride * height; ++i) {
254
- src_argb[i + off] = (fastrand() & 0xff);
255
- }
256
- ARGBAttenuate(src_argb + off, kStride, src_argb + off, kStride, width,
257
- height);
258
- memset(dst_argb_c, 0, kStride * height);
259
- memset(dst_argb_opt, 0, kStride * height);
260
-
261
- MaskCpuFlags(disable_cpu_flags);
262
- ARGBUnattenuate(src_argb + off, kStride, dst_argb_c, kStride, width,
263
- invert * height);
264
- MaskCpuFlags(benchmark_cpu_info);
265
- for (int i = 0; i < benchmark_iterations; ++i) {
266
- ARGBUnattenuate(src_argb + off, kStride, dst_argb_opt, kStride, width,
267
- invert * height);
268
- }
269
- int max_diff = 0;
270
- for (int i = 0; i < kStride * height; ++i) {
271
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
272
- static_cast<int>(dst_argb_opt[i]));
273
- if (abs_diff > max_diff) {
274
- max_diff = abs_diff;
275
- }
276
- }
277
- free_aligned_buffer_page_end(src_argb);
278
- free_aligned_buffer_page_end(dst_argb_c);
279
- free_aligned_buffer_page_end(dst_argb_opt);
280
- return max_diff;
281
- }
282
-
283
- TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Any) {
284
- int max_diff = TestUnattenuateI(benchmark_width_ + 1, benchmark_height_,
285
- benchmark_iterations_, disable_cpu_flags_,
286
- benchmark_cpu_info_, +1, 0);
287
- EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
288
- }
289
-
290
- TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Unaligned) {
291
- int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
292
- benchmark_iterations_, disable_cpu_flags_,
293
- benchmark_cpu_info_, +1, 1);
294
- EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
295
- }
296
-
297
- TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Invert) {
298
- int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
299
- benchmark_iterations_, disable_cpu_flags_,
300
- benchmark_cpu_info_, -1, 0);
301
- EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
302
- }
303
-
304
- TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Opt) {
305
- int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
306
- benchmark_iterations_, disable_cpu_flags_,
307
- benchmark_cpu_info_, +1, 0);
308
- EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
309
- }
310
-
311
- TEST_F(LibYUVPlanarTest, TestARGBComputeCumulativeSum) {
312
- SIMD_ALIGNED(uint8_t orig_pixels[16][16][4]);
313
- SIMD_ALIGNED(int32_t added_pixels[16][16][4]);
314
-
315
- for (int y = 0; y < 16; ++y) {
316
- for (int x = 0; x < 16; ++x) {
317
- orig_pixels[y][x][0] = 1u;
318
- orig_pixels[y][x][1] = 2u;
319
- orig_pixels[y][x][2] = 3u;
320
- orig_pixels[y][x][3] = 255u;
321
- }
322
- }
323
-
324
- ARGBComputeCumulativeSum(&orig_pixels[0][0][0], 16 * 4,
325
- &added_pixels[0][0][0], 16 * 4, 16, 16);
326
-
327
- for (int y = 0; y < 16; ++y) {
328
- for (int x = 0; x < 16; ++x) {
329
- EXPECT_EQ((x + 1) * (y + 1), added_pixels[y][x][0]);
330
- EXPECT_EQ((x + 1) * (y + 1) * 2, added_pixels[y][x][1]);
331
- EXPECT_EQ((x + 1) * (y + 1) * 3, added_pixels[y][x][2]);
332
- EXPECT_EQ((x + 1) * (y + 1) * 255, added_pixels[y][x][3]);
333
- }
334
- }
335
- }
336
-
337
- // near is for legacy platforms.
338
- TEST_F(LibYUVPlanarTest, TestARGBGray) {
339
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
340
- memset(orig_pixels, 0, sizeof(orig_pixels));
341
-
342
- // Test blue
343
- orig_pixels[0][0] = 255u;
344
- orig_pixels[0][1] = 0u;
345
- orig_pixels[0][2] = 0u;
346
- orig_pixels[0][3] = 128u;
347
- // Test green
348
- orig_pixels[1][0] = 0u;
349
- orig_pixels[1][1] = 255u;
350
- orig_pixels[1][2] = 0u;
351
- orig_pixels[1][3] = 0u;
352
- // Test red
353
- orig_pixels[2][0] = 0u;
354
- orig_pixels[2][1] = 0u;
355
- orig_pixels[2][2] = 255u;
356
- orig_pixels[2][3] = 255u;
357
- // Test black
358
- orig_pixels[3][0] = 0u;
359
- orig_pixels[3][1] = 0u;
360
- orig_pixels[3][2] = 0u;
361
- orig_pixels[3][3] = 255u;
362
- // Test white
363
- orig_pixels[4][0] = 255u;
364
- orig_pixels[4][1] = 255u;
365
- orig_pixels[4][2] = 255u;
366
- orig_pixels[4][3] = 255u;
367
- // Test color
368
- orig_pixels[5][0] = 16u;
369
- orig_pixels[5][1] = 64u;
370
- orig_pixels[5][2] = 192u;
371
- orig_pixels[5][3] = 224u;
372
- // Do 16 to test asm version.
373
- ARGBGray(&orig_pixels[0][0], 0, 0, 0, 16, 1);
374
- EXPECT_NEAR(29u, orig_pixels[0][0], 1);
375
- EXPECT_NEAR(29u, orig_pixels[0][1], 1);
376
- EXPECT_NEAR(29u, orig_pixels[0][2], 1);
377
- EXPECT_EQ(128u, orig_pixels[0][3]);
378
- EXPECT_EQ(149u, orig_pixels[1][0]);
379
- EXPECT_EQ(149u, orig_pixels[1][1]);
380
- EXPECT_EQ(149u, orig_pixels[1][2]);
381
- EXPECT_EQ(0u, orig_pixels[1][3]);
382
- EXPECT_NEAR(77u, orig_pixels[2][0], 1);
383
- EXPECT_NEAR(77u, orig_pixels[2][1], 1);
384
- EXPECT_NEAR(77u, orig_pixels[2][2], 1);
385
- EXPECT_EQ(255u, orig_pixels[2][3]);
386
- EXPECT_EQ(0u, orig_pixels[3][0]);
387
- EXPECT_EQ(0u, orig_pixels[3][1]);
388
- EXPECT_EQ(0u, orig_pixels[3][2]);
389
- EXPECT_EQ(255u, orig_pixels[3][3]);
390
- EXPECT_EQ(255u, orig_pixels[4][0]);
391
- EXPECT_EQ(255u, orig_pixels[4][1]);
392
- EXPECT_EQ(255u, orig_pixels[4][2]);
393
- EXPECT_EQ(255u, orig_pixels[4][3]);
394
- EXPECT_NEAR(97u, orig_pixels[5][0], 1);
395
- EXPECT_NEAR(97u, orig_pixels[5][1], 1);
396
- EXPECT_NEAR(97u, orig_pixels[5][2], 1);
397
- EXPECT_EQ(224u, orig_pixels[5][3]);
398
- for (int i = 0; i < 1280; ++i) {
399
- orig_pixels[i][0] = i;
400
- orig_pixels[i][1] = i / 2;
401
- orig_pixels[i][2] = i / 3;
402
- orig_pixels[i][3] = i;
403
- }
404
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
405
- ARGBGray(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
406
- }
407
- }
408
-
409
- TEST_F(LibYUVPlanarTest, TestARGBGrayTo) {
410
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
411
- SIMD_ALIGNED(uint8_t gray_pixels[1280][4]);
412
- memset(orig_pixels, 0, sizeof(orig_pixels));
413
-
414
- // Test blue
415
- orig_pixels[0][0] = 255u;
416
- orig_pixels[0][1] = 0u;
417
- orig_pixels[0][2] = 0u;
418
- orig_pixels[0][3] = 128u;
419
- // Test green
420
- orig_pixels[1][0] = 0u;
421
- orig_pixels[1][1] = 255u;
422
- orig_pixels[1][2] = 0u;
423
- orig_pixels[1][3] = 0u;
424
- // Test red
425
- orig_pixels[2][0] = 0u;
426
- orig_pixels[2][1] = 0u;
427
- orig_pixels[2][2] = 255u;
428
- orig_pixels[2][3] = 255u;
429
- // Test black
430
- orig_pixels[3][0] = 0u;
431
- orig_pixels[3][1] = 0u;
432
- orig_pixels[3][2] = 0u;
433
- orig_pixels[3][3] = 255u;
434
- // Test white
435
- orig_pixels[4][0] = 255u;
436
- orig_pixels[4][1] = 255u;
437
- orig_pixels[4][2] = 255u;
438
- orig_pixels[4][3] = 255u;
439
- // Test color
440
- orig_pixels[5][0] = 16u;
441
- orig_pixels[5][1] = 64u;
442
- orig_pixels[5][2] = 192u;
443
- orig_pixels[5][3] = 224u;
444
- // Do 16 to test asm version.
445
- ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 16, 1);
446
- EXPECT_NEAR(30u, gray_pixels[0][0], 1);
447
- EXPECT_NEAR(30u, gray_pixels[0][1], 1);
448
- EXPECT_NEAR(30u, gray_pixels[0][2], 1);
449
- EXPECT_NEAR(128u, gray_pixels[0][3], 1);
450
- EXPECT_NEAR(149u, gray_pixels[1][0], 1);
451
- EXPECT_NEAR(149u, gray_pixels[1][1], 1);
452
- EXPECT_NEAR(149u, gray_pixels[1][2], 1);
453
- EXPECT_NEAR(0u, gray_pixels[1][3], 1);
454
- EXPECT_NEAR(76u, gray_pixels[2][0], 1);
455
- EXPECT_NEAR(76u, gray_pixels[2][1], 1);
456
- EXPECT_NEAR(76u, gray_pixels[2][2], 1);
457
- EXPECT_NEAR(255u, gray_pixels[2][3], 1);
458
- EXPECT_NEAR(0u, gray_pixels[3][0], 1);
459
- EXPECT_NEAR(0u, gray_pixels[3][1], 1);
460
- EXPECT_NEAR(0u, gray_pixels[3][2], 1);
461
- EXPECT_NEAR(255u, gray_pixels[3][3], 1);
462
- EXPECT_NEAR(255u, gray_pixels[4][0], 1);
463
- EXPECT_NEAR(255u, gray_pixels[4][1], 1);
464
- EXPECT_NEAR(255u, gray_pixels[4][2], 1);
465
- EXPECT_NEAR(255u, gray_pixels[4][3], 1);
466
- EXPECT_NEAR(96u, gray_pixels[5][0], 1);
467
- EXPECT_NEAR(96u, gray_pixels[5][1], 1);
468
- EXPECT_NEAR(96u, gray_pixels[5][2], 1);
469
- EXPECT_NEAR(224u, gray_pixels[5][3], 1);
470
- for (int i = 0; i < 1280; ++i) {
471
- orig_pixels[i][0] = i;
472
- orig_pixels[i][1] = i / 2;
473
- orig_pixels[i][2] = i / 3;
474
- orig_pixels[i][3] = i;
475
- }
476
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
477
- ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 1280, 1);
478
- }
479
-
480
- for (int i = 0; i < 256; ++i) {
481
- orig_pixels[i][0] = i;
482
- orig_pixels[i][1] = i;
483
- orig_pixels[i][2] = i;
484
- orig_pixels[i][3] = i;
485
- }
486
- ARGBGray(&orig_pixels[0][0], 0, 0, 0, 256, 1);
487
- for (int i = 0; i < 256; ++i) {
488
- EXPECT_EQ(i, orig_pixels[i][0]);
489
- EXPECT_EQ(i, orig_pixels[i][1]);
490
- EXPECT_EQ(i, orig_pixels[i][2]);
491
- EXPECT_EQ(i, orig_pixels[i][3]);
492
- }
493
- }
494
-
495
- TEST_F(LibYUVPlanarTest, TestARGBSepia) {
496
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
497
- memset(orig_pixels, 0, sizeof(orig_pixels));
498
-
499
- // Test blue
500
- orig_pixels[0][0] = 255u;
501
- orig_pixels[0][1] = 0u;
502
- orig_pixels[0][2] = 0u;
503
- orig_pixels[0][3] = 128u;
504
- // Test green
505
- orig_pixels[1][0] = 0u;
506
- orig_pixels[1][1] = 255u;
507
- orig_pixels[1][2] = 0u;
508
- orig_pixels[1][3] = 0u;
509
- // Test red
510
- orig_pixels[2][0] = 0u;
511
- orig_pixels[2][1] = 0u;
512
- orig_pixels[2][2] = 255u;
513
- orig_pixels[2][3] = 255u;
514
- // Test black
515
- orig_pixels[3][0] = 0u;
516
- orig_pixels[3][1] = 0u;
517
- orig_pixels[3][2] = 0u;
518
- orig_pixels[3][3] = 255u;
519
- // Test white
520
- orig_pixels[4][0] = 255u;
521
- orig_pixels[4][1] = 255u;
522
- orig_pixels[4][2] = 255u;
523
- orig_pixels[4][3] = 255u;
524
- // Test color
525
- orig_pixels[5][0] = 16u;
526
- orig_pixels[5][1] = 64u;
527
- orig_pixels[5][2] = 192u;
528
- orig_pixels[5][3] = 224u;
529
- // Do 16 to test asm version.
530
- ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 16, 1);
531
- EXPECT_EQ(33u, orig_pixels[0][0]);
532
- EXPECT_EQ(43u, orig_pixels[0][1]);
533
- EXPECT_EQ(47u, orig_pixels[0][2]);
534
- EXPECT_EQ(128u, orig_pixels[0][3]);
535
- EXPECT_EQ(135u, orig_pixels[1][0]);
536
- EXPECT_EQ(175u, orig_pixels[1][1]);
537
- EXPECT_EQ(195u, orig_pixels[1][2]);
538
- EXPECT_EQ(0u, orig_pixels[1][3]);
539
- EXPECT_EQ(69u, orig_pixels[2][0]);
540
- EXPECT_EQ(89u, orig_pixels[2][1]);
541
- EXPECT_EQ(99u, orig_pixels[2][2]);
542
- EXPECT_EQ(255u, orig_pixels[2][3]);
543
- EXPECT_EQ(0u, orig_pixels[3][0]);
544
- EXPECT_EQ(0u, orig_pixels[3][1]);
545
- EXPECT_EQ(0u, orig_pixels[3][2]);
546
- EXPECT_EQ(255u, orig_pixels[3][3]);
547
- EXPECT_EQ(239u, orig_pixels[4][0]);
548
- EXPECT_EQ(255u, orig_pixels[4][1]);
549
- EXPECT_EQ(255u, orig_pixels[4][2]);
550
- EXPECT_EQ(255u, orig_pixels[4][3]);
551
- EXPECT_EQ(88u, orig_pixels[5][0]);
552
- EXPECT_EQ(114u, orig_pixels[5][1]);
553
- EXPECT_EQ(127u, orig_pixels[5][2]);
554
- EXPECT_EQ(224u, orig_pixels[5][3]);
555
-
556
- for (int i = 0; i < 1280; ++i) {
557
- orig_pixels[i][0] = i;
558
- orig_pixels[i][1] = i / 2;
559
- orig_pixels[i][2] = i / 3;
560
- orig_pixels[i][3] = i;
561
- }
562
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
563
- ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
564
- }
565
- }
566
-
567
- TEST_F(LibYUVPlanarTest, TestARGBColorMatrix) {
568
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
569
- SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
570
- SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
571
-
572
- // Matrix for Sepia.
573
- SIMD_ALIGNED(static const int8_t kRGBToSepia[]) = {
574
- 17 / 2, 68 / 2, 35 / 2, 0, 22 / 2, 88 / 2, 45 / 2, 0,
575
- 24 / 2, 98 / 2, 50 / 2, 0, 0, 0, 0, 64, // Copy alpha.
576
- };
577
- memset(orig_pixels, 0, sizeof(orig_pixels));
578
-
579
- // Test blue
580
- orig_pixels[0][0] = 255u;
581
- orig_pixels[0][1] = 0u;
582
- orig_pixels[0][2] = 0u;
583
- orig_pixels[0][3] = 128u;
584
- // Test green
585
- orig_pixels[1][0] = 0u;
586
- orig_pixels[1][1] = 255u;
587
- orig_pixels[1][2] = 0u;
588
- orig_pixels[1][3] = 0u;
589
- // Test red
590
- orig_pixels[2][0] = 0u;
591
- orig_pixels[2][1] = 0u;
592
- orig_pixels[2][2] = 255u;
593
- orig_pixels[2][3] = 255u;
594
- // Test color
595
- orig_pixels[3][0] = 16u;
596
- orig_pixels[3][1] = 64u;
597
- orig_pixels[3][2] = 192u;
598
- orig_pixels[3][3] = 224u;
599
- // Do 16 to test asm version.
600
- ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
601
- &kRGBToSepia[0], 16, 1);
602
- EXPECT_EQ(31u, dst_pixels_opt[0][0]);
603
- EXPECT_EQ(43u, dst_pixels_opt[0][1]);
604
- EXPECT_EQ(47u, dst_pixels_opt[0][2]);
605
- EXPECT_EQ(128u, dst_pixels_opt[0][3]);
606
- EXPECT_EQ(135u, dst_pixels_opt[1][0]);
607
- EXPECT_EQ(175u, dst_pixels_opt[1][1]);
608
- EXPECT_EQ(195u, dst_pixels_opt[1][2]);
609
- EXPECT_EQ(0u, dst_pixels_opt[1][3]);
610
- EXPECT_EQ(67u, dst_pixels_opt[2][0]);
611
- EXPECT_EQ(87u, dst_pixels_opt[2][1]);
612
- EXPECT_EQ(99u, dst_pixels_opt[2][2]);
613
- EXPECT_EQ(255u, dst_pixels_opt[2][3]);
614
- EXPECT_EQ(87u, dst_pixels_opt[3][0]);
615
- EXPECT_EQ(112u, dst_pixels_opt[3][1]);
616
- EXPECT_EQ(127u, dst_pixels_opt[3][2]);
617
- EXPECT_EQ(224u, dst_pixels_opt[3][3]);
618
-
619
- for (int i = 0; i < 1280; ++i) {
620
- orig_pixels[i][0] = i;
621
- orig_pixels[i][1] = i / 2;
622
- orig_pixels[i][2] = i / 3;
623
- orig_pixels[i][3] = i;
624
- }
625
- MaskCpuFlags(disable_cpu_flags_);
626
- ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
627
- &kRGBToSepia[0], 1280, 1);
628
- MaskCpuFlags(benchmark_cpu_info_);
629
-
630
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
631
- ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
632
- &kRGBToSepia[0], 1280, 1);
633
- }
634
-
635
- for (int i = 0; i < 1280; ++i) {
636
- EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
637
- EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
638
- EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
639
- EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
640
- }
641
- }
642
-
643
- TEST_F(LibYUVPlanarTest, TestRGBColorMatrix) {
644
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
645
-
646
- // Matrix for Sepia.
647
- SIMD_ALIGNED(static const int8_t kRGBToSepia[]) = {
648
- 17, 68, 35, 0, 22, 88, 45, 0,
649
- 24, 98, 50, 0, 0, 0, 0, 0, // Unused but makes matrix 16 bytes.
650
- };
651
- memset(orig_pixels, 0, sizeof(orig_pixels));
652
-
653
- // Test blue
654
- orig_pixels[0][0] = 255u;
655
- orig_pixels[0][1] = 0u;
656
- orig_pixels[0][2] = 0u;
657
- orig_pixels[0][3] = 128u;
658
- // Test green
659
- orig_pixels[1][0] = 0u;
660
- orig_pixels[1][1] = 255u;
661
- orig_pixels[1][2] = 0u;
662
- orig_pixels[1][3] = 0u;
663
- // Test red
664
- orig_pixels[2][0] = 0u;
665
- orig_pixels[2][1] = 0u;
666
- orig_pixels[2][2] = 255u;
667
- orig_pixels[2][3] = 255u;
668
- // Test color
669
- orig_pixels[3][0] = 16u;
670
- orig_pixels[3][1] = 64u;
671
- orig_pixels[3][2] = 192u;
672
- orig_pixels[3][3] = 224u;
673
- // Do 16 to test asm version.
674
- RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 16, 1);
675
- EXPECT_EQ(31u, orig_pixels[0][0]);
676
- EXPECT_EQ(43u, orig_pixels[0][1]);
677
- EXPECT_EQ(47u, orig_pixels[0][2]);
678
- EXPECT_EQ(128u, orig_pixels[0][3]);
679
- EXPECT_EQ(135u, orig_pixels[1][0]);
680
- EXPECT_EQ(175u, orig_pixels[1][1]);
681
- EXPECT_EQ(195u, orig_pixels[1][2]);
682
- EXPECT_EQ(0u, orig_pixels[1][3]);
683
- EXPECT_EQ(67u, orig_pixels[2][0]);
684
- EXPECT_EQ(87u, orig_pixels[2][1]);
685
- EXPECT_EQ(99u, orig_pixels[2][2]);
686
- EXPECT_EQ(255u, orig_pixels[2][3]);
687
- EXPECT_EQ(87u, orig_pixels[3][0]);
688
- EXPECT_EQ(112u, orig_pixels[3][1]);
689
- EXPECT_EQ(127u, orig_pixels[3][2]);
690
- EXPECT_EQ(224u, orig_pixels[3][3]);
691
-
692
- for (int i = 0; i < 1280; ++i) {
693
- orig_pixels[i][0] = i;
694
- orig_pixels[i][1] = i / 2;
695
- orig_pixels[i][2] = i / 3;
696
- orig_pixels[i][3] = i;
697
- }
698
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
699
- RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 1280, 1);
700
- }
701
- }
702
-
703
- TEST_F(LibYUVPlanarTest, TestARGBColorTable) {
704
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
705
- memset(orig_pixels, 0, sizeof(orig_pixels));
706
-
707
- // Matrix for Sepia.
708
- static const uint8_t kARGBTable[256 * 4] = {
709
- 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u,
710
- };
711
-
712
- orig_pixels[0][0] = 0u;
713
- orig_pixels[0][1] = 0u;
714
- orig_pixels[0][2] = 0u;
715
- orig_pixels[0][3] = 0u;
716
- orig_pixels[1][0] = 1u;
717
- orig_pixels[1][1] = 1u;
718
- orig_pixels[1][2] = 1u;
719
- orig_pixels[1][3] = 1u;
720
- orig_pixels[2][0] = 2u;
721
- orig_pixels[2][1] = 2u;
722
- orig_pixels[2][2] = 2u;
723
- orig_pixels[2][3] = 2u;
724
- orig_pixels[3][0] = 0u;
725
- orig_pixels[3][1] = 1u;
726
- orig_pixels[3][2] = 2u;
727
- orig_pixels[3][3] = 3u;
728
- // Do 16 to test asm version.
729
- ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
730
- EXPECT_EQ(1u, orig_pixels[0][0]);
731
- EXPECT_EQ(2u, orig_pixels[0][1]);
732
- EXPECT_EQ(3u, orig_pixels[0][2]);
733
- EXPECT_EQ(4u, orig_pixels[0][3]);
734
- EXPECT_EQ(5u, orig_pixels[1][0]);
735
- EXPECT_EQ(6u, orig_pixels[1][1]);
736
- EXPECT_EQ(7u, orig_pixels[1][2]);
737
- EXPECT_EQ(8u, orig_pixels[1][3]);
738
- EXPECT_EQ(9u, orig_pixels[2][0]);
739
- EXPECT_EQ(10u, orig_pixels[2][1]);
740
- EXPECT_EQ(11u, orig_pixels[2][2]);
741
- EXPECT_EQ(12u, orig_pixels[2][3]);
742
- EXPECT_EQ(1u, orig_pixels[3][0]);
743
- EXPECT_EQ(6u, orig_pixels[3][1]);
744
- EXPECT_EQ(11u, orig_pixels[3][2]);
745
- EXPECT_EQ(16u, orig_pixels[3][3]);
746
-
747
- for (int i = 0; i < 1280; ++i) {
748
- orig_pixels[i][0] = i;
749
- orig_pixels[i][1] = i / 2;
750
- orig_pixels[i][2] = i / 3;
751
- orig_pixels[i][3] = i;
752
- }
753
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
754
- ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
755
- }
756
- }
757
-
758
- // Same as TestARGBColorTable except alpha does not change.
759
- TEST_F(LibYUVPlanarTest, TestRGBColorTable) {
760
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
761
- memset(orig_pixels, 0, sizeof(orig_pixels));
762
-
763
- // Matrix for Sepia.
764
- static const uint8_t kARGBTable[256 * 4] = {
765
- 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u,
766
- };
767
-
768
- orig_pixels[0][0] = 0u;
769
- orig_pixels[0][1] = 0u;
770
- orig_pixels[0][2] = 0u;
771
- orig_pixels[0][3] = 0u;
772
- orig_pixels[1][0] = 1u;
773
- orig_pixels[1][1] = 1u;
774
- orig_pixels[1][2] = 1u;
775
- orig_pixels[1][3] = 1u;
776
- orig_pixels[2][0] = 2u;
777
- orig_pixels[2][1] = 2u;
778
- orig_pixels[2][2] = 2u;
779
- orig_pixels[2][3] = 2u;
780
- orig_pixels[3][0] = 0u;
781
- orig_pixels[3][1] = 1u;
782
- orig_pixels[3][2] = 2u;
783
- orig_pixels[3][3] = 3u;
784
- // Do 16 to test asm version.
785
- RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
786
- EXPECT_EQ(1u, orig_pixels[0][0]);
787
- EXPECT_EQ(2u, orig_pixels[0][1]);
788
- EXPECT_EQ(3u, orig_pixels[0][2]);
789
- EXPECT_EQ(0u, orig_pixels[0][3]); // Alpha unchanged.
790
- EXPECT_EQ(5u, orig_pixels[1][0]);
791
- EXPECT_EQ(6u, orig_pixels[1][1]);
792
- EXPECT_EQ(7u, orig_pixels[1][2]);
793
- EXPECT_EQ(1u, orig_pixels[1][3]); // Alpha unchanged.
794
- EXPECT_EQ(9u, orig_pixels[2][0]);
795
- EXPECT_EQ(10u, orig_pixels[2][1]);
796
- EXPECT_EQ(11u, orig_pixels[2][2]);
797
- EXPECT_EQ(2u, orig_pixels[2][3]); // Alpha unchanged.
798
- EXPECT_EQ(1u, orig_pixels[3][0]);
799
- EXPECT_EQ(6u, orig_pixels[3][1]);
800
- EXPECT_EQ(11u, orig_pixels[3][2]);
801
- EXPECT_EQ(3u, orig_pixels[3][3]); // Alpha unchanged.
802
-
803
- for (int i = 0; i < 1280; ++i) {
804
- orig_pixels[i][0] = i;
805
- orig_pixels[i][1] = i / 2;
806
- orig_pixels[i][2] = i / 3;
807
- orig_pixels[i][3] = i;
808
- }
809
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
810
- RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
811
- }
812
- }
813
-
814
- TEST_F(LibYUVPlanarTest, TestARGBQuantize) {
815
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
816
-
817
- for (int i = 0; i < 1280; ++i) {
818
- orig_pixels[i][0] = i;
819
- orig_pixels[i][1] = i / 2;
820
- orig_pixels[i][2] = i / 3;
821
- orig_pixels[i][3] = i;
822
- }
823
- ARGBQuantize(&orig_pixels[0][0], 0, (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0,
824
- 1280, 1);
825
-
826
- for (int i = 0; i < 1280; ++i) {
827
- EXPECT_EQ((i / 8 * 8 + 8 / 2) & 255, orig_pixels[i][0]);
828
- EXPECT_EQ((i / 2 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][1]);
829
- EXPECT_EQ((i / 3 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][2]);
830
- EXPECT_EQ(i & 255, orig_pixels[i][3]);
831
- }
832
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
833
- ARGBQuantize(&orig_pixels[0][0], 0, (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0,
834
- 1280, 1);
835
- }
836
- }
837
-
838
- TEST_F(LibYUVPlanarTest, ARGBMirror_Opt) {
839
- align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_ * 4);
840
- align_buffer_page_end(dst_pixels_opt,
841
- benchmark_width_ * benchmark_height_ * 4);
842
- align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_ * 4);
843
-
844
- MemRandomize(src_pixels, benchmark_width_ * benchmark_height_ * 4);
845
- MaskCpuFlags(disable_cpu_flags_);
846
- ARGBMirror(src_pixels, benchmark_width_ * 4, dst_pixels_c,
847
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
848
- MaskCpuFlags(benchmark_cpu_info_);
849
-
850
- for (int i = 0; i < benchmark_iterations_; ++i) {
851
- ARGBMirror(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
852
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
853
- }
854
- for (int i = 0; i < benchmark_width_ * benchmark_height_ * 4; ++i) {
855
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
856
- }
857
- free_aligned_buffer_page_end(src_pixels);
858
- free_aligned_buffer_page_end(dst_pixels_opt);
859
- free_aligned_buffer_page_end(dst_pixels_c);
860
- }
861
-
862
- TEST_F(LibYUVPlanarTest, MirrorPlane_Opt) {
863
- align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_);
864
- align_buffer_page_end(dst_pixels_opt, benchmark_width_ * benchmark_height_);
865
- align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_);
866
-
867
- MemRandomize(src_pixels, benchmark_width_ * benchmark_height_);
868
- MaskCpuFlags(disable_cpu_flags_);
869
- MirrorPlane(src_pixels, benchmark_width_, dst_pixels_c, benchmark_width_,
870
- benchmark_width_, benchmark_height_);
871
- MaskCpuFlags(benchmark_cpu_info_);
872
-
873
- for (int i = 0; i < benchmark_iterations_; ++i) {
874
- MirrorPlane(src_pixels, benchmark_width_, dst_pixels_opt, benchmark_width_,
875
- benchmark_width_, benchmark_height_);
876
- }
877
- for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
878
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
879
- }
880
- free_aligned_buffer_page_end(src_pixels);
881
- free_aligned_buffer_page_end(dst_pixels_opt);
882
- free_aligned_buffer_page_end(dst_pixels_c);
883
- }
884
-
885
- TEST_F(LibYUVPlanarTest, MirrorUVPlane_Opt) {
886
- align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_ * 2);
887
- align_buffer_page_end(dst_pixels_opt,
888
- benchmark_width_ * benchmark_height_ * 2);
889
- align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_ * 2);
890
-
891
- MemRandomize(src_pixels, benchmark_width_ * benchmark_height_ * 2);
892
- MaskCpuFlags(disable_cpu_flags_);
893
- MirrorUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_c,
894
- benchmark_width_ * 2, benchmark_width_, benchmark_height_);
895
- MaskCpuFlags(benchmark_cpu_info_);
896
-
897
- for (int i = 0; i < benchmark_iterations_; ++i) {
898
- MirrorUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_opt,
899
- benchmark_width_ * 2, benchmark_width_, benchmark_height_);
900
- }
901
- for (int i = 0; i < benchmark_width_ * benchmark_height_ * 2; ++i) {
902
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
903
- }
904
- free_aligned_buffer_page_end(src_pixels);
905
- free_aligned_buffer_page_end(dst_pixels_opt);
906
- free_aligned_buffer_page_end(dst_pixels_c);
907
- }
908
-
909
- TEST_F(LibYUVPlanarTest, TestShade) {
910
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
911
- SIMD_ALIGNED(uint8_t shade_pixels[1280][4]);
912
- memset(orig_pixels, 0, sizeof(orig_pixels));
913
-
914
- orig_pixels[0][0] = 10u;
915
- orig_pixels[0][1] = 20u;
916
- orig_pixels[0][2] = 40u;
917
- orig_pixels[0][3] = 80u;
918
- orig_pixels[1][0] = 0u;
919
- orig_pixels[1][1] = 0u;
920
- orig_pixels[1][2] = 0u;
921
- orig_pixels[1][3] = 255u;
922
- orig_pixels[2][0] = 0u;
923
- orig_pixels[2][1] = 0u;
924
- orig_pixels[2][2] = 0u;
925
- orig_pixels[2][3] = 0u;
926
- orig_pixels[3][0] = 0u;
927
- orig_pixels[3][1] = 0u;
928
- orig_pixels[3][2] = 0u;
929
- orig_pixels[3][3] = 0u;
930
- // Do 8 pixels to allow opt version to be used.
931
- ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80ffffff);
932
- EXPECT_EQ(10u, shade_pixels[0][0]);
933
- EXPECT_EQ(20u, shade_pixels[0][1]);
934
- EXPECT_EQ(40u, shade_pixels[0][2]);
935
- EXPECT_EQ(40u, shade_pixels[0][3]);
936
- EXPECT_EQ(0u, shade_pixels[1][0]);
937
- EXPECT_EQ(0u, shade_pixels[1][1]);
938
- EXPECT_EQ(0u, shade_pixels[1][2]);
939
- EXPECT_EQ(128u, shade_pixels[1][3]);
940
- EXPECT_EQ(0u, shade_pixels[2][0]);
941
- EXPECT_EQ(0u, shade_pixels[2][1]);
942
- EXPECT_EQ(0u, shade_pixels[2][2]);
943
- EXPECT_EQ(0u, shade_pixels[2][3]);
944
- EXPECT_EQ(0u, shade_pixels[3][0]);
945
- EXPECT_EQ(0u, shade_pixels[3][1]);
946
- EXPECT_EQ(0u, shade_pixels[3][2]);
947
- EXPECT_EQ(0u, shade_pixels[3][3]);
948
-
949
- ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80808080);
950
- EXPECT_EQ(5u, shade_pixels[0][0]);
951
- EXPECT_EQ(10u, shade_pixels[0][1]);
952
- EXPECT_EQ(20u, shade_pixels[0][2]);
953
- EXPECT_EQ(40u, shade_pixels[0][3]);
954
-
955
- ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x10204080);
956
- EXPECT_EQ(5u, shade_pixels[0][0]);
957
- EXPECT_EQ(5u, shade_pixels[0][1]);
958
- EXPECT_EQ(5u, shade_pixels[0][2]);
959
- EXPECT_EQ(5u, shade_pixels[0][3]);
960
-
961
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
962
- ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 1280, 1,
963
- 0x80808080);
964
- }
965
- }
966
-
967
- TEST_F(LibYUVPlanarTest, TestARGBInterpolate) {
968
- SIMD_ALIGNED(uint8_t orig_pixels_0[1280][4]);
969
- SIMD_ALIGNED(uint8_t orig_pixels_1[1280][4]);
970
- SIMD_ALIGNED(uint8_t interpolate_pixels[1280][4]);
971
- memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
972
- memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
973
-
974
- orig_pixels_0[0][0] = 16u;
975
- orig_pixels_0[0][1] = 32u;
976
- orig_pixels_0[0][2] = 64u;
977
- orig_pixels_0[0][3] = 128u;
978
- orig_pixels_0[1][0] = 0u;
979
- orig_pixels_0[1][1] = 0u;
980
- orig_pixels_0[1][2] = 0u;
981
- orig_pixels_0[1][3] = 255u;
982
- orig_pixels_0[2][0] = 0u;
983
- orig_pixels_0[2][1] = 0u;
984
- orig_pixels_0[2][2] = 0u;
985
- orig_pixels_0[2][3] = 0u;
986
- orig_pixels_0[3][0] = 0u;
987
- orig_pixels_0[3][1] = 0u;
988
- orig_pixels_0[3][2] = 0u;
989
- orig_pixels_0[3][3] = 0u;
990
-
991
- orig_pixels_1[0][0] = 0u;
992
- orig_pixels_1[0][1] = 0u;
993
- orig_pixels_1[0][2] = 0u;
994
- orig_pixels_1[0][3] = 0u;
995
- orig_pixels_1[1][0] = 0u;
996
- orig_pixels_1[1][1] = 0u;
997
- orig_pixels_1[1][2] = 0u;
998
- orig_pixels_1[1][3] = 0u;
999
- orig_pixels_1[2][0] = 0u;
1000
- orig_pixels_1[2][1] = 0u;
1001
- orig_pixels_1[2][2] = 0u;
1002
- orig_pixels_1[2][3] = 0u;
1003
- orig_pixels_1[3][0] = 255u;
1004
- orig_pixels_1[3][1] = 255u;
1005
- orig_pixels_1[3][2] = 255u;
1006
- orig_pixels_1[3][3] = 255u;
1007
-
1008
- ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1009
- &interpolate_pixels[0][0], 0, 4, 1, 128);
1010
- EXPECT_EQ(8u, interpolate_pixels[0][0]);
1011
- EXPECT_EQ(16u, interpolate_pixels[0][1]);
1012
- EXPECT_EQ(32u, interpolate_pixels[0][2]);
1013
- EXPECT_EQ(64u, interpolate_pixels[0][3]);
1014
- EXPECT_EQ(0u, interpolate_pixels[1][0]);
1015
- EXPECT_EQ(0u, interpolate_pixels[1][1]);
1016
- EXPECT_EQ(0u, interpolate_pixels[1][2]);
1017
- EXPECT_EQ(128u, interpolate_pixels[1][3]);
1018
- EXPECT_EQ(0u, interpolate_pixels[2][0]);
1019
- EXPECT_EQ(0u, interpolate_pixels[2][1]);
1020
- EXPECT_EQ(0u, interpolate_pixels[2][2]);
1021
- EXPECT_EQ(0u, interpolate_pixels[2][3]);
1022
- EXPECT_EQ(128u, interpolate_pixels[3][0]);
1023
- EXPECT_EQ(128u, interpolate_pixels[3][1]);
1024
- EXPECT_EQ(128u, interpolate_pixels[3][2]);
1025
- EXPECT_EQ(128u, interpolate_pixels[3][3]);
1026
-
1027
- ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1028
- &interpolate_pixels[0][0], 0, 4, 1, 0);
1029
- EXPECT_EQ(16u, interpolate_pixels[0][0]);
1030
- EXPECT_EQ(32u, interpolate_pixels[0][1]);
1031
- EXPECT_EQ(64u, interpolate_pixels[0][2]);
1032
- EXPECT_EQ(128u, interpolate_pixels[0][3]);
1033
-
1034
- ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1035
- &interpolate_pixels[0][0], 0, 4, 1, 192);
1036
-
1037
- EXPECT_EQ(4u, interpolate_pixels[0][0]);
1038
- EXPECT_EQ(8u, interpolate_pixels[0][1]);
1039
- EXPECT_EQ(16u, interpolate_pixels[0][2]);
1040
- EXPECT_EQ(32u, interpolate_pixels[0][3]);
1041
-
1042
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1043
- ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1044
- &interpolate_pixels[0][0], 0, 1280, 1, 128);
1045
- }
1046
- }
1047
-
1048
- TEST_F(LibYUVPlanarTest, TestInterpolatePlane) {
1049
- SIMD_ALIGNED(uint8_t orig_pixels_0[1280]);
1050
- SIMD_ALIGNED(uint8_t orig_pixels_1[1280]);
1051
- SIMD_ALIGNED(uint8_t interpolate_pixels[1280]);
1052
- memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
1053
- memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
1054
-
1055
- orig_pixels_0[0] = 16u;
1056
- orig_pixels_0[1] = 32u;
1057
- orig_pixels_0[2] = 64u;
1058
- orig_pixels_0[3] = 128u;
1059
- orig_pixels_0[4] = 0u;
1060
- orig_pixels_0[5] = 0u;
1061
- orig_pixels_0[6] = 0u;
1062
- orig_pixels_0[7] = 255u;
1063
- orig_pixels_0[8] = 0u;
1064
- orig_pixels_0[9] = 0u;
1065
- orig_pixels_0[10] = 0u;
1066
- orig_pixels_0[11] = 0u;
1067
- orig_pixels_0[12] = 0u;
1068
- orig_pixels_0[13] = 0u;
1069
- orig_pixels_0[14] = 0u;
1070
- orig_pixels_0[15] = 0u;
1071
-
1072
- orig_pixels_1[0] = 0u;
1073
- orig_pixels_1[1] = 0u;
1074
- orig_pixels_1[2] = 0u;
1075
- orig_pixels_1[3] = 0u;
1076
- orig_pixels_1[4] = 0u;
1077
- orig_pixels_1[5] = 0u;
1078
- orig_pixels_1[6] = 0u;
1079
- orig_pixels_1[7] = 0u;
1080
- orig_pixels_1[8] = 0u;
1081
- orig_pixels_1[9] = 0u;
1082
- orig_pixels_1[10] = 0u;
1083
- orig_pixels_1[11] = 0u;
1084
- orig_pixels_1[12] = 255u;
1085
- orig_pixels_1[13] = 255u;
1086
- orig_pixels_1[14] = 255u;
1087
- orig_pixels_1[15] = 255u;
1088
-
1089
- InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1090
- &interpolate_pixels[0], 0, 16, 1, 128);
1091
- EXPECT_EQ(8u, interpolate_pixels[0]);
1092
- EXPECT_EQ(16u, interpolate_pixels[1]);
1093
- EXPECT_EQ(32u, interpolate_pixels[2]);
1094
- EXPECT_EQ(64u, interpolate_pixels[3]);
1095
- EXPECT_EQ(0u, interpolate_pixels[4]);
1096
- EXPECT_EQ(0u, interpolate_pixels[5]);
1097
- EXPECT_EQ(0u, interpolate_pixels[6]);
1098
- EXPECT_EQ(128u, interpolate_pixels[7]);
1099
- EXPECT_EQ(0u, interpolate_pixels[8]);
1100
- EXPECT_EQ(0u, interpolate_pixels[9]);
1101
- EXPECT_EQ(0u, interpolate_pixels[10]);
1102
- EXPECT_EQ(0u, interpolate_pixels[11]);
1103
- EXPECT_EQ(128u, interpolate_pixels[12]);
1104
- EXPECT_EQ(128u, interpolate_pixels[13]);
1105
- EXPECT_EQ(128u, interpolate_pixels[14]);
1106
- EXPECT_EQ(128u, interpolate_pixels[15]);
1107
-
1108
- InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1109
- &interpolate_pixels[0], 0, 16, 1, 0);
1110
- EXPECT_EQ(16u, interpolate_pixels[0]);
1111
- EXPECT_EQ(32u, interpolate_pixels[1]);
1112
- EXPECT_EQ(64u, interpolate_pixels[2]);
1113
- EXPECT_EQ(128u, interpolate_pixels[3]);
1114
-
1115
- InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1116
- &interpolate_pixels[0], 0, 16, 1, 192);
1117
-
1118
- EXPECT_EQ(4u, interpolate_pixels[0]);
1119
- EXPECT_EQ(8u, interpolate_pixels[1]);
1120
- EXPECT_EQ(16u, interpolate_pixels[2]);
1121
- EXPECT_EQ(32u, interpolate_pixels[3]);
1122
-
1123
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1124
- InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1125
- &interpolate_pixels[0], 0, 1280, 1, 123);
1126
- }
1127
- }
1128
-
1129
- TEST_F(LibYUVPlanarTest, TestInterpolatePlane_16) {
1130
- SIMD_ALIGNED(uint16_t orig_pixels_0[1280]);
1131
- SIMD_ALIGNED(uint16_t orig_pixels_1[1280]);
1132
- SIMD_ALIGNED(uint16_t interpolate_pixels[1280]);
1133
- memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
1134
- memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
1135
-
1136
- orig_pixels_0[0] = 16u;
1137
- orig_pixels_0[1] = 32u;
1138
- orig_pixels_0[2] = 64u;
1139
- orig_pixels_0[3] = 128u;
1140
- orig_pixels_0[4] = 0u;
1141
- orig_pixels_0[5] = 0u;
1142
- orig_pixels_0[6] = 0u;
1143
- orig_pixels_0[7] = 255u;
1144
- orig_pixels_0[8] = 0u;
1145
- orig_pixels_0[9] = 0u;
1146
- orig_pixels_0[10] = 0u;
1147
- orig_pixels_0[11] = 0u;
1148
- orig_pixels_0[12] = 0u;
1149
- orig_pixels_0[13] = 0u;
1150
- orig_pixels_0[14] = 0u;
1151
- orig_pixels_0[15] = 0u;
1152
-
1153
- orig_pixels_1[0] = 0u;
1154
- orig_pixels_1[1] = 0u;
1155
- orig_pixels_1[2] = 0u;
1156
- orig_pixels_1[3] = 0u;
1157
- orig_pixels_1[4] = 0u;
1158
- orig_pixels_1[5] = 0u;
1159
- orig_pixels_1[6] = 0u;
1160
- orig_pixels_1[7] = 0u;
1161
- orig_pixels_1[8] = 0u;
1162
- orig_pixels_1[9] = 0u;
1163
- orig_pixels_1[10] = 0u;
1164
- orig_pixels_1[11] = 0u;
1165
- orig_pixels_1[12] = 255u;
1166
- orig_pixels_1[13] = 255u;
1167
- orig_pixels_1[14] = 255u;
1168
- orig_pixels_1[15] = 255u;
1169
-
1170
- InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1171
- &interpolate_pixels[0], 0, 16, 1, 128);
1172
- EXPECT_EQ(8u, interpolate_pixels[0]);
1173
- EXPECT_EQ(16u, interpolate_pixels[1]);
1174
- EXPECT_EQ(32u, interpolate_pixels[2]);
1175
- EXPECT_EQ(64u, interpolate_pixels[3]);
1176
- EXPECT_EQ(0u, interpolate_pixels[4]);
1177
- EXPECT_EQ(0u, interpolate_pixels[5]);
1178
- EXPECT_EQ(0u, interpolate_pixels[6]);
1179
- EXPECT_EQ(128u, interpolate_pixels[7]);
1180
- EXPECT_EQ(0u, interpolate_pixels[8]);
1181
- EXPECT_EQ(0u, interpolate_pixels[9]);
1182
- EXPECT_EQ(0u, interpolate_pixels[10]);
1183
- EXPECT_EQ(0u, interpolate_pixels[11]);
1184
- EXPECT_EQ(128u, interpolate_pixels[12]);
1185
- EXPECT_EQ(128u, interpolate_pixels[13]);
1186
- EXPECT_EQ(128u, interpolate_pixels[14]);
1187
- EXPECT_EQ(128u, interpolate_pixels[15]);
1188
-
1189
- InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1190
- &interpolate_pixels[0], 0, 16, 1, 0);
1191
- EXPECT_EQ(16u, interpolate_pixels[0]);
1192
- EXPECT_EQ(32u, interpolate_pixels[1]);
1193
- EXPECT_EQ(64u, interpolate_pixels[2]);
1194
- EXPECT_EQ(128u, interpolate_pixels[3]);
1195
-
1196
- InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1197
- &interpolate_pixels[0], 0, 16, 1, 192);
1198
-
1199
- EXPECT_EQ(4u, interpolate_pixels[0]);
1200
- EXPECT_EQ(8u, interpolate_pixels[1]);
1201
- EXPECT_EQ(16u, interpolate_pixels[2]);
1202
- EXPECT_EQ(32u, interpolate_pixels[3]);
1203
-
1204
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1205
- InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1206
- &interpolate_pixels[0], 0, 1280, 1, 123);
1207
- }
1208
- }
1209
-
1210
- #define TESTTERP(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, STRIDE_B, W1280, TERP, \
1211
- N, NEG, OFF) \
1212
- TEST_F(LibYUVPlanarTest, ARGBInterpolate##TERP##N) { \
1213
- const int kWidth = W1280; \
1214
- const int kHeight = benchmark_height_; \
1215
- const int kStrideA = \
1216
- (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
1217
- const int kStrideB = \
1218
- (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
1219
- align_buffer_page_end(src_argb_a, kStrideA* kHeight + OFF); \
1220
- align_buffer_page_end(src_argb_b, kStrideA* kHeight + OFF); \
1221
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight); \
1222
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight); \
1223
- for (int i = 0; i < kStrideA * kHeight; ++i) { \
1224
- src_argb_a[i + OFF] = (fastrand() & 0xff); \
1225
- src_argb_b[i + OFF] = (fastrand() & 0xff); \
1226
- } \
1227
- MaskCpuFlags(disable_cpu_flags_); \
1228
- ARGBInterpolate(src_argb_a + OFF, kStrideA, src_argb_b + OFF, kStrideA, \
1229
- dst_argb_c, kStrideB, kWidth, NEG kHeight, TERP); \
1230
- MaskCpuFlags(benchmark_cpu_info_); \
1231
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1232
- ARGBInterpolate(src_argb_a + OFF, kStrideA, src_argb_b + OFF, kStrideA, \
1233
- dst_argb_opt, kStrideB, kWidth, NEG kHeight, TERP); \
1234
- } \
1235
- for (int i = 0; i < kStrideB * kHeight; ++i) { \
1236
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
1237
- } \
1238
- free_aligned_buffer_page_end(src_argb_a); \
1239
- free_aligned_buffer_page_end(src_argb_b); \
1240
- free_aligned_buffer_page_end(dst_argb_c); \
1241
- free_aligned_buffer_page_end(dst_argb_opt); \
1242
- }
1243
-
1244
- #define TESTINTERPOLATE(TERP) \
1245
- TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_ + 1, TERP, _Any, +, 0) \
1246
- TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Unaligned, +, 1) \
1247
- TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Invert, -, 0) \
1248
- TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Opt, +, 0)
1249
-
1250
- TESTINTERPOLATE(0)
1251
- TESTINTERPOLATE(64)
1252
- TESTINTERPOLATE(128)
1253
- TESTINTERPOLATE(192)
1254
- TESTINTERPOLATE(255)
1255
-
1256
- static int TestBlend(int width,
1257
- int height,
1258
- int benchmark_iterations,
1259
- int disable_cpu_flags,
1260
- int benchmark_cpu_info,
1261
- int invert,
1262
- int off,
1263
- int attenuate) {
1264
- if (width < 1) {
1265
- width = 1;
1266
- }
1267
- const int kBpp = 4;
1268
- const int kStride = width * kBpp;
1269
- align_buffer_page_end(src_argb_a, kStride * height + off);
1270
- align_buffer_page_end(src_argb_b, kStride * height + off);
1271
- align_buffer_page_end(dst_argb_c, kStride * height);
1272
- align_buffer_page_end(dst_argb_opt, kStride * height);
1273
- for (int i = 0; i < kStride * height; ++i) {
1274
- src_argb_a[i + off] = (fastrand() & 0xff);
1275
- src_argb_b[i + off] = (fastrand() & 0xff);
1276
- }
1277
- MemRandomize(src_argb_a, kStride * height + off);
1278
- MemRandomize(src_argb_b, kStride * height + off);
1279
- if (attenuate) {
1280
- ARGBAttenuate(src_argb_a + off, kStride, src_argb_a + off, kStride, width,
1281
- height);
1282
- }
1283
- memset(dst_argb_c, 255, kStride * height);
1284
- memset(dst_argb_opt, 255, kStride * height);
1285
-
1286
- MaskCpuFlags(disable_cpu_flags);
1287
- ARGBBlend(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1288
- kStride, width, invert * height);
1289
- MaskCpuFlags(benchmark_cpu_info);
1290
- for (int i = 0; i < benchmark_iterations; ++i) {
1291
- ARGBBlend(src_argb_a + off, kStride, src_argb_b + off, kStride,
1292
- dst_argb_opt, kStride, width, invert * height);
1293
- }
1294
- int max_diff = 0;
1295
- for (int i = 0; i < kStride * height; ++i) {
1296
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1297
- static_cast<int>(dst_argb_opt[i]));
1298
- if (abs_diff > max_diff) {
1299
- max_diff = abs_diff;
1300
- }
1301
- }
1302
- free_aligned_buffer_page_end(src_argb_a);
1303
- free_aligned_buffer_page_end(src_argb_b);
1304
- free_aligned_buffer_page_end(dst_argb_c);
1305
- free_aligned_buffer_page_end(dst_argb_opt);
1306
- return max_diff;
1307
- }
1308
-
1309
- TEST_F(LibYUVPlanarTest, ARGBBlend_Any) {
1310
- int max_diff =
1311
- TestBlend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1312
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
1313
- EXPECT_LE(max_diff, 1);
1314
- }
1315
-
1316
- TEST_F(LibYUVPlanarTest, ARGBBlend_Unaligned) {
1317
- int max_diff =
1318
- TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1319
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 1);
1320
- EXPECT_LE(max_diff, 1);
1321
- }
1322
-
1323
- TEST_F(LibYUVPlanarTest, ARGBBlend_Invert) {
1324
- int max_diff =
1325
- TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1326
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 1);
1327
- EXPECT_LE(max_diff, 1);
1328
- }
1329
-
1330
- TEST_F(LibYUVPlanarTest, ARGBBlend_Unattenuated) {
1331
- int max_diff =
1332
- TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1333
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 0);
1334
- EXPECT_LE(max_diff, 1);
1335
- }
1336
-
1337
- TEST_F(LibYUVPlanarTest, ARGBBlend_Opt) {
1338
- int max_diff =
1339
- TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1340
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
1341
- EXPECT_LE(max_diff, 1);
1342
- }
1343
-
1344
- static void TestBlendPlane(int width,
1345
- int height,
1346
- int benchmark_iterations,
1347
- int disable_cpu_flags,
1348
- int benchmark_cpu_info,
1349
- int invert,
1350
- int off) {
1351
- if (width < 1) {
1352
- width = 1;
1353
- }
1354
- const int kBpp = 1;
1355
- const int kStride = width * kBpp;
1356
- align_buffer_page_end(src_argb_a, kStride * height + off);
1357
- align_buffer_page_end(src_argb_b, kStride * height + off);
1358
- align_buffer_page_end(src_argb_alpha, kStride * height + off);
1359
- align_buffer_page_end(dst_argb_c, kStride * height + off);
1360
- align_buffer_page_end(dst_argb_opt, kStride * height + off);
1361
- memset(dst_argb_c, 255, kStride * height + off);
1362
- memset(dst_argb_opt, 255, kStride * height + off);
1363
-
1364
- // Test source is maintained exactly if alpha is 255.
1365
- for (int i = 0; i < width; ++i) {
1366
- src_argb_a[i + off] = i & 255;
1367
- src_argb_b[i + off] = 255 - (i & 255);
1368
- }
1369
- memset(src_argb_alpha + off, 255, width);
1370
- BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1371
- src_argb_alpha + off, width, dst_argb_opt + off, width, width, 1);
1372
- for (int i = 0; i < width; ++i) {
1373
- EXPECT_EQ(src_argb_a[i + off], dst_argb_opt[i + off]);
1374
- }
1375
- // Test destination is maintained exactly if alpha is 0.
1376
- memset(src_argb_alpha + off, 0, width);
1377
- BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1378
- src_argb_alpha + off, width, dst_argb_opt + off, width, width, 1);
1379
- for (int i = 0; i < width; ++i) {
1380
- EXPECT_EQ(src_argb_b[i + off], dst_argb_opt[i + off]);
1381
- }
1382
- for (int i = 0; i < kStride * height; ++i) {
1383
- src_argb_a[i + off] = (fastrand() & 0xff);
1384
- src_argb_b[i + off] = (fastrand() & 0xff);
1385
- src_argb_alpha[i + off] = (fastrand() & 0xff);
1386
- }
1387
-
1388
- MaskCpuFlags(disable_cpu_flags);
1389
- BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1390
- src_argb_alpha + off, width, dst_argb_c + off, width, width,
1391
- invert * height);
1392
- MaskCpuFlags(benchmark_cpu_info);
1393
- for (int i = 0; i < benchmark_iterations; ++i) {
1394
- BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1395
- src_argb_alpha + off, width, dst_argb_opt + off, width, width,
1396
- invert * height);
1397
- }
1398
- for (int i = 0; i < kStride * height; ++i) {
1399
- EXPECT_EQ(dst_argb_c[i + off], dst_argb_opt[i + off]);
1400
- }
1401
- free_aligned_buffer_page_end(src_argb_a);
1402
- free_aligned_buffer_page_end(src_argb_b);
1403
- free_aligned_buffer_page_end(src_argb_alpha);
1404
- free_aligned_buffer_page_end(dst_argb_c);
1405
- free_aligned_buffer_page_end(dst_argb_opt);
1406
- }
1407
-
1408
- TEST_F(LibYUVPlanarTest, BlendPlane_Opt) {
1409
- TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1410
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1411
- }
1412
- TEST_F(LibYUVPlanarTest, BlendPlane_Unaligned) {
1413
- TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1414
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1415
- }
1416
- TEST_F(LibYUVPlanarTest, BlendPlane_Any) {
1417
- TestBlendPlane(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1418
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1419
- }
1420
- TEST_F(LibYUVPlanarTest, BlendPlane_Invert) {
1421
- TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1422
- disable_cpu_flags_, benchmark_cpu_info_, -1, 1);
1423
- }
1424
-
1425
- #define SUBSAMPLE(v, a) ((((v) + (a)-1)) / (a))
1426
-
1427
- static void TestI420Blend(int width,
1428
- int height,
1429
- int benchmark_iterations,
1430
- int disable_cpu_flags,
1431
- int benchmark_cpu_info,
1432
- int invert,
1433
- int off) {
1434
- width = ((width) > 0) ? (width) : 1;
1435
- const int kStrideUV = SUBSAMPLE(width, 2);
1436
- const int kSizeUV = kStrideUV * SUBSAMPLE(height, 2);
1437
- align_buffer_page_end(src_y0, width * height + off);
1438
- align_buffer_page_end(src_u0, kSizeUV + off);
1439
- align_buffer_page_end(src_v0, kSizeUV + off);
1440
- align_buffer_page_end(src_y1, width * height + off);
1441
- align_buffer_page_end(src_u1, kSizeUV + off);
1442
- align_buffer_page_end(src_v1, kSizeUV + off);
1443
- align_buffer_page_end(src_a, width * height + off);
1444
- align_buffer_page_end(dst_y_c, width * height + off);
1445
- align_buffer_page_end(dst_u_c, kSizeUV + off);
1446
- align_buffer_page_end(dst_v_c, kSizeUV + off);
1447
- align_buffer_page_end(dst_y_opt, width * height + off);
1448
- align_buffer_page_end(dst_u_opt, kSizeUV + off);
1449
- align_buffer_page_end(dst_v_opt, kSizeUV + off);
1450
-
1451
- MemRandomize(src_y0, width * height + off);
1452
- MemRandomize(src_u0, kSizeUV + off);
1453
- MemRandomize(src_v0, kSizeUV + off);
1454
- MemRandomize(src_y1, width * height + off);
1455
- MemRandomize(src_u1, kSizeUV + off);
1456
- MemRandomize(src_v1, kSizeUV + off);
1457
- MemRandomize(src_a, width * height + off);
1458
- memset(dst_y_c, 255, width * height + off);
1459
- memset(dst_u_c, 255, kSizeUV + off);
1460
- memset(dst_v_c, 255, kSizeUV + off);
1461
- memset(dst_y_opt, 255, width * height + off);
1462
- memset(dst_u_opt, 255, kSizeUV + off);
1463
- memset(dst_v_opt, 255, kSizeUV + off);
1464
-
1465
- MaskCpuFlags(disable_cpu_flags);
1466
- I420Blend(src_y0 + off, width, src_u0 + off, kStrideUV, src_v0 + off,
1467
- kStrideUV, src_y1 + off, width, src_u1 + off, kStrideUV,
1468
- src_v1 + off, kStrideUV, src_a + off, width, dst_y_c + off, width,
1469
- dst_u_c + off, kStrideUV, dst_v_c + off, kStrideUV, width,
1470
- invert * height);
1471
- MaskCpuFlags(benchmark_cpu_info);
1472
- for (int i = 0; i < benchmark_iterations; ++i) {
1473
- I420Blend(src_y0 + off, width, src_u0 + off, kStrideUV, src_v0 + off,
1474
- kStrideUV, src_y1 + off, width, src_u1 + off, kStrideUV,
1475
- src_v1 + off, kStrideUV, src_a + off, width, dst_y_opt + off,
1476
- width, dst_u_opt + off, kStrideUV, dst_v_opt + off, kStrideUV,
1477
- width, invert * height);
1478
- }
1479
- for (int i = 0; i < width * height; ++i) {
1480
- EXPECT_EQ(dst_y_c[i + off], dst_y_opt[i + off]);
1481
- }
1482
- for (int i = 0; i < kSizeUV; ++i) {
1483
- EXPECT_EQ(dst_u_c[i + off], dst_u_opt[i + off]);
1484
- EXPECT_EQ(dst_v_c[i + off], dst_v_opt[i + off]);
1485
- }
1486
- free_aligned_buffer_page_end(src_y0);
1487
- free_aligned_buffer_page_end(src_u0);
1488
- free_aligned_buffer_page_end(src_v0);
1489
- free_aligned_buffer_page_end(src_y1);
1490
- free_aligned_buffer_page_end(src_u1);
1491
- free_aligned_buffer_page_end(src_v1);
1492
- free_aligned_buffer_page_end(src_a);
1493
- free_aligned_buffer_page_end(dst_y_c);
1494
- free_aligned_buffer_page_end(dst_u_c);
1495
- free_aligned_buffer_page_end(dst_v_c);
1496
- free_aligned_buffer_page_end(dst_y_opt);
1497
- free_aligned_buffer_page_end(dst_u_opt);
1498
- free_aligned_buffer_page_end(dst_v_opt);
1499
- }
1500
-
1501
- TEST_F(LibYUVPlanarTest, I420Blend_Opt) {
1502
- TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1503
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1504
- }
1505
- TEST_F(LibYUVPlanarTest, I420Blend_Unaligned) {
1506
- TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1507
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1508
- }
1509
-
1510
- // TODO(fbarchard): DISABLED because _Any uses C. Avoid C and re-enable.
1511
- TEST_F(LibYUVPlanarTest, DISABLED_I420Blend_Any) {
1512
- TestI420Blend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1513
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1514
- }
1515
- TEST_F(LibYUVPlanarTest, I420Blend_Invert) {
1516
- TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1517
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1518
- }
1519
-
1520
- #ifdef ENABLE_ROW_TESTS
1521
- TEST_F(LibYUVPlanarTest, TestAffine) {
1522
- SIMD_ALIGNED(uint8_t orig_pixels_0[1280][4]);
1523
- SIMD_ALIGNED(uint8_t interpolate_pixels_C[1280][4]);
1524
-
1525
- for (int i = 0; i < 1280; ++i) {
1526
- for (int j = 0; j < 4; ++j) {
1527
- orig_pixels_0[i][j] = i;
1528
- }
1529
- }
1530
-
1531
- float uv_step[4] = {0.f, 0.f, 0.75f, 0.f};
1532
-
1533
- ARGBAffineRow_C(&orig_pixels_0[0][0], 0, &interpolate_pixels_C[0][0], uv_step,
1534
- 1280);
1535
- EXPECT_EQ(0u, interpolate_pixels_C[0][0]);
1536
- EXPECT_EQ(96u, interpolate_pixels_C[128][0]);
1537
- EXPECT_EQ(191u, interpolate_pixels_C[255][3]);
1538
-
1539
- #if defined(HAS_ARGBAFFINEROW_SSE2)
1540
- SIMD_ALIGNED(uint8_t interpolate_pixels_Opt[1280][4]);
1541
- ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
1542
- uv_step, 1280);
1543
- EXPECT_EQ(0, memcmp(interpolate_pixels_Opt, interpolate_pixels_C, 1280 * 4));
1544
-
1545
- int has_sse2 = TestCpuFlag(kCpuHasSSE2);
1546
- if (has_sse2) {
1547
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1548
- ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
1549
- uv_step, 1280);
1550
- }
1551
- }
1552
- #endif
1553
- }
1554
- #endif // ENABLE_ROW_TESTS
1555
-
1556
- static int TestCopyPlane(int benchmark_width,
1557
- int benchmark_height,
1558
- int benchmark_iterations,
1559
- int disable_cpu_flags,
1560
- int benchmark_cpu_info,
1561
- int invert,
1562
- int off) {
1563
- const int y_plane_size = benchmark_width * benchmark_height;
1564
- align_buffer_page_end(orig_y, y_plane_size + off);
1565
- align_buffer_page_end(dst_c, y_plane_size);
1566
- align_buffer_page_end(dst_opt, y_plane_size);
1567
-
1568
- MemRandomize(orig_y + off, y_plane_size);
1569
- memset(dst_c, 1, y_plane_size);
1570
- memset(dst_opt, 2, y_plane_size);
1571
-
1572
- // Disable all optimizations.
1573
- MaskCpuFlags(disable_cpu_flags);
1574
- for (int i = 0; i < benchmark_iterations; i++) {
1575
- CopyPlane(orig_y + off, benchmark_width, dst_c, benchmark_width,
1576
- benchmark_width, benchmark_height * invert);
1577
- }
1578
-
1579
- // Enable optimizations.
1580
- MaskCpuFlags(benchmark_cpu_info);
1581
- for (int i = 0; i < benchmark_iterations; i++) {
1582
- CopyPlane(orig_y + off, benchmark_width, dst_opt, benchmark_width,
1583
- benchmark_width, benchmark_height * invert);
1584
- }
1585
-
1586
- int max_diff = 0;
1587
- for (int i = 0; i < y_plane_size; ++i) {
1588
- int abs_diff =
1589
- abs(static_cast<int>(dst_c[i]) - static_cast<int>(dst_opt[i]));
1590
- if (abs_diff > max_diff) {
1591
- max_diff = abs_diff;
1592
- }
1593
- }
1594
-
1595
- free_aligned_buffer_page_end(orig_y);
1596
- free_aligned_buffer_page_end(dst_c);
1597
- free_aligned_buffer_page_end(dst_opt);
1598
-
1599
- return max_diff;
1600
- }
1601
-
1602
- TEST_F(LibYUVPlanarTest, CopyPlane_Any) {
1603
- int max_diff = TestCopyPlane(benchmark_width_ + 1, benchmark_height_,
1604
- benchmark_iterations_, disable_cpu_flags_,
1605
- benchmark_cpu_info_, +1, 0);
1606
- EXPECT_LE(max_diff, 0);
1607
- }
1608
-
1609
- TEST_F(LibYUVPlanarTest, CopyPlane_Unaligned) {
1610
- int max_diff =
1611
- TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1612
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1613
- EXPECT_LE(max_diff, 0);
1614
- }
1615
-
1616
- TEST_F(LibYUVPlanarTest, CopyPlane_Invert) {
1617
- int max_diff =
1618
- TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1619
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1620
- EXPECT_LE(max_diff, 0);
1621
- }
1622
-
1623
- TEST_F(LibYUVPlanarTest, CopyPlane_Opt) {
1624
- int max_diff =
1625
- TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1626
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1627
- EXPECT_LE(max_diff, 0);
1628
- }
1629
-
1630
- TEST_F(LibYUVPlanarTest, TestCopyPlaneZero) {
1631
- // Test to verify copying a rect with a zero height or width does
1632
- // not touch destination memory.
1633
- uint8_t src = 42;
1634
- uint8_t dst = 0;
1635
-
1636
- // Disable all optimizations.
1637
- MaskCpuFlags(disable_cpu_flags_);
1638
- CopyPlane(&src, 0, &dst, 0, 0, 0);
1639
- EXPECT_EQ(src, 42);
1640
- EXPECT_EQ(dst, 0);
1641
-
1642
- CopyPlane(&src, 1, &dst, 1, 1, 0);
1643
- EXPECT_EQ(src, 42);
1644
- EXPECT_EQ(dst, 0);
1645
-
1646
- CopyPlane(&src, 1, &dst, 1, 0, 1);
1647
- EXPECT_EQ(src, 42);
1648
- EXPECT_EQ(dst, 0);
1649
-
1650
- // Enable optimizations.
1651
- MaskCpuFlags(benchmark_cpu_info_);
1652
- CopyPlane(&src, 0, &dst, 0, 0, 0);
1653
- EXPECT_EQ(src, 42);
1654
- EXPECT_EQ(dst, 0);
1655
-
1656
- CopyPlane(&src, 1, &dst, 1, 1, 0);
1657
- EXPECT_EQ(src, 42);
1658
- EXPECT_EQ(dst, 0);
1659
-
1660
- CopyPlane(&src, 1, &dst, 1, 0, 1);
1661
- EXPECT_EQ(src, 42);
1662
- EXPECT_EQ(dst, 0);
1663
- }
1664
-
1665
- TEST_F(LibYUVPlanarTest, TestDetilePlane) {
1666
- int i, j;
1667
-
1668
- // orig is tiled. Allocate enough memory for tiles.
1669
- int tile_width = (benchmark_width_ + 15) & ~15;
1670
- int tile_height = (benchmark_height_ + 15) & ~15;
1671
- int tile_plane_size = tile_width * tile_height;
1672
- int y_plane_size = benchmark_width_ * benchmark_height_;
1673
- align_buffer_page_end(tile_y, tile_plane_size);
1674
- align_buffer_page_end(dst_c, y_plane_size);
1675
- align_buffer_page_end(dst_opt, y_plane_size);
1676
-
1677
- MemRandomize(tile_y, tile_plane_size);
1678
- memset(dst_c, 0, y_plane_size);
1679
- memset(dst_opt, 0, y_plane_size);
1680
-
1681
- // Disable all optimizations.
1682
- MaskCpuFlags(disable_cpu_flags_);
1683
- for (j = 0; j < benchmark_iterations_; j++) {
1684
- DetilePlane(tile_y, tile_width, dst_c, benchmark_width_, benchmark_width_,
1685
- benchmark_height_, 16);
1686
- }
1687
-
1688
- // Enable optimizations.
1689
- MaskCpuFlags(benchmark_cpu_info_);
1690
- for (j = 0; j < benchmark_iterations_; j++) {
1691
- DetilePlane(tile_y, tile_width, dst_opt, benchmark_width_, benchmark_width_,
1692
- benchmark_height_, 16);
1693
- }
1694
-
1695
- for (i = 0; i < y_plane_size; ++i) {
1696
- EXPECT_EQ(dst_c[i], dst_opt[i]);
1697
- }
1698
-
1699
- free_aligned_buffer_page_end(tile_y);
1700
- free_aligned_buffer_page_end(dst_c);
1701
- free_aligned_buffer_page_end(dst_opt);
1702
- }
1703
-
1704
- TEST_F(LibYUVPlanarTest, TestDetilePlane_16) {
1705
- int i, j;
1706
-
1707
- // orig is tiled. Allocate enough memory for tiles.
1708
- int tile_width = (benchmark_width_ + 15) & ~15;
1709
- int tile_height = (benchmark_height_ + 15) & ~15;
1710
- int tile_plane_size = tile_width * tile_height * 2;
1711
- int y_plane_size = benchmark_width_ * benchmark_height_ * 2;
1712
- align_buffer_page_end(tile_y, tile_plane_size);
1713
- align_buffer_page_end(dst_c, y_plane_size);
1714
- align_buffer_page_end(dst_opt, y_plane_size);
1715
-
1716
- MemRandomize(tile_y, tile_plane_size);
1717
- memset(dst_c, 0, y_plane_size);
1718
- memset(dst_opt, 0, y_plane_size);
1719
-
1720
- // Disable all optimizations.
1721
- MaskCpuFlags(disable_cpu_flags_);
1722
- for (j = 0; j < benchmark_iterations_; j++) {
1723
- DetilePlane_16((const uint16_t*)tile_y, tile_width, (uint16_t*)dst_c,
1724
- benchmark_width_, benchmark_width_, benchmark_height_, 16);
1725
- }
1726
-
1727
- // Enable optimizations.
1728
- MaskCpuFlags(benchmark_cpu_info_);
1729
- for (j = 0; j < benchmark_iterations_; j++) {
1730
- DetilePlane_16((const uint16_t*)tile_y, tile_width, (uint16_t*)dst_opt,
1731
- benchmark_width_, benchmark_width_, benchmark_height_, 16);
1732
- }
1733
-
1734
- for (i = 0; i < y_plane_size; ++i) {
1735
- EXPECT_EQ(dst_c[i], dst_opt[i]);
1736
- }
1737
-
1738
- free_aligned_buffer_page_end(tile_y);
1739
- free_aligned_buffer_page_end(dst_c);
1740
- free_aligned_buffer_page_end(dst_opt);
1741
- }
1742
-
1743
- // Compares DetileSplitUV to 2 step Detile + SplitUV
1744
- TEST_F(LibYUVPlanarTest, TestDetileSplitUVPlane_Correctness) {
1745
- int i, j;
1746
-
1747
- // orig is tiled. Allocate enough memory for tiles.
1748
- int tile_width = (benchmark_width_ + 15) & ~15;
1749
- int tile_height = (benchmark_height_ + 15) & ~15;
1750
- int tile_plane_size = tile_width * tile_height;
1751
- int uv_plane_size = ((benchmark_width_ + 1) / 2) * benchmark_height_;
1752
- align_buffer_page_end(tile_uv, tile_plane_size);
1753
- align_buffer_page_end(detiled_uv, tile_plane_size);
1754
- align_buffer_page_end(dst_u_two_stage, uv_plane_size);
1755
- align_buffer_page_end(dst_u_opt, uv_plane_size);
1756
- align_buffer_page_end(dst_v_two_stage, uv_plane_size);
1757
- align_buffer_page_end(dst_v_opt, uv_plane_size);
1758
-
1759
- MemRandomize(tile_uv, tile_plane_size);
1760
- memset(detiled_uv, 0, tile_plane_size);
1761
- memset(dst_u_two_stage, 0, uv_plane_size);
1762
- memset(dst_u_opt, 0, uv_plane_size);
1763
- memset(dst_v_two_stage, 0, uv_plane_size);
1764
- memset(dst_v_opt, 0, uv_plane_size);
1765
-
1766
- DetileSplitUVPlane(tile_uv, tile_width, dst_u_opt, (benchmark_width_ + 1) / 2,
1767
- dst_v_opt, (benchmark_width_ + 1) / 2, benchmark_width_,
1768
- benchmark_height_, 16);
1769
-
1770
- // Benchmark 2 step conversion for comparison.
1771
- for (j = 0; j < benchmark_iterations_; j++) {
1772
- DetilePlane(tile_uv, tile_width, detiled_uv, benchmark_width_,
1773
- benchmark_width_, benchmark_height_, 16);
1774
- SplitUVPlane(detiled_uv, tile_width, dst_u_two_stage,
1775
- (benchmark_width_ + 1) / 2, dst_v_two_stage,
1776
- (benchmark_width_ + 1) / 2, (benchmark_width_ + 1) / 2,
1777
- benchmark_height_);
1778
- }
1779
-
1780
- for (i = 0; i < uv_plane_size; ++i) {
1781
- EXPECT_EQ(dst_u_two_stage[i], dst_u_opt[i]);
1782
- EXPECT_EQ(dst_v_two_stage[i], dst_v_opt[i]);
1783
- }
1784
-
1785
- free_aligned_buffer_page_end(tile_uv);
1786
- free_aligned_buffer_page_end(detiled_uv);
1787
- free_aligned_buffer_page_end(dst_u_two_stage);
1788
- free_aligned_buffer_page_end(dst_u_opt);
1789
- free_aligned_buffer_page_end(dst_v_two_stage);
1790
- free_aligned_buffer_page_end(dst_v_opt);
1791
- }
1792
-
1793
- TEST_F(LibYUVPlanarTest, TestDetileSplitUVPlane_Benchmark) {
1794
- int i, j;
1795
-
1796
- // orig is tiled. Allocate enough memory for tiles.
1797
- int tile_width = (benchmark_width_ + 15) & ~15;
1798
- int tile_height = (benchmark_height_ + 15) & ~15;
1799
- int tile_plane_size = tile_width * tile_height;
1800
- int uv_plane_size = ((benchmark_width_ + 1) / 2) * benchmark_height_;
1801
- align_buffer_page_end(tile_uv, tile_plane_size);
1802
- align_buffer_page_end(dst_u_c, uv_plane_size);
1803
- align_buffer_page_end(dst_u_opt, uv_plane_size);
1804
- align_buffer_page_end(dst_v_c, uv_plane_size);
1805
- align_buffer_page_end(dst_v_opt, uv_plane_size);
1806
-
1807
- MemRandomize(tile_uv, tile_plane_size);
1808
- memset(dst_u_c, 0, uv_plane_size);
1809
- memset(dst_u_opt, 0, uv_plane_size);
1810
- memset(dst_v_c, 0, uv_plane_size);
1811
- memset(dst_v_opt, 0, uv_plane_size);
1812
-
1813
- // Disable all optimizations.
1814
- MaskCpuFlags(disable_cpu_flags_);
1815
-
1816
- DetileSplitUVPlane(tile_uv, tile_width, dst_u_c, (benchmark_width_ + 1) / 2,
1817
- dst_v_c, (benchmark_width_ + 1) / 2, benchmark_width_,
1818
- benchmark_height_, 16);
1819
-
1820
- // Enable optimizations.
1821
- MaskCpuFlags(benchmark_cpu_info_);
1822
-
1823
- for (j = 0; j < benchmark_iterations_; j++) {
1824
- DetileSplitUVPlane(
1825
- tile_uv, tile_width, dst_u_opt, (benchmark_width_ + 1) / 2, dst_v_opt,
1826
- (benchmark_width_ + 1) / 2, benchmark_width_, benchmark_height_, 16);
1827
- }
1828
-
1829
- for (i = 0; i < uv_plane_size; ++i) {
1830
- EXPECT_EQ(dst_u_c[i], dst_u_opt[i]);
1831
- EXPECT_EQ(dst_v_c[i], dst_v_opt[i]);
1832
- }
1833
-
1834
- free_aligned_buffer_page_end(tile_uv);
1835
- free_aligned_buffer_page_end(dst_u_c);
1836
- free_aligned_buffer_page_end(dst_u_opt);
1837
- free_aligned_buffer_page_end(dst_v_c);
1838
- free_aligned_buffer_page_end(dst_v_opt);
1839
- }
1840
-
1841
- static int TestMultiply(int width,
1842
- int height,
1843
- int benchmark_iterations,
1844
- int disable_cpu_flags,
1845
- int benchmark_cpu_info,
1846
- int invert,
1847
- int off) {
1848
- if (width < 1) {
1849
- width = 1;
1850
- }
1851
- const int kBpp = 4;
1852
- const int kStride = width * kBpp;
1853
- align_buffer_page_end(src_argb_a, kStride * height + off);
1854
- align_buffer_page_end(src_argb_b, kStride * height + off);
1855
- align_buffer_page_end(dst_argb_c, kStride * height);
1856
- align_buffer_page_end(dst_argb_opt, kStride * height);
1857
- for (int i = 0; i < kStride * height; ++i) {
1858
- src_argb_a[i + off] = (fastrand() & 0xff);
1859
- src_argb_b[i + off] = (fastrand() & 0xff);
1860
- }
1861
- memset(dst_argb_c, 0, kStride * height);
1862
- memset(dst_argb_opt, 0, kStride * height);
1863
-
1864
- MaskCpuFlags(disable_cpu_flags);
1865
- ARGBMultiply(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1866
- kStride, width, invert * height);
1867
- MaskCpuFlags(benchmark_cpu_info);
1868
- for (int i = 0; i < benchmark_iterations; ++i) {
1869
- ARGBMultiply(src_argb_a + off, kStride, src_argb_b + off, kStride,
1870
- dst_argb_opt, kStride, width, invert * height);
1871
- }
1872
- int max_diff = 0;
1873
- for (int i = 0; i < kStride * height; ++i) {
1874
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1875
- static_cast<int>(dst_argb_opt[i]));
1876
- if (abs_diff > max_diff) {
1877
- max_diff = abs_diff;
1878
- }
1879
- }
1880
- free_aligned_buffer_page_end(src_argb_a);
1881
- free_aligned_buffer_page_end(src_argb_b);
1882
- free_aligned_buffer_page_end(dst_argb_c);
1883
- free_aligned_buffer_page_end(dst_argb_opt);
1884
- return max_diff;
1885
- }
1886
-
1887
- TEST_F(LibYUVPlanarTest, ARGBMultiply_Any) {
1888
- int max_diff = TestMultiply(benchmark_width_ + 1, benchmark_height_,
1889
- benchmark_iterations_, disable_cpu_flags_,
1890
- benchmark_cpu_info_, +1, 0);
1891
- EXPECT_LE(max_diff, 0);
1892
- }
1893
-
1894
- TEST_F(LibYUVPlanarTest, ARGBMultiply_Unaligned) {
1895
- int max_diff =
1896
- TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1897
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1898
- EXPECT_LE(max_diff, 0);
1899
- }
1900
-
1901
- TEST_F(LibYUVPlanarTest, ARGBMultiply_Invert) {
1902
- int max_diff =
1903
- TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1904
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1905
- EXPECT_LE(max_diff, 0);
1906
- }
1907
-
1908
- TEST_F(LibYUVPlanarTest, ARGBMultiply_Opt) {
1909
- int max_diff =
1910
- TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1911
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1912
- EXPECT_LE(max_diff, 0);
1913
- }
1914
-
1915
- static int TestAdd(int width,
1916
- int height,
1917
- int benchmark_iterations,
1918
- int disable_cpu_flags,
1919
- int benchmark_cpu_info,
1920
- int invert,
1921
- int off) {
1922
- if (width < 1) {
1923
- width = 1;
1924
- }
1925
- const int kBpp = 4;
1926
- const int kStride = width * kBpp;
1927
- align_buffer_page_end(src_argb_a, kStride * height + off);
1928
- align_buffer_page_end(src_argb_b, kStride * height + off);
1929
- align_buffer_page_end(dst_argb_c, kStride * height);
1930
- align_buffer_page_end(dst_argb_opt, kStride * height);
1931
- for (int i = 0; i < kStride * height; ++i) {
1932
- src_argb_a[i + off] = (fastrand() & 0xff);
1933
- src_argb_b[i + off] = (fastrand() & 0xff);
1934
- }
1935
- memset(dst_argb_c, 0, kStride * height);
1936
- memset(dst_argb_opt, 0, kStride * height);
1937
-
1938
- MaskCpuFlags(disable_cpu_flags);
1939
- ARGBAdd(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1940
- kStride, width, invert * height);
1941
- MaskCpuFlags(benchmark_cpu_info);
1942
- for (int i = 0; i < benchmark_iterations; ++i) {
1943
- ARGBAdd(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_opt,
1944
- kStride, width, invert * height);
1945
- }
1946
- int max_diff = 0;
1947
- for (int i = 0; i < kStride * height; ++i) {
1948
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1949
- static_cast<int>(dst_argb_opt[i]));
1950
- if (abs_diff > max_diff) {
1951
- max_diff = abs_diff;
1952
- }
1953
- }
1954
- free_aligned_buffer_page_end(src_argb_a);
1955
- free_aligned_buffer_page_end(src_argb_b);
1956
- free_aligned_buffer_page_end(dst_argb_c);
1957
- free_aligned_buffer_page_end(dst_argb_opt);
1958
- return max_diff;
1959
- }
1960
-
1961
- TEST_F(LibYUVPlanarTest, ARGBAdd_Any) {
1962
- int max_diff =
1963
- TestAdd(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1964
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1965
- EXPECT_LE(max_diff, 1);
1966
- }
1967
-
1968
- TEST_F(LibYUVPlanarTest, ARGBAdd_Unaligned) {
1969
- int max_diff =
1970
- TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1971
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1972
- EXPECT_LE(max_diff, 1);
1973
- }
1974
-
1975
- TEST_F(LibYUVPlanarTest, ARGBAdd_Invert) {
1976
- int max_diff =
1977
- TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1978
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1979
- EXPECT_LE(max_diff, 1);
1980
- }
1981
-
1982
- TEST_F(LibYUVPlanarTest, ARGBAdd_Opt) {
1983
- int max_diff =
1984
- TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1985
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1986
- EXPECT_LE(max_diff, 1);
1987
- }
1988
-
1989
- static int TestSubtract(int width,
1990
- int height,
1991
- int benchmark_iterations,
1992
- int disable_cpu_flags,
1993
- int benchmark_cpu_info,
1994
- int invert,
1995
- int off) {
1996
- if (width < 1) {
1997
- width = 1;
1998
- }
1999
- const int kBpp = 4;
2000
- const int kStride = width * kBpp;
2001
- align_buffer_page_end(src_argb_a, kStride * height + off);
2002
- align_buffer_page_end(src_argb_b, kStride * height + off);
2003
- align_buffer_page_end(dst_argb_c, kStride * height);
2004
- align_buffer_page_end(dst_argb_opt, kStride * height);
2005
- for (int i = 0; i < kStride * height; ++i) {
2006
- src_argb_a[i + off] = (fastrand() & 0xff);
2007
- src_argb_b[i + off] = (fastrand() & 0xff);
2008
- }
2009
- memset(dst_argb_c, 0, kStride * height);
2010
- memset(dst_argb_opt, 0, kStride * height);
2011
-
2012
- MaskCpuFlags(disable_cpu_flags);
2013
- ARGBSubtract(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
2014
- kStride, width, invert * height);
2015
- MaskCpuFlags(benchmark_cpu_info);
2016
- for (int i = 0; i < benchmark_iterations; ++i) {
2017
- ARGBSubtract(src_argb_a + off, kStride, src_argb_b + off, kStride,
2018
- dst_argb_opt, kStride, width, invert * height);
2019
- }
2020
- int max_diff = 0;
2021
- for (int i = 0; i < kStride * height; ++i) {
2022
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2023
- static_cast<int>(dst_argb_opt[i]));
2024
- if (abs_diff > max_diff) {
2025
- max_diff = abs_diff;
2026
- }
2027
- }
2028
- free_aligned_buffer_page_end(src_argb_a);
2029
- free_aligned_buffer_page_end(src_argb_b);
2030
- free_aligned_buffer_page_end(dst_argb_c);
2031
- free_aligned_buffer_page_end(dst_argb_opt);
2032
- return max_diff;
2033
- }
2034
-
2035
- TEST_F(LibYUVPlanarTest, ARGBSubtract_Any) {
2036
- int max_diff = TestSubtract(benchmark_width_ + 1, benchmark_height_,
2037
- benchmark_iterations_, disable_cpu_flags_,
2038
- benchmark_cpu_info_, +1, 0);
2039
- EXPECT_LE(max_diff, 1);
2040
- }
2041
-
2042
- TEST_F(LibYUVPlanarTest, ARGBSubtract_Unaligned) {
2043
- int max_diff =
2044
- TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2045
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2046
- EXPECT_LE(max_diff, 1);
2047
- }
2048
-
2049
- TEST_F(LibYUVPlanarTest, ARGBSubtract_Invert) {
2050
- int max_diff =
2051
- TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2052
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2053
- EXPECT_LE(max_diff, 1);
2054
- }
2055
-
2056
- TEST_F(LibYUVPlanarTest, ARGBSubtract_Opt) {
2057
- int max_diff =
2058
- TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2059
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2060
- EXPECT_LE(max_diff, 1);
2061
- }
2062
-
2063
- static int TestSobel(int width,
2064
- int height,
2065
- int benchmark_iterations,
2066
- int disable_cpu_flags,
2067
- int benchmark_cpu_info,
2068
- int invert,
2069
- int off) {
2070
- if (width < 1) {
2071
- width = 1;
2072
- }
2073
- const int kBpp = 4;
2074
- const int kStride = width * kBpp;
2075
- align_buffer_page_end(src_argb_a, kStride * height + off);
2076
- align_buffer_page_end(dst_argb_c, kStride * height);
2077
- align_buffer_page_end(dst_argb_opt, kStride * height);
2078
- memset(src_argb_a, 0, kStride * height + off);
2079
- for (int i = 0; i < kStride * height; ++i) {
2080
- src_argb_a[i + off] = (fastrand() & 0xff);
2081
- }
2082
- memset(dst_argb_c, 0, kStride * height);
2083
- memset(dst_argb_opt, 0, kStride * height);
2084
-
2085
- MaskCpuFlags(disable_cpu_flags);
2086
- ARGBSobel(src_argb_a + off, kStride, dst_argb_c, kStride, width,
2087
- invert * height);
2088
- MaskCpuFlags(benchmark_cpu_info);
2089
- for (int i = 0; i < benchmark_iterations; ++i) {
2090
- ARGBSobel(src_argb_a + off, kStride, dst_argb_opt, kStride, width,
2091
- invert * height);
2092
- }
2093
- int max_diff = 0;
2094
- for (int i = 0; i < kStride * height; ++i) {
2095
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2096
- static_cast<int>(dst_argb_opt[i]));
2097
- if (abs_diff > max_diff) {
2098
- max_diff = abs_diff;
2099
- }
2100
- }
2101
- free_aligned_buffer_page_end(src_argb_a);
2102
- free_aligned_buffer_page_end(dst_argb_c);
2103
- free_aligned_buffer_page_end(dst_argb_opt);
2104
- return max_diff;
2105
- }
2106
-
2107
- TEST_F(LibYUVPlanarTest, ARGBSobel_Any) {
2108
- int max_diff =
2109
- TestSobel(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2110
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2111
- EXPECT_EQ(0, max_diff);
2112
- }
2113
-
2114
- TEST_F(LibYUVPlanarTest, ARGBSobel_Unaligned) {
2115
- int max_diff =
2116
- TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2117
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2118
- EXPECT_EQ(0, max_diff);
2119
- }
2120
-
2121
- TEST_F(LibYUVPlanarTest, ARGBSobel_Invert) {
2122
- int max_diff =
2123
- TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2124
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2125
- EXPECT_EQ(0, max_diff);
2126
- }
2127
-
2128
- TEST_F(LibYUVPlanarTest, ARGBSobel_Opt) {
2129
- int max_diff =
2130
- TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2131
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2132
- EXPECT_EQ(0, max_diff);
2133
- }
2134
-
2135
- static int TestSobelToPlane(int width,
2136
- int height,
2137
- int benchmark_iterations,
2138
- int disable_cpu_flags,
2139
- int benchmark_cpu_info,
2140
- int invert,
2141
- int off) {
2142
- if (width < 1) {
2143
- width = 1;
2144
- }
2145
- const int kSrcBpp = 4;
2146
- const int kDstBpp = 1;
2147
- const int kSrcStride = (width * kSrcBpp + 15) & ~15;
2148
- const int kDstStride = (width * kDstBpp + 15) & ~15;
2149
- align_buffer_page_end(src_argb_a, kSrcStride * height + off);
2150
- align_buffer_page_end(dst_argb_c, kDstStride * height);
2151
- align_buffer_page_end(dst_argb_opt, kDstStride * height);
2152
- memset(src_argb_a, 0, kSrcStride * height + off);
2153
- for (int i = 0; i < kSrcStride * height; ++i) {
2154
- src_argb_a[i + off] = (fastrand() & 0xff);
2155
- }
2156
- memset(dst_argb_c, 0, kDstStride * height);
2157
- memset(dst_argb_opt, 0, kDstStride * height);
2158
-
2159
- MaskCpuFlags(disable_cpu_flags);
2160
- ARGBSobelToPlane(src_argb_a + off, kSrcStride, dst_argb_c, kDstStride, width,
2161
- invert * height);
2162
- MaskCpuFlags(benchmark_cpu_info);
2163
- for (int i = 0; i < benchmark_iterations; ++i) {
2164
- ARGBSobelToPlane(src_argb_a + off, kSrcStride, dst_argb_opt, kDstStride,
2165
- width, invert * height);
2166
- }
2167
- int max_diff = 0;
2168
- for (int i = 0; i < kDstStride * height; ++i) {
2169
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2170
- static_cast<int>(dst_argb_opt[i]));
2171
- if (abs_diff > max_diff) {
2172
- max_diff = abs_diff;
2173
- }
2174
- }
2175
- free_aligned_buffer_page_end(src_argb_a);
2176
- free_aligned_buffer_page_end(dst_argb_c);
2177
- free_aligned_buffer_page_end(dst_argb_opt);
2178
- return max_diff;
2179
- }
2180
-
2181
- TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Any) {
2182
- int max_diff = TestSobelToPlane(benchmark_width_ + 1, benchmark_height_,
2183
- benchmark_iterations_, disable_cpu_flags_,
2184
- benchmark_cpu_info_, +1, 0);
2185
- EXPECT_EQ(0, max_diff);
2186
- }
2187
-
2188
- TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Unaligned) {
2189
- int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2190
- benchmark_iterations_, disable_cpu_flags_,
2191
- benchmark_cpu_info_, +1, 1);
2192
- EXPECT_EQ(0, max_diff);
2193
- }
2194
-
2195
- TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Invert) {
2196
- int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2197
- benchmark_iterations_, disable_cpu_flags_,
2198
- benchmark_cpu_info_, -1, 0);
2199
- EXPECT_EQ(0, max_diff);
2200
- }
2201
-
2202
- TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Opt) {
2203
- int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2204
- benchmark_iterations_, disable_cpu_flags_,
2205
- benchmark_cpu_info_, +1, 0);
2206
- EXPECT_EQ(0, max_diff);
2207
- }
2208
-
2209
- static int TestSobelXY(int width,
2210
- int height,
2211
- int benchmark_iterations,
2212
- int disable_cpu_flags,
2213
- int benchmark_cpu_info,
2214
- int invert,
2215
- int off) {
2216
- if (width < 1) {
2217
- width = 1;
2218
- }
2219
- const int kBpp = 4;
2220
- const int kStride = width * kBpp;
2221
- align_buffer_page_end(src_argb_a, kStride * height + off);
2222
- align_buffer_page_end(dst_argb_c, kStride * height);
2223
- align_buffer_page_end(dst_argb_opt, kStride * height);
2224
- memset(src_argb_a, 0, kStride * height + off);
2225
- for (int i = 0; i < kStride * height; ++i) {
2226
- src_argb_a[i + off] = (fastrand() & 0xff);
2227
- }
2228
- memset(dst_argb_c, 0, kStride * height);
2229
- memset(dst_argb_opt, 0, kStride * height);
2230
-
2231
- MaskCpuFlags(disable_cpu_flags);
2232
- ARGBSobelXY(src_argb_a + off, kStride, dst_argb_c, kStride, width,
2233
- invert * height);
2234
- MaskCpuFlags(benchmark_cpu_info);
2235
- for (int i = 0; i < benchmark_iterations; ++i) {
2236
- ARGBSobelXY(src_argb_a + off, kStride, dst_argb_opt, kStride, width,
2237
- invert * height);
2238
- }
2239
- int max_diff = 0;
2240
- for (int i = 0; i < kStride * height; ++i) {
2241
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2242
- static_cast<int>(dst_argb_opt[i]));
2243
- if (abs_diff > max_diff) {
2244
- max_diff = abs_diff;
2245
- }
2246
- }
2247
- free_aligned_buffer_page_end(src_argb_a);
2248
- free_aligned_buffer_page_end(dst_argb_c);
2249
- free_aligned_buffer_page_end(dst_argb_opt);
2250
- return max_diff;
2251
- }
2252
-
2253
- TEST_F(LibYUVPlanarTest, ARGBSobelXY_Any) {
2254
- int max_diff = TestSobelXY(benchmark_width_ + 1, benchmark_height_,
2255
- benchmark_iterations_, disable_cpu_flags_,
2256
- benchmark_cpu_info_, +1, 0);
2257
- EXPECT_EQ(0, max_diff);
2258
- }
2259
-
2260
- TEST_F(LibYUVPlanarTest, ARGBSobelXY_Unaligned) {
2261
- int max_diff =
2262
- TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2263
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2264
- EXPECT_EQ(0, max_diff);
2265
- }
2266
-
2267
- TEST_F(LibYUVPlanarTest, ARGBSobelXY_Invert) {
2268
- int max_diff =
2269
- TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2270
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2271
- EXPECT_EQ(0, max_diff);
2272
- }
2273
-
2274
- TEST_F(LibYUVPlanarTest, ARGBSobelXY_Opt) {
2275
- int max_diff =
2276
- TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2277
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2278
- EXPECT_EQ(0, max_diff);
2279
- }
2280
-
2281
- static int TestBlur(int width,
2282
- int height,
2283
- int benchmark_iterations,
2284
- int disable_cpu_flags,
2285
- int benchmark_cpu_info,
2286
- int invert,
2287
- int off,
2288
- int radius) {
2289
- if (width < 1) {
2290
- width = 1;
2291
- }
2292
- const int kBpp = 4;
2293
- const int kStride = width * kBpp;
2294
- align_buffer_page_end(src_argb_a, kStride * height + off);
2295
- align_buffer_page_end(dst_cumsum, width * height * 16);
2296
- align_buffer_page_end(dst_argb_c, kStride * height);
2297
- align_buffer_page_end(dst_argb_opt, kStride * height);
2298
- for (int i = 0; i < kStride * height; ++i) {
2299
- src_argb_a[i + off] = (fastrand() & 0xff);
2300
- }
2301
- memset(dst_cumsum, 0, width * height * 16);
2302
- memset(dst_argb_c, 0, kStride * height);
2303
- memset(dst_argb_opt, 0, kStride * height);
2304
-
2305
- MaskCpuFlags(disable_cpu_flags);
2306
- ARGBBlur(src_argb_a + off, kStride, dst_argb_c, kStride,
2307
- reinterpret_cast<int32_t*>(dst_cumsum), width * 4, width,
2308
- invert * height, radius);
2309
- MaskCpuFlags(benchmark_cpu_info);
2310
- for (int i = 0; i < benchmark_iterations; ++i) {
2311
- ARGBBlur(src_argb_a + off, kStride, dst_argb_opt, kStride,
2312
- reinterpret_cast<int32_t*>(dst_cumsum), width * 4, width,
2313
- invert * height, radius);
2314
- }
2315
- int max_diff = 0;
2316
- for (int i = 0; i < kStride * height; ++i) {
2317
- int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2318
- static_cast<int>(dst_argb_opt[i]));
2319
- if (abs_diff > max_diff) {
2320
- max_diff = abs_diff;
2321
- }
2322
- }
2323
- free_aligned_buffer_page_end(src_argb_a);
2324
- free_aligned_buffer_page_end(dst_cumsum);
2325
- free_aligned_buffer_page_end(dst_argb_c);
2326
- free_aligned_buffer_page_end(dst_argb_opt);
2327
- return max_diff;
2328
- }
2329
-
2330
- #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2331
- #define DISABLED_ARM(name) name
2332
- #else
2333
- #define DISABLED_ARM(name) DISABLED_##name
2334
- #endif
2335
-
2336
- static const int kBlurSize = 55;
2337
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Any)) {
2338
- int max_diff =
2339
- TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2340
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize);
2341
- EXPECT_LE(max_diff, 1);
2342
- }
2343
-
2344
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Unaligned)) {
2345
- int max_diff =
2346
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2347
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSize);
2348
- EXPECT_LE(max_diff, 1);
2349
- }
2350
-
2351
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Invert)) {
2352
- int max_diff =
2353
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2354
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSize);
2355
- EXPECT_LE(max_diff, 1);
2356
- }
2357
-
2358
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Opt)) {
2359
- int max_diff =
2360
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2361
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize);
2362
- EXPECT_LE(max_diff, 1);
2363
- }
2364
-
2365
- static const int kBlurSmallSize = 5;
2366
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Any)) {
2367
- int max_diff =
2368
- TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2369
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize);
2370
- EXPECT_LE(max_diff, 1);
2371
- }
2372
-
2373
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Unaligned)) {
2374
- int max_diff =
2375
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2376
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSmallSize);
2377
- EXPECT_LE(max_diff, 1);
2378
- }
2379
-
2380
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Invert)) {
2381
- int max_diff =
2382
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2383
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSmallSize);
2384
- EXPECT_LE(max_diff, 1);
2385
- }
2386
-
2387
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Opt)) {
2388
- int max_diff =
2389
- TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2390
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize);
2391
- EXPECT_LE(max_diff, 1);
2392
- }
2393
-
2394
- TEST_F(LibYUVPlanarTest, DISABLED_ARM(TestARGBPolynomial)) {
2395
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
2396
- SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
2397
- SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
2398
- memset(orig_pixels, 0, sizeof(orig_pixels));
2399
-
2400
- SIMD_ALIGNED(static const float kWarmifyPolynomial[16]) = {
2401
- 0.94230f, -3.03300f, -2.92500f, 0.f, // C0
2402
- 0.584500f, 1.112000f, 1.535000f, 1.f, // C1 x
2403
- 0.001313f, -0.002503f, -0.004496f, 0.f, // C2 x * x
2404
- 0.0f, 0.000006965f, 0.000008781f, 0.f, // C3 x * x * x
2405
- };
2406
-
2407
- // Test blue
2408
- orig_pixels[0][0] = 255u;
2409
- orig_pixels[0][1] = 0u;
2410
- orig_pixels[0][2] = 0u;
2411
- orig_pixels[0][3] = 128u;
2412
- // Test green
2413
- orig_pixels[1][0] = 0u;
2414
- orig_pixels[1][1] = 255u;
2415
- orig_pixels[1][2] = 0u;
2416
- orig_pixels[1][3] = 0u;
2417
- // Test red
2418
- orig_pixels[2][0] = 0u;
2419
- orig_pixels[2][1] = 0u;
2420
- orig_pixels[2][2] = 255u;
2421
- orig_pixels[2][3] = 255u;
2422
- // Test white
2423
- orig_pixels[3][0] = 255u;
2424
- orig_pixels[3][1] = 255u;
2425
- orig_pixels[3][2] = 255u;
2426
- orig_pixels[3][3] = 255u;
2427
- // Test color
2428
- orig_pixels[4][0] = 16u;
2429
- orig_pixels[4][1] = 64u;
2430
- orig_pixels[4][2] = 192u;
2431
- orig_pixels[4][3] = 224u;
2432
- // Do 16 to test asm version.
2433
- ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2434
- &kWarmifyPolynomial[0], 16, 1);
2435
- EXPECT_EQ(235u, dst_pixels_opt[0][0]);
2436
- EXPECT_EQ(0u, dst_pixels_opt[0][1]);
2437
- EXPECT_EQ(0u, dst_pixels_opt[0][2]);
2438
- EXPECT_EQ(128u, dst_pixels_opt[0][3]);
2439
- EXPECT_EQ(0u, dst_pixels_opt[1][0]);
2440
- EXPECT_EQ(233u, dst_pixels_opt[1][1]);
2441
- EXPECT_EQ(0u, dst_pixels_opt[1][2]);
2442
- EXPECT_EQ(0u, dst_pixels_opt[1][3]);
2443
- EXPECT_EQ(0u, dst_pixels_opt[2][0]);
2444
- EXPECT_EQ(0u, dst_pixels_opt[2][1]);
2445
- EXPECT_EQ(241u, dst_pixels_opt[2][2]);
2446
- EXPECT_EQ(255u, dst_pixels_opt[2][3]);
2447
- EXPECT_EQ(235u, dst_pixels_opt[3][0]);
2448
- EXPECT_EQ(233u, dst_pixels_opt[3][1]);
2449
- EXPECT_EQ(241u, dst_pixels_opt[3][2]);
2450
- EXPECT_EQ(255u, dst_pixels_opt[3][3]);
2451
- EXPECT_EQ(10u, dst_pixels_opt[4][0]);
2452
- EXPECT_EQ(59u, dst_pixels_opt[4][1]);
2453
- EXPECT_EQ(188u, dst_pixels_opt[4][2]);
2454
- EXPECT_EQ(224u, dst_pixels_opt[4][3]);
2455
-
2456
- for (int i = 0; i < 1280; ++i) {
2457
- orig_pixels[i][0] = i;
2458
- orig_pixels[i][1] = i / 2;
2459
- orig_pixels[i][2] = i / 3;
2460
- orig_pixels[i][3] = i;
2461
- }
2462
-
2463
- MaskCpuFlags(disable_cpu_flags_);
2464
- ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
2465
- &kWarmifyPolynomial[0], 1280, 1);
2466
- MaskCpuFlags(benchmark_cpu_info_);
2467
-
2468
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
2469
- ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2470
- &kWarmifyPolynomial[0], 1280, 1);
2471
- }
2472
-
2473
- for (int i = 0; i < 1280; ++i) {
2474
- EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
2475
- EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
2476
- EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
2477
- EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
2478
- }
2479
- }
2480
-
2481
- static int TestHalfFloatPlane(int benchmark_width,
2482
- int benchmark_height,
2483
- int benchmark_iterations,
2484
- int disable_cpu_flags,
2485
- int benchmark_cpu_info,
2486
- float scale,
2487
- int mask,
2488
- int invert,
2489
- int off) {
2490
- int i, j;
2491
- const int y_plane_size = benchmark_width * benchmark_height * 2;
2492
- align_buffer_page_end(orig_y, y_plane_size + off);
2493
- align_buffer_page_end(dst_c, y_plane_size);
2494
- align_buffer_page_end(dst_opt, y_plane_size);
2495
-
2496
- MemRandomize(orig_y + off, y_plane_size);
2497
- memset(dst_c, 1, y_plane_size);
2498
- memset(dst_opt, 2, y_plane_size);
2499
-
2500
- for (i = 0; i < y_plane_size / 2; ++i) {
2501
- reinterpret_cast<uint16_t*>(orig_y + off)[i] &= mask;
2502
- }
2503
-
2504
- // Disable all optimizations.
2505
- MaskCpuFlags(disable_cpu_flags);
2506
- for (j = 0; j < benchmark_iterations; j++) {
2507
- HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
2508
- benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_c),
2509
- benchmark_width * 2, scale, benchmark_width,
2510
- benchmark_height * invert);
2511
- }
2512
-
2513
- // Enable optimizations.
2514
- MaskCpuFlags(benchmark_cpu_info);
2515
- for (j = 0; j < benchmark_iterations; j++) {
2516
- HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
2517
- benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_opt),
2518
- benchmark_width * 2, scale, benchmark_width,
2519
- benchmark_height * invert);
2520
- }
2521
-
2522
- int max_diff = 0;
2523
- for (i = 0; i < y_plane_size / 2; ++i) {
2524
- int abs_diff =
2525
- abs(static_cast<int>(reinterpret_cast<uint16_t*>(dst_c)[i]) -
2526
- static_cast<int>(reinterpret_cast<uint16_t*>(dst_opt)[i]));
2527
- if (abs_diff > max_diff) {
2528
- max_diff = abs_diff;
2529
- }
2530
- }
2531
-
2532
- free_aligned_buffer_page_end(orig_y);
2533
- free_aligned_buffer_page_end(dst_c);
2534
- free_aligned_buffer_page_end(dst_opt);
2535
- return max_diff;
2536
- }
2537
-
2538
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_One) {
2539
- int diff = TestHalfFloatPlane(benchmark_width_, benchmark_height_,
2540
- benchmark_iterations_, disable_cpu_flags_,
2541
- benchmark_cpu_info_, 1.0f, 65535, +1, 0);
2542
- EXPECT_LE(diff, 1);
2543
- }
2544
-
2545
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_Opt) {
2546
- int diff = TestHalfFloatPlane(
2547
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2548
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2549
- EXPECT_EQ(0, diff);
2550
- }
2551
-
2552
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_12bit_Opt) {
2553
- int diff = TestHalfFloatPlane(
2554
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2555
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4095.0f, 4095, +1, 0);
2556
- EXPECT_EQ(0, diff);
2557
- }
2558
-
2559
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_10bit_Opt) {
2560
- int diff = TestHalfFloatPlane(
2561
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2562
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 1023.0f, 1023, +1, 0);
2563
- EXPECT_EQ(0, diff);
2564
- }
2565
-
2566
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_9bit_Opt) {
2567
- int diff = TestHalfFloatPlane(benchmark_width_, benchmark_height_,
2568
- benchmark_iterations_, disable_cpu_flags_,
2569
- benchmark_cpu_info_, 1.0f / 511.0f, 511, +1, 0);
2570
- EXPECT_EQ(0, diff);
2571
- }
2572
-
2573
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Any) {
2574
- int diff = TestHalfFloatPlane(
2575
- benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2576
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 0);
2577
- EXPECT_EQ(0, diff);
2578
- }
2579
-
2580
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Unaligned) {
2581
- int diff = TestHalfFloatPlane(
2582
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2583
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 2);
2584
- EXPECT_EQ(0, diff);
2585
- }
2586
-
2587
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Invert) {
2588
- int diff = TestHalfFloatPlane(
2589
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2590
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, -1, 0);
2591
- EXPECT_EQ(0, diff);
2592
- }
2593
-
2594
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Opt) {
2595
- int diff = TestHalfFloatPlane(
2596
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2597
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 0);
2598
- EXPECT_EQ(0, diff);
2599
- }
2600
-
2601
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_denormal) {
2602
- int diff = TestHalfFloatPlane(
2603
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2604
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2605
- EXPECT_EQ(0, diff);
2606
- }
2607
-
2608
- #if defined(__arm__) && !defined(__SOFTFP__)
2609
- static void EnableFlushDenormalToZero(void) {
2610
- uint32_t cw;
2611
- asm volatile(
2612
- "vmrs %0, fpscr \n"
2613
- "orr %0, %0, #0x1000000 \n"
2614
- "vmsr fpscr, %0 \n"
2615
- : "=r"(cw)::"memory", "cc"); // Clobber List
2616
- }
2617
-
2618
- static void DisableFlushDenormalToZero(void) {
2619
- uint32_t cw;
2620
- asm volatile(
2621
- "vmrs %0, fpscr \n"
2622
- "bic %0, %0, #0x1000000 \n"
2623
- "vmsr fpscr, %0 \n"
2624
- : "=r"(cw)::"memory", "cc"); // Clobber List
2625
- }
2626
-
2627
- // 5 bit exponent with bias of 15 will underflow to a denormal if scale causes
2628
- // exponent to be less than 0. 15 - log2(65536) = -1/ This shouldnt normally
2629
- // happen since scale is 1/(1<<bits) where bits is 9, 10 or 12.
2630
-
2631
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_flush_denormal) {
2632
- // 32 bit arm rounding on denormal case is off by 1 compared to C.
2633
- EnableFlushDenormalToZero();
2634
- int diff = TestHalfFloatPlane(
2635
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2636
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2637
- DisableFlushDenormalToZero();
2638
- EXPECT_EQ(0, diff);
2639
- }
2640
-
2641
- TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_10bit_flush_denormal) {
2642
- EnableFlushDenormalToZero();
2643
- int diff = TestHalfFloatPlane(
2644
- benchmark_width_, benchmark_height_, benchmark_iterations_,
2645
- disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 1023.0f, 1023, +1, 0);
2646
- DisableFlushDenormalToZero();
2647
- EXPECT_EQ(0, diff);
2648
- }
2649
- #endif // defined(__arm__) && !defined(__SOFTFP__)
2650
-
2651
- static float TestByteToFloat(int benchmark_width,
2652
- int benchmark_height,
2653
- int benchmark_iterations,
2654
- int disable_cpu_flags,
2655
- int benchmark_cpu_info,
2656
- float scale) {
2657
- int i, j;
2658
- const int y_plane_size = benchmark_width * benchmark_height;
2659
-
2660
- align_buffer_page_end(orig_y, y_plane_size * (1 + 4 + 4));
2661
- float* dst_opt = reinterpret_cast<float*>(orig_y + y_plane_size);
2662
- float* dst_c = reinterpret_cast<float*>(orig_y + y_plane_size * 5);
2663
-
2664
- MemRandomize(orig_y, y_plane_size);
2665
- memset(dst_c, 0, y_plane_size * 4);
2666
- memset(dst_opt, 1, y_plane_size * 4);
2667
-
2668
- // Disable all optimizations.
2669
- MaskCpuFlags(disable_cpu_flags);
2670
- ByteToFloat(orig_y, dst_c, scale, y_plane_size);
2671
-
2672
- // Enable optimizations.
2673
- MaskCpuFlags(benchmark_cpu_info);
2674
- for (j = 0; j < benchmark_iterations; j++) {
2675
- ByteToFloat(orig_y, dst_opt, scale, y_plane_size);
2676
- }
2677
-
2678
- float max_diff = 0;
2679
- for (i = 0; i < y_plane_size; ++i) {
2680
- float abs_diff = fabs(dst_c[i] - dst_opt[i]);
2681
- if (abs_diff > max_diff) {
2682
- max_diff = abs_diff;
2683
- }
2684
- }
2685
-
2686
- free_aligned_buffer_page_end(orig_y);
2687
- return max_diff;
2688
- }
2689
-
2690
- TEST_F(LibYUVPlanarTest, TestByteToFloat) {
2691
- float diff = TestByteToFloat(benchmark_width_, benchmark_height_,
2692
- benchmark_iterations_, disable_cpu_flags_,
2693
- benchmark_cpu_info_, 1.0f);
2694
- EXPECT_EQ(0.f, diff);
2695
- }
2696
-
2697
- TEST_F(LibYUVPlanarTest, TestARGBLumaColorTable) {
2698
- SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
2699
- SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
2700
- SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
2701
- memset(orig_pixels, 0, sizeof(orig_pixels));
2702
-
2703
- align_buffer_page_end(lumacolortable, 32768);
2704
- int v = 0;
2705
- for (int i = 0; i < 32768; ++i) {
2706
- lumacolortable[i] = v;
2707
- v += 3;
2708
- }
2709
- // Test blue
2710
- orig_pixels[0][0] = 255u;
2711
- orig_pixels[0][1] = 0u;
2712
- orig_pixels[0][2] = 0u;
2713
- orig_pixels[0][3] = 128u;
2714
- // Test green
2715
- orig_pixels[1][0] = 0u;
2716
- orig_pixels[1][1] = 255u;
2717
- orig_pixels[1][2] = 0u;
2718
- orig_pixels[1][3] = 0u;
2719
- // Test red
2720
- orig_pixels[2][0] = 0u;
2721
- orig_pixels[2][1] = 0u;
2722
- orig_pixels[2][2] = 255u;
2723
- orig_pixels[2][3] = 255u;
2724
- // Test color
2725
- orig_pixels[3][0] = 16u;
2726
- orig_pixels[3][1] = 64u;
2727
- orig_pixels[3][2] = 192u;
2728
- orig_pixels[3][3] = 224u;
2729
- // Do 16 to test asm version.
2730
- ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2731
- &lumacolortable[0], 16, 1);
2732
- EXPECT_EQ(253u, dst_pixels_opt[0][0]);
2733
- EXPECT_EQ(0u, dst_pixels_opt[0][1]);
2734
- EXPECT_EQ(0u, dst_pixels_opt[0][2]);
2735
- EXPECT_EQ(128u, dst_pixels_opt[0][3]);
2736
- EXPECT_EQ(0u, dst_pixels_opt[1][0]);
2737
- EXPECT_EQ(253u, dst_pixels_opt[1][1]);
2738
- EXPECT_EQ(0u, dst_pixels_opt[1][2]);
2739
- EXPECT_EQ(0u, dst_pixels_opt[1][3]);
2740
- EXPECT_EQ(0u, dst_pixels_opt[2][0]);
2741
- EXPECT_EQ(0u, dst_pixels_opt[2][1]);
2742
- EXPECT_EQ(253u, dst_pixels_opt[2][2]);
2743
- EXPECT_EQ(255u, dst_pixels_opt[2][3]);
2744
- EXPECT_EQ(48u, dst_pixels_opt[3][0]);
2745
- EXPECT_EQ(192u, dst_pixels_opt[3][1]);
2746
- EXPECT_EQ(64u, dst_pixels_opt[3][2]);
2747
- EXPECT_EQ(224u, dst_pixels_opt[3][3]);
2748
-
2749
- for (int i = 0; i < 1280; ++i) {
2750
- orig_pixels[i][0] = i;
2751
- orig_pixels[i][1] = i / 2;
2752
- orig_pixels[i][2] = i / 3;
2753
- orig_pixels[i][3] = i;
2754
- }
2755
-
2756
- MaskCpuFlags(disable_cpu_flags_);
2757
- ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
2758
- lumacolortable, 1280, 1);
2759
- MaskCpuFlags(benchmark_cpu_info_);
2760
-
2761
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
2762
- ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2763
- lumacolortable, 1280, 1);
2764
- }
2765
- for (int i = 0; i < 1280; ++i) {
2766
- EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
2767
- EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
2768
- EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
2769
- EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
2770
- }
2771
-
2772
- free_aligned_buffer_page_end(lumacolortable);
2773
- }
2774
-
2775
- TEST_F(LibYUVPlanarTest, TestARGBCopyAlpha) {
2776
- const int kSize = benchmark_width_ * benchmark_height_ * 4;
2777
- align_buffer_page_end(orig_pixels, kSize);
2778
- align_buffer_page_end(dst_pixels_opt, kSize);
2779
- align_buffer_page_end(dst_pixels_c, kSize);
2780
-
2781
- MemRandomize(orig_pixels, kSize);
2782
- MemRandomize(dst_pixels_opt, kSize);
2783
- memcpy(dst_pixels_c, dst_pixels_opt, kSize);
2784
-
2785
- MaskCpuFlags(disable_cpu_flags_);
2786
- ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4, dst_pixels_c,
2787
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2788
- MaskCpuFlags(benchmark_cpu_info_);
2789
-
2790
- for (int i = 0; i < benchmark_iterations_; ++i) {
2791
- ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4, dst_pixels_opt,
2792
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2793
- }
2794
- for (int i = 0; i < kSize; ++i) {
2795
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2796
- }
2797
-
2798
- free_aligned_buffer_page_end(dst_pixels_c);
2799
- free_aligned_buffer_page_end(dst_pixels_opt);
2800
- free_aligned_buffer_page_end(orig_pixels);
2801
- }
2802
-
2803
- TEST_F(LibYUVPlanarTest, TestARGBExtractAlpha) {
2804
- const int kPixels = benchmark_width_ * benchmark_height_;
2805
- align_buffer_page_end(src_pixels, kPixels * 4);
2806
- align_buffer_page_end(dst_pixels_opt, kPixels);
2807
- align_buffer_page_end(dst_pixels_c, kPixels);
2808
-
2809
- MemRandomize(src_pixels, kPixels * 4);
2810
- MemRandomize(dst_pixels_opt, kPixels);
2811
- memcpy(dst_pixels_c, dst_pixels_opt, kPixels);
2812
-
2813
- MaskCpuFlags(disable_cpu_flags_);
2814
- ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_c,
2815
- benchmark_width_, benchmark_width_, benchmark_height_);
2816
- double c_time = get_time();
2817
- ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_c,
2818
- benchmark_width_, benchmark_width_, benchmark_height_);
2819
- c_time = (get_time() - c_time);
2820
-
2821
- MaskCpuFlags(benchmark_cpu_info_);
2822
- ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
2823
- benchmark_width_, benchmark_width_, benchmark_height_);
2824
- double opt_time = get_time();
2825
- for (int i = 0; i < benchmark_iterations_; ++i) {
2826
- ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
2827
- benchmark_width_, benchmark_width_, benchmark_height_);
2828
- }
2829
- opt_time = (get_time() - opt_time) / benchmark_iterations_;
2830
- // Report performance of C vs OPT
2831
- printf("%8d us C - %8d us OPT\n", static_cast<int>(c_time * 1e6),
2832
- static_cast<int>(opt_time * 1e6));
2833
- for (int i = 0; i < kPixels; ++i) {
2834
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2835
- }
2836
-
2837
- free_aligned_buffer_page_end(dst_pixels_c);
2838
- free_aligned_buffer_page_end(dst_pixels_opt);
2839
- free_aligned_buffer_page_end(src_pixels);
2840
- }
2841
-
2842
- TEST_F(LibYUVPlanarTest, TestARGBCopyYToAlpha) {
2843
- const int kPixels = benchmark_width_ * benchmark_height_;
2844
- align_buffer_page_end(orig_pixels, kPixels);
2845
- align_buffer_page_end(dst_pixels_opt, kPixels * 4);
2846
- align_buffer_page_end(dst_pixels_c, kPixels * 4);
2847
-
2848
- MemRandomize(orig_pixels, kPixels);
2849
- MemRandomize(dst_pixels_opt, kPixels * 4);
2850
- memcpy(dst_pixels_c, dst_pixels_opt, kPixels * 4);
2851
-
2852
- MaskCpuFlags(disable_cpu_flags_);
2853
- ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_c,
2854
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2855
- double c_time = get_time();
2856
- ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_c,
2857
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2858
- c_time = (get_time() - c_time);
2859
-
2860
- MaskCpuFlags(benchmark_cpu_info_);
2861
- ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_opt,
2862
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2863
- double opt_time = get_time();
2864
- for (int i = 0; i < benchmark_iterations_; ++i) {
2865
- ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_opt,
2866
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2867
- }
2868
- opt_time = (get_time() - opt_time) / benchmark_iterations_;
2869
-
2870
- // Report performance of C vs OPT
2871
- printf("%8d us C - %8d us OPT\n", static_cast<int>(c_time * 1e6),
2872
- static_cast<int>(opt_time * 1e6));
2873
- for (int i = 0; i < kPixels * 4; ++i) {
2874
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2875
- }
2876
-
2877
- free_aligned_buffer_page_end(dst_pixels_c);
2878
- free_aligned_buffer_page_end(dst_pixels_opt);
2879
- free_aligned_buffer_page_end(orig_pixels);
2880
- }
2881
-
2882
- static int TestARGBRect(int width,
2883
- int height,
2884
- int benchmark_iterations,
2885
- int disable_cpu_flags,
2886
- int benchmark_cpu_info,
2887
- int invert,
2888
- int off,
2889
- int bpp) {
2890
- if (width < 1) {
2891
- width = 1;
2892
- }
2893
- const int kStride = width * bpp;
2894
- const int kSize = kStride * height;
2895
- const uint32_t v32 = fastrand() & (bpp == 4 ? 0xffffffff : 0xff);
2896
-
2897
- align_buffer_page_end(dst_argb_c, kSize + off);
2898
- align_buffer_page_end(dst_argb_opt, kSize + off);
2899
-
2900
- MemRandomize(dst_argb_c + off, kSize);
2901
- memcpy(dst_argb_opt + off, dst_argb_c + off, kSize);
2902
-
2903
- MaskCpuFlags(disable_cpu_flags);
2904
- if (bpp == 4) {
2905
- ARGBRect(dst_argb_c + off, kStride, 0, 0, width, invert * height, v32);
2906
- } else {
2907
- SetPlane(dst_argb_c + off, kStride, width, invert * height, v32);
2908
- }
2909
-
2910
- MaskCpuFlags(benchmark_cpu_info);
2911
- for (int i = 0; i < benchmark_iterations; ++i) {
2912
- if (bpp == 4) {
2913
- ARGBRect(dst_argb_opt + off, kStride, 0, 0, width, invert * height, v32);
2914
- } else {
2915
- SetPlane(dst_argb_opt + off, kStride, width, invert * height, v32);
2916
- }
2917
- }
2918
- int max_diff = 0;
2919
- for (int i = 0; i < kStride * height; ++i) {
2920
- int abs_diff = abs(static_cast<int>(dst_argb_c[i + off]) -
2921
- static_cast<int>(dst_argb_opt[i + off]));
2922
- if (abs_diff > max_diff) {
2923
- max_diff = abs_diff;
2924
- }
2925
- }
2926
- free_aligned_buffer_page_end(dst_argb_c);
2927
- free_aligned_buffer_page_end(dst_argb_opt);
2928
- return max_diff;
2929
- }
2930
-
2931
- TEST_F(LibYUVPlanarTest, ARGBRect_Any) {
2932
- int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_,
2933
- benchmark_iterations_, disable_cpu_flags_,
2934
- benchmark_cpu_info_, +1, 0, 4);
2935
- EXPECT_EQ(0, max_diff);
2936
- }
2937
-
2938
- TEST_F(LibYUVPlanarTest, ARGBRect_Unaligned) {
2939
- int max_diff =
2940
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2941
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 4);
2942
- EXPECT_EQ(0, max_diff);
2943
- }
2944
-
2945
- TEST_F(LibYUVPlanarTest, ARGBRect_Invert) {
2946
- int max_diff =
2947
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2948
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 4);
2949
- EXPECT_EQ(0, max_diff);
2950
- }
2951
-
2952
- TEST_F(LibYUVPlanarTest, ARGBRect_Opt) {
2953
- int max_diff =
2954
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2955
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 4);
2956
- EXPECT_EQ(0, max_diff);
2957
- }
2958
-
2959
- TEST_F(LibYUVPlanarTest, SetPlane_Any) {
2960
- int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_,
2961
- benchmark_iterations_, disable_cpu_flags_,
2962
- benchmark_cpu_info_, +1, 0, 1);
2963
- EXPECT_EQ(0, max_diff);
2964
- }
2965
-
2966
- TEST_F(LibYUVPlanarTest, SetPlane_Unaligned) {
2967
- int max_diff =
2968
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2969
- disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 1);
2970
- EXPECT_EQ(0, max_diff);
2971
- }
2972
-
2973
- TEST_F(LibYUVPlanarTest, SetPlane_Invert) {
2974
- int max_diff =
2975
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2976
- disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 1);
2977
- EXPECT_EQ(0, max_diff);
2978
- }
2979
-
2980
- TEST_F(LibYUVPlanarTest, SetPlane_Opt) {
2981
- int max_diff =
2982
- TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2983
- disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
2984
- EXPECT_EQ(0, max_diff);
2985
- }
2986
-
2987
- TEST_F(LibYUVPlanarTest, MergeUVPlane_Opt) {
2988
- const int kPixels = benchmark_width_ * benchmark_height_;
2989
- align_buffer_page_end(src_pixels_u, kPixels);
2990
- align_buffer_page_end(src_pixels_v, kPixels);
2991
- align_buffer_page_end(dst_pixels_opt, kPixels * 2);
2992
- align_buffer_page_end(dst_pixels_c, kPixels * 2);
2993
-
2994
- MemRandomize(src_pixels_u, kPixels);
2995
- MemRandomize(src_pixels_v, kPixels);
2996
- MemRandomize(dst_pixels_opt, kPixels * 2);
2997
- MemRandomize(dst_pixels_c, kPixels * 2);
2998
-
2999
- MaskCpuFlags(disable_cpu_flags_);
3000
- MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_,
3001
- dst_pixels_c, benchmark_width_ * 2, benchmark_width_,
3002
- benchmark_height_);
3003
- MaskCpuFlags(benchmark_cpu_info_);
3004
-
3005
- for (int i = 0; i < benchmark_iterations_; ++i) {
3006
- MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_,
3007
- dst_pixels_opt, benchmark_width_ * 2, benchmark_width_,
3008
- benchmark_height_);
3009
- }
3010
-
3011
- for (int i = 0; i < kPixels * 2; ++i) {
3012
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3013
- }
3014
-
3015
- free_aligned_buffer_page_end(src_pixels_u);
3016
- free_aligned_buffer_page_end(src_pixels_v);
3017
- free_aligned_buffer_page_end(dst_pixels_opt);
3018
- free_aligned_buffer_page_end(dst_pixels_c);
3019
- }
3020
-
3021
- // 16 bit channel split and merge
3022
- TEST_F(LibYUVPlanarTest, MergeUVPlane_16_Opt) {
3023
- const int kPixels = benchmark_width_ * benchmark_height_;
3024
- align_buffer_page_end(src_pixels_u, kPixels * 2);
3025
- align_buffer_page_end(src_pixels_v, kPixels * 2);
3026
- align_buffer_page_end(dst_pixels_opt, kPixels * 2 * 2);
3027
- align_buffer_page_end(dst_pixels_c, kPixels * 2 * 2);
3028
- MemRandomize(src_pixels_u, kPixels * 2);
3029
- MemRandomize(src_pixels_v, kPixels * 2);
3030
- MemRandomize(dst_pixels_opt, kPixels * 2 * 2);
3031
- MemRandomize(dst_pixels_c, kPixels * 2 * 2);
3032
-
3033
- MaskCpuFlags(disable_cpu_flags_);
3034
- MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_,
3035
- (const uint16_t*)src_pixels_v, benchmark_width_,
3036
- (uint16_t*)dst_pixels_c, benchmark_width_ * 2,
3037
- benchmark_width_, benchmark_height_, 12);
3038
- MaskCpuFlags(benchmark_cpu_info_);
3039
-
3040
- for (int i = 0; i < benchmark_iterations_; ++i) {
3041
- MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_,
3042
- (const uint16_t*)src_pixels_v, benchmark_width_,
3043
- (uint16_t*)dst_pixels_opt, benchmark_width_ * 2,
3044
- benchmark_width_, benchmark_height_, 12);
3045
- }
3046
-
3047
- for (int i = 0; i < kPixels * 2 * 2; ++i) {
3048
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3049
- }
3050
- free_aligned_buffer_page_end(src_pixels_u);
3051
- free_aligned_buffer_page_end(src_pixels_v);
3052
- free_aligned_buffer_page_end(dst_pixels_opt);
3053
- free_aligned_buffer_page_end(dst_pixels_c);
3054
- }
3055
-
3056
- TEST_F(LibYUVPlanarTest, SplitUVPlane_Opt) {
3057
- const int kPixels = benchmark_width_ * benchmark_height_;
3058
- align_buffer_page_end(src_pixels, kPixels * 2);
3059
- align_buffer_page_end(dst_pixels_u_c, kPixels);
3060
- align_buffer_page_end(dst_pixels_v_c, kPixels);
3061
- align_buffer_page_end(dst_pixels_u_opt, kPixels);
3062
- align_buffer_page_end(dst_pixels_v_opt, kPixels);
3063
-
3064
- MemRandomize(src_pixels, kPixels * 2);
3065
- MemRandomize(dst_pixels_u_c, kPixels);
3066
- MemRandomize(dst_pixels_v_c, kPixels);
3067
- MemRandomize(dst_pixels_u_opt, kPixels);
3068
- MemRandomize(dst_pixels_v_opt, kPixels);
3069
-
3070
- MaskCpuFlags(disable_cpu_flags_);
3071
- SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_c,
3072
- benchmark_width_, dst_pixels_v_c, benchmark_width_,
3073
- benchmark_width_, benchmark_height_);
3074
- MaskCpuFlags(benchmark_cpu_info_);
3075
-
3076
- for (int i = 0; i < benchmark_iterations_; ++i) {
3077
- SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_opt,
3078
- benchmark_width_, dst_pixels_v_opt, benchmark_width_,
3079
- benchmark_width_, benchmark_height_);
3080
- }
3081
-
3082
- for (int i = 0; i < kPixels; ++i) {
3083
- EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]);
3084
- EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]);
3085
- }
3086
-
3087
- free_aligned_buffer_page_end(src_pixels);
3088
- free_aligned_buffer_page_end(dst_pixels_u_c);
3089
- free_aligned_buffer_page_end(dst_pixels_v_c);
3090
- free_aligned_buffer_page_end(dst_pixels_u_opt);
3091
- free_aligned_buffer_page_end(dst_pixels_v_opt);
3092
- }
3093
-
3094
- // 16 bit channel split
3095
- TEST_F(LibYUVPlanarTest, SplitUVPlane_16_Opt) {
3096
- const int kPixels = benchmark_width_ * benchmark_height_;
3097
- align_buffer_page_end(src_pixels, kPixels * 2 * 2);
3098
- align_buffer_page_end(dst_pixels_u_c, kPixels * 2);
3099
- align_buffer_page_end(dst_pixels_v_c, kPixels * 2);
3100
- align_buffer_page_end(dst_pixels_u_opt, kPixels * 2);
3101
- align_buffer_page_end(dst_pixels_v_opt, kPixels * 2);
3102
- MemRandomize(src_pixels, kPixels * 2 * 2);
3103
- MemRandomize(dst_pixels_u_c, kPixels * 2);
3104
- MemRandomize(dst_pixels_v_c, kPixels * 2);
3105
- MemRandomize(dst_pixels_u_opt, kPixels * 2);
3106
- MemRandomize(dst_pixels_v_opt, kPixels * 2);
3107
-
3108
- MaskCpuFlags(disable_cpu_flags_);
3109
- SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2,
3110
- (uint16_t*)dst_pixels_u_c, benchmark_width_,
3111
- (uint16_t*)dst_pixels_v_c, benchmark_width_, benchmark_width_,
3112
- benchmark_height_, 10);
3113
- MaskCpuFlags(benchmark_cpu_info_);
3114
-
3115
- for (int i = 0; i < benchmark_iterations_; ++i) {
3116
- SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2,
3117
- (uint16_t*)dst_pixels_u_opt, benchmark_width_,
3118
- (uint16_t*)dst_pixels_v_opt, benchmark_width_,
3119
- benchmark_width_, benchmark_height_, 10);
3120
- }
3121
-
3122
- for (int i = 0; i < kPixels * 2; ++i) {
3123
- EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]);
3124
- EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]);
3125
- }
3126
- free_aligned_buffer_page_end(src_pixels);
3127
- free_aligned_buffer_page_end(dst_pixels_u_c);
3128
- free_aligned_buffer_page_end(dst_pixels_v_c);
3129
- free_aligned_buffer_page_end(dst_pixels_u_opt);
3130
- free_aligned_buffer_page_end(dst_pixels_v_opt);
3131
- }
3132
-
3133
- TEST_F(LibYUVPlanarTest, SwapUVPlane_Opt) {
3134
- // Round count up to multiple of 16
3135
- const int kPixels = benchmark_width_ * benchmark_height_;
3136
- align_buffer_page_end(src_pixels, kPixels * 2);
3137
- align_buffer_page_end(dst_pixels_opt, kPixels * 2);
3138
- align_buffer_page_end(dst_pixels_c, kPixels * 2);
3139
-
3140
- MemRandomize(src_pixels, kPixels * 2);
3141
- MemRandomize(dst_pixels_opt, kPixels * 2);
3142
- MemRandomize(dst_pixels_c, kPixels * 2);
3143
-
3144
- MaskCpuFlags(disable_cpu_flags_);
3145
- SwapUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_c,
3146
- benchmark_width_ * 2, benchmark_width_, benchmark_height_);
3147
- MaskCpuFlags(benchmark_cpu_info_);
3148
-
3149
- for (int i = 0; i < benchmark_iterations_; ++i) {
3150
- SwapUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_opt,
3151
- benchmark_width_ * 2, benchmark_width_, benchmark_height_);
3152
- }
3153
-
3154
- for (int i = 0; i < kPixels * 2; ++i) {
3155
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3156
- }
3157
-
3158
- free_aligned_buffer_page_end(src_pixels);
3159
- free_aligned_buffer_page_end(dst_pixels_opt);
3160
- free_aligned_buffer_page_end(dst_pixels_c);
3161
- }
3162
-
3163
- TEST_F(LibYUVPlanarTest, MergeRGBPlane_Opt) {
3164
- // Round count up to multiple of 16
3165
- const int kPixels = benchmark_width_ * benchmark_height_;
3166
- align_buffer_page_end(src_pixels, kPixels * 3);
3167
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3168
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3169
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3170
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3171
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3172
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3173
- align_buffer_page_end(dst_pixels_c, kPixels * 3);
3174
- align_buffer_page_end(dst_pixels_opt, kPixels * 3);
3175
-
3176
- MemRandomize(src_pixels, kPixels * 3);
3177
- MemRandomize(tmp_pixels_c_r, kPixels);
3178
- MemRandomize(tmp_pixels_opt_r, kPixels);
3179
- MemRandomize(tmp_pixels_c_g, kPixels);
3180
- MemRandomize(tmp_pixels_opt_g, kPixels);
3181
- MemRandomize(tmp_pixels_c_b, kPixels);
3182
- MemRandomize(tmp_pixels_opt_b, kPixels);
3183
- MemRandomize(dst_pixels_c, kPixels * 3);
3184
- MemRandomize(dst_pixels_opt, kPixels * 3);
3185
-
3186
- MaskCpuFlags(disable_cpu_flags_);
3187
- SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_c_r,
3188
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3189
- tmp_pixels_c_b, benchmark_width_, benchmark_width_,
3190
- benchmark_height_);
3191
- MergeRGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3192
- benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3193
- dst_pixels_c, benchmark_width_ * 3, benchmark_width_,
3194
- benchmark_height_);
3195
- MaskCpuFlags(benchmark_cpu_info_);
3196
-
3197
- SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_opt_r,
3198
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3199
- tmp_pixels_opt_b, benchmark_width_, benchmark_width_,
3200
- benchmark_height_);
3201
-
3202
- for (int i = 0; i < benchmark_iterations_; ++i) {
3203
- MergeRGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3204
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3205
- dst_pixels_opt, benchmark_width_ * 3, benchmark_width_,
3206
- benchmark_height_);
3207
- }
3208
-
3209
- for (int i = 0; i < kPixels * 3; ++i) {
3210
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3211
- }
3212
-
3213
- free_aligned_buffer_page_end(src_pixels);
3214
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3215
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3216
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3217
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3218
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3219
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3220
- free_aligned_buffer_page_end(dst_pixels_c);
3221
- free_aligned_buffer_page_end(dst_pixels_opt);
3222
- }
3223
-
3224
- TEST_F(LibYUVPlanarTest, SplitRGBPlane_Opt) {
3225
- // Round count up to multiple of 16
3226
- const int kPixels = benchmark_width_ * benchmark_height_;
3227
- align_buffer_page_end(src_pixels, kPixels * 3);
3228
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3229
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3230
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3231
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3232
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3233
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3234
- align_buffer_page_end(dst_pixels_c, kPixels * 3);
3235
- align_buffer_page_end(dst_pixels_opt, kPixels * 3);
3236
-
3237
- MemRandomize(src_pixels, kPixels * 3);
3238
- MemRandomize(tmp_pixels_c_r, kPixels);
3239
- MemRandomize(tmp_pixels_opt_r, kPixels);
3240
- MemRandomize(tmp_pixels_c_g, kPixels);
3241
- MemRandomize(tmp_pixels_opt_g, kPixels);
3242
- MemRandomize(tmp_pixels_c_b, kPixels);
3243
- MemRandomize(tmp_pixels_opt_b, kPixels);
3244
- MemRandomize(dst_pixels_c, kPixels * 3);
3245
- MemRandomize(dst_pixels_opt, kPixels * 3);
3246
-
3247
- MaskCpuFlags(disable_cpu_flags_);
3248
- SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_c_r,
3249
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3250
- tmp_pixels_c_b, benchmark_width_, benchmark_width_,
3251
- benchmark_height_);
3252
- MergeRGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3253
- benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3254
- dst_pixels_c, benchmark_width_ * 3, benchmark_width_,
3255
- benchmark_height_);
3256
- MaskCpuFlags(benchmark_cpu_info_);
3257
-
3258
- for (int i = 0; i < benchmark_iterations_; ++i) {
3259
- SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_opt_r,
3260
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3261
- tmp_pixels_opt_b, benchmark_width_, benchmark_width_,
3262
- benchmark_height_);
3263
- }
3264
- MergeRGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3265
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3266
- dst_pixels_opt, benchmark_width_ * 3, benchmark_width_,
3267
- benchmark_height_);
3268
-
3269
- for (int i = 0; i < kPixels * 3; ++i) {
3270
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3271
- }
3272
-
3273
- free_aligned_buffer_page_end(src_pixels);
3274
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3275
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3276
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3277
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3278
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3279
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3280
- free_aligned_buffer_page_end(dst_pixels_c);
3281
- free_aligned_buffer_page_end(dst_pixels_opt);
3282
- }
3283
-
3284
- TEST_F(LibYUVPlanarTest, MergeARGBPlane_Opt) {
3285
- const int kPixels = benchmark_width_ * benchmark_height_;
3286
- align_buffer_page_end(src_pixels, kPixels * 4);
3287
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3288
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3289
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3290
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3291
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3292
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3293
- align_buffer_page_end(tmp_pixels_c_a, kPixels);
3294
- align_buffer_page_end(tmp_pixels_opt_a, kPixels);
3295
- align_buffer_page_end(dst_pixels_c, kPixels * 4);
3296
- align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3297
-
3298
- MemRandomize(src_pixels, kPixels * 4);
3299
- MemRandomize(tmp_pixels_c_r, kPixels);
3300
- MemRandomize(tmp_pixels_opt_r, kPixels);
3301
- MemRandomize(tmp_pixels_c_g, kPixels);
3302
- MemRandomize(tmp_pixels_opt_g, kPixels);
3303
- MemRandomize(tmp_pixels_c_b, kPixels);
3304
- MemRandomize(tmp_pixels_opt_b, kPixels);
3305
- MemRandomize(tmp_pixels_c_a, kPixels);
3306
- MemRandomize(tmp_pixels_opt_a, kPixels);
3307
- MemRandomize(dst_pixels_opt, kPixels * 4);
3308
- MemRandomize(dst_pixels_c, kPixels * 4);
3309
-
3310
- MaskCpuFlags(disable_cpu_flags_);
3311
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3312
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3313
- tmp_pixels_c_b, benchmark_width_, tmp_pixels_c_a,
3314
- benchmark_width_, benchmark_width_, benchmark_height_);
3315
- MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3316
- benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3317
- tmp_pixels_c_a, benchmark_width_, dst_pixels_c,
3318
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3319
-
3320
- MaskCpuFlags(benchmark_cpu_info_);
3321
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3322
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3323
- tmp_pixels_opt_b, benchmark_width_, tmp_pixels_opt_a,
3324
- benchmark_width_, benchmark_width_, benchmark_height_);
3325
-
3326
- for (int i = 0; i < benchmark_iterations_; ++i) {
3327
- MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3328
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3329
- tmp_pixels_opt_a, benchmark_width_, dst_pixels_opt,
3330
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3331
- }
3332
-
3333
- for (int i = 0; i < kPixels * 4; ++i) {
3334
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3335
- }
3336
-
3337
- free_aligned_buffer_page_end(src_pixels);
3338
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3339
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3340
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3341
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3342
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3343
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3344
- free_aligned_buffer_page_end(tmp_pixels_c_a);
3345
- free_aligned_buffer_page_end(tmp_pixels_opt_a);
3346
- free_aligned_buffer_page_end(dst_pixels_opt);
3347
- free_aligned_buffer_page_end(dst_pixels_c);
3348
- }
3349
-
3350
- TEST_F(LibYUVPlanarTest, SplitARGBPlane_Opt) {
3351
- const int kPixels = benchmark_width_ * benchmark_height_;
3352
- align_buffer_page_end(src_pixels, kPixels * 4);
3353
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3354
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3355
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3356
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3357
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3358
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3359
- align_buffer_page_end(tmp_pixels_c_a, kPixels);
3360
- align_buffer_page_end(tmp_pixels_opt_a, kPixels);
3361
- align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3362
- align_buffer_page_end(dst_pixels_c, kPixels * 4);
3363
-
3364
- MemRandomize(src_pixels, kPixels * 4);
3365
- MemRandomize(tmp_pixels_c_r, kPixels);
3366
- MemRandomize(tmp_pixels_opt_r, kPixels);
3367
- MemRandomize(tmp_pixels_c_g, kPixels);
3368
- MemRandomize(tmp_pixels_opt_g, kPixels);
3369
- MemRandomize(tmp_pixels_c_b, kPixels);
3370
- MemRandomize(tmp_pixels_opt_b, kPixels);
3371
- MemRandomize(tmp_pixels_c_a, kPixels);
3372
- MemRandomize(tmp_pixels_opt_a, kPixels);
3373
- MemRandomize(dst_pixels_opt, kPixels * 4);
3374
- MemRandomize(dst_pixels_c, kPixels * 4);
3375
-
3376
- MaskCpuFlags(disable_cpu_flags_);
3377
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3378
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3379
- tmp_pixels_c_b, benchmark_width_, tmp_pixels_c_a,
3380
- benchmark_width_, benchmark_width_, benchmark_height_);
3381
- MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3382
- benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3383
- tmp_pixels_c_a, benchmark_width_, dst_pixels_c,
3384
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3385
-
3386
- MaskCpuFlags(benchmark_cpu_info_);
3387
- for (int i = 0; i < benchmark_iterations_; ++i) {
3388
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3389
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3390
- tmp_pixels_opt_b, benchmark_width_, tmp_pixels_opt_a,
3391
- benchmark_width_, benchmark_width_, benchmark_height_);
3392
- }
3393
-
3394
- MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3395
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3396
- tmp_pixels_opt_a, benchmark_width_, dst_pixels_opt,
3397
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3398
-
3399
- for (int i = 0; i < kPixels * 4; ++i) {
3400
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3401
- }
3402
-
3403
- free_aligned_buffer_page_end(src_pixels);
3404
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3405
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3406
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3407
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3408
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3409
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3410
- free_aligned_buffer_page_end(tmp_pixels_c_a);
3411
- free_aligned_buffer_page_end(tmp_pixels_opt_a);
3412
- free_aligned_buffer_page_end(dst_pixels_c);
3413
- free_aligned_buffer_page_end(dst_pixels_opt);
3414
- }
3415
-
3416
- TEST_F(LibYUVPlanarTest, MergeXRGBPlane_Opt) {
3417
- const int kPixels = benchmark_width_ * benchmark_height_;
3418
- align_buffer_page_end(src_pixels, kPixels * 4);
3419
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3420
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3421
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3422
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3423
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3424
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3425
- align_buffer_page_end(dst_pixels_c, kPixels * 4);
3426
- align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3427
-
3428
- MemRandomize(src_pixels, kPixels * 4);
3429
- MemRandomize(tmp_pixels_c_r, kPixels);
3430
- MemRandomize(tmp_pixels_opt_r, kPixels);
3431
- MemRandomize(tmp_pixels_c_g, kPixels);
3432
- MemRandomize(tmp_pixels_opt_g, kPixels);
3433
- MemRandomize(tmp_pixels_c_b, kPixels);
3434
- MemRandomize(tmp_pixels_opt_b, kPixels);
3435
- MemRandomize(dst_pixels_c, kPixels * 4);
3436
- MemRandomize(dst_pixels_opt, kPixels * 4);
3437
-
3438
- MaskCpuFlags(disable_cpu_flags_);
3439
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3440
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3441
- tmp_pixels_c_b, benchmark_width_, NULL, 0, benchmark_width_,
3442
- benchmark_height_);
3443
- MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3444
- benchmark_width_, tmp_pixels_c_b, benchmark_width_, NULL, 0,
3445
- dst_pixels_c, benchmark_width_ * 4, benchmark_width_,
3446
- benchmark_height_);
3447
-
3448
- MaskCpuFlags(benchmark_cpu_info_);
3449
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3450
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3451
- tmp_pixels_opt_b, benchmark_width_, NULL, 0, benchmark_width_,
3452
- benchmark_height_);
3453
-
3454
- for (int i = 0; i < benchmark_iterations_; ++i) {
3455
- MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3456
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_, NULL,
3457
- 0, dst_pixels_opt, benchmark_width_ * 4, benchmark_width_,
3458
- benchmark_height_);
3459
- }
3460
-
3461
- for (int i = 0; i < kPixels * 4; ++i) {
3462
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3463
- }
3464
-
3465
- free_aligned_buffer_page_end(src_pixels);
3466
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3467
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3468
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3469
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3470
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3471
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3472
- free_aligned_buffer_page_end(dst_pixels_c);
3473
- free_aligned_buffer_page_end(dst_pixels_opt);
3474
- }
3475
-
3476
- TEST_F(LibYUVPlanarTest, SplitXRGBPlane_Opt) {
3477
- const int kPixels = benchmark_width_ * benchmark_height_;
3478
- align_buffer_page_end(src_pixels, kPixels * 4);
3479
- align_buffer_page_end(tmp_pixels_c_r, kPixels);
3480
- align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3481
- align_buffer_page_end(tmp_pixels_c_g, kPixels);
3482
- align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3483
- align_buffer_page_end(tmp_pixels_c_b, kPixels);
3484
- align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3485
- align_buffer_page_end(dst_pixels_c, kPixels * 4);
3486
- align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3487
-
3488
- MemRandomize(src_pixels, kPixels * 4);
3489
- MemRandomize(tmp_pixels_c_r, kPixels);
3490
- MemRandomize(tmp_pixels_opt_r, kPixels);
3491
- MemRandomize(tmp_pixels_c_g, kPixels);
3492
- MemRandomize(tmp_pixels_opt_g, kPixels);
3493
- MemRandomize(tmp_pixels_c_b, kPixels);
3494
- MemRandomize(tmp_pixels_opt_b, kPixels);
3495
- MemRandomize(dst_pixels_c, kPixels * 4);
3496
- MemRandomize(dst_pixels_opt, kPixels * 4);
3497
-
3498
- MaskCpuFlags(disable_cpu_flags_);
3499
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3500
- benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3501
- tmp_pixels_c_b, benchmark_width_, NULL, 0, benchmark_width_,
3502
- benchmark_height_);
3503
- MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3504
- benchmark_width_, tmp_pixels_c_b, benchmark_width_, NULL, 0,
3505
- dst_pixels_c, benchmark_width_ * 4, benchmark_width_,
3506
- benchmark_height_);
3507
-
3508
- MaskCpuFlags(benchmark_cpu_info_);
3509
- for (int i = 0; i < benchmark_iterations_; ++i) {
3510
- SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3511
- benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3512
- tmp_pixels_opt_b, benchmark_width_, NULL, 0,
3513
- benchmark_width_, benchmark_height_);
3514
- }
3515
-
3516
- MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3517
- benchmark_width_, tmp_pixels_opt_b, benchmark_width_, NULL, 0,
3518
- dst_pixels_opt, benchmark_width_ * 4, benchmark_width_,
3519
- benchmark_height_);
3520
-
3521
- for (int i = 0; i < kPixels * 4; ++i) {
3522
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3523
- }
3524
-
3525
- free_aligned_buffer_page_end(src_pixels);
3526
- free_aligned_buffer_page_end(tmp_pixels_c_r);
3527
- free_aligned_buffer_page_end(tmp_pixels_opt_r);
3528
- free_aligned_buffer_page_end(tmp_pixels_c_g);
3529
- free_aligned_buffer_page_end(tmp_pixels_opt_g);
3530
- free_aligned_buffer_page_end(tmp_pixels_c_b);
3531
- free_aligned_buffer_page_end(tmp_pixels_opt_b);
3532
- free_aligned_buffer_page_end(dst_pixels_c);
3533
- free_aligned_buffer_page_end(dst_pixels_opt);
3534
- }
3535
-
3536
- // Merge 4 channels
3537
- #define TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3538
- TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \
3539
- const int kWidth = W1280; \
3540
- const int kPixels = kWidth * benchmark_height_; \
3541
- align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3542
- align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3543
- align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3544
- align_buffer_page_end(src_memory_a, kPixels * sizeof(STYPE) + OFF); \
3545
- align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3546
- align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3547
- MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3548
- MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3549
- MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3550
- MemRandomize(src_memory_a, kPixels * sizeof(STYPE) + OFF); \
3551
- memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \
3552
- memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \
3553
- STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3554
- STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3555
- STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3556
- STYPE* src_pixels_a = reinterpret_cast<STYPE*>(src_memory_a + OFF); \
3557
- DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3558
- DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3559
- MaskCpuFlags(disable_cpu_flags_); \
3560
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3561
- kWidth, src_pixels_a, kWidth, dst_pixels_c, kWidth * 4, \
3562
- kWidth, NEG benchmark_height_, DEPTH); \
3563
- MaskCpuFlags(benchmark_cpu_info_); \
3564
- for (int i = 0; i < benchmark_iterations_; ++i) { \
3565
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3566
- kWidth, src_pixels_a, kWidth, dst_pixels_opt, kWidth * 4, \
3567
- kWidth, NEG benchmark_height_, DEPTH); \
3568
- } \
3569
- for (int i = 0; i < kPixels * 4; ++i) { \
3570
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3571
- } \
3572
- free_aligned_buffer_page_end(src_memory_r); \
3573
- free_aligned_buffer_page_end(src_memory_g); \
3574
- free_aligned_buffer_page_end(src_memory_b); \
3575
- free_aligned_buffer_page_end(src_memory_a); \
3576
- free_aligned_buffer_page_end(dst_memory_c); \
3577
- free_aligned_buffer_page_end(dst_memory_opt); \
3578
- }
3579
-
3580
- // Merge 3 channel RGB into 4 channel XRGB with opaque alpha
3581
- #define TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3582
- TEST_F(LibYUVPlanarTest, FUNC##Plane_Opaque_##DEPTH##N) { \
3583
- const int kWidth = W1280; \
3584
- const int kPixels = kWidth * benchmark_height_; \
3585
- align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3586
- align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3587
- align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3588
- align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3589
- align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3590
- MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3591
- MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3592
- MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3593
- memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \
3594
- memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \
3595
- STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3596
- STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3597
- STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3598
- DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3599
- DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3600
- MaskCpuFlags(disable_cpu_flags_); \
3601
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3602
- kWidth, NULL, 0, dst_pixels_c, kWidth * 4, kWidth, \
3603
- NEG benchmark_height_, DEPTH); \
3604
- MaskCpuFlags(benchmark_cpu_info_); \
3605
- for (int i = 0; i < benchmark_iterations_; ++i) { \
3606
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3607
- kWidth, NULL, 0, dst_pixels_opt, kWidth * 4, kWidth, \
3608
- NEG benchmark_height_, DEPTH); \
3609
- } \
3610
- for (int i = 0; i < kPixels * 4; ++i) { \
3611
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3612
- } \
3613
- free_aligned_buffer_page_end(src_memory_r); \
3614
- free_aligned_buffer_page_end(src_memory_g); \
3615
- free_aligned_buffer_page_end(src_memory_b); \
3616
- free_aligned_buffer_page_end(dst_memory_c); \
3617
- free_aligned_buffer_page_end(dst_memory_opt); \
3618
- }
3619
-
3620
- #define TESTQPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \
3621
- TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \
3622
- TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3623
- 2) \
3624
- TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3625
- TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0) \
3626
- TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, \
3627
- 0) \
3628
- TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3629
- 2) \
3630
- TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3631
- TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0)
3632
-
3633
- TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 10)
3634
- TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 12)
3635
- TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 16)
3636
- TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 10)
3637
- TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 12)
3638
- TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 16)
3639
-
3640
- #define TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3641
- TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \
3642
- const int kWidth = W1280; \
3643
- const int kPixels = kWidth * benchmark_height_; \
3644
- align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3645
- align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3646
- align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3647
- align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3648
- align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3649
- MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3650
- MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3651
- MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3652
- STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3653
- STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3654
- STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3655
- DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3656
- DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3657
- memset(dst_pixels_c, 1, kPixels * 4 * sizeof(DTYPE)); \
3658
- memset(dst_pixels_opt, 2, kPixels * 4 * sizeof(DTYPE)); \
3659
- MaskCpuFlags(disable_cpu_flags_); \
3660
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3661
- kWidth, dst_pixels_c, kWidth * 4, kWidth, \
3662
- NEG benchmark_height_, DEPTH); \
3663
- MaskCpuFlags(benchmark_cpu_info_); \
3664
- for (int i = 0; i < benchmark_iterations_; ++i) { \
3665
- FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3666
- kWidth, dst_pixels_opt, kWidth * 4, kWidth, \
3667
- NEG benchmark_height_, DEPTH); \
3668
- } \
3669
- for (int i = 0; i < kPixels * 4; ++i) { \
3670
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3671
- } \
3672
- free_aligned_buffer_page_end(src_memory_r); \
3673
- free_aligned_buffer_page_end(src_memory_g); \
3674
- free_aligned_buffer_page_end(src_memory_b); \
3675
- free_aligned_buffer_page_end(dst_memory_c); \
3676
- free_aligned_buffer_page_end(dst_memory_opt); \
3677
- }
3678
-
3679
- #define TESTTPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \
3680
- TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \
3681
- TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3682
- 2) \
3683
- TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3684
- TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0)
3685
-
3686
- TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 10)
3687
- TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 12)
3688
- TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 16)
3689
-
3690
- // TODO(fbarchard): improve test for platforms and cpu detect
3691
- #ifdef HAS_MERGEUVROW_16_AVX2
3692
- TEST_F(LibYUVPlanarTest, MergeUVRow_16_Opt) {
3693
- // Round count up to multiple of 8
3694
- const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
3695
-
3696
- align_buffer_page_end(src_pixels_u, kPixels * 2);
3697
- align_buffer_page_end(src_pixels_v, kPixels * 2);
3698
- align_buffer_page_end(dst_pixels_uv_opt, kPixels * 2 * 2);
3699
- align_buffer_page_end(dst_pixels_uv_c, kPixels * 2 * 2);
3700
-
3701
- MemRandomize(src_pixels_u, kPixels * 2);
3702
- MemRandomize(src_pixels_v, kPixels * 2);
3703
- memset(dst_pixels_uv_opt, 0, kPixels * 2 * 2);
3704
- memset(dst_pixels_uv_c, 1, kPixels * 2 * 2);
3705
-
3706
- MergeUVRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_u),
3707
- reinterpret_cast<const uint16_t*>(src_pixels_v),
3708
- reinterpret_cast<uint16_t*>(dst_pixels_uv_c), 16, kPixels);
3709
-
3710
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3711
- for (int i = 0; i < benchmark_iterations_; ++i) {
3712
- if (has_avx2) {
3713
- MergeUVRow_16_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_u),
3714
- reinterpret_cast<const uint16_t*>(src_pixels_v),
3715
- reinterpret_cast<uint16_t*>(dst_pixels_uv_opt), 16,
3716
- kPixels);
3717
- } else {
3718
- MergeUVRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_u),
3719
- reinterpret_cast<const uint16_t*>(src_pixels_v),
3720
- reinterpret_cast<uint16_t*>(dst_pixels_uv_opt), 16,
3721
- kPixels);
3722
- }
3723
- }
3724
-
3725
- for (int i = 0; i < kPixels * 2 * 2; ++i) {
3726
- EXPECT_EQ(dst_pixels_uv_opt[i], dst_pixels_uv_c[i]);
3727
- }
3728
-
3729
- free_aligned_buffer_page_end(src_pixels_u);
3730
- free_aligned_buffer_page_end(src_pixels_v);
3731
- free_aligned_buffer_page_end(dst_pixels_uv_opt);
3732
- free_aligned_buffer_page_end(dst_pixels_uv_c);
3733
- }
3734
- #endif
3735
-
3736
- // TODO(fbarchard): Improve test for more platforms.
3737
- #ifdef HAS_MULTIPLYROW_16_AVX2
3738
- TEST_F(LibYUVPlanarTest, MultiplyRow_16_Opt) {
3739
- // Round count up to multiple of 32
3740
- const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
3741
-
3742
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3743
- align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
3744
- align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
3745
-
3746
- MemRandomize(src_pixels_y, kPixels * 2);
3747
- memset(dst_pixels_y_opt, 0, kPixels * 2);
3748
- memset(dst_pixels_y_c, 1, kPixels * 2);
3749
-
3750
- MultiplyRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3751
- reinterpret_cast<uint16_t*>(dst_pixels_y_c), 64, kPixels);
3752
-
3753
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3754
- for (int i = 0; i < benchmark_iterations_; ++i) {
3755
- if (has_avx2) {
3756
- MultiplyRow_16_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_y),
3757
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64,
3758
- kPixels);
3759
- } else {
3760
- MultiplyRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3761
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64,
3762
- kPixels);
3763
- }
3764
- }
3765
-
3766
- for (int i = 0; i < kPixels * 2; ++i) {
3767
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3768
- }
3769
-
3770
- free_aligned_buffer_page_end(src_pixels_y);
3771
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3772
- free_aligned_buffer_page_end(dst_pixels_y_c);
3773
- }
3774
- #endif // HAS_MULTIPLYROW_16_AVX2
3775
-
3776
- TEST_F(LibYUVPlanarTest, Convert16To8Plane) {
3777
- const int kPixels = benchmark_width_ * benchmark_height_;
3778
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3779
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3780
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3781
-
3782
- MemRandomize(src_pixels_y, kPixels * 2);
3783
- memset(dst_pixels_y_opt, 0, kPixels);
3784
- memset(dst_pixels_y_c, 1, kPixels);
3785
-
3786
- MaskCpuFlags(disable_cpu_flags_);
3787
- Convert16To8Plane(reinterpret_cast<const uint16_t*>(src_pixels_y),
3788
- benchmark_width_, dst_pixels_y_c, benchmark_width_, 16384,
3789
- benchmark_width_, benchmark_height_);
3790
- MaskCpuFlags(benchmark_cpu_info_);
3791
-
3792
- for (int i = 0; i < benchmark_iterations_; ++i) {
3793
- Convert16To8Plane(reinterpret_cast<const uint16_t*>(src_pixels_y),
3794
- benchmark_width_, dst_pixels_y_opt, benchmark_width_,
3795
- 16384, benchmark_width_, benchmark_height_);
3796
- }
3797
-
3798
- for (int i = 0; i < kPixels; ++i) {
3799
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3800
- }
3801
-
3802
- free_aligned_buffer_page_end(src_pixels_y);
3803
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3804
- free_aligned_buffer_page_end(dst_pixels_y_c);
3805
- }
3806
-
3807
- TEST_F(LibYUVPlanarTest, Convert8To8Plane) {
3808
- const int kPixels = benchmark_width_ * benchmark_height_;
3809
- align_buffer_page_end(src_pixels_y, kPixels);
3810
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3811
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3812
-
3813
- MemRandomize(src_pixels_y, kPixels);
3814
- memset(dst_pixels_y_opt, 0, kPixels);
3815
- memset(dst_pixels_y_c, 1, kPixels);
3816
-
3817
- MaskCpuFlags(disable_cpu_flags_);
3818
- Convert8To8Plane(src_pixels_y, benchmark_width_, dst_pixels_y_c,
3819
- benchmark_width_, 220, 16, benchmark_width_,
3820
- benchmark_height_);
3821
- MaskCpuFlags(benchmark_cpu_info_);
3822
-
3823
- for (int i = 0; i < benchmark_iterations_; ++i) {
3824
- Convert8To8Plane(src_pixels_y, benchmark_width_, dst_pixels_y_opt,
3825
- benchmark_width_, 220, 16, benchmark_width_,
3826
- benchmark_height_);
3827
- }
3828
-
3829
- for (int i = 0; i < kPixels; ++i) {
3830
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3831
- }
3832
-
3833
- free_aligned_buffer_page_end(src_pixels_y);
3834
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3835
- free_aligned_buffer_page_end(dst_pixels_y_c);
3836
- }
3837
-
3838
- TEST_F(LibYUVPlanarTest, YUY2ToY) {
3839
- const int kPixels = benchmark_width_ * benchmark_height_;
3840
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3841
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3842
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3843
-
3844
- MemRandomize(src_pixels_y, kPixels * 2);
3845
- memset(dst_pixels_y_opt, 0, kPixels);
3846
- memset(dst_pixels_y_c, 1, kPixels);
3847
-
3848
- MaskCpuFlags(disable_cpu_flags_);
3849
- YUY2ToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_c, benchmark_width_,
3850
- benchmark_width_, benchmark_height_);
3851
- MaskCpuFlags(benchmark_cpu_info_);
3852
-
3853
- for (int i = 0; i < benchmark_iterations_; ++i) {
3854
- YUY2ToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_opt,
3855
- benchmark_width_, benchmark_width_, benchmark_height_);
3856
- }
3857
-
3858
- for (int i = 0; i < kPixels; ++i) {
3859
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3860
- }
3861
-
3862
- free_aligned_buffer_page_end(src_pixels_y);
3863
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3864
- free_aligned_buffer_page_end(dst_pixels_y_c);
3865
- }
3866
-
3867
- TEST_F(LibYUVPlanarTest, UYVYToY) {
3868
- const int kPixels = benchmark_width_ * benchmark_height_;
3869
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3870
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3871
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3872
-
3873
- MemRandomize(src_pixels_y, kPixels * 2);
3874
- memset(dst_pixels_y_opt, 0, kPixels);
3875
- memset(dst_pixels_y_c, 1, kPixels);
3876
-
3877
- MaskCpuFlags(disable_cpu_flags_);
3878
- UYVYToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_c, benchmark_width_,
3879
- benchmark_width_, benchmark_height_);
3880
- MaskCpuFlags(benchmark_cpu_info_);
3881
-
3882
- for (int i = 0; i < benchmark_iterations_; ++i) {
3883
- UYVYToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_opt,
3884
- benchmark_width_, benchmark_width_, benchmark_height_);
3885
- }
3886
-
3887
- for (int i = 0; i < kPixels; ++i) {
3888
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3889
- }
3890
-
3891
- free_aligned_buffer_page_end(src_pixels_y);
3892
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3893
- free_aligned_buffer_page_end(dst_pixels_y_c);
3894
- }
3895
-
3896
- #ifdef ENABLE_ROW_TESTS
3897
- // TODO(fbarchard): Improve test for more platforms.
3898
- #ifdef HAS_CONVERT16TO8ROW_AVX2
3899
- TEST_F(LibYUVPlanarTest, Convert16To8Row_Opt) {
3900
- // AVX2 does multiple of 32, so round count up
3901
- const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
3902
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3903
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3904
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3905
-
3906
- MemRandomize(src_pixels_y, kPixels * 2);
3907
- // clamp source range to 10 bits.
3908
- for (int i = 0; i < kPixels; ++i) {
3909
- reinterpret_cast<uint16_t*>(src_pixels_y)[i] &= 1023;
3910
- }
3911
-
3912
- memset(dst_pixels_y_opt, 0, kPixels);
3913
- memset(dst_pixels_y_c, 1, kPixels);
3914
-
3915
- Convert16To8Row_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3916
- dst_pixels_y_c, 16384, kPixels);
3917
-
3918
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3919
- int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
3920
- for (int i = 0; i < benchmark_iterations_; ++i) {
3921
- if (has_avx2) {
3922
- Convert16To8Row_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_y),
3923
- dst_pixels_y_opt, 16384, kPixels);
3924
- } else if (has_ssse3) {
3925
- Convert16To8Row_SSSE3(reinterpret_cast<const uint16_t*>(src_pixels_y),
3926
- dst_pixels_y_opt, 16384, kPixels);
3927
- } else {
3928
- Convert16To8Row_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3929
- dst_pixels_y_opt, 16384, kPixels);
3930
- }
3931
- }
3932
-
3933
- for (int i = 0; i < kPixels; ++i) {
3934
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3935
- }
3936
-
3937
- free_aligned_buffer_page_end(src_pixels_y);
3938
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3939
- free_aligned_buffer_page_end(dst_pixels_y_c);
3940
- }
3941
- #endif // HAS_CONVERT16TO8ROW_AVX2
3942
-
3943
- #ifdef HAS_UYVYTOYROW_NEON
3944
- TEST_F(LibYUVPlanarTest, UYVYToYRow_Opt) {
3945
- // NEON does multiple of 16, so round count up
3946
- const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15;
3947
- align_buffer_page_end(src_pixels_y, kPixels * 2);
3948
- align_buffer_page_end(dst_pixels_y_opt, kPixels);
3949
- align_buffer_page_end(dst_pixels_y_c, kPixels);
3950
-
3951
- MemRandomize(src_pixels_y, kPixels * 2);
3952
- memset(dst_pixels_y_opt, 0, kPixels);
3953
- memset(dst_pixels_y_c, 1, kPixels);
3954
-
3955
- UYVYToYRow_C(src_pixels_y, dst_pixels_y_c, kPixels);
3956
-
3957
- for (int i = 0; i < benchmark_iterations_; ++i) {
3958
- UYVYToYRow_NEON(src_pixels_y, dst_pixels_y_opt, kPixels);
3959
- }
3960
-
3961
- for (int i = 0; i < kPixels; ++i) {
3962
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3963
- }
3964
-
3965
- free_aligned_buffer_page_end(src_pixels_y);
3966
- free_aligned_buffer_page_end(dst_pixels_y_opt);
3967
- free_aligned_buffer_page_end(dst_pixels_y_c);
3968
- }
3969
- #endif // HAS_UYVYTOYROW_NEON
3970
-
3971
- #endif // ENABLE_ROW_TESTS
3972
-
3973
- TEST_F(LibYUVPlanarTest, Convert8To16Plane) {
3974
- const int kPixels = benchmark_width_ * benchmark_height_;
3975
- align_buffer_page_end(src_pixels_y, kPixels);
3976
- align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
3977
- align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
3978
-
3979
- MemRandomize(src_pixels_y, kPixels);
3980
- memset(dst_pixels_y_opt, 0, kPixels * 2);
3981
- memset(dst_pixels_y_c, 1, kPixels * 2);
3982
-
3983
- MaskCpuFlags(disable_cpu_flags_);
3984
- Convert8To16Plane(src_pixels_y, benchmark_width_,
3985
- reinterpret_cast<uint16_t*>(dst_pixels_y_c),
3986
- benchmark_width_, 1024, benchmark_width_,
3987
- benchmark_height_);
3988
- MaskCpuFlags(benchmark_cpu_info_);
3989
-
3990
- for (int i = 0; i < benchmark_iterations_; ++i) {
3991
- Convert8To16Plane(src_pixels_y, benchmark_width_,
3992
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt),
3993
- benchmark_width_, 1024, benchmark_width_,
3994
- benchmark_height_);
3995
- }
3996
-
3997
- for (int i = 0; i < kPixels * 2; ++i) {
3998
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3999
- }
4000
-
4001
- free_aligned_buffer_page_end(src_pixels_y);
4002
- free_aligned_buffer_page_end(dst_pixels_y_opt);
4003
- free_aligned_buffer_page_end(dst_pixels_y_c);
4004
- }
4005
-
4006
- #ifdef ENABLE_ROW_TESTS
4007
- // TODO(fbarchard): Improve test for more platforms.
4008
- #ifdef HAS_CONVERT8TO16ROW_AVX2
4009
- TEST_F(LibYUVPlanarTest, Convert8To16Row_Opt) {
4010
- const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
4011
- align_buffer_page_end(src_pixels_y, kPixels);
4012
- align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
4013
- align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
4014
-
4015
- MemRandomize(src_pixels_y, kPixels);
4016
- memset(dst_pixels_y_opt, 0, kPixels * 2);
4017
- memset(dst_pixels_y_c, 1, kPixels * 2);
4018
-
4019
- Convert8To16Row_C(src_pixels_y, reinterpret_cast<uint16_t*>(dst_pixels_y_c),
4020
- 1024, kPixels);
4021
-
4022
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
4023
- int has_sse2 = TestCpuFlag(kCpuHasSSE2);
4024
- for (int i = 0; i < benchmark_iterations_; ++i) {
4025
- if (has_avx2) {
4026
- Convert8To16Row_AVX2(src_pixels_y,
4027
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4028
- kPixels);
4029
- } else if (has_sse2) {
4030
- Convert8To16Row_SSE2(src_pixels_y,
4031
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4032
- kPixels);
4033
- } else {
4034
- Convert8To16Row_C(src_pixels_y,
4035
- reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4036
- kPixels);
4037
- }
4038
- }
4039
-
4040
- for (int i = 0; i < kPixels * 2; ++i) {
4041
- EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
4042
- }
4043
-
4044
- free_aligned_buffer_page_end(src_pixels_y);
4045
- free_aligned_buffer_page_end(dst_pixels_y_opt);
4046
- free_aligned_buffer_page_end(dst_pixels_y_c);
4047
- }
4048
- #endif // HAS_CONVERT8TO16ROW_AVX2
4049
-
4050
- float TestScaleMaxSamples(int benchmark_width,
4051
- int benchmark_height,
4052
- int benchmark_iterations,
4053
- float scale,
4054
- bool opt) {
4055
- int i, j;
4056
- float max_c, max_opt = 0.f;
4057
- // NEON does multiple of 8, so round count up
4058
- const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4059
- align_buffer_page_end(orig_y, kPixels * 4 * 3 + 48);
4060
- uint8_t* dst_c = orig_y + kPixels * 4 + 16;
4061
- uint8_t* dst_opt = orig_y + kPixels * 4 * 2 + 32;
4062
-
4063
- // Randomize works but may contain some denormals affecting performance.
4064
- // MemRandomize(orig_y, kPixels * 4);
4065
- // large values are problematic. audio is really -1 to 1.
4066
- for (i = 0; i < kPixels; ++i) {
4067
- (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4068
- }
4069
- memset(dst_c, 0, kPixels * 4);
4070
- memset(dst_opt, 1, kPixels * 4);
4071
-
4072
- max_c = ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4073
- reinterpret_cast<float*>(dst_c), scale, kPixels);
4074
-
4075
- for (j = 0; j < benchmark_iterations; j++) {
4076
- if (opt) {
4077
- #ifdef HAS_SCALESUMSAMPLES_NEON
4078
- max_opt = ScaleMaxSamples_NEON(reinterpret_cast<float*>(orig_y),
4079
- reinterpret_cast<float*>(dst_opt), scale,
4080
- kPixels);
4081
- #else
4082
- max_opt =
4083
- ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4084
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4085
- #endif
4086
- } else {
4087
- max_opt =
4088
- ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4089
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4090
- }
4091
- }
4092
-
4093
- float max_diff = FAbs(max_opt - max_c);
4094
- for (i = 0; i < kPixels; ++i) {
4095
- float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4096
- (reinterpret_cast<float*>(dst_opt)[i]));
4097
- if (abs_diff > max_diff) {
4098
- max_diff = abs_diff;
4099
- }
4100
- }
4101
-
4102
- free_aligned_buffer_page_end(orig_y);
4103
- return max_diff;
4104
- }
4105
-
4106
- TEST_F(LibYUVPlanarTest, TestScaleMaxSamples_C) {
4107
- float diff = TestScaleMaxSamples(benchmark_width_, benchmark_height_,
4108
- benchmark_iterations_, 1.2f, false);
4109
- EXPECT_EQ(0, diff);
4110
- }
4111
-
4112
- TEST_F(LibYUVPlanarTest, TestScaleMaxSamples_Opt) {
4113
- float diff = TestScaleMaxSamples(benchmark_width_, benchmark_height_,
4114
- benchmark_iterations_, 1.2f, true);
4115
- EXPECT_EQ(0, diff);
4116
- }
4117
-
4118
- float TestScaleSumSamples(int benchmark_width,
4119
- int benchmark_height,
4120
- int benchmark_iterations,
4121
- float scale,
4122
- bool opt) {
4123
- int i, j;
4124
- float sum_c, sum_opt = 0.f;
4125
- // NEON does multiple of 8, so round count up
4126
- const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4127
- align_buffer_page_end(orig_y, kPixels * 4 * 3);
4128
- uint8_t* dst_c = orig_y + kPixels * 4;
4129
- uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4130
-
4131
- // Randomize works but may contain some denormals affecting performance.
4132
- // MemRandomize(orig_y, kPixels * 4);
4133
- // large values are problematic. audio is really -1 to 1.
4134
- for (i = 0; i < kPixels; ++i) {
4135
- (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4136
- }
4137
- memset(dst_c, 0, kPixels * 4);
4138
- memset(dst_opt, 1, kPixels * 4);
4139
-
4140
- sum_c = ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4141
- reinterpret_cast<float*>(dst_c), scale, kPixels);
4142
-
4143
- for (j = 0; j < benchmark_iterations; j++) {
4144
- if (opt) {
4145
- #ifdef HAS_SCALESUMSAMPLES_NEON
4146
- sum_opt = ScaleSumSamples_NEON(reinterpret_cast<float*>(orig_y),
4147
- reinterpret_cast<float*>(dst_opt), scale,
4148
- kPixels);
4149
- #else
4150
- sum_opt =
4151
- ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4152
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4153
- #endif
4154
- } else {
4155
- sum_opt =
4156
- ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4157
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4158
- }
4159
- }
4160
-
4161
- float mse_opt = sum_opt / kPixels * 4;
4162
- float mse_c = sum_c / kPixels * 4;
4163
- float mse_error = FAbs(mse_opt - mse_c) / mse_c;
4164
-
4165
- // If the sum of a float is more than 4 million, small adds are round down on
4166
- // float and produce different results with vectorized sum vs scalar sum.
4167
- // Ignore the difference if the sum is large.
4168
- float max_diff = 0.f;
4169
- if (mse_error > 0.0001 && sum_c < 4000000) { // allow .01% difference of mse
4170
- max_diff = mse_error;
4171
- }
4172
-
4173
- for (i = 0; i < kPixels; ++i) {
4174
- float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4175
- (reinterpret_cast<float*>(dst_opt)[i]));
4176
- if (abs_diff > max_diff) {
4177
- max_diff = abs_diff;
4178
- }
4179
- }
4180
-
4181
- free_aligned_buffer_page_end(orig_y);
4182
- return max_diff;
4183
- }
4184
-
4185
- TEST_F(LibYUVPlanarTest, TestScaleSumSamples_C) {
4186
- float diff = TestScaleSumSamples(benchmark_width_, benchmark_height_,
4187
- benchmark_iterations_, 1.2f, false);
4188
- EXPECT_EQ(0, diff);
4189
- }
4190
-
4191
- TEST_F(LibYUVPlanarTest, TestScaleSumSamples_Opt) {
4192
- float diff = TestScaleSumSamples(benchmark_width_, benchmark_height_,
4193
- benchmark_iterations_, 1.2f, true);
4194
- EXPECT_EQ(0, diff);
4195
- }
4196
-
4197
- float TestScaleSamples(int benchmark_width,
4198
- int benchmark_height,
4199
- int benchmark_iterations,
4200
- float scale,
4201
- bool opt) {
4202
- int i, j;
4203
- // NEON does multiple of 8, so round count up
4204
- const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4205
- align_buffer_page_end(orig_y, kPixels * 4 * 3);
4206
- uint8_t* dst_c = orig_y + kPixels * 4;
4207
- uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4208
-
4209
- // Randomize works but may contain some denormals affecting performance.
4210
- // MemRandomize(orig_y, kPixels * 4);
4211
- // large values are problematic. audio is really -1 to 1.
4212
- for (i = 0; i < kPixels; ++i) {
4213
- (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4214
- }
4215
- memset(dst_c, 0, kPixels * 4);
4216
- memset(dst_opt, 1, kPixels * 4);
4217
-
4218
- ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4219
- reinterpret_cast<float*>(dst_c), scale, kPixels);
4220
-
4221
- for (j = 0; j < benchmark_iterations; j++) {
4222
- if (opt) {
4223
- #ifdef HAS_SCALESUMSAMPLES_NEON
4224
- ScaleSamples_NEON(reinterpret_cast<float*>(orig_y),
4225
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4226
- #else
4227
- ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4228
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4229
- #endif
4230
- } else {
4231
- ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4232
- reinterpret_cast<float*>(dst_opt), scale, kPixels);
4233
- }
4234
- }
4235
-
4236
- float max_diff = 0.f;
4237
- for (i = 0; i < kPixels; ++i) {
4238
- float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4239
- (reinterpret_cast<float*>(dst_opt)[i]));
4240
- if (abs_diff > max_diff) {
4241
- max_diff = abs_diff;
4242
- }
4243
- }
4244
-
4245
- free_aligned_buffer_page_end(orig_y);
4246
- return max_diff;
4247
- }
4248
-
4249
- TEST_F(LibYUVPlanarTest, TestScaleSamples_C) {
4250
- float diff = TestScaleSamples(benchmark_width_, benchmark_height_,
4251
- benchmark_iterations_, 1.2f, false);
4252
- EXPECT_EQ(0, diff);
4253
- }
4254
-
4255
- TEST_F(LibYUVPlanarTest, TestScaleSamples_Opt) {
4256
- float diff = TestScaleSamples(benchmark_width_, benchmark_height_,
4257
- benchmark_iterations_, 1.2f, true);
4258
- EXPECT_EQ(0, diff);
4259
- }
4260
-
4261
- float TestCopySamples(int benchmark_width,
4262
- int benchmark_height,
4263
- int benchmark_iterations,
4264
- bool opt) {
4265
- int i, j;
4266
- // NEON does multiple of 16 floats, so round count up
4267
- const int kPixels = (benchmark_width * benchmark_height + 15) & ~15;
4268
- align_buffer_page_end(orig_y, kPixels * 4 * 3);
4269
- uint8_t* dst_c = orig_y + kPixels * 4;
4270
- uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4271
-
4272
- // Randomize works but may contain some denormals affecting performance.
4273
- // MemRandomize(orig_y, kPixels * 4);
4274
- // large values are problematic. audio is really -1 to 1.
4275
- for (i = 0; i < kPixels; ++i) {
4276
- (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4277
- }
4278
- memset(dst_c, 0, kPixels * 4);
4279
- memset(dst_opt, 1, kPixels * 4);
4280
-
4281
- memcpy(reinterpret_cast<void*>(dst_c), reinterpret_cast<void*>(orig_y),
4282
- kPixels * 4);
4283
-
4284
- for (j = 0; j < benchmark_iterations; j++) {
4285
- if (opt) {
4286
- #ifdef HAS_COPYROW_NEON
4287
- CopyRow_NEON(orig_y, dst_opt, kPixels * 4);
4288
- #else
4289
- CopyRow_C(orig_y, dst_opt, kPixels * 4);
4290
- #endif
4291
- } else {
4292
- CopyRow_C(orig_y, dst_opt, kPixels * 4);
4293
- }
4294
- }
4295
-
4296
- float max_diff = 0.f;
4297
- for (i = 0; i < kPixels; ++i) {
4298
- float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4299
- (reinterpret_cast<float*>(dst_opt)[i]));
4300
- if (abs_diff > max_diff) {
4301
- max_diff = abs_diff;
4302
- }
4303
- }
4304
-
4305
- free_aligned_buffer_page_end(orig_y);
4306
- return max_diff;
4307
- }
4308
-
4309
- TEST_F(LibYUVPlanarTest, TestCopySamples_C) {
4310
- float diff = TestCopySamples(benchmark_width_, benchmark_height_,
4311
- benchmark_iterations_, false);
4312
- EXPECT_EQ(0, diff);
4313
- }
4314
-
4315
- TEST_F(LibYUVPlanarTest, TestCopySamples_Opt) {
4316
- float diff = TestCopySamples(benchmark_width_, benchmark_height_,
4317
- benchmark_iterations_, true);
4318
- EXPECT_EQ(0, diff);
4319
- }
4320
-
4321
- extern "C" void GaussRow_NEON(const uint32_t* src, uint16_t* dst, int width);
4322
- extern "C" void GaussRow_C(const uint32_t* src, uint16_t* dst, int width);
4323
-
4324
- TEST_F(LibYUVPlanarTest, TestGaussRow_Opt) {
4325
- SIMD_ALIGNED(uint32_t orig_pixels[1280 + 8]);
4326
- SIMD_ALIGNED(uint16_t dst_pixels_c[1280]);
4327
- SIMD_ALIGNED(uint16_t dst_pixels_opt[1280]);
4328
-
4329
- memset(orig_pixels, 0, sizeof(orig_pixels));
4330
- memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4331
- memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4332
-
4333
- for (int i = 0; i < 1280 + 8; ++i) {
4334
- orig_pixels[i] = i * 256;
4335
- }
4336
- GaussRow_C(&orig_pixels[0], &dst_pixels_c[0], 1280);
4337
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4338
- #if !defined(LIBYUV_DISABLE_NEON) && \
4339
- (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON))
4340
- int has_neon = TestCpuFlag(kCpuHasNEON);
4341
- if (has_neon) {
4342
- GaussRow_NEON(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4343
- } else {
4344
- GaussRow_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4345
- }
4346
- #else
4347
- GaussRow_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4348
- #endif
4349
- }
4350
-
4351
- for (int i = 0; i < 1280; ++i) {
4352
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4353
- }
4354
-
4355
- EXPECT_EQ(dst_pixels_c[0],
4356
- static_cast<uint16_t>(0 * 1 + 1 * 4 + 2 * 6 + 3 * 4 + 4 * 1));
4357
- EXPECT_EQ(dst_pixels_c[639], static_cast<uint16_t>(10256));
4358
- }
4359
-
4360
- extern "C" void GaussCol_NEON(const uint16_t* src0,
4361
- const uint16_t* src1,
4362
- const uint16_t* src2,
4363
- const uint16_t* src3,
4364
- const uint16_t* src4,
4365
- uint32_t* dst,
4366
- int width);
4367
-
4368
- extern "C" void GaussCol_C(const uint16_t* src0,
4369
- const uint16_t* src1,
4370
- const uint16_t* src2,
4371
- const uint16_t* src3,
4372
- const uint16_t* src4,
4373
- uint32_t* dst,
4374
- int width);
4375
-
4376
- TEST_F(LibYUVPlanarTest, TestGaussCol_Opt) {
4377
- SIMD_ALIGNED(uint16_t orig_pixels[1280 * 5]);
4378
- SIMD_ALIGNED(uint32_t dst_pixels_c[1280]);
4379
- SIMD_ALIGNED(uint32_t dst_pixels_opt[1280]);
4380
-
4381
- memset(orig_pixels, 0, sizeof(orig_pixels));
4382
- memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4383
- memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4384
-
4385
- for (int i = 0; i < 1280 * 5; ++i) {
4386
- orig_pixels[i] = static_cast<float>(i);
4387
- }
4388
- GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4389
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4], &dst_pixels_c[0],
4390
- 1280);
4391
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4392
- #if !defined(LIBYUV_DISABLE_NEON) && \
4393
- (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON))
4394
- int has_neon = TestCpuFlag(kCpuHasNEON);
4395
- if (has_neon) {
4396
- GaussCol_NEON(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4397
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4398
- &dst_pixels_opt[0], 1280);
4399
- } else {
4400
- GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4401
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4402
- &dst_pixels_opt[0], 1280);
4403
- }
4404
- #else
4405
- GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4406
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4407
- &dst_pixels_opt[0], 1280);
4408
- #endif
4409
- }
4410
-
4411
- for (int i = 0; i < 1280; ++i) {
4412
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4413
- }
4414
- }
4415
-
4416
- TEST_F(LibYUVPlanarTest, TestGaussRow_F32_Opt) {
4417
- SIMD_ALIGNED(float orig_pixels[1280 + 4]);
4418
- SIMD_ALIGNED(float dst_pixels_c[1280]);
4419
- SIMD_ALIGNED(float dst_pixels_opt[1280]);
4420
-
4421
- memset(orig_pixels, 0, sizeof(orig_pixels));
4422
- memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4423
- memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4424
-
4425
- for (int i = 0; i < 1280 + 4; ++i) {
4426
- orig_pixels[i] = static_cast<float>(i);
4427
- }
4428
- GaussRow_F32_C(&orig_pixels[0], &dst_pixels_c[0], 1280);
4429
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4430
- #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
4431
- int has_neon = TestCpuFlag(kCpuHasNEON);
4432
- if (has_neon) {
4433
- GaussRow_F32_NEON(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4434
- } else {
4435
- GaussRow_F32_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4436
- }
4437
- #else
4438
- GaussRow_F32_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4439
- #endif
4440
- }
4441
-
4442
- for (int i = 0; i < 1280; ++i) {
4443
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4444
- }
4445
- }
4446
-
4447
- TEST_F(LibYUVPlanarTest, TestGaussCol_F32_Opt) {
4448
- SIMD_ALIGNED(float dst_pixels_c[1280]);
4449
- SIMD_ALIGNED(float dst_pixels_opt[1280]);
4450
- align_buffer_page_end(orig_pixels_buf, 1280 * 5 * 4); // 5 rows
4451
- float* orig_pixels = reinterpret_cast<float*>(orig_pixels_buf);
4452
-
4453
- memset(orig_pixels, 0, 1280 * 5 * 4);
4454
- memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4455
- memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4456
-
4457
- for (int i = 0; i < 1280 * 5; ++i) {
4458
- orig_pixels[i] = static_cast<float>(i);
4459
- }
4460
- GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4461
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4462
- &dst_pixels_c[0], 1280);
4463
- for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4464
- #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
4465
- int has_neon = TestCpuFlag(kCpuHasNEON);
4466
- if (has_neon) {
4467
- GaussCol_F32_NEON(&orig_pixels[0], &orig_pixels[1280],
4468
- &orig_pixels[1280 * 2], &orig_pixels[1280 * 3],
4469
- &orig_pixels[1280 * 4], &dst_pixels_opt[0], 1280);
4470
- } else {
4471
- GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280],
4472
- &orig_pixels[1280 * 2], &orig_pixels[1280 * 3],
4473
- &orig_pixels[1280 * 4], &dst_pixels_opt[0], 1280);
4474
- }
4475
- #else
4476
- GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4477
- &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4478
- &dst_pixels_opt[0], 1280);
4479
- #endif
4480
- }
4481
-
4482
- for (int i = 0; i < 1280; ++i) {
4483
- EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4484
- }
4485
- free_aligned_buffer_page_end(orig_pixels_buf);
4486
- }
4487
-
4488
- TEST_F(LibYUVPlanarTest, SwapUVRow) {
4489
- const int kPixels = benchmark_width_ * benchmark_height_;
4490
- void (*SwapUVRow)(const uint8_t* src_uv, uint8_t* dst_vu, int width) =
4491
- SwapUVRow_C;
4492
-
4493
- align_buffer_page_end(src_pixels_vu, kPixels * 2);
4494
- align_buffer_page_end(dst_pixels_uv, kPixels * 2);
4495
- MemRandomize(src_pixels_vu, kPixels * 2);
4496
- memset(dst_pixels_uv, 1, kPixels * 2);
4497
-
4498
- #if defined(HAS_SWAPUVROW_NEON)
4499
- if (TestCpuFlag(kCpuHasNEON)) {
4500
- SwapUVRow = SwapUVRow_Any_NEON;
4501
- if (IS_ALIGNED(kPixels, 16)) {
4502
- SwapUVRow = SwapUVRow_NEON;
4503
- }
4504
- }
4505
- #endif
4506
-
4507
- for (int j = 0; j < benchmark_iterations_; j++) {
4508
- SwapUVRow(src_pixels_vu, dst_pixels_uv, kPixels);
4509
- }
4510
- for (int i = 0; i < kPixels; ++i) {
4511
- EXPECT_EQ(dst_pixels_uv[i * 2 + 0], src_pixels_vu[i * 2 + 1]);
4512
- EXPECT_EQ(dst_pixels_uv[i * 2 + 1], src_pixels_vu[i * 2 + 0]);
4513
- }
4514
-
4515
- free_aligned_buffer_page_end(src_pixels_vu);
4516
- free_aligned_buffer_page_end(dst_pixels_uv);
4517
- }
4518
- #endif // ENABLE_ROW_TESTS
4519
-
4520
- TEST_F(LibYUVPlanarTest, TestGaussPlane_F32) {
4521
- const int kSize = benchmark_width_ * benchmark_height_ * 4;
4522
- align_buffer_page_end(orig_pixels, kSize);
4523
- align_buffer_page_end(dst_pixels_opt, kSize);
4524
- align_buffer_page_end(dst_pixels_c, kSize);
4525
-
4526
- for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4527
- ((float*)(orig_pixels))[i] = (i & 1023) * 3.14f;
4528
- }
4529
- memset(dst_pixels_opt, 1, kSize);
4530
- memset(dst_pixels_c, 2, kSize);
4531
-
4532
- MaskCpuFlags(disable_cpu_flags_);
4533
- GaussPlane_F32((const float*)(orig_pixels), benchmark_width_,
4534
- (float*)(dst_pixels_c), benchmark_width_, benchmark_width_,
4535
- benchmark_height_);
4536
- MaskCpuFlags(benchmark_cpu_info_);
4537
-
4538
- for (int i = 0; i < benchmark_iterations_; ++i) {
4539
- GaussPlane_F32((const float*)(orig_pixels), benchmark_width_,
4540
- (float*)(dst_pixels_opt), benchmark_width_, benchmark_width_,
4541
- benchmark_height_);
4542
- }
4543
- for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4544
- EXPECT_NEAR(((float*)(dst_pixels_c))[i], ((float*)(dst_pixels_opt))[i], 1.f)
4545
- << i;
4546
- }
4547
-
4548
- free_aligned_buffer_page_end(dst_pixels_c);
4549
- free_aligned_buffer_page_end(dst_pixels_opt);
4550
- free_aligned_buffer_page_end(orig_pixels);
4551
- }
4552
-
4553
- TEST_F(LibYUVPlanarTest, HalfMergeUVPlane_Opt) {
4554
- int dst_width = (benchmark_width_ + 1) / 2;
4555
- int dst_height = (benchmark_height_ + 1) / 2;
4556
- align_buffer_page_end(src_pixels_u, benchmark_width_ * benchmark_height_);
4557
- align_buffer_page_end(src_pixels_v, benchmark_width_ * benchmark_height_);
4558
- align_buffer_page_end(dst_pixels_uv_opt, dst_width * 2 * dst_height);
4559
- align_buffer_page_end(dst_pixels_uv_c, dst_width * 2 * dst_height);
4560
-
4561
- MemRandomize(src_pixels_u, benchmark_width_ * benchmark_height_);
4562
- MemRandomize(src_pixels_v, benchmark_width_ * benchmark_height_);
4563
- MemRandomize(dst_pixels_uv_opt, dst_width * 2 * dst_height);
4564
- MemRandomize(dst_pixels_uv_c, dst_width * 2 * dst_height);
4565
-
4566
- MaskCpuFlags(disable_cpu_flags_);
4567
- HalfMergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v,
4568
- benchmark_width_, dst_pixels_uv_c, dst_width * 2,
4569
- benchmark_width_, benchmark_height_);
4570
- MaskCpuFlags(benchmark_cpu_info_);
4571
-
4572
- for (int i = 0; i < benchmark_iterations_; ++i) {
4573
- HalfMergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v,
4574
- benchmark_width_, dst_pixels_uv_opt, dst_width * 2,
4575
- benchmark_width_, benchmark_height_);
4576
- }
4577
-
4578
- for (int i = 0; i < dst_width * 2 * dst_height; ++i) {
4579
- EXPECT_EQ(dst_pixels_uv_c[i], dst_pixels_uv_opt[i]);
4580
- }
4581
-
4582
- free_aligned_buffer_page_end(src_pixels_u);
4583
- free_aligned_buffer_page_end(src_pixels_v);
4584
- free_aligned_buffer_page_end(dst_pixels_uv_opt);
4585
- free_aligned_buffer_page_end(dst_pixels_uv_c);
4586
- }
4587
-
4588
- TEST_F(LibYUVPlanarTest, NV12Copy) {
4589
- const int halfwidth = (benchmark_width_ + 1) >> 1;
4590
- const int halfheight = (benchmark_height_ + 1) >> 1;
4591
- align_buffer_page_end(src_y, benchmark_width_ * benchmark_height_);
4592
- align_buffer_page_end(src_uv, halfwidth * 2 * halfheight);
4593
- align_buffer_page_end(dst_y, benchmark_width_ * benchmark_height_);
4594
- align_buffer_page_end(dst_uv, halfwidth * 2 * halfheight);
4595
-
4596
- MemRandomize(src_y, benchmark_width_ * benchmark_height_);
4597
- MemRandomize(src_uv, halfwidth * 2 * halfheight);
4598
- MemRandomize(dst_y, benchmark_width_ * benchmark_height_);
4599
- MemRandomize(dst_uv, halfwidth * 2 * halfheight);
4600
-
4601
- for (int i = 0; i < benchmark_iterations_; ++i) {
4602
- NV12Copy(src_y, benchmark_width_, src_uv, halfwidth * 2, dst_y,
4603
- benchmark_width_, dst_uv, halfwidth * 2, benchmark_width_,
4604
- benchmark_height_);
4605
- }
4606
-
4607
- for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4608
- EXPECT_EQ(src_y[i], dst_y[i]);
4609
- }
4610
- for (int i = 0; i < halfwidth * 2 * halfheight; ++i) {
4611
- EXPECT_EQ(src_uv[i], dst_uv[i]);
4612
- }
4613
-
4614
- free_aligned_buffer_page_end(src_y);
4615
- free_aligned_buffer_page_end(src_uv);
4616
- free_aligned_buffer_page_end(dst_y);
4617
- free_aligned_buffer_page_end(dst_uv);
4618
- }
4619
-
4620
- TEST_F(LibYUVPlanarTest, NV21Copy) {
4621
- const int halfwidth = (benchmark_width_ + 1) >> 1;
4622
- const int halfheight = (benchmark_height_ + 1) >> 1;
4623
- align_buffer_page_end(src_y, benchmark_width_ * benchmark_height_);
4624
- align_buffer_page_end(src_vu, halfwidth * 2 * halfheight);
4625
- align_buffer_page_end(dst_y, benchmark_width_ * benchmark_height_);
4626
- align_buffer_page_end(dst_vu, halfwidth * 2 * halfheight);
4627
-
4628
- MemRandomize(src_y, benchmark_width_ * benchmark_height_);
4629
- MemRandomize(src_vu, halfwidth * 2 * halfheight);
4630
- MemRandomize(dst_y, benchmark_width_ * benchmark_height_);
4631
- MemRandomize(dst_vu, halfwidth * 2 * halfheight);
4632
-
4633
- for (int i = 0; i < benchmark_iterations_; ++i) {
4634
- NV21Copy(src_y, benchmark_width_, src_vu, halfwidth * 2, dst_y,
4635
- benchmark_width_, dst_vu, halfwidth * 2, benchmark_width_,
4636
- benchmark_height_);
4637
- }
4638
-
4639
- for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4640
- EXPECT_EQ(src_y[i], dst_y[i]);
4641
- }
4642
- for (int i = 0; i < halfwidth * 2 * halfheight; ++i) {
4643
- EXPECT_EQ(src_vu[i], dst_vu[i]);
4644
- }
4645
-
4646
- free_aligned_buffer_page_end(src_y);
4647
- free_aligned_buffer_page_end(src_vu);
4648
- free_aligned_buffer_page_end(dst_y);
4649
- free_aligned_buffer_page_end(dst_vu);
4650
- }
4651
-
4652
- #if defined(ENABLE_ROW_TESTS) && !defined(LIBYUV_DISABLE_NEON) && \
4653
- defined(__aarch64__)
4654
-
4655
- TEST_F(LibYUVPlanarTest, TestConvertFP16ToFP32) {
4656
- int i, j;
4657
- const int y_plane_size = benchmark_width_ * benchmark_height_;
4658
-
4659
- align_buffer_page_end(orig_f, y_plane_size * 4);
4660
- align_buffer_page_end(orig_y, y_plane_size * 2);
4661
- align_buffer_page_end(dst_opt, y_plane_size * 4);
4662
- align_buffer_page_end(rec_opt, y_plane_size * 2);
4663
-
4664
- for (i = 0; i < y_plane_size; ++i) {
4665
- ((float*)orig_f)[i] = (float)(i % 10000) * 3.14f;
4666
- }
4667
- memset(orig_y, 1, y_plane_size * 2);
4668
- memset(dst_opt, 2, y_plane_size * 4);
4669
- memset(rec_opt, 3, y_plane_size * 2);
4670
-
4671
- ConvertFP32ToFP16Row_NEON((const float*)orig_f, (uint16_t*)orig_y,
4672
- y_plane_size);
4673
-
4674
- for (j = 0; j < benchmark_iterations_; j++) {
4675
- ConvertFP16ToFP32Row_NEON((const uint16_t*)orig_y, (float*)dst_opt,
4676
- y_plane_size);
4677
- }
4678
-
4679
- ConvertFP32ToFP16Row_NEON((const float*)dst_opt, (uint16_t*)rec_opt,
4680
- y_plane_size);
4681
-
4682
- for (i = 0; i < y_plane_size; ++i) {
4683
- EXPECT_EQ(((const uint16_t*)orig_y)[i], ((const uint16_t*)rec_opt)[i]);
4684
- }
4685
-
4686
- free_aligned_buffer_page_end(orig_f);
4687
- free_aligned_buffer_page_end(orig_y);
4688
- free_aligned_buffer_page_end(dst_opt);
4689
- free_aligned_buffer_page_end(rec_opt);
4690
- }
4691
-
4692
- TEST_F(LibYUVPlanarTest, TestConvertFP16ToFP32Column) {
4693
- int i, j;
4694
- const int y_plane_size = benchmark_width_ * benchmark_height_;
4695
-
4696
- align_buffer_page_end(orig_f, y_plane_size * 4);
4697
- align_buffer_page_end(orig_y, y_plane_size * 2);
4698
- align_buffer_page_end(dst_opt, y_plane_size * 4);
4699
- align_buffer_page_end(rec_opt, y_plane_size * 2);
4700
-
4701
- for (i = 0; i < y_plane_size; ++i) {
4702
- ((float*)orig_f)[i] = (float)(i % 10000) * 3.14f;
4703
- }
4704
- memset(orig_y, 1, y_plane_size * 2);
4705
- memset(dst_opt, 2, y_plane_size * 4);
4706
- memset(rec_opt, 3, y_plane_size * 2);
4707
-
4708
- ConvertFP32ToFP16Row_NEON((const float*)orig_f, (uint16_t*)orig_y,
4709
- y_plane_size);
4710
-
4711
- for (j = 0; j < benchmark_iterations_; j++) {
4712
- ConvertFP16ToFP32Column_NEON((const uint16_t*)orig_y, 1, (float*)dst_opt,
4713
- y_plane_size);
4714
- }
4715
-
4716
- ConvertFP32ToFP16Row_NEON((const float*)dst_opt, (uint16_t*)rec_opt,
4717
- y_plane_size);
4718
-
4719
- for (i = 0; i < y_plane_size; ++i) {
4720
- EXPECT_EQ(((const uint16_t*)orig_y)[i], ((const uint16_t*)rec_opt)[i]);
4721
- }
4722
-
4723
- free_aligned_buffer_page_end(orig_f);
4724
- free_aligned_buffer_page_end(orig_y);
4725
- free_aligned_buffer_page_end(dst_opt);
4726
- free_aligned_buffer_page_end(rec_opt);
4727
- }
4728
-
4729
- #endif // defined(ENABLE_ROW_TESTS) && defined(__aarch64__)
4730
-
4731
- } // namespace libyuv