react-native-vision-camera-spoof-detector 1.0.0

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 (857) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +220 -0
  3. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  4. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  5. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  6. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/cache-v2-701700ba4bb2215c1ccd.json +1599 -0
  7. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-9189be15e8b04df8f258.json +857 -0
  8. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-073369af1c5eb367d160.json +185 -0
  9. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +14 -0
  10. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/directory-libyuv-Debug-68bb497e958fc902f93a.json +100 -0
  11. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/index-2025-11-18T09-41-06-0926.json +92 -0
  12. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-cpuid-Debug-5af24d55c9649a4c3a3f.json +136 -0
  13. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-faceantispoof-Debug-aa45fddb87a8ac2074bb.json +181 -0
  14. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-fastyuv-Debug-4dd5b049ce28a8e070d1.json +182 -0
  15. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv-Debug-b8d5ee3e10a1f31a29fe.json +433 -0
  16. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv_common_objects-Debug-ae517204d04beeb2df23.json +522 -0
  17. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv_neon64-Debug-2ab157e6b75bcb340b03.json +137 -0
  18. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv_shared-Debug-2aecda61b70017f775b5.json +455 -0
  19. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv_sme-Debug-73d1e6cc8ef043b4e243.json +126 -0
  20. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuv_sve-Debug-9d95a17080a7480f85a6.json +104 -0
  21. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuvconstants-Debug-31b06c1ed2b225cf2443.json +136 -0
  22. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.cmake/api/v1/reply/target-yuvconvert-Debug-2231dac0a591237abb04.json +157 -0
  23. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.ninja_deps +0 -0
  24. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/.ninja_log +63 -0
  25. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeCache.txt +465 -0
  26. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +72 -0
  27. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +83 -0
  28. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  29. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  30. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +15 -0
  31. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +803 -0
  32. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  33. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +791 -0
  34. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  35. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/CMakeOutput.log +276 -0
  36. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/TargetDirectories.txt +27 -0
  37. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/cmake.check_cache +1 -0
  38. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/faceantispoof.dir/48ddb531beec5c42d2f7a5f3aa0b5968/ReactCommon/jsi/jsi/jsi.cpp.o +0 -0
  39. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/faceantispoof.dir/FaceAntiSpoofJSI.cpp.o +0 -0
  40. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/fastyuv.dir/FastYuvJni.cpp.o +0 -0
  41. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/fastyuv.dir/fast_yuv.cpp.o +0 -0
  42. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CMakeFiles/rules.ninja +198 -0
  43. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CPackConfig.cmake +71 -0
  44. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/CPackSourceConfig.cmake +79 -0
  45. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/additional_project_files.txt +48 -0
  46. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/android_gradle_build.json +106 -0
  47. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/android_gradle_build_mini.json +87 -0
  48. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/build.ninja +1071 -0
  49. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/build_file_index.txt +3 -0
  50. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/cmake_install.cmake +59 -0
  51. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/compile_commands.json +277 -0
  52. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/compile_commands.json.bin +0 -0
  53. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/configure_fingerprint.bin +29 -0
  54. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/cpuid.dir/util/cpuid.c.o +0 -0
  55. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare.cc.o +0 -0
  56. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_common.cc.o +0 -0
  57. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_gcc.cc.o +0 -0
  58. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_win.cc.o +0 -0
  59. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert.cc.o +0 -0
  60. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_argb.cc.o +0 -0
  61. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from.cc.o +0 -0
  62. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from_argb.cc.o +0 -0
  63. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_jpeg.cc.o +0 -0
  64. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_argb.cc.o +0 -0
  65. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_i420.cc.o +0 -0
  66. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/cpu_id.cc.o +0 -0
  67. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_decoder.cc.o +0 -0
  68. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_validate.cc.o +0 -0
  69. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/planar_functions.cc.o +0 -0
  70. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate.cc.o +0 -0
  71. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_any.cc.o +0 -0
  72. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_argb.cc.o +0 -0
  73. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_common.cc.o +0 -0
  74. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_gcc.cc.o +0 -0
  75. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_lsx.cc.o +0 -0
  76. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_win.cc.o +0 -0
  77. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_any.cc.o +0 -0
  78. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_common.cc.o +0 -0
  79. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_gcc.cc.o +0 -0
  80. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lasx.cc.o +0 -0
  81. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lsx.cc.o +0 -0
  82. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_rvv.cc.o +0 -0
  83. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_win.cc.o +0 -0
  84. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale.cc.o +0 -0
  85. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_any.cc.o +0 -0
  86. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_argb.cc.o +0 -0
  87. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_common.cc.o +0 -0
  88. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_gcc.cc.o +0 -0
  89. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_lsx.cc.o +0 -0
  90. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rgb.cc.o +0 -0
  91. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rvv.cc.o +0 -0
  92. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_uv.cc.o +0 -0
  93. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_win.cc.o +0 -0
  94. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_common_objects.dir/source/video_common.cc.o +0 -0
  95. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_neon64.dir/source/compare_neon64.cc.o +0 -0
  96. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_neon64.dir/source/rotate_neon64.cc.o +0 -0
  97. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_neon64.dir/source/row_neon64.cc.o +0 -0
  98. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_neon64.dir/source/scale_neon64.cc.o +0 -0
  99. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_sme.dir/source/rotate_sme.cc.o +0 -0
  100. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_sme.dir/source/row_sme.cc.o +0 -0
  101. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_sme.dir/source/scale_sme.cc.o +0 -0
  102. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuv_sve.dir/source/row_sve.cc.o +0 -0
  103. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuvconstants.dir/util/yuvconstants.c.o +0 -0
  104. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/CMakeFiles/yuvconvert.dir/util/yuvconvert.cc.o +0 -0
  105. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/cmake_install.cmake +87 -0
  106. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/libyuv/libyuv.a +0 -0
  107. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/metadata_generation_command.txt +19 -0
  108. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/prefab_config.json +4 -0
  109. package/android/.cxx/Debug/2a3w6u3n/arm64-v8a/symbol_folder_index.txt +1 -0
  110. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  111. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  112. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  113. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/cache-v2-3c91c5cee78e3e904960.json +1587 -0
  114. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-7cc7148edcc0267ae184.json +857 -0
  115. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-3db6484795577cf354b3.json +167 -0
  116. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +14 -0
  117. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/directory-libyuv-Debug-063ed54195fe25617bc7.json +100 -0
  118. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/index-2025-11-18T09-41-44-0186.json +92 -0
  119. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-cpuid-Debug-a3f2884614434f8f188a.json +150 -0
  120. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-faceantispoof-Debug-c905db8d2a36c2f49235.json +181 -0
  121. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-fastyuv-Debug-e08fb9fb89a090bfee1a.json +190 -0
  122. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuv-Debug-4b1ffa979fbf6ac68418.json +406 -0
  123. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuv_common_objects-Debug-245e248f528e11e2d34d.json +536 -0
  124. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuv_neon-Debug-2ea21009709c7febf67d.json +151 -0
  125. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuv_shared-Debug-e387ee44aace33b18140.json +428 -0
  126. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuvconstants-Debug-14fbb0c58620d35bb155.json +150 -0
  127. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.cmake/api/v1/reply/target-yuvconvert-Debug-c40ecea0358b0e737802.json +171 -0
  128. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.ninja_deps +0 -0
  129. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/.ninja_log +59 -0
  130. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeCache.txt +463 -0
  131. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +72 -0
  132. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +83 -0
  133. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  134. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  135. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +15 -0
  136. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +803 -0
  137. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  138. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +791 -0
  139. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  140. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/CMakeOutput.log +268 -0
  141. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/TargetDirectories.txt +25 -0
  142. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/cmake.check_cache +1 -0
  143. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/faceantispoof.dir/48ddb531beec5c42d2f7a5f3aa0b5968/ReactCommon/jsi/jsi/jsi.cpp.o +0 -0
  144. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/faceantispoof.dir/FaceAntiSpoofJSI.cpp.o +0 -0
  145. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/fastyuv.dir/FastYuvJni.cpp.o +0 -0
  146. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/fastyuv.dir/fast_yuv.cpp.o +0 -0
  147. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CMakeFiles/rules.ninja +178 -0
  148. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CPackConfig.cmake +71 -0
  149. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/CPackSourceConfig.cmake +79 -0
  150. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/additional_project_files.txt +44 -0
  151. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/android_gradle_build.json +96 -0
  152. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/android_gradle_build_mini.json +77 -0
  153. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/build.ninja +1046 -0
  154. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/build_file_index.txt +3 -0
  155. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/cmake_install.cmake +59 -0
  156. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/compile_commands.json +257 -0
  157. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/compile_commands.json.bin +0 -0
  158. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/configure_fingerprint.bin +29 -0
  159. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/cpuid.dir/util/cpuid.c.o +0 -0
  160. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare.cc.o +0 -0
  161. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_common.cc.o +0 -0
  162. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_gcc.cc.o +0 -0
  163. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_win.cc.o +0 -0
  164. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert.cc.o +0 -0
  165. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_argb.cc.o +0 -0
  166. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from.cc.o +0 -0
  167. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from_argb.cc.o +0 -0
  168. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_jpeg.cc.o +0 -0
  169. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_argb.cc.o +0 -0
  170. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_i420.cc.o +0 -0
  171. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/cpu_id.cc.o +0 -0
  172. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_decoder.cc.o +0 -0
  173. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_validate.cc.o +0 -0
  174. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/planar_functions.cc.o +0 -0
  175. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate.cc.o +0 -0
  176. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_any.cc.o +0 -0
  177. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_argb.cc.o +0 -0
  178. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_common.cc.o +0 -0
  179. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_gcc.cc.o +0 -0
  180. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_lsx.cc.o +0 -0
  181. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_win.cc.o +0 -0
  182. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_any.cc.o +0 -0
  183. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_common.cc.o +0 -0
  184. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_gcc.cc.o +0 -0
  185. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lasx.cc.o +0 -0
  186. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lsx.cc.o +0 -0
  187. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_rvv.cc.o +0 -0
  188. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_win.cc.o +0 -0
  189. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale.cc.o +0 -0
  190. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_any.cc.o +0 -0
  191. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_argb.cc.o +0 -0
  192. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_common.cc.o +0 -0
  193. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_gcc.cc.o +0 -0
  194. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_lsx.cc.o +0 -0
  195. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rgb.cc.o +0 -0
  196. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rvv.cc.o +0 -0
  197. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_uv.cc.o +0 -0
  198. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_win.cc.o +0 -0
  199. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_common_objects.dir/source/video_common.cc.o +0 -0
  200. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_neon.dir/source/compare_neon.cc.o +0 -0
  201. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_neon.dir/source/rotate_neon.cc.o +0 -0
  202. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_neon.dir/source/row_neon.cc.o +0 -0
  203. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuv_neon.dir/source/scale_neon.cc.o +0 -0
  204. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuvconstants.dir/util/yuvconstants.c.o +0 -0
  205. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/CMakeFiles/yuvconvert.dir/util/yuvconvert.cc.o +0 -0
  206. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/cmake_install.cmake +87 -0
  207. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/libyuv/libyuv.a +0 -0
  208. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/metadata_generation_command.txt +19 -0
  209. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/prefab_config.json +4 -0
  210. package/android/.cxx/Debug/2a3w6u3n/armeabi-v7a/symbol_folder_index.txt +1 -0
  211. package/android/.cxx/Debug/2a3w6u3n/hash_key.txt +26 -0
  212. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  213. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  214. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  215. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/cache-v2-2fe46b6519c8341b1982.json +1587 -0
  216. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/cmakeFiles-v1-a03e763d0c6effec9f6f.json +857 -0
  217. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/codemodel-v2-2412bbfc0c74a0dc613a.json +158 -0
  218. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +14 -0
  219. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/directory-libyuv-Debug-7cf182a5e476bc9b5f34.json +100 -0
  220. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/index-2025-11-18T09-41-52-0585.json +92 -0
  221. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-cpuid-Debug-931d089bced0b77c5070.json +136 -0
  222. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-faceantispoof-Debug-7b58f88faeacc46f961d.json +181 -0
  223. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-fastyuv-Debug-9283b76b8a94ba273122.json +157 -0
  224. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-yuv-Debug-c270d4a92a15ef45f650.json +368 -0
  225. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-yuv_common_objects-Debug-ae517204d04beeb2df23.json +522 -0
  226. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-yuv_shared-Debug-42c6196dd1672984dcd7.json +390 -0
  227. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-yuvconstants-Debug-7e8432d4753ee3bd592d.json +136 -0
  228. package/android/.cxx/Debug/2a3w6u3n/x86/.cmake/api/v1/reply/target-yuvconvert-Debug-2cc934aa605d443ac9a1.json +157 -0
  229. package/android/.cxx/Debug/2a3w6u3n/x86/.ninja_deps +0 -0
  230. package/android/.cxx/Debug/2a3w6u3n/x86/.ninja_log +55 -0
  231. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeCache.txt +463 -0
  232. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +72 -0
  233. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +83 -0
  234. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  235. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  236. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +15 -0
  237. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +803 -0
  238. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  239. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +791 -0
  240. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  241. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/CMakeOutput.log +258 -0
  242. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/TargetDirectories.txt +24 -0
  243. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/cmake.check_cache +1 -0
  244. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/faceantispoof.dir/FaceAntiSpoofJSI.cpp.o +0 -0
  245. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/faceantispoof.dir/c9fdc8b0d027394fa06b64ba7ac7706f/react-native/ReactCommon/jsi/jsi/jsi.cpp.o +0 -0
  246. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/fastyuv.dir/FastYuvJni.cpp.o +0 -0
  247. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/fastyuv.dir/fast_yuv.cpp.o +0 -0
  248. package/android/.cxx/Debug/2a3w6u3n/x86/CMakeFiles/rules.ninja +168 -0
  249. package/android/.cxx/Debug/2a3w6u3n/x86/CPackConfig.cmake +71 -0
  250. package/android/.cxx/Debug/2a3w6u3n/x86/CPackSourceConfig.cmake +79 -0
  251. package/android/.cxx/Debug/2a3w6u3n/x86/additional_project_files.txt +40 -0
  252. package/android/.cxx/Debug/2a3w6u3n/x86/android_gradle_build.json +91 -0
  253. package/android/.cxx/Debug/2a3w6u3n/x86/android_gradle_build_mini.json +72 -0
  254. package/android/.cxx/Debug/2a3w6u3n/x86/build.ninja +945 -0
  255. package/android/.cxx/Debug/2a3w6u3n/x86/build_file_index.txt +3 -0
  256. package/android/.cxx/Debug/2a3w6u3n/x86/cmake_install.cmake +59 -0
  257. package/android/.cxx/Debug/2a3w6u3n/x86/compile_commands.json +237 -0
  258. package/android/.cxx/Debug/2a3w6u3n/x86/compile_commands.json.bin +0 -0
  259. package/android/.cxx/Debug/2a3w6u3n/x86/configure_fingerprint.bin +29 -0
  260. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/cpuid.dir/util/cpuid.c.o +0 -0
  261. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare.cc.o +0 -0
  262. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_common.cc.o +0 -0
  263. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_gcc.cc.o +0 -0
  264. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_win.cc.o +0 -0
  265. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert.cc.o +0 -0
  266. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_argb.cc.o +0 -0
  267. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from.cc.o +0 -0
  268. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from_argb.cc.o +0 -0
  269. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_jpeg.cc.o +0 -0
  270. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_argb.cc.o +0 -0
  271. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_i420.cc.o +0 -0
  272. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/cpu_id.cc.o +0 -0
  273. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_decoder.cc.o +0 -0
  274. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_validate.cc.o +0 -0
  275. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/planar_functions.cc.o +0 -0
  276. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate.cc.o +0 -0
  277. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_any.cc.o +0 -0
  278. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_argb.cc.o +0 -0
  279. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_common.cc.o +0 -0
  280. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_gcc.cc.o +0 -0
  281. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_lsx.cc.o +0 -0
  282. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_win.cc.o +0 -0
  283. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_any.cc.o +0 -0
  284. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_common.cc.o +0 -0
  285. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_gcc.cc.o +0 -0
  286. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lasx.cc.o +0 -0
  287. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lsx.cc.o +0 -0
  288. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_rvv.cc.o +0 -0
  289. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_win.cc.o +0 -0
  290. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale.cc.o +0 -0
  291. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_any.cc.o +0 -0
  292. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_argb.cc.o +0 -0
  293. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_common.cc.o +0 -0
  294. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_gcc.cc.o +0 -0
  295. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_lsx.cc.o +0 -0
  296. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rgb.cc.o +0 -0
  297. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rvv.cc.o +0 -0
  298. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_uv.cc.o +0 -0
  299. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_win.cc.o +0 -0
  300. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuv_common_objects.dir/source/video_common.cc.o +0 -0
  301. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuvconstants.dir/util/yuvconstants.c.o +0 -0
  302. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/CMakeFiles/yuvconvert.dir/util/yuvconvert.cc.o +0 -0
  303. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/cmake_install.cmake +87 -0
  304. package/android/.cxx/Debug/2a3w6u3n/x86/libyuv/libyuv.a +0 -0
  305. package/android/.cxx/Debug/2a3w6u3n/x86/metadata_generation_command.txt +19 -0
  306. package/android/.cxx/Debug/2a3w6u3n/x86/prefab_config.json +4 -0
  307. package/android/.cxx/Debug/2a3w6u3n/x86/symbol_folder_index.txt +1 -0
  308. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  309. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  310. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  311. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/cache-v2-5ca7fb88a80849964189.json +1587 -0
  312. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-9871675aa6610f6180ca.json +857 -0
  313. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/codemodel-v2-deb41c72c38c1ff57431.json +158 -0
  314. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +14 -0
  315. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/directory-libyuv-Debug-edf355e979425c71897d.json +100 -0
  316. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/index-2025-11-18T09-42-00-0374.json +92 -0
  317. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-cpuid-Debug-264b6f675c69e42e8113.json +136 -0
  318. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-faceantispoof-Debug-c95714fd9c4cd04d4222.json +181 -0
  319. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-fastyuv-Debug-80c6b1b5d8e35770dde3.json +157 -0
  320. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-yuv-Debug-6d3d5c5dcc6bffc18ce6.json +368 -0
  321. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-yuv_common_objects-Debug-ae517204d04beeb2df23.json +522 -0
  322. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-yuv_shared-Debug-6e364a075e5b9b47274e.json +390 -0
  323. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-yuvconstants-Debug-f6a29384c5629faf75f4.json +136 -0
  324. package/android/.cxx/Debug/2a3w6u3n/x86_64/.cmake/api/v1/reply/target-yuvconvert-Debug-dca5f1cf9af89281fc95.json +157 -0
  325. package/android/.cxx/Debug/2a3w6u3n/x86_64/.ninja_deps +0 -0
  326. package/android/.cxx/Debug/2a3w6u3n/x86_64/.ninja_log +55 -0
  327. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeCache.txt +463 -0
  328. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +72 -0
  329. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +83 -0
  330. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  331. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  332. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +15 -0
  333. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +803 -0
  334. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  335. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +791 -0
  336. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  337. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/CMakeOutput.log +258 -0
  338. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/TargetDirectories.txt +24 -0
  339. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/cmake.check_cache +1 -0
  340. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/faceantispoof.dir/FaceAntiSpoofJSI.cpp.o +0 -0
  341. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/faceantispoof.dir/c9fdc8b0d027394fa06b64ba7ac7706f/react-native/ReactCommon/jsi/jsi/jsi.cpp.o +0 -0
  342. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/fastyuv.dir/FastYuvJni.cpp.o +0 -0
  343. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/fastyuv.dir/fast_yuv.cpp.o +0 -0
  344. package/android/.cxx/Debug/2a3w6u3n/x86_64/CMakeFiles/rules.ninja +168 -0
  345. package/android/.cxx/Debug/2a3w6u3n/x86_64/CPackConfig.cmake +71 -0
  346. package/android/.cxx/Debug/2a3w6u3n/x86_64/CPackSourceConfig.cmake +79 -0
  347. package/android/.cxx/Debug/2a3w6u3n/x86_64/additional_project_files.txt +40 -0
  348. package/android/.cxx/Debug/2a3w6u3n/x86_64/android_gradle_build.json +91 -0
  349. package/android/.cxx/Debug/2a3w6u3n/x86_64/android_gradle_build_mini.json +72 -0
  350. package/android/.cxx/Debug/2a3w6u3n/x86_64/build.ninja +945 -0
  351. package/android/.cxx/Debug/2a3w6u3n/x86_64/build_file_index.txt +3 -0
  352. package/android/.cxx/Debug/2a3w6u3n/x86_64/cmake_install.cmake +59 -0
  353. package/android/.cxx/Debug/2a3w6u3n/x86_64/compile_commands.json +237 -0
  354. package/android/.cxx/Debug/2a3w6u3n/x86_64/compile_commands.json.bin +0 -0
  355. package/android/.cxx/Debug/2a3w6u3n/x86_64/configure_fingerprint.bin +29 -0
  356. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/cpuid.dir/util/cpuid.c.o +0 -0
  357. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare.cc.o +0 -0
  358. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_common.cc.o +0 -0
  359. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_gcc.cc.o +0 -0
  360. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/compare_win.cc.o +0 -0
  361. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert.cc.o +0 -0
  362. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_argb.cc.o +0 -0
  363. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from.cc.o +0 -0
  364. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_from_argb.cc.o +0 -0
  365. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_jpeg.cc.o +0 -0
  366. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_argb.cc.o +0 -0
  367. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/convert_to_i420.cc.o +0 -0
  368. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/cpu_id.cc.o +0 -0
  369. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_decoder.cc.o +0 -0
  370. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/mjpeg_validate.cc.o +0 -0
  371. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/planar_functions.cc.o +0 -0
  372. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate.cc.o +0 -0
  373. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_any.cc.o +0 -0
  374. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_argb.cc.o +0 -0
  375. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_common.cc.o +0 -0
  376. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_gcc.cc.o +0 -0
  377. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_lsx.cc.o +0 -0
  378. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/rotate_win.cc.o +0 -0
  379. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_any.cc.o +0 -0
  380. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_common.cc.o +0 -0
  381. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_gcc.cc.o +0 -0
  382. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lasx.cc.o +0 -0
  383. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_lsx.cc.o +0 -0
  384. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_rvv.cc.o +0 -0
  385. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/row_win.cc.o +0 -0
  386. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale.cc.o +0 -0
  387. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_any.cc.o +0 -0
  388. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_argb.cc.o +0 -0
  389. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_common.cc.o +0 -0
  390. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_gcc.cc.o +0 -0
  391. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_lsx.cc.o +0 -0
  392. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rgb.cc.o +0 -0
  393. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_rvv.cc.o +0 -0
  394. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_uv.cc.o +0 -0
  395. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/scale_win.cc.o +0 -0
  396. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuv_common_objects.dir/source/video_common.cc.o +0 -0
  397. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuvconstants.dir/util/yuvconstants.c.o +0 -0
  398. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/CMakeFiles/yuvconvert.dir/util/yuvconvert.cc.o +0 -0
  399. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/cmake_install.cmake +87 -0
  400. package/android/.cxx/Debug/2a3w6u3n/x86_64/libyuv/libyuv.a +0 -0
  401. package/android/.cxx/Debug/2a3w6u3n/x86_64/metadata_generation_command.txt +19 -0
  402. package/android/.cxx/Debug/2a3w6u3n/x86_64/prefab_config.json +4 -0
  403. package/android/.cxx/Debug/2a3w6u3n/x86_64/symbol_folder_index.txt +1 -0
  404. package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +277 -0
  405. package/android/.cxx/tools/debug/armeabi-v7a/compile_commands.json +257 -0
  406. package/android/.cxx/tools/debug/x86/compile_commands.json +237 -0
  407. package/android/.cxx/tools/debug/x86_64/compile_commands.json +237 -0
  408. package/android/build/.transforms/477a48f41cbd60a6044ae2b6659edb2d/results.bin +1 -0
  409. package/android/build/.transforms/477a48f41cbd60a6044ae2b6659edb2d/transformed/classes/classes_dex/classes.dex +0 -0
  410. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/results.bin +1 -0
  411. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/AcceleratorConfig.dex +0 -0
  412. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/AntiSpoofingResult.dex +0 -0
  413. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/BuildConfig.dex +0 -0
  414. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofFrameProcessor.dex +0 -0
  415. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofModule$Companion.dex +0 -0
  416. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofModule.dex +0 -0
  417. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofPackage.dex +0 -0
  418. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofingAdvanced$Companion.dex +0 -0
  419. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FaceAntiSpoofingAdvanced.dex +0 -0
  420. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/FastYuv.dex +0 -0
  421. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/YuvToFloatArrayConverter.dex +0 -0
  422. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/faceantispoof/YuvToRgbConverter.dex +0 -0
  423. package/android/build/.transforms/4b58c518b6e650677b3ff7c47c32914f/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  424. package/android/build/generated/source/buildConfig/debug/com/faceantispoof/BuildConfig.java +14 -0
  425. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +13 -0
  426. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +18 -0
  427. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +6 -0
  428. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +1 -0
  429. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  430. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  431. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +1 -0
  432. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/build_command_targets.bat +10 -0
  433. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/build_model.json +199 -0
  434. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/build_stderr_targets.txt +0 -0
  435. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/build_stdout_targets.txt +63 -0
  436. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/configure_command.bat +19 -0
  437. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/configure_stderr.txt +0 -0
  438. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/configure_stdout.txt +21 -0
  439. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/generate_cxx_metadata_8656_timing.txt +9 -0
  440. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/arm64-v8a/metadata_generation_record.json +158 -0
  441. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/build_command_targets.bat +10 -0
  442. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/build_model.json +199 -0
  443. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/build_stderr_targets.txt +0 -0
  444. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/build_stdout_targets.txt +59 -0
  445. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/configure_command.bat +19 -0
  446. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/configure_stderr.txt +1 -0
  447. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/configure_stdout.txt +19 -0
  448. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/generate_cxx_metadata_8659_timing.txt +9 -0
  449. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/armeabi-v7a/metadata_generation_record.json +158 -0
  450. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/build_command_targets.bat +10 -0
  451. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/build_model.json +199 -0
  452. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/build_stderr_targets.txt +0 -0
  453. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/build_stdout_targets.txt +55 -0
  454. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/configure_command.bat +19 -0
  455. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/configure_stderr.txt +0 -0
  456. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/configure_stdout.txt +19 -0
  457. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/generate_cxx_metadata_8659_timing.txt +9 -0
  458. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86/metadata_generation_record.json +158 -0
  459. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/build_command_targets.bat +10 -0
  460. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/build_model.json +199 -0
  461. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/build_stderr_targets.txt +0 -0
  462. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/build_stdout_targets.txt +55 -0
  463. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/configure_command.bat +19 -0
  464. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/configure_stderr.txt +0 -0
  465. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/configure_stdout.txt +19 -0
  466. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/generate_cxx_metadata_8659_timing.txt +9 -0
  467. package/android/build/intermediates/cxx/Debug/2a3w6u3n/logs/x86_64/metadata_generation_record.json +158 -0
  468. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/cpuid +0 -0
  469. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/libfaceantispoof.so +0 -0
  470. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/libfastyuv.so +0 -0
  471. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/libyuv.so +0 -0
  472. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/yuvconstants +0 -0
  473. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/arm64-v8a/yuvconvert +0 -0
  474. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/cpuid +0 -0
  475. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/libfaceantispoof.so +0 -0
  476. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/libfastyuv.so +0 -0
  477. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/libyuv.so +0 -0
  478. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/yuvconstants +0 -0
  479. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/armeabi-v7a/yuvconvert +0 -0
  480. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/cpuid +0 -0
  481. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/libfaceantispoof.so +0 -0
  482. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/libfastyuv.so +0 -0
  483. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/libyuv.so +0 -0
  484. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/yuvconstants +0 -0
  485. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86/yuvconvert +0 -0
  486. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/cpuid +0 -0
  487. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/libfaceantispoof.so +0 -0
  488. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/libfastyuv.so +0 -0
  489. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/libyuv.so +0 -0
  490. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/yuvconstants +0 -0
  491. package/android/build/intermediates/cxx/Debug/2a3w6u3n/obj/x86_64/yuvconvert +0 -0
  492. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -0
  493. package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +4 -0
  494. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +2 -0
  495. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +2 -0
  496. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +2 -0
  497. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +2 -0
  498. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-vision-camera-face-antispoof-detector_debug.kotlin_module +0 -0
  499. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/faceantispoof/BuildConfig.class +0 -0
  500. package/android/build/intermediates/library_assets/debug/packageDebugAssets/out/FaceAntiSpoofing.tflite +0 -0
  501. package/android/build/intermediates/library_assets/debug/packageDebugAssets/out/spoof_model_scale_2_7.tflite +0 -0
  502. package/android/build/intermediates/library_assets/debug/packageDebugAssets/out/spoof_model_scale_4_0.tflite +0 -0
  503. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/arm64-v8a/libfaceantispoof.so +0 -0
  504. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/arm64-v8a/libfastyuv.so +0 -0
  505. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/arm64-v8a/libyuv.so +0 -0
  506. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/armeabi-v7a/libfaceantispoof.so +0 -0
  507. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/armeabi-v7a/libfastyuv.so +0 -0
  508. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/armeabi-v7a/libyuv.so +0 -0
  509. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86/libfaceantispoof.so +0 -0
  510. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86/libfastyuv.so +0 -0
  511. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86/libyuv.so +0 -0
  512. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86_64/libfaceantispoof.so +0 -0
  513. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86_64/libfastyuv.so +0 -0
  514. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86_64/libyuv.so +0 -0
  515. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +3 -0
  516. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +17 -0
  517. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +13 -0
  518. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libfaceantispoof.so +0 -0
  519. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libfastyuv.so +0 -0
  520. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libyuv.so +0 -0
  521. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libfaceantispoof.so +0 -0
  522. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libfastyuv.so +0 -0
  523. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libyuv.so +0 -0
  524. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libfaceantispoof.so +0 -0
  525. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libfastyuv.so +0 -0
  526. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libyuv.so +0 -0
  527. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libfaceantispoof.so +0 -0
  528. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libfastyuv.so +0 -0
  529. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libyuv.so +0 -0
  530. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +1 -0
  531. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
  532. package/android/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml +4 -0
  533. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-vision-camera-face-antispoof-detector_debug.kotlin_module +0 -0
  534. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/AcceleratorConfig.class +0 -0
  535. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/AntiSpoofingResult.class +0 -0
  536. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/BuildConfig.class +0 -0
  537. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofFrameProcessor.class +0 -0
  538. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofModule$Companion.class +0 -0
  539. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofModule.class +0 -0
  540. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofPackage.class +0 -0
  541. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofingAdvanced$Companion.class +0 -0
  542. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FaceAntiSpoofingAdvanced.class +0 -0
  543. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/FastYuv.class +0 -0
  544. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/YuvToFloatArrayConverter.class +0 -0
  545. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/faceantispoof/YuvToRgbConverter.class +0 -0
  546. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  547. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +2 -0
  548. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  549. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  550. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  551. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  552. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  553. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  554. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  555. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  556. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  557. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  558. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  559. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  560. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  561. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  562. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  563. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  564. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  565. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  566. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  567. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  568. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  569. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  570. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  571. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  572. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  573. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  574. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  575. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  576. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  577. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  578. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  579. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  580. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  581. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  582. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  583. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  584. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  585. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  586. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  587. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  588. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  589. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  590. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  591. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  592. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  593. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  594. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  595. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  596. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  597. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  598. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  599. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  600. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  601. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  602. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  603. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  604. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  605. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  606. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  607. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  608. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  609. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  610. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  611. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +2 -0
  612. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  613. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  614. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  615. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  616. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  617. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  618. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  619. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  620. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  621. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  622. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  623. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  624. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  625. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  626. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  627. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  628. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  629. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  630. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  631. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  632. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  633. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  634. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  635. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  636. package/android/build/outputs/logs/manifest-merger-debug-report.txt +25 -0
  637. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  638. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-vision-camera-face-antispoof-detector_debug.kotlin_module +0 -0
  639. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/AcceleratorConfig.class +0 -0
  640. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/AntiSpoofingResult.class +0 -0
  641. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofFrameProcessor.class +0 -0
  642. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofModule$Companion.class +0 -0
  643. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofModule.class +0 -0
  644. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofPackage.class +0 -0
  645. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofingAdvanced$Companion.class +0 -0
  646. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FaceAntiSpoofingAdvanced.class +0 -0
  647. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/FastYuv.class +0 -0
  648. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/YuvToFloatArrayConverter.class +0 -0
  649. package/android/build/tmp/kotlin-classes/debug/com/faceantispoof/YuvToRgbConverter.class +0 -0
  650. package/android/build.gradle +128 -0
  651. package/android/src/main/AndroidManifest.xml +9 -0
  652. package/android/src/main/assets/FaceAntiSpoofing.tflite +0 -0
  653. package/android/src/main/assets/spoof_model_scale_2_7.tflite +0 -0
  654. package/android/src/main/assets/spoof_model_scale_4_0.tflite +0 -0
  655. package/android/src/main/cpp/CMakeLists.txt +94 -0
  656. package/android/src/main/cpp/FaceAntiSpoofJSI.cpp +68 -0
  657. package/android/src/main/cpp/FastYuvJni.cpp +111 -0
  658. package/android/src/main/cpp/fast_yuv.cpp +332 -0
  659. package/android/src/main/cpp/fast_yuv.h +23 -0
  660. package/android/src/main/cpp/libyuv/.clang-format +6 -0
  661. package/android/src/main/cpp/libyuv/.gn +40 -0
  662. package/android/src/main/cpp/libyuv/.vpython3 +410 -0
  663. package/android/src/main/cpp/libyuv/AUTHORS +7 -0
  664. package/android/src/main/cpp/libyuv/Android.bp +202 -0
  665. package/android/src/main/cpp/libyuv/Android.mk +106 -0
  666. package/android/src/main/cpp/libyuv/BUILD.gn +490 -0
  667. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +70 -0
  668. package/android/src/main/cpp/libyuv/CMakeLists.txt +252 -0
  669. package/android/src/main/cpp/libyuv/DEPS +935 -0
  670. package/android/src/main/cpp/libyuv/DIR_METADATA +3 -0
  671. package/android/src/main/cpp/libyuv/LICENSE +29 -0
  672. package/android/src/main/cpp/libyuv/OWNERS +11 -0
  673. package/android/src/main/cpp/libyuv/PATENTS +24 -0
  674. package/android/src/main/cpp/libyuv/PRESUBMIT.py +65 -0
  675. package/android/src/main/cpp/libyuv/README.chromium +11 -0
  676. package/android/src/main/cpp/libyuv/README.md +19 -0
  677. package/android/src/main/cpp/libyuv/build_overrides/build.gni +60 -0
  678. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +19 -0
  679. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +17 -0
  680. package/android/src/main/cpp/libyuv/codereview.settings +5 -0
  681. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +409 -0
  682. package/android/src/main/cpp/libyuv/docs/environment_variables.md +64 -0
  683. package/android/src/main/cpp/libyuv/docs/feature_detection.md +108 -0
  684. package/android/src/main/cpp/libyuv/docs/filtering.md +196 -0
  685. package/android/src/main/cpp/libyuv/docs/formats.md +208 -0
  686. package/android/src/main/cpp/libyuv/docs/getting_started.md +296 -0
  687. package/android/src/main/cpp/libyuv/docs/rotation.md +107 -0
  688. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +29 -0
  689. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +68 -0
  690. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +111 -0
  691. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +112 -0
  692. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +1117 -0
  693. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +2335 -0
  694. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +203 -0
  695. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +394 -0
  696. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +147 -0
  697. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +99 -0
  698. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +1949 -0
  699. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +195 -0
  700. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +1131 -0
  701. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +296 -0
  702. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +37 -0
  703. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +265 -0
  704. package/android/src/main/cpp/libyuv/include/libyuv/row.h +6738 -0
  705. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +2154 -0
  706. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +336 -0
  707. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +76 -0
  708. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +42 -0
  709. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +1726 -0
  710. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +51 -0
  711. package/android/src/main/cpp/libyuv/include/libyuv/version.h +16 -0
  712. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +222 -0
  713. package/android/src/main/cpp/libyuv/include/libyuv.h +33 -0
  714. package/android/src/main/cpp/libyuv/infra/config/OWNERS +3 -0
  715. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +17 -0
  716. package/android/src/main/cpp/libyuv/infra/config/README.md +2 -0
  717. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +6 -0
  718. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +144 -0
  719. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +1185 -0
  720. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +9 -0
  721. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +246 -0
  722. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +385 -0
  723. package/android/src/main/cpp/libyuv/infra/config/main.star +402 -0
  724. package/android/src/main/cpp/libyuv/infra/config/project.cfg +16 -0
  725. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +111 -0
  726. package/android/src/main/cpp/libyuv/libyuv.gni +34 -0
  727. package/android/src/main/cpp/libyuv/libyuv.gyp +149 -0
  728. package/android/src/main/cpp/libyuv/libyuv.gypi +87 -0
  729. package/android/src/main/cpp/libyuv/linux.mk +96 -0
  730. package/android/src/main/cpp/libyuv/public.mk +13 -0
  731. package/android/src/main/cpp/libyuv/pylintrc +49 -0
  732. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +74 -0
  733. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +56 -0
  734. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +15 -0
  735. package/android/src/main/cpp/libyuv/source/compare.cc +435 -0
  736. package/android/src/main/cpp/libyuv/source/compare_common.cc +74 -0
  737. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +362 -0
  738. package/android/src/main/cpp/libyuv/source/compare_neon.cc +96 -0
  739. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +223 -0
  740. package/android/src/main/cpp/libyuv/source/compare_win.cc +241 -0
  741. package/android/src/main/cpp/libyuv/source/convert.cc +4746 -0
  742. package/android/src/main/cpp/libyuv/source/convert_argb.cc +9179 -0
  743. package/android/src/main/cpp/libyuv/source/convert_from.cc +866 -0
  744. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +3671 -0
  745. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +602 -0
  746. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +391 -0
  747. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +288 -0
  748. package/android/src/main/cpp/libyuv/source/cpu_id.cc +496 -0
  749. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +580 -0
  750. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +71 -0
  751. package/android/src/main/cpp/libyuv/source/planar_functions.cc +5663 -0
  752. package/android/src/main/cpp/libyuv/source/rotate.cc +1241 -0
  753. package/android/src/main/cpp/libyuv/source/rotate_any.cc +76 -0
  754. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +259 -0
  755. package/android/src/main/cpp/libyuv/source/rotate_common.cc +208 -0
  756. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +505 -0
  757. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +233 -0
  758. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +219 -0
  759. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +273 -0
  760. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +174 -0
  761. package/android/src/main/cpp/libyuv/source/rotate_win.cc +253 -0
  762. package/android/src/main/cpp/libyuv/source/row_any.cc +2519 -0
  763. package/android/src/main/cpp/libyuv/source/row_common.cc +4461 -0
  764. package/android/src/main/cpp/libyuv/source/row_gcc.cc +9570 -0
  765. package/android/src/main/cpp/libyuv/source/row_lasx.cc +2343 -0
  766. package/android/src/main/cpp/libyuv/source/row_lsx.cc +3030 -0
  767. package/android/src/main/cpp/libyuv/source/row_neon.cc +4026 -0
  768. package/android/src/main/cpp/libyuv/source/row_neon64.cc +5617 -0
  769. package/android/src/main/cpp/libyuv/source/row_rvv.cc +2599 -0
  770. package/android/src/main/cpp/libyuv/source/row_sme.cc +1183 -0
  771. package/android/src/main/cpp/libyuv/source/row_sve.cc +1088 -0
  772. package/android/src/main/cpp/libyuv/source/row_win.cc +6453 -0
  773. package/android/src/main/cpp/libyuv/source/scale.cc +2710 -0
  774. package/android/src/main/cpp/libyuv/source/scale_any.cc +991 -0
  775. package/android/src/main/cpp/libyuv/source/scale_argb.cc +1158 -0
  776. package/android/src/main/cpp/libyuv/source/scale_common.cc +1977 -0
  777. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +2947 -0
  778. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +739 -0
  779. package/android/src/main/cpp/libyuv/source/scale_neon.cc +1449 -0
  780. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +1552 -0
  781. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +82 -0
  782. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +1971 -0
  783. package/android/src/main/cpp/libyuv/source/scale_sme.cc +555 -0
  784. package/android/src/main/cpp/libyuv/source/scale_uv.cc +1159 -0
  785. package/android/src/main/cpp/libyuv/source/scale_win.cc +1392 -0
  786. package/android/src/main/cpp/libyuv/source/test.sh +35 -0
  787. package/android/src/main/cpp/libyuv/source/video_common.cc +62 -0
  788. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +4 -0
  789. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +931 -0
  790. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +164 -0
  791. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +21 -0
  792. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +13 -0
  793. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +13 -0
  794. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +38 -0
  795. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +3 -0
  796. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +9 -0
  797. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +3 -0
  798. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +15 -0
  799. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +25 -0
  800. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +43 -0
  801. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +848 -0
  802. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +739 -0
  803. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +2867 -0
  804. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +2133 -0
  805. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +427 -0
  806. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +63 -0
  807. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +160 -0
  808. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +4731 -0
  809. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +334 -0
  810. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +962 -0
  811. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +590 -0
  812. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +465 -0
  813. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +280 -0
  814. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +1135 -0
  815. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +249 -0
  816. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +12 -0
  817. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +7 -0
  818. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +5 -0
  819. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +10 -0
  820. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +7 -0
  821. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +4 -0
  822. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +4 -0
  823. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +4 -0
  824. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +23 -0
  825. package/android/src/main/cpp/libyuv/unit_test/testdata/test0.jpg +0 -0
  826. package/android/src/main/cpp/libyuv/unit_test/testdata/test1.jpg +0 -0
  827. package/android/src/main/cpp/libyuv/unit_test/testdata/test2.jpg +0 -0
  828. package/android/src/main/cpp/libyuv/unit_test/testdata/test3.jpg +0 -0
  829. package/android/src/main/cpp/libyuv/unit_test/testdata/test4.jpg +0 -0
  830. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +581 -0
  831. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +232 -0
  832. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +112 -0
  833. package/android/src/main/cpp/libyuv/util/Makefile +9 -0
  834. package/android/src/main/cpp/libyuv/util/color.cc +120 -0
  835. package/android/src/main/cpp/libyuv/util/compare.cc +67 -0
  836. package/android/src/main/cpp/libyuv/util/cpuid.c +211 -0
  837. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +28 -0
  838. package/android/src/main/cpp/libyuv/util/psnr.cc +291 -0
  839. package/android/src/main/cpp/libyuv/util/psnr.h +47 -0
  840. package/android/src/main/cpp/libyuv/util/psnr_main.cc +620 -0
  841. package/android/src/main/cpp/libyuv/util/ssim.cc +364 -0
  842. package/android/src/main/cpp/libyuv/util/ssim.h +38 -0
  843. package/android/src/main/cpp/libyuv/util/yuvconstants.c +114 -0
  844. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +367 -0
  845. package/android/src/main/cpp/libyuv/winarm.mk +47 -0
  846. package/android/src/main/java/com/faceantispoof/AcceleratorConfig.kt +49 -0
  847. package/android/src/main/java/com/faceantispoof/FaceAntiSpoofFrameProcessor.kt +145 -0
  848. package/android/src/main/java/com/faceantispoof/FaceAntiSpoofModule.kt +170 -0
  849. package/android/src/main/java/com/faceantispoof/FaceAntiSpoofPackage.kt +38 -0
  850. package/android/src/main/java/com/faceantispoof/FaceAntiSpoofingAdvanced.kt +288 -0
  851. package/android/src/main/java/com/faceantispoof/FastYuv.kt +51 -0
  852. package/android/src/main/java/com/faceantispoof/YuvToFloatArrayConverter.kt +198 -0
  853. package/android/src/main/java/com/faceantispoof/YuvToRgbConverter.kt +73 -0
  854. package/android/src/main/res/values/strings.xml +3 -0
  855. package/index.d.ts +84 -0
  856. package/index.js +47 -0
  857. package/package.json +73 -0
