react-native-vision-camera-spoof-detector 1.0.22 → 1.0.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 (206) hide show
  1. package/README.md +442 -442
  2. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  3. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  4. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  5. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  6. package/android/.gradle/buildOutputCleanup/cache.properties +2 -2
  7. package/android/build/reports/problems/problems-report.html +659 -0
  8. package/android/build.gradle +12 -4
  9. package/android/src/main/cpp/CMakeLists.txt +101 -94
  10. package/android/src/main/cpp/libyuv/.clang-format +6 -6
  11. package/android/src/main/cpp/libyuv/.gn +40 -40
  12. package/android/src/main/cpp/libyuv/.vpython3 +410 -410
  13. package/android/src/main/cpp/libyuv/AUTHORS +7 -7
  14. package/android/src/main/cpp/libyuv/Android.bp +202 -202
  15. package/android/src/main/cpp/libyuv/Android.mk +106 -106
  16. package/android/src/main/cpp/libyuv/BUILD.gn +490 -490
  17. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +70 -70
  18. package/android/src/main/cpp/libyuv/CMakeLists.txt +259 -252
  19. package/android/src/main/cpp/libyuv/DEPS +935 -935
  20. package/android/src/main/cpp/libyuv/DIR_METADATA +3 -3
  21. package/android/src/main/cpp/libyuv/LICENSE +29 -29
  22. package/android/src/main/cpp/libyuv/OWNERS +11 -11
  23. package/android/src/main/cpp/libyuv/PATENTS +23 -23
  24. package/android/src/main/cpp/libyuv/PRESUBMIT.py +65 -65
  25. package/android/src/main/cpp/libyuv/README.chromium +11 -11
  26. package/android/src/main/cpp/libyuv/README.md +19 -19
  27. package/android/src/main/cpp/libyuv/build_overrides/build.gni +60 -60
  28. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +19 -19
  29. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +17 -17
  30. package/android/src/main/cpp/libyuv/codereview.settings +5 -5
  31. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +409 -409
  32. package/android/src/main/cpp/libyuv/docs/environment_variables.md +64 -64
  33. package/android/src/main/cpp/libyuv/docs/feature_detection.md +108 -108
  34. package/android/src/main/cpp/libyuv/docs/filtering.md +196 -196
  35. package/android/src/main/cpp/libyuv/docs/formats.md +208 -208
  36. package/android/src/main/cpp/libyuv/docs/getting_started.md +296 -296
  37. package/android/src/main/cpp/libyuv/docs/rotation.md +107 -107
  38. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +29 -29
  39. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +68 -68
  40. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +111 -111
  41. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +112 -112
  42. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +1117 -1117
  43. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +2335 -2335
  44. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +203 -203
  45. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +394 -394
  46. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +147 -147
  47. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +99 -99
  48. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +1949 -1949
  49. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +195 -195
  50. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +1131 -1131
  51. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +296 -296
  52. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +37 -37
  53. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +265 -265
  54. package/android/src/main/cpp/libyuv/include/libyuv/row.h +6738 -6738
  55. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +2154 -2154
  56. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +336 -336
  57. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +76 -76
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +42 -42
  59. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +1726 -1726
  60. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +51 -51
  61. package/android/src/main/cpp/libyuv/include/libyuv/version.h +16 -16
  62. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +222 -222
  63. package/android/src/main/cpp/libyuv/include/libyuv.h +33 -33
  64. package/android/src/main/cpp/libyuv/infra/config/OWNERS +3 -3
  65. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +17 -17
  66. package/android/src/main/cpp/libyuv/infra/config/README.md +2 -2
  67. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +6 -6
  68. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +144 -144
  69. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +1185 -1185
  70. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +9 -9
  71. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +246 -246
  72. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +385 -385
  73. package/android/src/main/cpp/libyuv/infra/config/main.star +402 -402
  74. package/android/src/main/cpp/libyuv/infra/config/project.cfg +16 -16
  75. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +111 -111
  76. package/android/src/main/cpp/libyuv/libyuv.gni +34 -34
  77. package/android/src/main/cpp/libyuv/libyuv.gyp +149 -149
  78. package/android/src/main/cpp/libyuv/libyuv.gypi +87 -87
  79. package/android/src/main/cpp/libyuv/linux.mk +96 -96
  80. package/android/src/main/cpp/libyuv/public.mk +13 -13
  81. package/android/src/main/cpp/libyuv/pylintrc +49 -49
  82. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +74 -74
  83. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +56 -56
  84. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +15 -15
  85. package/android/src/main/cpp/libyuv/source/compare.cc +435 -435
  86. package/android/src/main/cpp/libyuv/source/compare_common.cc +74 -74
  87. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +362 -362
  88. package/android/src/main/cpp/libyuv/source/compare_neon.cc +96 -96
  89. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +223 -223
  90. package/android/src/main/cpp/libyuv/source/compare_win.cc +241 -241
  91. package/android/src/main/cpp/libyuv/source/convert.cc +4746 -4746
  92. package/android/src/main/cpp/libyuv/source/convert_argb.cc +9179 -9179
  93. package/android/src/main/cpp/libyuv/source/convert_from.cc +866 -866
  94. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +3671 -3671
  95. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +602 -602
  96. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +391 -391
  97. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +288 -288
  98. package/android/src/main/cpp/libyuv/source/cpu_id.cc +496 -496
  99. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +580 -580
  100. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +71 -71
  101. package/android/src/main/cpp/libyuv/source/planar_functions.cc +5663 -5663
  102. package/android/src/main/cpp/libyuv/source/rotate.cc +1241 -1241
  103. package/android/src/main/cpp/libyuv/source/rotate_any.cc +76 -76
  104. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +259 -259
  105. package/android/src/main/cpp/libyuv/source/rotate_common.cc +208 -208
  106. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +505 -505
  107. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +233 -233
  108. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +219 -219
  109. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +273 -273
  110. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +174 -174
  111. package/android/src/main/cpp/libyuv/source/rotate_win.cc +253 -253
  112. package/android/src/main/cpp/libyuv/source/row_any.cc +2519 -2519
  113. package/android/src/main/cpp/libyuv/source/row_common.cc +4461 -4461
  114. package/android/src/main/cpp/libyuv/source/row_gcc.cc +9570 -9570
  115. package/android/src/main/cpp/libyuv/source/row_lasx.cc +2343 -2343
  116. package/android/src/main/cpp/libyuv/source/row_lsx.cc +3030 -3030
  117. package/android/src/main/cpp/libyuv/source/row_neon.cc +4026 -4026
  118. package/android/src/main/cpp/libyuv/source/row_neon64.cc +5617 -5617
  119. package/android/src/main/cpp/libyuv/source/row_rvv.cc +2599 -2599
  120. package/android/src/main/cpp/libyuv/source/row_sme.cc +1183 -1183
  121. package/android/src/main/cpp/libyuv/source/row_sve.cc +1088 -1088
  122. package/android/src/main/cpp/libyuv/source/row_win.cc +6453 -6453
  123. package/android/src/main/cpp/libyuv/source/scale.cc +2710 -2710
  124. package/android/src/main/cpp/libyuv/source/scale_any.cc +991 -991
  125. package/android/src/main/cpp/libyuv/source/scale_argb.cc +1158 -1158
  126. package/android/src/main/cpp/libyuv/source/scale_common.cc +1977 -1977
  127. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +2947 -2947
  128. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +739 -739
  129. package/android/src/main/cpp/libyuv/source/scale_neon.cc +1449 -1449
  130. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +1552 -1552
  131. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +82 -82
  132. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +1971 -1971
  133. package/android/src/main/cpp/libyuv/source/scale_sme.cc +555 -555
  134. package/android/src/main/cpp/libyuv/source/scale_uv.cc +1159 -1159
  135. package/android/src/main/cpp/libyuv/source/scale_win.cc +1392 -1392
  136. package/android/src/main/cpp/libyuv/source/test.sh +35 -35
  137. package/android/src/main/cpp/libyuv/source/video_common.cc +62 -62
  138. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +4 -4
  139. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +931 -931
  140. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +164 -164
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +21 -21
  142. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +13 -13
  143. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +13 -13
  144. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +38 -38
  145. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +3 -3
  146. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +9 -9
  147. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +3 -3
  148. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +15 -15
  149. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +25 -25
  150. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +43 -43
  151. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +848 -848
  152. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +739 -739
  153. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +2867 -2867
  154. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +2133 -2133
  155. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +427 -427
  156. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +63 -63
  157. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +160 -160
  158. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +4731 -4731
  159. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +334 -334
  160. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +962 -962
  161. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +590 -590
  162. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +465 -465
  163. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +280 -280
  164. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +1135 -1135
  165. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +249 -249
  166. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +12 -12
  167. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +7 -7
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +5 -5
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +10 -10
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +7 -7
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +3 -3
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +3 -3
  173. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +3 -3
  174. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +23 -23
  175. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +581 -581
  176. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +232 -232
  177. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +112 -112
  178. package/android/src/main/cpp/libyuv/util/Makefile +9 -9
  179. package/android/src/main/cpp/libyuv/util/color.cc +120 -120
  180. package/android/src/main/cpp/libyuv/util/compare.cc +67 -67
  181. package/android/src/main/cpp/libyuv/util/cpuid.c +211 -211
  182. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +27 -27
  183. package/android/src/main/cpp/libyuv/util/psnr.cc +291 -291
  184. package/android/src/main/cpp/libyuv/util/psnr.h +47 -47
  185. package/android/src/main/cpp/libyuv/util/psnr_main.cc +620 -620
  186. package/android/src/main/cpp/libyuv/util/ssim.cc +364 -364
  187. package/android/src/main/cpp/libyuv/util/ssim.h +38 -38
  188. package/android/src/main/cpp/libyuv/util/yuvconstants.c +114 -114
  189. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +367 -367
  190. package/android/src/main/cpp/libyuv/winarm.mk +47 -47
  191. package/index.js +17 -1
  192. package/ios/FaceAntiSpoofFrameProcessor.swift +283 -0
  193. package/ios/FaceAntiSpoofJSI.h +12 -0
  194. package/ios/FaceAntiSpoofJSI.mm +92 -0
  195. package/ios/FaceAntiSpoofManager.swift +63 -0
  196. package/ios/FaceAntiSpoofModule.m +191 -0
  197. package/ios/FaceAntiSpoofPluginRegister.m +42 -0
  198. package/ios/models/FaceAntiSpoofing.tflite +0 -0
  199. package/ios/models/model_spec.json +16 -0
  200. package/package.json +87 -86
  201. package/.gitignore +0 -27
  202. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  203. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  204. package/android/.gradle/8.9/gc.properties +0 -0
  205. /package/android/.gradle/{8.9 → 9.2.0}/fileChanges/last-build.bin +0 -0
  206. /package/android/.gradle/{8.9/dependencies-accessors → 9.2.0}/gc.properties +0 -0
