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.
- package/.gitattributes +2 -0
- package/.gitignore +27 -0
- package/CHANGELOG.md +2 -2
- package/CONTRIBUTING.md +2 -2
- package/README.md +442 -443
- package/android/build.gradle +12 -4
- package/android/src/main/cpp/CMakeLists.txt +101 -94
- package/android/src/main/cpp/libyuv/.clang-format +6 -6
- package/android/src/main/cpp/libyuv/.gn +40 -40
- package/android/src/main/cpp/libyuv/.vpython3 +410 -410
- package/android/src/main/cpp/libyuv/AUTHORS +7 -7
- package/android/src/main/cpp/libyuv/Android.bp +202 -202
- package/android/src/main/cpp/libyuv/Android.mk +106 -106
- package/android/src/main/cpp/libyuv/BUILD.gn +490 -490
- package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +70 -70
- package/android/src/main/cpp/libyuv/CMakeLists.txt +259 -252
- package/android/src/main/cpp/libyuv/DEPS +935 -935
- package/android/src/main/cpp/libyuv/DIR_METADATA +3 -3
- package/android/src/main/cpp/libyuv/LICENSE +29 -29
- package/android/src/main/cpp/libyuv/OWNERS +11 -11
- package/android/src/main/cpp/libyuv/PATENTS +23 -23
- package/android/src/main/cpp/libyuv/PRESUBMIT.py +65 -65
- package/android/src/main/cpp/libyuv/README.chromium +11 -11
- package/android/src/main/cpp/libyuv/README.md +19 -19
- package/android/src/main/cpp/libyuv/build_overrides/build.gni +60 -60
- package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +19 -19
- package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +17 -17
- package/android/src/main/cpp/libyuv/codereview.settings +5 -5
- package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +409 -409
- package/android/src/main/cpp/libyuv/docs/environment_variables.md +64 -64
- package/android/src/main/cpp/libyuv/docs/feature_detection.md +108 -108
- package/android/src/main/cpp/libyuv/docs/filtering.md +196 -196
- package/android/src/main/cpp/libyuv/docs/formats.md +208 -208
- package/android/src/main/cpp/libyuv/docs/getting_started.md +296 -296
- package/android/src/main/cpp/libyuv/docs/rotation.md +107 -107
- package/android/src/main/cpp/libyuv/download_vs_toolchain.py +29 -29
- package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +68 -68
- package/android/src/main/cpp/libyuv/include/libyuv/compare.h +111 -111
- package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +112 -112
- package/android/src/main/cpp/libyuv/include/libyuv/convert.h +1117 -1117
- package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +2335 -2335
- package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +203 -203
- package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +394 -394
- package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +147 -147
- package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +99 -99
- package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +1949 -1949
- package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +195 -195
- package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +1131 -1131
- package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +296 -296
- package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +37 -37
- package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +265 -265
- package/android/src/main/cpp/libyuv/include/libyuv/row.h +6738 -6738
- package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +2154 -2154
- package/android/src/main/cpp/libyuv/include/libyuv/scale.h +336 -336
- package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +76 -76
- package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +42 -42
- package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +1726 -1726
- package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +51 -51
- package/android/src/main/cpp/libyuv/include/libyuv/version.h +16 -16
- package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +222 -222
- package/android/src/main/cpp/libyuv/include/libyuv.h +33 -33
- package/android/src/main/cpp/libyuv/infra/config/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +17 -17
- package/android/src/main/cpp/libyuv/infra/config/README.md +2 -2
- package/android/src/main/cpp/libyuv/infra/config/codereview.settings +6 -6
- package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +144 -144
- package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +1185 -1185
- package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +9 -9
- package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +246 -246
- package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +385 -385
- package/android/src/main/cpp/libyuv/infra/config/main.star +402 -402
- package/android/src/main/cpp/libyuv/infra/config/project.cfg +16 -16
- package/android/src/main/cpp/libyuv/infra/config/realms.cfg +111 -111
- package/android/src/main/cpp/libyuv/libyuv.gni +34 -34
- package/android/src/main/cpp/libyuv/libyuv.gyp +149 -149
- package/android/src/main/cpp/libyuv/libyuv.gypi +87 -87
- package/android/src/main/cpp/libyuv/linux.mk +96 -96
- package/android/src/main/cpp/libyuv/public.mk +13 -13
- package/android/src/main/cpp/libyuv/pylintrc +49 -49
- package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +74 -74
- package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +56 -56
- package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +15 -15
- package/android/src/main/cpp/libyuv/source/compare.cc +435 -435
- package/android/src/main/cpp/libyuv/source/compare_common.cc +74 -74
- package/android/src/main/cpp/libyuv/source/compare_gcc.cc +362 -362
- package/android/src/main/cpp/libyuv/source/compare_neon.cc +96 -96
- package/android/src/main/cpp/libyuv/source/compare_neon64.cc +223 -223
- package/android/src/main/cpp/libyuv/source/compare_win.cc +241 -241
- package/android/src/main/cpp/libyuv/source/convert.cc +4746 -4746
- package/android/src/main/cpp/libyuv/source/convert_argb.cc +9179 -9179
- package/android/src/main/cpp/libyuv/source/convert_from.cc +866 -866
- package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +3671 -3671
- package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +602 -602
- package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +391 -391
- package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +288 -288
- package/android/src/main/cpp/libyuv/source/cpu_id.cc +496 -496
- package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +580 -580
- package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +71 -71
- package/android/src/main/cpp/libyuv/source/planar_functions.cc +5663 -5663
- package/android/src/main/cpp/libyuv/source/rotate.cc +1241 -1241
- package/android/src/main/cpp/libyuv/source/rotate_any.cc +76 -76
- package/android/src/main/cpp/libyuv/source/rotate_argb.cc +259 -259
- package/android/src/main/cpp/libyuv/source/rotate_common.cc +208 -208
- package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +505 -505
- package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +233 -233
- package/android/src/main/cpp/libyuv/source/rotate_neon.cc +219 -219
- package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +273 -273
- package/android/src/main/cpp/libyuv/source/rotate_sme.cc +174 -174
- package/android/src/main/cpp/libyuv/source/rotate_win.cc +253 -253
- package/android/src/main/cpp/libyuv/source/row_any.cc +2519 -2519
- package/android/src/main/cpp/libyuv/source/row_common.cc +4461 -4461
- package/android/src/main/cpp/libyuv/source/row_gcc.cc +9570 -9570
- package/android/src/main/cpp/libyuv/source/row_lasx.cc +2343 -2343
- package/android/src/main/cpp/libyuv/source/row_lsx.cc +3030 -3030
- package/android/src/main/cpp/libyuv/source/row_neon.cc +4026 -4026
- package/android/src/main/cpp/libyuv/source/row_neon64.cc +5617 -5617
- package/android/src/main/cpp/libyuv/source/row_rvv.cc +2599 -2599
- package/android/src/main/cpp/libyuv/source/row_sme.cc +1183 -1183
- package/android/src/main/cpp/libyuv/source/row_sve.cc +1088 -1088
- package/android/src/main/cpp/libyuv/source/row_win.cc +6453 -6453
- package/android/src/main/cpp/libyuv/source/scale.cc +2710 -2710
- package/android/src/main/cpp/libyuv/source/scale_any.cc +991 -991
- package/android/src/main/cpp/libyuv/source/scale_argb.cc +1158 -1158
- package/android/src/main/cpp/libyuv/source/scale_common.cc +1977 -1977
- package/android/src/main/cpp/libyuv/source/scale_gcc.cc +2947 -2947
- package/android/src/main/cpp/libyuv/source/scale_lsx.cc +739 -739
- package/android/src/main/cpp/libyuv/source/scale_neon.cc +1449 -1449
- package/android/src/main/cpp/libyuv/source/scale_neon64.cc +1552 -1552
- package/android/src/main/cpp/libyuv/source/scale_rgb.cc +82 -82
- package/android/src/main/cpp/libyuv/source/scale_rvv.cc +1971 -1971
- package/android/src/main/cpp/libyuv/source/scale_sme.cc +555 -555
- package/android/src/main/cpp/libyuv/source/scale_uv.cc +1159 -1159
- package/android/src/main/cpp/libyuv/source/scale_win.cc +1392 -1392
- package/android/src/main/cpp/libyuv/source/test.sh +35 -35
- package/android/src/main/cpp/libyuv/source/video_common.cc +62 -62
- package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +4 -4
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +931 -931
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +164 -164
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +21 -21
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +13 -13
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +13 -13
- package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +38 -38
- package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +9 -9
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +15 -15
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +25 -25
- package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +43 -43
- package/android/src/main/cpp/libyuv/unit_test/color_test.cc +848 -848
- package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +739 -739
- package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +2867 -2867
- package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +2133 -2133
- package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +427 -427
- package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +63 -63
- package/android/src/main/cpp/libyuv/unit_test/math_test.cc +160 -160
- package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +4731 -4731
- package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +334 -334
- package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +962 -962
- package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +590 -590
- package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +465 -465
- package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +280 -280
- package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +1135 -1135
- package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +249 -249
- package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +12 -12
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +7 -7
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +5 -5
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +10 -10
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +7 -7
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +23 -23
- package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +581 -581
- package/android/src/main/cpp/libyuv/unit_test/unit_test.h +232 -232
- package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +112 -112
- package/android/src/main/cpp/libyuv/util/Makefile +9 -9
- package/android/src/main/cpp/libyuv/util/color.cc +120 -120
- package/android/src/main/cpp/libyuv/util/compare.cc +67 -67
- package/android/src/main/cpp/libyuv/util/cpuid.c +211 -211
- package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +27 -27
- package/android/src/main/cpp/libyuv/util/psnr.cc +291 -291
- package/android/src/main/cpp/libyuv/util/psnr.h +47 -47
- package/android/src/main/cpp/libyuv/util/psnr_main.cc +620 -620
- package/android/src/main/cpp/libyuv/util/ssim.cc +364 -364
- package/android/src/main/cpp/libyuv/util/ssim.h +38 -38
- package/android/src/main/cpp/libyuv/util/yuvconstants.c +114 -114
- package/android/src/main/cpp/libyuv/util/yuvconvert.cc +367 -367
- package/android/src/main/cpp/libyuv/winarm.mk +47 -47
- package/package.json +86 -84
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- 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
|