react-native-vision-camera-spoof-detector 1.1.22 → 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 (201) 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/android/src/main/java/com/faceantispoof/FaceAntiSpoofingAdvanced.kt +83 -0
  5. package/android/src/main/java/com/margelo/nitro/camera/spoofdetector/HybridSpoofDetectorOutput.kt +26 -11
  6. package/package.json +1 -1
  7. package/android/src/main/cpp/CMakeLists.txt +0 -33
  8. package/android/src/main/cpp/FaceAntiSpoofJSI.cpp +0 -142
  9. package/android/src/main/cpp/FastYuvJni.cpp +0 -111
  10. package/android/src/main/cpp/fast_yuv.cpp +0 -342
  11. package/android/src/main/cpp/fast_yuv.h +0 -23
  12. package/android/src/main/cpp/libyuv/.clang-format +0 -6
  13. package/android/src/main/cpp/libyuv/.gn +0 -40
  14. package/android/src/main/cpp/libyuv/.vpython3 +0 -410
  15. package/android/src/main/cpp/libyuv/AUTHORS +0 -7
  16. package/android/src/main/cpp/libyuv/Android.bp +0 -202
  17. package/android/src/main/cpp/libyuv/Android.mk +0 -106
  18. package/android/src/main/cpp/libyuv/BUILD.gn +0 -490
  19. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +0 -70
  20. package/android/src/main/cpp/libyuv/CMakeLists.txt +0 -259
  21. package/android/src/main/cpp/libyuv/DEPS +0 -935
  22. package/android/src/main/cpp/libyuv/DIR_METADATA +0 -3
  23. package/android/src/main/cpp/libyuv/LICENSE +0 -29
  24. package/android/src/main/cpp/libyuv/OWNERS +0 -11
  25. package/android/src/main/cpp/libyuv/PATENTS +0 -24
  26. package/android/src/main/cpp/libyuv/PRESUBMIT.py +0 -65
  27. package/android/src/main/cpp/libyuv/README.chromium +0 -11
  28. package/android/src/main/cpp/libyuv/README.md +0 -19
  29. package/android/src/main/cpp/libyuv/build_overrides/build.gni +0 -60
  30. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +0 -19
  31. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +0 -17
  32. package/android/src/main/cpp/libyuv/codereview.settings +0 -5
  33. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +0 -409
  34. package/android/src/main/cpp/libyuv/docs/environment_variables.md +0 -64
  35. package/android/src/main/cpp/libyuv/docs/feature_detection.md +0 -108
  36. package/android/src/main/cpp/libyuv/docs/filtering.md +0 -196
  37. package/android/src/main/cpp/libyuv/docs/formats.md +0 -208
  38. package/android/src/main/cpp/libyuv/docs/getting_started.md +0 -296
  39. package/android/src/main/cpp/libyuv/docs/rotation.md +0 -107
  40. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +0 -29
  41. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +0 -68
  42. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +0 -111
  43. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +0 -112
  44. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +0 -1117
  45. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +0 -2335
  46. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +0 -203
  47. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +0 -394
  48. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +0 -147
  49. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +0 -99
  50. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +0 -1949
  51. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +0 -195
  52. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +0 -1131
  53. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +0 -296
  54. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +0 -37
  55. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +0 -265
  56. package/android/src/main/cpp/libyuv/include/libyuv/row.h +0 -6738
  57. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +0 -2154
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +0 -336
  59. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +0 -76
  60. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +0 -42
  61. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +0 -1726
  62. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +0 -51
  63. package/android/src/main/cpp/libyuv/include/libyuv/version.h +0 -16
  64. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +0 -222
  65. package/android/src/main/cpp/libyuv/include/libyuv.h +0 -33
  66. package/android/src/main/cpp/libyuv/infra/config/OWNERS +0 -3
  67. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +0 -17
  68. package/android/src/main/cpp/libyuv/infra/config/README.md +0 -2
  69. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +0 -6
  70. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +0 -144
  71. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +0 -1185
  72. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +0 -9
  73. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +0 -246
  74. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +0 -385
  75. package/android/src/main/cpp/libyuv/infra/config/main.star +0 -402
  76. package/android/src/main/cpp/libyuv/infra/config/project.cfg +0 -16
  77. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +0 -111
  78. package/android/src/main/cpp/libyuv/libyuv.gni +0 -34
  79. package/android/src/main/cpp/libyuv/libyuv.gyp +0 -149
  80. package/android/src/main/cpp/libyuv/libyuv.gypi +0 -87
  81. package/android/src/main/cpp/libyuv/linux.mk +0 -96
  82. package/android/src/main/cpp/libyuv/public.mk +0 -13
  83. package/android/src/main/cpp/libyuv/pylintrc +0 -49
  84. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +0 -74
  85. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +0 -56
  86. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +0 -15
  87. package/android/src/main/cpp/libyuv/source/compare.cc +0 -435
  88. package/android/src/main/cpp/libyuv/source/compare_common.cc +0 -74
  89. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +0 -362
  90. package/android/src/main/cpp/libyuv/source/compare_neon.cc +0 -96
  91. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +0 -223
  92. package/android/src/main/cpp/libyuv/source/compare_win.cc +0 -241
  93. package/android/src/main/cpp/libyuv/source/convert.cc +0 -4746
  94. package/android/src/main/cpp/libyuv/source/convert_argb.cc +0 -9179
  95. package/android/src/main/cpp/libyuv/source/convert_from.cc +0 -866
  96. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +0 -3671
  97. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +0 -602
  98. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +0 -391
  99. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +0 -288
  100. package/android/src/main/cpp/libyuv/source/cpu_id.cc +0 -496
  101. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +0 -580
  102. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +0 -71
  103. package/android/src/main/cpp/libyuv/source/planar_functions.cc +0 -5663
  104. package/android/src/main/cpp/libyuv/source/rotate.cc +0 -1241
  105. package/android/src/main/cpp/libyuv/source/rotate_any.cc +0 -76
  106. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +0 -259
  107. package/android/src/main/cpp/libyuv/source/rotate_common.cc +0 -208
  108. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +0 -505
  109. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +0 -233
  110. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +0 -219
  111. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +0 -273
  112. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +0 -174
  113. package/android/src/main/cpp/libyuv/source/rotate_win.cc +0 -253
  114. package/android/src/main/cpp/libyuv/source/row_any.cc +0 -2519
  115. package/android/src/main/cpp/libyuv/source/row_common.cc +0 -4461
  116. package/android/src/main/cpp/libyuv/source/row_gcc.cc +0 -9570
  117. package/android/src/main/cpp/libyuv/source/row_lasx.cc +0 -2343
  118. package/android/src/main/cpp/libyuv/source/row_lsx.cc +0 -3030
  119. package/android/src/main/cpp/libyuv/source/row_neon.cc +0 -4026
  120. package/android/src/main/cpp/libyuv/source/row_neon64.cc +0 -5617
  121. package/android/src/main/cpp/libyuv/source/row_rvv.cc +0 -2599
  122. package/android/src/main/cpp/libyuv/source/row_sme.cc +0 -1183
  123. package/android/src/main/cpp/libyuv/source/row_sve.cc +0 -1088
  124. package/android/src/main/cpp/libyuv/source/row_win.cc +0 -6453
  125. package/android/src/main/cpp/libyuv/source/scale.cc +0 -2710
  126. package/android/src/main/cpp/libyuv/source/scale_any.cc +0 -991
  127. package/android/src/main/cpp/libyuv/source/scale_argb.cc +0 -1158
  128. package/android/src/main/cpp/libyuv/source/scale_common.cc +0 -1977
  129. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +0 -2947
  130. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +0 -739
  131. package/android/src/main/cpp/libyuv/source/scale_neon.cc +0 -1449
  132. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +0 -1552
  133. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +0 -82
  134. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +0 -1971
  135. package/android/src/main/cpp/libyuv/source/scale_sme.cc +0 -555
  136. package/android/src/main/cpp/libyuv/source/scale_uv.cc +0 -1159
  137. package/android/src/main/cpp/libyuv/source/scale_win.cc +0 -1392
  138. package/android/src/main/cpp/libyuv/source/test.sh +0 -35
  139. package/android/src/main/cpp/libyuv/source/video_common.cc +0 -62
  140. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +0 -4
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +0 -931
  142. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +0 -164
  143. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +0 -21
  144. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +0 -13
  145. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +0 -13
  146. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +0 -38
  147. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +0 -3
  148. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +0 -9
  149. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +0 -3
  150. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +0 -15
  151. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +0 -25
  152. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +0 -43
  153. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +0 -848
  154. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +0 -739
  155. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +0 -2867
  156. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +0 -2133
  157. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +0 -427
  158. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +0 -63
  159. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +0 -160
  160. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +0 -4731
  161. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +0 -334
  162. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +0 -962
  163. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +0 -590
  164. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +0 -465
  165. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +0 -280
  166. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +0 -1135
  167. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +0 -249
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +0 -12
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +0 -7
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +0 -5
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +0 -10
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +0 -7
  173. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +0 -4
  174. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +0 -4
  175. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +0 -4
  176. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +0 -23
  177. package/android/src/main/cpp/libyuv/unit_test/testdata/test0.jpg +0 -0
  178. package/android/src/main/cpp/libyuv/unit_test/testdata/test1.jpg +0 -0
  179. package/android/src/main/cpp/libyuv/unit_test/testdata/test2.jpg +0 -0
  180. package/android/src/main/cpp/libyuv/unit_test/testdata/test3.jpg +0 -0
  181. package/android/src/main/cpp/libyuv/unit_test/testdata/test4.jpg +0 -0
  182. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +0 -581
  183. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +0 -232
  184. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +0 -112
  185. package/android/src/main/cpp/libyuv/util/Makefile +0 -9
  186. package/android/src/main/cpp/libyuv/util/color.cc +0 -120
  187. package/android/src/main/cpp/libyuv/util/compare.cc +0 -67
  188. package/android/src/main/cpp/libyuv/util/cpuid.c +0 -211
  189. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +0 -28
  190. package/android/src/main/cpp/libyuv/util/psnr.cc +0 -291
  191. package/android/src/main/cpp/libyuv/util/psnr.h +0 -47
  192. package/android/src/main/cpp/libyuv/util/psnr_main.cc +0 -620
  193. package/android/src/main/cpp/libyuv/util/ssim.cc +0 -364
  194. package/android/src/main/cpp/libyuv/util/ssim.h +0 -38
  195. package/android/src/main/cpp/libyuv/util/yuvconstants.c +0 -114
  196. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +0 -367
  197. package/android/src/main/cpp/libyuv/winarm.mk +0 -47
  198. package/android/src/main/java/com/faceantispoof/ByteBufferPool.kt +0 -68
  199. package/android/src/main/java/com/faceantispoof/FastYuv.kt +0 -51
  200. package/android/src/main/java/com/faceantispoof/YuvToFloatArrayConverter.kt +0 -584
  201. package/android/src/main/java/com/faceantispoof/YuvToRgbConverter.kt +0 -73