@@ -0,0 +1,4026 @@
1
+ /*
2
+ * Copyright 2011 The LibYuv Project Authors. All rights reserved.
3
+ *
4
+ * Use of this source code is governed by a BSD-style license
5
+ * that can be found in the LICENSE file in the root of the source
6
+ * tree. An additional intellectual property rights grant can be found
7
+ * in the file PATENTS. All contributing project authors may
8
+ * be found in the AUTHORS file in the root of the source tree.
9
+ */
10
+
11
+ #include "libyuv/row.h"
12
+
13
+ #ifdef __cplusplus
14
+ namespace libyuv {
15
+ extern "C" {
16
+ #endif
17
+
18
+ // This module is for GCC Neon
19
+ #if !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__) && \
20
+ !defined(__aarch64__)
21
+
22
+ // d8-d15, r4-r11,r14(lr) need to be preserved if used. r13(sp),r15(pc) are
23
+ // reserved.
24
+
25
+ // q0: Y uint16x8_t
26
+ // d2: U uint8x8_t
27
+ // d3: V uint8x8_t
28
+
29
+ // Read 8 Y, 4 U and 4 V from 422
30
+ #define READYUV422 \
31
+ "vld1.8 {d0}, [%[src_y]]! \n" \
32
+ "vld1.32 {d2[0]}, [%[src_u]]! \n" \
33
+ "vld1.32 {d2[1]}, [%[src_v]]! \n" \
34
+ "vmov.u8 d1, d0 \n" \
35
+ "vmovl.u8 q1, d2 \n" \
36
+ "vzip.u8 d0, d1 \n" \
37
+ "vsli.u16 q1, q1, #8 \n"
38
+
39
+ // Read 8 Y, 8 U and 8 V from 444
40
+ #define READYUV444 \
41
+ "vld1.8 {d0}, [%[src_y]]! \n" \
42
+ "vld1.8 {d2}, [%[src_u]]! \n" \
43
+ "vmovl.u8 q0, d0 \n" \
44
+ "vld1.8 {d3}, [%[src_v]]! \n" \
45
+ "vsli.u16 q0, q0, #8 \n"
46
+
47
+ // Read 8 Y, and set 4 U and 4 V to 128
48
+ #define READYUV400 \
49
+ "vld1.8 {d0}, [%[src_y]]! \n" \
50
+ "vmov.u8 q1, #128 \n" \
51
+ "vmovl.u8 q0, d0 \n" \
52
+ "vsli.u16 q0, q0, #8 \n"
53
+
54
+ // Read 8 Y and 4 UV from NV12
55
+ #define READNV12 \
56
+ "vld1.8 {d0}, [%[src_y]]! \n" \
57
+ "vld1.8 {d2}, [%[src_uv]]! \n" \
58
+ "vmov.u8 d1, d0 \n" \
59
+ "vmov.u8 d3, d2 \n" \
60
+ "vzip.u8 d0, d1 \n" \
61
+ "vsli.u16 d2, d2, #8 \n" /* Duplicate low byte (U) */ \
62
+ "vsri.u16 d3, d3, #8 \n" /* Duplicate high byte (V) */
63
+
64
+ // Read 8 Y and 4 VU from NV21
65
+ #define READNV21 \
66
+ "vld1.8 {d0}, [%[src_y]]! \n" \
67
+ "vld1.8 {d2}, [%[src_vu]]! \n" \
68
+ "vmov.u8 d1, d0 \n" \
69
+ "vmov.u8 d3, d2 \n" \
70
+ "vzip.u8 d0, d1 \n" \
71
+ "vsri.u16 d2, d2, #8 \n" /* Duplicate high byte (U) */ \
72
+ "vsli.u16 d3, d3, #8 \n" /* Duplicate low byte (V) */
73
+
74
+ // Read 8 YUY2
75
+ #define READYUY2 \
76
+ "vld2.8 {d0, d2}, [%[src_yuy2]]! \n" \
77
+ "vmovl.u8 q0, d0 \n" \
78
+ "vmov.u8 d3, d2 \n" \
79
+ "vsli.u16 q0, q0, #8 \n" \
80
+ "vsli.u16 d2, d2, #8 \n" \
81
+ "vsri.u16 d3, d3, #8 \n"
82
+
83
+ // Read 8 UYVY
84
+ #define READUYVY \
85
+ "vld2.8 {d2, d3}, [%[src_uyvy]]! \n" \
86
+ "vmovl.u8 q0, d3 \n" \
87
+ "vmov.u8 d3, d2 \n" \
88
+ "vsli.u16 q0, q0, #8 \n" \
89
+ "vsli.u16 d2, d2, #8 \n" \
90
+ "vsri.u16 d3, d3, #8 \n"
91
+
92
+ // TODO: Use single register for kUVCoeff and multiply by lane
93
+ #define YUVTORGB_SETUP \
94
+ "vld1.16 {d31}, [%[kRGBCoeffBias]] \n" \
95
+ "vld4.8 {d26[], d27[], d28[], d29[]}, [%[kUVCoeff]] \n" \
96
+ "vdup.u16 q10, d31[1] \n" \
97
+ "vdup.u16 q11, d31[2] \n" \
98
+ "vdup.u16 q12, d31[3] \n" \
99
+ "vdup.u16 d31, d31[0] \n"
100
+
101
+ // q0: B uint16x8_t
102
+ // q1: G uint16x8_t
103
+ // q2: R uint16x8_t
104
+
105
+ // Convert from YUV to 2.14 fixed point RGB
106
+ #define YUVTORGB \
107
+ "vmull.u16 q2, d1, d31 \n" \
108
+ "vmull.u8 q8, d3, d29 \n" /* DGV */ \
109
+ "vmull.u16 q0, d0, d31 \n" \
110
+ "vmlal.u8 q8, d2, d28 \n" /* DG */ \
111
+ "vqshrn.u32 d0, q0, #16 \n" \
112
+ "vqshrn.u32 d1, q2, #16 \n" /* Y */ \
113
+ "vmull.u8 q9, d2, d26 \n" /* DB */ \
114
+ "vmull.u8 q2, d3, d27 \n" /* DR */ \
115
+ "vadd.u16 q4, q0, q11 \n" /* G */ \
116
+ "vadd.u16 q2, q0, q2 \n" /* R */ \
117
+ "vadd.u16 q0, q0, q9 \n" /* B */ \
118
+ "vqsub.u16 q1, q4, q8 \n" /* G */ \
119
+ "vqsub.u16 q0, q0, q10 \n" /* B */ \
120
+ "vqsub.u16 q2, q2, q12 \n" /* R */
121
+
122
+ // Convert from 2.14 fixed point RGB To 8 bit RGB
123
+ #define RGBTORGB8 \
124
+ "vqshrn.u16 d4, q2, #6 \n" /* R */ \
125
+ "vqshrn.u16 d2, q1, #6 \n" /* G */ \
126
+ "vqshrn.u16 d0, q0, #6 \n" /* B */
127
+
128
+ #define YUVTORGB_REGS \
129
+ "q0", "q1", "q2", "q4", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "d31"
130
+
131
+ #define STORERGBA \
132
+ "vmov.u8 d1, d0 \n" \
133
+ "vmov.u8 d3, d4 \n" \
134
+ "vmov.u8 d0, d6 \n" \
135
+ "vst4.8 {d0, d1, d2, d3}, [%[dst_rgba]]! \n"
136
+
137
+ void I444ToARGBRow_NEON(const uint8_t* src_y,
138
+ const uint8_t* src_u,
139
+ const uint8_t* src_v,
140
+ uint8_t* dst_argb,
141
+ const struct YuvConstants* yuvconstants,
142
+ int width) {
143
+ asm volatile(
144
+ YUVTORGB_SETUP
145
+ "vmov.u8 d6, #255 \n"
146
+ "1: \n" //
147
+ READYUV444
148
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
149
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
150
+ "bgt 1b \n"
151
+ : [src_y] "+r"(src_y), // %[src_y]
152
+ [src_u] "+r"(src_u), // %[src_u]
153
+ [src_v] "+r"(src_v), // %[src_v]
154
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
155
+ [width] "+r"(width) // %[width]
156
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
157
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
158
+ : "cc", "memory", YUVTORGB_REGS, "d6");
159
+ }
160
+
161
+ void I444ToRGB24Row_NEON(const uint8_t* src_y,
162
+ const uint8_t* src_u,
163
+ const uint8_t* src_v,
164
+ uint8_t* dst_rgb24,
165
+ const struct YuvConstants* yuvconstants,
166
+ int width) {
167
+ asm volatile(
168
+ YUVTORGB_SETUP
169
+ "1: \n" //
170
+ READYUV444
171
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
172
+ "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n"
173
+ "bgt 1b \n"
174
+ : [src_y] "+r"(src_y), // %[src_y]
175
+ [src_u] "+r"(src_u), // %[src_u]
176
+ [src_v] "+r"(src_v), // %[src_v]
177
+ [dst_rgb24] "+r"(dst_rgb24), // %[dst_argb]
178
+ [width] "+r"(width) // %[width]
179
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
180
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
181
+ : "cc", "memory", YUVTORGB_REGS);
182
+ }
183
+
184
+ void I422ToARGBRow_NEON(const uint8_t* src_y,
185
+ const uint8_t* src_u,
186
+ const uint8_t* src_v,
187
+ uint8_t* dst_argb,
188
+ const struct YuvConstants* yuvconstants,
189
+ int width) {
190
+ asm volatile(
191
+ YUVTORGB_SETUP
192
+ "vmov.u8 d6, #255 \n"
193
+ "1: \n" //
194
+ READYUV422
195
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
196
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
197
+ "bgt 1b \n"
198
+ : [src_y] "+r"(src_y), // %[src_y]
199
+ [src_u] "+r"(src_u), // %[src_u]
200
+ [src_v] "+r"(src_v), // %[src_v]
201
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
202
+ [width] "+r"(width) // %[width]
203
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
204
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
205
+ : "cc", "memory", YUVTORGB_REGS, "d6");
206
+ }
207
+
208
+ void I444AlphaToARGBRow_NEON(const uint8_t* src_y,
209
+ const uint8_t* src_u,
210
+ const uint8_t* src_v,
211
+ const uint8_t* src_a,
212
+ uint8_t* dst_argb,
213
+ const struct YuvConstants* yuvconstants,
214
+ int width) {
215
+ asm volatile(
216
+ YUVTORGB_SETUP
217
+ "1: \n" //
218
+ READYUV444
219
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
220
+ "vld1.8 {d6}, [%[src_a]]! \n"
221
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
222
+ "bgt 1b \n"
223
+ : [src_y] "+r"(src_y), // %[src_y]
224
+ [src_u] "+r"(src_u), // %[src_u]
225
+ [src_v] "+r"(src_v), // %[src_v]
226
+ [src_a] "+r"(src_a), // %[src_a]
227
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
228
+ [width] "+r"(width) // %[width]
229
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
230
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
231
+ : "cc", "memory", YUVTORGB_REGS, "d6");
232
+ }
233
+
234
+ void I422AlphaToARGBRow_NEON(const uint8_t* src_y,
235
+ const uint8_t* src_u,
236
+ const uint8_t* src_v,
237
+ const uint8_t* src_a,
238
+ uint8_t* dst_argb,
239
+ const struct YuvConstants* yuvconstants,
240
+ int width) {
241
+ asm volatile(
242
+ YUVTORGB_SETUP
243
+ "1: \n" //
244
+ READYUV422
245
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
246
+ "vld1.8 {d6}, [%[src_a]]! \n"
247
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
248
+ "bgt 1b \n"
249
+ : [src_y] "+r"(src_y), // %[src_y]
250
+ [src_u] "+r"(src_u), // %[src_u]
251
+ [src_v] "+r"(src_v), // %[src_v]
252
+ [src_a] "+r"(src_a), // %[src_a]
253
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
254
+ [width] "+r"(width) // %[width]
255
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
256
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
257
+ : "cc", "memory", YUVTORGB_REGS, "d6");
258
+ }
259
+
260
+ void I422ToRGBARow_NEON(const uint8_t* src_y,
261
+ const uint8_t* src_u,
262
+ const uint8_t* src_v,
263
+ uint8_t* dst_rgba,
264
+ const struct YuvConstants* yuvconstants,
265
+ int width) {
266
+ asm volatile(
267
+ YUVTORGB_SETUP
268
+ "vmov.u8 d6, #255 \n"
269
+ "1: \n" //
270
+ READYUV422 //
271
+ "subs %[width], %[width], #8 \n" //
272
+ YUVTORGB //
273
+ RGBTORGB8 //
274
+ STORERGBA //
275
+ "bgt 1b \n"
276
+ : [src_y] "+r"(src_y), // %[src_y]
277
+ [src_u] "+r"(src_u), // %[src_u]
278
+ [src_v] "+r"(src_v), // %[src_v]
279
+ [dst_rgba] "+r"(dst_rgba), // %[dst_rgba]
280
+ [width] "+r"(width) // %[width]
281
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
282
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
283
+ : "cc", "memory", YUVTORGB_REGS, "d6");
284
+ }
285
+
286
+ void I422ToRGB24Row_NEON(const uint8_t* src_y,
287
+ const uint8_t* src_u,
288
+ const uint8_t* src_v,
289
+ uint8_t* dst_rgb24,
290
+ const struct YuvConstants* yuvconstants,
291
+ int width) {
292
+ asm volatile(
293
+ YUVTORGB_SETUP
294
+ "vmov.u8 d6, #255 \n"
295
+ "1: \n" //
296
+ READYUV422
297
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
298
+ "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n"
299
+ "bgt 1b \n"
300
+ : [src_y] "+r"(src_y), // %[src_y]
301
+ [src_u] "+r"(src_u), // %[src_u]
302
+ [src_v] "+r"(src_v), // %[src_v]
303
+ [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24]
304
+ [width] "+r"(width) // %[width]
305
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
306
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
307
+ : "cc", "memory", YUVTORGB_REGS);
308
+ }
309
+
310
+ #define ARGBTORGB565 \
311
+ "vshll.u8 q2, d4, #8 \n" /* R */ \
312
+ "vshll.u8 q1, d2, #8 \n" /* G */ \
313
+ "vshll.u8 q0, d0, #8 \n" /* B */ \
314
+ "vsri.16 q2, q1, #5 \n" /* RG */ \
315
+ "vsri.16 q2, q0, #11 \n" /* RGB */
316
+
317
+ void I422ToRGB565Row_NEON(const uint8_t* src_y,
318
+ const uint8_t* src_u,
319
+ const uint8_t* src_v,
320
+ uint8_t* dst_rgb565,
321
+ const struct YuvConstants* yuvconstants,
322
+ int width) {
323
+ asm volatile(
324
+ YUVTORGB_SETUP
325
+ "vmov.u8 d6, #255 \n"
326
+ "1: \n" //
327
+ READYUV422
328
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
329
+ ARGBTORGB565
330
+ "vst1.8 {q2}, [%[dst_rgb565]]! \n" // store 8 pixels RGB565.
331
+ "bgt 1b \n"
332
+ : [src_y] "+r"(src_y), // %[src_y]
333
+ [src_u] "+r"(src_u), // %[src_u]
334
+ [src_v] "+r"(src_v), // %[src_v]
335
+ [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565]
336
+ [width] "+r"(width) // %[width]
337
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
338
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
339
+ : "cc", "memory", YUVTORGB_REGS);
340
+ }
341
+
342
+ #define ARGBTOARGB1555 \
343
+ "vshll.u8 q3, d6, #8 \n" /* A */ \
344
+ "vshll.u8 q2, d4, #8 \n" /* R */ \
345
+ "vshll.u8 q1, d2, #8 \n" /* G */ \
346
+ "vshll.u8 q0, d0, #8 \n" /* B */ \
347
+ "vsri.16 q3, q2, #1 \n" /* AR */ \
348
+ "vsri.16 q3, q1, #6 \n" /* ARG */ \
349
+ "vsri.16 q3, q0, #11 \n" /* ARGB */
350
+
351
+ void I422ToARGB1555Row_NEON(const uint8_t* src_y,
352
+ const uint8_t* src_u,
353
+ const uint8_t* src_v,
354
+ uint8_t* dst_argb1555,
355
+ const struct YuvConstants* yuvconstants,
356
+ int width) {
357
+ asm volatile(
358
+ YUVTORGB_SETUP
359
+ "1: \n" //
360
+ READYUV422
361
+ "subs %[width], %[width], #8 \n" YUVTORGB RGBTORGB8
362
+ "vmov.u8 d6, #0xff \n" ARGBTOARGB1555
363
+ "vst1.8 {q3}, [%[dst_argb1555]]! \n" // store 8 pixels RGB1555.
364
+ "bgt 1b \n"
365
+ : [src_y] "+r"(src_y), // %[src_y]
366
+ [src_u] "+r"(src_u), // %[src_u]
367
+ [src_v] "+r"(src_v), // %[src_v]
368
+ [dst_argb1555] "+r"(dst_argb1555), // %[dst_argb1555]
369
+ [width] "+r"(width) // %[width]
370
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
371
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
372
+ : "cc", "memory", YUVTORGB_REGS, "q3");
373
+ }
374
+
375
+ #define ARGBTOARGB4444 \
376
+ "vshr.u8 d0, d0, #4 \n" /* B */ \
377
+ "vbic.32 d2, d2, d7 \n" /* G */ \
378
+ "vshr.u8 d4, d4, #4 \n" /* R */ \
379
+ "vbic.32 d6, d6, d7 \n" /* A */ \
380
+ "vorr d0, d0, d2 \n" /* BG */ \
381
+ "vorr d1, d4, d6 \n" /* RA */ \
382
+ "vzip.u8 d0, d1 \n" /* BGRA */
383
+
384
+ void I422ToARGB4444Row_NEON(const uint8_t* src_y,
385
+ const uint8_t* src_u,
386
+ const uint8_t* src_v,
387
+ uint8_t* dst_argb4444,
388
+ const struct YuvConstants* yuvconstants,
389
+ int width) {
390
+ asm volatile(
391
+ YUVTORGB_SETUP
392
+ "vmov.u8 d6, #255 \n"
393
+ "vmov.u8 d7, #0x0f \n" // vbic bits to clear
394
+ "1: \n" //
395
+ READYUV422 YUVTORGB RGBTORGB8
396
+ "subs %[width], %[width], #8 \n" ARGBTOARGB4444
397
+ "vst1.8 {q0}, [%[dst_argb4444]]! \n" // store 8 pixels
398
+ "bgt 1b \n"
399
+ : [src_y] "+r"(src_y), // %[src_y]
400
+ [src_u] "+r"(src_u), // %[src_u]
401
+ [src_v] "+r"(src_v), // %[src_v]
402
+ [dst_argb4444] "+r"(dst_argb4444), // %[dst_argb4444]
403
+ [width] "+r"(width) // %[width]
404
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
405
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
406
+ : "cc", "memory", YUVTORGB_REGS, "q3");
407
+ }
408
+
409
+ void I400ToARGBRow_NEON(const uint8_t* src_y,
410
+ uint8_t* dst_argb,
411
+ const struct YuvConstants* yuvconstants,
412
+ int width) {
413
+ asm volatile(
414
+ YUVTORGB_SETUP
415
+ "vmov.u8 d6, #255 \n"
416
+ "1: \n" //
417
+ READYUV400 YUVTORGB RGBTORGB8
418
+ "subs %[width], %[width], #8 \n"
419
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
420
+ "bgt 1b \n"
421
+ : [src_y] "+r"(src_y), // %[src_y]
422
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
423
+ [width] "+r"(width) // %[width]
424
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
425
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
426
+ : "cc", "memory", YUVTORGB_REGS, "d6");
427
+ }
428
+
429
+ void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width) {
430
+ asm volatile(
431
+ "vmov.u8 d23, #255 \n"
432
+ "1: \n"
433
+ "vld1.8 {d20}, [%0]! \n"
434
+ "subs %2, %2, #8 \n"
435
+ "vmov d21, d20 \n"
436
+ "vmov d22, d20 \n"
437
+ "vst4.8 {d20, d21, d22, d23}, [%1]! \n"
438
+ "bgt 1b \n"
439
+ : "+r"(src_y), // %0
440
+ "+r"(dst_argb), // %1
441
+ "+r"(width) // %2
442
+ :
443
+ : "cc", "memory", "d20", "d21", "d22", "d23");
444
+ }
445
+
446
+ void NV12ToARGBRow_NEON(const uint8_t* src_y,
447
+ const uint8_t* src_uv,
448
+ uint8_t* dst_argb,
449
+ const struct YuvConstants* yuvconstants,
450
+ int width) {
451
+ asm volatile(
452
+ YUVTORGB_SETUP
453
+ "vmov.u8 d6, #255 \n"
454
+ "1: \n" //
455
+ READNV12 YUVTORGB RGBTORGB8
456
+ "subs %[width], %[width], #8 \n"
457
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
458
+ "bgt 1b \n"
459
+ : [src_y] "+r"(src_y), // %[src_y]
460
+ [src_uv] "+r"(src_uv), // %[src_uv]
461
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
462
+ [width] "+r"(width) // %[width]
463
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
464
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
465
+ : "cc", "memory", YUVTORGB_REGS, "d6");
466
+ }
467
+
468
+ void NV21ToARGBRow_NEON(const uint8_t* src_y,
469
+ const uint8_t* src_vu,
470
+ uint8_t* dst_argb,
471
+ const struct YuvConstants* yuvconstants,
472
+ int width) {
473
+ asm volatile(
474
+ YUVTORGB_SETUP
475
+ "vmov.u8 d6, #255 \n"
476
+ "1: \n" //
477
+ READNV21 YUVTORGB RGBTORGB8
478
+ "subs %[width], %[width], #8 \n"
479
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
480
+ "bgt 1b \n"
481
+ : [src_y] "+r"(src_y), // %[src_y]
482
+ [src_vu] "+r"(src_vu), // %[src_vu]
483
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
484
+ [width] "+r"(width) // %[width]
485
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
486
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
487
+ : "cc", "memory", YUVTORGB_REGS, "d6");
488
+ }
489
+
490
+ void NV12ToRGB24Row_NEON(const uint8_t* src_y,
491
+ const uint8_t* src_uv,
492
+ uint8_t* dst_rgb24,
493
+ const struct YuvConstants* yuvconstants,
494
+ int width) {
495
+ asm volatile(
496
+ YUVTORGB_SETUP
497
+ "vmov.u8 d6, #255 \n"
498
+ "1: \n" //
499
+ READNV12 YUVTORGB RGBTORGB8
500
+ "subs %[width], %[width], #8 \n"
501
+ "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n"
502
+ "bgt 1b \n"
503
+ : [src_y] "+r"(src_y), // %[src_y]
504
+ [src_uv] "+r"(src_uv), // %[src_uv]
505
+ [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24]
506
+ [width] "+r"(width) // %[width]
507
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
508
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
509
+ : "cc", "memory", YUVTORGB_REGS);
510
+ }
511
+
512
+ void NV21ToRGB24Row_NEON(const uint8_t* src_y,
513
+ const uint8_t* src_vu,
514
+ uint8_t* dst_rgb24,
515
+ const struct YuvConstants* yuvconstants,
516
+ int width) {
517
+ asm volatile(
518
+ YUVTORGB_SETUP
519
+ "vmov.u8 d6, #255 \n"
520
+ "1: \n" //
521
+ READNV21 YUVTORGB RGBTORGB8
522
+ "subs %[width], %[width], #8 \n"
523
+ "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n"
524
+ "bgt 1b \n"
525
+ : [src_y] "+r"(src_y), // %[src_y]
526
+ [src_vu] "+r"(src_vu), // %[src_vu]
527
+ [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24]
528
+ [width] "+r"(width) // %[width]
529
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
530
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
531
+ : "cc", "memory", YUVTORGB_REGS);
532
+ }
533
+
534
+ void NV12ToRGB565Row_NEON(const uint8_t* src_y,
535
+ const uint8_t* src_uv,
536
+ uint8_t* dst_rgb565,
537
+ const struct YuvConstants* yuvconstants,
538
+ int width) {
539
+ asm volatile(
540
+ YUVTORGB_SETUP
541
+ "vmov.u8 d6, #255 \n"
542
+ "1: \n" //
543
+ READNV12 YUVTORGB RGBTORGB8
544
+ "subs %[width], %[width], #8 \n" ARGBTORGB565
545
+ "vst1.8 {q2}, [%[dst_rgb565]]! \n" // store 8 pixels RGB565.
546
+ "bgt 1b \n"
547
+ : [src_y] "+r"(src_y), // %[src_y]
548
+ [src_uv] "+r"(src_uv), // %[src_uv]
549
+ [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565]
550
+ [width] "+r"(width) // %[width]
551
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
552
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
553
+ : "cc", "memory", YUVTORGB_REGS);
554
+ }
555
+
556
+ void YUY2ToARGBRow_NEON(const uint8_t* src_yuy2,
557
+ uint8_t* dst_argb,
558
+ const struct YuvConstants* yuvconstants,
559
+ int width) {
560
+ asm volatile(
561
+ YUVTORGB_SETUP
562
+ "vmov.u8 d6, #255 \n"
563
+ "1: \n" //
564
+ READYUY2 YUVTORGB RGBTORGB8
565
+ "subs %[width], %[width], #8 \n"
566
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
567
+ "bgt 1b \n"
568
+ : [src_yuy2] "+r"(src_yuy2), // %[src_yuy2]
569
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
570
+ [width] "+r"(width) // %[width]
571
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
572
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
573
+ : "cc", "memory", YUVTORGB_REGS, "d6");
574
+ }
575
+
576
+ void UYVYToARGBRow_NEON(const uint8_t* src_uyvy,
577
+ uint8_t* dst_argb,
578
+ const struct YuvConstants* yuvconstants,
579
+ int width) {
580
+ asm volatile(
581
+ YUVTORGB_SETUP
582
+ "vmov.u8 d6, #255 \n"
583
+ "1: \n" //
584
+ READUYVY YUVTORGB RGBTORGB8
585
+ "subs %[width], %[width], #8 \n"
586
+ "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n"
587
+ "bgt 1b \n"
588
+ : [src_uyvy] "+r"(src_uyvy), // %[src_uyvy]
589
+ [dst_argb] "+r"(dst_argb), // %[dst_argb]
590
+ [width] "+r"(width) // %[width]
591
+ : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff]
592
+ [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias]
593
+ : "cc", "memory", YUVTORGB_REGS, "d6");
594
+ }
595
+
596
+ // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v.
597
+ void SplitUVRow_NEON(const uint8_t* src_uv,
598
+ uint8_t* dst_u,
599
+ uint8_t* dst_v,
600
+ int width) {
601
+ asm volatile(
602
+ "1: \n"
603
+ "vld2.8 {q0, q1}, [%0]! \n" // load 16 pairs of UV
604
+ "subs %3, %3, #16 \n" // 16 processed per loop
605
+ "vst1.8 {q0}, [%1]! \n" // store U
606
+ "vst1.8 {q1}, [%2]! \n" // store V
607
+ "bgt 1b \n"
608
+ : "+r"(src_uv), // %0
609
+ "+r"(dst_u), // %1
610
+ "+r"(dst_v), // %2
611
+ "+r"(width) // %3 // Output registers
612
+ : // Input registers
613
+ : "cc", "memory", "q0", "q1" // Clobber List
614
+ );
615
+ }
616
+
617
+ // Reads 16 byte Y's from tile and writes out 16 Y's.
618
+ // MM21 Y tiles are 16x32 so src_tile_stride = 512 bytes
619
+ // MM21 UV tiles are 8x16 so src_tile_stride = 256 bytes
620
+ // width measured in bytes so 8 UV = 16.
621
+ void DetileRow_NEON(const uint8_t* src,
622
+ ptrdiff_t src_tile_stride,
623
+ uint8_t* dst,
624
+ int width) {
625
+ asm volatile(
626
+ "1: \n"
627
+ "vld1.8 {q0}, [%0], %3 \n" // load 16 bytes
628
+ "subs %2, %2, #16 \n" // 16 processed per loop
629
+ "pld [%0, #1792] \n"
630
+ "vst1.8 {q0}, [%1]! \n" // store 16 bytes
631
+ "bgt 1b \n"
632
+ : "+r"(src), // %0
633
+ "+r"(dst), // %1
634
+ "+r"(width) // %2
635
+ : "r"(src_tile_stride) // %3
636
+ : "cc", "memory", "q0" // Clobber List
637
+ );
638
+ }
639
+
640
+ // Reads 16 byte Y's of 16 bits from tile and writes out 16 Y's.
641
+ void DetileRow_16_NEON(const uint16_t* src,
642
+ ptrdiff_t src_tile_stride,
643
+ uint16_t* dst,
644
+ int width) {
645
+ asm volatile(
646
+ "1: \n"
647
+ "vld1.16 {q0, q1}, [%0], %3 \n" // load 16 pixels
648
+ "subs %2, %2, #16 \n" // 16 processed per loop
649
+ "pld [%0, #3584] \n"
650
+ "vst1.16 {q0, q1}, [%1]! \n" // store 16 pixels
651
+ "bgt 1b \n"
652
+ : "+r"(src), // %0
653
+ "+r"(dst), // %1
654
+ "+r"(width) // %2
655
+ : "r"(src_tile_stride * 2) // %3
656
+ : "cc", "memory", "q0", "q1" // Clobber List
657
+ );
658
+ }
659
+
660
+ // Read 16 bytes of UV, detile, and write 8 bytes of U and 8 bytes of V.
661
+ void DetileSplitUVRow_NEON(const uint8_t* src_uv,
662
+ ptrdiff_t src_tile_stride,
663
+ uint8_t* dst_u,
664
+ uint8_t* dst_v,
665
+ int width) {
666
+ asm volatile(
667
+ "1: \n"
668
+ "vld2.8 {d0, d1}, [%0], %4 \n"
669
+ "subs %3, %3, #16 \n"
670
+ "pld [%0, #1792] \n"
671
+ "vst1.8 {d0}, [%1]! \n"
672
+ "vst1.8 {d1}, [%2]! \n"
673
+ "bgt 1b \n"
674
+ : "+r"(src_uv), // %0
675
+ "+r"(dst_u), // %1
676
+ "+r"(dst_v), // %2
677
+ "+r"(width) // %3
678
+ : "r"(src_tile_stride) // %4
679
+ : "cc", "memory", "d0", "d1" // Clobber List
680
+ );
681
+ }
682
+
683
+ #if defined(LIBYUV_USE_ST2)
684
+ // Read 16 Y, 8 UV, and write 8 YUYV.
685
+ void DetileToYUY2_NEON(const uint8_t* src_y,
686
+ ptrdiff_t src_y_tile_stride,
687
+ const uint8_t* src_uv,
688
+ ptrdiff_t src_uv_tile_stride,
689
+ uint8_t* dst_yuy2,
690
+ int width) {
691
+ asm volatile(
692
+ "1: \n"
693
+ "vld1.8 {q0}, [%0], %4 \n" // Load 16 Y
694
+ "pld [%0, #1792] \n"
695
+ "vld1.8 {q1}, [%1], %5 \n" // Load 8 UV
696
+ "pld [%1, #1792] \n"
697
+ "subs %3, %3, #16 \n"
698
+ "vst2.8 {q0, q1}, [%2]! \n"
699
+ "bgt 1b \n"
700
+ : "+r"(src_y), // %0
701
+ "+r"(src_uv), // %1
702
+ "+r"(dst_yuy2), // %2
703
+ "+r"(width) // %3
704
+ : "r"(src_y_tile_stride), // %4
705
+ "r"(src_uv_tile_stride) // %5
706
+ : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber list
707
+ );
708
+ }
709
+ #else
710
+ // Read 16 Y, 8 UV, and write 8 YUYV.
711
+ void DetileToYUY2_NEON(const uint8_t* src_y,
712
+ ptrdiff_t src_y_tile_stride,
713
+ const uint8_t* src_uv,
714
+ ptrdiff_t src_uv_tile_stride,
715
+ uint8_t* dst_yuy2,
716
+ int width) {
717
+ asm volatile(
718
+ "1: \n"
719
+ "vld1.8 {q0}, [%0], %4 \n" // Load 16 Y
720
+ "vld1.8 {q1}, [%1], %5 \n" // Load 8 UV
721
+ "subs %3, %3, #16 \n"
722
+ "pld [%0, #1792] \n"
723
+ "vzip.8 q0, q1 \n"
724
+ "pld [%1, #1792] \n"
725
+ "vst1.8 {q0, q1}, [%2]! \n"
726
+ "bgt 1b \n"
727
+ : "+r"(src_y), // %0
728
+ "+r"(src_uv), // %1
729
+ "+r"(dst_yuy2), // %2
730
+ "+r"(width) // %3
731
+ : "r"(src_y_tile_stride), // %4
732
+ "r"(src_uv_tile_stride) // %5
733
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber list
734
+ );
735
+ }
736
+ #endif
737
+
738
+ void UnpackMT2T_NEON(const uint8_t* src, uint16_t* dst, size_t size) {
739
+ asm volatile(
740
+ "1: \n"
741
+ "vld1.8 {q14}, [%0]! \n" // Load lower bits.
742
+ "vld1.8 {q9}, [%0]! \n" // Load upper bits row
743
+ // by row.
744
+ "vld1.8 {q11}, [%0]! \n"
745
+ "vld1.8 {q13}, [%0]! \n"
746
+ "vld1.8 {q15}, [%0]! \n"
747
+ "subs %2, %2, #80 \n"
748
+ "vshl.u8 q8, q14, #6 \n" // Shift lower bit data
749
+ // appropriately.
750
+ "vshl.u8 q10, q14, #4 \n"
751
+ "vshl.u8 q12, q14, #2 \n"
752
+ "vzip.u8 q8, q9 \n" // Interleave upper and
753
+ // lower bits.
754
+ "vzip.u8 q10, q11 \n"
755
+ "vzip.u8 q12, q13 \n"
756
+ "vzip.u8 q14, q15 \n"
757
+ "vsri.u16 q8, q8, #10 \n" // Copy upper 6 bits
758
+ // into lower 6 bits for
759
+ // better accuracy in
760
+ // conversions.
761
+ "vsri.u16 q9, q9, #10 \n"
762
+ "vsri.u16 q10, q10, #10 \n"
763
+ "vsri.u16 q11, q11, #10 \n"
764
+ "vsri.u16 q12, q12, #10 \n"
765
+ "vsri.u16 q13, q13, #10 \n"
766
+ "vsri.u16 q14, q14, #10 \n"
767
+ "vsri.u16 q15, q15, #10 \n"
768
+ "vstmia %1!, {q8-q15} \n" // Store pixel block (64
769
+ // pixels).
770
+ "bgt 1b \n"
771
+ : "+r"(src), // %0
772
+ "+r"(dst), // %1
773
+ "+r"(size) // %2
774
+ :
775
+ : "cc", "memory", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15");
776
+ }
777
+
778
+ // Reads 16 U's and V's and writes out 16 pairs of UV.
779
+ void MergeUVRow_NEON(const uint8_t* src_u,
780
+ const uint8_t* src_v,
781
+ uint8_t* dst_uv,
782
+ int width) {
783
+ asm volatile(
784
+ "1: \n"
785
+ "vld1.8 {q0}, [%0]! \n" // load U
786
+ "vld1.8 {q1}, [%1]! \n" // load V
787
+ "subs %3, %3, #16 \n" // 16 processed per loop
788
+ "vst2.8 {q0, q1}, [%2]! \n" // store 16 pairs of UV
789
+ "bgt 1b \n"
790
+ : "+r"(src_u), // %0
791
+ "+r"(src_v), // %1
792
+ "+r"(dst_uv), // %2
793
+ "+r"(width) // %3 // Output registers
794
+ : // Input registers
795
+ : "cc", "memory", "q0", "q1" // Clobber List
796
+ );
797
+ }
798
+
799
+ // Reads 16 packed RGB and write to planar dst_r, dst_g, dst_b.
800
+ void SplitRGBRow_NEON(const uint8_t* src_rgb,
801
+ uint8_t* dst_r,
802
+ uint8_t* dst_g,
803
+ uint8_t* dst_b,
804
+ int width) {
805
+ asm volatile(
806
+ "1: \n"
807
+ "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB
808
+ "vld3.8 {d1, d3, d5}, [%0]! \n" // next 8 RGB
809
+ "subs %4, %4, #16 \n" // 16 processed per loop
810
+ "vst1.8 {q0}, [%1]! \n" // store R
811
+ "vst1.8 {q1}, [%2]! \n" // store G
812
+ "vst1.8 {q2}, [%3]! \n" // store B
813
+ "bgt 1b \n"
814
+ : "+r"(src_rgb), // %0
815
+ "+r"(dst_r), // %1
816
+ "+r"(dst_g), // %2
817
+ "+r"(dst_b), // %3
818
+ "+r"(width) // %4
819
+ : // Input registers
820
+ : "cc", "memory", "q0", "q1", "q2" // Clobber List
821
+ );
822
+ }
823
+
824
+ // Reads 16 planar R's, G's and B's and writes out 16 packed RGB at a time
825
+ void MergeRGBRow_NEON(const uint8_t* src_r,
826
+ const uint8_t* src_g,
827
+ const uint8_t* src_b,
828
+ uint8_t* dst_rgb,
829
+ int width) {
830
+ asm volatile(
831
+ "1: \n"
832
+ "vld1.8 {q0}, [%0]! \n" // load R
833
+ "vld1.8 {q1}, [%1]! \n" // load G
834
+ "vld1.8 {q2}, [%2]! \n" // load B
835
+ "subs %4, %4, #16 \n" // 16 processed per loop
836
+ "vst3.8 {d0, d2, d4}, [%3]! \n" // store 8 RGB
837
+ "vst3.8 {d1, d3, d5}, [%3]! \n" // next 8 RGB
838
+ "bgt 1b \n"
839
+ : "+r"(src_r), // %0
840
+ "+r"(src_g), // %1
841
+ "+r"(src_b), // %2
842
+ "+r"(dst_rgb), // %3
843
+ "+r"(width) // %4
844
+ : // Input registers
845
+ : "cc", "memory", "q0", "q1", "q2" // Clobber List
846
+ );
847
+ }
848
+
849
+ // Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b, dst_a.
850
+ void SplitARGBRow_NEON(const uint8_t* src_argb,
851
+ uint8_t* dst_r,
852
+ uint8_t* dst_g,
853
+ uint8_t* dst_b,
854
+ uint8_t* dst_a,
855
+ int width) {
856
+ asm volatile(
857
+ "1: \n"
858
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB
859
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // next 8 ARGB
860
+ "subs %5, %5, #16 \n" // 16 processed per loop
861
+ "vst1.8 {q0}, [%3]! \n" // store B
862
+ "vst1.8 {q1}, [%2]! \n" // store G
863
+ "vst1.8 {q2}, [%1]! \n" // store R
864
+ "vst1.8 {q3}, [%4]! \n" // store A
865
+ "bgt 1b \n"
866
+ : "+r"(src_argb), // %0
867
+ "+r"(dst_r), // %1
868
+ "+r"(dst_g), // %2
869
+ "+r"(dst_b), // %3
870
+ "+r"(dst_a), // %4
871
+ "+r"(width) // %5
872
+ : // Input registers
873
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
874
+ );
875
+ }
876
+
877
+ // Reads 16 planar R's, G's and B's and writes out 16 packed ARGB at a time
878
+ void MergeARGBRow_NEON(const uint8_t* src_r,
879
+ const uint8_t* src_g,
880
+ const uint8_t* src_b,
881
+ const uint8_t* src_a,
882
+ uint8_t* dst_argb,
883
+ int width) {
884
+ asm volatile(
885
+ "1: \n"
886
+ "vld1.8 {q2}, [%0]! \n" // load R
887
+ "vld1.8 {q1}, [%1]! \n" // load G
888
+ "vld1.8 {q0}, [%2]! \n" // load B
889
+ "vld1.8 {q3}, [%3]! \n" // load A
890
+ "subs %5, %5, #16 \n" // 16 processed per loop
891
+ "vst4.8 {d0, d2, d4, d6}, [%4]! \n" // store 8 ARGB
892
+ "vst4.8 {d1, d3, d5, d7}, [%4]! \n" // next 8 ARGB
893
+ "bgt 1b \n"
894
+ : "+r"(src_r), // %0
895
+ "+r"(src_g), // %1
896
+ "+r"(src_b), // %2
897
+ "+r"(src_a), // %3
898
+ "+r"(dst_argb), // %4
899
+ "+r"(width) // %5
900
+ : // Input registers
901
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
902
+ );
903
+ }
904
+
905
+ // Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b.
906
+ void SplitXRGBRow_NEON(const uint8_t* src_argb,
907
+ uint8_t* dst_r,
908
+ uint8_t* dst_g,
909
+ uint8_t* dst_b,
910
+ int width) {
911
+ asm volatile(
912
+ "1: \n"
913
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB
914
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // next 8 ARGB
915
+ "subs %4, %4, #16 \n" // 16 processed per loop
916
+ "vst1.8 {q0}, [%3]! \n" // store B
917
+ "vst1.8 {q1}, [%2]! \n" // store G
918
+ "vst1.8 {q2}, [%1]! \n" // store R
919
+ "bgt 1b \n"
920
+ : "+r"(src_argb), // %0
921
+ "+r"(dst_r), // %1
922
+ "+r"(dst_g), // %2
923
+ "+r"(dst_b), // %3
924
+ "+r"(width) // %4
925
+ : // Input registers
926
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
927
+ );
928
+ }
929
+
930
+ // Reads 16 planar R's, G's, B's and A's and writes out 16 packed ARGB at a time
931
+ void MergeXRGBRow_NEON(const uint8_t* src_r,
932
+ const uint8_t* src_g,
933
+ const uint8_t* src_b,
934
+ uint8_t* dst_argb,
935
+ int width) {
936
+ asm volatile(
937
+ "vmov.u8 q3, #255 \n" // load A(255)
938
+ "1: \n"
939
+ "vld1.8 {q2}, [%0]! \n" // load R
940
+ "vld1.8 {q1}, [%1]! \n" // load G
941
+ "vld1.8 {q0}, [%2]! \n" // load B
942
+ "subs %4, %4, #16 \n" // 16 processed per loop
943
+ "vst4.8 {d0, d2, d4, d6}, [%3]! \n" // store 8 ARGB
944
+ "vst4.8 {d1, d3, d5, d7}, [%3]! \n" // next 8 ARGB
945
+ "bgt 1b \n"
946
+ : "+r"(src_r), // %0
947
+ "+r"(src_g), // %1
948
+ "+r"(src_b), // %2
949
+ "+r"(dst_argb), // %3
950
+ "+r"(width) // %4
951
+ : // Input registers
952
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
953
+ );
954
+ }
955
+
956
+ void MergeXR30Row_NEON(const uint16_t* src_r,
957
+ const uint16_t* src_g,
958
+ const uint16_t* src_b,
959
+ uint8_t* dst_ar30,
960
+ int depth,
961
+ int width) {
962
+ int shift = 10 - depth;
963
+ asm volatile(
964
+ "vmov.u32 q14, #1023 \n"
965
+ "vdup.32 q15, %5 \n"
966
+ "1: \n"
967
+ "vld1.16 {d4}, [%2]! \n" // B
968
+ "vld1.16 {d2}, [%1]! \n" // G
969
+ "vld1.16 {d0}, [%0]! \n" // R
970
+ "subs %4, %4, #4 \n"
971
+ "vmovl.u16 q2, d4 \n" // B
972
+ "vmovl.u16 q1, d2 \n" // G
973
+ "vmovl.u16 q0, d0 \n" // R
974
+ "vshl.u32 q2, q2, q15 \n" // 000B
975
+ "vshl.u32 q1, q1, q15 \n"
976
+ "vshl.u32 q0, q0, q15 \n"
977
+ "vmin.u32 q2, q2, q14 \n"
978
+ "vmin.u32 q1, q1, q14 \n"
979
+ "vmin.u32 q0, q0, q14 \n"
980
+ "vsli.u32 q2, q1, #10 \n" // 00GB
981
+ "vsli.u32 q2, q0, #20 \n" // 0RGB
982
+ "vorr.u32 q2, #0xc0000000 \n" // ARGB (AR30)
983
+ "vst1.8 {q2}, [%3]! \n"
984
+ "bgt 1b \n"
985
+ : "+r"(src_r), // %0
986
+ "+r"(src_g), // %1
987
+ "+r"(src_b), // %2
988
+ "+r"(dst_ar30), // %3
989
+ "+r"(width) // %4
990
+ : "r"(shift) // %5
991
+ : "memory", "cc", "q0", "q1", "q2", "q14", "q15");
992
+ }
993
+
994
+ void MergeXR30Row_10_NEON(const uint16_t* src_r,
995
+ const uint16_t* src_g,
996
+ const uint16_t* src_b,
997
+ uint8_t* dst_ar30,
998
+ int /* depth */,
999
+ int width) {
1000
+ asm volatile(
1001
+ "vmov.u32 q14, #1023 \n"
1002
+ "1: \n"
1003
+ "vld1.16 {d4}, [%2]! \n" // B
1004
+ "vld1.16 {d2}, [%1]! \n" // G
1005
+ "vld1.16 {d0}, [%0]! \n" // R
1006
+ "subs %4, %4, #4 \n"
1007
+ "vmovl.u16 q2, d4 \n" // 000B
1008
+ "vmovl.u16 q1, d2 \n" // G
1009
+ "vmovl.u16 q0, d0 \n" // R
1010
+ "vmin.u32 q2, q2, q14 \n"
1011
+ "vmin.u32 q1, q1, q14 \n"
1012
+ "vmin.u32 q0, q0, q14 \n"
1013
+ "vsli.u32 q2, q1, #10 \n" // 00GB
1014
+ "vsli.u32 q2, q0, #20 \n" // 0RGB
1015
+ "vorr.u32 q2, #0xc0000000 \n" // ARGB (AR30)
1016
+ "vst1.8 {q2}, [%3]! \n"
1017
+ "bgt 1b \n"
1018
+ "3: \n"
1019
+ : "+r"(src_r), // %0
1020
+ "+r"(src_g), // %1
1021
+ "+r"(src_b), // %2
1022
+ "+r"(dst_ar30), // %3
1023
+ "+r"(width) // %4
1024
+ :
1025
+ : "memory", "cc", "q0", "q1", "q2", "q14");
1026
+ }
1027
+
1028
+ void MergeAR64Row_NEON(const uint16_t* src_r,
1029
+ const uint16_t* src_g,
1030
+ const uint16_t* src_b,
1031
+ const uint16_t* src_a,
1032
+ uint16_t* dst_ar64,
1033
+ int depth,
1034
+ int width) {
1035
+ int shift = 16 - depth;
1036
+ int mask = (1 << depth) - 1;
1037
+ asm volatile(
1038
+
1039
+ "vdup.u16 q15, %6 \n"
1040
+ "vdup.u16 q14, %7 \n"
1041
+ "1: \n"
1042
+ "vld1.16 {q2}, [%0]! \n" // R
1043
+ "vld1.16 {q1}, [%1]! \n" // G
1044
+ "vld1.16 {q0}, [%2]! \n" // B
1045
+ "vld1.16 {q3}, [%3]! \n" // A
1046
+ "subs %5, %5, #8 \n"
1047
+ "vmin.u16 q2, q2, q14 \n"
1048
+ "vmin.u16 q1, q1, q14 \n"
1049
+ "vmin.u16 q0, q0, q14 \n"
1050
+ "vmin.u16 q3, q3, q14 \n"
1051
+ "vshl.u16 q2, q2, q15 \n"
1052
+ "vshl.u16 q1, q1, q15 \n"
1053
+ "vshl.u16 q0, q0, q15 \n"
1054
+ "vshl.u16 q3, q3, q15 \n"
1055
+ "vst4.16 {d0, d2, d4, d6}, [%4]! \n"
1056
+ "vst4.16 {d1, d3, d5, d7}, [%4]! \n"
1057
+ "bgt 1b \n"
1058
+ : "+r"(src_r), // %0
1059
+ "+r"(src_g), // %1
1060
+ "+r"(src_b), // %2
1061
+ "+r"(src_a), // %3
1062
+ "+r"(dst_ar64), // %4
1063
+ "+r"(width) // %5
1064
+ : "r"(shift), // %6
1065
+ "r"(mask) // %7
1066
+ : "memory", "cc", "q0", "q1", "q2", "q3", "q15");
1067
+ }
1068
+
1069
+ void MergeXR64Row_NEON(const uint16_t* src_r,
1070
+ const uint16_t* src_g,
1071
+ const uint16_t* src_b,
1072
+ uint16_t* dst_ar64,
1073
+ int depth,
1074
+ int width) {
1075
+ int shift = 16 - depth;
1076
+ int mask = (1 << depth) - 1;
1077
+ asm volatile(
1078
+
1079
+ "vmov.u8 q3, #0xff \n" // A (0xffff)
1080
+ "vdup.u16 q15, %5 \n"
1081
+ "vdup.u16 q14, %6 \n"
1082
+ "1: \n"
1083
+ "vld1.16 {q2}, [%0]! \n" // R
1084
+ "vld1.16 {q1}, [%1]! \n" // G
1085
+ "vld1.16 {q0}, [%2]! \n" // B
1086
+ "subs %4, %4, #8 \n"
1087
+ "vmin.u16 q2, q2, q14 \n"
1088
+ "vmin.u16 q1, q1, q14 \n"
1089
+ "vmin.u16 q0, q0, q14 \n"
1090
+ "vshl.u16 q2, q2, q15 \n"
1091
+ "vshl.u16 q1, q1, q15 \n"
1092
+ "vshl.u16 q0, q0, q15 \n"
1093
+ "vst4.16 {d0, d2, d4, d6}, [%3]! \n"
1094
+ "vst4.16 {d1, d3, d5, d7}, [%3]! \n"
1095
+ "bgt 1b \n"
1096
+ : "+r"(src_r), // %0
1097
+ "+r"(src_g), // %1
1098
+ "+r"(src_b), // %2
1099
+ "+r"(dst_ar64), // %3
1100
+ "+r"(width) // %4
1101
+ : "r"(shift), // %5
1102
+ "r"(mask) // %6
1103
+ : "memory", "cc", "q0", "q1", "q2", "q3", "q15");
1104
+ }
1105
+
1106
+ void MergeARGB16To8Row_NEON(const uint16_t* src_r,
1107
+ const uint16_t* src_g,
1108
+ const uint16_t* src_b,
1109
+ const uint16_t* src_a,
1110
+ uint8_t* dst_argb,
1111
+ int depth,
1112
+ int width) {
1113
+ int shift = 8 - depth;
1114
+ asm volatile(
1115
+
1116
+ "vdup.16 q15, %6 \n"
1117
+ "1: \n"
1118
+ "vld1.16 {q2}, [%0]! \n" // R
1119
+ "vld1.16 {q1}, [%1]! \n" // G
1120
+ "vld1.16 {q0}, [%2]! \n" // B
1121
+ "vld1.16 {q3}, [%3]! \n" // A
1122
+ "subs %5, %5, #8 \n"
1123
+ "vshl.u16 q2, q2, q15 \n"
1124
+ "vshl.u16 q1, q1, q15 \n"
1125
+ "vshl.u16 q0, q0, q15 \n"
1126
+ "vshl.u16 q3, q3, q15 \n"
1127
+ "vqmovn.u16 d0, q0 \n"
1128
+ "vqmovn.u16 d1, q1 \n"
1129
+ "vqmovn.u16 d2, q2 \n"
1130
+ "vqmovn.u16 d3, q3 \n"
1131
+ "vst4.8 {d0, d1, d2, d3}, [%4]! \n"
1132
+ "bgt 1b \n"
1133
+ : "+r"(src_r), // %0
1134
+ "+r"(src_g), // %1
1135
+ "+r"(src_b), // %2
1136
+ "+r"(src_a), // %3
1137
+ "+r"(dst_argb), // %4
1138
+ "+r"(width) // %5
1139
+ : "r"(shift) // %6
1140
+ : "memory", "cc", "q0", "q1", "q2", "q3", "q15");
1141
+ }
1142
+
1143
+ void MergeXRGB16To8Row_NEON(const uint16_t* src_r,
1144
+ const uint16_t* src_g,
1145
+ const uint16_t* src_b,
1146
+ uint8_t* dst_argb,
1147
+ int depth,
1148
+ int width) {
1149
+ int shift = 8 - depth;
1150
+ asm volatile(
1151
+
1152
+ "vdup.16 q15, %5 \n"
1153
+ "vmov.u8 d6, #0xff \n" // A (0xff)
1154
+ "1: \n"
1155
+ "vld1.16 {q2}, [%0]! \n" // R
1156
+ "vld1.16 {q1}, [%1]! \n" // G
1157
+ "vld1.16 {q0}, [%2]! \n" // B
1158
+ "subs %4, %4, #8 \n"
1159
+ "vshl.u16 q2, q2, q15 \n"
1160
+ "vshl.u16 q1, q1, q15 \n"
1161
+ "vshl.u16 q0, q0, q15 \n"
1162
+ "vqmovn.u16 d5, q2 \n"
1163
+ "vqmovn.u16 d4, q1 \n"
1164
+ "vqmovn.u16 d3, q0 \n"
1165
+ "vst4.u8 {d3, d4, d5, d6}, [%3]! \n"
1166
+ "bgt 1b \n"
1167
+ : "+r"(src_r), // %0
1168
+ "+r"(src_g), // %1
1169
+ "+r"(src_b), // %2
1170
+ "+r"(dst_argb), // %3
1171
+ "+r"(width) // %4
1172
+ : "r"(shift) // %5
1173
+ : "memory", "cc", "q0", "q1", "q2", "d6", "q15");
1174
+ }
1175
+
1176
+ // Copy multiple of 32. vld4.8 allow unaligned and is fastest on a15.
1177
+ void CopyRow_NEON(const uint8_t* src, uint8_t* dst, int width) {
1178
+ asm volatile(
1179
+ "1: \n"
1180
+ "vld1.8 {d0, d1, d2, d3}, [%0]! \n" // load 32
1181
+ "subs %2, %2, #32 \n" // 32 processed per loop
1182
+ "vst1.8 {d0, d1, d2, d3}, [%1]! \n" // store 32
1183
+ "bgt 1b \n"
1184
+ : "+r"(src), // %0
1185
+ "+r"(dst), // %1
1186
+ "+r"(width) // %2 // Output registers
1187
+ : // Input registers
1188
+ : "cc", "memory", "q0", "q1" // Clobber List
1189
+ );
1190
+ }
1191
+
1192
+ // SetRow writes 'width' bytes using an 8 bit value repeated.
1193
+ void SetRow_NEON(uint8_t* dst, uint8_t v8, int width) {
1194
+ asm volatile(
1195
+ "vdup.8 q0, %2 \n" // duplicate 16 bytes
1196
+ "1: \n"
1197
+ "subs %1, %1, #16 \n" // 16 bytes per loop
1198
+ "vst1.8 {q0}, [%0]! \n" // store
1199
+ "bgt 1b \n"
1200
+ : "+r"(dst), // %0
1201
+ "+r"(width) // %1
1202
+ : "r"(v8) // %2
1203
+ : "cc", "memory", "q0");
1204
+ }
1205
+
1206
+ // ARGBSetRow writes 'width' pixels using an 32 bit value repeated.
1207
+ void ARGBSetRow_NEON(uint8_t* dst, uint32_t v32, int width) {
1208
+ asm volatile(
1209
+ "vdup.u32 q0, %2 \n" // duplicate 4 ints
1210
+ "1: \n"
1211
+ "subs %1, %1, #4 \n" // 4 pixels per loop
1212
+ "vst1.8 {q0}, [%0]! \n" // store
1213
+ "bgt 1b \n"
1214
+ : "+r"(dst), // %0
1215
+ "+r"(width) // %1
1216
+ : "r"(v32) // %2
1217
+ : "cc", "memory", "q0");
1218
+ }
1219
+
1220
+ void MirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width) {
1221
+ asm volatile(
1222
+ // Start at end of source row.
1223
+ "add %0, %0, %2 \n"
1224
+ "sub %0, %0, #32 \n" // 32 bytes per loop
1225
+
1226
+ "1: \n"
1227
+ "vld1.8 {q1, q2}, [%0], %3 \n" // src -= 32
1228
+ "subs %2, #32 \n" // 32 pixels per loop.
1229
+ "vrev64.8 q0, q2 \n"
1230
+ "vrev64.8 q1, q1 \n"
1231
+ "vswp d0, d1 \n"
1232
+ "vswp d2, d3 \n"
1233
+ "vst1.8 {q0, q1}, [%1]! \n" // dst += 32
1234
+ "bgt 1b \n"
1235
+ : "+r"(src), // %0
1236
+ "+r"(dst), // %1
1237
+ "+r"(width) // %2
1238
+ : "r"(-32) // %3
1239
+ : "cc", "memory", "q0", "q1", "q2");
1240
+ }
1241
+
1242
+ void MirrorUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_uv, int width) {
1243
+ asm volatile(
1244
+ // Start at end of source row.
1245
+ "mov r12, #-16 \n"
1246
+ "add %0, %0, %2, lsl #1 \n"
1247
+ "sub %0, #16 \n"
1248
+
1249
+ "1: \n"
1250
+ "vld2.8 {d0, d1}, [%0], r12 \n" // src -= 16
1251
+ "subs %2, #8 \n" // 8 pixels per loop.
1252
+ "vrev64.8 q0, q0 \n"
1253
+ "vst2.8 {d0, d1}, [%1]! \n" // dst += 16
1254
+ "bgt 1b \n"
1255
+ : "+r"(src_uv), // %0
1256
+ "+r"(dst_uv), // %1
1257
+ "+r"(width) // %2
1258
+ :
1259
+ : "cc", "memory", "r12", "q0");
1260
+ }
1261
+
1262
+ void MirrorSplitUVRow_NEON(const uint8_t* src_uv,
1263
+ uint8_t* dst_u,
1264
+ uint8_t* dst_v,
1265
+ int width) {
1266
+ asm volatile(
1267
+ // Start at end of source row.
1268
+ "mov r12, #-16 \n"
1269
+ "add %0, %0, %3, lsl #1 \n"
1270
+ "sub %0, #16 \n"
1271
+
1272
+ "1: \n"
1273
+ "vld2.8 {d0, d1}, [%0], r12 \n" // src -= 16
1274
+ "subs %3, #8 \n" // 8 pixels per loop.
1275
+ "vrev64.8 q0, q0 \n"
1276
+ "vst1.8 {d0}, [%1]! \n" // dst += 8
1277
+ "vst1.8 {d1}, [%2]! \n"
1278
+ "bgt 1b \n"
1279
+ : "+r"(src_uv), // %0
1280
+ "+r"(dst_u), // %1
1281
+ "+r"(dst_v), // %2
1282
+ "+r"(width) // %3
1283
+ :
1284
+ : "cc", "memory", "r12", "q0");
1285
+ }
1286
+
1287
+ void ARGBMirrorRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width) {
1288
+ asm volatile(
1289
+ "add %0, %0, %2, lsl #2 \n"
1290
+ "sub %0, #32 \n"
1291
+
1292
+ "1: \n"
1293
+ "vld4.8 {d0, d1, d2, d3}, [%0], %3 \n" // src -= 32
1294
+ "subs %2, #8 \n" // 8 pixels per loop.
1295
+ "vrev64.8 d0, d0 \n"
1296
+ "vrev64.8 d1, d1 \n"
1297
+ "vrev64.8 d2, d2 \n"
1298
+ "vrev64.8 d3, d3 \n"
1299
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // dst += 32
1300
+ "bgt 1b \n"
1301
+ : "+r"(src_argb), // %0
1302
+ "+r"(dst_argb), // %1
1303
+ "+r"(width) // %2
1304
+ : "r"(-32) // %3
1305
+ : "cc", "memory", "d0", "d1", "d2", "d3");
1306
+ }
1307
+
1308
+ void RGB24MirrorRow_NEON(const uint8_t* src_rgb24,
1309
+ uint8_t* dst_rgb24,
1310
+ int width) {
1311
+ src_rgb24 += width * 3 - 24;
1312
+ asm volatile(
1313
+ "1: \n"
1314
+ "vld3.8 {d0, d1, d2}, [%0], %3 \n" // src -= 24
1315
+ "subs %2, #8 \n" // 8 pixels per loop.
1316
+ "vrev64.8 d0, d0 \n"
1317
+ "vrev64.8 d1, d1 \n"
1318
+ "vrev64.8 d2, d2 \n"
1319
+ "vst3.8 {d0, d1, d2}, [%1]! \n" // dst += 24
1320
+ "bgt 1b \n"
1321
+ : "+r"(src_rgb24), // %0
1322
+ "+r"(dst_rgb24), // %1
1323
+ "+r"(width) // %2
1324
+ : "r"(-24) // %3
1325
+ : "cc", "memory", "d0", "d1", "d2");
1326
+ }
1327
+
1328
+ void RGB24ToARGBRow_NEON(const uint8_t* src_rgb24,
1329
+ uint8_t* dst_argb,
1330
+ int width) {
1331
+ asm volatile(
1332
+ "vmov.u8 d4, #255 \n" // Alpha
1333
+ "1: \n"
1334
+ "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RGB24.
1335
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1336
+ "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB.
1337
+ "bgt 1b \n"
1338
+ : "+r"(src_rgb24), // %0
1339
+ "+r"(dst_argb), // %1
1340
+ "+r"(width) // %2
1341
+ :
1342
+ : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
1343
+ );
1344
+ }
1345
+
1346
+ void RAWToARGBRow_NEON(const uint8_t* src_raw, uint8_t* dst_argb, int width) {
1347
+ asm volatile(
1348
+ "vmov.u8 d4, #255 \n" // Alpha
1349
+ "1: \n"
1350
+ "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW.
1351
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1352
+ "vswp.u8 d1, d3 \n" // swap R, B
1353
+ "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB.
1354
+ "bgt 1b \n"
1355
+ : "+r"(src_raw), // %0
1356
+ "+r"(dst_argb), // %1
1357
+ "+r"(width) // %2
1358
+ :
1359
+ : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
1360
+ );
1361
+ }
1362
+
1363
+ void RAWToRGBARow_NEON(const uint8_t* src_raw, uint8_t* dst_rgba, int width) {
1364
+ asm volatile(
1365
+ "vmov.u8 d0, #255 \n" // Alpha
1366
+ "1: \n"
1367
+ "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW.
1368
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1369
+ "vswp.u8 d1, d3 \n" // swap R, B
1370
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of RGBA.
1371
+ "bgt 1b \n"
1372
+ : "+r"(src_raw), // %0
1373
+ "+r"(dst_rgba), // %1
1374
+ "+r"(width) // %2
1375
+ :
1376
+ : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List
1377
+ );
1378
+ }
1379
+ void RAWToRGB24Row_NEON(const uint8_t* src_raw, uint8_t* dst_rgb24, int width) {
1380
+ asm volatile(
1381
+ "1: \n"
1382
+ "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW.
1383
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1384
+ "vswp.u8 d1, d3 \n" // swap R, B
1385
+ "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of
1386
+ // RGB24.
1387
+ "bgt 1b \n"
1388
+ : "+r"(src_raw), // %0
1389
+ "+r"(dst_rgb24), // %1
1390
+ "+r"(width) // %2
1391
+ :
1392
+ : "cc", "memory", "d1", "d2", "d3" // Clobber List
1393
+ );
1394
+ }
1395
+
1396
+ #define RGB565TOARGB \
1397
+ "vshrn.u16 d6, q0, #5 \n" /* G xxGGGGGG */ \
1398
+ "vuzp.u8 d0, d1 \n" /* d0 xxxBBBBB RRRRRxxx */ \
1399
+ "vshl.u8 d6, d6, #2 \n" /* G GGGGGG00 upper 6 */ \
1400
+ "vshr.u8 d1, d1, #3 \n" /* R 000RRRRR lower 5 */ \
1401
+ "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \
1402
+ "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \
1403
+ "vorr.u8 d0, d0, d4 \n" /* B */ \
1404
+ "vshr.u8 d4, d6, #6 \n" /* G 000000GG lower 2 */ \
1405
+ "vorr.u8 d2, d1, d5 \n" /* R */ \
1406
+ "vorr.u8 d1, d4, d6 \n" /* G */
1407
+
1408
+ void RGB565ToARGBRow_NEON(const uint8_t* src_rgb565,
1409
+ uint8_t* dst_argb,
1410
+ int width) {
1411
+ asm volatile(
1412
+ "vmov.u8 d3, #255 \n" // Alpha
1413
+ "1: \n"
1414
+ "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels.
1415
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1416
+ RGB565TOARGB
1417
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
1418
+ "bgt 1b \n"
1419
+ : "+r"(src_rgb565), // %0
1420
+ "+r"(dst_argb), // %1
1421
+ "+r"(width) // %2
1422
+ :
1423
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
1424
+ );
1425
+ }
1426
+
1427
+ #define ARGB1555TOARGB \
1428
+ "vshrn.u16 d7, q0, #8 \n" /* A Arrrrrxx */ \
1429
+ "vshr.u8 d6, d7, #2 \n" /* R xxxRRRRR */ \
1430
+ "vshrn.u16 d5, q0, #5 \n" /* G xxxGGGGG */ \
1431
+ "vmovn.u16 d4, q0 \n" /* B xxxBBBBB */ \
1432
+ "vshr.u8 d7, d7, #7 \n" /* A 0000000A */ \
1433
+ "vneg.s8 d7, d7 \n" /* A AAAAAAAA upper 8 */ \
1434
+ "vshl.u8 d6, d6, #3 \n" /* R RRRRR000 upper 5 */ \
1435
+ "vshr.u8 q1, q3, #5 \n" /* R,A 00000RRR lower 3 */ \
1436
+ "vshl.u8 q0, q2, #3 \n" /* B,G BBBBB000 upper 5 */ \
1437
+ "vshr.u8 q2, q0, #5 \n" /* B,G 00000BBB lower 3 */ \
1438
+ "vorr.u8 q1, q1, q3 \n" /* R,A */ \
1439
+ "vorr.u8 q0, q0, q2 \n" /* B,G */
1440
+
1441
+ // RGB555TOARGB is same as ARGB1555TOARGB but ignores alpha.
1442
+ #define RGB555TOARGB \
1443
+ "vshrn.u16 d6, q0, #5 \n" /* G xxxGGGGG */ \
1444
+ "vuzp.u8 d0, d1 \n" /* d0 xxxBBBBB xRRRRRxx */ \
1445
+ "vshl.u8 d6, d6, #3 \n" /* G GGGGG000 upper 5 */ \
1446
+ "vshr.u8 d1, d1, #2 \n" /* R 00xRRRRR lower 5 */ \
1447
+ "vshl.u8 q0, q0, #3 \n" /* B,R BBBBB000 upper 5 */ \
1448
+ "vshr.u8 q2, q0, #5 \n" /* B,R 00000BBB lower 3 */ \
1449
+ "vorr.u8 d0, d0, d4 \n" /* B */ \
1450
+ "vshr.u8 d4, d6, #5 \n" /* G 00000GGG lower 3 */ \
1451
+ "vorr.u8 d2, d1, d5 \n" /* R */ \
1452
+ "vorr.u8 d1, d4, d6 \n" /* G */
1453
+
1454
+ void ARGB1555ToARGBRow_NEON(const uint8_t* src_argb1555,
1455
+ uint8_t* dst_argb,
1456
+ int width) {
1457
+ asm volatile(
1458
+ "vmov.u8 d3, #255 \n" // Alpha
1459
+ "1: \n"
1460
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels.
1461
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1462
+ ARGB1555TOARGB
1463
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
1464
+ "bgt 1b \n"
1465
+ : "+r"(src_argb1555), // %0
1466
+ "+r"(dst_argb), // %1
1467
+ "+r"(width) // %2
1468
+ :
1469
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
1470
+ );
1471
+ }
1472
+
1473
+ #define ARGB4444TOARGB \
1474
+ "vuzp.u8 d0, d1 \n" /* d0 BG, d1 RA */ \
1475
+ "vshl.u8 q2, q0, #4 \n" /* B,R BBBB0000 */ \
1476
+ "vshr.u8 q1, q0, #4 \n" /* G,A 0000GGGG */ \
1477
+ "vshr.u8 q0, q2, #4 \n" /* B,R 0000BBBB */ \
1478
+ "vorr.u8 q0, q0, q2 \n" /* B,R BBBBBBBB */ \
1479
+ "vshl.u8 q2, q1, #4 \n" /* G,A GGGG0000 */ \
1480
+ "vorr.u8 q1, q1, q2 \n" /* G,A GGGGGGGG */ \
1481
+ "vswp.u8 d1, d2 \n" /* B,R,G,A -> B,G,R,A */
1482
+
1483
+ void ARGB4444ToARGBRow_NEON(const uint8_t* src_argb4444,
1484
+ uint8_t* dst_argb,
1485
+ int width) {
1486
+ asm volatile(
1487
+ "vmov.u8 d3, #255 \n" // Alpha
1488
+ "1: \n"
1489
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels.
1490
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1491
+ ARGB4444TOARGB
1492
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
1493
+ "bgt 1b \n"
1494
+ : "+r"(src_argb4444), // %0
1495
+ "+r"(dst_argb), // %1
1496
+ "+r"(width) // %2
1497
+ :
1498
+ : "cc", "memory", "q0", "q1", "q2" // Clobber List
1499
+ );
1500
+ }
1501
+
1502
+ void ARGBToRGB24Row_NEON(const uint8_t* src_argb,
1503
+ uint8_t* dst_rgb24,
1504
+ int width) {
1505
+ asm volatile(
1506
+ "1: \n"
1507
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 16 pixels of ARGB.
1508
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n"
1509
+ "subs %2, %2, #16 \n" // 16 processed per loop.
1510
+ "vst3.8 {d0, d2, d4}, [%1]! \n" // store 16 RGB24 pixels.
1511
+ "vst3.8 {d1, d3, d5}, [%1]! \n"
1512
+ "bgt 1b \n"
1513
+ : "+r"(src_argb), // %0
1514
+ "+r"(dst_rgb24), // %1
1515
+ "+r"(width) // %2
1516
+ :
1517
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
1518
+ );
1519
+ }
1520
+
1521
+ void ARGBToRAWRow_NEON(const uint8_t* src_argb, uint8_t* dst_raw, int width) {
1522
+ asm volatile(
1523
+ "1: \n"
1524
+ "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB.
1525
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1526
+ "vswp.u8 d1, d3 \n" // swap R, B
1527
+ "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RAW.
1528
+ "bgt 1b \n"
1529
+ : "+r"(src_argb), // %0
1530
+ "+r"(dst_raw), // %1
1531
+ "+r"(width) // %2
1532
+ :
1533
+ : "cc", "memory", "d1", "d2", "d3", "d4" // Clobber List
1534
+ );
1535
+ }
1536
+
1537
+ void YUY2ToYRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_y, int width) {
1538
+ asm volatile(
1539
+ "1: \n"
1540
+ "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of YUY2.
1541
+ "subs %2, %2, #16 \n" // 16 processed per loop.
1542
+ "vst1.8 {q0}, [%1]! \n" // store 16 pixels of Y.
1543
+ "bgt 1b \n"
1544
+ : "+r"(src_yuy2), // %0
1545
+ "+r"(dst_y), // %1
1546
+ "+r"(width) // %2
1547
+ :
1548
+ : "cc", "memory", "q0", "q1" // Clobber List
1549
+ );
1550
+ }
1551
+
1552
+ void UYVYToYRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_y, int width) {
1553
+ asm volatile(
1554
+ "1: \n"
1555
+ "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of UYVY.
1556
+ "subs %2, %2, #16 \n" // 16 processed per loop.
1557
+ "vst1.8 {q1}, [%1]! \n" // store 16 pixels of Y.
1558
+ "bgt 1b \n"
1559
+ : "+r"(src_uyvy), // %0
1560
+ "+r"(dst_y), // %1
1561
+ "+r"(width) // %2
1562
+ :
1563
+ : "cc", "memory", "q0", "q1" // Clobber List
1564
+ );
1565
+ }
1566
+
1567
+ void YUY2ToUV422Row_NEON(const uint8_t* src_yuy2,
1568
+ uint8_t* dst_u,
1569
+ uint8_t* dst_v,
1570
+ int width) {
1571
+ asm volatile(
1572
+ "1: \n"
1573
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2.
1574
+ "subs %3, %3, #16 \n" // 16 pixels = 8 UVs.
1575
+ "vst1.8 {d1}, [%1]! \n" // store 8 U.
1576
+ "vst1.8 {d3}, [%2]! \n" // store 8 V.
1577
+ "bgt 1b \n"
1578
+ : "+r"(src_yuy2), // %0
1579
+ "+r"(dst_u), // %1
1580
+ "+r"(dst_v), // %2
1581
+ "+r"(width) // %3
1582
+ :
1583
+ : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List
1584
+ );
1585
+ }
1586
+
1587
+ void UYVYToUV422Row_NEON(const uint8_t* src_uyvy,
1588
+ uint8_t* dst_u,
1589
+ uint8_t* dst_v,
1590
+ int width) {
1591
+ asm volatile(
1592
+ "1: \n"
1593
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY.
1594
+ "subs %3, %3, #16 \n" // 16 pixels = 8 UVs.
1595
+ "vst1.8 {d0}, [%1]! \n" // store 8 U.
1596
+ "vst1.8 {d2}, [%2]! \n" // store 8 V.
1597
+ "bgt 1b \n"
1598
+ : "+r"(src_uyvy), // %0
1599
+ "+r"(dst_u), // %1
1600
+ "+r"(dst_v), // %2
1601
+ "+r"(width) // %3
1602
+ :
1603
+ : "cc", "memory", "d0", "d1", "d2", "d3" // Clobber List
1604
+ );
1605
+ }
1606
+
1607
+ void YUY2ToUVRow_NEON(const uint8_t* src_yuy2,
1608
+ int stride_yuy2,
1609
+ uint8_t* dst_u,
1610
+ uint8_t* dst_v,
1611
+ int width) {
1612
+ asm volatile(
1613
+ "add %1, %0, %1 \n" // stride + src_yuy2
1614
+ "1: \n"
1615
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of YUY2.
1616
+ "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row YUY2.
1617
+ "subs %4, %4, #16 \n" // 16 pixels = 8 UVs.
1618
+ "vrhadd.u8 d1, d1, d5 \n" // average rows of U
1619
+ "vrhadd.u8 d3, d3, d7 \n" // average rows of V
1620
+ "vst1.8 {d1}, [%2]! \n" // store 8 U.
1621
+ "vst1.8 {d3}, [%3]! \n" // store 8 V.
1622
+ "bgt 1b \n"
1623
+ : "+r"(src_yuy2), // %0
1624
+ "+r"(stride_yuy2), // %1
1625
+ "+r"(dst_u), // %2
1626
+ "+r"(dst_v), // %3
1627
+ "+r"(width) // %4
1628
+ :
1629
+ : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6",
1630
+ "d7" // Clobber List
1631
+ );
1632
+ }
1633
+
1634
+ void UYVYToUVRow_NEON(const uint8_t* src_uyvy,
1635
+ int stride_uyvy,
1636
+ uint8_t* dst_u,
1637
+ uint8_t* dst_v,
1638
+ int width) {
1639
+ asm volatile(
1640
+ "add %1, %0, %1 \n" // stride + src_uyvy
1641
+ "1: \n"
1642
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 16 pixels of UYVY.
1643
+ "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load next row UYVY.
1644
+ "subs %4, %4, #16 \n" // 16 pixels = 8 UVs.
1645
+ "vrhadd.u8 d0, d0, d4 \n" // average rows of U
1646
+ "vrhadd.u8 d2, d2, d6 \n" // average rows of V
1647
+ "vst1.8 {d0}, [%2]! \n" // store 8 U.
1648
+ "vst1.8 {d2}, [%3]! \n" // store 8 V.
1649
+ "bgt 1b \n"
1650
+ : "+r"(src_uyvy), // %0
1651
+ "+r"(stride_uyvy), // %1
1652
+ "+r"(dst_u), // %2
1653
+ "+r"(dst_v), // %3
1654
+ "+r"(width) // %4
1655
+ :
1656
+ : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6",
1657
+ "d7" // Clobber List
1658
+ );
1659
+ }
1660
+
1661
+ void YUY2ToNVUVRow_NEON(const uint8_t* src_yuy2,
1662
+ int stride_yuy2,
1663
+ uint8_t* dst_uv,
1664
+ int width) {
1665
+ asm volatile(
1666
+ "add %1, %0, %1 \n" // stride + src_yuy2
1667
+ "1: \n"
1668
+ "vld2.8 {q0, q1}, [%0]! \n" // load 16 pixels of YUY2.
1669
+ "subs %3, %3, #16 \n" // 16 pixels = 8 UVs.
1670
+ "vld2.8 {q2, q3}, [%1]! \n" // load next row YUY2.
1671
+ "vrhadd.u8 q4, q1, q3 \n" // average rows of UV
1672
+ "vst1.8 {q4}, [%2]! \n" // store 8 UV.
1673
+ "bgt 1b \n"
1674
+ : "+r"(src_yuy2), // %0
1675
+ "+r"(stride_yuy2), // %1
1676
+ "+r"(dst_uv), // %2
1677
+ "+r"(width) // %3
1678
+ :
1679
+ : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6",
1680
+ "d7" // Clobber List
1681
+ );
1682
+ }
1683
+
1684
+ // For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA.
1685
+ void ARGBShuffleRow_NEON(const uint8_t* src_argb,
1686
+ uint8_t* dst_argb,
1687
+ const uint8_t* shuffler,
1688
+ int width) {
1689
+ asm volatile(
1690
+ "vld1.8 {q2}, [%3] \n" // shuffler
1691
+ "1: \n"
1692
+ "vld1.8 {q0}, [%0]! \n" // load 4 pixels.
1693
+ "subs %2, %2, #4 \n" // 4 processed per loop
1694
+ "vtbl.8 d2, {d0, d1}, d4 \n" // look up 2 first pixels
1695
+ "vtbl.8 d3, {d0, d1}, d5 \n" // look up 2 next pixels
1696
+ "vst1.8 {q1}, [%1]! \n" // store 4.
1697
+ "bgt 1b \n"
1698
+ : "+r"(src_argb), // %0
1699
+ "+r"(dst_argb), // %1
1700
+ "+r"(width) // %2
1701
+ : "r"(shuffler) // %3
1702
+ : "cc", "memory", "q0", "q1", "q2" // Clobber List
1703
+ );
1704
+ }
1705
+
1706
+ void I422ToYUY2Row_NEON(const uint8_t* src_y,
1707
+ const uint8_t* src_u,
1708
+ const uint8_t* src_v,
1709
+ uint8_t* dst_yuy2,
1710
+ int width) {
1711
+ asm volatile(
1712
+ "1: \n"
1713
+ "vld2.8 {d0, d2}, [%0]! \n" // load 16 Ys
1714
+ "vld1.8 {d1}, [%1]! \n" // load 8 Us
1715
+ "vld1.8 {d3}, [%2]! \n" // load 8 Vs
1716
+ "subs %4, %4, #16 \n" // 16 pixels
1717
+ "vst4.8 {d0, d1, d2, d3}, [%3]! \n" // Store 8 YUY2/16 pixels.
1718
+ "bgt 1b \n"
1719
+ : "+r"(src_y), // %0
1720
+ "+r"(src_u), // %1
1721
+ "+r"(src_v), // %2
1722
+ "+r"(dst_yuy2), // %3
1723
+ "+r"(width) // %4
1724
+ :
1725
+ : "cc", "memory", "d0", "d1", "d2", "d3");
1726
+ }
1727
+
1728
+ void I422ToUYVYRow_NEON(const uint8_t* src_y,
1729
+ const uint8_t* src_u,
1730
+ const uint8_t* src_v,
1731
+ uint8_t* dst_uyvy,
1732
+ int width) {
1733
+ asm volatile(
1734
+ "1: \n"
1735
+ "vld2.8 {d1, d3}, [%0]! \n" // load 16 Ys
1736
+ "vld1.8 {d0}, [%1]! \n" // load 8 Us
1737
+ "vld1.8 {d2}, [%2]! \n" // load 8 Vs
1738
+ "subs %4, %4, #16 \n" // 16 pixels
1739
+ "vst4.8 {d0, d1, d2, d3}, [%3]! \n" // Store 8 UYVY/16 pixels.
1740
+ "bgt 1b \n"
1741
+ : "+r"(src_y), // %0
1742
+ "+r"(src_u), // %1
1743
+ "+r"(src_v), // %2
1744
+ "+r"(dst_uyvy), // %3
1745
+ "+r"(width) // %4
1746
+ :
1747
+ : "cc", "memory", "d0", "d1", "d2", "d3");
1748
+ }
1749
+
1750
+ void ARGBToRGB565Row_NEON(const uint8_t* src_argb,
1751
+ uint8_t* dst_rgb565,
1752
+ int width) {
1753
+ asm volatile(
1754
+ "1: \n"
1755
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB.
1756
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1757
+ ARGBTORGB565
1758
+ "vst1.8 {q2}, [%1]! \n" // store 8 pixels RGB565.
1759
+ "bgt 1b \n"
1760
+ : "+r"(src_argb), // %0
1761
+ "+r"(dst_rgb565), // %1
1762
+ "+r"(width) // %2
1763
+ :
1764
+ : "cc", "memory", "q0", "q1", "q2", "d6");
1765
+ }
1766
+
1767
+ void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb,
1768
+ uint8_t* dst_rgb,
1769
+ uint32_t dither4,
1770
+ int width) {
1771
+ asm volatile(
1772
+ "vdup.32 d7, %2 \n" // dither4
1773
+ "1: \n"
1774
+ "vld4.8 {d0, d2, d4, d6}, [%1]! \n" // load 8 pixels of ARGB.
1775
+ "subs %3, %3, #8 \n" // 8 processed per loop.
1776
+ "vqadd.u8 d0, d0, d7 \n"
1777
+ "vqadd.u8 d2, d2, d7 \n"
1778
+ "vqadd.u8 d4, d4, d7 \n" // add for dither
1779
+ ARGBTORGB565
1780
+ "vst1.8 {q2}, [%0]! \n" // store 8 RGB565.
1781
+ "bgt 1b \n"
1782
+ : "+r"(dst_rgb) // %0
1783
+ : "r"(src_argb), // %1
1784
+ "r"(dither4), // %2
1785
+ "r"(width) // %3
1786
+ : "cc", "memory", "q0", "q1", "q2", "q3");
1787
+ }
1788
+
1789
+ void ARGBToARGB1555Row_NEON(const uint8_t* src_argb,
1790
+ uint8_t* dst_argb1555,
1791
+ int width) {
1792
+ asm volatile(
1793
+ "1: \n"
1794
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB.
1795
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1796
+ ARGBTOARGB1555
1797
+ "vst1.8 {q3}, [%1]! \n" // store 8 ARGB1555.
1798
+ "bgt 1b \n"
1799
+ : "+r"(src_argb), // %0
1800
+ "+r"(dst_argb1555), // %1
1801
+ "+r"(width) // %2
1802
+ :
1803
+ : "cc", "memory", "q0", "q1", "q2", "q3");
1804
+ }
1805
+
1806
+ void ARGBToARGB4444Row_NEON(const uint8_t* src_argb,
1807
+ uint8_t* dst_argb4444,
1808
+ int width) {
1809
+ asm volatile(
1810
+ "vmov.u8 d7, #0x0f \n" // bits to clear with
1811
+ // vbic.
1812
+ "1: \n"
1813
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB.
1814
+ "subs %2, %2, #8 \n" // 8 processed per loop.
1815
+ ARGBTOARGB4444
1816
+ "vst1.8 {q0}, [%1]! \n" // store 8 ARGB4444.
1817
+ "bgt 1b \n"
1818
+ : "+r"(src_argb), // %0
1819
+ "+r"(dst_argb4444), // %1
1820
+ "+r"(width) // %2
1821
+ :
1822
+ : "cc", "memory", "q0", "q1", "q2", "q3");
1823
+ }
1824
+
1825
+ void ARGBExtractAlphaRow_NEON(const uint8_t* src_argb,
1826
+ uint8_t* dst_a,
1827
+ int width) {
1828
+ asm volatile(
1829
+ "1: \n"
1830
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels
1831
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels
1832
+ "subs %2, %2, #16 \n" // 16 processed per loop
1833
+ "vst1.8 {q3}, [%1]! \n" // store 16 A's.
1834
+ "bgt 1b \n"
1835
+ : "+r"(src_argb), // %0
1836
+ "+r"(dst_a), // %1
1837
+ "+r"(width) // %2
1838
+ :
1839
+ : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
1840
+ );
1841
+ }
1842
+
1843
+ // Coefficients expressed as negatives to allow 128
1844
+ struct RgbUVConstants {
1845
+ int8_t kRGBToU[4];
1846
+ int8_t kRGBToV[4];
1847
+ };
1848
+
1849
+ // 8x1 pixels.
1850
+ static void ARGBToUV444MatrixRow_NEON(
1851
+ const uint8_t* src_argb,
1852
+ uint8_t* dst_u,
1853
+ uint8_t* dst_v,
1854
+ int width,
1855
+ const struct RgbUVConstants* rgbuvconstants) {
1856
+ asm volatile(
1857
+ "vld1.8 {d0}, [%4] \n" // load rgbuvconstants
1858
+ "vdup.u8 d24, d0[0] \n" // UB 0.875 coefficient
1859
+ "vdup.u8 d25, d0[1] \n" // UG -0.5781 coefficient
1860
+ "vdup.u8 d26, d0[2] \n" // UR -0.2969 coefficient
1861
+ "vdup.u8 d27, d0[4] \n" // VB -0.1406 coefficient
1862
+ "vdup.u8 d28, d0[5] \n" // VG -0.7344 coefficient
1863
+ "vneg.s8 d24, d24 \n"
1864
+ "vmov.u16 q15, #0x8000 \n" // 128.0
1865
+
1866
+ "1: \n"
1867
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
1868
+ "subs %3, %3, #8 \n" // 8 processed per loop.
1869
+ "vmull.u8 q2, d0, d24 \n" // B
1870
+ "vmlsl.u8 q2, d1, d25 \n" // G
1871
+ "vmlsl.u8 q2, d2, d26 \n" // R
1872
+
1873
+ "vmull.u8 q3, d2, d24 \n" // R
1874
+ "vmlsl.u8 q3, d1, d28 \n" // G
1875
+ "vmlsl.u8 q3, d0, d27 \n" // B
1876
+
1877
+ "vaddhn.u16 d0, q2, q15 \n" // signed -> unsigned
1878
+ "vaddhn.u16 d1, q3, q15 \n"
1879
+
1880
+ "vst1.8 {d0}, [%1]! \n" // store 8 pixels U.
1881
+ "vst1.8 {d1}, [%2]! \n" // store 8 pixels V.
1882
+ "bgt 1b \n"
1883
+ : "+r"(src_argb), // %0
1884
+ "+r"(dst_u), // %1
1885
+ "+r"(dst_v), // %2
1886
+ "+r"(width) // %3
1887
+ : "r"(rgbuvconstants) // %4
1888
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q12", "q13", "q14",
1889
+ "q15");
1890
+ }
1891
+
1892
+ // RGB to BT601 coefficients
1893
+ // UB 0.875 coefficient = 112
1894
+ // UG -0.5781 coefficient = -74
1895
+ // UR -0.2969 coefficient = -38
1896
+ // VB -0.1406 coefficient = -18
1897
+ // VG -0.7344 coefficient = -94
1898
+ // VR 0.875 coefficient = 112
1899
+
1900
+ static const struct RgbUVConstants kARGBI601UVConstants = {{-112, 74, 38, 0},
1901
+ {18, 94, -112, 0}};
1902
+
1903
+ void ARGBToUV444Row_NEON(const uint8_t* src_argb,
1904
+ uint8_t* dst_u,
1905
+ uint8_t* dst_v,
1906
+ int width) {
1907
+ ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width,
1908
+ &kARGBI601UVConstants);
1909
+ }
1910
+
1911
+ // RGB to JPEG coefficients
1912
+ // UB 0.500 coefficient = 128
1913
+ // UG -0.33126 coefficient = -85
1914
+ // UR -0.16874 coefficient = -43
1915
+ // VB -0.08131 coefficient = -21
1916
+ // VG -0.41869 coefficient = -107
1917
+ // VR 0.500 coefficient = 128
1918
+
1919
+ static const struct RgbUVConstants kARGBJPEGUVConstants = {{-128, 85, 43, 0},
1920
+ {21, 107, -128, 0}};
1921
+
1922
+ void ARGBToUVJ444Row_NEON(const uint8_t* src_argb,
1923
+ uint8_t* dst_u,
1924
+ uint8_t* dst_v,
1925
+ int width) {
1926
+ ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width,
1927
+ &kARGBJPEGUVConstants);
1928
+ }
1929
+
1930
+ // clang-format off
1931
+ // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
1932
+ #define RGBTOUV(QB, QG, QR) \
1933
+ "vmul.s16 q8, " #QB ", q10 \n" /* B */ \
1934
+ "vmls.s16 q8, " #QG ", q11 \n" /* G */ \
1935
+ "vmls.s16 q8, " #QR ", q12 \n" /* R */ \
1936
+ "vmul.s16 q9, " #QR ", q10 \n" /* R */ \
1937
+ "vmls.s16 q9, " #QG ", q14 \n" /* G */ \
1938
+ "vmls.s16 q9, " #QB ", q13 \n" /* B */ \
1939
+ "vaddhn.u16 d0, q8, q15 \n" /* +128 -> unsigned */ \
1940
+ "vaddhn.u16 d1, q9, q15 \n" /* +128 -> unsigned */
1941
+ // clang-format on
1942
+
1943
+ // TODO(fbarchard): Consider vhadd vertical, then vpaddl horizontal, avoid shr.
1944
+ void ARGBToUVRow_NEON(const uint8_t* src_argb,
1945
+ int src_stride_argb,
1946
+ uint8_t* dst_u,
1947
+ uint8_t* dst_v,
1948
+ int width) {
1949
+ asm volatile (
1950
+ "add %1, %0, %1 \n" // src_stride + src_argb
1951
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
1952
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
1953
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
1954
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
1955
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
1956
+ "vmov.u16 q15, #0x8000 \n" // 128.0
1957
+ "1: \n"
1958
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
1959
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels.
1960
+ "subs %4, %4, #16 \n" // 16 processed per loop.
1961
+ "vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
1962
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
1963
+ "vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
1964
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ARGB pixels.
1965
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ARGB pixels.
1966
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
1967
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
1968
+ "vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
1969
+
1970
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
1971
+ "vrshr.u16 q1, q1, #2 \n"
1972
+ "vrshr.u16 q2, q2, #2 \n"
1973
+
1974
+ RGBTOUV(q0, q1, q2)
1975
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
1976
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
1977
+ "bgt 1b \n"
1978
+ : "+r"(src_argb), // %0
1979
+ "+r"(src_stride_argb), // %1
1980
+ "+r"(dst_u), // %2
1981
+ "+r"(dst_v), // %3
1982
+ "+r"(width) // %4
1983
+ :
1984
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
1985
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
1986
+ );
1987
+ }
1988
+
1989
+ void ARGBToUVJRow_NEON(const uint8_t* src_argb,
1990
+ int src_stride_argb,
1991
+ uint8_t* dst_u,
1992
+ uint8_t* dst_v,
1993
+ int width) {
1994
+ asm volatile (
1995
+ "add %1, %0, %1 \n" // src_stride + src_argb
1996
+ "vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
1997
+ "vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
1998
+ "vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
1999
+ "vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
2000
+ "vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
2001
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2002
+ "1: \n"
2003
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
2004
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels.
2005
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2006
+ "vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
2007
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2008
+ "vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
2009
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ARGB pixels.
2010
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ARGB pixels.
2011
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
2012
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2013
+ "vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
2014
+
2015
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2016
+ "vrshr.u16 q1, q1, #2 \n"
2017
+ "vrshr.u16 q2, q2, #2 \n"
2018
+
2019
+ RGBTOUV(q0, q1, q2)
2020
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2021
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2022
+ "bgt 1b \n"
2023
+ : "+r"(src_argb), // %0
2024
+ "+r"(src_stride_argb), // %1
2025
+ "+r"(dst_u), // %2
2026
+ "+r"(dst_v), // %3
2027
+ "+r"(width) // %4
2028
+ :
2029
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2030
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2031
+ );
2032
+ }
2033
+
2034
+ void ABGRToUVJRow_NEON(const uint8_t* src_abgr,
2035
+ int src_stride_abgr,
2036
+ uint8_t* dst_uj,
2037
+ uint8_t* dst_vj,
2038
+ int width) {
2039
+ asm volatile (
2040
+ "add %1, %0, %1 \n" // src_stride + src_argb
2041
+ "vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
2042
+ "vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
2043
+ "vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
2044
+ "vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
2045
+ "vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
2046
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2047
+ "1: \n"
2048
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ABGR pixels.
2049
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ABGR pixels.
2050
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2051
+ "vpaddl.u8 q0, q0 \n" // R 16 bytes -> 8 shorts.
2052
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2053
+ "vpaddl.u8 q2, q2 \n" // B 16 bytes -> 8 shorts.
2054
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ABGR pixels.
2055
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ABGR pixels.
2056
+ "vpadal.u8 q0, q4 \n" // R 16 bytes -> 8 shorts.
2057
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2058
+ "vpadal.u8 q2, q6 \n" // B 16 bytes -> 8 shorts.
2059
+
2060
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2061
+ "vrshr.u16 q1, q1, #2 \n"
2062
+ "vrshr.u16 q2, q2, #2 \n"
2063
+
2064
+ RGBTOUV(q2, q1, q0)
2065
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2066
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2067
+ "bgt 1b \n"
2068
+ : "+r"(src_abgr), // %0
2069
+ "+r"(src_stride_abgr), // %1
2070
+ "+r"(dst_uj), // %2
2071
+ "+r"(dst_vj), // %3
2072
+ "+r"(width) // %4
2073
+ :
2074
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2075
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2076
+ );
2077
+ }
2078
+
2079
+ void RGB24ToUVJRow_NEON(const uint8_t* src_rgb24,
2080
+ int src_stride_rgb24,
2081
+ uint8_t* dst_u,
2082
+ uint8_t* dst_v,
2083
+ int width) {
2084
+ asm volatile (
2085
+ "add %1, %0, %1 \n" // src_stride + src_rgb24
2086
+ "vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
2087
+ "vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
2088
+ "vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
2089
+ "vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
2090
+ "vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
2091
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2092
+ "1: \n"
2093
+ "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB24 pixels.
2094
+ "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RGB24 pixels.
2095
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2096
+ "vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
2097
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2098
+ "vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
2099
+ "vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RGB24 pixels.
2100
+ "vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RGB24 pixels.
2101
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
2102
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2103
+ "vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
2104
+
2105
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2106
+ "vrshr.u16 q1, q1, #2 \n"
2107
+ "vrshr.u16 q2, q2, #2 \n"
2108
+
2109
+ RGBTOUV(q0, q1, q2)
2110
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2111
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2112
+ "bgt 1b \n"
2113
+ : "+r"(src_rgb24), // %0
2114
+ "+r"(src_stride_rgb24), // %1
2115
+ "+r"(dst_u), // %2
2116
+ "+r"(dst_v), // %3
2117
+ "+r"(width) // %4
2118
+ :
2119
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2120
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2121
+ );
2122
+ }
2123
+
2124
+ void RAWToUVJRow_NEON(const uint8_t* src_raw,
2125
+ int src_stride_raw,
2126
+ uint8_t* dst_u,
2127
+ uint8_t* dst_v,
2128
+ int width) {
2129
+ asm volatile (
2130
+ "add %1, %0, %1 \n" // src_stride + src_raw
2131
+ "vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
2132
+ "vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
2133
+ "vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
2134
+ "vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
2135
+ "vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
2136
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2137
+ "1: \n"
2138
+ "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RAW pixels.
2139
+ "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RAW pixels.
2140
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2141
+ "vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
2142
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2143
+ "vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
2144
+ "vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RAW pixels.
2145
+ "vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RAW pixels.
2146
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
2147
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2148
+ "vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
2149
+
2150
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2151
+ "vrshr.u16 q1, q1, #2 \n"
2152
+ "vrshr.u16 q2, q2, #2 \n"
2153
+
2154
+ RGBTOUV(q2, q1, q0)
2155
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2156
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2157
+ "bgt 1b \n"
2158
+ : "+r"(src_raw), // %0
2159
+ "+r"(src_stride_raw), // %1
2160
+ "+r"(dst_u), // %2
2161
+ "+r"(dst_v), // %3
2162
+ "+r"(width) // %4
2163
+ :
2164
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2165
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2166
+ );
2167
+ }
2168
+
2169
+ void BGRAToUVRow_NEON(const uint8_t* src_bgra,
2170
+ int src_stride_bgra,
2171
+ uint8_t* dst_u,
2172
+ uint8_t* dst_v,
2173
+ int width) {
2174
+ asm volatile (
2175
+ "add %1, %0, %1 \n" // src_stride + src_bgra
2176
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2177
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2178
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2179
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2180
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2181
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2182
+ "1: \n"
2183
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 BGRA pixels.
2184
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 BGRA pixels.
2185
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2186
+ "vpaddl.u8 q3, q3 \n" // B 16 bytes -> 8 shorts.
2187
+ "vpaddl.u8 q2, q2 \n" // G 16 bytes -> 8 shorts.
2188
+ "vpaddl.u8 q1, q1 \n" // R 16 bytes -> 8 shorts.
2189
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more BGRA pixels.
2190
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 BGRA pixels.
2191
+ "vpadal.u8 q3, q7 \n" // B 16 bytes -> 8 shorts.
2192
+ "vpadal.u8 q2, q6 \n" // G 16 bytes -> 8 shorts.
2193
+ "vpadal.u8 q1, q5 \n" // R 16 bytes -> 8 shorts.
2194
+
2195
+ "vrshr.u16 q1, q1, #2 \n" // average of 4
2196
+ "vrshr.u16 q2, q2, #2 \n"
2197
+ "vrshr.u16 q3, q3, #2 \n"
2198
+
2199
+ RGBTOUV(q3, q2, q1)
2200
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2201
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2202
+ "bgt 1b \n"
2203
+ : "+r"(src_bgra), // %0
2204
+ "+r"(src_stride_bgra), // %1
2205
+ "+r"(dst_u), // %2-
2206
+ "+r"(dst_v), // %3
2207
+ "+r"(width) // %4
2208
+ :
2209
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2210
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2211
+ );
2212
+ }
2213
+
2214
+ void ABGRToUVRow_NEON(const uint8_t* src_abgr,
2215
+ int src_stride_abgr,
2216
+ uint8_t* dst_u,
2217
+ uint8_t* dst_v,
2218
+ int width) {
2219
+ asm volatile (
2220
+ "add %1, %0, %1 \n" // src_stride + src_abgr
2221
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2222
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2223
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2224
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2225
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2226
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2227
+ "1: \n"
2228
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ABGR pixels.
2229
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ABGR pixels.
2230
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2231
+ "vpaddl.u8 q2, q2 \n" // B 16 bytes -> 8 shorts.
2232
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2233
+ "vpaddl.u8 q0, q0 \n" // R 16 bytes -> 8 shorts.
2234
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ABGR pixels.
2235
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ABGR pixels.
2236
+ "vpadal.u8 q2, q6 \n" // B 16 bytes -> 8 shorts.
2237
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2238
+ "vpadal.u8 q0, q4 \n" // R 16 bytes -> 8 shorts.
2239
+
2240
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2241
+ "vrshr.u16 q1, q1, #2 \n"
2242
+ "vrshr.u16 q2, q2, #2 \n"
2243
+
2244
+ RGBTOUV(q2, q1, q0)
2245
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2246
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2247
+ "bgt 1b \n"
2248
+ : "+r"(src_abgr), // %0
2249
+ "+r"(src_stride_abgr), // %1
2250
+ "+r"(dst_u), // %2
2251
+ "+r"(dst_v), // %3
2252
+ "+r"(width) // %4
2253
+ :
2254
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2255
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2256
+ );
2257
+ }
2258
+
2259
+ void RGBAToUVRow_NEON(const uint8_t* src_rgba,
2260
+ int src_stride_rgba,
2261
+ uint8_t* dst_u,
2262
+ uint8_t* dst_v,
2263
+ int width) {
2264
+ asm volatile (
2265
+ "add %1, %0, %1 \n" // src_stride + src_rgba
2266
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2267
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2268
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2269
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2270
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2271
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2272
+ "1: \n"
2273
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 RGBA pixels.
2274
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 RGBA pixels.
2275
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2276
+ "vpaddl.u8 q0, q1 \n" // B 16 bytes -> 8 shorts.
2277
+ "vpaddl.u8 q1, q2 \n" // G 16 bytes -> 8 shorts.
2278
+ "vpaddl.u8 q2, q3 \n" // R 16 bytes -> 8 shorts.
2279
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more RGBA pixels.
2280
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 RGBA pixels.
2281
+ "vpadal.u8 q0, q5 \n" // B 16 bytes -> 8 shorts.
2282
+ "vpadal.u8 q1, q6 \n" // G 16 bytes -> 8 shorts.
2283
+ "vpadal.u8 q2, q7 \n" // R 16 bytes -> 8 shorts.
2284
+
2285
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2286
+ "vrshr.u16 q1, q1, #2 \n"
2287
+ "vrshr.u16 q2, q2, #2 \n"
2288
+
2289
+ RGBTOUV(q0, q1, q2)
2290
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2291
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2292
+ "bgt 1b \n"
2293
+ : "+r"(src_rgba), // %0
2294
+ "+r"(src_stride_rgba), // %1
2295
+ "+r"(dst_u), // %2
2296
+ "+r"(dst_v), // %3
2297
+ "+r"(width) // %4
2298
+ :
2299
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2300
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2301
+ );
2302
+ }
2303
+
2304
+ void RGB24ToUVRow_NEON(const uint8_t* src_rgb24,
2305
+ int src_stride_rgb24,
2306
+ uint8_t* dst_u,
2307
+ uint8_t* dst_v,
2308
+ int width) {
2309
+ asm volatile (
2310
+ "add %1, %0, %1 \n" // src_stride + src_rgb24
2311
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2312
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2313
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2314
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2315
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2316
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2317
+ "1: \n"
2318
+ "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB24 pixels.
2319
+ "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RGB24 pixels.
2320
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2321
+ "vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
2322
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2323
+ "vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
2324
+ "vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RGB24 pixels.
2325
+ "vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RGB24 pixels.
2326
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
2327
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2328
+ "vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
2329
+
2330
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2331
+ "vrshr.u16 q1, q1, #2 \n"
2332
+ "vrshr.u16 q2, q2, #2 \n"
2333
+
2334
+ RGBTOUV(q0, q1, q2)
2335
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2336
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2337
+ "bgt 1b \n"
2338
+ : "+r"(src_rgb24), // %0
2339
+ "+r"(src_stride_rgb24), // %1
2340
+ "+r"(dst_u), // %2
2341
+ "+r"(dst_v), // %3
2342
+ "+r"(width) // %4
2343
+ :
2344
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2345
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2346
+ );
2347
+ }
2348
+
2349
+ void RAWToUVRow_NEON(const uint8_t* src_raw,
2350
+ int src_stride_raw,
2351
+ uint8_t* dst_u,
2352
+ uint8_t* dst_v,
2353
+ int width) {
2354
+ asm volatile (
2355
+ "add %1, %0, %1 \n" // src_stride + src_raw
2356
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2357
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2358
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2359
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2360
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2361
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2362
+ "1: \n"
2363
+ "vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RAW pixels.
2364
+ "vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RAW pixels.
2365
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2366
+ "vpaddl.u8 q2, q2 \n" // B 16 bytes -> 8 shorts.
2367
+ "vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
2368
+ "vpaddl.u8 q0, q0 \n" // R 16 bytes -> 8 shorts.
2369
+ "vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RAW pixels.
2370
+ "vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RAW pixels.
2371
+ "vpadal.u8 q2, q6 \n" // B 16 bytes -> 8 shorts.
2372
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
2373
+ "vpadal.u8 q0, q4 \n" // R 16 bytes -> 8 shorts.
2374
+
2375
+ "vrshr.u16 q0, q0, #2 \n" // average of 4
2376
+ "vrshr.u16 q1, q1, #2 \n"
2377
+ "vrshr.u16 q2, q2, #2 \n"
2378
+
2379
+ RGBTOUV(q2, q1, q0)
2380
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2381
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2382
+ "bgt 1b \n"
2383
+ : "+r"(src_raw), // %0
2384
+ "+r"(src_stride_raw), // %1
2385
+ "+r"(dst_u), // %2
2386
+ "+r"(dst_v), // %3
2387
+ "+r"(width) // %4
2388
+ :
2389
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
2390
+ "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
2391
+ );
2392
+ }
2393
+
2394
+ // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
2395
+ void RGB565ToUVRow_NEON(const uint8_t* src_rgb565,
2396
+ int src_stride_rgb565,
2397
+ uint8_t* dst_u,
2398
+ uint8_t* dst_v,
2399
+ int width) {
2400
+ asm volatile(
2401
+ "add %1, %0, %1 \n" // src_stride + src_argb
2402
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2403
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2404
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2405
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2406
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2407
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2408
+ "1: \n"
2409
+ "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels.
2410
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2411
+ RGB565TOARGB
2412
+ "vpaddl.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2413
+ "vpaddl.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2414
+ "vpaddl.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2415
+ "vld1.8 {q0}, [%0]! \n" // next 8 RGB565 pixels.
2416
+ RGB565TOARGB
2417
+ "vpaddl.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2418
+ "vpaddl.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2419
+ "vpaddl.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2420
+
2421
+ "vld1.8 {q0}, [%1]! \n" // load 8 RGB565 pixels.
2422
+ RGB565TOARGB
2423
+ "vpadal.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2424
+ "vpadal.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2425
+ "vpadal.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2426
+ "vld1.8 {q0}, [%1]! \n" // next 8 RGB565 pixels.
2427
+ RGB565TOARGB
2428
+ "vpadal.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2429
+ "vpadal.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2430
+ "vpadal.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2431
+
2432
+ "vrshr.u16 q4, q4, #2 \n" // average of 4
2433
+ "vrshr.u16 q5, q5, #2 \n"
2434
+ "vrshr.u16 q6, q6, #2 \n"
2435
+
2436
+ "vmul.s16 q8, q4, q10 \n" // B
2437
+ "vmls.s16 q8, q5, q11 \n" // G
2438
+ "vmls.s16 q8, q6, q12 \n" // R
2439
+ "vadd.u16 q8, q8, q15 \n" // +128 -> unsigned
2440
+ "vmul.s16 q9, q6, q10 \n" // R
2441
+ "vmls.s16 q9, q5, q14 \n" // G
2442
+ "vmls.s16 q9, q4, q13 \n" // B
2443
+ "vadd.u16 q9, q9, q15 \n" // +128 -> unsigned
2444
+ "vqshrn.u16 d0, q8, #8 \n" // 16 bit to 8 bit U
2445
+ "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
2446
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2447
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2448
+ "bgt 1b \n"
2449
+ : "+r"(src_rgb565), // %0
2450
+ "+r"(src_stride_rgb565), // %1
2451
+ "+r"(dst_u), // %2
2452
+ "+r"(dst_v), // %3
2453
+ "+r"(width) // %4
2454
+ :
2455
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8",
2456
+ "q9", "q10", "q11", "q12", "q13", "q14", "q15");
2457
+ }
2458
+
2459
+ // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
2460
+ void ARGB1555ToUVRow_NEON(const uint8_t* src_argb1555,
2461
+ int src_stride_argb1555,
2462
+ uint8_t* dst_u,
2463
+ uint8_t* dst_v,
2464
+ int width) {
2465
+ asm volatile(
2466
+ "add %1, %0, %1 \n" // src_stride + src_argb
2467
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2468
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2469
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2470
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2471
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2472
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2473
+ "1: \n"
2474
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels.
2475
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2476
+ RGB555TOARGB
2477
+ "vpaddl.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2478
+ "vpaddl.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2479
+ "vpaddl.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2480
+ "vld1.8 {q0}, [%0]! \n" // next 8 ARGB1555 pixels.
2481
+ RGB555TOARGB
2482
+ "vpaddl.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2483
+ "vpaddl.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2484
+ "vpaddl.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2485
+
2486
+ "vld1.8 {q0}, [%1]! \n" // load 8 ARGB1555 pixels.
2487
+ RGB555TOARGB
2488
+ "vpadal.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2489
+ "vpadal.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2490
+ "vpadal.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2491
+ "vld1.8 {q0}, [%1]! \n" // next 8 ARGB1555 pixels.
2492
+ RGB555TOARGB
2493
+ "vpadal.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2494
+ "vpadal.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2495
+ "vpadal.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2496
+
2497
+ "vrshr.u16 q4, q4, #2 \n" // average of 4
2498
+ "vrshr.u16 q5, q5, #2 \n"
2499
+ "vrshr.u16 q6, q6, #2 \n"
2500
+
2501
+ "vmul.s16 q8, q4, q10 \n" // B
2502
+ "vmls.s16 q8, q5, q11 \n" // G
2503
+ "vmls.s16 q8, q6, q12 \n" // R
2504
+ "vadd.u16 q8, q8, q15 \n" // +128 -> unsigned
2505
+ "vmul.s16 q9, q6, q10 \n" // R
2506
+ "vmls.s16 q9, q5, q14 \n" // G
2507
+ "vmls.s16 q9, q4, q13 \n" // B
2508
+ "vadd.u16 q9, q9, q15 \n" // +128 -> unsigned
2509
+ "vqshrn.u16 d0, q8, #8 \n" // 16 bit to 8 bit U
2510
+ "vqshrn.u16 d1, q9, #8 \n" // 16 bit to 8 bit V
2511
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2512
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2513
+ "bgt 1b \n"
2514
+ : "+r"(src_argb1555), // %0
2515
+ "+r"(src_stride_argb1555), // %1
2516
+ "+r"(dst_u), // %2
2517
+ "+r"(dst_v), // %3
2518
+ "+r"(width) // %4
2519
+ :
2520
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8",
2521
+ "q9", "q10", "q11", "q12", "q13", "q14", "q15");
2522
+ }
2523
+
2524
+ // 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
2525
+ void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444,
2526
+ int src_stride_argb4444,
2527
+ uint8_t* dst_u,
2528
+ uint8_t* dst_v,
2529
+ int width) {
2530
+ asm volatile (
2531
+ "add %1, %0, %1 \n" // src_stride + src_argb
2532
+ "vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
2533
+ "vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
2534
+ "vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
2535
+ "vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
2536
+ "vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
2537
+ "vmov.u16 q15, #0x8000 \n" // 128.0
2538
+ "1: \n"
2539
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels.
2540
+ "subs %4, %4, #16 \n" // 16 processed per loop.
2541
+ ARGB4444TOARGB
2542
+ "vpaddl.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2543
+ "vpaddl.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2544
+ "vpaddl.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2545
+ "vld1.8 {q0}, [%0]! \n" // next 8 ARGB4444 pixels.
2546
+ ARGB4444TOARGB
2547
+ "vpaddl.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2548
+ "vpaddl.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2549
+ "vpaddl.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2550
+
2551
+ "vld1.8 {q0}, [%1]! \n" // load 8 ARGB4444 pixels.
2552
+ ARGB4444TOARGB
2553
+ "vpadal.u8 d8, d0 \n" // B 8 bytes -> 4 shorts.
2554
+ "vpadal.u8 d10, d1 \n" // G 8 bytes -> 4 shorts.
2555
+ "vpadal.u8 d12, d2 \n" // R 8 bytes -> 4 shorts.
2556
+ "vld1.8 {q0}, [%1]! \n" // next 8 ARGB4444 pixels.
2557
+ ARGB4444TOARGB
2558
+ "vpadal.u8 d9, d0 \n" // B 8 bytes -> 4 shorts.
2559
+ "vpadal.u8 d11, d1 \n" // G 8 bytes -> 4 shorts.
2560
+ "vpadal.u8 d13, d2 \n" // R 8 bytes -> 4 shorts.
2561
+
2562
+ "vrshr.u16 q0, q4, #2 \n" // average of 4
2563
+ "vrshr.u16 q1, q5, #2 \n"
2564
+ "vrshr.u16 q2, q6, #2 \n"
2565
+
2566
+ RGBTOUV(q0, q1, q2)
2567
+ "vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
2568
+ "vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
2569
+ "bgt 1b \n"
2570
+ : "+r"(src_argb4444), // %0
2571
+ "+r"(src_stride_argb4444), // %1
2572
+ "+r"(dst_u), // %2
2573
+ "+r"(dst_v), // %3
2574
+ "+r"(width) // %4
2575
+ :
2576
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8",
2577
+ "q9", "q10", "q11", "q12", "q13", "q14", "q15");
2578
+ }
2579
+
2580
+ void RGB565ToYRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width) {
2581
+ asm volatile(
2582
+ "vmov.u8 d24, #25 \n" // B * 0.1016 coefficient
2583
+ "vmov.u8 d25, #129 \n" // G * 0.5078 coefficient
2584
+ "vmov.u8 d26, #66 \n" // R * 0.2578 coefficient
2585
+ "vmov.u8 d27, #16 \n" // Add 16 constant
2586
+ "1: \n"
2587
+ "vld1.8 {q0}, [%0]! \n" // load 8 RGB565 pixels.
2588
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2589
+ RGB565TOARGB
2590
+ "vmull.u8 q2, d0, d24 \n" // B
2591
+ "vmlal.u8 q2, d1, d25 \n" // G
2592
+ "vmlal.u8 q2, d2, d26 \n" // R
2593
+ "vqrshrn.u16 d0, q2, #8 \n" // 16 bit to 8 bit Y
2594
+ "vqadd.u8 d0, d27 \n"
2595
+ "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2596
+ "bgt 1b \n"
2597
+ : "+r"(src_rgb565), // %0
2598
+ "+r"(dst_y), // %1
2599
+ "+r"(width) // %2
2600
+ :
2601
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13");
2602
+ }
2603
+
2604
+ void ARGB1555ToYRow_NEON(const uint8_t* src_argb1555,
2605
+ uint8_t* dst_y,
2606
+ int width) {
2607
+ asm volatile(
2608
+ "vmov.u8 d24, #25 \n" // B * 0.1016 coefficient
2609
+ "vmov.u8 d25, #129 \n" // G * 0.5078 coefficient
2610
+ "vmov.u8 d26, #66 \n" // R * 0.2578 coefficient
2611
+ "vmov.u8 d27, #16 \n" // Add 16 constant
2612
+ "1: \n"
2613
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB1555 pixels.
2614
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2615
+ ARGB1555TOARGB
2616
+ "vmull.u8 q2, d0, d24 \n" // B
2617
+ "vmlal.u8 q2, d1, d25 \n" // G
2618
+ "vmlal.u8 q2, d2, d26 \n" // R
2619
+ "vqrshrn.u16 d0, q2, #8 \n" // 16 bit to 8 bit Y
2620
+ "vqadd.u8 d0, d27 \n"
2621
+ "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2622
+ "bgt 1b \n"
2623
+ : "+r"(src_argb1555), // %0
2624
+ "+r"(dst_y), // %1
2625
+ "+r"(width) // %2
2626
+ :
2627
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13");
2628
+ }
2629
+
2630
+ void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444,
2631
+ uint8_t* dst_y,
2632
+ int width) {
2633
+ asm volatile(
2634
+ "vmov.u8 d24, #25 \n" // B * 0.1016 coefficient
2635
+ "vmov.u8 d25, #129 \n" // G * 0.5078 coefficient
2636
+ "vmov.u8 d26, #66 \n" // R * 0.2578 coefficient
2637
+ "vmov.u8 d27, #16 \n" // Add 16 constant
2638
+ "1: \n"
2639
+ "vld1.8 {q0}, [%0]! \n" // load 8 ARGB4444 pixels.
2640
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2641
+ ARGB4444TOARGB
2642
+ "vmull.u8 q2, d0, d24 \n" // B
2643
+ "vmlal.u8 q2, d1, d25 \n" // G
2644
+ "vmlal.u8 q2, d2, d26 \n" // R
2645
+ "vqrshrn.u16 d0, q2, #8 \n" // 16 bit to 8 bit Y
2646
+ "vqadd.u8 d0, d27 \n"
2647
+ "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y.
2648
+ "bgt 1b \n"
2649
+ : "+r"(src_argb4444), // %0
2650
+ "+r"(dst_y), // %1
2651
+ "+r"(width) // %2
2652
+ :
2653
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13");
2654
+ }
2655
+
2656
+ void ARGBToAR64Row_NEON(const uint8_t* src_argb,
2657
+ uint16_t* dst_ar64,
2658
+ int width) {
2659
+ asm volatile(
2660
+ "1: \n"
2661
+ "vld1.8 {q0}, [%0]! \n"
2662
+ "vld1.8 {q2}, [%0]! \n"
2663
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2664
+ "vmov.u8 q1, q0 \n"
2665
+ "vmov.u8 q3, q2 \n"
2666
+ "vst2.8 {q0, q1}, [%1]! \n" // store 4 pixels
2667
+ "vst2.8 {q2, q3}, [%1]! \n" // store 4 pixels
2668
+ "bgt 1b \n"
2669
+ : "+r"(src_argb), // %0
2670
+ "+r"(dst_ar64), // %1
2671
+ "+r"(width) // %2
2672
+ :
2673
+ : "cc", "memory", "q0", "q1", "q2", "q3");
2674
+ }
2675
+
2676
+ static const uvec8 kShuffleARGBToABGR = {2, 1, 0, 3, 6, 5, 4, 7,
2677
+ 10, 9, 8, 11, 14, 13, 12, 15};
2678
+
2679
+ void ARGBToAB64Row_NEON(const uint8_t* src_argb,
2680
+ uint16_t* dst_ab64,
2681
+ int width) {
2682
+ asm volatile(
2683
+ "vld1.8 {q4}, [%3] \n" // shuffler
2684
+
2685
+ "1: \n"
2686
+ "vld1.8 {q0}, [%0]! \n"
2687
+ "vld1.8 {q2}, [%0]! \n"
2688
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2689
+ "vtbl.8 d2, {d0, d1}, d8 \n"
2690
+ "vtbl.8 d3, {d0, d1}, d9 \n"
2691
+ "vtbl.8 d6, {d4, d5}, d8 \n"
2692
+ "vtbl.8 d7, {d4, d5}, d9 \n"
2693
+ "vmov.u8 q0, q1 \n"
2694
+ "vmov.u8 q2, q3 \n"
2695
+ "vst2.8 {q0, q1}, [%1]! \n" // store 4 pixels
2696
+ "vst2.8 {q2, q3}, [%1]! \n" // store 4 pixels
2697
+ "bgt 1b \n"
2698
+ : "+r"(src_argb), // %0
2699
+ "+r"(dst_ab64), // %1
2700
+ "+r"(width) // %2
2701
+ : "r"(&kShuffleARGBToABGR) // %3
2702
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4");
2703
+ }
2704
+
2705
+ void AR64ToARGBRow_NEON(const uint16_t* src_ar64,
2706
+ uint8_t* dst_argb,
2707
+ int width) {
2708
+ asm volatile(
2709
+ "1: \n"
2710
+ "vld1.16 {q0}, [%0]! \n"
2711
+ "vld1.16 {q1}, [%0]! \n"
2712
+ "vld1.16 {q2}, [%0]! \n"
2713
+ "vld1.16 {q3}, [%0]! \n"
2714
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2715
+ "vshrn.u16 d0, q0, #8 \n"
2716
+ "vshrn.u16 d1, q1, #8 \n"
2717
+ "vshrn.u16 d4, q2, #8 \n"
2718
+ "vshrn.u16 d5, q3, #8 \n"
2719
+ "vst1.8 {q0}, [%1]! \n" // store 4 pixels
2720
+ "vst1.8 {q2}, [%1]! \n" // store 4 pixels
2721
+ "bgt 1b \n"
2722
+ : "+r"(src_ar64), // %0
2723
+ "+r"(dst_argb), // %1
2724
+ "+r"(width) // %2
2725
+ :
2726
+ : "cc", "memory", "q0", "q1", "q2", "q3");
2727
+ }
2728
+
2729
+ static const uvec8 kShuffleAB64ToARGB = {5, 3, 1, 7, 13, 11, 9, 15};
2730
+
2731
+ void AB64ToARGBRow_NEON(const uint16_t* src_ab64,
2732
+ uint8_t* dst_argb,
2733
+ int width) {
2734
+ asm volatile(
2735
+ "vld1.8 {d8}, [%3] \n" // shuffler
2736
+
2737
+ "1: \n"
2738
+ "vld1.16 {q0}, [%0]! \n"
2739
+ "vld1.16 {q1}, [%0]! \n"
2740
+ "vld1.16 {q2}, [%0]! \n"
2741
+ "vld1.16 {q3}, [%0]! \n"
2742
+ "subs %2, %2, #8 \n" // 8 processed per loop.
2743
+ "vtbl.8 d0, {d0, d1}, d8 \n"
2744
+ "vtbl.8 d1, {d2, d3}, d8 \n"
2745
+ "vtbl.8 d4, {d4, d5}, d8 \n"
2746
+ "vtbl.8 d5, {d6, d7}, d8 \n"
2747
+ "vst1.8 {q0}, [%1]! \n" // store 4 pixels
2748
+ "vst1.8 {q2}, [%1]! \n" // store 4 pixels
2749
+ "bgt 1b \n"
2750
+ : "+r"(src_ab64), // %0
2751
+ "+r"(dst_argb), // %1
2752
+ "+r"(width) // %2
2753
+ : "r"(&kShuffleAB64ToARGB) // %3
2754
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4");
2755
+ }
2756
+
2757
+ struct RgbConstants {
2758
+ uint8_t kRGBToY[4];
2759
+ uint16_t kAddY;
2760
+ };
2761
+
2762
+ // RGB to JPeg coefficients
2763
+ // B * 0.1140 coefficient = 29
2764
+ // G * 0.5870 coefficient = 150
2765
+ // R * 0.2990 coefficient = 77
2766
+ // Add 0.5
2767
+ static const struct RgbConstants kRgb24JPEGConstants = {{29, 150, 77, 0},
2768
+ 0x0080};
2769
+
2770
+ static const struct RgbConstants kRawJPEGConstants = {{77, 150, 29, 0}, 0x0080};
2771
+
2772
+ // RGB to BT.601 coefficients
2773
+ // B * 0.1016 coefficient = 25
2774
+ // G * 0.5078 coefficient = 129
2775
+ // R * 0.2578 coefficient = 66
2776
+ // Add 16.5 = 0x1080
2777
+
2778
+ static const struct RgbConstants kRgb24I601Constants = {{25, 129, 66, 0},
2779
+ 0x1080};
2780
+
2781
+ static const struct RgbConstants kRawI601Constants = {{66, 129, 25, 0}, 0x1080};
2782
+
2783
+ // ARGB expects first 3 values to contain RGB and 4th value is ignored.
2784
+ static void ARGBToYMatrixRow_NEON(const uint8_t* src_argb,
2785
+ uint8_t* dst_y,
2786
+ int width,
2787
+ const struct RgbConstants* rgbconstants) {
2788
+ asm volatile(
2789
+ "vld1.8 {d0}, [%3] \n" // load rgbconstants
2790
+ "vdup.u8 d20, d0[0] \n"
2791
+ "vdup.u8 d21, d0[1] \n"
2792
+ "vdup.u8 d22, d0[2] \n"
2793
+ "vdup.u16 q12, d0[2] \n"
2794
+ "1: \n"
2795
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 16 pixels of ARGB
2796
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n"
2797
+ "subs %2, %2, #16 \n" // 16 processed per loop.
2798
+ "vmull.u8 q8, d0, d20 \n" // B
2799
+ "vmull.u8 q9, d1, d20 \n"
2800
+ "vmlal.u8 q8, d2, d21 \n" // G
2801
+ "vmlal.u8 q9, d3, d21 \n"
2802
+ "vmlal.u8 q8, d4, d22 \n" // R
2803
+ "vmlal.u8 q9, d5, d22 \n"
2804
+ "vaddhn.u16 d0, q8, q12 \n" // 16 bit to 8 bit Y
2805
+ "vaddhn.u16 d1, q9, q12 \n"
2806
+ "vst1.8 {d0, d1}, [%1]! \n" // store 16 pixels Y.
2807
+ "bgt 1b \n"
2808
+ : "+r"(src_argb), // %0
2809
+ "+r"(dst_y), // %1
2810
+ "+r"(width) // %2
2811
+ : "r"(rgbconstants) // %3
2812
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "d20", "d21", "d22",
2813
+ "q12");
2814
+ }
2815
+
2816
+ void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) {
2817
+ ARGBToYMatrixRow_NEON(src_argb, dst_y, width, &kRgb24I601Constants);
2818
+ }
2819
+
2820
+ void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
2821
+ ARGBToYMatrixRow_NEON(src_argb, dst_yj, width, &kRgb24JPEGConstants);
2822
+ }
2823
+
2824
+ void ABGRToYRow_NEON(const uint8_t* src_abgr, uint8_t* dst_y, int width) {
2825
+ ARGBToYMatrixRow_NEON(src_abgr, dst_y, width, &kRawI601Constants);
2826
+ }
2827
+
2828
+ void ABGRToYJRow_NEON(const uint8_t* src_abgr, uint8_t* dst_yj, int width) {
2829
+ ARGBToYMatrixRow_NEON(src_abgr, dst_yj, width, &kRawJPEGConstants);
2830
+ }
2831
+
2832
+ // RGBA expects first value to be A and ignored, then 3 values to contain RGB.
2833
+ // Same code as ARGB, except the LD4
2834
+ static void RGBAToYMatrixRow_NEON(const uint8_t* src_rgba,
2835
+ uint8_t* dst_y,
2836
+ int width,
2837
+ const struct RgbConstants* rgbconstants) {
2838
+ asm volatile(
2839
+ "vld1.8 {d0}, [%3] \n" // load rgbconstants
2840
+ "vdup.u8 d20, d0[0] \n"
2841
+ "vdup.u8 d21, d0[1] \n"
2842
+ "vdup.u8 d22, d0[2] \n"
2843
+ "vdup.u16 q12, d0[2] \n"
2844
+ "1: \n"
2845
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 16 pixels of RGBA
2846
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n"
2847
+ "subs %2, %2, #16 \n" // 16 processed per loop.
2848
+ "vmull.u8 q8, d2, d20 \n" // B
2849
+ "vmull.u8 q9, d3, d20 \n"
2850
+ "vmlal.u8 q8, d4, d21 \n" // G
2851
+ "vmlal.u8 q9, d5, d21 \n"
2852
+ "vmlal.u8 q8, d6, d22 \n" // R
2853
+ "vmlal.u8 q9, d7, d22 \n"
2854
+ "vaddhn.u16 d0, q8, q12 \n" // 16 bit to 8 bit Y
2855
+ "vaddhn.u16 d1, q9, q12 \n"
2856
+ "vst1.8 {d0, d1}, [%1]! \n" // store 16 pixels Y.
2857
+ "bgt 1b \n"
2858
+ : "+r"(src_rgba), // %0
2859
+ "+r"(dst_y), // %1
2860
+ "+r"(width) // %2
2861
+ : "r"(rgbconstants) // %3
2862
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "d20", "d21", "d22",
2863
+ "q12");
2864
+ }
2865
+
2866
+ void RGBAToYRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width) {
2867
+ RGBAToYMatrixRow_NEON(src_rgba, dst_y, width, &kRgb24I601Constants);
2868
+ }
2869
+
2870
+ void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_yj, int width) {
2871
+ RGBAToYMatrixRow_NEON(src_rgba, dst_yj, width, &kRgb24JPEGConstants);
2872
+ }
2873
+
2874
+ void BGRAToYRow_NEON(const uint8_t* src_bgra, uint8_t* dst_y, int width) {
2875
+ RGBAToYMatrixRow_NEON(src_bgra, dst_y, width, &kRawI601Constants);
2876
+ }
2877
+
2878
+ static void RGBToYMatrixRow_NEON(const uint8_t* src_rgb,
2879
+ uint8_t* dst_y,
2880
+ int width,
2881
+ const struct RgbConstants* rgbconstants) {
2882
+ asm volatile(
2883
+ "vld1.8 {d0}, [%3] \n" // load rgbconstants
2884
+ "vdup.u8 d20, d0[0] \n"
2885
+ "vdup.u8 d21, d0[1] \n"
2886
+ "vdup.u8 d22, d0[2] \n"
2887
+ "vdup.u16 q12, d0[2] \n"
2888
+ "1: \n"
2889
+ "vld3.8 {d2, d4, d6}, [%0]! \n" // load 16 pixels of
2890
+ // RGB24.
2891
+ "vld3.8 {d3, d5, d7}, [%0]! \n"
2892
+ "subs %2, %2, #16 \n" // 16 processed per loop.
2893
+ "vmull.u8 q8, d2, d20 \n" // B
2894
+ "vmull.u8 q9, d3, d20 \n"
2895
+ "vmlal.u8 q8, d4, d21 \n" // G
2896
+ "vmlal.u8 q9, d5, d21 \n"
2897
+ "vmlal.u8 q8, d6, d22 \n" // R
2898
+ "vmlal.u8 q9, d7, d22 \n"
2899
+ "vaddhn.u16 d0, q8, q12 \n" // 16 bit to 8 bit Y
2900
+ "vaddhn.u16 d1, q9, q12 \n"
2901
+ "vst1.8 {d0, d1}, [%1]! \n" // store 16 pixels Y.
2902
+ "bgt 1b \n"
2903
+ : "+r"(src_rgb), // %0
2904
+ "+r"(dst_y), // %1
2905
+ "+r"(width) // %2
2906
+ : "r"(rgbconstants) // %3
2907
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "d20", "d21", "d22",
2908
+ "q12");
2909
+ }
2910
+
2911
+ void RGB24ToYJRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_yj, int width) {
2912
+ RGBToYMatrixRow_NEON(src_rgb24, dst_yj, width, &kRgb24JPEGConstants);
2913
+ }
2914
+
2915
+ void RAWToYJRow_NEON(const uint8_t* src_raw, uint8_t* dst_yj, int width) {
2916
+ RGBToYMatrixRow_NEON(src_raw, dst_yj, width, &kRawJPEGConstants);
2917
+ }
2918
+
2919
+ void RGB24ToYRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_y, int width) {
2920
+ RGBToYMatrixRow_NEON(src_rgb24, dst_y, width, &kRgb24I601Constants);
2921
+ }
2922
+
2923
+ void RAWToYRow_NEON(const uint8_t* src_raw, uint8_t* dst_y, int width) {
2924
+ RGBToYMatrixRow_NEON(src_raw, dst_y, width, &kRawI601Constants);
2925
+ }
2926
+
2927
+ // Bilinear filter 16x2 -> 16x1
2928
+ void InterpolateRow_NEON(uint8_t* dst_ptr,
2929
+ const uint8_t* src_ptr,
2930
+ ptrdiff_t src_stride,
2931
+ int dst_width,
2932
+ int source_y_fraction) {
2933
+ int y1_fraction = source_y_fraction;
2934
+ asm volatile(
2935
+ "cmp %4, #0 \n"
2936
+ "beq 100f \n"
2937
+ "add %2, %1 \n"
2938
+ "cmp %4, #128 \n"
2939
+ "beq 50f \n"
2940
+
2941
+ "vdup.8 d5, %4 \n"
2942
+ "rsb %4, #256 \n"
2943
+ "vdup.8 d4, %4 \n"
2944
+ // General purpose row blend.
2945
+ "1: \n"
2946
+ "vld1.8 {q0}, [%1]! \n"
2947
+ "vld1.8 {q1}, [%2]! \n"
2948
+ "subs %3, %3, #16 \n"
2949
+ "vmull.u8 q13, d0, d4 \n"
2950
+ "vmull.u8 q14, d1, d4 \n"
2951
+ "vmlal.u8 q13, d2, d5 \n"
2952
+ "vmlal.u8 q14, d3, d5 \n"
2953
+ "vrshrn.u16 d0, q13, #8 \n"
2954
+ "vrshrn.u16 d1, q14, #8 \n"
2955
+ "vst1.8 {q0}, [%0]! \n"
2956
+ "bgt 1b \n"
2957
+ "b 99f \n"
2958
+
2959
+ // Blend 50 / 50.
2960
+ "50: \n"
2961
+ "vld1.8 {q0}, [%1]! \n"
2962
+ "vld1.8 {q1}, [%2]! \n"
2963
+ "subs %3, %3, #16 \n"
2964
+ "vrhadd.u8 q0, q1 \n"
2965
+ "vst1.8 {q0}, [%0]! \n"
2966
+ "bgt 50b \n"
2967
+ "b 99f \n"
2968
+
2969
+ // Blend 100 / 0 - Copy row unchanged.
2970
+ "100: \n"
2971
+ "vld1.8 {q0}, [%1]! \n"
2972
+ "subs %3, %3, #16 \n"
2973
+ "vst1.8 {q0}, [%0]! \n"
2974
+ "bgt 100b \n"
2975
+
2976
+ "99: \n"
2977
+ : "+r"(dst_ptr), // %0
2978
+ "+r"(src_ptr), // %1
2979
+ "+r"(src_stride), // %2
2980
+ "+r"(dst_width), // %3
2981
+ "+r"(y1_fraction) // %4
2982
+ :
2983
+ : "cc", "memory", "q0", "q1", "d4", "d5", "q13", "q14");
2984
+ }
2985
+
2986
+ // Bilinear filter 8x2 -> 8x1
2987
+ void InterpolateRow_16_NEON(uint16_t* dst_ptr,
2988
+ const uint16_t* src_ptr,
2989
+ ptrdiff_t src_stride,
2990
+ int dst_width,
2991
+ int source_y_fraction) {
2992
+ int y1_fraction = source_y_fraction;
2993
+ int y0_fraction = 256 - y1_fraction;
2994
+ const uint16_t* src_ptr1 = src_ptr + src_stride;
2995
+
2996
+ asm volatile(
2997
+ "cmp %4, #0 \n"
2998
+ "beq 100f \n"
2999
+ "cmp %4, #128 \n"
3000
+ "beq 50f \n"
3001
+
3002
+ "vdup.16 d17, %4 \n"
3003
+ "vdup.16 d16, %5 \n"
3004
+ // General purpose row blend.
3005
+ "1: \n"
3006
+ "vld1.16 {q0}, [%1]! \n"
3007
+ "vld1.16 {q1}, [%2]! \n"
3008
+ "subs %3, %3, #8 \n"
3009
+ "vmull.u16 q2, d0, d16 \n"
3010
+ "vmull.u16 q3, d1, d16 \n"
3011
+ "vmlal.u16 q2, d2, d17 \n"
3012
+ "vmlal.u16 q3, d3, d17 \n"
3013
+ "vrshrn.u32 d0, q2, #8 \n"
3014
+ "vrshrn.u32 d1, q3, #8 \n"
3015
+ "vst1.16 {q0}, [%0]! \n"
3016
+ "bgt 1b \n"
3017
+ "b 99f \n"
3018
+
3019
+ // Blend 50 / 50.
3020
+ "50: \n"
3021
+ "vld1.16 {q0}, [%1]! \n"
3022
+ "vld1.16 {q1}, [%2]! \n"
3023
+ "subs %3, %3, #8 \n"
3024
+ "vrhadd.u16 q0, q1 \n"
3025
+ "vst1.16 {q0}, [%0]! \n"
3026
+ "bgt 50b \n"
3027
+ "b 99f \n"
3028
+
3029
+ // Blend 100 / 0 - Copy row unchanged.
3030
+ "100: \n"
3031
+ "vld1.16 {q0}, [%1]! \n"
3032
+ "subs %3, %3, #8 \n"
3033
+ "vst1.16 {q0}, [%0]! \n"
3034
+ "bgt 100b \n"
3035
+
3036
+ "99: \n"
3037
+ : "+r"(dst_ptr), // %0
3038
+ "+r"(src_ptr), // %1
3039
+ "+r"(src_ptr1), // %2
3040
+ "+r"(dst_width) // %3
3041
+ : "r"(y1_fraction), // %4
3042
+ "r"(y0_fraction) // %5
3043
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8");
3044
+ }
3045
+
3046
+ // dr * (256 - sa) / 256 + sr = dr - dr * sa / 256 + sr
3047
+ void ARGBBlendRow_NEON(const uint8_t* src_argb,
3048
+ const uint8_t* src_argb1,
3049
+ uint8_t* dst_argb,
3050
+ int width) {
3051
+ asm volatile(
3052
+ "subs %3, #8 \n"
3053
+ "blt 89f \n"
3054
+ // Blend 8 pixels.
3055
+ "8: \n"
3056
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ARGB0.
3057
+ "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 pixels of ARGB1.
3058
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3059
+ "vmull.u8 q10, d4, d3 \n" // db * a
3060
+ "vmull.u8 q11, d5, d3 \n" // dg * a
3061
+ "vmull.u8 q12, d6, d3 \n" // dr * a
3062
+ "vqrshrn.u16 d20, q10, #8 \n" // db >>= 8
3063
+ "vqrshrn.u16 d21, q11, #8 \n" // dg >>= 8
3064
+ "vqrshrn.u16 d22, q12, #8 \n" // dr >>= 8
3065
+ "vqsub.u8 q2, q2, q10 \n" // dbg - dbg * a / 256
3066
+ "vqsub.u8 d6, d6, d22 \n" // dr - dr * a / 256
3067
+ "vqadd.u8 q0, q0, q2 \n" // + sbg
3068
+ "vqadd.u8 d2, d2, d6 \n" // + sr
3069
+ "vmov.u8 d3, #255 \n" // a = 255
3070
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 pixels of ARGB.
3071
+ "bge 8b \n"
3072
+
3073
+ "89: \n"
3074
+ "adds %3, #8-1 \n"
3075
+ "blt 99f \n"
3076
+
3077
+ // Blend 1 pixels.
3078
+ "1: \n"
3079
+ "vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [%0]! \n" // load 1 pixel ARGB0.
3080
+ "vld4.8 {d4[0],d5[0],d6[0],d7[0]}, [%1]! \n" // load 1 pixel ARGB1.
3081
+ "subs %3, %3, #1 \n" // 1 processed per loop.
3082
+ "vmull.u8 q10, d4, d3 \n" // db * a
3083
+ "vmull.u8 q11, d5, d3 \n" // dg * a
3084
+ "vmull.u8 q12, d6, d3 \n" // dr * a
3085
+ "vqrshrn.u16 d20, q10, #8 \n" // db >>= 8
3086
+ "vqrshrn.u16 d21, q11, #8 \n" // dg >>= 8
3087
+ "vqrshrn.u16 d22, q12, #8 \n" // dr >>= 8
3088
+ "vqsub.u8 q2, q2, q10 \n" // dbg - dbg * a / 256
3089
+ "vqsub.u8 d6, d6, d22 \n" // dr - dr * a / 256
3090
+ "vqadd.u8 q0, q0, q2 \n" // + sbg
3091
+ "vqadd.u8 d2, d2, d6 \n" // + sr
3092
+ "vmov.u8 d3, #255 \n" // a = 255
3093
+ "vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [%2]! \n" // store 1 pixel.
3094
+ "bge 1b \n"
3095
+
3096
+ "99: \n"
3097
+
3098
+ : "+r"(src_argb), // %0
3099
+ "+r"(src_argb1), // %1
3100
+ "+r"(dst_argb), // %2
3101
+ "+r"(width) // %3
3102
+ :
3103
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q10", "q11", "q12");
3104
+ }
3105
+
3106
+ // Attenuate 8 pixels at a time.
3107
+ void ARGBAttenuateRow_NEON(const uint8_t* src_argb,
3108
+ uint8_t* dst_argb,
3109
+ int width) {
3110
+ asm volatile(
3111
+ "vmov.u16 q15, #0x00ff \n" // 255 for rounding up
3112
+
3113
+ // Attenuate 8 pixels.
3114
+ "1: \n"
3115
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ARGB.
3116
+ "subs %2, %2, #8 \n" // 8 processed per loop.
3117
+ "vmull.u8 q10, d0, d3 \n" // b * a
3118
+ "vmull.u8 q11, d1, d3 \n" // g * a
3119
+ "vmull.u8 q12, d2, d3 \n" // r * a
3120
+ "vaddhn.u16 d0, q10, q15 \n" // (b + 255) >> 8
3121
+ "vaddhn.u16 d1, q11, q15 \n" // (g + 255) >> 8
3122
+ "vaddhn.u16 d2, q12, q15 \n" // (r + 255) >> 8
3123
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB.
3124
+ "bgt 1b \n"
3125
+ : "+r"(src_argb), // %0
3126
+ "+r"(dst_argb), // %1
3127
+ "+r"(width) // %2
3128
+ :
3129
+ : "cc", "memory", "q0", "q1", "q10", "q11", "q12", "q15");
3130
+ }
3131
+
3132
+ // Quantize 8 ARGB pixels (32 bytes).
3133
+ // dst = (dst * scale >> 16) * interval_size + interval_offset;
3134
+ void ARGBQuantizeRow_NEON(uint8_t* dst_argb,
3135
+ int scale,
3136
+ int interval_size,
3137
+ int interval_offset,
3138
+ int width) {
3139
+ asm volatile(
3140
+ "vdup.u16 q8, %2 \n"
3141
+ "vshr.u16 q8, q8, #1 \n" // scale >>= 1
3142
+ "vdup.u16 q9, %3 \n" // interval multiply.
3143
+ "vdup.u16 q10, %4 \n" // interval add
3144
+
3145
+ // 8 pixel loop.
3146
+ "1: \n"
3147
+ "vld4.8 {d0, d2, d4, d6}, [%0] \n" // load 8 pixels of ARGB.
3148
+ "subs %1, %1, #8 \n" // 8 processed per loop.
3149
+ "vmovl.u8 q0, d0 \n" // b (0 .. 255)
3150
+ "vmovl.u8 q1, d2 \n"
3151
+ "vmovl.u8 q2, d4 \n"
3152
+ "vqdmulh.s16 q0, q0, q8 \n" // b * scale
3153
+ "vqdmulh.s16 q1, q1, q8 \n" // g
3154
+ "vqdmulh.s16 q2, q2, q8 \n" // r
3155
+ "vmul.u16 q0, q0, q9 \n" // b * interval_size
3156
+ "vmul.u16 q1, q1, q9 \n" // g
3157
+ "vmul.u16 q2, q2, q9 \n" // r
3158
+ "vadd.u16 q0, q0, q10 \n" // b + interval_offset
3159
+ "vadd.u16 q1, q1, q10 \n" // g
3160
+ "vadd.u16 q2, q2, q10 \n" // r
3161
+ "vqmovn.u16 d0, q0 \n"
3162
+ "vqmovn.u16 d2, q1 \n"
3163
+ "vqmovn.u16 d4, q2 \n"
3164
+ "vst4.8 {d0, d2, d4, d6}, [%0]! \n" // store 8 pixels of ARGB.
3165
+ "bgt 1b \n"
3166
+ : "+r"(dst_argb), // %0
3167
+ "+r"(width) // %1
3168
+ : "r"(scale), // %2
3169
+ "r"(interval_size), // %3
3170
+ "r"(interval_offset) // %4
3171
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10");
3172
+ }
3173
+
3174
+ // Shade 8 pixels at a time by specified value.
3175
+ // NOTE vqrdmulh.s16 q10, q10, d0[0] must use a scaler register from 0 to 8.
3176
+ // Rounding in vqrdmulh does +1 to high if high bit of low s16 is set.
3177
+ void ARGBShadeRow_NEON(const uint8_t* src_argb,
3178
+ uint8_t* dst_argb,
3179
+ int width,
3180
+ uint32_t value) {
3181
+ asm volatile(
3182
+ "vdup.u32 q0, %3 \n" // duplicate scale value.
3183
+ "vzip.u8 d0, d1 \n" // d0 aarrggbb.
3184
+ "vshr.u16 q0, q0, #1 \n" // scale / 2.
3185
+
3186
+ // 8 pixel loop.
3187
+ "1: \n"
3188
+ "vld4.8 {d20, d22, d24, d26}, [%0]! \n" // load 8 pixels of ARGB.
3189
+ "subs %2, %2, #8 \n" // 8 processed per loop.
3190
+ "vmovl.u8 q10, d20 \n" // b (0 .. 255)
3191
+ "vmovl.u8 q11, d22 \n"
3192
+ "vmovl.u8 q12, d24 \n"
3193
+ "vmovl.u8 q13, d26 \n"
3194
+ "vqrdmulh.s16 q10, q10, d0[0] \n" // b * scale * 2
3195
+ "vqrdmulh.s16 q11, q11, d0[1] \n" // g
3196
+ "vqrdmulh.s16 q12, q12, d0[2] \n" // r
3197
+ "vqrdmulh.s16 q13, q13, d0[3] \n" // a
3198
+ "vqmovn.u16 d20, q10 \n"
3199
+ "vqmovn.u16 d22, q11 \n"
3200
+ "vqmovn.u16 d24, q12 \n"
3201
+ "vqmovn.u16 d26, q13 \n"
3202
+ "vst4.8 {d20, d22, d24, d26}, [%1]! \n" // store 8 pixels of ARGB.
3203
+ "bgt 1b \n"
3204
+ : "+r"(src_argb), // %0
3205
+ "+r"(dst_argb), // %1
3206
+ "+r"(width) // %2
3207
+ : "r"(value) // %3
3208
+ : "cc", "memory", "q0", "q10", "q11", "q12", "q13");
3209
+ }
3210
+
3211
+ // Convert 8 ARGB pixels (64 bytes) to 8 Gray ARGB pixels
3212
+ // Similar to ARGBToYJ but stores ARGB.
3213
+ // C code is (29 * b + 150 * g + 77 * r + 128) >> 8;
3214
+ void ARGBGrayRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width) {
3215
+ asm volatile(
3216
+ "vmov.u8 d24, #29 \n" // B * 0.1140 coefficient
3217
+ "vmov.u8 d25, #150 \n" // G * 0.5870 coefficient
3218
+ "vmov.u8 d26, #77 \n" // R * 0.2990 coefficient
3219
+ "1: \n"
3220
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
3221
+ "subs %2, %2, #8 \n" // 8 processed per loop.
3222
+ "vmull.u8 q2, d0, d24 \n" // B
3223
+ "vmlal.u8 q2, d1, d25 \n" // G
3224
+ "vmlal.u8 q2, d2, d26 \n" // R
3225
+ "vqrshrn.u16 d0, q2, #8 \n" // 16 bit to 8 bit B
3226
+ "vmov d1, d0 \n" // G
3227
+ "vmov d2, d0 \n" // R
3228
+ "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 ARGB pixels.
3229
+ "bgt 1b \n"
3230
+ : "+r"(src_argb), // %0
3231
+ "+r"(dst_argb), // %1
3232
+ "+r"(width) // %2
3233
+ :
3234
+ : "cc", "memory", "q0", "q1", "q2", "q12", "q13");
3235
+ }
3236
+
3237
+ // Convert 8 ARGB pixels (32 bytes) to 8 Sepia ARGB pixels.
3238
+ // b = (r * 35 + g * 68 + b * 17) >> 7
3239
+ // g = (r * 45 + g * 88 + b * 22) >> 7
3240
+ // r = (r * 50 + g * 98 + b * 24) >> 7
3241
+ void ARGBSepiaRow_NEON(uint8_t* dst_argb, int width) {
3242
+ asm volatile(
3243
+ "vmov.u8 d20, #17 \n" // BB coefficient
3244
+ "vmov.u8 d21, #68 \n" // BG coefficient
3245
+ "vmov.u8 d22, #35 \n" // BR coefficient
3246
+ "vmov.u8 d24, #22 \n" // GB coefficient
3247
+ "vmov.u8 d25, #88 \n" // GG coefficient
3248
+ "vmov.u8 d26, #45 \n" // GR coefficient
3249
+ "vmov.u8 d28, #24 \n" // BB coefficient
3250
+ "vmov.u8 d29, #98 \n" // BG coefficient
3251
+ "vmov.u8 d30, #50 \n" // BR coefficient
3252
+ "1: \n"
3253
+ "vld4.8 {d0, d1, d2, d3}, [%0] \n" // load 8 ARGB pixels.
3254
+ "subs %1, %1, #8 \n" // 8 processed per loop.
3255
+ "vmull.u8 q2, d0, d20 \n" // B to Sepia B
3256
+ "vmlal.u8 q2, d1, d21 \n" // G
3257
+ "vmlal.u8 q2, d2, d22 \n" // R
3258
+ "vmull.u8 q3, d0, d24 \n" // B to Sepia G
3259
+ "vmlal.u8 q3, d1, d25 \n" // G
3260
+ "vmlal.u8 q3, d2, d26 \n" // R
3261
+ "vmull.u8 q8, d0, d28 \n" // B to Sepia R
3262
+ "vmlal.u8 q8, d1, d29 \n" // G
3263
+ "vmlal.u8 q8, d2, d30 \n" // R
3264
+ "vqshrn.u16 d0, q2, #7 \n" // 16 bit to 8 bit B
3265
+ "vqshrn.u16 d1, q3, #7 \n" // 16 bit to 8 bit G
3266
+ "vqshrn.u16 d2, q8, #7 \n" // 16 bit to 8 bit R
3267
+ "vst4.8 {d0, d1, d2, d3}, [%0]! \n" // store 8 ARGB pixels.
3268
+ "bgt 1b \n"
3269
+ : "+r"(dst_argb), // %0
3270
+ "+r"(width) // %1
3271
+ :
3272
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q10", "q11", "q12", "q13",
3273
+ "q14", "q15");
3274
+ }
3275
+
3276
+ // Tranform 8 ARGB pixels (32 bytes) with color matrix.
3277
+ // TODO(fbarchard): Was same as Sepia except matrix is provided. This function
3278
+ // needs to saturate. Consider doing a non-saturating version.
3279
+ void ARGBColorMatrixRow_NEON(const uint8_t* src_argb,
3280
+ uint8_t* dst_argb,
3281
+ const int8_t* matrix_argb,
3282
+ int width) {
3283
+ asm volatile(
3284
+ "vld1.8 {q2}, [%3] \n" // load 3 ARGB vectors.
3285
+ "vmovl.s8 q0, d4 \n" // B,G coefficients s16.
3286
+ "vmovl.s8 q1, d5 \n" // R,A coefficients s16.
3287
+
3288
+ "1: \n"
3289
+ "vld4.8 {d16, d18, d20, d22}, [%0]! \n" // load 8 ARGB pixels.
3290
+ "subs %2, %2, #8 \n" // 8 processed per loop.
3291
+ "vmovl.u8 q8, d16 \n" // b (0 .. 255) 16 bit
3292
+ "vmovl.u8 q9, d18 \n" // g
3293
+ "vmovl.u8 q10, d20 \n" // r
3294
+ "vmovl.u8 q11, d22 \n" // a
3295
+ "vmul.s16 q12, q8, d0[0] \n" // B = B * Matrix B
3296
+ "vmul.s16 q13, q8, d1[0] \n" // G = B * Matrix G
3297
+ "vmul.s16 q14, q8, d2[0] \n" // R = B * Matrix R
3298
+ "vmul.s16 q15, q8, d3[0] \n" // A = B * Matrix A
3299
+ "vmul.s16 q4, q9, d0[1] \n" // B += G * Matrix B
3300
+ "vmul.s16 q5, q9, d1[1] \n" // G += G * Matrix G
3301
+ "vmul.s16 q6, q9, d2[1] \n" // R += G * Matrix R
3302
+ "vmul.s16 q7, q9, d3[1] \n" // A += G * Matrix A
3303
+ "vqadd.s16 q12, q12, q4 \n" // Accumulate B
3304
+ "vqadd.s16 q13, q13, q5 \n" // Accumulate G
3305
+ "vqadd.s16 q14, q14, q6 \n" // Accumulate R
3306
+ "vqadd.s16 q15, q15, q7 \n" // Accumulate A
3307
+ "vmul.s16 q4, q10, d0[2] \n" // B += R * Matrix B
3308
+ "vmul.s16 q5, q10, d1[2] \n" // G += R * Matrix G
3309
+ "vmul.s16 q6, q10, d2[2] \n" // R += R * Matrix R
3310
+ "vmul.s16 q7, q10, d3[2] \n" // A += R * Matrix A
3311
+ "vqadd.s16 q12, q12, q4 \n" // Accumulate B
3312
+ "vqadd.s16 q13, q13, q5 \n" // Accumulate G
3313
+ "vqadd.s16 q14, q14, q6 \n" // Accumulate R
3314
+ "vqadd.s16 q15, q15, q7 \n" // Accumulate A
3315
+ "vmul.s16 q4, q11, d0[3] \n" // B += A * Matrix B
3316
+ "vmul.s16 q5, q11, d1[3] \n" // G += A * Matrix G
3317
+ "vmul.s16 q6, q11, d2[3] \n" // R += A * Matrix R
3318
+ "vmul.s16 q7, q11, d3[3] \n" // A += A * Matrix A
3319
+ "vqadd.s16 q12, q12, q4 \n" // Accumulate B
3320
+ "vqadd.s16 q13, q13, q5 \n" // Accumulate G
3321
+ "vqadd.s16 q14, q14, q6 \n" // Accumulate R
3322
+ "vqadd.s16 q15, q15, q7 \n" // Accumulate A
3323
+ "vqshrun.s16 d16, q12, #6 \n" // 16 bit to 8 bit B
3324
+ "vqshrun.s16 d18, q13, #6 \n" // 16 bit to 8 bit G
3325
+ "vqshrun.s16 d20, q14, #6 \n" // 16 bit to 8 bit R
3326
+ "vqshrun.s16 d22, q15, #6 \n" // 16 bit to 8 bit A
3327
+ "vst4.8 {d16, d18, d20, d22}, [%1]! \n" // store 8 ARGB pixels.
3328
+ "bgt 1b \n"
3329
+ : "+r"(src_argb), // %0
3330
+ "+r"(dst_argb), // %1
3331
+ "+r"(width) // %2
3332
+ : "r"(matrix_argb) // %3
3333
+ : "cc", "memory", "q0", "q1", "q2", "q4", "q5", "q6", "q7", "q8", "q9",
3334
+ "q10", "q11", "q12", "q13", "q14", "q15");
3335
+ }
3336
+
3337
+ // Multiply 2 rows of ARGB pixels together, 8 pixels at a time.
3338
+ void ARGBMultiplyRow_NEON(const uint8_t* src_argb,
3339
+ const uint8_t* src_argb1,
3340
+ uint8_t* dst_argb,
3341
+ int width) {
3342
+ asm volatile(
3343
+ // 8 pixel loop.
3344
+ "1: \n"
3345
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
3346
+ "vld4.8 {d1, d3, d5, d7}, [%1]! \n" // load 8 more ARGB
3347
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3348
+ "vmull.u8 q0, d0, d1 \n" // multiply B
3349
+ "vmull.u8 q1, d2, d3 \n" // multiply G
3350
+ "vmull.u8 q2, d4, d5 \n" // multiply R
3351
+ "vmull.u8 q3, d6, d7 \n" // multiply A
3352
+ "vrshrn.u16 d0, q0, #8 \n" // 16 bit to 8 bit B
3353
+ "vrshrn.u16 d1, q1, #8 \n" // 16 bit to 8 bit G
3354
+ "vrshrn.u16 d2, q2, #8 \n" // 16 bit to 8 bit R
3355
+ "vrshrn.u16 d3, q3, #8 \n" // 16 bit to 8 bit A
3356
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels.
3357
+ "bgt 1b \n"
3358
+ : "+r"(src_argb), // %0
3359
+ "+r"(src_argb1), // %1
3360
+ "+r"(dst_argb), // %2
3361
+ "+r"(width) // %3
3362
+ :
3363
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3364
+ }
3365
+
3366
+ // Add 2 rows of ARGB pixels together, 8 pixels at a time.
3367
+ void ARGBAddRow_NEON(const uint8_t* src_argb,
3368
+ const uint8_t* src_argb1,
3369
+ uint8_t* dst_argb,
3370
+ int width) {
3371
+ asm volatile(
3372
+ // 8 pixel loop.
3373
+ "1: \n"
3374
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
3375
+ "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 more ARGB
3376
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3377
+ "vqadd.u8 q0, q0, q2 \n" // add B, G
3378
+ "vqadd.u8 q1, q1, q3 \n" // add R, A
3379
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels.
3380
+ "bgt 1b \n"
3381
+ : "+r"(src_argb), // %0
3382
+ "+r"(src_argb1), // %1
3383
+ "+r"(dst_argb), // %2
3384
+ "+r"(width) // %3
3385
+ :
3386
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3387
+ }
3388
+
3389
+ // Subtract 2 rows of ARGB pixels, 8 pixels at a time.
3390
+ void ARGBSubtractRow_NEON(const uint8_t* src_argb,
3391
+ const uint8_t* src_argb1,
3392
+ uint8_t* dst_argb,
3393
+ int width) {
3394
+ asm volatile(
3395
+ // 8 pixel loop.
3396
+ "1: \n"
3397
+ "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 ARGB pixels.
3398
+ "vld4.8 {d4, d5, d6, d7}, [%1]! \n" // load 8 more ARGB
3399
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3400
+ "vqsub.u8 q0, q0, q2 \n" // subtract B, G
3401
+ "vqsub.u8 q1, q1, q3 \n" // subtract R, A
3402
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels.
3403
+ "bgt 1b \n"
3404
+ : "+r"(src_argb), // %0
3405
+ "+r"(src_argb1), // %1
3406
+ "+r"(dst_argb), // %2
3407
+ "+r"(width) // %3
3408
+ :
3409
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3410
+ }
3411
+
3412
+ // Adds Sobel X and Sobel Y and stores Sobel into ARGB.
3413
+ // A = 255
3414
+ // R = Sobel
3415
+ // G = Sobel
3416
+ // B = Sobel
3417
+ void SobelRow_NEON(const uint8_t* src_sobelx,
3418
+ const uint8_t* src_sobely,
3419
+ uint8_t* dst_argb,
3420
+ int width) {
3421
+ asm volatile(
3422
+ "vmov.u8 d3, #255 \n" // alpha
3423
+ // 8 pixel loop.
3424
+ "1: \n"
3425
+ "vld1.8 {d0}, [%0]! \n" // load 8 sobelx.
3426
+ "vld1.8 {d1}, [%1]! \n" // load 8 sobely.
3427
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3428
+ "vqadd.u8 d0, d0, d1 \n" // add
3429
+ "vmov.u8 d1, d0 \n"
3430
+ "vmov.u8 d2, d0 \n"
3431
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels.
3432
+ "bgt 1b \n"
3433
+ : "+r"(src_sobelx), // %0
3434
+ "+r"(src_sobely), // %1
3435
+ "+r"(dst_argb), // %2
3436
+ "+r"(width) // %3
3437
+ :
3438
+ : "cc", "memory", "q0", "q1");
3439
+ }
3440
+
3441
+ // Adds Sobel X and Sobel Y and stores Sobel into plane.
3442
+ void SobelToPlaneRow_NEON(const uint8_t* src_sobelx,
3443
+ const uint8_t* src_sobely,
3444
+ uint8_t* dst_y,
3445
+ int width) {
3446
+ asm volatile(
3447
+ // 16 pixel loop.
3448
+ "1: \n"
3449
+ "vld1.8 {q0}, [%0]! \n" // load 16 sobelx.
3450
+ "vld1.8 {q1}, [%1]! \n" // load 16 sobely.
3451
+ "subs %3, %3, #16 \n" // 16 processed per loop.
3452
+ "vqadd.u8 q0, q0, q1 \n" // add
3453
+ "vst1.8 {q0}, [%2]! \n" // store 16 pixels.
3454
+ "bgt 1b \n"
3455
+ : "+r"(src_sobelx), // %0
3456
+ "+r"(src_sobely), // %1
3457
+ "+r"(dst_y), // %2
3458
+ "+r"(width) // %3
3459
+ :
3460
+ : "cc", "memory", "q0", "q1");
3461
+ }
3462
+
3463
+ // Mixes Sobel X, Sobel Y and Sobel into ARGB.
3464
+ // A = 255
3465
+ // R = Sobel X
3466
+ // G = Sobel
3467
+ // B = Sobel Y
3468
+ void SobelXYRow_NEON(const uint8_t* src_sobelx,
3469
+ const uint8_t* src_sobely,
3470
+ uint8_t* dst_argb,
3471
+ int width) {
3472
+ asm volatile(
3473
+ "vmov.u8 d3, #255 \n" // alpha
3474
+ // 8 pixel loop.
3475
+ "1: \n"
3476
+ "vld1.8 {d2}, [%0]! \n" // load 8 sobelx.
3477
+ "vld1.8 {d0}, [%1]! \n" // load 8 sobely.
3478
+ "subs %3, %3, #8 \n" // 8 processed per loop.
3479
+ "vqadd.u8 d1, d0, d2 \n" // add
3480
+ "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels.
3481
+ "bgt 1b \n"
3482
+ : "+r"(src_sobelx), // %0
3483
+ "+r"(src_sobely), // %1
3484
+ "+r"(dst_argb), // %2
3485
+ "+r"(width) // %3
3486
+ :
3487
+ : "cc", "memory", "q0", "q1");
3488
+ }
3489
+
3490
+ // SobelX as a matrix is
3491
+ // -1 0 1
3492
+ // -2 0 2
3493
+ // -1 0 1
3494
+ void SobelXRow_NEON(const uint8_t* src_y0,
3495
+ const uint8_t* src_y1,
3496
+ const uint8_t* src_y2,
3497
+ uint8_t* dst_sobelx,
3498
+ int width) {
3499
+ asm volatile(
3500
+ "1: \n"
3501
+ "vld1.8 {d0}, [%0],%5 \n" // top
3502
+ "vld1.8 {d1}, [%0],%6 \n"
3503
+ "subs %4, %4, #8 \n" // 8 pixels
3504
+ "vsubl.u8 q0, d0, d1 \n"
3505
+ "vld1.8 {d2}, [%1],%5 \n" // center * 2
3506
+ "vld1.8 {d3}, [%1],%6 \n"
3507
+ "vsubl.u8 q1, d2, d3 \n"
3508
+ "vadd.s16 q0, q0, q1 \n"
3509
+ "vadd.s16 q0, q0, q1 \n"
3510
+ "vld1.8 {d2}, [%2],%5 \n" // bottom
3511
+ "vld1.8 {d3}, [%2],%6 \n"
3512
+ "vsubl.u8 q1, d2, d3 \n"
3513
+ "vadd.s16 q0, q0, q1 \n"
3514
+ "vabs.s16 q0, q0 \n"
3515
+ "vqmovn.u16 d0, q0 \n"
3516
+ "vst1.8 {d0}, [%3]! \n" // store 8 sobelx
3517
+ "bgt 1b \n"
3518
+ : "+r"(src_y0), // %0
3519
+ "+r"(src_y1), // %1
3520
+ "+r"(src_y2), // %2
3521
+ "+r"(dst_sobelx), // %3
3522
+ "+r"(width) // %4
3523
+ : "r"(2), // %5
3524
+ "r"(6) // %6
3525
+ : "cc", "memory", "q0", "q1" // Clobber List
3526
+ );
3527
+ }
3528
+
3529
+ // SobelY as a matrix is
3530
+ // -1 -2 -1
3531
+ // 0 0 0
3532
+ // 1 2 1
3533
+ void SobelYRow_NEON(const uint8_t* src_y0,
3534
+ const uint8_t* src_y1,
3535
+ uint8_t* dst_sobely,
3536
+ int width) {
3537
+ asm volatile(
3538
+ "1: \n"
3539
+ "vld1.8 {d0}, [%0],%4 \n" // left
3540
+ "vld1.8 {d1}, [%1],%4 \n"
3541
+ "subs %3, %3, #8 \n" // 8 pixels
3542
+ "vsubl.u8 q0, d0, d1 \n"
3543
+ "vld1.8 {d2}, [%0],%4 \n" // center * 2
3544
+ "vld1.8 {d3}, [%1],%4 \n"
3545
+ "vsubl.u8 q1, d2, d3 \n"
3546
+ "vadd.s16 q0, q0, q1 \n"
3547
+ "vadd.s16 q0, q0, q1 \n"
3548
+ "vld1.8 {d2}, [%0],%5 \n" // right
3549
+ "vld1.8 {d3}, [%1],%5 \n"
3550
+ "vsubl.u8 q1, d2, d3 \n"
3551
+ "vadd.s16 q0, q0, q1 \n"
3552
+ "vabs.s16 q0, q0 \n"
3553
+ "vqmovn.u16 d0, q0 \n"
3554
+ "vst1.8 {d0}, [%2]! \n" // store 8 sobely
3555
+ "bgt 1b \n"
3556
+ : "+r"(src_y0), // %0
3557
+ "+r"(src_y1), // %1
3558
+ "+r"(dst_sobely), // %2
3559
+ "+r"(width) // %3
3560
+ : "r"(1), // %4
3561
+ "r"(6) // %5
3562
+ : "cc", "memory", "q0", "q1" // Clobber List
3563
+ );
3564
+ }
3565
+
3566
+ // %y passes a float as a scalar vector for vector * scalar multiply.
3567
+ // the register must be d0 to d15 and indexed with [0] or [1] to access
3568
+ // the float in the first or second float of the d-reg
3569
+
3570
+ void HalfFloatRow_NEON(const uint16_t* src,
3571
+ uint16_t* dst,
3572
+ float scale,
3573
+ int width) {
3574
+ asm volatile(
3575
+
3576
+ "1: \n"
3577
+ "vld1.16 {q0, q1}, [%0]! \n" // load 16 shorts
3578
+ "subs %2, %2, #16 \n" // 16 pixels per loop
3579
+ "vmovl.u16 q8, d0 \n"
3580
+ "vmovl.u16 q9, d1 \n"
3581
+ "vmovl.u16 q10, d2 \n"
3582
+ "vmovl.u16 q11, d3 \n"
3583
+ "vcvt.f32.u32 q8, q8 \n"
3584
+ "vcvt.f32.u32 q9, q9 \n"
3585
+ "vcvt.f32.u32 q10, q10 \n"
3586
+ "vcvt.f32.u32 q11, q11 \n"
3587
+ "vmul.f32 q8, q8, %y3 \n" // adjust exponent
3588
+ "vmul.f32 q9, q9, %y3 \n"
3589
+ "vmul.f32 q10, q10, %y3 \n"
3590
+ "vmul.f32 q11, q11, %y3 \n"
3591
+ "vqshrn.u32 d0, q8, #13 \n" // isolate halffloat
3592
+ "vqshrn.u32 d1, q9, #13 \n"
3593
+ "vqshrn.u32 d2, q10, #13 \n"
3594
+ "vqshrn.u32 d3, q11, #13 \n"
3595
+ "vst1.16 {q0, q1}, [%1]! \n" // store 16 fp16
3596
+ "bgt 1b \n"
3597
+ : "+r"(src), // %0
3598
+ "+r"(dst), // %1
3599
+ "+r"(width) // %2
3600
+ : "w"(scale * 1.9259299444e-34f) // %3
3601
+ : "cc", "memory", "q0", "q1", "q8", "q9", "q10", "q11");
3602
+ }
3603
+
3604
+ void ByteToFloatRow_NEON(const uint8_t* src,
3605
+ float* dst,
3606
+ float scale,
3607
+ int width) {
3608
+ asm volatile(
3609
+
3610
+ "1: \n"
3611
+ "vld1.8 {d2}, [%0]! \n" // load 8 bytes
3612
+ "subs %2, %2, #8 \n" // 8 pixels per loop
3613
+ "vmovl.u8 q1, d2 \n" // 8 shorts
3614
+ "vmovl.u16 q2, d2 \n" // 8 ints
3615
+ "vmovl.u16 q3, d3 \n"
3616
+ "vcvt.f32.u32 q2, q2 \n" // 8 floats
3617
+ "vcvt.f32.u32 q3, q3 \n"
3618
+ "vmul.f32 q2, q2, %y3 \n" // scale
3619
+ "vmul.f32 q3, q3, %y3 \n"
3620
+ "vst1.8 {q2, q3}, [%1]! \n" // store 8 floats
3621
+ "bgt 1b \n"
3622
+ : "+r"(src), // %0
3623
+ "+r"(dst), // %1
3624
+ "+r"(width) // %2
3625
+ : "w"(scale) // %3
3626
+ : "cc", "memory", "q1", "q2", "q3");
3627
+ }
3628
+
3629
+ // filter 5 rows with 1, 4, 6, 4, 1 coefficients to produce 1 row.
3630
+ void GaussCol_NEON(const uint16_t* src0,
3631
+ const uint16_t* src1,
3632
+ const uint16_t* src2,
3633
+ const uint16_t* src3,
3634
+ const uint16_t* src4,
3635
+ uint32_t* dst,
3636
+ int width) {
3637
+ asm volatile(
3638
+ "vmov.u16 d6, #4 \n" // constant 4
3639
+ "vmov.u16 d7, #6 \n" // constant 6
3640
+
3641
+ "1: \n"
3642
+ "vld1.16 {q1}, [%0]! \n" // load 8 samples, 5 rows
3643
+ "vld1.16 {q2}, [%4]! \n"
3644
+ "subs %6, %6, #8 \n" // 8 processed per loop
3645
+ "vaddl.u16 q0, d2, d4 \n" // * 1
3646
+ "vaddl.u16 q1, d3, d5 \n" // * 1
3647
+ "vld1.16 {q2}, [%1]! \n"
3648
+ "vmlal.u16 q0, d4, d6 \n" // * 4
3649
+ "vmlal.u16 q1, d5, d6 \n" // * 4
3650
+ "vld1.16 {q2}, [%2]! \n"
3651
+ "vmlal.u16 q0, d4, d7 \n" // * 6
3652
+ "vmlal.u16 q1, d5, d7 \n" // * 6
3653
+ "vld1.16 {q2}, [%3]! \n"
3654
+ "vmlal.u16 q0, d4, d6 \n" // * 4
3655
+ "vmlal.u16 q1, d5, d6 \n" // * 4
3656
+ "vst1.32 {q0, q1}, [%5]! \n" // store 8 samples
3657
+ "bgt 1b \n"
3658
+ : "+r"(src0), // %0
3659
+ "+r"(src1), // %1
3660
+ "+r"(src2), // %2
3661
+ "+r"(src3), // %3
3662
+ "+r"(src4), // %4
3663
+ "+r"(dst), // %5
3664
+ "+r"(width) // %6
3665
+ :
3666
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3667
+ }
3668
+
3669
+ // filter 5 rows with 1, 4, 6, 4, 1 coefficients to produce 1 row.
3670
+ void GaussRow_NEON(const uint32_t* src, uint16_t* dst, int width) {
3671
+ const uint32_t* src1 = src + 1;
3672
+ const uint32_t* src2 = src + 2;
3673
+ const uint32_t* src3 = src + 3;
3674
+ asm volatile(
3675
+ "vmov.u32 q10, #4 \n" // constant 4
3676
+ "vmov.u32 q11, #6 \n" // constant 6
3677
+
3678
+ "1: \n"
3679
+ "vld1.32 {q0, q1}, [%0]! \n" // load 12 source samples
3680
+ "vld1.32 {q2}, [%0] \n"
3681
+ "subs %5, %5, #8 \n" // 8 processed per loop
3682
+ "vadd.u32 q0, q0, q1 \n" // * 1
3683
+ "vadd.u32 q1, q1, q2 \n" // * 1
3684
+ "vld1.32 {q2, q3}, [%2]! \n"
3685
+ "vmla.u32 q0, q2, q11 \n" // * 6
3686
+ "vmla.u32 q1, q3, q11 \n" // * 6
3687
+ "vld1.32 {q2, q3}, [%1]! \n"
3688
+ "vld1.32 {q8, q9}, [%3]! \n"
3689
+ "vadd.u32 q2, q2, q8 \n" // add rows for * 4
3690
+ "vadd.u32 q3, q3, q9 \n"
3691
+ "vmla.u32 q0, q2, q10 \n" // * 4
3692
+ "vmla.u32 q1, q3, q10 \n" // * 4
3693
+ "vqshrn.u32 d0, q0, #8 \n" // round and pack
3694
+ "vqshrn.u32 d1, q1, #8 \n"
3695
+ "vst1.u16 {q0}, [%4]! \n" // store 8 samples
3696
+ "bgt 1b \n"
3697
+ : "+r"(src), // %0
3698
+ "+r"(src1), // %1
3699
+ "+r"(src2), // %2
3700
+ "+r"(src3), // %3
3701
+ "+r"(dst), // %4
3702
+ "+r"(width) // %5
3703
+ :
3704
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11");
3705
+ }
3706
+
3707
+ // Convert biplanar NV21 to packed YUV24
3708
+ void NV21ToYUV24Row_NEON(const uint8_t* src_y,
3709
+ const uint8_t* src_vu,
3710
+ uint8_t* dst_yuv24,
3711
+ int width) {
3712
+ asm volatile(
3713
+ "1: \n"
3714
+ "vld1.8 {q2}, [%0]! \n" // load 16 Y values
3715
+ "vld2.8 {d0, d2}, [%1]! \n" // load 8 VU values
3716
+ "subs %3, %3, #16 \n" // 16 pixels per loop
3717
+ "vmov d1, d0 \n"
3718
+ "vzip.u8 d0, d1 \n" // VV
3719
+ "vmov d3, d2 \n"
3720
+ "vzip.u8 d2, d3 \n" // UU
3721
+ "vst3.8 {d0, d2, d4}, [%2]! \n" // store 16 YUV pixels
3722
+ "vst3.8 {d1, d3, d5}, [%2]! \n"
3723
+ "bgt 1b \n"
3724
+ : "+r"(src_y), // %0
3725
+ "+r"(src_vu), // %1
3726
+ "+r"(dst_yuv24), // %2
3727
+ "+r"(width) // %3
3728
+ :
3729
+ : "cc", "memory", "q0", "q1", "q2");
3730
+ }
3731
+
3732
+ void AYUVToUVRow_NEON(const uint8_t* src_ayuv,
3733
+ int src_stride_ayuv,
3734
+ uint8_t* dst_uv,
3735
+ int width) {
3736
+ asm volatile(
3737
+ "add %1, %0, %1 \n" // src_stride + src_AYUV
3738
+ "1: \n"
3739
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 AYUV pixels.
3740
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 AYUV
3741
+ // pixels.
3742
+ "subs %3, %3, #16 \n" // 16 processed per loop.
3743
+ "vpaddl.u8 q0, q0 \n" // V 16 bytes -> 8 shorts.
3744
+ "vpaddl.u8 q1, q1 \n" // U 16 bytes -> 8 shorts.
3745
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more AYUV
3746
+ // pixels.
3747
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 AYUV
3748
+ // pixels.
3749
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
3750
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
3751
+ "vqrshrun.s16 d1, q0, #2 \n" // 2x2 average
3752
+ "vqrshrun.s16 d0, q1, #2 \n"
3753
+ "vst2.8 {d0, d1}, [%2]! \n" // store 8 pixels UV.
3754
+ "bgt 1b \n"
3755
+ : "+r"(src_ayuv), // %0
3756
+ "+r"(src_stride_ayuv), // %1
3757
+ "+r"(dst_uv), // %2
3758
+ "+r"(width) // %3
3759
+ :
3760
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7");
3761
+ }
3762
+
3763
+ void AYUVToVURow_NEON(const uint8_t* src_ayuv,
3764
+ int src_stride_ayuv,
3765
+ uint8_t* dst_vu,
3766
+ int width) {
3767
+ asm volatile(
3768
+ "add %1, %0, %1 \n" // src_stride + src_AYUV
3769
+ "1: \n"
3770
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 AYUV pixels.
3771
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 AYUV
3772
+ // pixels.
3773
+ "subs %3, %3, #16 \n" // 16 processed per loop.
3774
+ "vpaddl.u8 q0, q0 \n" // V 16 bytes -> 8 shorts.
3775
+ "vpaddl.u8 q1, q1 \n" // U 16 bytes -> 8 shorts.
3776
+ "vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more AYUV
3777
+ // pixels.
3778
+ "vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 AYUV
3779
+ // pixels.
3780
+ "vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
3781
+ "vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
3782
+ "vqrshrun.s16 d0, q0, #2 \n" // 2x2 average
3783
+ "vqrshrun.s16 d1, q1, #2 \n"
3784
+ "vst2.8 {d0, d1}, [%2]! \n" // store 8 pixels VU.
3785
+ "bgt 1b \n"
3786
+ : "+r"(src_ayuv), // %0
3787
+ "+r"(src_stride_ayuv), // %1
3788
+ "+r"(dst_vu), // %2
3789
+ "+r"(width) // %3
3790
+ :
3791
+ : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7");
3792
+ }
3793
+
3794
+ // Copy row of AYUV Y's into Y.
3795
+ // Similar to ARGBExtractAlphaRow_NEON
3796
+ void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
3797
+ asm volatile(
3798
+ "1: \n"
3799
+ "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 AYUV pixels
3800
+ "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 AYUV pixels
3801
+ "subs %2, %2, #16 \n" // 16 processed per loop
3802
+ "vst1.8 {q2}, [%1]! \n" // store 16 Y's.
3803
+ "bgt 1b \n"
3804
+ : "+r"(src_ayuv), // %0
3805
+ "+r"(dst_y), // %1
3806
+ "+r"(width) // %2
3807
+ :
3808
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3809
+ }
3810
+
3811
+ // Convert UV plane of NV12 to VU of NV21.
3812
+ void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
3813
+ asm volatile(
3814
+ "1: \n"
3815
+ "vld2.8 {d0, d2}, [%0]! \n" // load 16 UV values
3816
+ "vld2.8 {d1, d3}, [%0]! \n"
3817
+ "subs %2, %2, #16 \n" // 16 pixels per loop
3818
+ "vmov.u8 q2, q0 \n" // move U after V
3819
+ "vst2.8 {q1, q2}, [%1]! \n" // store 16 VU pixels
3820
+ "bgt 1b \n"
3821
+ : "+r"(src_uv), // %0
3822
+ "+r"(dst_vu), // %1
3823
+ "+r"(width) // %2
3824
+ :
3825
+ : "cc", "memory", "q0", "q1", "q2");
3826
+ }
3827
+
3828
+ void HalfMergeUVRow_NEON(const uint8_t* src_u,
3829
+ int src_stride_u,
3830
+ const uint8_t* src_v,
3831
+ int src_stride_v,
3832
+ uint8_t* dst_uv,
3833
+ int width) {
3834
+ const uint8_t* src_u_1 = src_u + src_stride_u;
3835
+ const uint8_t* src_v_1 = src_v + src_stride_v;
3836
+ asm volatile(
3837
+ "1: \n"
3838
+ "vld1.8 {q0}, [%0]! \n" // load 16 U values
3839
+ "vld1.8 {q1}, [%2]! \n" // load 16 V values
3840
+ "vld1.8 {q2}, [%1]! \n"
3841
+ "vld1.8 {q3}, [%3]! \n"
3842
+ "subs %5, %5, #16 \n" // 16 src pixels per loop
3843
+ "vpaddl.u8 q0, q0 \n" // half size
3844
+ "vpaddl.u8 q1, q1 \n"
3845
+ "vpadal.u8 q0, q2 \n"
3846
+ "vpadal.u8 q1, q3 \n"
3847
+ "vqrshrn.u16 d0, q0, #2 \n"
3848
+ "vqrshrn.u16 d1, q1, #2 \n"
3849
+ "vst2.8 {d0, d1}, [%4]! \n" // store 8 UV pixels
3850
+ "bgt 1b \n"
3851
+ : "+r"(src_u), // %0
3852
+ "+r"(src_u_1), // %1
3853
+ "+r"(src_v), // %2
3854
+ "+r"(src_v_1), // %3
3855
+ "+r"(dst_uv), // %4
3856
+ "+r"(width) // %5
3857
+ :
3858
+ : "cc", "memory", "q0", "q1", "q2", "q3");
3859
+ }
3860
+
3861
+ void SplitUVRow_16_NEON(const uint16_t* src_uv,
3862
+ uint16_t* dst_u,
3863
+ uint16_t* dst_v,
3864
+ int depth,
3865
+ int width) {
3866
+ int shift = depth - 16; // Negative for right shift.
3867
+ asm volatile(
3868
+ "vdup.16 q2, %4 \n"
3869
+ "1: \n"
3870
+ "vld2.16 {q0, q1}, [%0]! \n" // load 8 UV
3871
+ "subs %3, %3, #8 \n" // 8 src pixels per loop
3872
+ "vshl.u16 q0, q0, q2 \n"
3873
+ "vshl.u16 q1, q1, q2 \n"
3874
+ "vst1.16 {q0}, [%1]! \n" // store 8 U pixels
3875
+ "vst1.16 {q1}, [%2]! \n" // store 8 V pixels
3876
+ "bgt 1b \n"
3877
+ : "+r"(src_uv), // %0
3878
+ "+r"(dst_u), // %1
3879
+ "+r"(dst_v), // %2
3880
+ "+r"(width) // %3
3881
+ : "r"(shift) // %4
3882
+ : "cc", "memory", "q0", "q1", "q2");
3883
+ }
3884
+
3885
+ void MergeUVRow_16_NEON(const uint16_t* src_u,
3886
+ const uint16_t* src_v,
3887
+ uint16_t* dst_uv,
3888
+ int depth,
3889
+ int width) {
3890
+ int shift = 16 - depth;
3891
+ asm volatile(
3892
+ "vdup.16 q2, %4 \n"
3893
+ "1: \n"
3894
+ "vld1.16 {q0}, [%0]! \n" // load 8 U
3895
+ "vld1.16 {q1}, [%1]! \n" // load 8 V
3896
+ "subs %3, %3, #8 \n" // 8 src pixels per loop
3897
+ "vshl.u16 q0, q0, q2 \n"
3898
+ "vshl.u16 q1, q1, q2 \n"
3899
+ "vst2.16 {q0, q1}, [%2]! \n" // store 8 UV pixels
3900
+ "bgt 1b \n"
3901
+ : "+r"(src_u), // %0
3902
+ "+r"(src_v), // %1
3903
+ "+r"(dst_uv), // %2
3904
+ "+r"(width) // %3
3905
+ : "r"(shift) // %4
3906
+ : "cc", "memory", "q0", "q1", "q2");
3907
+ }
3908
+
3909
+ void MultiplyRow_16_NEON(const uint16_t* src_y,
3910
+ uint16_t* dst_y,
3911
+ int scale,
3912
+ int width) {
3913
+ asm volatile(
3914
+ "vdup.16 q2, %3 \n"
3915
+ "1: \n"
3916
+ "vld1.16 {q0}, [%0]! \n"
3917
+ "vld1.16 {q1}, [%0]! \n"
3918
+ "subs %2, %2, #16 \n" // 16 src pixels per loop
3919
+ "vmul.u16 q0, q0, q2 \n"
3920
+ "vmul.u16 q1, q1, q2 \n"
3921
+ "vst1.16 {q0}, [%1]! \n"
3922
+ "vst1.16 {q1}, [%1]! \n"
3923
+ "bgt 1b \n"
3924
+ : "+r"(src_y), // %0
3925
+ "+r"(dst_y), // %1
3926
+ "+r"(width) // %2
3927
+ : "r"(scale) // %3
3928
+ : "cc", "memory", "q0", "q1", "q2");
3929
+ }
3930
+
3931
+ void DivideRow_16_NEON(const uint16_t* src_y,
3932
+ uint16_t* dst_y,
3933
+ int scale,
3934
+ int width) {
3935
+ asm volatile(
3936
+ "vdup.16 d8, %3 \n"
3937
+ "1: \n"
3938
+ "vld1.16 {q2, q3}, [%0]! \n"
3939
+ "subs %2, %2, #16 \n" // 16 src pixels per loop
3940
+ "vmull.u16 q0, d4, d8 \n"
3941
+ "vmull.u16 q1, d5, d8 \n"
3942
+ "vmull.u16 q2, d6, d8 \n"
3943
+ "vmull.u16 q3, d7, d8 \n"
3944
+ "vshrn.u32 d0, q0, #16 \n"
3945
+ "vshrn.u32 d1, q1, #16 \n"
3946
+ "vshrn.u32 d2, q2, #16 \n"
3947
+ "vshrn.u32 d3, q3, #16 \n"
3948
+ "vst1.16 {q0, q1}, [%1]! \n" // store 16 pixels
3949
+ "bgt 1b \n"
3950
+ : "+r"(src_y), // %0
3951
+ "+r"(dst_y), // %1
3952
+ "+r"(width) // %2
3953
+ : "r"(scale) // %3
3954
+ : "cc", "memory", "q0", "q1", "q2", "q3", "d8");
3955
+ }
3956
+
3957
+ // Use scale to convert lsb formats to msb, depending how many bits there are:
3958
+ // 32768 = 9 bits = shr 1
3959
+ // 16384 = 10 bits = shr 2
3960
+ // 4096 = 12 bits = shr 4
3961
+ // 256 = 16 bits = shr 8
3962
+ void Convert16To8Row_NEON(const uint16_t* src_y,
3963
+ uint8_t* dst_y,
3964
+ int scale,
3965
+ int width) {
3966
+ const int shift = 15 - __builtin_clz((int32_t)scale); // Negative shl is shr
3967
+ asm volatile(
3968
+ "vdup.16 q2, %3 \n"
3969
+ "1: \n"
3970
+ "vld1.16 {q0}, [%0]! \n"
3971
+ "vld1.16 {q1}, [%0]! \n"
3972
+ "subs %2, %2, #16 \n" // 16 src pixels per loop
3973
+ "vshl.u16 q0, q0, q2 \n" // shr = q2 is negative
3974
+ "vshl.u16 q1, q1, q2 \n"
3975
+ "vqmovn.u16 d0, q0 \n"
3976
+ "vqmovn.u16 d1, q1 \n"
3977
+ "vst1.8 {q0}, [%1]! \n"
3978
+ "bgt 1b \n"
3979
+ : "+r"(src_y), // %0
3980
+ "+r"(dst_y), // %1
3981
+ "+r"(width) // %2
3982
+ : "r"(shift) // %3
3983
+ : "cc", "memory", "q0", "q1", "q2");
3984
+ }
3985
+
3986
+ // Use scale to convert J420 to I420
3987
+ // scale parameter is 8.8 fixed point but limited to 0 to 255
3988
+ // Function is based on DivideRow, but adds a bias
3989
+ // Does not clamp
3990
+ void Convert8To8Row_NEON(const uint8_t* src_y,
3991
+ uint8_t* dst_y,
3992
+ int scale,
3993
+ int bias,
3994
+ int width) {
3995
+ asm volatile(
3996
+ "vdup.8 d8, %3 \n"
3997
+ "vdup.8 q5, %4 \n"
3998
+ "1: \n"
3999
+ "vld1.8 {q2, q3}, [%0]! \n"
4000
+ "subs %2, %2, #32 \n" // 32 src pixels per loop
4001
+ "vmull.u8 q0, d4, d8 \n"
4002
+ "vmull.u8 q1, d5, d8 \n"
4003
+ "vmull.u8 q2, d6, d8 \n"
4004
+ "vmull.u8 q3, d7, d8 \n"
4005
+ "vshrn.u16 d0, q0, #8 \n"
4006
+ "vshrn.u16 d1, q1, #8 \n"
4007
+ "vshrn.u16 d2, q2, #8 \n"
4008
+ "vshrn.u16 d3, q3, #8 \n"
4009
+ "vadd.u8 q0, q0, q5 \n"
4010
+ "vadd.u8 q1, q1, q5 \n"
4011
+ "vst1.8 {q0, q1}, [%1]! \n" // store 32 pixels
4012
+ "bgt 1b \n"
4013
+ : "+r"(src_y), // %0
4014
+ "+r"(dst_y), // %1
4015
+ "+r"(width) // %2
4016
+ : "r"(scale), // %3
4017
+ "r"(bias) // %4
4018
+ : "cc", "memory", "q0", "q1", "q2", "q3", "d8", "q5");
4019
+ }
4020
+
4021
+ #endif // !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__)..
4022
+
4023
+ #ifdef __cplusplus
4024
+ } // extern "C"
4025
+ } // namespace libyuv
4026
+ #endif