@@ -1,64 +1,64 @@
1
- # Introduction
2
-
3
- For test purposes, environment variables can be set to control libyuv behavior. These should only be used for testing, to narrow down bugs or to test performance.
4
-
5
- # CPU
6
-
7
- By default the cpu is detected and the most advanced form of SIMD is used. But you can disable instruction sets selectively, or completely, falling back on C code. Set the variable to 1 to disable the specified instruction set.
8
-
9
- ## All CPUs
10
-
11
- LIBYUV_DISABLE_ASM
12
-
13
- ## Intel CPUs
14
-
15
- LIBYUV_DISABLE_X86
16
- LIBYUV_DISABLE_SSE2
17
- LIBYUV_DISABLE_SSSE3
18
- LIBYUV_DISABLE_SSE41
19
- LIBYUV_DISABLE_SSE42
20
- LIBYUV_DISABLE_AVX
21
- LIBYUV_DISABLE_AVX2
22
- LIBYUV_DISABLE_ERMS
23
- LIBYUV_DISABLE_FMA3
24
- LIBYUV_DISABLE_F16C
25
- LIBYUV_DISABLE_AVX512BW
26
- LIBYUV_DISABLE_AVX512VL
27
- LIBYUV_DISABLE_AVX512VNNI
28
- LIBYUV_DISABLE_AVX512VBMI
29
- LIBYUV_DISABLE_AVX512VBMI2
30
- LIBYUV_DISABLE_AVX512VBITALG
31
- LIBYUV_DISABLE_AVX10
32
- LIBYUV_DISABLE_AVX10_2
33
- LIBYUV_DISABLE_AVXVNNI
34
- LIBYUV_DISABLE_AVXVNNIINT8
35
- LIBYUV_DISABLE_AMXINT8
36
-
37
- ## Arm CPUs
38
-
39
- LIBYUV_DISABLE_NEON
40
- LIBYUV_DISABLE_NEON_DOTPROD
41
- LIBYUV_DISABLE_NEON_I8MM
42
- LIBYUV_DISABLE_SVE
43
- LIBYUV_DISABLE_SVE2
44
- LIBYUV_DISABLE_SME
45
-
46
- ## LOONGARCH CPUs
47
-
48
- LIBYUV_DISABLE_LSX
49
- LIBYUV_DISABLE_LASX
50
-
51
- ## RISCV CPUs
52
-
53
- LIBYUV_DISABLE_RVV
54
-
55
- # Test Width/Height/Repeat
56
-
57
- The unittests default to a small image (128x72) to run fast. This can be set by environment variable to test a specific resolutions.
58
- You can also repeat the test a specified number of iterations, allowing benchmarking and profiling.
59
-
60
- set LIBYUV_WIDTH=1280
61
- set LIBYUV_HEIGHT=720
62
- set LIBYUV_REPEAT=999
63
- set LIBYUV_FLAGS=-1
64
- set LIBYUV_CPU_INFO=-1
1
+ # Introduction
2
+
3
+ For test purposes, environment variables can be set to control libyuv behavior. These should only be used for testing, to narrow down bugs or to test performance.
4
+
5
+ # CPU
6
+
7
+ By default the cpu is detected and the most advanced form of SIMD is used. But you can disable instruction sets selectively, or completely, falling back on C code. Set the variable to 1 to disable the specified instruction set.
8
+
9
+ ## All CPUs
10
+
11
+ LIBYUV_DISABLE_ASM
12
+
13
+ ## Intel CPUs
14
+
15
+ LIBYUV_DISABLE_X86
16
+ LIBYUV_DISABLE_SSE2
17
+ LIBYUV_DISABLE_SSSE3
18
+ LIBYUV_DISABLE_SSE41
19
+ LIBYUV_DISABLE_SSE42
20
+ LIBYUV_DISABLE_AVX
21
+ LIBYUV_DISABLE_AVX2
22
+ LIBYUV_DISABLE_ERMS
23
+ LIBYUV_DISABLE_FMA3
24
+ LIBYUV_DISABLE_F16C
25
+ LIBYUV_DISABLE_AVX512BW
26
+ LIBYUV_DISABLE_AVX512VL
27
+ LIBYUV_DISABLE_AVX512VNNI
28
+ LIBYUV_DISABLE_AVX512VBMI
29
+ LIBYUV_DISABLE_AVX512VBMI2
30
+ LIBYUV_DISABLE_AVX512VBITALG
31
+ LIBYUV_DISABLE_AVX10
32
+ LIBYUV_DISABLE_AVX10_2
33
+ LIBYUV_DISABLE_AVXVNNI
34
+ LIBYUV_DISABLE_AVXVNNIINT8
35
+ LIBYUV_DISABLE_AMXINT8
36
+
37
+ ## Arm CPUs
38
+
39
+ LIBYUV_DISABLE_NEON
40
+ LIBYUV_DISABLE_NEON_DOTPROD
41
+ LIBYUV_DISABLE_NEON_I8MM
42
+ LIBYUV_DISABLE_SVE
43
+ LIBYUV_DISABLE_SVE2
44
+ LIBYUV_DISABLE_SME
45
+
46
+ ## LOONGARCH CPUs
47
+
48
+ LIBYUV_DISABLE_LSX
49
+ LIBYUV_DISABLE_LASX
50
+
51
+ ## RISCV CPUs
52
+
53
+ LIBYUV_DISABLE_RVV
54
+
55
+ # Test Width/Height/Repeat
56
+
57
+ The unittests default to a small image (128x72) to run fast. This can be set by environment variable to test a specific resolutions.
58
+ You can also repeat the test a specified number of iterations, allowing benchmarking and profiling.
59
+
60
+ set LIBYUV_WIDTH=1280
61
+ set LIBYUV_HEIGHT=720
62
+ set LIBYUV_REPEAT=999
63
+ set LIBYUV_FLAGS=-1
64
+ set LIBYUV_CPU_INFO=-1
@@ -1,108 +1,108 @@
1
- # Introduction
2
-
3
- Several routines in libyuv have multiple implementations specialized for a
4
- variety of CPU architecture extensions. Libyuv will automatically detect and
5
- use the latest architecture extension present on a machine for which a kernel
6
- implementation is available.
7
-
8
- # Feature detection on AArch64
9
-
10
- ## Architecture extensions of interest
11
-
12
- The Arm 64-bit A-class architecture has a number of vector extensions which can
13
- be used to accelerate libyuv kernels.
14
-
15
- ### Neon extensions
16
-
17
- Neon is available and mandatory in AArch64 from the base Armv8.0-A
18
- architecture. Neon can be used even if later extensions like the Scalable
19
- Vector Extension (SVE) are also present. The exception to this is if the CPU is
20
- currently operating in streaming mode as introduced by the Scalable Matrix
21
- Extension, described later.
22
-
23
- There are also a couple of architecture extensions present for Neon that we can
24
- take advantage of in libyuv:
25
-
26
- * The Neon DotProd extension is architecturally available from Armv8.1-A and
27
- becomes mandatory from Armv8.4-A. This extension provides instructions to
28
- perform a pairwise widening multiply of groups of four bytes from two source
29
- vectors, taking the sum of the four widened multiply results within each
30
- group to give a 32-bit result, accumulating into a destination vector.
31
-
32
- * The Neon I8MM extension extends the DotProd extension with support for
33
- mixed-sign DotProds. The I8MM extension is architecturally available from
34
- Armv8.1-A and becomes mandatory from Armv8.6-A. It does not strictly depend
35
- on the DotProd extension being implemented, however at time of writing there
36
- is no known micro-architecture implementation where I8MM is implemented
37
- without the DotProd extension also being implemented.
38
-
39
- ### The Scalable Vector Extension (SVE)
40
-
41
- The two Scalable Vector extensions (SVE and SVE2) provides equivalent
42
- functionality to most existing Neon instructions but with the ability to
43
- efficiently operate on vector registers with a run-time-determined vector
44
- length.
45
-
46
- The original version of SVE is architecturally available from Armv8.2-A and is
47
- primarily targeted at HPC applications. This focus means it does not include
48
- most of the DSP-style operations that are necessary for most libyuv
49
- color-conversion kernels, though it can still be used for many scaling or
50
- rotation kernels.
51
-
52
- SVE does not strictly depend on either of the Neon DotProd or I8MM extensions
53
- being implemented. The only micro-architecture at time of writing where SVE is
54
- implemented without these two extensions both also being implemented is the
55
- Fujitsu A64FX, which is not a CPU of interest for libyuv.
56
-
57
- SVE2 extends the base SVE extension with the remaining instructions from Neon,
58
- porting these instructions to operate on scalable vectors. SVE2 is
59
- architecturally available from Armv9.0-A. If SVE2 is implemented then SVE must
60
- also be implemented. Since Armv9.0-A is based on Armv8.5-A this implies that
61
- the Neon DotProd extension is also implemented. Interestingly this means that
62
- the I8MM extension is not mandatory since it only becomes mandatory from
63
- Armv8.6-A or Armv9.1-A, however there is no micro-architecture at time of
64
- writing where SVE2 is implemented without all previously-mentioned features
65
- also being implemented.
66
-
67
- ### The Scalable Matrix Extension (SME)
68
-
69
- The Scalable Matrix Extension (SME) is an optional feature introduced from
70
- Armv9.2-A. SME exists alongside SVE and introduces new execution modes for
71
- applications performing extended periods of data processing. In particular SME
72
- introduces a few new components of interest:
73
-
74
- * Access to a scalable two-dimensional ZA tile register and new instructions to
75
- interact with rows and columns of the ZA tiles. This can be useful for data
76
- transformations like transposes.
77
-
78
- * A streaming SVE (SSVE) mode, during which the SVE vector length matches the
79
- ZA tile register width. In typical systems where the ZA tile register width
80
- is longer than the core SVE vector length, SSVE processing allows for faster
81
- data processing, even if the ZA tile register is unused. While the CPU is
82
- executing in streaming mode, Neon instructions are unavailable.
83
-
84
- * When both SSVE and the ZA tile registers are enabled there are additional
85
- outer-product instructions accumulating into a whole ZA tile, suitable for
86
- accelerating matrix arithmetic. This is likely less useful in libyuv.
87
-
88
- ## Linux and Android
89
-
90
- On AArch64 running under Linux and Android, features are detected by inspecting
91
- the CPU auxiliary vector via `getauxval(AT_HWCAP)` and `getauxval(AT_HWCAP2)`,
92
- inspecting the returned bitmask.
93
-
94
- ## Windows
95
-
96
- On Windows we detect features using the `IsProcessorFeaturePresent` interface
97
- and passing an enum parameter for the feature we want to check. More
98
- information on this can be found here:
99
-
100
- https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent#parameters
101
-
102
- ## Apple Silicon
103
-
104
- On Apple Silicon we detect features using the `sysctlbyname` interface and
105
- passing a string representing the feature we want to detect. More information
106
- on this can be found here:
107
-
108
- https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics
1
+ # Introduction
2
+
3
+ Several routines in libyuv have multiple implementations specialized for a
4
+ variety of CPU architecture extensions. Libyuv will automatically detect and
5
+ use the latest architecture extension present on a machine for which a kernel
6
+ implementation is available.
7
+
8
+ # Feature detection on AArch64
9
+
10
+ ## Architecture extensions of interest
11
+
12
+ The Arm 64-bit A-class architecture has a number of vector extensions which can
13
+ be used to accelerate libyuv kernels.
14
+
15
+ ### Neon extensions
16
+
17
+ Neon is available and mandatory in AArch64 from the base Armv8.0-A
18
+ architecture. Neon can be used even if later extensions like the Scalable
19
+ Vector Extension (SVE) are also present. The exception to this is if the CPU is
20
+ currently operating in streaming mode as introduced by the Scalable Matrix
21
+ Extension, described later.
22
+
23
+ There are also a couple of architecture extensions present for Neon that we can
24
+ take advantage of in libyuv:
25
+
26
+ * The Neon DotProd extension is architecturally available from Armv8.1-A and
27
+ becomes mandatory from Armv8.4-A. This extension provides instructions to
28
+ perform a pairwise widening multiply of groups of four bytes from two source
29
+ vectors, taking the sum of the four widened multiply results within each
30
+ group to give a 32-bit result, accumulating into a destination vector.
31
+
32
+ * The Neon I8MM extension extends the DotProd extension with support for
33
+ mixed-sign DotProds. The I8MM extension is architecturally available from
34
+ Armv8.1-A and becomes mandatory from Armv8.6-A. It does not strictly depend
35
+ on the DotProd extension being implemented, however at time of writing there
36
+ is no known micro-architecture implementation where I8MM is implemented
37
+ without the DotProd extension also being implemented.
38
+
39
+ ### The Scalable Vector Extension (SVE)
40
+
41
+ The two Scalable Vector extensions (SVE and SVE2) provides equivalent
42
+ functionality to most existing Neon instructions but with the ability to
43
+ efficiently operate on vector registers with a run-time-determined vector
44
+ length.
45
+
46
+ The original version of SVE is architecturally available from Armv8.2-A and is
47
+ primarily targeted at HPC applications. This focus means it does not include
48
+ most of the DSP-style operations that are necessary for most libyuv
49
+ color-conversion kernels, though it can still be used for many scaling or
50
+ rotation kernels.
51
+
52
+ SVE does not strictly depend on either of the Neon DotProd or I8MM extensions
53
+ being implemented. The only micro-architecture at time of writing where SVE is
54
+ implemented without these two extensions both also being implemented is the
55
+ Fujitsu A64FX, which is not a CPU of interest for libyuv.
56
+
57
+ SVE2 extends the base SVE extension with the remaining instructions from Neon,
58
+ porting these instructions to operate on scalable vectors. SVE2 is
59
+ architecturally available from Armv9.0-A. If SVE2 is implemented then SVE must
60
+ also be implemented. Since Armv9.0-A is based on Armv8.5-A this implies that
61
+ the Neon DotProd extension is also implemented. Interestingly this means that
62
+ the I8MM extension is not mandatory since it only becomes mandatory from
63
+ Armv8.6-A or Armv9.1-A, however there is no micro-architecture at time of
64
+ writing where SVE2 is implemented without all previously-mentioned features
65
+ also being implemented.
66
+
67
+ ### The Scalable Matrix Extension (SME)
68
+
69
+ The Scalable Matrix Extension (SME) is an optional feature introduced from
70
+ Armv9.2-A. SME exists alongside SVE and introduces new execution modes for
71
+ applications performing extended periods of data processing. In particular SME
72
+ introduces a few new components of interest:
73
+
74
+ * Access to a scalable two-dimensional ZA tile register and new instructions to
75
+ interact with rows and columns of the ZA tiles. This can be useful for data
76
+ transformations like transposes.
77
+
78
+ * A streaming SVE (SSVE) mode, during which the SVE vector length matches the
79
+ ZA tile register width. In typical systems where the ZA tile register width
80
+ is longer than the core SVE vector length, SSVE processing allows for faster
81
+ data processing, even if the ZA tile register is unused. While the CPU is
82
+ executing in streaming mode, Neon instructions are unavailable.
83
+
84
+ * When both SSVE and the ZA tile registers are enabled there are additional
85
+ outer-product instructions accumulating into a whole ZA tile, suitable for
86
+ accelerating matrix arithmetic. This is likely less useful in libyuv.
87
+
88
+ ## Linux and Android
89
+
90
+ On AArch64 running under Linux and Android, features are detected by inspecting
91
+ the CPU auxiliary vector via `getauxval(AT_HWCAP)` and `getauxval(AT_HWCAP2)`,
92
+ inspecting the returned bitmask.
93
+
94
+ ## Windows
95
+
96
+ On Windows we detect features using the `IsProcessorFeaturePresent` interface
97
+ and passing an enum parameter for the feature we want to check. More
98
+ information on this can be found here:
99
+
100
+ https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-isprocessorfeaturepresent#parameters
101
+
102
+ ## Apple Silicon
103
+
104
+ On Apple Silicon we detect features using the `sysctlbyname` interface and
105
+ passing a string representing the feature we want to detect. More information
106
+ on this can be found here:
107
+
108
+ https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics