react-native-vision-camera-spoof-detector 1.0.21 → 1.0.23

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 (197) hide show
  1. package/.gitattributes +2 -0
  2. package/.gitignore +27 -0
  3. package/CHANGELOG.md +2 -2
  4. package/CONTRIBUTING.md +2 -2
  5. package/README.md +442 -443
  6. package/android/build.gradle +12 -4
  7. package/android/src/main/cpp/CMakeLists.txt +101 -94
  8. package/android/src/main/cpp/libyuv/.clang-format +6 -6
  9. package/android/src/main/cpp/libyuv/.gn +40 -40
  10. package/android/src/main/cpp/libyuv/.vpython3 +410 -410
  11. package/android/src/main/cpp/libyuv/AUTHORS +7 -7
  12. package/android/src/main/cpp/libyuv/Android.bp +202 -202
  13. package/android/src/main/cpp/libyuv/Android.mk +106 -106
  14. package/android/src/main/cpp/libyuv/BUILD.gn +490 -490
  15. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +70 -70
  16. package/android/src/main/cpp/libyuv/CMakeLists.txt +259 -252
  17. package/android/src/main/cpp/libyuv/DEPS +935 -935
  18. package/android/src/main/cpp/libyuv/DIR_METADATA +3 -3
  19. package/android/src/main/cpp/libyuv/LICENSE +29 -29
  20. package/android/src/main/cpp/libyuv/OWNERS +11 -11
  21. package/android/src/main/cpp/libyuv/PATENTS +23 -23
  22. package/android/src/main/cpp/libyuv/PRESUBMIT.py +65 -65
  23. package/android/src/main/cpp/libyuv/README.chromium +11 -11
  24. package/android/src/main/cpp/libyuv/README.md +19 -19
  25. package/android/src/main/cpp/libyuv/build_overrides/build.gni +60 -60
  26. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +19 -19
  27. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +17 -17
  28. package/android/src/main/cpp/libyuv/codereview.settings +5 -5
  29. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +409 -409
  30. package/android/src/main/cpp/libyuv/docs/environment_variables.md +64 -64
  31. package/android/src/main/cpp/libyuv/docs/feature_detection.md +108 -108
  32. package/android/src/main/cpp/libyuv/docs/filtering.md +196 -196
  33. package/android/src/main/cpp/libyuv/docs/formats.md +208 -208
  34. package/android/src/main/cpp/libyuv/docs/getting_started.md +296 -296
  35. package/android/src/main/cpp/libyuv/docs/rotation.md +107 -107
  36. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +29 -29
  37. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +68 -68
  38. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +111 -111
  39. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +112 -112
  40. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +1117 -1117
  41. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +2335 -2335
  42. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +203 -203
  43. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +394 -394
  44. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +147 -147
  45. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +99 -99
  46. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +1949 -1949
  47. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +195 -195
  48. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +1131 -1131
  49. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +296 -296
  50. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +37 -37
  51. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +265 -265
  52. package/android/src/main/cpp/libyuv/include/libyuv/row.h +6738 -6738
  53. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +2154 -2154
  54. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +336 -336
  55. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +76 -76
  56. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +42 -42
  57. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +1726 -1726
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +51 -51
  59. package/android/src/main/cpp/libyuv/include/libyuv/version.h +16 -16
  60. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +222 -222
  61. package/android/src/main/cpp/libyuv/include/libyuv.h +33 -33
  62. package/android/src/main/cpp/libyuv/infra/config/OWNERS +3 -3
  63. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +17 -17
  64. package/android/src/main/cpp/libyuv/infra/config/README.md +2 -2
  65. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +6 -6
  66. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +144 -144
  67. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +1185 -1185
  68. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +9 -9
  69. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +246 -246
  70. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +385 -385
  71. package/android/src/main/cpp/libyuv/infra/config/main.star +402 -402
  72. package/android/src/main/cpp/libyuv/infra/config/project.cfg +16 -16
  73. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +111 -111
  74. package/android/src/main/cpp/libyuv/libyuv.gni +34 -34
  75. package/android/src/main/cpp/libyuv/libyuv.gyp +149 -149
  76. package/android/src/main/cpp/libyuv/libyuv.gypi +87 -87
  77. package/android/src/main/cpp/libyuv/linux.mk +96 -96
  78. package/android/src/main/cpp/libyuv/public.mk +13 -13
  79. package/android/src/main/cpp/libyuv/pylintrc +49 -49
  80. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +74 -74
  81. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +56 -56
  82. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +15 -15
  83. package/android/src/main/cpp/libyuv/source/compare.cc +435 -435
  84. package/android/src/main/cpp/libyuv/source/compare_common.cc +74 -74
  85. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +362 -362
  86. package/android/src/main/cpp/libyuv/source/compare_neon.cc +96 -96
  87. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +223 -223
  88. package/android/src/main/cpp/libyuv/source/compare_win.cc +241 -241
  89. package/android/src/main/cpp/libyuv/source/convert.cc +4746 -4746
  90. package/android/src/main/cpp/libyuv/source/convert_argb.cc +9179 -9179
  91. package/android/src/main/cpp/libyuv/source/convert_from.cc +866 -866
  92. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +3671 -3671
  93. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +602 -602
  94. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +391 -391
  95. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +288 -288
  96. package/android/src/main/cpp/libyuv/source/cpu_id.cc +496 -496
  97. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +580 -580
  98. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +71 -71
  99. package/android/src/main/cpp/libyuv/source/planar_functions.cc +5663 -5663
  100. package/android/src/main/cpp/libyuv/source/rotate.cc +1241 -1241
  101. package/android/src/main/cpp/libyuv/source/rotate_any.cc +76 -76
  102. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +259 -259
  103. package/android/src/main/cpp/libyuv/source/rotate_common.cc +208 -208
  104. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +505 -505
  105. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +233 -233
  106. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +219 -219
  107. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +273 -273
  108. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +174 -174
  109. package/android/src/main/cpp/libyuv/source/rotate_win.cc +253 -253
  110. package/android/src/main/cpp/libyuv/source/row_any.cc +2519 -2519
  111. package/android/src/main/cpp/libyuv/source/row_common.cc +4461 -4461
  112. package/android/src/main/cpp/libyuv/source/row_gcc.cc +9570 -9570
  113. package/android/src/main/cpp/libyuv/source/row_lasx.cc +2343 -2343
  114. package/android/src/main/cpp/libyuv/source/row_lsx.cc +3030 -3030
  115. package/android/src/main/cpp/libyuv/source/row_neon.cc +4026 -4026
  116. package/android/src/main/cpp/libyuv/source/row_neon64.cc +5617 -5617
  117. package/android/src/main/cpp/libyuv/source/row_rvv.cc +2599 -2599
  118. package/android/src/main/cpp/libyuv/source/row_sme.cc +1183 -1183
  119. package/android/src/main/cpp/libyuv/source/row_sve.cc +1088 -1088
  120. package/android/src/main/cpp/libyuv/source/row_win.cc +6453 -6453
  121. package/android/src/main/cpp/libyuv/source/scale.cc +2710 -2710
  122. package/android/src/main/cpp/libyuv/source/scale_any.cc +991 -991
  123. package/android/src/main/cpp/libyuv/source/scale_argb.cc +1158 -1158
  124. package/android/src/main/cpp/libyuv/source/scale_common.cc +1977 -1977
  125. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +2947 -2947
  126. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +739 -739
  127. package/android/src/main/cpp/libyuv/source/scale_neon.cc +1449 -1449
  128. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +1552 -1552
  129. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +82 -82
  130. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +1971 -1971
  131. package/android/src/main/cpp/libyuv/source/scale_sme.cc +555 -555
  132. package/android/src/main/cpp/libyuv/source/scale_uv.cc +1159 -1159
  133. package/android/src/main/cpp/libyuv/source/scale_win.cc +1392 -1392
  134. package/android/src/main/cpp/libyuv/source/test.sh +35 -35
  135. package/android/src/main/cpp/libyuv/source/video_common.cc +62 -62
  136. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +4 -4
  137. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +931 -931
  138. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +164 -164
  139. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +21 -21
  140. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +13 -13
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +13 -13
  142. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +38 -38
  143. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +3 -3
  144. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +9 -9
  145. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +3 -3
  146. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +15 -15
  147. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +25 -25
  148. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +43 -43
  149. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +848 -848
  150. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +739 -739
  151. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +2867 -2867
  152. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +2133 -2133
  153. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +427 -427
  154. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +63 -63
  155. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +160 -160
  156. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +4731 -4731
  157. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +334 -334
  158. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +962 -962
  159. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +590 -590
  160. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +465 -465
  161. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +280 -280
  162. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +1135 -1135
  163. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +249 -249
  164. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +12 -12
  165. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +7 -7
  166. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +5 -5
  167. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +10 -10
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +7 -7
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +3 -3
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +3 -3
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +3 -3
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +23 -23
  173. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +581 -581
  174. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +232 -232
  175. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +112 -112
  176. package/android/src/main/cpp/libyuv/util/Makefile +9 -9
  177. package/android/src/main/cpp/libyuv/util/color.cc +120 -120
  178. package/android/src/main/cpp/libyuv/util/compare.cc +67 -67
  179. package/android/src/main/cpp/libyuv/util/cpuid.c +211 -211
  180. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +27 -27
  181. package/android/src/main/cpp/libyuv/util/psnr.cc +291 -291
  182. package/android/src/main/cpp/libyuv/util/psnr.h +47 -47
  183. package/android/src/main/cpp/libyuv/util/psnr_main.cc +620 -620
  184. package/android/src/main/cpp/libyuv/util/ssim.cc +364 -364
  185. package/android/src/main/cpp/libyuv/util/ssim.h +38 -38
  186. package/android/src/main/cpp/libyuv/util/yuvconstants.c +114 -114
  187. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +367 -367
  188. package/android/src/main/cpp/libyuv/winarm.mk +47 -47
  189. package/package.json +86 -84
  190. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  191. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  192. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  193. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  194. package/android/.gradle/8.9/gc.properties +0 -0
  195. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  196. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  197. package/android/.gradle/vcs-1/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