@@ -1,2867 +0,0 @@
1
- /*
2
- * Copyright 2023 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 <assert.h>
12
- #include <stdlib.h>
13
- #include <time.h>
14
-
15
- #include "../unit_test/unit_test.h"
16
- #include "libyuv/basic_types.h"
17
- #include "libyuv/compare.h"
18
- #include "libyuv/convert.h"
19
- #include "libyuv/convert_argb.h"
20
- #include "libyuv/convert_from.h"
21
- #include "libyuv/convert_from_argb.h"
22
- #include "libyuv/cpu_id.h"
23
- #include "libyuv/planar_functions.h"
24
- #include "libyuv/rotate.h"
25
- #include "libyuv/video_common.h"
26
-
27
- #ifdef ENABLE_ROW_TESTS
28
- #include "libyuv/row.h" /* For ARGBToAR30Row_AVX2 */
29
- #endif
30
-
31
- #if defined(__riscv) && !defined(__clang__)
32
- #define DISABLE_SLOW_TESTS
33
- #undef ENABLE_FULL_TESTS
34
- #undef ENABLE_ROW_TESTS
35
- #define LEAN_TESTS
36
- #endif
37
-
38
- // Some functions fail on big endian. Enable these tests on all cpus except
39
- // PowerPC, but they are not optimized so disabled by default.
40
- #if !defined(DISABLE_SLOW_TESTS) && !defined(__powerpc__)
41
- #define LITTLE_ENDIAN_ONLY_TEST 1
42
- #endif
43
- #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
44
- // SLOW TESTS are those that are unoptimized C code.
45
- // FULL TESTS are optimized but test many variations of the same code.
46
- #define ENABLE_FULL_TESTS
47
- #endif
48
-
49
- namespace libyuv {
50
-
51
- // Alias to copy pixels as is
52
- #define AR30ToAR30 ARGBCopy
53
- #define ABGRToABGR ARGBCopy
54
-
55
- // subsample amount uses a divide.
56
- #define SUBSAMPLE(v, a) ((((v) + (a)-1)) / (a))
57
-
58
- #define ALIGNINT(V, ALIGN) (((V) + (ALIGN)-1) / (ALIGN) * (ALIGN))
59
-
60
- #define TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
61
- SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
62
- DST_SUBSAMP_Y, W1280, N, NEG, OFF, SRC_DEPTH, TILE_WIDTH, \
63
- TILE_HEIGHT) \
64
- TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \
65
- static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \
66
- static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \
67
- static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \
68
- "SRC_SUBSAMP_X unsupported"); \
69
- static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \
70
- "SRC_SUBSAMP_Y unsupported"); \
71
- static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \
72
- "DST_SUBSAMP_X unsupported"); \
73
- static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \
74
- "DST_SUBSAMP_Y unsupported"); \
75
- const int kWidth = W1280; \
76
- const int kHeight = benchmark_height_; \
77
- const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \
78
- const int kDstHalfWidth = SUBSAMPLE(kWidth, DST_SUBSAMP_X); \
79
- const int kDstHalfHeight = SUBSAMPLE(kHeight, DST_SUBSAMP_Y); \
80
- const int kPaddedWidth = (kWidth + (TILE_WIDTH - 1)) & ~(TILE_WIDTH - 1); \
81
- const int kPaddedHeight = \
82
- (kHeight + (TILE_HEIGHT - 1)) & ~(TILE_HEIGHT - 1); \
83
- const int kSrcHalfPaddedWidth = SUBSAMPLE(kPaddedWidth, SRC_SUBSAMP_X); \
84
- const int kSrcHalfPaddedHeight = SUBSAMPLE(kPaddedHeight, SRC_SUBSAMP_Y); \
85
- align_buffer_page_end(src_y, kPaddedWidth* kPaddedHeight* SRC_BPC + OFF); \
86
- align_buffer_page_end( \
87
- src_uv, kSrcHalfPaddedWidth* kSrcHalfPaddedHeight* SRC_BPC * 2 + OFF); \
88
- align_buffer_page_end(dst_y_c, kWidth* kHeight* DST_BPC); \
89
- align_buffer_page_end(dst_u_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
90
- align_buffer_page_end(dst_v_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
91
- align_buffer_page_end(dst_y_opt, kWidth* kHeight* DST_BPC); \
92
- align_buffer_page_end(dst_u_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
93
- align_buffer_page_end(dst_v_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
94
- SRC_T* src_y_p = reinterpret_cast<SRC_T*>(src_y + OFF); \
95
- SRC_T* src_uv_p = reinterpret_cast<SRC_T*>(src_uv + OFF); \
96
- for (int i = 0; i < kPaddedWidth * kPaddedHeight; ++i) { \
97
- src_y_p[i] = \
98
- (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \
99
- } \
100
- for (int i = 0; i < kSrcHalfPaddedWidth * kSrcHalfPaddedHeight * 2; ++i) { \
101
- src_uv_p[i] = \
102
- (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \
103
- } \
104
- memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \
105
- memset(dst_u_c, 2, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
106
- memset(dst_v_c, 3, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
107
- memset(dst_y_opt, 101, kWidth* kHeight* DST_BPC); \
108
- memset(dst_u_opt, 102, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
109
- memset(dst_v_opt, 103, kDstHalfWidth* kDstHalfHeight* DST_BPC); \
110
- MaskCpuFlags(disable_cpu_flags_); \
111
- SRC_FMT_PLANAR##To##FMT_PLANAR( \
112
- src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \
113
- reinterpret_cast<DST_T*>(dst_y_c), kWidth, \
114
- reinterpret_cast<DST_T*>(dst_u_c), kDstHalfWidth, \
115
- reinterpret_cast<DST_T*>(dst_v_c), kDstHalfWidth, kWidth, \
116
- NEG kHeight); \
117
- MaskCpuFlags(benchmark_cpu_info_); \
118
- for (int i = 0; i < benchmark_iterations_; ++i) { \
119
- SRC_FMT_PLANAR##To##FMT_PLANAR( \
120
- src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \
121
- reinterpret_cast<DST_T*>(dst_y_opt), kWidth, \
122
- reinterpret_cast<DST_T*>(dst_u_opt), kDstHalfWidth, \
123
- reinterpret_cast<DST_T*>(dst_v_opt), kDstHalfWidth, kWidth, \
124
- NEG kHeight); \
125
- } \
126
- for (int i = 0; i < kHeight * kWidth * DST_BPC; ++i) { \
127
- EXPECT_EQ(dst_y_c[i], dst_y_opt[i]); \
128
- } \
129
- for (int i = 0; i < kDstHalfWidth * kDstHalfHeight * DST_BPC; ++i) { \
130
- EXPECT_EQ(dst_u_c[i], dst_u_opt[i]); \
131
- EXPECT_EQ(dst_v_c[i], dst_v_opt[i]); \
132
- } \
133
- free_aligned_buffer_page_end(dst_y_c); \
134
- free_aligned_buffer_page_end(dst_u_c); \
135
- free_aligned_buffer_page_end(dst_v_c); \
136
- free_aligned_buffer_page_end(dst_y_opt); \
137
- free_aligned_buffer_page_end(dst_u_opt); \
138
- free_aligned_buffer_page_end(dst_v_opt); \
139
- free_aligned_buffer_page_end(src_y); \
140
- free_aligned_buffer_page_end(src_uv); \
141
- }
142
-
143
- #if defined(ENABLE_FULL_TESTS)
144
- #define TESTBPTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
145
- SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
146
- DST_SUBSAMP_Y, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT) \
147
- TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
148
- FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
149
- benchmark_width_ + 1, _Any, +, 0, SRC_DEPTH, TILE_WIDTH, \
150
- TILE_HEIGHT) \
151
- TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
152
- FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
153
- benchmark_width_, _Unaligned, +, 2, SRC_DEPTH, TILE_WIDTH, \
154
- TILE_HEIGHT) \
155
- TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
156
- FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
157
- benchmark_width_, _Invert, -, 0, SRC_DEPTH, TILE_WIDTH, \
158
- TILE_HEIGHT) \
159
- TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
160
- FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
161
- benchmark_width_, _Opt, +, 0, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT)
162
- #else
163
- #define TESTBPTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \
164
- SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \
165
- DST_SUBSAMP_Y, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT) \
166
- TESTBPTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \
167
- FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \
168
- benchmark_width_, _Opt, +, 0, SRC_DEPTH, TILE_WIDTH, TILE_HEIGHT)
169
- #endif
170
-
171
- TESTBPTOP(NV12, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 1, 1)
172
- TESTBPTOP(NV21, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 1, 1)
173
- TESTBPTOP(MM21, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8, 16, 32)
174
- TESTBPTOP(P010, uint16_t, 2, 2, 2, I010, uint16_t, 2, 2, 2, 10, 1, 1)
175
- TESTBPTOP(P012, uint16_t, 2, 2, 2, I012, uint16_t, 2, 2, 2, 12, 1, 1)
176
-
177
- // Provide matrix wrappers for full range bt.709
178
- #define F420ToABGR(a, b, c, d, e, f, g, h, i, j) \
179
- I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
180
- #define F420ToARGB(a, b, c, d, e, f, g, h, i, j) \
181
- I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
182
- #define F422ToABGR(a, b, c, d, e, f, g, h, i, j) \
183
- I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
184
- #define F422ToARGB(a, b, c, d, e, f, g, h, i, j) \
185
- I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
186
- #define F444ToABGR(a, b, c, d, e, f, g, h, i, j) \
187
- I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j)
188
- #define F444ToARGB(a, b, c, d, e, f, g, h, i, j) \
189
- I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j)
190
-
191
- // Provide matrix wrappers for full range bt.2020
192
- #define V420ToABGR(a, b, c, d, e, f, g, h, i, j) \
193
- I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
194
- #define V420ToARGB(a, b, c, d, e, f, g, h, i, j) \
195
- I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
196
- #define V422ToABGR(a, b, c, d, e, f, g, h, i, j) \
197
- I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
198
- #define V422ToARGB(a, b, c, d, e, f, g, h, i, j) \
199
- I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
200
- #define V444ToABGR(a, b, c, d, e, f, g, h, i, j) \
201
- I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j)
202
- #define V444ToARGB(a, b, c, d, e, f, g, h, i, j) \
203
- I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j)
204
-
205
- #define I420ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
206
- I420ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
207
- kFilterBilinear)
208
- #define I422ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
209
- I422ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
210
- kFilterBilinear)
211
- #define I420ToRGB24Filter(a, b, c, d, e, f, g, h, i, j) \
212
- I420ToRGB24MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
213
- kFilterBilinear)
214
- #define I422ToRGB24Filter(a, b, c, d, e, f, g, h, i, j) \
215
- I420ToRGB24MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
216
- kFilterBilinear)
217
-
218
- #define TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
219
- YALIGN, W1280, N, NEG, OFF) \
220
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
221
- const int kWidth = W1280; \
222
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
223
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
224
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
225
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
226
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
227
- align_buffer_page_end(src_u, kSizeUV + OFF); \
228
- align_buffer_page_end(src_v, kSizeUV + OFF); \
229
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
230
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
231
- for (int i = 0; i < kWidth * kHeight; ++i) { \
232
- src_y[i + OFF] = (fastrand() & 0xff); \
233
- } \
234
- for (int i = 0; i < kSizeUV; ++i) { \
235
- src_u[i + OFF] = (fastrand() & 0xff); \
236
- src_v[i + OFF] = (fastrand() & 0xff); \
237
- } \
238
- memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
239
- memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
240
- MaskCpuFlags(disable_cpu_flags_); \
241
- double time0 = get_time(); \
242
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
243
- src_v + OFF, kStrideUV, dst_argb_c + OFF, kStrideB, \
244
- kWidth, NEG kHeight); \
245
- double time1 = get_time(); \
246
- MaskCpuFlags(benchmark_cpu_info_); \
247
- for (int i = 0; i < benchmark_iterations_; ++i) { \
248
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
249
- src_v + OFF, kStrideUV, dst_argb_opt + OFF, \
250
- kStrideB, kWidth, NEG kHeight); \
251
- } \
252
- double time2 = get_time(); \
253
- printf(" %8d us C - %8d us OPT\n", \
254
- static_cast<int>((time1 - time0) * 1e6), \
255
- static_cast<int>((time2 - time1) * 1e6 / benchmark_iterations_)); \
256
- for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
257
- EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
258
- } \
259
- free_aligned_buffer_page_end(src_y); \
260
- free_aligned_buffer_page_end(src_u); \
261
- free_aligned_buffer_page_end(src_v); \
262
- free_aligned_buffer_page_end(dst_argb_c); \
263
- free_aligned_buffer_page_end(dst_argb_opt); \
264
- }
265
-
266
- #if defined(ENABLE_FULL_TESTS)
267
- #define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
268
- YALIGN) \
269
- TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
270
- YALIGN, benchmark_width_ + 1, _Any, +, 0) \
271
- TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
272
- YALIGN, benchmark_width_, _Unaligned, +, 4) \
273
- TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
274
- YALIGN, benchmark_width_, _Invert, -, 0) \
275
- TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
276
- YALIGN, benchmark_width_, _Opt, +, 0)
277
- #else
278
- #define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
279
- YALIGN) \
280
- TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
281
- YALIGN, benchmark_width_, _Opt, +, 0)
282
- #endif
283
-
284
- #if defined(ENABLE_FULL_TESTS)
285
- TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1)
286
- TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
287
- TESTPLANARTOB(J420, 2, 2, ARGB, 4, 4, 1)
288
- TESTPLANARTOB(J420, 2, 2, ABGR, 4, 4, 1)
289
- TESTPLANARTOB(F420, 2, 2, ARGB, 4, 4, 1)
290
- TESTPLANARTOB(F420, 2, 2, ABGR, 4, 4, 1)
291
- TESTPLANARTOB(H420, 2, 2, ARGB, 4, 4, 1)
292
- TESTPLANARTOB(H420, 2, 2, ABGR, 4, 4, 1)
293
- TESTPLANARTOB(U420, 2, 2, ARGB, 4, 4, 1)
294
- TESTPLANARTOB(U420, 2, 2, ABGR, 4, 4, 1)
295
- TESTPLANARTOB(V420, 2, 2, ARGB, 4, 4, 1)
296
- TESTPLANARTOB(V420, 2, 2, ABGR, 4, 4, 1)
297
- TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1)
298
- TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1)
299
- TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
300
- TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
301
- TESTPLANARTOB(J420, 2, 2, RAW, 3, 3, 1)
302
- TESTPLANARTOB(J420, 2, 2, RGB24, 3, 3, 1)
303
- TESTPLANARTOB(H420, 2, 2, RAW, 3, 3, 1)
304
- TESTPLANARTOB(H420, 2, 2, RGB24, 3, 3, 1)
305
- #ifdef LITTLE_ENDIAN_ONLY_TEST
306
- TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
307
- TESTPLANARTOB(J420, 2, 2, RGB565, 2, 2, 1)
308
- TESTPLANARTOB(H420, 2, 2, RGB565, 2, 2, 1)
309
- TESTPLANARTOB(I420, 2, 2, ARGB1555, 2, 2, 1)
310
- TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
311
- TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
312
- #endif
313
- TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
314
- TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
315
- TESTPLANARTOB(J422, 2, 1, ARGB, 4, 4, 1)
316
- TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
317
- TESTPLANARTOB(H422, 2, 1, ARGB, 4, 4, 1)
318
- TESTPLANARTOB(H422, 2, 1, ABGR, 4, 4, 1)
319
- TESTPLANARTOB(U422, 2, 1, ARGB, 4, 4, 1)
320
- TESTPLANARTOB(U422, 2, 1, ABGR, 4, 4, 1)
321
- TESTPLANARTOB(V422, 2, 1, ARGB, 4, 4, 1)
322
- TESTPLANARTOB(V422, 2, 1, ABGR, 4, 4, 1)
323
- TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1)
324
- TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1)
325
- TESTPLANARTOB(I422, 1, 1, RGB24, 3, 3, 1)
326
- TESTPLANARTOB(I422, 1, 1, RAW, 3, 3, 1)
327
- TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1)
328
- TESTPLANARTOB(I444, 1, 1, ABGR, 4, 4, 1)
329
- TESTPLANARTOB(I444, 1, 1, RGB24, 3, 3, 1)
330
- TESTPLANARTOB(I444, 1, 1, RAW, 3, 3, 1)
331
- TESTPLANARTOB(J444, 1, 1, ARGB, 4, 4, 1)
332
- TESTPLANARTOB(J444, 1, 1, ABGR, 4, 4, 1)
333
- TESTPLANARTOB(H444, 1, 1, ARGB, 4, 4, 1)
334
- TESTPLANARTOB(H444, 1, 1, ABGR, 4, 4, 1)
335
- TESTPLANARTOB(U444, 1, 1, ARGB, 4, 4, 1)
336
- TESTPLANARTOB(U444, 1, 1, ABGR, 4, 4, 1)
337
- TESTPLANARTOB(V444, 1, 1, ARGB, 4, 4, 1)
338
- TESTPLANARTOB(V444, 1, 1, ABGR, 4, 4, 1)
339
- TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1)
340
- TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1)
341
- TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
342
- TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1)
343
- TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
344
- TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1)
345
- #ifdef LITTLE_ENDIAN_ONLY_TEST
346
- TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1)
347
- TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1)
348
- TESTPLANARTOB(I420, 2, 2, AB30, 4, 4, 1)
349
- TESTPLANARTOB(H420, 2, 2, AB30, 4, 4, 1)
350
- #endif
351
- TESTPLANARTOB(I420, 2, 2, ARGBFilter, 4, 4, 1)
352
- TESTPLANARTOB(I422, 2, 1, ARGBFilter, 4, 4, 1)
353
- TESTPLANARTOB(I420, 2, 2, RGB24Filter, 3, 3, 1)
354
- TESTPLANARTOB(I422, 2, 2, RGB24Filter, 3, 3, 1)
355
- #else // FULL_TESTS
356
- TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
357
- TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1)
358
- TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1)
359
- TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
360
- TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
361
- TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1)
362
- #ifdef LITTLE_ENDIAN_ONLY_TEST
363
- TESTPLANARTOB(I420, 2, 2, RGB565, 2, 2, 1)
364
- TESTPLANARTOB(I420, 2, 2, ARGB1555, 2, 2, 1)
365
- TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
366
- TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
367
- #endif
368
- TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1)
369
- TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1)
370
- TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1)
371
- TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
372
- TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
373
- TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1)
374
- TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1)
375
- TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1)
376
- TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
377
- TESTPLANARTOB(I420, 2, 2, ARGBFilter, 4, 4, 1)
378
- TESTPLANARTOB(I422, 2, 1, ARGBFilter, 4, 4, 1)
379
- TESTPLANARTOB(I420, 2, 2, RGB24Filter, 3, 3, 1)
380
- TESTPLANARTOB(I444, 1, 1, ABGR, 4, 4, 1)
381
- TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1)
382
- #endif
383
-
384
- #define TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
385
- W1280, N, NEG, OFF) \
386
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
387
- const int kWidth = W1280; \
388
- const int kHeight = benchmark_height_; \
389
- const int kStrideB = kWidth * BPP_B; \
390
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
391
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
392
- align_buffer_page_end(src_uv, \
393
- kStrideUV* SUBSAMPLE(kHeight, SUBSAMP_Y) * 2 + OFF); \
394
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight); \
395
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight); \
396
- for (int i = 0; i < kHeight; ++i) \
397
- for (int j = 0; j < kWidth; ++j) \
398
- src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \
399
- for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \
400
- for (int j = 0; j < kStrideUV * 2; ++j) { \
401
- src_uv[i * kStrideUV * 2 + j + OFF] = (fastrand() & 0xff); \
402
- } \
403
- } \
404
- memset(dst_argb_c, 1, kStrideB* kHeight); \
405
- memset(dst_argb_opt, 101, kStrideB* kHeight); \
406
- MaskCpuFlags(disable_cpu_flags_); \
407
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_uv + OFF, kStrideUV * 2, \
408
- dst_argb_c, kWidth * BPP_B, kWidth, NEG kHeight); \
409
- MaskCpuFlags(benchmark_cpu_info_); \
410
- for (int i = 0; i < benchmark_iterations_; ++i) { \
411
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_uv + OFF, kStrideUV * 2, \
412
- dst_argb_opt, kWidth * BPP_B, kWidth, \
413
- NEG kHeight); \
414
- } \
415
- /* Convert to ARGB so 565 is expanded to bytes that can be compared. */ \
416
- align_buffer_page_end(dst_argb32_c, kWidth * 4 * kHeight); \
417
- align_buffer_page_end(dst_argb32_opt, kWidth * 4 * kHeight); \
418
- memset(dst_argb32_c, 2, kWidth * 4 * kHeight); \
419
- memset(dst_argb32_opt, 102, kWidth * 4 * kHeight); \
420
- FMT_C##ToARGB(dst_argb_c, kStrideB, dst_argb32_c, kWidth * 4, kWidth, \
421
- kHeight); \
422
- FMT_C##ToARGB(dst_argb_opt, kStrideB, dst_argb32_opt, kWidth * 4, kWidth, \
423
- kHeight); \
424
- for (int i = 0; i < kHeight; ++i) { \
425
- for (int j = 0; j < kWidth * 4; ++j) { \
426
- EXPECT_EQ(dst_argb32_c[i * kWidth * 4 + j], \
427
- dst_argb32_opt[i * kWidth * 4 + j]); \
428
- } \
429
- } \
430
- free_aligned_buffer_page_end(src_y); \
431
- free_aligned_buffer_page_end(src_uv); \
432
- free_aligned_buffer_page_end(dst_argb_c); \
433
- free_aligned_buffer_page_end(dst_argb_opt); \
434
- free_aligned_buffer_page_end(dst_argb32_c); \
435
- free_aligned_buffer_page_end(dst_argb32_opt); \
436
- }
437
-
438
- #if defined(ENABLE_FULL_TESTS)
439
- #define TESTBPTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B) \
440
- TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
441
- benchmark_width_ + 1, _Any, +, 0) \
442
- TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
443
- benchmark_width_, _Unaligned, +, 2) \
444
- TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
445
- benchmark_width_, _Invert, -, 0) \
446
- TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
447
- benchmark_width_, _Opt, +, 0)
448
- #else
449
- #define TESTBPTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B) \
450
- TESTBPTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \
451
- benchmark_width_, _Opt, +, 0)
452
- #endif
453
-
454
- #define JNV12ToARGB(a, b, c, d, e, f, g, h) \
455
- NV12ToARGBMatrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
456
- #define JNV21ToARGB(a, b, c, d, e, f, g, h) \
457
- NV21ToARGBMatrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
458
- #define JNV12ToABGR(a, b, c, d, e, f, g, h) \
459
- NV21ToARGBMatrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
460
- #define JNV21ToABGR(a, b, c, d, e, f, g, h) \
461
- NV12ToARGBMatrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
462
- #define JNV12ToRGB24(a, b, c, d, e, f, g, h) \
463
- NV12ToRGB24Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
464
- #define JNV21ToRGB24(a, b, c, d, e, f, g, h) \
465
- NV21ToRGB24Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
466
- #define JNV12ToRAW(a, b, c, d, e, f, g, h) \
467
- NV21ToRGB24Matrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
468
- #define JNV21ToRAW(a, b, c, d, e, f, g, h) \
469
- NV12ToRGB24Matrix(a, b, c, d, e, f, &kYvuJPEGConstants, g, h)
470
- #define JNV12ToRGB565(a, b, c, d, e, f, g, h) \
471
- NV12ToRGB565Matrix(a, b, c, d, e, f, &kYuvJPEGConstants, g, h)
472
-
473
- TESTBPTOB(JNV12, 2, 2, ARGB, ARGB, 4)
474
- TESTBPTOB(JNV21, 2, 2, ARGB, ARGB, 4)
475
- TESTBPTOB(JNV12, 2, 2, ABGR, ABGR, 4)
476
- TESTBPTOB(JNV21, 2, 2, ABGR, ABGR, 4)
477
- TESTBPTOB(JNV12, 2, 2, RGB24, RGB24, 3)
478
- TESTBPTOB(JNV21, 2, 2, RGB24, RGB24, 3)
479
- TESTBPTOB(JNV12, 2, 2, RAW, RAW, 3)
480
- TESTBPTOB(JNV21, 2, 2, RAW, RAW, 3)
481
- #ifdef LITTLE_ENDIAN_ONLY_TEST
482
- TESTBPTOB(JNV12, 2, 2, RGB565, RGB565, 2)
483
- #endif
484
-
485
- TESTBPTOB(NV12, 2, 2, ARGB, ARGB, 4)
486
- TESTBPTOB(NV21, 2, 2, ARGB, ARGB, 4)
487
- TESTBPTOB(NV12, 2, 2, ABGR, ABGR, 4)
488
- TESTBPTOB(NV21, 2, 2, ABGR, ABGR, 4)
489
- TESTBPTOB(NV12, 2, 2, RGB24, RGB24, 3)
490
- TESTBPTOB(NV21, 2, 2, RGB24, RGB24, 3)
491
- TESTBPTOB(NV12, 2, 2, RAW, RAW, 3)
492
- TESTBPTOB(NV21, 2, 2, RAW, RAW, 3)
493
- TESTBPTOB(NV21, 2, 2, YUV24, RAW, 3)
494
- #ifdef LITTLE_ENDIAN_ONLY_TEST
495
- TESTBPTOB(NV12, 2, 2, RGB565, RGB565, 2)
496
- #endif
497
-
498
- #define TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
499
- EPP_B, STRIDE_B, HEIGHT_B, W1280, N, NEG, OFF) \
500
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \
501
- const int kWidth = W1280; \
502
- const int kHeight = benchmark_height_; \
503
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
504
- const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
505
- const int kStrideA = \
506
- (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
507
- const int kStrideB = \
508
- (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
509
- align_buffer_page_end(src_argb, \
510
- kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
511
- align_buffer_page_end(dst_argb_c, kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
512
- align_buffer_page_end(dst_argb_opt, \
513
- kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
514
- for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
515
- src_argb[i + OFF] = (fastrand() & 0xff); \
516
- } \
517
- memset(dst_argb_c, 1, kStrideB* kHeightB); \
518
- memset(dst_argb_opt, 101, kStrideB* kHeightB); \
519
- MaskCpuFlags(disable_cpu_flags_); \
520
- FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_B*)dst_argb_c, \
521
- kStrideB, kWidth, NEG kHeight); \
522
- MaskCpuFlags(benchmark_cpu_info_); \
523
- for (int i = 0; i < benchmark_iterations_; ++i) { \
524
- FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, \
525
- (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
526
- } \
527
- for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
528
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
529
- } \
530
- free_aligned_buffer_page_end(src_argb); \
531
- free_aligned_buffer_page_end(dst_argb_c); \
532
- free_aligned_buffer_page_end(dst_argb_opt); \
533
- }
534
-
535
- #define TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, \
536
- TYPE_B, EPP_B, STRIDE_B, HEIGHT_B) \
537
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##_Random) { \
538
- for (int times = 0; times < benchmark_iterations_; ++times) { \
539
- const int kWidth = (fastrand() & 63) + 1; \
540
- const int kHeight = (fastrand() & 31) + 1; \
541
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
542
- const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
543
- const int kStrideA = \
544
- (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
545
- const int kStrideB = \
546
- (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
547
- align_buffer_page_end(src_argb, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
548
- align_buffer_page_end(dst_argb_c, \
549
- kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
550
- align_buffer_page_end(dst_argb_opt, \
551
- kStrideB* kHeightB*(int)sizeof(TYPE_B)); \
552
- for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
553
- src_argb[i] = 0xfe; \
554
- } \
555
- memset(dst_argb_c, 123, kStrideB* kHeightB); \
556
- memset(dst_argb_opt, 123, kStrideB* kHeightB); \
557
- MaskCpuFlags(disable_cpu_flags_); \
558
- FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_c, \
559
- kStrideB, kWidth, kHeight); \
560
- MaskCpuFlags(benchmark_cpu_info_); \
561
- FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_opt, \
562
- kStrideB, kWidth, kHeight); \
563
- for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
564
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
565
- } \
566
- free_aligned_buffer_page_end(src_argb); \
567
- free_aligned_buffer_page_end(dst_argb_c); \
568
- free_aligned_buffer_page_end(dst_argb_opt); \
569
- } \
570
- }
571
-
572
- #if defined(ENABLE_FULL_TESTS)
573
- #define TESTATOB(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
574
- EPP_B, STRIDE_B, HEIGHT_B) \
575
- TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
576
- STRIDE_B, HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \
577
- TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
578
- STRIDE_B, HEIGHT_B, benchmark_width_, _Unaligned, +, 4) \
579
- TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
580
- STRIDE_B, HEIGHT_B, benchmark_width_, _Invert, -, 0) \
581
- TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
582
- STRIDE_B, HEIGHT_B, benchmark_width_, _Opt, +, 0) \
583
- TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
584
- EPP_B, STRIDE_B, HEIGHT_B)
585
- #else
586
- #define TESTATOB(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
587
- EPP_B, STRIDE_B, HEIGHT_B) \
588
- TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
589
- STRIDE_B, HEIGHT_B, benchmark_width_, _Opt, +, 0)
590
- #endif
591
-
592
- TESTATOB(AB30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
593
- TESTATOB(AB30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
594
- #ifdef LITTLE_ENDIAN_ONLY_TEST
595
- TESTATOB(ABGR, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
596
- #endif
597
- TESTATOB(ABGR, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
598
- #ifdef LITTLE_ENDIAN_ONLY_TEST
599
- TESTATOB(AR30, uint8_t, 4, 4, 1, AB30, uint8_t, 4, 4, 1)
600
- #endif
601
- TESTATOB(AR30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
602
- #ifdef LITTLE_ENDIAN_ONLY_TEST
603
- TESTATOB(AR30, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
604
- TESTATOB(AR30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
605
- #endif
606
- TESTATOB(ARGB, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
607
- #ifdef LITTLE_ENDIAN_ONLY_TEST
608
- TESTATOB(ARGB, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
609
- #endif
610
- TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
611
- TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB1555, uint8_t, 2, 2, 1)
612
- TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB4444, uint8_t, 2, 2, 1)
613
- TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGBMirror, uint8_t, 4, 4, 1)
614
- TESTATOB(ARGB, uint8_t, 4, 4, 1, BGRA, uint8_t, 4, 4, 1)
615
- TESTATOB(ARGB, uint8_t, 4, 4, 1, I400, uint8_t, 1, 1, 1)
616
- TESTATOB(ARGB, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
617
- TESTATOB(ABGR, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
618
- TESTATOB(RGBA, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
619
- TESTATOB(ARGB, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
620
- TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
621
- TESTATOB(ABGR, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
622
- TESTATOB(ABGR, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
623
- #ifdef LITTLE_ENDIAN_ONLY_TEST
624
- TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB565, uint8_t, 2, 2, 1)
625
- #endif
626
- TESTATOB(ARGB, uint8_t, 4, 4, 1, RGBA, uint8_t, 4, 4, 1)
627
- TESTATOB(ARGB, uint8_t, 4, 4, 1, UYVY, uint8_t, 2, 4, 1)
628
- TESTATOB(ARGB, uint8_t, 4, 4, 1, YUY2, uint8_t, 2, 4, 1)
629
- TESTATOB(ARGB1555, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
630
- TESTATOB(ARGB4444, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
631
- TESTATOB(BGRA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
632
- TESTATOB(I400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
633
- TESTATOB(I400, uint8_t, 1, 1, 1, I400, uint8_t, 1, 1, 1)
634
- TESTATOB(I400, uint8_t, 1, 1, 1, I400Mirror, uint8_t, 1, 1, 1)
635
- TESTATOB(J400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
636
- TESTATOB(J400, uint8_t, 1, 1, 1, J400, uint8_t, 1, 1, 1)
637
- TESTATOB(RAW, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
638
- TESTATOB(RAW, uint8_t, 3, 3, 1, RGBA, uint8_t, 4, 4, 1)
639
- TESTATOB(RAW, uint8_t, 3, 3, 1, RGB24, uint8_t, 3, 3, 1)
640
- TESTATOB(RGB24, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
641
- TESTATOB(RGB24, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
642
- TESTATOB(RGB24, uint8_t, 3, 3, 1, RGB24Mirror, uint8_t, 3, 3, 1)
643
- TESTATOB(RAW, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
644
- #ifdef LITTLE_ENDIAN_ONLY_TEST
645
- TESTATOB(RGB565, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
646
- #endif
647
- TESTATOB(RGBA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
648
- TESTATOB(UYVY, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
649
- TESTATOB(YUY2, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
650
- TESTATOB(YUY2, uint8_t, 2, 4, 1, Y, uint8_t, 1, 1, 1)
651
- TESTATOB(ARGB, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
652
- TESTATOB(ARGB, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
653
- TESTATOB(ABGR, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
654
- TESTATOB(ABGR, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
655
- TESTATOB(AR64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
656
- TESTATOB(AB64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
657
- TESTATOB(AR64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
658
- TESTATOB(AB64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
659
- TESTATOB(AR64, uint16_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
660
- TESTATOB(AB64, uint16_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
661
-
662
- // in place test
663
- #define TESTATOAI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
664
- EPP_B, STRIDE_B, HEIGHT_B, W1280, N, NEG, OFF) \
665
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \
666
- const int kWidth = W1280; \
667
- const int kHeight = benchmark_height_; \
668
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
669
- const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
670
- const int kStrideA = \
671
- (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
672
- const int kStrideB = \
673
- (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
674
- align_buffer_page_end(src_argb, \
675
- kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
676
- align_buffer_page_end(dst_argb_c, \
677
- kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
678
- align_buffer_page_end(dst_argb_opt, \
679
- kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
680
- for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
681
- src_argb[i + OFF] = (fastrand() & 0xff); \
682
- } \
683
- memcpy(dst_argb_c + OFF, src_argb, \
684
- kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
685
- memcpy(dst_argb_opt + OFF, src_argb, \
686
- kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
687
- MaskCpuFlags(disable_cpu_flags_); \
688
- FMT_A##To##FMT_B((TYPE_A*)(dst_argb_c /* src */ + OFF), kStrideA, \
689
- (TYPE_B*)dst_argb_c, kStrideB, kWidth, NEG kHeight); \
690
- MaskCpuFlags(benchmark_cpu_info_); \
691
- for (int i = 0; i < benchmark_iterations_; ++i) { \
692
- FMT_A##To##FMT_B((TYPE_A*)(dst_argb_opt /* src */ + OFF), kStrideA, \
693
- (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
694
- } \
695
- memcpy(dst_argb_opt + OFF, src_argb, \
696
- kStrideA * kHeightA * (int)sizeof(TYPE_A)); \
697
- FMT_A##To##FMT_B((TYPE_A*)(dst_argb_opt /* src */ + OFF), kStrideA, \
698
- (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \
699
- for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \
700
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
701
- } \
702
- free_aligned_buffer_page_end(src_argb); \
703
- free_aligned_buffer_page_end(dst_argb_c); \
704
- free_aligned_buffer_page_end(dst_argb_opt); \
705
- }
706
-
707
- #define TESTATOA(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \
708
- EPP_B, STRIDE_B, HEIGHT_B) \
709
- TESTATOAI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \
710
- STRIDE_B, HEIGHT_B, benchmark_width_, _Inplace, +, 0)
711
-
712
- TESTATOA(AB30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
713
- TESTATOA(AB30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
714
- #ifdef LITTLE_ENDIAN_ONLY_TEST
715
- TESTATOA(ABGR, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
716
- #endif
717
- TESTATOA(ABGR, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
718
- #ifdef LITTLE_ENDIAN_ONLY_TEST
719
- TESTATOA(AR30, uint8_t, 4, 4, 1, AB30, uint8_t, 4, 4, 1)
720
- #endif
721
- TESTATOA(AR30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
722
- #ifdef LITTLE_ENDIAN_ONLY_TEST
723
- TESTATOA(AR30, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
724
- TESTATOA(AR30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
725
- #endif
726
- TESTATOA(ARGB, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
727
- #ifdef LITTLE_ENDIAN_ONLY_TEST
728
- TESTATOA(ARGB, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1)
729
- #endif
730
- TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
731
- TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB1555, uint8_t, 2, 2, 1)
732
- TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGB4444, uint8_t, 2, 2, 1)
733
- // TODO(fbarchard): Support in place for mirror.
734
- // TESTATOA(ARGB, uint8_t, 4, 4, 1, ARGBMirror, uint8_t, 4, 4, 1)
735
- TESTATOA(ARGB, uint8_t, 4, 4, 1, BGRA, uint8_t, 4, 4, 1)
736
- TESTATOA(ARGB, uint8_t, 4, 4, 1, I400, uint8_t, 1, 1, 1)
737
- TESTATOA(ARGB, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
738
- TESTATOA(RGBA, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1)
739
- TESTATOA(ARGB, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
740
- TESTATOA(ARGB, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
741
- TESTATOA(ABGR, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1)
742
- TESTATOA(ABGR, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1)
743
- #ifdef LITTLE_ENDIAN_ONLY_TEST
744
- TESTATOA(ARGB, uint8_t, 4, 4, 1, RGB565, uint8_t, 2, 2, 1)
745
- #endif
746
- TESTATOA(ARGB, uint8_t, 4, 4, 1, RGBA, uint8_t, 4, 4, 1)
747
- TESTATOA(ARGB, uint8_t, 4, 4, 1, UYVY, uint8_t, 2, 4, 1)
748
- TESTATOA(ARGB, uint8_t, 4, 4, 1, YUY2, uint8_t, 2, 4, 1)
749
- // TODO(fbarchard): Support in place for conversions that increase bpp.
750
- // TESTATOA(ARGB1555, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
751
- // TESTATOA(ARGB4444, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
752
- TESTATOA(BGRA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
753
- // TESTATOA(I400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
754
- TESTATOA(I400, uint8_t, 1, 1, 1, I400, uint8_t, 1, 1, 1)
755
- // TESTATOA(I400, uint8_t, 1, 1, 1, I400Mirror, uint8_t, 1, 1, 1)
756
- // TESTATOA(J400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1)
757
- TESTATOA(J400, uint8_t, 1, 1, 1, J400, uint8_t, 1, 1, 1)
758
- // TESTATOA(RAW, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
759
- // TESTATOA(RAW, uint8_t, 3, 3, 1, RGBA, uint8_t, 4, 4, 1)
760
- TESTATOA(RAW, uint8_t, 3, 3, 1, RGB24, uint8_t, 3, 3, 1)
761
- // TESTATOA(RGB24, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1)
762
- TESTATOA(RGB24, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
763
- // TESTATOA(RGB24, uint8_t, 3, 3, 1, RGB24Mirror, uint8_t, 3, 3, 1)
764
- TESTATOA(RAW, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1)
765
- #ifdef LITTLE_ENDIAN_ONLY_TEST
766
- // TESTATOA(RGB565, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1)
767
- #endif
768
- TESTATOA(RGBA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
769
- // TESTATOA(UYVY, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
770
- // TESTATOA(YUY2, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1)
771
- TESTATOA(YUY2, uint8_t, 2, 4, 1, Y, uint8_t, 1, 1, 1)
772
- // TESTATOA(ARGB, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
773
- // TESTATOA(ARGB, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
774
- // TESTATOA(ABGR, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
775
- // TESTATOA(ABGR, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
776
- TESTATOA(AR64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
777
- TESTATOA(AB64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1)
778
- TESTATOA(AR64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
779
- TESTATOA(AB64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1)
780
- TESTATOA(AR64, uint16_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1)
781
- TESTATOA(AB64, uint16_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1)
782
-
783
- #define TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
784
- HEIGHT_B, W1280, N, NEG, OFF) \
785
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##Dither##N) { \
786
- const int kWidth = W1280; \
787
- const int kHeight = benchmark_height_; \
788
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
789
- const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
790
- const int kStrideA = \
791
- (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
792
- const int kStrideB = \
793
- (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
794
- align_buffer_page_end(src_argb, kStrideA* kHeightA + OFF); \
795
- align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \
796
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \
797
- for (int i = 0; i < kStrideA * kHeightA; ++i) { \
798
- src_argb[i + OFF] = (fastrand() & 0xff); \
799
- } \
800
- memset(dst_argb_c, 1, kStrideB* kHeightB); \
801
- memset(dst_argb_opt, 101, kStrideB* kHeightB); \
802
- MaskCpuFlags(disable_cpu_flags_); \
803
- FMT_A##To##FMT_B##Dither(src_argb + OFF, kStrideA, dst_argb_c, kStrideB, \
804
- NULL, kWidth, NEG kHeight); \
805
- MaskCpuFlags(benchmark_cpu_info_); \
806
- for (int i = 0; i < benchmark_iterations_; ++i) { \
807
- FMT_A##To##FMT_B##Dither(src_argb + OFF, kStrideA, dst_argb_opt, \
808
- kStrideB, NULL, kWidth, NEG kHeight); \
809
- } \
810
- for (int i = 0; i < kStrideB * kHeightB; ++i) { \
811
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
812
- } \
813
- free_aligned_buffer_page_end(src_argb); \
814
- free_aligned_buffer_page_end(dst_argb_c); \
815
- free_aligned_buffer_page_end(dst_argb_opt); \
816
- }
817
-
818
- #define TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, \
819
- STRIDE_B, HEIGHT_B) \
820
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##Dither_Random) { \
821
- for (int times = 0; times < benchmark_iterations_; ++times) { \
822
- const int kWidth = (fastrand() & 63) + 1; \
823
- const int kHeight = (fastrand() & 31) + 1; \
824
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
825
- const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \
826
- const int kStrideA = \
827
- (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
828
- const int kStrideB = \
829
- (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
830
- align_buffer_page_end(src_argb, kStrideA* kHeightA); \
831
- align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \
832
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \
833
- for (int i = 0; i < kStrideA * kHeightA; ++i) { \
834
- src_argb[i] = (fastrand() & 0xff); \
835
- } \
836
- memset(dst_argb_c, 123, kStrideB* kHeightB); \
837
- memset(dst_argb_opt, 123, kStrideB* kHeightB); \
838
- MaskCpuFlags(disable_cpu_flags_); \
839
- FMT_A##To##FMT_B##Dither(src_argb, kStrideA, dst_argb_c, kStrideB, NULL, \
840
- kWidth, kHeight); \
841
- MaskCpuFlags(benchmark_cpu_info_); \
842
- FMT_A##To##FMT_B##Dither(src_argb, kStrideA, dst_argb_opt, kStrideB, \
843
- NULL, kWidth, kHeight); \
844
- for (int i = 0; i < kStrideB * kHeightB; ++i) { \
845
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
846
- } \
847
- free_aligned_buffer_page_end(src_argb); \
848
- free_aligned_buffer_page_end(dst_argb_c); \
849
- free_aligned_buffer_page_end(dst_argb_opt); \
850
- } \
851
- }
852
-
853
- #if defined(ENABLE_FULL_TESTS)
854
- #define TESTATOBD(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
855
- HEIGHT_B) \
856
- TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
857
- HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \
858
- TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
859
- HEIGHT_B, benchmark_width_, _Unaligned, +, 2) \
860
- TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
861
- HEIGHT_B, benchmark_width_, _Invert, -, 0) \
862
- TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
863
- HEIGHT_B, benchmark_width_, _Opt, +, 0) \
864
- TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
865
- HEIGHT_B)
866
- #else
867
- #define TESTATOBD(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
868
- HEIGHT_B) \
869
- TESTATOBDRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \
870
- HEIGHT_B)
871
- #endif
872
-
873
- #ifdef LITTLE_ENDIAN_ONLY_TEST
874
- TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1)
875
- #endif
876
-
877
- // These conversions called twice, produce the original result.
878
- // e.g. endian swap twice.
879
- #define TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, \
880
- OFF) \
881
- TEST_F(LibYUVConvertTest, FMT_ATOB##_Endswap##N) { \
882
- const int kWidth = W1280; \
883
- const int kHeight = benchmark_height_; \
884
- const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \
885
- const int kStrideA = \
886
- (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
887
- align_buffer_page_end(src_argb, \
888
- kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \
889
- align_buffer_page_end(dst_argb_c, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
890
- align_buffer_page_end(dst_argb_opt, \
891
- kStrideA* kHeightA*(int)sizeof(TYPE_A)); \
892
- for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
893
- src_argb[i + OFF] = (fastrand() & 0xff); \
894
- } \
895
- memset(dst_argb_c, 1, kStrideA* kHeightA); \
896
- memset(dst_argb_opt, 101, kStrideA* kHeightA); \
897
- MaskCpuFlags(disable_cpu_flags_); \
898
- FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_c, \
899
- kStrideA, kWidth, NEG kHeight); \
900
- MaskCpuFlags(benchmark_cpu_info_); \
901
- for (int i = 0; i < benchmark_iterations_; ++i) { \
902
- FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_opt, \
903
- kStrideA, kWidth, NEG kHeight); \
904
- } \
905
- MaskCpuFlags(disable_cpu_flags_); \
906
- FMT_ATOB((TYPE_A*)dst_argb_c, kStrideA, (TYPE_A*)dst_argb_c, kStrideA, \
907
- kWidth, NEG kHeight); \
908
- MaskCpuFlags(benchmark_cpu_info_); \
909
- FMT_ATOB((TYPE_A*)dst_argb_opt, kStrideA, (TYPE_A*)dst_argb_opt, kStrideA, \
910
- kWidth, NEG kHeight); \
911
- for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \
912
- EXPECT_EQ(src_argb[i + OFF], dst_argb_opt[i]); \
913
- EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
914
- } \
915
- free_aligned_buffer_page_end(src_argb); \
916
- free_aligned_buffer_page_end(dst_argb_c); \
917
- free_aligned_buffer_page_end(dst_argb_opt); \
918
- }
919
-
920
- #if defined(ENABLE_FULL_TESTS)
921
- #define TESTEND(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A) \
922
- TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_ + 1, \
923
- _Any, +, 0) \
924
- TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
925
- _Unaligned, +, 2) \
926
- TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
927
- _Opt, +, 0)
928
- #else
929
- #define TESTEND(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A) \
930
- TESTENDI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \
931
- _Opt, +, 0)
932
- #endif
933
-
934
- TESTEND(ARGBToBGRA, uint8_t, 4, 4, 1)
935
- TESTEND(ARGBToABGR, uint8_t, 4, 4, 1)
936
- TESTEND(BGRAToARGB, uint8_t, 4, 4, 1)
937
- TESTEND(ABGRToARGB, uint8_t, 4, 4, 1)
938
- TESTEND(AB64ToAR64, uint16_t, 4, 4, 1)
939
-
940
- #define TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
941
- YALIGN, W1280, N, NEG, OFF, ATTEN) \
942
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
943
- const int kWidth = W1280; \
944
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
945
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
946
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
947
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
948
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
949
- align_buffer_page_end(src_u, kSizeUV + OFF); \
950
- align_buffer_page_end(src_v, kSizeUV + OFF); \
951
- align_buffer_page_end(src_a, kWidth* kHeight + OFF); \
952
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
953
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
954
- for (int i = 0; i < kWidth * kHeight; ++i) { \
955
- src_y[i + OFF] = (fastrand() & 0xff); \
956
- src_a[i + OFF] = (fastrand() & 0xff); \
957
- } \
958
- for (int i = 0; i < kSizeUV; ++i) { \
959
- src_u[i + OFF] = (fastrand() & 0xff); \
960
- src_v[i + OFF] = (fastrand() & 0xff); \
961
- } \
962
- memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
963
- memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
964
- MaskCpuFlags(disable_cpu_flags_); \
965
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
966
- src_v + OFF, kStrideUV, src_a + OFF, kWidth, \
967
- dst_argb_c + OFF, kStrideB, kWidth, NEG kHeight, \
968
- ATTEN); \
969
- MaskCpuFlags(benchmark_cpu_info_); \
970
- for (int i = 0; i < benchmark_iterations_; ++i) { \
971
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
972
- src_v + OFF, kStrideUV, src_a + OFF, kWidth, \
973
- dst_argb_opt + OFF, kStrideB, kWidth, NEG kHeight, \
974
- ATTEN); \
975
- } \
976
- for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
977
- EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
978
- } \
979
- free_aligned_buffer_page_end(src_y); \
980
- free_aligned_buffer_page_end(src_u); \
981
- free_aligned_buffer_page_end(src_v); \
982
- free_aligned_buffer_page_end(src_a); \
983
- free_aligned_buffer_page_end(dst_argb_c); \
984
- free_aligned_buffer_page_end(dst_argb_opt); \
985
- }
986
-
987
- #if defined(ENABLE_FULL_TESTS)
988
- #define TESTQPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
989
- YALIGN) \
990
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
991
- YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \
992
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
993
- YALIGN, benchmark_width_, _Unaligned, +, 2, 0) \
994
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
995
- YALIGN, benchmark_width_, _Invert, -, 0, 0) \
996
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
997
- YALIGN, benchmark_width_, _Opt, +, 0, 0) \
998
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
999
- YALIGN, benchmark_width_, _Premult, +, 0, 1)
1000
- #else
1001
- #define TESTQPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1002
- YALIGN) \
1003
- TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1004
- YALIGN, benchmark_width_, _Opt, +, 0, 0)
1005
- #endif
1006
-
1007
- #define J420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1008
- I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1009
- l, m)
1010
- #define J420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1011
- I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1012
- l, m)
1013
- #define F420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1014
- I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1015
- l, m)
1016
- #define F420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1017
- I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1018
- l, m)
1019
- #define H420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1020
- I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1021
- l, m)
1022
- #define H420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1023
- I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1024
- l, m)
1025
- #define U420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1026
- I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1027
- l, m)
1028
- #define U420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1029
- I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1030
- l, m)
1031
- #define V420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1032
- I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1033
- l, m)
1034
- #define V420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1035
- I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1036
- l, m)
1037
- #define J422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1038
- I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1039
- l, m)
1040
- #define J422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1041
- I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1042
- l, m)
1043
- #define F422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1044
- I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1045
- l, m)
1046
- #define F422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1047
- I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1048
- l, m)
1049
- #define H422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1050
- I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1051
- l, m)
1052
- #define H422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1053
- I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1054
- l, m)
1055
- #define U422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1056
- I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1057
- l, m)
1058
- #define U422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1059
- I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1060
- l, m)
1061
- #define V422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1062
- I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1063
- l, m)
1064
- #define V422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1065
- I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1066
- l, m)
1067
- #define J444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1068
- I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1069
- l, m)
1070
- #define J444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1071
- I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1072
- l, m)
1073
- #define F444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1074
- I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1075
- l, m)
1076
- #define F444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1077
- I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1078
- l, m)
1079
- #define H444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1080
- I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1081
- l, m)
1082
- #define H444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1083
- I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
1084
- l, m)
1085
- #define U444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1086
- I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1087
- l, m)
1088
- #define U444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1089
- I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
1090
- l, m)
1091
- #define V444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1092
- I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1093
- l, m)
1094
- #define V444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1095
- I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
1096
- l, m)
1097
-
1098
- #define I420AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1099
- I420AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
1100
- &kYuvI601Constants, k, l, m, kFilterBilinear)
1101
- #define I422AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1102
- I422AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
1103
- &kYuvI601Constants, k, l, m, kFilterBilinear)
1104
-
1105
- #if defined(ENABLE_FULL_TESTS)
1106
- TESTQPLANARTOB(I420Alpha, 2, 2, ARGB, 4, 4, 1)
1107
- TESTQPLANARTOB(I420Alpha, 2, 2, ABGR, 4, 4, 1)
1108
- TESTQPLANARTOB(J420Alpha, 2, 2, ARGB, 4, 4, 1)
1109
- TESTQPLANARTOB(J420Alpha, 2, 2, ABGR, 4, 4, 1)
1110
- TESTQPLANARTOB(H420Alpha, 2, 2, ARGB, 4, 4, 1)
1111
- TESTQPLANARTOB(H420Alpha, 2, 2, ABGR, 4, 4, 1)
1112
- TESTQPLANARTOB(F420Alpha, 2, 2, ARGB, 4, 4, 1)
1113
- TESTQPLANARTOB(F420Alpha, 2, 2, ABGR, 4, 4, 1)
1114
- TESTQPLANARTOB(U420Alpha, 2, 2, ARGB, 4, 4, 1)
1115
- TESTQPLANARTOB(U420Alpha, 2, 2, ABGR, 4, 4, 1)
1116
- TESTQPLANARTOB(V420Alpha, 2, 2, ARGB, 4, 4, 1)
1117
- TESTQPLANARTOB(V420Alpha, 2, 2, ABGR, 4, 4, 1)
1118
- TESTQPLANARTOB(I422Alpha, 2, 1, ARGB, 4, 4, 1)
1119
- TESTQPLANARTOB(I422Alpha, 2, 1, ABGR, 4, 4, 1)
1120
- TESTQPLANARTOB(J422Alpha, 2, 1, ARGB, 4, 4, 1)
1121
- TESTQPLANARTOB(J422Alpha, 2, 1, ABGR, 4, 4, 1)
1122
- TESTQPLANARTOB(H422Alpha, 2, 1, ARGB, 4, 4, 1)
1123
- TESTQPLANARTOB(H422Alpha, 2, 1, ABGR, 4, 4, 1)
1124
- TESTQPLANARTOB(F422Alpha, 2, 1, ARGB, 4, 4, 1)
1125
- TESTQPLANARTOB(F422Alpha, 2, 1, ABGR, 4, 4, 1)
1126
- TESTQPLANARTOB(U422Alpha, 2, 1, ARGB, 4, 4, 1)
1127
- TESTQPLANARTOB(U422Alpha, 2, 1, ABGR, 4, 4, 1)
1128
- TESTQPLANARTOB(V422Alpha, 2, 1, ARGB, 4, 4, 1)
1129
- TESTQPLANARTOB(V422Alpha, 2, 1, ABGR, 4, 4, 1)
1130
- TESTQPLANARTOB(I444Alpha, 1, 1, ARGB, 4, 4, 1)
1131
- TESTQPLANARTOB(I444Alpha, 1, 1, ABGR, 4, 4, 1)
1132
- TESTQPLANARTOB(J444Alpha, 1, 1, ARGB, 4, 4, 1)
1133
- TESTQPLANARTOB(J444Alpha, 1, 1, ABGR, 4, 4, 1)
1134
- TESTQPLANARTOB(H444Alpha, 1, 1, ARGB, 4, 4, 1)
1135
- TESTQPLANARTOB(H444Alpha, 1, 1, ABGR, 4, 4, 1)
1136
- TESTQPLANARTOB(F444Alpha, 1, 1, ARGB, 4, 4, 1)
1137
- TESTQPLANARTOB(F444Alpha, 1, 1, ABGR, 4, 4, 1)
1138
- TESTQPLANARTOB(U444Alpha, 1, 1, ARGB, 4, 4, 1)
1139
- TESTQPLANARTOB(U444Alpha, 1, 1, ABGR, 4, 4, 1)
1140
- TESTQPLANARTOB(V444Alpha, 1, 1, ARGB, 4, 4, 1)
1141
- TESTQPLANARTOB(V444Alpha, 1, 1, ABGR, 4, 4, 1)
1142
- TESTQPLANARTOB(I420Alpha, 2, 2, ARGBFilter, 4, 4, 1)
1143
- TESTQPLANARTOB(I422Alpha, 2, 1, ARGBFilter, 4, 4, 1)
1144
- #else
1145
- TESTQPLANARTOB(I420Alpha, 2, 2, ARGB, 4, 4, 1)
1146
- TESTQPLANARTOB(I422Alpha, 2, 1, ARGB, 4, 4, 1)
1147
- TESTQPLANARTOB(I444Alpha, 1, 1, ARGB, 4, 4, 1)
1148
- TESTQPLANARTOB(I420Alpha, 2, 2, ARGBFilter, 4, 4, 1)
1149
- TESTQPLANARTOB(I422Alpha, 2, 1, ARGBFilter, 4, 4, 1)
1150
- #endif
1151
-
1152
- TEST_F(LibYUVConvertTest, TestYToARGB) {
1153
- uint8_t y[32];
1154
- uint8_t expectedg[32];
1155
- for (int i = 0; i < 32; ++i) {
1156
- y[i] = i * 5 + 17;
1157
- expectedg[i] = static_cast<int>((y[i] - 16) * 1.164f + 0.5f);
1158
- }
1159
- uint8_t argb[32 * 4];
1160
- YToARGB(y, 0, argb, 0, 32, 1);
1161
-
1162
- for (int i = 0; i < 32; ++i) {
1163
- printf("%2d %d: %d <-> %d,%d,%d,%d\n", i, y[i], expectedg[i],
1164
- argb[i * 4 + 0], argb[i * 4 + 1], argb[i * 4 + 2], argb[i * 4 + 3]);
1165
- }
1166
- for (int i = 0; i < 32; ++i) {
1167
- EXPECT_EQ(expectedg[i], argb[i * 4 + 0]);
1168
- }
1169
- }
1170
-
1171
- static const uint8_t kNoDither4x4[16] = {
1172
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1173
- };
1174
-
1175
- TEST_F(LibYUVConvertTest, TestNoDither) {
1176
- align_buffer_page_end(src_argb, benchmark_width_ * benchmark_height_ * 4);
1177
- align_buffer_page_end(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1178
- align_buffer_page_end(dst_rgb565dither,
1179
- benchmark_width_ * benchmark_height_ * 2);
1180
- MemRandomize(src_argb, benchmark_width_ * benchmark_height_ * 4);
1181
- MemRandomize(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1182
- MemRandomize(dst_rgb565dither, benchmark_width_ * benchmark_height_ * 2);
1183
- ARGBToRGB565(src_argb, benchmark_width_ * 4, dst_rgb565, benchmark_width_ * 2,
1184
- benchmark_width_, benchmark_height_);
1185
- ARGBToRGB565Dither(src_argb, benchmark_width_ * 4, dst_rgb565dither,
1186
- benchmark_width_ * 2, kNoDither4x4, benchmark_width_,
1187
- benchmark_height_);
1188
- for (int i = 0; i < benchmark_width_ * benchmark_height_ * 2; ++i) {
1189
- EXPECT_EQ(dst_rgb565[i], dst_rgb565dither[i]);
1190
- }
1191
-
1192
- free_aligned_buffer_page_end(src_argb);
1193
- free_aligned_buffer_page_end(dst_rgb565);
1194
- free_aligned_buffer_page_end(dst_rgb565dither);
1195
- }
1196
-
1197
- // Ordered 4x4 dither for 888 to 565. Values from 0 to 7.
1198
- static const uint8_t kDither565_4x4[16] = {
1199
- 0, 4, 1, 5, 6, 2, 7, 3, 1, 5, 0, 4, 7, 3, 6, 2,
1200
- };
1201
-
1202
- TEST_F(LibYUVConvertTest, TestDither) {
1203
- align_buffer_page_end(src_argb, benchmark_width_ * benchmark_height_ * 4);
1204
- align_buffer_page_end(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1205
- align_buffer_page_end(dst_rgb565dither,
1206
- benchmark_width_ * benchmark_height_ * 2);
1207
- align_buffer_page_end(dst_argb, benchmark_width_ * benchmark_height_ * 4);
1208
- align_buffer_page_end(dst_argbdither,
1209
- benchmark_width_ * benchmark_height_ * 4);
1210
- MemRandomize(src_argb, benchmark_width_ * benchmark_height_ * 4);
1211
- MemRandomize(dst_rgb565, benchmark_width_ * benchmark_height_ * 2);
1212
- MemRandomize(dst_rgb565dither, benchmark_width_ * benchmark_height_ * 2);
1213
- MemRandomize(dst_argb, benchmark_width_ * benchmark_height_ * 4);
1214
- MemRandomize(dst_argbdither, benchmark_width_ * benchmark_height_ * 4);
1215
- ARGBToRGB565(src_argb, benchmark_width_ * 4, dst_rgb565, benchmark_width_ * 2,
1216
- benchmark_width_, benchmark_height_);
1217
- ARGBToRGB565Dither(src_argb, benchmark_width_ * 4, dst_rgb565dither,
1218
- benchmark_width_ * 2, kDither565_4x4, benchmark_width_,
1219
- benchmark_height_);
1220
- RGB565ToARGB(dst_rgb565, benchmark_width_ * 2, dst_argb, benchmark_width_ * 4,
1221
- benchmark_width_, benchmark_height_);
1222
- RGB565ToARGB(dst_rgb565dither, benchmark_width_ * 2, dst_argbdither,
1223
- benchmark_width_ * 4, benchmark_width_, benchmark_height_);
1224
-
1225
- for (int i = 0; i < benchmark_width_ * benchmark_height_ * 4; ++i) {
1226
- EXPECT_NEAR(dst_argb[i], dst_argbdither[i], 9);
1227
- }
1228
- free_aligned_buffer_page_end(src_argb);
1229
- free_aligned_buffer_page_end(dst_rgb565);
1230
- free_aligned_buffer_page_end(dst_rgb565dither);
1231
- free_aligned_buffer_page_end(dst_argb);
1232
- free_aligned_buffer_page_end(dst_argbdither);
1233
- }
1234
-
1235
- #define TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1236
- YALIGN, W1280, N, NEG, OFF, FMT_C, BPP_C) \
1237
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##Dither##N) { \
1238
- const int kWidth = W1280; \
1239
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1240
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1241
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1242
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1243
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1244
- align_buffer_page_end(src_u, kSizeUV + OFF); \
1245
- align_buffer_page_end(src_v, kSizeUV + OFF); \
1246
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
1247
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
1248
- for (int i = 0; i < kWidth * kHeight; ++i) { \
1249
- src_y[i + OFF] = (fastrand() & 0xff); \
1250
- } \
1251
- for (int i = 0; i < kSizeUV; ++i) { \
1252
- src_u[i + OFF] = (fastrand() & 0xff); \
1253
- src_v[i + OFF] = (fastrand() & 0xff); \
1254
- } \
1255
- memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
1256
- memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
1257
- MaskCpuFlags(disable_cpu_flags_); \
1258
- FMT_PLANAR##To##FMT_B##Dither(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1259
- src_v + OFF, kStrideUV, dst_argb_c + OFF, \
1260
- kStrideB, NULL, kWidth, NEG kHeight); \
1261
- MaskCpuFlags(benchmark_cpu_info_); \
1262
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1263
- FMT_PLANAR##To##FMT_B##Dither( \
1264
- src_y + OFF, kWidth, src_u + OFF, kStrideUV, src_v + OFF, kStrideUV, \
1265
- dst_argb_opt + OFF, kStrideB, NULL, kWidth, NEG kHeight); \
1266
- } \
1267
- /* Convert to ARGB so 565 is expanded to bytes that can be compared. */ \
1268
- align_buffer_page_end(dst_argb32_c, kWidth* BPP_C* kHeight); \
1269
- align_buffer_page_end(dst_argb32_opt, kWidth* BPP_C* kHeight); \
1270
- memset(dst_argb32_c, 2, kWidth* BPP_C* kHeight); \
1271
- memset(dst_argb32_opt, 102, kWidth* BPP_C* kHeight); \
1272
- FMT_B##To##FMT_C(dst_argb_c + OFF, kStrideB, dst_argb32_c, kWidth * BPP_C, \
1273
- kWidth, kHeight); \
1274
- FMT_B##To##FMT_C(dst_argb_opt + OFF, kStrideB, dst_argb32_opt, \
1275
- kWidth * BPP_C, kWidth, kHeight); \
1276
- for (int i = 0; i < kWidth * BPP_C * kHeight; ++i) { \
1277
- EXPECT_EQ(dst_argb32_c[i], dst_argb32_opt[i]); \
1278
- } \
1279
- free_aligned_buffer_page_end(src_y); \
1280
- free_aligned_buffer_page_end(src_u); \
1281
- free_aligned_buffer_page_end(src_v); \
1282
- free_aligned_buffer_page_end(dst_argb_c); \
1283
- free_aligned_buffer_page_end(dst_argb_opt); \
1284
- free_aligned_buffer_page_end(dst_argb32_c); \
1285
- free_aligned_buffer_page_end(dst_argb32_opt); \
1286
- }
1287
-
1288
- #if defined(ENABLE_FULL_TESTS)
1289
- #define TESTPLANARTOBD(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1290
- YALIGN, FMT_C, BPP_C) \
1291
- TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1292
- YALIGN, benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1293
- TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1294
- YALIGN, benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C) \
1295
- TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1296
- YALIGN, benchmark_width_, _Invert, -, 0, FMT_C, BPP_C) \
1297
- TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1298
- YALIGN, benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1299
- #else
1300
- #define TESTPLANARTOBD(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1301
- YALIGN, FMT_C, BPP_C) \
1302
- TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1303
- YALIGN, benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1304
- #endif
1305
-
1306
- #ifdef LITTLE_ENDIAN_ONLY_TEST
1307
- TESTPLANARTOBD(I420, 2, 2, RGB565, 2, 2, 1, ARGB, 4)
1308
- #endif
1309
-
1310
- // Transitive test. A to B to C is same as A to C.
1311
- // Benchmarks A To B to C for comparison to 1 step, benchmarked elsewhere.
1312
- #define TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1313
- W1280, N, NEG, OFF, FMT_C, BPP_C) \
1314
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \
1315
- const int kWidth = W1280; \
1316
- const int kHeight = benchmark_height_; \
1317
- const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1318
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1319
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1320
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1321
- align_buffer_page_end(src_u, kSizeUV + OFF); \
1322
- align_buffer_page_end(src_v, kSizeUV + OFF); \
1323
- align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1324
- for (int i = 0; i < kWidth * kHeight; ++i) { \
1325
- src_y[i + OFF] = (fastrand() & 0xff); \
1326
- } \
1327
- for (int i = 0; i < kSizeUV; ++i) { \
1328
- src_u[i + OFF] = (fastrand() & 0xff); \
1329
- src_v[i + OFF] = (fastrand() & 0xff); \
1330
- } \
1331
- memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1332
- FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1333
- src_v + OFF, kStrideUV, dst_argb_b + OFF, kStrideB, \
1334
- kWidth, NEG kHeight); \
1335
- /* Convert to a 3rd format in 1 step and 2 steps and compare */ \
1336
- const int kStrideC = kWidth * BPP_C; \
1337
- align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1338
- align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1339
- memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1340
- memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1341
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1342
- FMT_PLANAR##To##FMT_C(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \
1343
- src_v + OFF, kStrideUV, dst_argb_c + OFF, \
1344
- kStrideC, kWidth, NEG kHeight); \
1345
- /* Convert B to C */ \
1346
- FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1347
- kStrideC, kWidth, kHeight); \
1348
- } \
1349
- for (int i = 0; i < kStrideC * kHeight; ++i) { \
1350
- EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \
1351
- } \
1352
- free_aligned_buffer_page_end(src_y); \
1353
- free_aligned_buffer_page_end(src_u); \
1354
- free_aligned_buffer_page_end(src_v); \
1355
- free_aligned_buffer_page_end(dst_argb_b); \
1356
- free_aligned_buffer_page_end(dst_argb_c); \
1357
- free_aligned_buffer_page_end(dst_argb_bc); \
1358
- }
1359
-
1360
- #if defined(ENABLE_FULL_TESTS)
1361
- #define TESTPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1362
- FMT_C, BPP_C) \
1363
- TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1364
- benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1365
- TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1366
- benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C) \
1367
- TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1368
- benchmark_width_, _Invert, -, 0, FMT_C, BPP_C) \
1369
- TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1370
- benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1371
- #else
1372
- #define TESTPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1373
- FMT_C, BPP_C) \
1374
- TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1375
- benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
1376
- #endif
1377
-
1378
- #if defined(ENABLE_FULL_TESTS)
1379
- TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
1380
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ABGR, 4)
1381
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RAW, 3)
1382
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB24, 3)
1383
- TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4)
1384
- TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, ARGB, 4)
1385
- TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3)
1386
- TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4)
1387
- TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3)
1388
- TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4)
1389
- TESTPLANARTOE(H420, 2, 2, ABGR, 1, 4, ARGB, 4)
1390
- TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, ABGR, 4)
1391
- TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3)
1392
- TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RGB24, 3)
1393
- TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, ARGB, 4)
1394
- TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, RGB24, 3)
1395
- TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, ARGB, 4)
1396
- TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, RAW, 3)
1397
- TESTPLANARTOE(J420, 2, 2, ABGR, 1, 4, ARGB, 4)
1398
- TESTPLANARTOE(J420, 2, 2, ARGB, 1, 4, ARGB, 4)
1399
- TESTPLANARTOE(U420, 2, 2, ABGR, 1, 4, ARGB, 4)
1400
- TESTPLANARTOE(U420, 2, 2, ARGB, 1, 4, ARGB, 4)
1401
- #ifdef LITTLE_ENDIAN_ONLY_TEST
1402
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2)
1403
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
1404
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
1405
- TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
1406
- #endif
1407
- TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, ABGR, 4)
1408
- TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
1409
- TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
1410
- TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
1411
- TESTPLANARTOE(H422, 2, 1, ARGB, 1, 4, ARGB, 4)
1412
- TESTPLANARTOE(H422, 2, 1, ABGR, 1, 4, ARGB, 4)
1413
- TESTPLANARTOE(U422, 2, 1, ARGB, 1, 4, ARGB, 4)
1414
- TESTPLANARTOE(U422, 2, 1, ABGR, 1, 4, ARGB, 4)
1415
- TESTPLANARTOE(V422, 2, 1, ARGB, 1, 4, ARGB, 4)
1416
- TESTPLANARTOE(V422, 2, 1, ABGR, 1, 4, ARGB, 4)
1417
- TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4)
1418
- TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4)
1419
- TESTPLANARTOE(I444, 1, 1, ARGB, 1, 4, ABGR, 4)
1420
- TESTPLANARTOE(I444, 1, 1, ABGR, 1, 4, ARGB, 4)
1421
- TESTPLANARTOE(J444, 1, 1, ARGB, 1, 4, ARGB, 4)
1422
- TESTPLANARTOE(J444, 1, 1, ABGR, 1, 4, ARGB, 4)
1423
- TESTPLANARTOE(H444, 1, 1, ARGB, 1, 4, ARGB, 4)
1424
- TESTPLANARTOE(H444, 1, 1, ABGR, 1, 4, ARGB, 4)
1425
- TESTPLANARTOE(U444, 1, 1, ARGB, 1, 4, ARGB, 4)
1426
- TESTPLANARTOE(U444, 1, 1, ABGR, 1, 4, ARGB, 4)
1427
- TESTPLANARTOE(V444, 1, 1, ARGB, 1, 4, ARGB, 4)
1428
- TESTPLANARTOE(V444, 1, 1, ABGR, 1, 4, ARGB, 4)
1429
- TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4)
1430
- TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4)
1431
- TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4)
1432
- TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4)
1433
- #else
1434
- TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
1435
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
1436
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
1437
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RAW, 3)
1438
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB24, 3)
1439
- TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2)
1440
- TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4)
1441
- TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, ARGB, 4)
1442
- TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3)
1443
- TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4)
1444
- TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3)
1445
- TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4)
1446
- TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4)
1447
- TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4)
1448
- TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
1449
- TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
1450
- TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4)
1451
- TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4)
1452
- TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4)
1453
- TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4)
1454
- TESTPLANARTOE(I444, 1, 1, ABGR, 1, 4, ARGB, 4)
1455
- #endif
1456
-
1457
- // Transitive test: Compare 1 step vs 2 step conversion for YUVA to ARGB.
1458
- // Benchmark 2 step conversion for comparison to 1 step conversion.
1459
- #define TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1460
- W1280, N, NEG, OFF, FMT_C, BPP_C, ATTEN) \
1461
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \
1462
- const int kWidth = W1280; \
1463
- const int kHeight = benchmark_height_; \
1464
- const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1465
- const int kSizeUV = \
1466
- SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1467
- align_buffer_page_end(src_y, kWidth* kHeight + OFF); \
1468
- align_buffer_page_end(src_u, kSizeUV + OFF); \
1469
- align_buffer_page_end(src_v, kSizeUV + OFF); \
1470
- align_buffer_page_end(src_a, kWidth* kHeight + OFF); \
1471
- align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1472
- const int kStrideC = kWidth * BPP_C; \
1473
- align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1474
- align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1475
- memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1476
- memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1477
- memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1478
- for (int i = 0; i < kWidth * kHeight; ++i) { \
1479
- src_y[i + OFF] = (fastrand() & 0xff); \
1480
- src_a[i + OFF] = (fastrand() & 0xff); \
1481
- } \
1482
- for (int i = 0; i < kSizeUV; ++i) { \
1483
- src_u[i + OFF] = (fastrand() & 0xff); \
1484
- src_v[i + OFF] = (fastrand() & 0xff); \
1485
- } \
1486
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1487
- /* Convert A to B */ \
1488
- FMT_PLANAR##To##FMT_B( \
1489
- src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \
1490
- src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \
1491
- dst_argb_b + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \
1492
- /* Convert B to C */ \
1493
- FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1494
- kStrideC, kWidth, kHeight); \
1495
- } \
1496
- /* Convert A to C */ \
1497
- FMT_PLANAR##To##FMT_C( \
1498
- src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \
1499
- src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \
1500
- dst_argb_c + OFF, kStrideC, kWidth, NEG kHeight, ATTEN); \
1501
- for (int i = 0; i < kStrideC * kHeight; ++i) { \
1502
- EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \
1503
- } \
1504
- free_aligned_buffer_page_end(src_y); \
1505
- free_aligned_buffer_page_end(src_u); \
1506
- free_aligned_buffer_page_end(src_v); \
1507
- free_aligned_buffer_page_end(src_a); \
1508
- free_aligned_buffer_page_end(dst_argb_b); \
1509
- free_aligned_buffer_page_end(dst_argb_c); \
1510
- free_aligned_buffer_page_end(dst_argb_bc); \
1511
- }
1512
-
1513
- #if defined(ENABLE_FULL_TESTS)
1514
- #define TESTQPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1515
- FMT_C, BPP_C) \
1516
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1517
- benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C, 0) \
1518
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1519
- benchmark_width_, _Unaligned, +, 2, FMT_C, BPP_C, 0) \
1520
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1521
- benchmark_width_, _Invert, -, 0, FMT_C, BPP_C, 0) \
1522
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1523
- benchmark_width_, _Opt, +, 0, FMT_C, BPP_C, 0) \
1524
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1525
- benchmark_width_, _Premult, +, 0, FMT_C, BPP_C, 1)
1526
- #else
1527
- #define TESTQPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1528
- FMT_C, BPP_C) \
1529
- TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \
1530
- benchmark_width_, _Opt, +, 0, FMT_C, BPP_C, 0)
1531
- #endif
1532
-
1533
- #if defined(ENABLE_FULL_TESTS)
1534
- TESTQPLANARTOE(I420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1535
- TESTQPLANARTOE(I420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1536
- TESTQPLANARTOE(J420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1537
- TESTQPLANARTOE(J420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1538
- TESTQPLANARTOE(H420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1539
- TESTQPLANARTOE(H420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1540
- TESTQPLANARTOE(F420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1541
- TESTQPLANARTOE(F420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1542
- TESTQPLANARTOE(U420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1543
- TESTQPLANARTOE(U420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1544
- TESTQPLANARTOE(V420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4)
1545
- TESTQPLANARTOE(V420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1546
- TESTQPLANARTOE(I422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1547
- TESTQPLANARTOE(I422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1548
- TESTQPLANARTOE(J422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1549
- TESTQPLANARTOE(J422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1550
- TESTQPLANARTOE(F422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1551
- TESTQPLANARTOE(F422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1552
- TESTQPLANARTOE(H422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1553
- TESTQPLANARTOE(H422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1554
- TESTQPLANARTOE(U422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1555
- TESTQPLANARTOE(U422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1556
- TESTQPLANARTOE(V422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4)
1557
- TESTQPLANARTOE(V422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1558
- TESTQPLANARTOE(I444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1559
- TESTQPLANARTOE(I444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1560
- TESTQPLANARTOE(J444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1561
- TESTQPLANARTOE(J444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1562
- TESTQPLANARTOE(H444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1563
- TESTQPLANARTOE(H444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1564
- TESTQPLANARTOE(U444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1565
- TESTQPLANARTOE(U444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1566
- TESTQPLANARTOE(V444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4)
1567
- TESTQPLANARTOE(V444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1568
- #else
1569
- TESTQPLANARTOE(I420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4)
1570
- TESTQPLANARTOE(I422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4)
1571
- TESTQPLANARTOE(I444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4)
1572
- #endif
1573
-
1574
- #define TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, W1280, N, NEG, \
1575
- OFF, FMT_C, BPP_C) \
1576
- TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##To##FMT_C##N) { \
1577
- const int kWidth = W1280; \
1578
- const int kHeight = benchmark_height_; \
1579
- const int kStrideA = SUBSAMPLE(kWidth, SUB_A) * BPP_A; \
1580
- const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \
1581
- align_buffer_page_end(src_argb_a, kStrideA* kHeight + OFF); \
1582
- align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \
1583
- MemRandomize(src_argb_a + OFF, kStrideA * kHeight); \
1584
- memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \
1585
- FMT_A##To##FMT_B(src_argb_a + OFF, kStrideA, dst_argb_b + OFF, kStrideB, \
1586
- kWidth, NEG kHeight); \
1587
- /* Convert to a 3rd format in 1 step and 2 steps and compare */ \
1588
- const int kStrideC = kWidth * BPP_C; \
1589
- align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \
1590
- align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \
1591
- memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \
1592
- memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \
1593
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1594
- FMT_A##To##FMT_C(src_argb_a + OFF, kStrideA, dst_argb_c + OFF, kStrideC, \
1595
- kWidth, NEG kHeight); \
1596
- /* Convert B to C */ \
1597
- FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \
1598
- kStrideC, kWidth, kHeight); \
1599
- } \
1600
- for (int i = 0; i < kStrideC * kHeight; i += 4) { \
1601
- EXPECT_EQ(dst_argb_c[i + OFF + 0], dst_argb_bc[i + OFF + 0]); \
1602
- EXPECT_EQ(dst_argb_c[i + OFF + 1], dst_argb_bc[i + OFF + 1]); \
1603
- EXPECT_EQ(dst_argb_c[i + OFF + 2], dst_argb_bc[i + OFF + 2]); \
1604
- EXPECT_NEAR(dst_argb_c[i + OFF + 3], dst_argb_bc[i + OFF + 3], 64); \
1605
- } \
1606
- free_aligned_buffer_page_end(src_argb_a); \
1607
- free_aligned_buffer_page_end(dst_argb_b); \
1608
- free_aligned_buffer_page_end(dst_argb_c); \
1609
- free_aligned_buffer_page_end(dst_argb_bc); \
1610
- }
1611
-
1612
- #if defined(ENABLE_FULL_TESTS)
1613
- #define TESTPLANETOE(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, FMT_C, BPP_C) \
1614
- TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, \
1615
- benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \
1616
- TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1617
- _Unaligned, +, 4, FMT_C, BPP_C) \
1618
- TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1619
- _Invert, -, 0, FMT_C, BPP_C) \
1620
- TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1621
- _Opt, +, 0, FMT_C, BPP_C)
1622
- #else
1623
- #define TESTPLANETOE(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, FMT_C, BPP_C) \
1624
- TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \
1625
- _Opt, +, 0, FMT_C, BPP_C)
1626
- #endif
1627
-
1628
- // Caveat: Destination needs to be 4 bytes
1629
- #ifdef LITTLE_ENDIAN_ONLY_TEST
1630
- TESTPLANETOE(ARGB, 1, 4, AR30, 1, 4, ARGB, 4)
1631
- TESTPLANETOE(ABGR, 1, 4, AR30, 1, 4, ABGR, 4)
1632
- TESTPLANETOE(AR30, 1, 4, ARGB, 1, 4, ABGR, 4)
1633
- TESTPLANETOE(AR30, 1, 4, ABGR, 1, 4, ARGB, 4)
1634
- TESTPLANETOE(ARGB, 1, 4, AB30, 1, 4, ARGB, 4)
1635
- TESTPLANETOE(ABGR, 1, 4, AB30, 1, 4, ABGR, 4)
1636
- TESTPLANETOE(AB30, 1, 4, ARGB, 1, 4, ABGR, 4)
1637
- TESTPLANETOE(AB30, 1, 4, ABGR, 1, 4, ARGB, 4)
1638
- #endif
1639
-
1640
- TEST_F(LibYUVConvertTest, RotateWithARGBSource) {
1641
- // 2x2 frames
1642
- uint32_t src[4];
1643
- uint32_t dst[4];
1644
- // some random input
1645
- src[0] = 0x11000000;
1646
- src[1] = 0x00450000;
1647
- src[2] = 0x00009f00;
1648
- src[3] = 0x000000ff;
1649
- // zeros on destination
1650
- dst[0] = 0x00000000;
1651
- dst[1] = 0x00000000;
1652
- dst[2] = 0x00000000;
1653
- dst[3] = 0x00000000;
1654
-
1655
- int r = ConvertToARGB(reinterpret_cast<uint8_t*>(src),
1656
- 16, // input size
1657
- reinterpret_cast<uint8_t*>(dst),
1658
- 8, // destination stride
1659
- 0, // crop_x
1660
- 0, // crop_y
1661
- 2, // width
1662
- 2, // height
1663
- 2, // crop width
1664
- 2, // crop height
1665
- kRotate90, FOURCC_ARGB);
1666
-
1667
- EXPECT_EQ(r, 0);
1668
- // 90 degrees rotation, no conversion
1669
- EXPECT_EQ(dst[0], src[2]);
1670
- EXPECT_EQ(dst[1], src[0]);
1671
- EXPECT_EQ(dst[2], src[3]);
1672
- EXPECT_EQ(dst[3], src[1]);
1673
- }
1674
-
1675
- #ifdef HAS_ARGBTOAR30ROW_AVX2
1676
- TEST_F(LibYUVConvertTest, ARGBToAR30Row_Opt) {
1677
- // ARGBToAR30Row_AVX2 expects a multiple of 8 pixels.
1678
- const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
1679
- align_buffer_page_end(src, kPixels * 4);
1680
- align_buffer_page_end(dst_opt, kPixels * 4);
1681
- align_buffer_page_end(dst_c, kPixels * 4);
1682
- MemRandomize(src, kPixels * 4);
1683
- memset(dst_opt, 0, kPixels * 4);
1684
- memset(dst_c, 1, kPixels * 4);
1685
-
1686
- ARGBToAR30Row_C(src, dst_c, kPixels);
1687
-
1688
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
1689
- int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
1690
- for (int i = 0; i < benchmark_iterations_; ++i) {
1691
- if (has_avx2) {
1692
- ARGBToAR30Row_AVX2(src, dst_opt, kPixels);
1693
- } else if (has_ssse3) {
1694
- ARGBToAR30Row_SSSE3(src, dst_opt, kPixels);
1695
- } else {
1696
- ARGBToAR30Row_C(src, dst_opt, kPixels);
1697
- }
1698
- }
1699
- for (int i = 0; i < kPixels * 4; ++i) {
1700
- EXPECT_EQ(dst_opt[i], dst_c[i]);
1701
- }
1702
-
1703
- free_aligned_buffer_page_end(src);
1704
- free_aligned_buffer_page_end(dst_opt);
1705
- free_aligned_buffer_page_end(dst_c);
1706
- }
1707
- #endif // HAS_ARGBTOAR30ROW_AVX2
1708
-
1709
- #ifdef HAS_ABGRTOAR30ROW_AVX2
1710
- TEST_F(LibYUVConvertTest, ABGRToAR30Row_Opt) {
1711
- // ABGRToAR30Row_AVX2 expects a multiple of 8 pixels.
1712
- const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
1713
- align_buffer_page_end(src, kPixels * 4);
1714
- align_buffer_page_end(dst_opt, kPixels * 4);
1715
- align_buffer_page_end(dst_c, kPixels * 4);
1716
- MemRandomize(src, kPixels * 4);
1717
- memset(dst_opt, 0, kPixels * 4);
1718
- memset(dst_c, 1, kPixels * 4);
1719
-
1720
- ABGRToAR30Row_C(src, dst_c, kPixels);
1721
-
1722
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
1723
- int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
1724
- for (int i = 0; i < benchmark_iterations_; ++i) {
1725
- if (has_avx2) {
1726
- ABGRToAR30Row_AVX2(src, dst_opt, kPixels);
1727
- } else if (has_ssse3) {
1728
- ABGRToAR30Row_SSSE3(src, dst_opt, kPixels);
1729
- } else {
1730
- ABGRToAR30Row_C(src, dst_opt, kPixels);
1731
- }
1732
- }
1733
- for (int i = 0; i < kPixels * 4; ++i) {
1734
- EXPECT_EQ(dst_opt[i], dst_c[i]);
1735
- }
1736
-
1737
- free_aligned_buffer_page_end(src);
1738
- free_aligned_buffer_page_end(dst_opt);
1739
- free_aligned_buffer_page_end(dst_c);
1740
- }
1741
- #endif // HAS_ABGRTOAR30ROW_AVX2
1742
-
1743
- #if !defined(LEAN_TESTS)
1744
-
1745
- // Provide matrix wrappers for 12 bit YUV
1746
- #define I012ToARGB(a, b, c, d, e, f, g, h, i, j) \
1747
- I012ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1748
- #define I012ToAR30(a, b, c, d, e, f, g, h, i, j) \
1749
- I012ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1750
- #define I012ToAB30(a, b, c, d, e, f, g, h, i, j) \
1751
- I012ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1752
-
1753
- #define I410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1754
- I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1755
- #define I410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1756
- I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1757
- #define H410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1758
- I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1759
- #define H410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1760
- I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1761
- #define U410ToARGB(a, b, c, d, e, f, g, h, i, j) \
1762
- I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1763
- #define U410ToABGR(a, b, c, d, e, f, g, h, i, j) \
1764
- I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1765
- #define I410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1766
- I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1767
- #define I410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1768
- I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j)
1769
- #define H410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1770
- I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1771
- #define H410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1772
- I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j)
1773
- #define U410ToAR30(a, b, c, d, e, f, g, h, i, j) \
1774
- I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1775
- #define U410ToAB30(a, b, c, d, e, f, g, h, i, j) \
1776
- I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j)
1777
-
1778
- #define I010ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
1779
- I010ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1780
- kFilterBilinear)
1781
- #define I010ToAR30Filter(a, b, c, d, e, f, g, h, i, j) \
1782
- I010ToAR30MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1783
- kFilterBilinear)
1784
- #define I210ToARGBFilter(a, b, c, d, e, f, g, h, i, j) \
1785
- I210ToARGBMatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1786
- kFilterBilinear)
1787
- #define I210ToAR30Filter(a, b, c, d, e, f, g, h, i, j) \
1788
- I210ToAR30MatrixFilter(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j, \
1789
- kFilterBilinear)
1790
-
1791
- // TODO(fbarchard): Fix clamping issue affected by U channel.
1792
- #define TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1793
- BPP_B, ALIGN, YALIGN, W1280, N, NEG, SOFF, DOFF) \
1794
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
1795
- const int kWidth = W1280; \
1796
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1797
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1798
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1799
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1800
- const int kBpc = 2; \
1801
- align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \
1802
- align_buffer_page_end(src_u, kSizeUV* kBpc + SOFF); \
1803
- align_buffer_page_end(src_v, kSizeUV* kBpc + SOFF); \
1804
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \
1805
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \
1806
- for (int i = 0; i < kWidth * kHeight; ++i) { \
1807
- reinterpret_cast<uint16_t*>(src_y + SOFF)[i] = (fastrand() & FMT_MASK); \
1808
- } \
1809
- for (int i = 0; i < kSizeUV; ++i) { \
1810
- reinterpret_cast<uint16_t*>(src_u + SOFF)[i] = (fastrand() & FMT_MASK); \
1811
- reinterpret_cast<uint16_t*>(src_v + SOFF)[i] = (fastrand() & FMT_MASK); \
1812
- } \
1813
- memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \
1814
- memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \
1815
- MaskCpuFlags(disable_cpu_flags_); \
1816
- FMT_PLANAR##To##FMT_B( \
1817
- reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
1818
- reinterpret_cast<uint16_t*>(src_u + SOFF), kStrideUV, \
1819
- reinterpret_cast<uint16_t*>(src_v + SOFF), kStrideUV, \
1820
- dst_argb_c + DOFF, kStrideB, kWidth, NEG kHeight); \
1821
- MaskCpuFlags(benchmark_cpu_info_); \
1822
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1823
- FMT_PLANAR##To##FMT_B( \
1824
- reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
1825
- reinterpret_cast<uint16_t*>(src_u + SOFF), kStrideUV, \
1826
- reinterpret_cast<uint16_t*>(src_v + SOFF), kStrideUV, \
1827
- dst_argb_opt + DOFF, kStrideB, kWidth, NEG kHeight); \
1828
- } \
1829
- for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
1830
- EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \
1831
- } \
1832
- free_aligned_buffer_page_end(src_y); \
1833
- free_aligned_buffer_page_end(src_u); \
1834
- free_aligned_buffer_page_end(src_v); \
1835
- free_aligned_buffer_page_end(dst_argb_c); \
1836
- free_aligned_buffer_page_end(dst_argb_opt); \
1837
- }
1838
-
1839
- #if defined(ENABLE_FULL_TESTS)
1840
- #define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1841
- BPP_B, ALIGN, YALIGN) \
1842
- TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1843
- ALIGN, YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \
1844
- TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1845
- ALIGN, YALIGN, benchmark_width_, _Unaligned, +, 4, 4) \
1846
- TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1847
- ALIGN, YALIGN, benchmark_width_, _Invert, -, 0, 0) \
1848
- TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1849
- ALIGN, YALIGN, benchmark_width_, _Opt, +, 0, 0)
1850
- #else
1851
- #define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \
1852
- BPP_B, ALIGN, YALIGN) \
1853
- TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \
1854
- ALIGN, YALIGN, benchmark_width_, _Opt, +, 0, 0)
1855
- #endif
1856
-
1857
- // These conversions are only optimized for x86
1858
- #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
1859
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1860
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1861
- TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1862
- TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1863
- TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ARGB, 4, 4, 1)
1864
- TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ABGR, 4, 4, 1)
1865
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1866
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1867
- TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1868
- TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1869
- TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ARGB, 4, 4, 1)
1870
- TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ABGR, 4, 4, 1)
1871
- TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1872
- TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1873
- TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1874
- TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1875
- TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ARGB, 4, 4, 1)
1876
- TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ABGR, 4, 4, 1)
1877
- TESTPLANAR16TOB(I012, 2, 2, 0xfff, ARGB, 4, 4, 1)
1878
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ARGBFilter, 4, 4, 1)
1879
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ARGBFilter, 4, 4, 1)
1880
-
1881
- #ifdef LITTLE_ENDIAN_ONLY_TEST
1882
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1883
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1884
- TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1885
- TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1886
- TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AR30, 4, 4, 1)
1887
- TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AB30, 4, 4, 1)
1888
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1889
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1890
- TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1891
- TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1892
- TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AR30, 4, 4, 1)
1893
- TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AB30, 4, 4, 1)
1894
- TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1895
- TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1896
- TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1897
- TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1898
- TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AR30, 4, 4, 1)
1899
- TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AB30, 4, 4, 1)
1900
- TESTPLANAR16TOB(I012, 2, 2, 0xfff, AR30, 4, 4, 1)
1901
- TESTPLANAR16TOB(I012, 2, 2, 0xfff, AB30, 4, 4, 1)
1902
- TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AR30Filter, 4, 4, 1)
1903
- TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AR30Filter, 4, 4, 1)
1904
- #endif // LITTLE_ENDIAN_ONLY_TEST
1905
- #endif // DISABLE_SLOW_TESTS
1906
-
1907
- #define TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1908
- ALIGN, YALIGN, W1280, N, NEG, OFF, ATTEN, S_DEPTH) \
1909
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
1910
- const int kWidth = W1280; \
1911
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
1912
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
1913
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \
1914
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \
1915
- const int kBpc = 2; \
1916
- align_buffer_page_end(src_y, kWidth* kHeight* kBpc + OFF); \
1917
- align_buffer_page_end(src_u, kSizeUV* kBpc + OFF); \
1918
- align_buffer_page_end(src_v, kSizeUV* kBpc + OFF); \
1919
- align_buffer_page_end(src_a, kWidth* kHeight* kBpc + OFF); \
1920
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \
1921
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \
1922
- for (int i = 0; i < kWidth * kHeight; ++i) { \
1923
- reinterpret_cast<uint16_t*>(src_y + OFF)[i] = \
1924
- (fastrand() & ((1 << S_DEPTH) - 1)); \
1925
- reinterpret_cast<uint16_t*>(src_a + OFF)[i] = \
1926
- (fastrand() & ((1 << S_DEPTH) - 1)); \
1927
- } \
1928
- for (int i = 0; i < kSizeUV; ++i) { \
1929
- reinterpret_cast<uint16_t*>(src_u + OFF)[i] = \
1930
- (fastrand() & ((1 << S_DEPTH) - 1)); \
1931
- reinterpret_cast<uint16_t*>(src_v + OFF)[i] = \
1932
- (fastrand() & ((1 << S_DEPTH) - 1)); \
1933
- } \
1934
- memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \
1935
- memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \
1936
- MaskCpuFlags(disable_cpu_flags_); \
1937
- FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + OFF), kWidth, \
1938
- reinterpret_cast<uint16_t*>(src_u + OFF), kStrideUV, \
1939
- reinterpret_cast<uint16_t*>(src_v + OFF), kStrideUV, \
1940
- reinterpret_cast<uint16_t*>(src_a + OFF), kWidth, \
1941
- dst_argb_c + OFF, kStrideB, kWidth, NEG kHeight, \
1942
- ATTEN); \
1943
- MaskCpuFlags(benchmark_cpu_info_); \
1944
- for (int i = 0; i < benchmark_iterations_; ++i) { \
1945
- FMT_PLANAR##To##FMT_B( \
1946
- reinterpret_cast<uint16_t*>(src_y + OFF), kWidth, \
1947
- reinterpret_cast<uint16_t*>(src_u + OFF), kStrideUV, \
1948
- reinterpret_cast<uint16_t*>(src_v + OFF), kStrideUV, \
1949
- reinterpret_cast<uint16_t*>(src_a + OFF), kWidth, \
1950
- dst_argb_opt + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \
1951
- } \
1952
- for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
1953
- EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \
1954
- } \
1955
- free_aligned_buffer_page_end(src_y); \
1956
- free_aligned_buffer_page_end(src_u); \
1957
- free_aligned_buffer_page_end(src_v); \
1958
- free_aligned_buffer_page_end(src_a); \
1959
- free_aligned_buffer_page_end(dst_argb_c); \
1960
- free_aligned_buffer_page_end(dst_argb_opt); \
1961
- }
1962
-
1963
- #if defined(ENABLE_FULL_TESTS)
1964
- #define TESTQPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1965
- ALIGN, YALIGN, S_DEPTH) \
1966
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1967
- YALIGN, benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \
1968
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1969
- YALIGN, benchmark_width_, _Unaligned, +, 2, 0, S_DEPTH) \
1970
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1971
- YALIGN, benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \
1972
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1973
- YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH) \
1974
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1975
- YALIGN, benchmark_width_, _Premult, +, 0, 1, S_DEPTH)
1976
- #else
1977
- #define TESTQPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
1978
- ALIGN, YALIGN, S_DEPTH) \
1979
- TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
1980
- YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
1981
- #endif
1982
-
1983
- #define I010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1984
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
1985
- l, m)
1986
- #define I010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1987
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
1988
- l, m)
1989
- #define J010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1990
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1991
- l, m)
1992
- #define J010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1993
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
1994
- l, m)
1995
- #define F010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1996
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
1997
- l, m)
1998
- #define F010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
1999
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2000
- l, m)
2001
- #define H010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2002
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2003
- l, m)
2004
- #define H010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2005
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2006
- l, m)
2007
- #define U010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2008
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2009
- l, m)
2010
- #define U010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2011
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2012
- l, m)
2013
- #define V010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2014
- I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2015
- l, m)
2016
- #define V010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2017
- I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2018
- l, m)
2019
- #define I210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2020
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2021
- l, m)
2022
- #define I210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2023
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2024
- l, m)
2025
- #define J210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2026
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2027
- l, m)
2028
- #define J210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2029
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2030
- l, m)
2031
- #define F210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2032
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2033
- l, m)
2034
- #define F210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2035
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2036
- l, m)
2037
- #define H210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2038
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2039
- l, m)
2040
- #define H210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2041
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2042
- l, m)
2043
- #define U210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2044
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2045
- l, m)
2046
- #define U210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2047
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2048
- l, m)
2049
- #define V210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2050
- I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2051
- l, m)
2052
- #define V210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2053
- I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2054
- l, m)
2055
- #define I410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2056
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2057
- l, m)
2058
- #define I410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2059
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \
2060
- l, m)
2061
- #define J410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2062
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2063
- l, m)
2064
- #define J410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2065
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \
2066
- l, m)
2067
- #define F410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2068
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2069
- l, m)
2070
- #define F410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2071
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \
2072
- l, m)
2073
- #define H410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2074
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2075
- l, m)
2076
- #define H410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2077
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \
2078
- l, m)
2079
- #define U410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2080
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2081
- l, m)
2082
- #define U410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2083
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \
2084
- l, m)
2085
- #define V410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2086
- I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2087
- l, m)
2088
- #define V410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2089
- I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \
2090
- l, m)
2091
- #define I010AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2092
- I010AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
2093
- &kYuvI601Constants, k, l, m, kFilterBilinear)
2094
- #define I210AlphaToARGBFilter(a, b, c, d, e, f, g, h, i, j, k, l, m) \
2095
- I010AlphaToARGBMatrixFilter(a, b, c, d, e, f, g, h, i, j, \
2096
- &kYuvI601Constants, k, l, m, kFilterBilinear)
2097
-
2098
- // These conversions are only optimized for x86
2099
- #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2100
- TESTQPLANAR16TOB(I010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2101
- TESTQPLANAR16TOB(I010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2102
- TESTQPLANAR16TOB(J010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2103
- TESTQPLANAR16TOB(J010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2104
- TESTQPLANAR16TOB(H010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2105
- TESTQPLANAR16TOB(H010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2106
- TESTQPLANAR16TOB(F010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2107
- TESTQPLANAR16TOB(F010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2108
- TESTQPLANAR16TOB(U010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2109
- TESTQPLANAR16TOB(U010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2110
- TESTQPLANAR16TOB(V010Alpha, 2, 2, ARGB, 4, 4, 1, 10)
2111
- TESTQPLANAR16TOB(V010Alpha, 2, 2, ABGR, 4, 4, 1, 10)
2112
- TESTQPLANAR16TOB(I210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2113
- TESTQPLANAR16TOB(I210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2114
- TESTQPLANAR16TOB(J210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2115
- TESTQPLANAR16TOB(J210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2116
- TESTQPLANAR16TOB(H210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2117
- TESTQPLANAR16TOB(H210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2118
- TESTQPLANAR16TOB(F210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2119
- TESTQPLANAR16TOB(F210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2120
- TESTQPLANAR16TOB(U210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2121
- TESTQPLANAR16TOB(U210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2122
- TESTQPLANAR16TOB(V210Alpha, 2, 1, ARGB, 4, 4, 1, 10)
2123
- TESTQPLANAR16TOB(V210Alpha, 2, 1, ABGR, 4, 4, 1, 10)
2124
- TESTQPLANAR16TOB(I410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2125
- TESTQPLANAR16TOB(I410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2126
- TESTQPLANAR16TOB(J410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2127
- TESTQPLANAR16TOB(J410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2128
- TESTQPLANAR16TOB(H410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2129
- TESTQPLANAR16TOB(H410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2130
- TESTQPLANAR16TOB(F410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2131
- TESTQPLANAR16TOB(F410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2132
- TESTQPLANAR16TOB(U410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2133
- TESTQPLANAR16TOB(U410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2134
- TESTQPLANAR16TOB(V410Alpha, 1, 1, ARGB, 4, 4, 1, 10)
2135
- TESTQPLANAR16TOB(V410Alpha, 1, 1, ABGR, 4, 4, 1, 10)
2136
- TESTQPLANAR16TOB(I010Alpha, 2, 2, ARGBFilter, 4, 4, 1, 10)
2137
- TESTQPLANAR16TOB(I210Alpha, 2, 1, ARGBFilter, 4, 4, 1, 10)
2138
- #endif // DISABLE_SLOW_TESTS
2139
-
2140
- #define TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2141
- YALIGN, W1280, N, NEG, SOFF, DOFF, S_DEPTH) \
2142
- TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \
2143
- const int kWidth = W1280; \
2144
- const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \
2145
- const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \
2146
- const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X) * 2; \
2147
- const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y) * 2; \
2148
- const int kBpc = 2; \
2149
- align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \
2150
- align_buffer_page_end(src_uv, kSizeUV* kBpc + SOFF); \
2151
- align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \
2152
- align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \
2153
- for (int i = 0; i < kWidth * kHeight; ++i) { \
2154
- reinterpret_cast<uint16_t*>(src_y + SOFF)[i] = \
2155
- (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \
2156
- } \
2157
- for (int i = 0; i < kSizeUV; ++i) { \
2158
- reinterpret_cast<uint16_t*>(src_uv + SOFF)[i] = \
2159
- (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \
2160
- } \
2161
- memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \
2162
- memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \
2163
- MaskCpuFlags(disable_cpu_flags_); \
2164
- FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
2165
- reinterpret_cast<uint16_t*>(src_uv + SOFF), \
2166
- kStrideUV, dst_argb_c + DOFF, kStrideB, kWidth, \
2167
- NEG kHeight); \
2168
- MaskCpuFlags(benchmark_cpu_info_); \
2169
- for (int i = 0; i < benchmark_iterations_; ++i) { \
2170
- FMT_PLANAR##To##FMT_B(reinterpret_cast<uint16_t*>(src_y + SOFF), kWidth, \
2171
- reinterpret_cast<uint16_t*>(src_uv + SOFF), \
2172
- kStrideUV, dst_argb_opt + DOFF, kStrideB, kWidth, \
2173
- NEG kHeight); \
2174
- } \
2175
- for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \
2176
- EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \
2177
- } \
2178
- free_aligned_buffer_page_end(src_y); \
2179
- free_aligned_buffer_page_end(src_uv); \
2180
- free_aligned_buffer_page_end(dst_argb_c); \
2181
- free_aligned_buffer_page_end(dst_argb_opt); \
2182
- }
2183
-
2184
- #if defined(ENABLE_FULL_TESTS)
2185
- #define TESTBP16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2186
- YALIGN, S_DEPTH) \
2187
- TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2188
- benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \
2189
- TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2190
- benchmark_width_, _Unaligned, +, 4, 4, S_DEPTH) \
2191
- TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2192
- benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \
2193
- TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2194
- benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
2195
- #else
2196
- #define TESTBP16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \
2197
- YALIGN, S_DEPTH) \
2198
- TESTBP16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, YALIGN, \
2199
- benchmark_width_, _Opt, +, 0, 0, S_DEPTH)
2200
- #endif
2201
-
2202
- #define P010ToARGB(a, b, c, d, e, f, g, h) \
2203
- P010ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2204
- #define P210ToARGB(a, b, c, d, e, f, g, h) \
2205
- P210ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2206
- #define P010ToAR30(a, b, c, d, e, f, g, h) \
2207
- P010ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2208
- #define P210ToAR30(a, b, c, d, e, f, g, h) \
2209
- P210ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2210
-
2211
- #define P012ToARGB(a, b, c, d, e, f, g, h) \
2212
- P012ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2213
- #define P212ToARGB(a, b, c, d, e, f, g, h) \
2214
- P212ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2215
- #define P012ToAR30(a, b, c, d, e, f, g, h) \
2216
- P012ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2217
- #define P212ToAR30(a, b, c, d, e, f, g, h) \
2218
- P212ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2219
-
2220
- #define P016ToARGB(a, b, c, d, e, f, g, h) \
2221
- P016ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2222
- #define P216ToARGB(a, b, c, d, e, f, g, h) \
2223
- P216ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2224
- #define P016ToAR30(a, b, c, d, e, f, g, h) \
2225
- P016ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2226
- #define P216ToAR30(a, b, c, d, e, f, g, h) \
2227
- P216ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h)
2228
-
2229
- #define P010ToARGBFilter(a, b, c, d, e, f, g, h) \
2230
- P010ToARGBMatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2231
- kFilterBilinear)
2232
- #define P210ToARGBFilter(a, b, c, d, e, f, g, h) \
2233
- P210ToARGBMatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2234
- kFilterBilinear)
2235
- #define P010ToAR30Filter(a, b, c, d, e, f, g, h) \
2236
- P010ToAR30MatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2237
- kFilterBilinear)
2238
- #define P210ToAR30Filter(a, b, c, d, e, f, g, h) \
2239
- P210ToAR30MatrixFilter(a, b, c, d, e, f, &kYuvH709Constants, g, h, \
2240
- kFilterBilinear)
2241
-
2242
- #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2243
- TESTBP16TOB(P010, 2, 2, ARGB, 4, 4, 1, 10)
2244
- TESTBP16TOB(P210, 2, 1, ARGB, 4, 4, 1, 10)
2245
- TESTBP16TOB(P012, 2, 2, ARGB, 4, 4, 1, 12)
2246
- TESTBP16TOB(P212, 2, 1, ARGB, 4, 4, 1, 12)
2247
- TESTBP16TOB(P016, 2, 2, ARGB, 4, 4, 1, 16)
2248
- TESTBP16TOB(P216, 2, 1, ARGB, 4, 4, 1, 16)
2249
- TESTBP16TOB(P010, 2, 2, ARGBFilter, 4, 4, 1, 10)
2250
- TESTBP16TOB(P210, 2, 1, ARGBFilter, 4, 4, 1, 10)
2251
- #ifdef LITTLE_ENDIAN_ONLY_TEST
2252
- TESTBP16TOB(P010, 2, 2, AR30, 4, 4, 1, 10)
2253
- TESTBP16TOB(P210, 2, 1, AR30, 4, 4, 1, 10)
2254
- TESTBP16TOB(P012, 2, 2, AR30, 4, 4, 1, 12)
2255
- TESTBP16TOB(P212, 2, 1, AR30, 4, 4, 1, 12)
2256
- TESTBP16TOB(P016, 2, 2, AR30, 4, 4, 1, 16)
2257
- TESTBP16TOB(P216, 2, 1, AR30, 4, 4, 1, 16)
2258
- TESTBP16TOB(P010, 2, 2, AR30Filter, 4, 4, 1, 10)
2259
- TESTBP16TOB(P210, 2, 1, AR30Filter, 4, 4, 1, 10)
2260
- #endif // LITTLE_ENDIAN_ONLY_TEST
2261
- #endif // DISABLE_SLOW_TESTS
2262
-
2263
- static int Clamp(int y) {
2264
- if (y < 0) {
2265
- y = 0;
2266
- }
2267
- if (y > 255) {
2268
- y = 255;
2269
- }
2270
- return y;
2271
- }
2272
-
2273
- static int Clamp10(int y) {
2274
- if (y < 0) {
2275
- y = 0;
2276
- }
2277
- if (y > 1023) {
2278
- y = 1023;
2279
- }
2280
- return y;
2281
- }
2282
-
2283
- // Test 8 bit YUV to 8 bit RGB
2284
- TEST_F(LibYUVConvertTest, TestH420ToARGB) {
2285
- const int kSize = 256;
2286
- int histogram_b[256];
2287
- int histogram_g[256];
2288
- int histogram_r[256];
2289
- memset(histogram_b, 0, sizeof(histogram_b));
2290
- memset(histogram_g, 0, sizeof(histogram_g));
2291
- memset(histogram_r, 0, sizeof(histogram_r));
2292
- align_buffer_page_end(orig_yuv, kSize + kSize / 2 * 2);
2293
- align_buffer_page_end(argb_pixels, kSize * 4);
2294
- uint8_t* orig_y = orig_yuv;
2295
- uint8_t* orig_u = orig_y + kSize;
2296
- uint8_t* orig_v = orig_u + kSize / 2;
2297
-
2298
- // Test grey scale
2299
- for (int i = 0; i < kSize; ++i) {
2300
- orig_y[i] = i;
2301
- }
2302
- for (int i = 0; i < kSize / 2; ++i) {
2303
- orig_u[i] = 128; // 128 is 0.
2304
- orig_v[i] = 128;
2305
- }
2306
-
2307
- H420ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1);
2308
-
2309
- for (int i = 0; i < kSize; ++i) {
2310
- int b = argb_pixels[i * 4 + 0];
2311
- int g = argb_pixels[i * 4 + 1];
2312
- int r = argb_pixels[i * 4 + 2];
2313
- int a = argb_pixels[i * 4 + 3];
2314
- ++histogram_b[b];
2315
- ++histogram_g[g];
2316
- ++histogram_r[r];
2317
- // Reference formula for Y channel contribution in YUV to RGB conversions:
2318
- int expected_y = Clamp(static_cast<int>((i - 16) * 1.164f + 0.5f));
2319
- EXPECT_EQ(b, expected_y);
2320
- EXPECT_EQ(g, expected_y);
2321
- EXPECT_EQ(r, expected_y);
2322
- EXPECT_EQ(a, 255);
2323
- }
2324
-
2325
- int count_b = 0;
2326
- int count_g = 0;
2327
- int count_r = 0;
2328
- for (int i = 0; i < kSize; ++i) {
2329
- if (histogram_b[i]) {
2330
- ++count_b;
2331
- }
2332
- if (histogram_g[i]) {
2333
- ++count_g;
2334
- }
2335
- if (histogram_r[i]) {
2336
- ++count_r;
2337
- }
2338
- }
2339
- printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2340
-
2341
- free_aligned_buffer_page_end(orig_yuv);
2342
- free_aligned_buffer_page_end(argb_pixels);
2343
- }
2344
-
2345
- // Test 10 bit YUV to 8 bit RGB
2346
- TEST_F(LibYUVConvertTest, TestH010ToARGB) {
2347
- const int kSize = 1024;
2348
- int histogram_b[1024];
2349
- int histogram_g[1024];
2350
- int histogram_r[1024];
2351
- memset(histogram_b, 0, sizeof(histogram_b));
2352
- memset(histogram_g, 0, sizeof(histogram_g));
2353
- memset(histogram_r, 0, sizeof(histogram_r));
2354
- align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2355
- align_buffer_page_end(argb_pixels, kSize * 4);
2356
- uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2357
- uint16_t* orig_u = orig_y + kSize;
2358
- uint16_t* orig_v = orig_u + kSize / 2;
2359
-
2360
- // Test grey scale
2361
- for (int i = 0; i < kSize; ++i) {
2362
- orig_y[i] = i;
2363
- }
2364
- for (int i = 0; i < kSize / 2; ++i) {
2365
- orig_u[i] = 512; // 512 is 0.
2366
- orig_v[i] = 512;
2367
- }
2368
-
2369
- H010ToARGB(orig_y, 0, orig_u, 0, orig_v, 0, argb_pixels, 0, kSize, 1);
2370
-
2371
- for (int i = 0; i < kSize; ++i) {
2372
- int b = argb_pixels[i * 4 + 0];
2373
- int g = argb_pixels[i * 4 + 1];
2374
- int r = argb_pixels[i * 4 + 2];
2375
- int a = argb_pixels[i * 4 + 3];
2376
- ++histogram_b[b];
2377
- ++histogram_g[g];
2378
- ++histogram_r[r];
2379
- int expected_y = Clamp(static_cast<int>((i - 64) * 1.164f / 4));
2380
- EXPECT_NEAR(b, expected_y, 1);
2381
- EXPECT_NEAR(g, expected_y, 1);
2382
- EXPECT_NEAR(r, expected_y, 1);
2383
- EXPECT_EQ(a, 255);
2384
- }
2385
-
2386
- int count_b = 0;
2387
- int count_g = 0;
2388
- int count_r = 0;
2389
- for (int i = 0; i < kSize; ++i) {
2390
- if (histogram_b[i]) {
2391
- ++count_b;
2392
- }
2393
- if (histogram_g[i]) {
2394
- ++count_g;
2395
- }
2396
- if (histogram_r[i]) {
2397
- ++count_r;
2398
- }
2399
- }
2400
- printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2401
-
2402
- free_aligned_buffer_page_end(orig_yuv);
2403
- free_aligned_buffer_page_end(argb_pixels);
2404
- }
2405
-
2406
- // Test 10 bit YUV to 10 bit RGB
2407
- // Caveat: Result is near due to float rounding in expected
2408
- // result.
2409
- TEST_F(LibYUVConvertTest, TestH010ToAR30) {
2410
- const int kSize = 1024;
2411
- int histogram_b[1024];
2412
- int histogram_g[1024];
2413
- int histogram_r[1024];
2414
- memset(histogram_b, 0, sizeof(histogram_b));
2415
- memset(histogram_g, 0, sizeof(histogram_g));
2416
- memset(histogram_r, 0, sizeof(histogram_r));
2417
-
2418
- align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2419
- align_buffer_page_end(ar30_pixels, kSize * 4);
2420
- uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2421
- uint16_t* orig_u = orig_y + kSize;
2422
- uint16_t* orig_v = orig_u + kSize / 2;
2423
-
2424
- // Test grey scale
2425
- for (int i = 0; i < kSize; ++i) {
2426
- orig_y[i] = i;
2427
- }
2428
- for (int i = 0; i < kSize / 2; ++i) {
2429
- orig_u[i] = 512; // 512 is 0.
2430
- orig_v[i] = 512;
2431
- }
2432
-
2433
- H010ToAR30(orig_y, 0, orig_u, 0, orig_v, 0, ar30_pixels, 0, kSize, 1);
2434
-
2435
- for (int i = 0; i < kSize; ++i) {
2436
- int b10 = reinterpret_cast<uint32_t*>(ar30_pixels)[i] & 1023;
2437
- int g10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 10) & 1023;
2438
- int r10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 20) & 1023;
2439
- int a2 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 30) & 3;
2440
- ++histogram_b[b10];
2441
- ++histogram_g[g10];
2442
- ++histogram_r[r10];
2443
- int expected_y = Clamp10(static_cast<int>((i - 64) * 1.164f + 0.5));
2444
- EXPECT_NEAR(b10, expected_y, 4);
2445
- EXPECT_NEAR(g10, expected_y, 4);
2446
- EXPECT_NEAR(r10, expected_y, 4);
2447
- EXPECT_EQ(a2, 3);
2448
- }
2449
-
2450
- int count_b = 0;
2451
- int count_g = 0;
2452
- int count_r = 0;
2453
- for (int i = 0; i < kSize; ++i) {
2454
- if (histogram_b[i]) {
2455
- ++count_b;
2456
- }
2457
- if (histogram_g[i]) {
2458
- ++count_g;
2459
- }
2460
- if (histogram_r[i]) {
2461
- ++count_r;
2462
- }
2463
- }
2464
- printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2465
-
2466
- free_aligned_buffer_page_end(orig_yuv);
2467
- free_aligned_buffer_page_end(ar30_pixels);
2468
- }
2469
-
2470
- // Test 10 bit YUV to 10 bit RGB
2471
- // Caveat: Result is near due to float rounding in expected
2472
- // result.
2473
- TEST_F(LibYUVConvertTest, TestH010ToAB30) {
2474
- const int kSize = 1024;
2475
- int histogram_b[1024];
2476
- int histogram_g[1024];
2477
- int histogram_r[1024];
2478
- memset(histogram_b, 0, sizeof(histogram_b));
2479
- memset(histogram_g, 0, sizeof(histogram_g));
2480
- memset(histogram_r, 0, sizeof(histogram_r));
2481
-
2482
- align_buffer_page_end(orig_yuv, kSize * 2 + kSize / 2 * 2 * 2);
2483
- align_buffer_page_end(ab30_pixels, kSize * 4);
2484
- uint16_t* orig_y = reinterpret_cast<uint16_t*>(orig_yuv);
2485
- uint16_t* orig_u = orig_y + kSize;
2486
- uint16_t* orig_v = orig_u + kSize / 2;
2487
-
2488
- // Test grey scale
2489
- for (int i = 0; i < kSize; ++i) {
2490
- orig_y[i] = i;
2491
- }
2492
- for (int i = 0; i < kSize / 2; ++i) {
2493
- orig_u[i] = 512; // 512 is 0.
2494
- orig_v[i] = 512;
2495
- }
2496
-
2497
- H010ToAB30(orig_y, 0, orig_u, 0, orig_v, 0, ab30_pixels, 0, kSize, 1);
2498
-
2499
- for (int i = 0; i < kSize; ++i) {
2500
- int r10 = reinterpret_cast<uint32_t*>(ab30_pixels)[i] & 1023;
2501
- int g10 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 10) & 1023;
2502
- int b10 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 20) & 1023;
2503
- int a2 = (reinterpret_cast<uint32_t*>(ab30_pixels)[i] >> 30) & 3;
2504
- ++histogram_b[b10];
2505
- ++histogram_g[g10];
2506
- ++histogram_r[r10];
2507
- int expected_y = Clamp10(static_cast<int>((i - 64) * 1.164f));
2508
- EXPECT_NEAR(b10, expected_y, 4);
2509
- EXPECT_NEAR(g10, expected_y, 4);
2510
- EXPECT_NEAR(r10, expected_y, 4);
2511
- EXPECT_EQ(a2, 3);
2512
- }
2513
-
2514
- int count_b = 0;
2515
- int count_g = 0;
2516
- int count_r = 0;
2517
- for (int i = 0; i < kSize; ++i) {
2518
- if (histogram_b[i]) {
2519
- ++count_b;
2520
- }
2521
- if (histogram_g[i]) {
2522
- ++count_g;
2523
- }
2524
- if (histogram_r[i]) {
2525
- ++count_r;
2526
- }
2527
- }
2528
- printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2529
-
2530
- free_aligned_buffer_page_end(orig_yuv);
2531
- free_aligned_buffer_page_end(ab30_pixels);
2532
- }
2533
-
2534
- // Test 8 bit YUV to 10 bit RGB
2535
- TEST_F(LibYUVConvertTest, TestH420ToAR30) {
2536
- const int kSize = 256;
2537
- const int kHistSize = 1024;
2538
- int histogram_b[kHistSize];
2539
- int histogram_g[kHistSize];
2540
- int histogram_r[kHistSize];
2541
- memset(histogram_b, 0, sizeof(histogram_b));
2542
- memset(histogram_g, 0, sizeof(histogram_g));
2543
- memset(histogram_r, 0, sizeof(histogram_r));
2544
- align_buffer_page_end(orig_yuv, kSize + kSize / 2 * 2);
2545
- align_buffer_page_end(ar30_pixels, kSize * 4);
2546
- uint8_t* orig_y = orig_yuv;
2547
- uint8_t* orig_u = orig_y + kSize;
2548
- uint8_t* orig_v = orig_u + kSize / 2;
2549
-
2550
- // Test grey scale
2551
- for (int i = 0; i < kSize; ++i) {
2552
- orig_y[i] = i;
2553
- }
2554
- for (int i = 0; i < kSize / 2; ++i) {
2555
- orig_u[i] = 128; // 128 is 0.
2556
- orig_v[i] = 128;
2557
- }
2558
-
2559
- H420ToAR30(orig_y, 0, orig_u, 0, orig_v, 0, ar30_pixels, 0, kSize, 1);
2560
-
2561
- for (int i = 0; i < kSize; ++i) {
2562
- int b10 = reinterpret_cast<uint32_t*>(ar30_pixels)[i] & 1023;
2563
- int g10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 10) & 1023;
2564
- int r10 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 20) & 1023;
2565
- int a2 = (reinterpret_cast<uint32_t*>(ar30_pixels)[i] >> 30) & 3;
2566
- ++histogram_b[b10];
2567
- ++histogram_g[g10];
2568
- ++histogram_r[r10];
2569
- int expected_y = Clamp10(static_cast<int>((i - 16) * 1.164f * 4.f));
2570
- EXPECT_NEAR(b10, expected_y, 4);
2571
- EXPECT_NEAR(g10, expected_y, 4);
2572
- EXPECT_NEAR(r10, expected_y, 4);
2573
- EXPECT_EQ(a2, 3);
2574
- }
2575
-
2576
- int count_b = 0;
2577
- int count_g = 0;
2578
- int count_r = 0;
2579
- for (int i = 0; i < kHistSize; ++i) {
2580
- if (histogram_b[i]) {
2581
- ++count_b;
2582
- }
2583
- if (histogram_g[i]) {
2584
- ++count_g;
2585
- }
2586
- if (histogram_r[i]) {
2587
- ++count_r;
2588
- }
2589
- }
2590
- printf("uniques: B %d, G, %d, R %d\n", count_b, count_g, count_r);
2591
-
2592
- free_aligned_buffer_page_end(orig_yuv);
2593
- free_aligned_buffer_page_end(ar30_pixels);
2594
- }
2595
-
2596
- // Test I400 with jpeg matrix is same as J400
2597
- TEST_F(LibYUVConvertTest, TestI400) {
2598
- const int kSize = 256;
2599
- align_buffer_page_end(orig_i400, kSize);
2600
- align_buffer_page_end(argb_pixels_i400, kSize * 4);
2601
- align_buffer_page_end(argb_pixels_j400, kSize * 4);
2602
- align_buffer_page_end(argb_pixels_jpeg_i400, kSize * 4);
2603
- align_buffer_page_end(argb_pixels_h709_i400, kSize * 4);
2604
- align_buffer_page_end(argb_pixels_2020_i400, kSize * 4);
2605
-
2606
- // Test grey scale
2607
- for (int i = 0; i < kSize; ++i) {
2608
- orig_i400[i] = i;
2609
- }
2610
-
2611
- J400ToARGB(orig_i400, 0, argb_pixels_j400, 0, kSize, 1);
2612
- I400ToARGB(orig_i400, 0, argb_pixels_i400, 0, kSize, 1);
2613
- I400ToARGBMatrix(orig_i400, 0, argb_pixels_jpeg_i400, 0, &kYuvJPEGConstants,
2614
- kSize, 1);
2615
- I400ToARGBMatrix(orig_i400, 0, argb_pixels_h709_i400, 0, &kYuvH709Constants,
2616
- kSize, 1);
2617
- I400ToARGBMatrix(orig_i400, 0, argb_pixels_2020_i400, 0, &kYuv2020Constants,
2618
- kSize, 1);
2619
-
2620
- EXPECT_EQ(0, argb_pixels_i400[0]);
2621
- EXPECT_EQ(0, argb_pixels_j400[0]);
2622
- EXPECT_EQ(0, argb_pixels_jpeg_i400[0]);
2623
- EXPECT_EQ(0, argb_pixels_h709_i400[0]);
2624
- EXPECT_EQ(0, argb_pixels_2020_i400[0]);
2625
- EXPECT_EQ(0, argb_pixels_i400[16 * 4]);
2626
- EXPECT_EQ(16, argb_pixels_j400[16 * 4]);
2627
- EXPECT_EQ(16, argb_pixels_jpeg_i400[16 * 4]);
2628
- EXPECT_EQ(0, argb_pixels_h709_i400[16 * 4]);
2629
- EXPECT_EQ(0, argb_pixels_2020_i400[16 * 4]);
2630
- EXPECT_EQ(130, argb_pixels_i400[128 * 4]);
2631
- EXPECT_EQ(128, argb_pixels_j400[128 * 4]);
2632
- EXPECT_EQ(128, argb_pixels_jpeg_i400[128 * 4]);
2633
- EXPECT_EQ(130, argb_pixels_h709_i400[128 * 4]);
2634
- EXPECT_EQ(130, argb_pixels_2020_i400[128 * 4]);
2635
- EXPECT_EQ(255, argb_pixels_i400[255 * 4]);
2636
- EXPECT_EQ(255, argb_pixels_j400[255 * 4]);
2637
- EXPECT_EQ(255, argb_pixels_jpeg_i400[255 * 4]);
2638
- EXPECT_EQ(255, argb_pixels_h709_i400[255 * 4]);
2639
- EXPECT_EQ(255, argb_pixels_2020_i400[255 * 4]);
2640
-
2641
- for (int i = 0; i < kSize * 4; ++i) {
2642
- if ((i & 3) == 3) {
2643
- EXPECT_EQ(255, argb_pixels_j400[i]);
2644
- } else {
2645
- EXPECT_EQ(i / 4, argb_pixels_j400[i]);
2646
- }
2647
- EXPECT_EQ(argb_pixels_jpeg_i400[i], argb_pixels_j400[i]);
2648
- }
2649
-
2650
- free_aligned_buffer_page_end(orig_i400);
2651
- free_aligned_buffer_page_end(argb_pixels_i400);
2652
- free_aligned_buffer_page_end(argb_pixels_j400);
2653
- free_aligned_buffer_page_end(argb_pixels_jpeg_i400);
2654
- free_aligned_buffer_page_end(argb_pixels_h709_i400);
2655
- free_aligned_buffer_page_end(argb_pixels_2020_i400);
2656
- }
2657
-
2658
- // Test RGB24 to ARGB and back to RGB24
2659
- TEST_F(LibYUVConvertTest, TestARGBToRGB24) {
2660
- const int kSize = 256;
2661
- align_buffer_page_end(orig_rgb24, kSize * 3);
2662
- align_buffer_page_end(argb_pixels, kSize * 4);
2663
- align_buffer_page_end(dest_rgb24, kSize * 3);
2664
-
2665
- // Test grey scale
2666
- for (int i = 0; i < kSize * 3; ++i) {
2667
- orig_rgb24[i] = i;
2668
- }
2669
-
2670
- RGB24ToARGB(orig_rgb24, 0, argb_pixels, 0, kSize, 1);
2671
- ARGBToRGB24(argb_pixels, 0, dest_rgb24, 0, kSize, 1);
2672
-
2673
- for (int i = 0; i < kSize * 3; ++i) {
2674
- EXPECT_EQ(orig_rgb24[i], dest_rgb24[i]);
2675
- }
2676
-
2677
- free_aligned_buffer_page_end(orig_rgb24);
2678
- free_aligned_buffer_page_end(argb_pixels);
2679
- free_aligned_buffer_page_end(dest_rgb24);
2680
- }
2681
-
2682
- TEST_F(LibYUVConvertTest, TestARGBToRGB565) {
2683
- SIMD_ALIGNED(uint8_t orig_pixels[256][4]);
2684
- SIMD_ALIGNED(uint8_t dest_rgb565[256][2]);
2685
-
2686
- for (int i = 0; i < 256; ++i) {
2687
- for (int j = 0; j < 4; ++j) {
2688
- orig_pixels[i][j] = i;
2689
- }
2690
- }
2691
- ARGBToRGB565(&orig_pixels[0][0], 0, &dest_rgb565[0][0], 0, 256, 1);
2692
- uint32_t checksum = HashDjb2(&dest_rgb565[0][0], sizeof(dest_rgb565), 5381);
2693
- EXPECT_EQ(610919429u, checksum);
2694
- }
2695
-
2696
- TEST_F(LibYUVConvertTest, TestYUY2ToARGB) {
2697
- SIMD_ALIGNED(uint8_t orig_pixels[256][2]);
2698
- SIMD_ALIGNED(uint8_t dest_argb[256][4]);
2699
-
2700
- for (int i = 0; i < 256; ++i) {
2701
- for (int j = 0; j < 2; ++j) {
2702
- orig_pixels[i][j] = i;
2703
- }
2704
- }
2705
- YUY2ToARGB(&orig_pixels[0][0], 0, &dest_argb[0][0], 0, 256, 1);
2706
- uint32_t checksum = HashDjb2(&dest_argb[0][0], sizeof(dest_argb), 5381);
2707
- EXPECT_EQ(3486643515u, checksum);
2708
- }
2709
-
2710
- TEST_F(LibYUVConvertTest, TestUYVYToARGB) {
2711
- SIMD_ALIGNED(uint8_t orig_pixels[256][2]);
2712
- SIMD_ALIGNED(uint8_t dest_argb[256][4]);
2713
-
2714
- for (int i = 0; i < 256; ++i) {
2715
- for (int j = 0; j < 2; ++j) {
2716
- orig_pixels[i][j] = i;
2717
- }
2718
- }
2719
- UYVYToARGB(&orig_pixels[0][0], 0, &dest_argb[0][0], 0, 256, 1);
2720
- uint32_t checksum = HashDjb2(&dest_argb[0][0], sizeof(dest_argb), 5381);
2721
- EXPECT_EQ(3486643515u, checksum);
2722
- }
2723
-
2724
- #ifdef ENABLE_ROW_TESTS
2725
- TEST_F(LibYUVConvertTest, TestARGBToUVRow) {
2726
- SIMD_ALIGNED(uint8_t orig_argb_pixels[256]);
2727
- SIMD_ALIGNED(uint8_t dest_u[32]);
2728
- SIMD_ALIGNED(uint8_t dest_v[32]);
2729
-
2730
- for (int i = 0; i < 256; ++i) {
2731
- orig_argb_pixels[i] = i * 43;
2732
- }
2733
-
2734
- orig_argb_pixels[0] = 0xff; // blue
2735
- orig_argb_pixels[1] = 0x0;
2736
- orig_argb_pixels[2] = 0x0;
2737
- orig_argb_pixels[3] = 0xff;
2738
- orig_argb_pixels[4] = 0xff; // blue
2739
- orig_argb_pixels[5] = 0x0;
2740
- orig_argb_pixels[6] = 0x0;
2741
- orig_argb_pixels[7] = 0xff;
2742
-
2743
- orig_argb_pixels[8] = 0x0;
2744
- orig_argb_pixels[9] = 0xff; // green
2745
- orig_argb_pixels[10] = 0x0;
2746
- orig_argb_pixels[11] = 0xff;
2747
- orig_argb_pixels[12] = 0x0;
2748
- orig_argb_pixels[13] = 0xff; // green
2749
- orig_argb_pixels[14] = 0x0;
2750
- orig_argb_pixels[15] = 0xff;
2751
-
2752
- orig_argb_pixels[16] = 0x0;
2753
- orig_argb_pixels[17] = 0x0;
2754
- orig_argb_pixels[18] = 0xff; // red
2755
- orig_argb_pixels[19] = 0xff;
2756
- orig_argb_pixels[20] = 0x0;
2757
- orig_argb_pixels[21] = 0x0;
2758
- orig_argb_pixels[22] = 0xff; // red
2759
- orig_argb_pixels[23] = 0xff;
2760
-
2761
- orig_argb_pixels[24] = 0xff;
2762
- orig_argb_pixels[25] = 0xff;
2763
- orig_argb_pixels[26] = 0xff; // white
2764
- orig_argb_pixels[27] = 0xff;
2765
- orig_argb_pixels[28] = 0xff;
2766
- orig_argb_pixels[29] = 0xff;
2767
- orig_argb_pixels[30] = 0xff; // white
2768
- orig_argb_pixels[31] = 0xff;
2769
-
2770
- int benchmark_iterations =
2771
- benchmark_width_ * benchmark_height_ * benchmark_iterations_ / 32;
2772
-
2773
- for (int i = 0; i < benchmark_iterations; ++i) {
2774
- #if defined(HAS_ARGBTOUVROW_AVX2)
2775
- int has_avx2 = TestCpuFlag(kCpuHasAVX2);
2776
- if (has_avx2) {
2777
- ARGBToUVRow_AVX2(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
2778
- } else {
2779
- ARGBToUVRow_C(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
2780
- }
2781
- #elif defined(HAS_ARGBTOUVROW_NEON)
2782
- ARGBToUVRow_NEON(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
2783
- #else
2784
- ARGBToUVRow_C(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
2785
- #endif
2786
- }
2787
- printf("u: ");
2788
- for (int i = 0; i < 32; ++i) {
2789
- printf("%3d ", (int)dest_u[i]);
2790
- }
2791
- printf("\nv: ");
2792
- for (int i = 0; i < 32; ++i) {
2793
- printf("%3d ", (int)dest_v[i]);
2794
- }
2795
- printf("\n");
2796
-
2797
- uint32_t checksum_u = HashDjb2(&dest_u[0], sizeof(dest_u), 5381);
2798
- EXPECT_EQ(192508756u, checksum_u);
2799
- uint32_t checksum_v = HashDjb2(&dest_v[0], sizeof(dest_v), 5381);
2800
- EXPECT_EQ(2590663990u, checksum_v);
2801
- }
2802
- #endif
2803
-
2804
- #if !defined(DISABLE_SLOW_TESTS) && \
2805
- (defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__))
2806
- // TODO(fbarchard): Consider _set_new_mode(0) to make malloc return NULL
2807
-
2808
- TEST_F(LibYUVConvertTest, TestI400LargeSize) {
2809
- // The width and height are chosen as follows:
2810
- // - kWidth * kHeight is not a multiple of 8: This lets us to use the Any
2811
- // variant of the conversion function.
2812
- const int kWidth = 1073741823;
2813
- const int kHeight = 2;
2814
-
2815
- #if defined(__aarch64__)
2816
- // Infer malloc can accept a large size for cpu with dot product (a76/a55)
2817
- int has_large_malloc = TestCpuFlag(kCpuHasNeonDotProd);
2818
- #else
2819
- int has_large_malloc = 1;
2820
- #endif
2821
- if (!has_large_malloc) {
2822
- printf("WARNING: Skipped. Large allocation may assert for %zd\n",
2823
- (size_t)kWidth * kHeight);
2824
- return;
2825
- }
2826
-
2827
- // Allocate one extra column so that the coalesce optimizations do not trigger
2828
- // in convert_argb.cc (they are triggered only when stride is equal to width).
2829
- const size_t kStride = kWidth + 1;
2830
-
2831
- printf("WARNING: attempting to allocate I400 image of %zd bytes\n",
2832
- (size_t)kWidth * kHeight);
2833
- fflush(stdout);
2834
- align_buffer_page_end(orig_i400, (size_t)kWidth * kHeight);
2835
- if (!orig_i400) {
2836
- printf("WARNING: unable to allocate I400 image of %zd bytes\n",
2837
- (size_t)kWidth * kHeight);
2838
- fflush(stdout);
2839
- return;
2840
- }
2841
- printf("INFO: allocate I400 image returned %p\n", orig_i400);
2842
- fflush(stdout);
2843
- align_buffer_page_end(dest_argb, (size_t)kWidth * kHeight * 4);
2844
- if (!dest_argb) {
2845
- printf("WARNING: unable to allocate ARGB image of %zd bytes\n",
2846
- (size_t)kWidth * kHeight * 4);
2847
- fflush(stdout);
2848
- free_aligned_buffer_page_end(orig_i400);
2849
- return;
2850
- }
2851
- printf("INFO: allocate ARGB image returned %p\n", dest_argb);
2852
- fflush(stdout);
2853
- for (int i = 0; i < kWidth * kHeight; ++i) {
2854
- orig_i400[i] = i % 256;
2855
- }
2856
- EXPECT_EQ(I400ToARGBMatrix(orig_i400, kStride, dest_argb, kWidth,
2857
- &kYuvJPEGConstants, kWidth, kHeight),
2858
- 0);
2859
- free_aligned_buffer_page_end(dest_argb);
2860
- free_aligned_buffer_page_end(orig_i400);
2861
- }
2862
- #endif // !defined(DISABLE_SLOW_TESTS) && \
2863
- // (defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__))
2864
-
2865
- #endif // !defined(LEAN_TESTS)
2866
-
2867
- } // namespace libyuv