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,4461 @@
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
+ #include <assert.h>
14
+ #include <string.h> // For memcpy and memset.
15
+
16
+ #include "libyuv/basic_types.h"
17
+ #include "libyuv/convert_argb.h" // For kYuvI601Constants
18
+
19
+ #ifdef __cplusplus
20
+ namespace libyuv {
21
+ extern "C" {
22
+ #endif
23
+
24
+ #ifdef __cplusplus
25
+ #define STATIC_CAST(type, expr) static_cast<type>(expr)
26
+ #else
27
+ #define STATIC_CAST(type, expr) (type)(expr)
28
+ #endif
29
+
30
+ // This macro controls YUV to RGB using unsigned math to extend range of
31
+ // YUV to RGB coefficients to 0 to 4 instead of 0 to 2 for more accuracy on B:
32
+ // LIBYUV_UNLIMITED_DATA
33
+
34
+ // Macros to enable unlimited data for each colorspace
35
+ // LIBYUV_UNLIMITED_BT601
36
+ // LIBYUV_UNLIMITED_BT709
37
+ // LIBYUV_UNLIMITED_BT2020
38
+
39
+ #if defined(LIBYUV_BIT_EXACT)
40
+ #define LIBYUV_UNATTENUATE_DUP 1
41
+ #endif
42
+
43
+ // llvm x86 is poor at ternary operator, so use branchless min/max.
44
+
45
+ #define USE_BRANCHLESS 1
46
+ #if defined(USE_BRANCHLESS)
47
+ static __inline int32_t clamp0(int32_t v) {
48
+ return -(v >= 0) & v;
49
+ }
50
+ // TODO(fbarchard): make clamp255 preserve negative values.
51
+ static __inline int32_t clamp255(int32_t v) {
52
+ return (-(v >= 255) | v) & 255;
53
+ }
54
+
55
+ static __inline int32_t clamp1023(int32_t v) {
56
+ return (-(v >= 1023) | v) & 1023;
57
+ }
58
+
59
+ // clamp to max
60
+ static __inline int32_t ClampMax(int32_t v, int32_t max) {
61
+ return (-(v >= max) | v) & max;
62
+ }
63
+
64
+ static __inline uint32_t Abs(int32_t v) {
65
+ int m = -(v < 0);
66
+ return (v + m) ^ m;
67
+ }
68
+ #else // USE_BRANCHLESS
69
+ static __inline int32_t clamp0(int32_t v) {
70
+ return (v < 0) ? 0 : v;
71
+ }
72
+
73
+ static __inline int32_t clamp255(int32_t v) {
74
+ return (v > 255) ? 255 : v;
75
+ }
76
+
77
+ static __inline int32_t clamp1023(int32_t v) {
78
+ return (v > 1023) ? 1023 : v;
79
+ }
80
+
81
+ static __inline int32_t ClampMax(int32_t v, int32_t max) {
82
+ return (v > max) ? max : v;
83
+ }
84
+
85
+ static __inline uint32_t Abs(int32_t v) {
86
+ return (v < 0) ? -v : v;
87
+ }
88
+ #endif // USE_BRANCHLESS
89
+ static __inline uint32_t Clamp(int32_t val) {
90
+ int v = clamp0(val);
91
+ return (uint32_t)(clamp255(v));
92
+ }
93
+
94
+ static __inline uint32_t Clamp10(int32_t val) {
95
+ int v = clamp0(val);
96
+ return (uint32_t)(clamp1023(v));
97
+ }
98
+
99
+ // Little Endian
100
+ #if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \
101
+ defined(_M_IX86) || defined(__arm__) || defined(_M_ARM) || \
102
+ (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
103
+ #define WRITEWORD(p, v) *(uint32_t*)(p) = v
104
+ #else
105
+ static inline void WRITEWORD(uint8_t* p, uint32_t v) {
106
+ p[0] = (uint8_t)(v & 255);
107
+ p[1] = (uint8_t)((v >> 8) & 255);
108
+ p[2] = (uint8_t)((v >> 16) & 255);
109
+ p[3] = (uint8_t)((v >> 24) & 255);
110
+ }
111
+ #endif
112
+
113
+ void RGB24ToARGBRow_C(const uint8_t* src_rgb24, uint8_t* dst_argb, int width) {
114
+ int x;
115
+ for (x = 0; x < width; ++x) {
116
+ uint8_t b = src_rgb24[0];
117
+ uint8_t g = src_rgb24[1];
118
+ uint8_t r = src_rgb24[2];
119
+ dst_argb[0] = b;
120
+ dst_argb[1] = g;
121
+ dst_argb[2] = r;
122
+ dst_argb[3] = 255u;
123
+ dst_argb += 4;
124
+ src_rgb24 += 3;
125
+ }
126
+ }
127
+
128
+ void RAWToARGBRow_C(const uint8_t* src_raw, uint8_t* dst_argb, int width) {
129
+ int x;
130
+ for (x = 0; x < width; ++x) {
131
+ uint8_t r = src_raw[0];
132
+ uint8_t g = src_raw[1];
133
+ uint8_t b = src_raw[2];
134
+ dst_argb[0] = b;
135
+ dst_argb[1] = g;
136
+ dst_argb[2] = r;
137
+ dst_argb[3] = 255u;
138
+ dst_argb += 4;
139
+ src_raw += 3;
140
+ }
141
+ }
142
+
143
+ void RAWToRGBARow_C(const uint8_t* src_raw, uint8_t* dst_rgba, int width) {
144
+ int x;
145
+ for (x = 0; x < width; ++x) {
146
+ uint8_t r = src_raw[0];
147
+ uint8_t g = src_raw[1];
148
+ uint8_t b = src_raw[2];
149
+ dst_rgba[0] = 255u;
150
+ dst_rgba[1] = b;
151
+ dst_rgba[2] = g;
152
+ dst_rgba[3] = r;
153
+ dst_rgba += 4;
154
+ src_raw += 3;
155
+ }
156
+ }
157
+
158
+ void RAWToRGB24Row_C(const uint8_t* src_raw, uint8_t* dst_rgb24, int width) {
159
+ int x;
160
+ for (x = 0; x < width; ++x) {
161
+ uint8_t r = src_raw[0];
162
+ uint8_t g = src_raw[1];
163
+ uint8_t b = src_raw[2];
164
+ dst_rgb24[0] = b;
165
+ dst_rgb24[1] = g;
166
+ dst_rgb24[2] = r;
167
+ dst_rgb24 += 3;
168
+ src_raw += 3;
169
+ }
170
+ }
171
+
172
+ void RGB565ToARGBRow_C(const uint8_t* src_rgb565,
173
+ uint8_t* dst_argb,
174
+ int width) {
175
+ int x;
176
+ for (x = 0; x < width; ++x) {
177
+ uint8_t b = STATIC_CAST(uint8_t, src_rgb565[0] & 0x1f);
178
+ uint8_t g = STATIC_CAST(
179
+ uint8_t, (src_rgb565[0] >> 5) | ((src_rgb565[1] & 0x07) << 3));
180
+ uint8_t r = STATIC_CAST(uint8_t, src_rgb565[1] >> 3);
181
+ dst_argb[0] = STATIC_CAST(uint8_t, (b << 3) | (b >> 2));
182
+ dst_argb[1] = STATIC_CAST(uint8_t, (g << 2) | (g >> 4));
183
+ dst_argb[2] = STATIC_CAST(uint8_t, (r << 3) | (r >> 2));
184
+ dst_argb[3] = 255u;
185
+ dst_argb += 4;
186
+ src_rgb565 += 2;
187
+ }
188
+ }
189
+
190
+ void ARGB1555ToARGBRow_C(const uint8_t* src_argb1555,
191
+ uint8_t* dst_argb,
192
+ int width) {
193
+ int x;
194
+ for (x = 0; x < width; ++x) {
195
+ uint8_t b = STATIC_CAST(uint8_t, src_argb1555[0] & 0x1f);
196
+ uint8_t g = STATIC_CAST(
197
+ uint8_t, (src_argb1555[0] >> 5) | ((src_argb1555[1] & 0x03) << 3));
198
+ uint8_t r = STATIC_CAST(uint8_t, (src_argb1555[1] & 0x7c) >> 2);
199
+ uint8_t a = STATIC_CAST(uint8_t, src_argb1555[1] >> 7);
200
+ dst_argb[0] = STATIC_CAST(uint8_t, (b << 3) | (b >> 2));
201
+ dst_argb[1] = STATIC_CAST(uint8_t, (g << 3) | (g >> 2));
202
+ dst_argb[2] = STATIC_CAST(uint8_t, (r << 3) | (r >> 2));
203
+ dst_argb[3] = -a;
204
+ dst_argb += 4;
205
+ src_argb1555 += 2;
206
+ }
207
+ }
208
+
209
+ void ARGB4444ToARGBRow_C(const uint8_t* src_argb4444,
210
+ uint8_t* dst_argb,
211
+ int width) {
212
+ int x;
213
+ for (x = 0; x < width; ++x) {
214
+ uint8_t b = STATIC_CAST(uint8_t, src_argb4444[0] & 0x0f);
215
+ uint8_t g = STATIC_CAST(uint8_t, src_argb4444[0] >> 4);
216
+ uint8_t r = STATIC_CAST(uint8_t, src_argb4444[1] & 0x0f);
217
+ uint8_t a = STATIC_CAST(uint8_t, src_argb4444[1] >> 4);
218
+ dst_argb[0] = STATIC_CAST(uint8_t, (b << 4) | b);
219
+ dst_argb[1] = STATIC_CAST(uint8_t, (g << 4) | g);
220
+ dst_argb[2] = STATIC_CAST(uint8_t, (r << 4) | r);
221
+ dst_argb[3] = STATIC_CAST(uint8_t, (a << 4) | a);
222
+ dst_argb += 4;
223
+ src_argb4444 += 2;
224
+ }
225
+ }
226
+
227
+ void AR30ToARGBRow_C(const uint8_t* src_ar30, uint8_t* dst_argb, int width) {
228
+ int x;
229
+ for (x = 0; x < width; ++x) {
230
+ uint32_t ar30;
231
+ memcpy(&ar30, src_ar30, sizeof ar30);
232
+ uint32_t b = (ar30 >> 2) & 0xff;
233
+ uint32_t g = (ar30 >> 12) & 0xff;
234
+ uint32_t r = (ar30 >> 22) & 0xff;
235
+ uint32_t a = (ar30 >> 30) * 0x55; // Replicate 2 bits to 8 bits.
236
+ *(uint32_t*)(dst_argb) = b | (g << 8) | (r << 16) | (a << 24);
237
+ dst_argb += 4;
238
+ src_ar30 += 4;
239
+ }
240
+ }
241
+
242
+ void AR30ToABGRRow_C(const uint8_t* src_ar30, uint8_t* dst_abgr, int width) {
243
+ int x;
244
+ for (x = 0; x < width; ++x) {
245
+ uint32_t ar30;
246
+ memcpy(&ar30, src_ar30, sizeof ar30);
247
+ uint32_t b = (ar30 >> 2) & 0xff;
248
+ uint32_t g = (ar30 >> 12) & 0xff;
249
+ uint32_t r = (ar30 >> 22) & 0xff;
250
+ uint32_t a = (ar30 >> 30) * 0x55; // Replicate 2 bits to 8 bits.
251
+ *(uint32_t*)(dst_abgr) = r | (g << 8) | (b << 16) | (a << 24);
252
+ dst_abgr += 4;
253
+ src_ar30 += 4;
254
+ }
255
+ }
256
+
257
+ void AR30ToAB30Row_C(const uint8_t* src_ar30, uint8_t* dst_ab30, int width) {
258
+ int x;
259
+ for (x = 0; x < width; ++x) {
260
+ uint32_t ar30;
261
+ memcpy(&ar30, src_ar30, sizeof ar30);
262
+ uint32_t b = ar30 & 0x3ff;
263
+ uint32_t ga = ar30 & 0xc00ffc00;
264
+ uint32_t r = (ar30 >> 20) & 0x3ff;
265
+ *(uint32_t*)(dst_ab30) = r | ga | (b << 20);
266
+ dst_ab30 += 4;
267
+ src_ar30 += 4;
268
+ }
269
+ }
270
+
271
+ void ARGBToABGRRow_C(const uint8_t* src_argb, uint8_t* dst_abgr, int width) {
272
+ int x;
273
+ for (x = 0; x < width; ++x) {
274
+ uint8_t b = src_argb[0];
275
+ uint8_t g = src_argb[1];
276
+ uint8_t r = src_argb[2];
277
+ uint8_t a = src_argb[3];
278
+ dst_abgr[0] = r;
279
+ dst_abgr[1] = g;
280
+ dst_abgr[2] = b;
281
+ dst_abgr[3] = a;
282
+ dst_abgr += 4;
283
+ src_argb += 4;
284
+ }
285
+ }
286
+
287
+ void ARGBToBGRARow_C(const uint8_t* src_argb, uint8_t* dst_bgra, int width) {
288
+ int x;
289
+ for (x = 0; x < width; ++x) {
290
+ uint8_t b = src_argb[0];
291
+ uint8_t g = src_argb[1];
292
+ uint8_t r = src_argb[2];
293
+ uint8_t a = src_argb[3];
294
+ dst_bgra[0] = a;
295
+ dst_bgra[1] = r;
296
+ dst_bgra[2] = g;
297
+ dst_bgra[3] = b;
298
+ dst_bgra += 4;
299
+ src_argb += 4;
300
+ }
301
+ }
302
+
303
+ void ARGBToRGBARow_C(const uint8_t* src_argb, uint8_t* dst_rgba, int width) {
304
+ int x;
305
+ for (x = 0; x < width; ++x) {
306
+ uint8_t b = src_argb[0];
307
+ uint8_t g = src_argb[1];
308
+ uint8_t r = src_argb[2];
309
+ uint8_t a = src_argb[3];
310
+ dst_rgba[0] = a;
311
+ dst_rgba[1] = b;
312
+ dst_rgba[2] = g;
313
+ dst_rgba[3] = r;
314
+ dst_rgba += 4;
315
+ src_argb += 4;
316
+ }
317
+ }
318
+
319
+ void ARGBToRGB24Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
320
+ int x;
321
+ for (x = 0; x < width; ++x) {
322
+ uint8_t b = src_argb[0];
323
+ uint8_t g = src_argb[1];
324
+ uint8_t r = src_argb[2];
325
+ dst_rgb[0] = b;
326
+ dst_rgb[1] = g;
327
+ dst_rgb[2] = r;
328
+ dst_rgb += 3;
329
+ src_argb += 4;
330
+ }
331
+ }
332
+
333
+ void ARGBToRAWRow_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
334
+ int x;
335
+ for (x = 0; x < width; ++x) {
336
+ uint8_t b = src_argb[0];
337
+ uint8_t g = src_argb[1];
338
+ uint8_t r = src_argb[2];
339
+ dst_rgb[0] = r;
340
+ dst_rgb[1] = g;
341
+ dst_rgb[2] = b;
342
+ dst_rgb += 3;
343
+ src_argb += 4;
344
+ }
345
+ }
346
+
347
+ void RGBAToARGBRow_C(const uint8_t* src_rgba, uint8_t* dst_argb, int width) {
348
+ int x;
349
+ for (x = 0; x < width; ++x) {
350
+ uint8_t a = src_rgba[0];
351
+ uint8_t b = src_rgba[1];
352
+ uint8_t g = src_rgba[2];
353
+ uint8_t r = src_rgba[3];
354
+ dst_argb[0] = b;
355
+ dst_argb[1] = g;
356
+ dst_argb[2] = r;
357
+ dst_argb[3] = a;
358
+ dst_argb += 4;
359
+ src_rgba += 4;
360
+ }
361
+ }
362
+
363
+ void ARGBToRGB565Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
364
+ int x;
365
+ for (x = 0; x < width - 1; x += 2) {
366
+ uint8_t b0 = src_argb[0] >> 3;
367
+ uint8_t g0 = src_argb[1] >> 2;
368
+ uint8_t r0 = src_argb[2] >> 3;
369
+ uint8_t b1 = src_argb[4] >> 3;
370
+ uint8_t g1 = src_argb[5] >> 2;
371
+ uint8_t r1 = src_argb[6] >> 3;
372
+ WRITEWORD(dst_rgb, b0 | (g0 << 5) | (r0 << 11) | (b1 << 16) | (g1 << 21) |
373
+ (r1 << 27));
374
+ dst_rgb += 4;
375
+ src_argb += 8;
376
+ }
377
+ if (width & 1) {
378
+ uint8_t b0 = src_argb[0] >> 3;
379
+ uint8_t g0 = src_argb[1] >> 2;
380
+ uint8_t r0 = src_argb[2] >> 3;
381
+ *(uint16_t*)(dst_rgb) = STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 11));
382
+ }
383
+ }
384
+
385
+ // dither4 is a row of 4 values from 4x4 dither matrix.
386
+ // The 4x4 matrix contains values to increase RGB. When converting to
387
+ // fewer bits (565) this provides an ordered dither.
388
+ // The order in the 4x4 matrix in first byte is upper left.
389
+ // The 4 values are passed as an int, then referenced as an array, so
390
+ // endian will not affect order of the original matrix. But the dither4
391
+ // will containing the first pixel in the lower byte for little endian
392
+ // or the upper byte for big endian.
393
+ void ARGBToRGB565DitherRow_C(const uint8_t* src_argb,
394
+ uint8_t* dst_rgb,
395
+ uint32_t dither4,
396
+ int width) {
397
+ int x;
398
+ for (x = 0; x < width - 1; x += 2) {
399
+ int dither0 = ((const unsigned char*)(&dither4))[x & 3];
400
+ int dither1 = ((const unsigned char*)(&dither4))[(x + 1) & 3];
401
+ uint8_t b0 = STATIC_CAST(uint8_t, clamp255(src_argb[0] + dither0) >> 3);
402
+ uint8_t g0 = STATIC_CAST(uint8_t, clamp255(src_argb[1] + dither0) >> 2);
403
+ uint8_t r0 = STATIC_CAST(uint8_t, clamp255(src_argb[2] + dither0) >> 3);
404
+ uint8_t b1 = STATIC_CAST(uint8_t, clamp255(src_argb[4] + dither1) >> 3);
405
+ uint8_t g1 = STATIC_CAST(uint8_t, clamp255(src_argb[5] + dither1) >> 2);
406
+ uint8_t r1 = STATIC_CAST(uint8_t, clamp255(src_argb[6] + dither1) >> 3);
407
+ *(uint16_t*)(dst_rgb + 0) =
408
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 11));
409
+ *(uint16_t*)(dst_rgb + 2) =
410
+ STATIC_CAST(uint16_t, b1 | (g1 << 5) | (r1 << 11));
411
+ dst_rgb += 4;
412
+ src_argb += 8;
413
+ }
414
+ if (width & 1) {
415
+ int dither0 = ((const unsigned char*)(&dither4))[(width - 1) & 3];
416
+ uint8_t b0 = STATIC_CAST(uint8_t, clamp255(src_argb[0] + dither0) >> 3);
417
+ uint8_t g0 = STATIC_CAST(uint8_t, clamp255(src_argb[1] + dither0) >> 2);
418
+ uint8_t r0 = STATIC_CAST(uint8_t, clamp255(src_argb[2] + dither0) >> 3);
419
+ *(uint16_t*)(dst_rgb) = STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 11));
420
+ }
421
+ }
422
+
423
+ void ARGBToARGB1555Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
424
+ int x;
425
+ for (x = 0; x < width - 1; x += 2) {
426
+ uint8_t b0 = src_argb[0] >> 3;
427
+ uint8_t g0 = src_argb[1] >> 3;
428
+ uint8_t r0 = src_argb[2] >> 3;
429
+ uint8_t a0 = src_argb[3] >> 7;
430
+ uint8_t b1 = src_argb[4] >> 3;
431
+ uint8_t g1 = src_argb[5] >> 3;
432
+ uint8_t r1 = src_argb[6] >> 3;
433
+ uint8_t a1 = src_argb[7] >> 7;
434
+ *(uint16_t*)(dst_rgb + 0) =
435
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 10) | (a0 << 15));
436
+ *(uint16_t*)(dst_rgb + 2) =
437
+ STATIC_CAST(uint16_t, b1 | (g1 << 5) | (r1 << 10) | (a1 << 15));
438
+ dst_rgb += 4;
439
+ src_argb += 8;
440
+ }
441
+ if (width & 1) {
442
+ uint8_t b0 = src_argb[0] >> 3;
443
+ uint8_t g0 = src_argb[1] >> 3;
444
+ uint8_t r0 = src_argb[2] >> 3;
445
+ uint8_t a0 = src_argb[3] >> 7;
446
+ *(uint16_t*)(dst_rgb) =
447
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 10) | (a0 << 15));
448
+ }
449
+ }
450
+
451
+ void ARGBToARGB4444Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
452
+ int x;
453
+ for (x = 0; x < width - 1; x += 2) {
454
+ uint8_t b0 = src_argb[0] >> 4;
455
+ uint8_t g0 = src_argb[1] >> 4;
456
+ uint8_t r0 = src_argb[2] >> 4;
457
+ uint8_t a0 = src_argb[3] >> 4;
458
+ uint8_t b1 = src_argb[4] >> 4;
459
+ uint8_t g1 = src_argb[5] >> 4;
460
+ uint8_t r1 = src_argb[6] >> 4;
461
+ uint8_t a1 = src_argb[7] >> 4;
462
+ *(uint16_t*)(dst_rgb + 0) =
463
+ STATIC_CAST(uint16_t, b0 | (g0 << 4) | (r0 << 8) | (a0 << 12));
464
+ *(uint16_t*)(dst_rgb + 2) =
465
+ STATIC_CAST(uint16_t, b1 | (g1 << 4) | (r1 << 8) | (a1 << 12));
466
+ dst_rgb += 4;
467
+ src_argb += 8;
468
+ }
469
+ if (width & 1) {
470
+ uint8_t b0 = src_argb[0] >> 4;
471
+ uint8_t g0 = src_argb[1] >> 4;
472
+ uint8_t r0 = src_argb[2] >> 4;
473
+ uint8_t a0 = src_argb[3] >> 4;
474
+ *(uint16_t*)(dst_rgb) =
475
+ STATIC_CAST(uint16_t, b0 | (g0 << 4) | (r0 << 8) | (a0 << 12));
476
+ }
477
+ }
478
+
479
+ void ABGRToAR30Row_C(const uint8_t* src_abgr, uint8_t* dst_ar30, int width) {
480
+ int x;
481
+ for (x = 0; x < width; ++x) {
482
+ uint32_t r0 = (src_abgr[0] >> 6) | ((uint32_t)(src_abgr[0]) << 2);
483
+ uint32_t g0 = (src_abgr[1] >> 6) | ((uint32_t)(src_abgr[1]) << 2);
484
+ uint32_t b0 = (src_abgr[2] >> 6) | ((uint32_t)(src_abgr[2]) << 2);
485
+ uint32_t a0 = (src_abgr[3] >> 6);
486
+ *(uint32_t*)(dst_ar30) =
487
+ STATIC_CAST(uint32_t, b0 | (g0 << 10) | (r0 << 20) | (a0 << 30));
488
+ dst_ar30 += 4;
489
+ src_abgr += 4;
490
+ }
491
+ }
492
+
493
+ void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width) {
494
+ int x;
495
+ for (x = 0; x < width; ++x) {
496
+ uint32_t b0 = (src_argb[0] >> 6) | ((uint32_t)(src_argb[0]) << 2);
497
+ uint32_t g0 = (src_argb[1] >> 6) | ((uint32_t)(src_argb[1]) << 2);
498
+ uint32_t r0 = (src_argb[2] >> 6) | ((uint32_t)(src_argb[2]) << 2);
499
+ uint32_t a0 = (src_argb[3] >> 6);
500
+ *(uint32_t*)(dst_ar30) =
501
+ STATIC_CAST(uint32_t, b0 | (g0 << 10) | (r0 << 20) | (a0 << 30));
502
+ dst_ar30 += 4;
503
+ src_argb += 4;
504
+ }
505
+ }
506
+
507
+ void ARGBToAR64Row_C(const uint8_t* src_argb, uint16_t* dst_ar64, int width) {
508
+ int x;
509
+ for (x = 0; x < width; ++x) {
510
+ uint16_t b = src_argb[0] * 0x0101;
511
+ uint16_t g = src_argb[1] * 0x0101;
512
+ uint16_t r = src_argb[2] * 0x0101;
513
+ uint16_t a = src_argb[3] * 0x0101;
514
+ dst_ar64[0] = b;
515
+ dst_ar64[1] = g;
516
+ dst_ar64[2] = r;
517
+ dst_ar64[3] = a;
518
+ dst_ar64 += 4;
519
+ src_argb += 4;
520
+ }
521
+ }
522
+
523
+ void ARGBToAB64Row_C(const uint8_t* src_argb, uint16_t* dst_ab64, int width) {
524
+ int x;
525
+ for (x = 0; x < width; ++x) {
526
+ uint16_t b = src_argb[0] * 0x0101;
527
+ uint16_t g = src_argb[1] * 0x0101;
528
+ uint16_t r = src_argb[2] * 0x0101;
529
+ uint16_t a = src_argb[3] * 0x0101;
530
+ dst_ab64[0] = r;
531
+ dst_ab64[1] = g;
532
+ dst_ab64[2] = b;
533
+ dst_ab64[3] = a;
534
+ dst_ab64 += 4;
535
+ src_argb += 4;
536
+ }
537
+ }
538
+
539
+ void AR64ToARGBRow_C(const uint16_t* src_ar64, uint8_t* dst_argb, int width) {
540
+ int x;
541
+ for (x = 0; x < width; ++x) {
542
+ uint8_t b = src_ar64[0] >> 8;
543
+ uint8_t g = src_ar64[1] >> 8;
544
+ uint8_t r = src_ar64[2] >> 8;
545
+ uint8_t a = src_ar64[3] >> 8;
546
+ dst_argb[0] = b;
547
+ dst_argb[1] = g;
548
+ dst_argb[2] = r;
549
+ dst_argb[3] = a;
550
+ dst_argb += 4;
551
+ src_ar64 += 4;
552
+ }
553
+ }
554
+
555
+ void AB64ToARGBRow_C(const uint16_t* src_ab64, uint8_t* dst_argb, int width) {
556
+ int x;
557
+ for (x = 0; x < width; ++x) {
558
+ uint8_t r = src_ab64[0] >> 8;
559
+ uint8_t g = src_ab64[1] >> 8;
560
+ uint8_t b = src_ab64[2] >> 8;
561
+ uint8_t a = src_ab64[3] >> 8;
562
+ dst_argb[0] = b;
563
+ dst_argb[1] = g;
564
+ dst_argb[2] = r;
565
+ dst_argb[3] = a;
566
+ dst_argb += 4;
567
+ src_ab64 += 4;
568
+ }
569
+ }
570
+
571
+ void AR64ToAB64Row_C(const uint16_t* src_ar64, uint16_t* dst_ab64, int width) {
572
+ int x;
573
+ for (x = 0; x < width; ++x) {
574
+ uint16_t b = src_ar64[0];
575
+ uint16_t g = src_ar64[1];
576
+ uint16_t r = src_ar64[2];
577
+ uint16_t a = src_ar64[3];
578
+ dst_ab64[0] = r;
579
+ dst_ab64[1] = g;
580
+ dst_ab64[2] = b;
581
+ dst_ab64[3] = a;
582
+ dst_ab64 += 4;
583
+ src_ar64 += 4;
584
+ }
585
+ }
586
+
587
+ // TODO(fbarchard): Make shuffle compatible with SIMD versions
588
+ void AR64ShuffleRow_C(const uint8_t* src_ar64,
589
+ uint8_t* dst_ar64,
590
+ const uint8_t* shuffler,
591
+ int width) {
592
+ const uint16_t* src_ar64_16 = (const uint16_t*)src_ar64;
593
+ uint16_t* dst_ar64_16 = (uint16_t*)dst_ar64;
594
+ int index0 = shuffler[0] / 2;
595
+ int index1 = shuffler[2] / 2;
596
+ int index2 = shuffler[4] / 2;
597
+ int index3 = shuffler[6] / 2;
598
+ // Shuffle a row of AR64.
599
+ int x;
600
+ for (x = 0; x < width / 2; ++x) {
601
+ // To support in-place conversion.
602
+ uint16_t b = src_ar64_16[index0];
603
+ uint16_t g = src_ar64_16[index1];
604
+ uint16_t r = src_ar64_16[index2];
605
+ uint16_t a = src_ar64_16[index3];
606
+ dst_ar64_16[0] = b;
607
+ dst_ar64_16[1] = g;
608
+ dst_ar64_16[2] = r;
609
+ dst_ar64_16[3] = a;
610
+ src_ar64_16 += 4;
611
+ dst_ar64_16 += 4;
612
+ }
613
+ }
614
+ // BT601 8 bit Y:
615
+ // b 0.114 * 219 = 24.966 = 25
616
+ // g 0.587 * 219 = 128.553 = 129
617
+ // r 0.299 * 219 = 65.481 = 66
618
+ // BT601 8 bit U:
619
+ // b 0.875 * 128 = 112.0 = 112
620
+ // g -0.5781 * 128 = −73.9968 = -74
621
+ // r -0.2969 * 128 = −38.0032 = -38
622
+ // BT601 8 bit V:
623
+ // b -0.1406 * 128 = −17.9968 = -18
624
+ // g -0.7344 * 128 = −94.0032 = -94
625
+ // r 0.875 * 128 = 112.0 = 112
626
+ static __inline uint8_t RGBToY(uint8_t r, uint8_t g, uint8_t b) {
627
+ return STATIC_CAST(uint8_t, (66 * r + 129 * g + 25 * b + 0x1080) >> 8);
628
+ }
629
+ static __inline uint8_t RGBToU(uint8_t r, uint8_t g, uint8_t b) {
630
+ return STATIC_CAST(uint8_t, (112 * b - 74 * g - 38 * r + 0x8000) >> 8);
631
+ }
632
+ static __inline uint8_t RGBToV(uint8_t r, uint8_t g, uint8_t b) {
633
+ return STATIC_CAST(uint8_t, (112 * r - 94 * g - 18 * b + 0x8000) >> 8);
634
+ }
635
+ #define AVGB(a, b) (((a) + (b) + 1) >> 1)
636
+
637
+ #define MAKEROWY(NAME, R, G, B, BPP) \
638
+ void NAME##ToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \
639
+ int x; \
640
+ for (x = 0; x < width; ++x) { \
641
+ dst_y[0] = RGBToY(src_rgb[R], src_rgb[G], src_rgb[B]); \
642
+ src_rgb += BPP; \
643
+ dst_y += 1; \
644
+ } \
645
+ } \
646
+ void NAME##ToUVRow_C(const uint8_t* src_rgb, int src_stride_rgb, \
647
+ uint8_t* dst_u, uint8_t* dst_v, int width) { \
648
+ const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \
649
+ int x; \
650
+ for (x = 0; x < width - 1; x += 2) { \
651
+ uint8_t ab = (src_rgb[B] + src_rgb[B + BPP] + src_rgb1[B] + \
652
+ src_rgb1[B + BPP] + 2) >> \
653
+ 2; \
654
+ uint8_t ag = (src_rgb[G] + src_rgb[G + BPP] + src_rgb1[G] + \
655
+ src_rgb1[G + BPP] + 2) >> \
656
+ 2; \
657
+ uint8_t ar = (src_rgb[R] + src_rgb[R + BPP] + src_rgb1[R] + \
658
+ src_rgb1[R + BPP] + 2) >> \
659
+ 2; \
660
+ dst_u[0] = RGBToU(ar, ag, ab); \
661
+ dst_v[0] = RGBToV(ar, ag, ab); \
662
+ src_rgb += BPP * 2; \
663
+ src_rgb1 += BPP * 2; \
664
+ dst_u += 1; \
665
+ dst_v += 1; \
666
+ } \
667
+ if (width & 1) { \
668
+ uint8_t ab = (src_rgb[B] + src_rgb1[B] + 1) >> 1; \
669
+ uint8_t ag = (src_rgb[G] + src_rgb1[G] + 1) >> 1; \
670
+ uint8_t ar = (src_rgb[R] + src_rgb1[R] + 1) >> 1; \
671
+ dst_u[0] = RGBToU(ar, ag, ab); \
672
+ dst_v[0] = RGBToV(ar, ag, ab); \
673
+ } \
674
+ }
675
+
676
+ MAKEROWY(ARGB, 2, 1, 0, 4)
677
+ MAKEROWY(BGRA, 1, 2, 3, 4)
678
+ MAKEROWY(ABGR, 0, 1, 2, 4)
679
+ MAKEROWY(RGBA, 3, 2, 1, 4)
680
+ MAKEROWY(RGB24, 2, 1, 0, 3)
681
+ MAKEROWY(RAW, 0, 1, 2, 3)
682
+ #undef MAKEROWY
683
+
684
+ // JPeg uses BT.601-1 full range
685
+ // y = 0.29900 * r + 0.58700 * g + 0.11400 * b
686
+ // u = -0.16874 * r - 0.33126 * g + 0.50000 * b + center
687
+ // v = 0.50000 * r - 0.41869 * g - 0.08131 * b + center
688
+ // JPeg 8 bit Y:
689
+ // b 0.11400 * 256 = 29.184 = 29
690
+ // g 0.58700 * 256 = 150.272 = 150
691
+ // r 0.29900 * 256 = 76.544 = 77
692
+ // JPeg 8 bit U:
693
+ // b 0.50000 * 256 = 128.0 = 128
694
+ // g -0.33126 * 256 = −84.80256 = -85
695
+ // r -0.16874 * 256 = −43.19744 = -43
696
+ // JPeg 8 bit V:
697
+ // b -0.08131 * 256 = −20.81536 = -21
698
+ // g -0.41869 * 256 = −107.18464 = -107
699
+ // r 0.50000 * 256 = 128.0 = 128
700
+
701
+ // 8 bit
702
+ static __inline uint8_t RGBToYJ(uint8_t r, uint8_t g, uint8_t b) {
703
+ return (77 * r + 150 * g + 29 * b + 128) >> 8;
704
+ }
705
+ static __inline uint8_t RGBToUJ(uint8_t r, uint8_t g, uint8_t b) {
706
+ return (128 * b - 85 * g - 43 * r + 0x8000) >> 8;
707
+ }
708
+ static __inline uint8_t RGBToVJ(uint8_t r, uint8_t g, uint8_t b) {
709
+ return (128 * r - 107 * g - 21 * b + 0x8000) >> 8;
710
+ }
711
+
712
+ // ARGBToYJ_C and ARGBToUVJ_C
713
+ #define MAKEROWYJ(NAME, R, G, B, BPP) \
714
+ void NAME##ToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \
715
+ int x; \
716
+ for (x = 0; x < width; ++x) { \
717
+ dst_y[0] = RGBToYJ(src_rgb[R], src_rgb[G], src_rgb[B]); \
718
+ src_rgb += BPP; \
719
+ dst_y += 1; \
720
+ } \
721
+ } \
722
+ void NAME##ToUVJRow_C(const uint8_t* src_rgb, int src_stride_rgb, \
723
+ uint8_t* dst_u, uint8_t* dst_v, int width) { \
724
+ const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \
725
+ int x; \
726
+ for (x = 0; x < width - 1; x += 2) { \
727
+ uint8_t ab = (src_rgb[B] + src_rgb[B + BPP] + src_rgb1[B] + \
728
+ src_rgb1[B + BPP] + 2) >> \
729
+ 2; \
730
+ uint8_t ag = (src_rgb[G] + src_rgb[G + BPP] + src_rgb1[G] + \
731
+ src_rgb1[G + BPP] + 2) >> \
732
+ 2; \
733
+ uint8_t ar = (src_rgb[R] + src_rgb[R + BPP] + src_rgb1[R] + \
734
+ src_rgb1[R + BPP] + 2) >> \
735
+ 2; \
736
+ dst_u[0] = RGBToUJ(ar, ag, ab); \
737
+ dst_v[0] = RGBToVJ(ar, ag, ab); \
738
+ src_rgb += BPP * 2; \
739
+ src_rgb1 += BPP * 2; \
740
+ dst_u += 1; \
741
+ dst_v += 1; \
742
+ } \
743
+ if (width & 1) { \
744
+ uint16_t ab = (src_rgb[B] + src_rgb1[B] + 1) >> 1; \
745
+ uint16_t ag = (src_rgb[G] + src_rgb1[G] + 1) >> 1; \
746
+ uint16_t ar = (src_rgb[R] + src_rgb1[R] + 1) >> 1; \
747
+ dst_u[0] = RGBToUJ(ar, ag, ab); \
748
+ dst_v[0] = RGBToVJ(ar, ag, ab); \
749
+ } \
750
+ }
751
+
752
+ MAKEROWYJ(ARGB, 2, 1, 0, 4)
753
+ MAKEROWYJ(ABGR, 0, 1, 2, 4)
754
+ MAKEROWYJ(RGBA, 3, 2, 1, 4)
755
+ MAKEROWYJ(RGB24, 2, 1, 0, 3)
756
+ MAKEROWYJ(RAW, 0, 1, 2, 3)
757
+ #undef MAKEROWYJ
758
+
759
+ void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width) {
760
+ int x;
761
+ for (x = 0; x < width; ++x) {
762
+ uint8_t b = src_rgb565[0] & 0x1f;
763
+ uint8_t g = STATIC_CAST(
764
+ uint8_t, (src_rgb565[0] >> 5) | ((src_rgb565[1] & 0x07) << 3));
765
+ uint8_t r = src_rgb565[1] >> 3;
766
+ b = STATIC_CAST(uint8_t, (b << 3) | (b >> 2));
767
+ g = STATIC_CAST(uint8_t, (g << 2) | (g >> 4));
768
+ r = STATIC_CAST(uint8_t, (r << 3) | (r >> 2));
769
+ dst_y[0] = RGBToY(r, g, b);
770
+ src_rgb565 += 2;
771
+ dst_y += 1;
772
+ }
773
+ }
774
+
775
+ void ARGB1555ToYRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width) {
776
+ int x;
777
+ for (x = 0; x < width; ++x) {
778
+ uint8_t b = src_argb1555[0] & 0x1f;
779
+ uint8_t g = STATIC_CAST(
780
+ uint8_t, (src_argb1555[0] >> 5) | ((src_argb1555[1] & 0x03) << 3));
781
+ uint8_t r = (src_argb1555[1] & 0x7c) >> 2;
782
+ b = STATIC_CAST(uint8_t, (b << 3) | (b >> 2));
783
+ g = STATIC_CAST(uint8_t, (g << 3) | (g >> 2));
784
+ r = STATIC_CAST(uint8_t, (r << 3) | (r >> 2));
785
+ dst_y[0] = RGBToY(r, g, b);
786
+ src_argb1555 += 2;
787
+ dst_y += 1;
788
+ }
789
+ }
790
+
791
+ void ARGB4444ToYRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width) {
792
+ int x;
793
+ for (x = 0; x < width; ++x) {
794
+ uint8_t b = src_argb4444[0] & 0x0f;
795
+ uint8_t g = src_argb4444[0] >> 4;
796
+ uint8_t r = src_argb4444[1] & 0x0f;
797
+ b = STATIC_CAST(uint8_t, (b << 4) | b);
798
+ g = STATIC_CAST(uint8_t, (g << 4) | g);
799
+ r = STATIC_CAST(uint8_t, (r << 4) | r);
800
+ dst_y[0] = RGBToY(r, g, b);
801
+ src_argb4444 += 2;
802
+ dst_y += 1;
803
+ }
804
+ }
805
+
806
+ void RGB565ToUVRow_C(const uint8_t* src_rgb565,
807
+ int src_stride_rgb565,
808
+ uint8_t* dst_u,
809
+ uint8_t* dst_v,
810
+ int width) {
811
+ const uint8_t* next_rgb565 = src_rgb565 + src_stride_rgb565;
812
+ int x;
813
+ for (x = 0; x < width - 1; x += 2) {
814
+ uint8_t b0 = STATIC_CAST(uint8_t, src_rgb565[0] & 0x1f);
815
+ uint8_t g0 = STATIC_CAST(
816
+ uint8_t, (src_rgb565[0] >> 5) | ((src_rgb565[1] & 0x07) << 3));
817
+ uint8_t r0 = STATIC_CAST(uint8_t, src_rgb565[1] >> 3);
818
+ uint8_t b1 = STATIC_CAST(uint8_t, src_rgb565[2] & 0x1f);
819
+ uint8_t g1 = STATIC_CAST(
820
+ uint8_t, (src_rgb565[2] >> 5) | ((src_rgb565[3] & 0x07) << 3));
821
+ uint8_t r1 = STATIC_CAST(uint8_t, src_rgb565[3] >> 3);
822
+ uint8_t b2 = STATIC_CAST(uint8_t, next_rgb565[0] & 0x1f);
823
+ uint8_t g2 = STATIC_CAST(
824
+ uint8_t, (next_rgb565[0] >> 5) | ((next_rgb565[1] & 0x07) << 3));
825
+ uint8_t r2 = STATIC_CAST(uint8_t, next_rgb565[1] >> 3);
826
+ uint8_t b3 = STATIC_CAST(uint8_t, next_rgb565[2] & 0x1f);
827
+ uint8_t g3 = STATIC_CAST(
828
+ uint8_t, (next_rgb565[2] >> 5) | ((next_rgb565[3] & 0x07) << 3));
829
+ uint8_t r3 = STATIC_CAST(uint8_t, next_rgb565[3] >> 3);
830
+
831
+ b0 = STATIC_CAST(uint8_t, (b0 << 3) | (b0 >> 2));
832
+ g0 = STATIC_CAST(uint8_t, (g0 << 2) | (g0 >> 4));
833
+ r0 = STATIC_CAST(uint8_t, (r0 << 3) | (r0 >> 2));
834
+ b1 = STATIC_CAST(uint8_t, (b1 << 3) | (b1 >> 2));
835
+ g1 = STATIC_CAST(uint8_t, (g1 << 2) | (g1 >> 4));
836
+ r1 = STATIC_CAST(uint8_t, (r1 << 3) | (r1 >> 2));
837
+ b2 = STATIC_CAST(uint8_t, (b2 << 3) | (b2 >> 2));
838
+ g2 = STATIC_CAST(uint8_t, (g2 << 2) | (g2 >> 4));
839
+ r2 = STATIC_CAST(uint8_t, (r2 << 3) | (r2 >> 2));
840
+ b3 = STATIC_CAST(uint8_t, (b3 << 3) | (b3 >> 2));
841
+ g3 = STATIC_CAST(uint8_t, (g3 << 2) | (g3 >> 4));
842
+ r3 = STATIC_CAST(uint8_t, (r3 << 3) | (r3 >> 2));
843
+
844
+ uint8_t b = (b0 + b1 + b2 + b3 + 2) >> 2;
845
+ uint8_t g = (g0 + g1 + g2 + g3 + 2) >> 2;
846
+ uint8_t r = (r0 + r1 + r2 + r3 + 2) >> 2;
847
+ dst_u[0] = RGBToU(r, g, b);
848
+ dst_v[0] = RGBToV(r, g, b);
849
+
850
+ src_rgb565 += 4;
851
+ next_rgb565 += 4;
852
+ dst_u += 1;
853
+ dst_v += 1;
854
+ }
855
+ if (width & 1) {
856
+ uint8_t b0 = STATIC_CAST(uint8_t, src_rgb565[0] & 0x1f);
857
+ uint8_t g0 = STATIC_CAST(
858
+ uint8_t, (src_rgb565[0] >> 5) | ((src_rgb565[1] & 0x07) << 3));
859
+ uint8_t r0 = STATIC_CAST(uint8_t, src_rgb565[1] >> 3);
860
+ uint8_t b2 = STATIC_CAST(uint8_t, next_rgb565[0] & 0x1f);
861
+ uint8_t g2 = STATIC_CAST(
862
+ uint8_t, (next_rgb565[0] >> 5) | ((next_rgb565[1] & 0x07) << 3));
863
+ uint8_t r2 = STATIC_CAST(uint8_t, next_rgb565[1] >> 3);
864
+ b0 = STATIC_CAST(uint8_t, (b0 << 3) | (b0 >> 2));
865
+ g0 = STATIC_CAST(uint8_t, (g0 << 2) | (g0 >> 4));
866
+ r0 = STATIC_CAST(uint8_t, (r0 << 3) | (r0 >> 2));
867
+ b2 = STATIC_CAST(uint8_t, (b2 << 3) | (b2 >> 2));
868
+ g2 = STATIC_CAST(uint8_t, (g2 << 2) | (g2 >> 4));
869
+ r2 = STATIC_CAST(uint8_t, (r2 << 3) | (r2 >> 2));
870
+
871
+ uint8_t ab = AVGB(b0, b2);
872
+ uint8_t ag = AVGB(g0, g2);
873
+ uint8_t ar = AVGB(r0, r2);
874
+ dst_u[0] = RGBToU(ar, ag, ab);
875
+ dst_v[0] = RGBToV(ar, ag, ab);
876
+ }
877
+ }
878
+
879
+ void ARGB1555ToUVRow_C(const uint8_t* src_argb1555,
880
+ int src_stride_argb1555,
881
+ uint8_t* dst_u,
882
+ uint8_t* dst_v,
883
+ int width) {
884
+ const uint8_t* next_argb1555 = src_argb1555 + src_stride_argb1555;
885
+ int x;
886
+ for (x = 0; x < width - 1; x += 2) {
887
+ uint8_t b0 = STATIC_CAST(uint8_t, src_argb1555[0] & 0x1f);
888
+ uint8_t g0 = STATIC_CAST(
889
+ uint8_t, (src_argb1555[0] >> 5) | ((src_argb1555[1] & 0x03) << 3));
890
+ uint8_t r0 = STATIC_CAST(uint8_t, (src_argb1555[1] & 0x7c) >> 2);
891
+ uint8_t b1 = STATIC_CAST(uint8_t, src_argb1555[2] & 0x1f);
892
+ uint8_t g1 = STATIC_CAST(
893
+ uint8_t, (src_argb1555[2] >> 5) | ((src_argb1555[3] & 0x03) << 3));
894
+ uint8_t r1 = STATIC_CAST(uint8_t, (src_argb1555[3] & 0x7c) >> 2);
895
+ uint8_t b2 = STATIC_CAST(uint8_t, next_argb1555[0] & 0x1f);
896
+ uint8_t g2 = STATIC_CAST(
897
+ uint8_t, (next_argb1555[0] >> 5) | ((next_argb1555[1] & 0x03) << 3));
898
+ uint8_t r2 = STATIC_CAST(uint8_t, (next_argb1555[1] & 0x7c) >> 2);
899
+ uint8_t b3 = STATIC_CAST(uint8_t, next_argb1555[2] & 0x1f);
900
+ uint8_t g3 = STATIC_CAST(
901
+ uint8_t, (next_argb1555[2] >> 5) | ((next_argb1555[3] & 0x03) << 3));
902
+ uint8_t r3 = STATIC_CAST(uint8_t, (next_argb1555[3] & 0x7c) >> 2);
903
+
904
+ b0 = STATIC_CAST(uint8_t, (b0 << 3) | (b0 >> 2));
905
+ g0 = STATIC_CAST(uint8_t, (g0 << 3) | (g0 >> 2));
906
+ r0 = STATIC_CAST(uint8_t, (r0 << 3) | (r0 >> 2));
907
+ b1 = STATIC_CAST(uint8_t, (b1 << 3) | (b1 >> 2));
908
+ g1 = STATIC_CAST(uint8_t, (g1 << 3) | (g1 >> 2));
909
+ r1 = STATIC_CAST(uint8_t, (r1 << 3) | (r1 >> 2));
910
+ b2 = STATIC_CAST(uint8_t, (b2 << 3) | (b2 >> 2));
911
+ g2 = STATIC_CAST(uint8_t, (g2 << 3) | (g2 >> 2));
912
+ r2 = STATIC_CAST(uint8_t, (r2 << 3) | (r2 >> 2));
913
+ b3 = STATIC_CAST(uint8_t, (b3 << 3) | (b3 >> 2));
914
+ g3 = STATIC_CAST(uint8_t, (g3 << 3) | (g3 >> 2));
915
+ r3 = STATIC_CAST(uint8_t, (r3 << 3) | (r3 >> 2));
916
+
917
+ uint8_t b = (b0 + b1 + b2 + b3 + 2) >> 2;
918
+ uint8_t g = (g0 + g1 + g2 + g3 + 2) >> 2;
919
+ uint8_t r = (r0 + r1 + r2 + r3 + 2) >> 2;
920
+ dst_u[0] = RGBToU(r, g, b);
921
+ dst_v[0] = RGBToV(r, g, b);
922
+
923
+ src_argb1555 += 4;
924
+ next_argb1555 += 4;
925
+ dst_u += 1;
926
+ dst_v += 1;
927
+ }
928
+ if (width & 1) {
929
+ uint8_t b0 = STATIC_CAST(uint8_t, src_argb1555[0] & 0x1f);
930
+ uint8_t g0 = STATIC_CAST(
931
+ uint8_t, (src_argb1555[0] >> 5) | ((src_argb1555[1] & 0x03) << 3));
932
+ uint8_t r0 = STATIC_CAST(uint8_t, (src_argb1555[1] & 0x7c) >> 2);
933
+ uint8_t b2 = STATIC_CAST(uint8_t, next_argb1555[0] & 0x1f);
934
+ uint8_t g2 = STATIC_CAST(
935
+ uint8_t, (next_argb1555[0] >> 5) | ((next_argb1555[1] & 0x03) << 3));
936
+ uint8_t r2 = STATIC_CAST(uint8_t, (next_argb1555[1] & 0x7c) >> 2);
937
+
938
+ b0 = STATIC_CAST(uint8_t, (b0 << 3) | (b0 >> 2));
939
+ g0 = STATIC_CAST(uint8_t, (g0 << 3) | (g0 >> 2));
940
+ r0 = STATIC_CAST(uint8_t, (r0 << 3) | (r0 >> 2));
941
+ b2 = STATIC_CAST(uint8_t, (b2 << 3) | (b2 >> 2));
942
+ g2 = STATIC_CAST(uint8_t, (g2 << 3) | (g2 >> 2));
943
+ r2 = STATIC_CAST(uint8_t, (r2 << 3) | (r2 >> 2));
944
+
945
+ uint8_t ab = AVGB(b0, b2);
946
+ uint8_t ag = AVGB(g0, g2);
947
+ uint8_t ar = AVGB(r0, r2);
948
+ dst_u[0] = RGBToU(ar, ag, ab);
949
+ dst_v[0] = RGBToV(ar, ag, ab);
950
+ }
951
+ }
952
+
953
+ void ARGB4444ToUVRow_C(const uint8_t* src_argb4444,
954
+ int src_stride_argb4444,
955
+ uint8_t* dst_u,
956
+ uint8_t* dst_v,
957
+ int width) {
958
+ const uint8_t* next_argb4444 = src_argb4444 + src_stride_argb4444;
959
+ int x;
960
+ for (x = 0; x < width - 1; x += 2) {
961
+ uint8_t b0 = src_argb4444[0] & 0x0f;
962
+ uint8_t g0 = src_argb4444[0] >> 4;
963
+ uint8_t r0 = src_argb4444[1] & 0x0f;
964
+ uint8_t b1 = src_argb4444[2] & 0x0f;
965
+ uint8_t g1 = src_argb4444[2] >> 4;
966
+ uint8_t r1 = src_argb4444[3] & 0x0f;
967
+ uint8_t b2 = next_argb4444[0] & 0x0f;
968
+ uint8_t g2 = next_argb4444[0] >> 4;
969
+ uint8_t r2 = next_argb4444[1] & 0x0f;
970
+ uint8_t b3 = next_argb4444[2] & 0x0f;
971
+ uint8_t g3 = next_argb4444[2] >> 4;
972
+ uint8_t r3 = next_argb4444[3] & 0x0f;
973
+
974
+ b0 = STATIC_CAST(uint8_t, (b0 << 4) | b0);
975
+ g0 = STATIC_CAST(uint8_t, (g0 << 4) | g0);
976
+ r0 = STATIC_CAST(uint8_t, (r0 << 4) | r0);
977
+ b1 = STATIC_CAST(uint8_t, (b1 << 4) | b1);
978
+ g1 = STATIC_CAST(uint8_t, (g1 << 4) | g1);
979
+ r1 = STATIC_CAST(uint8_t, (r1 << 4) | r1);
980
+ b2 = STATIC_CAST(uint8_t, (b2 << 4) | b2);
981
+ g2 = STATIC_CAST(uint8_t, (g2 << 4) | g2);
982
+ r2 = STATIC_CAST(uint8_t, (r2 << 4) | r2);
983
+ b3 = STATIC_CAST(uint8_t, (b3 << 4) | b3);
984
+ g3 = STATIC_CAST(uint8_t, (g3 << 4) | g3);
985
+ r3 = STATIC_CAST(uint8_t, (r3 << 4) | r3);
986
+
987
+ uint8_t b = (b0 + b1 + b2 + b3 + 2) >> 2;
988
+ uint8_t g = (g0 + g1 + g2 + g3 + 2) >> 2;
989
+ uint8_t r = (r0 + r1 + r2 + r3 + 2) >> 2;
990
+ dst_u[0] = RGBToU(r, g, b);
991
+ dst_v[0] = RGBToV(r, g, b);
992
+
993
+ src_argb4444 += 4;
994
+ next_argb4444 += 4;
995
+ dst_u += 1;
996
+ dst_v += 1;
997
+ }
998
+ if (width & 1) {
999
+ uint8_t b0 = src_argb4444[0] & 0x0f;
1000
+ uint8_t g0 = src_argb4444[0] >> 4;
1001
+ uint8_t r0 = src_argb4444[1] & 0x0f;
1002
+ uint8_t b2 = next_argb4444[0] & 0x0f;
1003
+ uint8_t g2 = next_argb4444[0] >> 4;
1004
+ uint8_t r2 = next_argb4444[1] & 0x0f;
1005
+
1006
+ b0 = STATIC_CAST(uint8_t, (b0 << 4) | b0);
1007
+ g0 = STATIC_CAST(uint8_t, (g0 << 4) | g0);
1008
+ r0 = STATIC_CAST(uint8_t, (r0 << 4) | r0);
1009
+ b2 = STATIC_CAST(uint8_t, (b2 << 4) | b2);
1010
+ g2 = STATIC_CAST(uint8_t, (g2 << 4) | g2);
1011
+ r2 = STATIC_CAST(uint8_t, (r2 << 4) | r2);
1012
+
1013
+ uint8_t ab = AVGB(b0, b2);
1014
+ uint8_t ag = AVGB(g0, g2);
1015
+ uint8_t ar = AVGB(r0, r2);
1016
+ dst_u[0] = RGBToU(ar, ag, ab);
1017
+ dst_v[0] = RGBToV(ar, ag, ab);
1018
+ }
1019
+ }
1020
+
1021
+ void ARGBToUV444Row_C(const uint8_t* src_argb,
1022
+ uint8_t* dst_u,
1023
+ uint8_t* dst_v,
1024
+ int width) {
1025
+ int x;
1026
+ for (x = 0; x < width; ++x) {
1027
+ uint8_t ab = src_argb[0];
1028
+ uint8_t ag = src_argb[1];
1029
+ uint8_t ar = src_argb[2];
1030
+ dst_u[0] = RGBToU(ar, ag, ab);
1031
+ dst_v[0] = RGBToV(ar, ag, ab);
1032
+ src_argb += 4;
1033
+ dst_u += 1;
1034
+ dst_v += 1;
1035
+ }
1036
+ }
1037
+
1038
+ void ARGBToUVJ444Row_C(const uint8_t* src_argb,
1039
+ uint8_t* dst_u,
1040
+ uint8_t* dst_v,
1041
+ int width) {
1042
+ int x;
1043
+ for (x = 0; x < width; ++x) {
1044
+ uint8_t ab = src_argb[0];
1045
+ uint8_t ag = src_argb[1];
1046
+ uint8_t ar = src_argb[2];
1047
+ dst_u[0] = RGBToUJ(ar, ag, ab);
1048
+ dst_v[0] = RGBToVJ(ar, ag, ab);
1049
+ src_argb += 4;
1050
+ dst_u += 1;
1051
+ dst_v += 1;
1052
+ }
1053
+ }
1054
+
1055
+ void ARGBGrayRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width) {
1056
+ int x;
1057
+ for (x = 0; x < width; ++x) {
1058
+ uint8_t y = RGBToYJ(src_argb[2], src_argb[1], src_argb[0]);
1059
+ dst_argb[2] = dst_argb[1] = dst_argb[0] = y;
1060
+ dst_argb[3] = src_argb[3];
1061
+ dst_argb += 4;
1062
+ src_argb += 4;
1063
+ }
1064
+ }
1065
+
1066
+ // Convert a row of image to Sepia tone.
1067
+ void ARGBSepiaRow_C(uint8_t* dst_argb, int width) {
1068
+ int x;
1069
+ for (x = 0; x < width; ++x) {
1070
+ int b = dst_argb[0];
1071
+ int g = dst_argb[1];
1072
+ int r = dst_argb[2];
1073
+ int sb = (b * 17 + g * 68 + r * 35) >> 7;
1074
+ int sg = (b * 22 + g * 88 + r * 45) >> 7;
1075
+ int sr = (b * 24 + g * 98 + r * 50) >> 7;
1076
+ // b does not over flow. a is preserved from original.
1077
+ dst_argb[0] = STATIC_CAST(uint8_t, sb);
1078
+ dst_argb[1] = STATIC_CAST(uint8_t, clamp255(sg));
1079
+ dst_argb[2] = STATIC_CAST(uint8_t, clamp255(sr));
1080
+ dst_argb += 4;
1081
+ }
1082
+ }
1083
+
1084
+ // Apply color matrix to a row of image. Matrix is signed.
1085
+ // TODO(fbarchard): Consider adding rounding (+32).
1086
+ void ARGBColorMatrixRow_C(const uint8_t* src_argb,
1087
+ uint8_t* dst_argb,
1088
+ const int8_t* matrix_argb,
1089
+ int width) {
1090
+ int x;
1091
+ for (x = 0; x < width; ++x) {
1092
+ int b = src_argb[0];
1093
+ int g = src_argb[1];
1094
+ int r = src_argb[2];
1095
+ int a = src_argb[3];
1096
+ int sb = (b * matrix_argb[0] + g * matrix_argb[1] + r * matrix_argb[2] +
1097
+ a * matrix_argb[3]) >>
1098
+ 6;
1099
+ int sg = (b * matrix_argb[4] + g * matrix_argb[5] + r * matrix_argb[6] +
1100
+ a * matrix_argb[7]) >>
1101
+ 6;
1102
+ int sr = (b * matrix_argb[8] + g * matrix_argb[9] + r * matrix_argb[10] +
1103
+ a * matrix_argb[11]) >>
1104
+ 6;
1105
+ int sa = (b * matrix_argb[12] + g * matrix_argb[13] + r * matrix_argb[14] +
1106
+ a * matrix_argb[15]) >>
1107
+ 6;
1108
+ dst_argb[0] = STATIC_CAST(uint8_t, Clamp(sb));
1109
+ dst_argb[1] = STATIC_CAST(uint8_t, Clamp(sg));
1110
+ dst_argb[2] = STATIC_CAST(uint8_t, Clamp(sr));
1111
+ dst_argb[3] = STATIC_CAST(uint8_t, Clamp(sa));
1112
+ src_argb += 4;
1113
+ dst_argb += 4;
1114
+ }
1115
+ }
1116
+
1117
+ // Apply color table to a row of image.
1118
+ void ARGBColorTableRow_C(uint8_t* dst_argb,
1119
+ const uint8_t* table_argb,
1120
+ int width) {
1121
+ int x;
1122
+ for (x = 0; x < width; ++x) {
1123
+ int b = dst_argb[0];
1124
+ int g = dst_argb[1];
1125
+ int r = dst_argb[2];
1126
+ int a = dst_argb[3];
1127
+ dst_argb[0] = table_argb[b * 4 + 0];
1128
+ dst_argb[1] = table_argb[g * 4 + 1];
1129
+ dst_argb[2] = table_argb[r * 4 + 2];
1130
+ dst_argb[3] = table_argb[a * 4 + 3];
1131
+ dst_argb += 4;
1132
+ }
1133
+ }
1134
+
1135
+ // Apply color table to a row of image.
1136
+ void RGBColorTableRow_C(uint8_t* dst_argb,
1137
+ const uint8_t* table_argb,
1138
+ int width) {
1139
+ int x;
1140
+ for (x = 0; x < width; ++x) {
1141
+ int b = dst_argb[0];
1142
+ int g = dst_argb[1];
1143
+ int r = dst_argb[2];
1144
+ dst_argb[0] = table_argb[b * 4 + 0];
1145
+ dst_argb[1] = table_argb[g * 4 + 1];
1146
+ dst_argb[2] = table_argb[r * 4 + 2];
1147
+ dst_argb += 4;
1148
+ }
1149
+ }
1150
+
1151
+ void ARGBQuantizeRow_C(uint8_t* dst_argb,
1152
+ int scale,
1153
+ int interval_size,
1154
+ int interval_offset,
1155
+ int width) {
1156
+ int x;
1157
+ for (x = 0; x < width; ++x) {
1158
+ int b = dst_argb[0];
1159
+ int g = dst_argb[1];
1160
+ int r = dst_argb[2];
1161
+ dst_argb[0] = STATIC_CAST(
1162
+ uint8_t, (b * scale >> 16) * interval_size + interval_offset);
1163
+ dst_argb[1] = STATIC_CAST(
1164
+ uint8_t, (g * scale >> 16) * interval_size + interval_offset);
1165
+ dst_argb[2] = STATIC_CAST(
1166
+ uint8_t, (r * scale >> 16) * interval_size + interval_offset);
1167
+ dst_argb += 4;
1168
+ }
1169
+ }
1170
+
1171
+ #define REPEAT8(v) (v) | ((v) << 8)
1172
+ #define SHADE(f, v) v* f >> 24
1173
+
1174
+ void ARGBShadeRow_C(const uint8_t* src_argb,
1175
+ uint8_t* dst_argb,
1176
+ int width,
1177
+ uint32_t value) {
1178
+ const uint32_t b_scale = REPEAT8(value & 0xff);
1179
+ const uint32_t g_scale = REPEAT8((value >> 8) & 0xff);
1180
+ const uint32_t r_scale = REPEAT8((value >> 16) & 0xff);
1181
+ const uint32_t a_scale = REPEAT8(value >> 24);
1182
+
1183
+ int i;
1184
+ for (i = 0; i < width; ++i) {
1185
+ const uint32_t b = REPEAT8(src_argb[0]);
1186
+ const uint32_t g = REPEAT8(src_argb[1]);
1187
+ const uint32_t r = REPEAT8(src_argb[2]);
1188
+ const uint32_t a = REPEAT8(src_argb[3]);
1189
+ dst_argb[0] = SHADE(b, b_scale);
1190
+ dst_argb[1] = SHADE(g, g_scale);
1191
+ dst_argb[2] = SHADE(r, r_scale);
1192
+ dst_argb[3] = SHADE(a, a_scale);
1193
+ src_argb += 4;
1194
+ dst_argb += 4;
1195
+ }
1196
+ }
1197
+ #undef REPEAT8
1198
+ #undef SHADE
1199
+
1200
+ void ARGBMultiplyRow_C(const uint8_t* src_argb,
1201
+ const uint8_t* src_argb1,
1202
+ uint8_t* dst_argb,
1203
+ int width) {
1204
+ int i;
1205
+ for (i = 0; i < width; ++i) {
1206
+ const uint32_t b = src_argb[0];
1207
+ const uint32_t g = src_argb[1];
1208
+ const uint32_t r = src_argb[2];
1209
+ const uint32_t a = src_argb[3];
1210
+ const uint32_t b_scale = src_argb1[0];
1211
+ const uint32_t g_scale = src_argb1[1];
1212
+ const uint32_t r_scale = src_argb1[2];
1213
+ const uint32_t a_scale = src_argb1[3];
1214
+ dst_argb[0] = STATIC_CAST(uint8_t, (b * b_scale + 128) >> 8);
1215
+ dst_argb[1] = STATIC_CAST(uint8_t, (g * g_scale + 128) >> 8);
1216
+ dst_argb[2] = STATIC_CAST(uint8_t, (r * r_scale + 128) >> 8);
1217
+ dst_argb[3] = STATIC_CAST(uint8_t, (a * a_scale + 128) >> 8);
1218
+ src_argb += 4;
1219
+ src_argb1 += 4;
1220
+ dst_argb += 4;
1221
+ }
1222
+ }
1223
+
1224
+ #define SHADE(f, v) clamp255(v + f)
1225
+
1226
+ void ARGBAddRow_C(const uint8_t* src_argb,
1227
+ const uint8_t* src_argb1,
1228
+ uint8_t* dst_argb,
1229
+ int width) {
1230
+ int i;
1231
+ for (i = 0; i < width; ++i) {
1232
+ const int b = src_argb[0];
1233
+ const int g = src_argb[1];
1234
+ const int r = src_argb[2];
1235
+ const int a = src_argb[3];
1236
+ const int b_add = src_argb1[0];
1237
+ const int g_add = src_argb1[1];
1238
+ const int r_add = src_argb1[2];
1239
+ const int a_add = src_argb1[3];
1240
+ dst_argb[0] = STATIC_CAST(uint8_t, SHADE(b, b_add));
1241
+ dst_argb[1] = STATIC_CAST(uint8_t, SHADE(g, g_add));
1242
+ dst_argb[2] = STATIC_CAST(uint8_t, SHADE(r, r_add));
1243
+ dst_argb[3] = STATIC_CAST(uint8_t, SHADE(a, a_add));
1244
+ src_argb += 4;
1245
+ src_argb1 += 4;
1246
+ dst_argb += 4;
1247
+ }
1248
+ }
1249
+ #undef SHADE
1250
+
1251
+ #define SHADE(f, v) clamp0(f - v)
1252
+
1253
+ void ARGBSubtractRow_C(const uint8_t* src_argb,
1254
+ const uint8_t* src_argb1,
1255
+ uint8_t* dst_argb,
1256
+ int width) {
1257
+ int i;
1258
+ for (i = 0; i < width; ++i) {
1259
+ const int b = src_argb[0];
1260
+ const int g = src_argb[1];
1261
+ const int r = src_argb[2];
1262
+ const int a = src_argb[3];
1263
+ const int b_sub = src_argb1[0];
1264
+ const int g_sub = src_argb1[1];
1265
+ const int r_sub = src_argb1[2];
1266
+ const int a_sub = src_argb1[3];
1267
+ dst_argb[0] = STATIC_CAST(uint8_t, SHADE(b, b_sub));
1268
+ dst_argb[1] = STATIC_CAST(uint8_t, SHADE(g, g_sub));
1269
+ dst_argb[2] = STATIC_CAST(uint8_t, SHADE(r, r_sub));
1270
+ dst_argb[3] = STATIC_CAST(uint8_t, SHADE(a, a_sub));
1271
+ src_argb += 4;
1272
+ src_argb1 += 4;
1273
+ dst_argb += 4;
1274
+ }
1275
+ }
1276
+ #undef SHADE
1277
+
1278
+ // Sobel functions which mimics SSSE3.
1279
+ void SobelXRow_C(const uint8_t* src_y0,
1280
+ const uint8_t* src_y1,
1281
+ const uint8_t* src_y2,
1282
+ uint8_t* dst_sobelx,
1283
+ int width) {
1284
+ int i;
1285
+ for (i = 0; i < width; ++i) {
1286
+ int a = src_y0[i];
1287
+ int b = src_y1[i];
1288
+ int c = src_y2[i];
1289
+ int a_sub = src_y0[i + 2];
1290
+ int b_sub = src_y1[i + 2];
1291
+ int c_sub = src_y2[i + 2];
1292
+ int a_diff = a - a_sub;
1293
+ int b_diff = b - b_sub;
1294
+ int c_diff = c - c_sub;
1295
+ int sobel = Abs(a_diff + b_diff * 2 + c_diff);
1296
+ dst_sobelx[i] = (uint8_t)(clamp255(sobel));
1297
+ }
1298
+ }
1299
+
1300
+ void SobelYRow_C(const uint8_t* src_y0,
1301
+ const uint8_t* src_y1,
1302
+ uint8_t* dst_sobely,
1303
+ int width) {
1304
+ int i;
1305
+ for (i = 0; i < width; ++i) {
1306
+ int a = src_y0[i + 0];
1307
+ int b = src_y0[i + 1];
1308
+ int c = src_y0[i + 2];
1309
+ int a_sub = src_y1[i + 0];
1310
+ int b_sub = src_y1[i + 1];
1311
+ int c_sub = src_y1[i + 2];
1312
+ int a_diff = a - a_sub;
1313
+ int b_diff = b - b_sub;
1314
+ int c_diff = c - c_sub;
1315
+ int sobel = Abs(a_diff + b_diff * 2 + c_diff);
1316
+ dst_sobely[i] = (uint8_t)(clamp255(sobel));
1317
+ }
1318
+ }
1319
+
1320
+ void SobelRow_C(const uint8_t* src_sobelx,
1321
+ const uint8_t* src_sobely,
1322
+ uint8_t* dst_argb,
1323
+ int width) {
1324
+ int i;
1325
+ for (i = 0; i < width; ++i) {
1326
+ int r = src_sobelx[i];
1327
+ int b = src_sobely[i];
1328
+ int s = clamp255(r + b);
1329
+ dst_argb[0] = (uint8_t)(s);
1330
+ dst_argb[1] = (uint8_t)(s);
1331
+ dst_argb[2] = (uint8_t)(s);
1332
+ dst_argb[3] = (uint8_t)(255u);
1333
+ dst_argb += 4;
1334
+ }
1335
+ }
1336
+
1337
+ void SobelToPlaneRow_C(const uint8_t* src_sobelx,
1338
+ const uint8_t* src_sobely,
1339
+ uint8_t* dst_y,
1340
+ int width) {
1341
+ int i;
1342
+ for (i = 0; i < width; ++i) {
1343
+ int r = src_sobelx[i];
1344
+ int b = src_sobely[i];
1345
+ int s = clamp255(r + b);
1346
+ dst_y[i] = (uint8_t)(s);
1347
+ }
1348
+ }
1349
+
1350
+ void SobelXYRow_C(const uint8_t* src_sobelx,
1351
+ const uint8_t* src_sobely,
1352
+ uint8_t* dst_argb,
1353
+ int width) {
1354
+ int i;
1355
+ for (i = 0; i < width; ++i) {
1356
+ int r = src_sobelx[i];
1357
+ int b = src_sobely[i];
1358
+ int g = clamp255(r + b);
1359
+ dst_argb[0] = (uint8_t)(b);
1360
+ dst_argb[1] = (uint8_t)(g);
1361
+ dst_argb[2] = (uint8_t)(r);
1362
+ dst_argb[3] = (uint8_t)(255u);
1363
+ dst_argb += 4;
1364
+ }
1365
+ }
1366
+
1367
+ void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width) {
1368
+ // Copy a Y to RGB.
1369
+ int x;
1370
+ for (x = 0; x < width; ++x) {
1371
+ uint8_t y = src_y[0];
1372
+ dst_argb[2] = dst_argb[1] = dst_argb[0] = y;
1373
+ dst_argb[3] = 255u;
1374
+ dst_argb += 4;
1375
+ ++src_y;
1376
+ }
1377
+ }
1378
+
1379
+ // Macros to create SIMD specific yuv to rgb conversion constants.
1380
+
1381
+ // clang-format off
1382
+
1383
+ #if defined(__aarch64__) || defined(__arm__) || defined(__riscv)
1384
+ // Bias values include subtract 128 from U and V, bias from Y and rounding.
1385
+ // For B and R bias is negative. For G bias is positive.
1386
+ #define YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR) \
1387
+ {{UB, VR, UG, VG, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
1388
+ {YG, (UB * 128 - YB), (UG * 128 + VG * 128 + YB), (VR * 128 - YB), YB, 0, \
1389
+ 0, 0}}
1390
+ #else
1391
+ #define YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR) \
1392
+ {{UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, \
1393
+ UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, \
1394
+ {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, \
1395
+ UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, \
1396
+ {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, \
1397
+ 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, \
1398
+ {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, \
1399
+ {YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB}}
1400
+ #endif
1401
+
1402
+ // clang-format on
1403
+
1404
+ #define MAKEYUVCONSTANTS(name, YG, YB, UB, UG, VG, VR) \
1405
+ const struct YuvConstants SIMD_ALIGNED(kYuv##name##Constants) = \
1406
+ YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR); \
1407
+ const struct YuvConstants SIMD_ALIGNED(kYvu##name##Constants) = \
1408
+ YUVCONSTANTSBODY(YG, YB, VR, VG, UG, UB);
1409
+
1410
+ // TODO(fbarchard): Generate SIMD structures from float matrix.
1411
+
1412
+ // BT.601 limited range YUV to RGB reference
1413
+ // R = (Y - 16) * 1.164 + V * 1.596
1414
+ // G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813
1415
+ // B = (Y - 16) * 1.164 + U * 2.018
1416
+ // KR = 0.299; KB = 0.114
1417
+
1418
+ // U and V contributions to R,G,B.
1419
+ #if defined(LIBYUV_UNLIMITED_DATA) || defined(LIBYUV_UNLIMITED_BT601)
1420
+ #define UB 129 /* round(2.018 * 64) */
1421
+ #else
1422
+ #define UB 128 /* max(128, round(2.018 * 64)) */
1423
+ #endif
1424
+ #define UG 25 /* round(0.391 * 64) */
1425
+ #define VG 52 /* round(0.813 * 64) */
1426
+ #define VR 102 /* round(1.596 * 64) */
1427
+
1428
+ // Y contribution to R,G,B. Scale and bias.
1429
+ #define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */
1430
+ #define YB -1160 /* 1.164 * 64 * -16 + 64 / 2 */
1431
+
1432
+ MAKEYUVCONSTANTS(I601, YG, YB, UB, UG, VG, VR)
1433
+
1434
+ #undef YG
1435
+ #undef YB
1436
+ #undef UB
1437
+ #undef UG
1438
+ #undef VG
1439
+ #undef VR
1440
+
1441
+ // BT.601 full range YUV to RGB reference (aka JPEG)
1442
+ // * R = Y + V * 1.40200
1443
+ // * G = Y - U * 0.34414 - V * 0.71414
1444
+ // * B = Y + U * 1.77200
1445
+ // KR = 0.299; KB = 0.114
1446
+
1447
+ // U and V contributions to R,G,B.
1448
+ #define UB 113 /* round(1.77200 * 64) */
1449
+ #define UG 22 /* round(0.34414 * 64) */
1450
+ #define VG 46 /* round(0.71414 * 64) */
1451
+ #define VR 90 /* round(1.40200 * 64) */
1452
+
1453
+ // Y contribution to R,G,B. Scale and bias.
1454
+ #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */
1455
+ #define YB 32 /* 64 / 2 */
1456
+
1457
+ MAKEYUVCONSTANTS(JPEG, YG, YB, UB, UG, VG, VR)
1458
+
1459
+ #undef YG
1460
+ #undef YB
1461
+ #undef UB
1462
+ #undef UG
1463
+ #undef VG
1464
+ #undef VR
1465
+
1466
+ // BT.709 limited range YUV to RGB reference
1467
+ // R = (Y - 16) * 1.164 + V * 1.793
1468
+ // G = (Y - 16) * 1.164 - U * 0.213 - V * 0.533
1469
+ // B = (Y - 16) * 1.164 + U * 2.112
1470
+ // KR = 0.2126, KB = 0.0722
1471
+
1472
+ // U and V contributions to R,G,B.
1473
+ #if defined(LIBYUV_UNLIMITED_DATA) || defined(LIBYUV_UNLIMITED_BT709)
1474
+ #define UB 135 /* round(2.112 * 64) */
1475
+ #else
1476
+ #define UB 128 /* max(128, round(2.112 * 64)) */
1477
+ #endif
1478
+ #define UG 14 /* round(0.213 * 64) */
1479
+ #define VG 34 /* round(0.533 * 64) */
1480
+ #define VR 115 /* round(1.793 * 64) */
1481
+
1482
+ // Y contribution to R,G,B. Scale and bias.
1483
+ #define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */
1484
+ #define YB -1160 /* 1.164 * 64 * -16 + 64 / 2 */
1485
+
1486
+ MAKEYUVCONSTANTS(H709, YG, YB, UB, UG, VG, VR)
1487
+
1488
+ #undef YG
1489
+ #undef YB
1490
+ #undef UB
1491
+ #undef UG
1492
+ #undef VG
1493
+ #undef VR
1494
+
1495
+ // BT.709 full range YUV to RGB reference
1496
+ // R = Y + V * 1.5748
1497
+ // G = Y - U * 0.18732 - V * 0.46812
1498
+ // B = Y + U * 1.8556
1499
+ // KR = 0.2126, KB = 0.0722
1500
+
1501
+ // U and V contributions to R,G,B.
1502
+ #define UB 119 /* round(1.8556 * 64) */
1503
+ #define UG 12 /* round(0.18732 * 64) */
1504
+ #define VG 30 /* round(0.46812 * 64) */
1505
+ #define VR 101 /* round(1.5748 * 64) */
1506
+
1507
+ // Y contribution to R,G,B. Scale and bias. (same as jpeg)
1508
+ #define YG 16320 /* round(1 * 64 * 256 * 256 / 257) */
1509
+ #define YB 32 /* 64 / 2 */
1510
+
1511
+ MAKEYUVCONSTANTS(F709, YG, YB, UB, UG, VG, VR)
1512
+
1513
+ #undef YG
1514
+ #undef YB
1515
+ #undef UB
1516
+ #undef UG
1517
+ #undef VG
1518
+ #undef VR
1519
+
1520
+ // BT.2020 limited range YUV to RGB reference
1521
+ // R = (Y - 16) * 1.164384 + V * 1.67867
1522
+ // G = (Y - 16) * 1.164384 - U * 0.187326 - V * 0.65042
1523
+ // B = (Y - 16) * 1.164384 + U * 2.14177
1524
+ // KR = 0.2627; KB = 0.0593
1525
+
1526
+ // U and V contributions to R,G,B.
1527
+ #if defined(LIBYUV_UNLIMITED_DATA) || defined(LIBYUV_UNLIMITED_BT2020)
1528
+ #define UB 137 /* round(2.142 * 64) */
1529
+ #else
1530
+ #define UB 128 /* max(128, round(2.142 * 64)) */
1531
+ #endif
1532
+ #define UG 12 /* round(0.187326 * 64) */
1533
+ #define VG 42 /* round(0.65042 * 64) */
1534
+ #define VR 107 /* round(1.67867 * 64) */
1535
+
1536
+ // Y contribution to R,G,B. Scale and bias.
1537
+ #define YG 19003 /* round(1.164384 * 64 * 256 * 256 / 257) */
1538
+ #define YB -1160 /* 1.164384 * 64 * -16 + 64 / 2 */
1539
+
1540
+ MAKEYUVCONSTANTS(2020, YG, YB, UB, UG, VG, VR)
1541
+
1542
+ #undef YG
1543
+ #undef YB
1544
+ #undef UB
1545
+ #undef UG
1546
+ #undef VG
1547
+ #undef VR
1548
+
1549
+ // BT.2020 full range YUV to RGB reference
1550
+ // R = Y + V * 1.474600
1551
+ // G = Y - U * 0.164553 - V * 0.571353
1552
+ // B = Y + U * 1.881400
1553
+ // KR = 0.2627; KB = 0.0593
1554
+
1555
+ #define UB 120 /* round(1.881400 * 64) */
1556
+ #define UG 11 /* round(0.164553 * 64) */
1557
+ #define VG 37 /* round(0.571353 * 64) */
1558
+ #define VR 94 /* round(1.474600 * 64) */
1559
+
1560
+ // Y contribution to R,G,B. Scale and bias. (same as jpeg)
1561
+ #define YG 16320 /* round(1 * 64 * 256 * 256 / 257) */
1562
+ #define YB 32 /* 64 / 2 */
1563
+
1564
+ MAKEYUVCONSTANTS(V2020, YG, YB, UB, UG, VG, VR)
1565
+
1566
+ #undef YG
1567
+ #undef YB
1568
+ #undef UB
1569
+ #undef UG
1570
+ #undef VG
1571
+ #undef VR
1572
+
1573
+ #undef BB
1574
+ #undef BG
1575
+ #undef BR
1576
+
1577
+ #undef MAKEYUVCONSTANTS
1578
+
1579
+ #if defined(__aarch64__) || defined(__arm__) || defined(__riscv)
1580
+ #define LOAD_YUV_CONSTANTS \
1581
+ int ub = yuvconstants->kUVCoeff[0]; \
1582
+ int vr = yuvconstants->kUVCoeff[1]; \
1583
+ int ug = yuvconstants->kUVCoeff[2]; \
1584
+ int vg = yuvconstants->kUVCoeff[3]; \
1585
+ int yg = yuvconstants->kRGBCoeffBias[0]; \
1586
+ int bb = yuvconstants->kRGBCoeffBias[1]; \
1587
+ int bg = yuvconstants->kRGBCoeffBias[2]; \
1588
+ int br = yuvconstants->kRGBCoeffBias[3]
1589
+
1590
+ #define CALC_RGB16 \
1591
+ int32_t y1 = (uint32_t)(y32 * yg) >> 16; \
1592
+ int b16 = y1 + (u * ub) - bb; \
1593
+ int g16 = y1 + bg - (u * ug + v * vg); \
1594
+ int r16 = y1 + (v * vr) - br
1595
+ #else
1596
+ #define LOAD_YUV_CONSTANTS \
1597
+ int ub = yuvconstants->kUVToB[0]; \
1598
+ int ug = yuvconstants->kUVToG[0]; \
1599
+ int vg = yuvconstants->kUVToG[1]; \
1600
+ int vr = yuvconstants->kUVToR[1]; \
1601
+ int yg = yuvconstants->kYToRgb[0]; \
1602
+ int yb = yuvconstants->kYBiasToRgb[0]
1603
+
1604
+ #define CALC_RGB16 \
1605
+ int32_t y1 = ((uint32_t)(y32 * yg) >> 16) + yb; \
1606
+ int8_t ui = (int8_t)u; \
1607
+ int8_t vi = (int8_t)v; \
1608
+ ui -= 0x80; \
1609
+ vi -= 0x80; \
1610
+ int b16 = y1 + (ui * ub); \
1611
+ int g16 = y1 - (ui * ug + vi * vg); \
1612
+ int r16 = y1 + (vi * vr)
1613
+ #endif
1614
+
1615
+ // C reference code that mimics the YUV assembly.
1616
+ // Reads 8 bit YUV and leaves result as 16 bit.
1617
+ static __inline void YuvPixel(uint8_t y,
1618
+ uint8_t u,
1619
+ uint8_t v,
1620
+ uint8_t* b,
1621
+ uint8_t* g,
1622
+ uint8_t* r,
1623
+ const struct YuvConstants* yuvconstants) {
1624
+ LOAD_YUV_CONSTANTS;
1625
+ uint32_t y32 = y * 0x0101;
1626
+ CALC_RGB16;
1627
+ *b = STATIC_CAST(uint8_t, Clamp((int32_t)(b16) >> 6));
1628
+ *g = STATIC_CAST(uint8_t, Clamp((int32_t)(g16) >> 6));
1629
+ *r = STATIC_CAST(uint8_t, Clamp((int32_t)(r16) >> 6));
1630
+ }
1631
+
1632
+ // Reads 8 bit YUV and leaves result as 16 bit.
1633
+ static __inline void YuvPixel8_16(uint8_t y,
1634
+ uint8_t u,
1635
+ uint8_t v,
1636
+ int* b,
1637
+ int* g,
1638
+ int* r,
1639
+ const struct YuvConstants* yuvconstants) {
1640
+ LOAD_YUV_CONSTANTS;
1641
+ uint32_t y32 = y * 0x0101;
1642
+ CALC_RGB16;
1643
+ *b = b16;
1644
+ *g = g16;
1645
+ *r = r16;
1646
+ }
1647
+
1648
+ // C reference code that mimics the YUV 16 bit assembly.
1649
+ // Reads 10 bit YUV and leaves result as 16 bit.
1650
+ static __inline void YuvPixel10_16(uint16_t y,
1651
+ uint16_t u,
1652
+ uint16_t v,
1653
+ int* b,
1654
+ int* g,
1655
+ int* r,
1656
+ const struct YuvConstants* yuvconstants) {
1657
+ LOAD_YUV_CONSTANTS;
1658
+ uint32_t y32 = (y << 6) | (y >> 4);
1659
+ u = STATIC_CAST(uint8_t, clamp255(u >> 2));
1660
+ v = STATIC_CAST(uint8_t, clamp255(v >> 2));
1661
+ CALC_RGB16;
1662
+ *b = b16;
1663
+ *g = g16;
1664
+ *r = r16;
1665
+ }
1666
+
1667
+ // C reference code that mimics the YUV 16 bit assembly.
1668
+ // Reads 12 bit YUV and leaves result as 16 bit.
1669
+ static __inline void YuvPixel12_16(int16_t y,
1670
+ int16_t u,
1671
+ int16_t v,
1672
+ int* b,
1673
+ int* g,
1674
+ int* r,
1675
+ const struct YuvConstants* yuvconstants) {
1676
+ LOAD_YUV_CONSTANTS;
1677
+ uint32_t y32 = (y << 4) | (y >> 8);
1678
+ u = STATIC_CAST(uint8_t, clamp255(u >> 4));
1679
+ v = STATIC_CAST(uint8_t, clamp255(v >> 4));
1680
+ CALC_RGB16;
1681
+ *b = b16;
1682
+ *g = g16;
1683
+ *r = r16;
1684
+ }
1685
+
1686
+ // C reference code that mimics the YUV 10 bit assembly.
1687
+ // Reads 10 bit YUV and clamps down to 8 bit RGB.
1688
+ static __inline void YuvPixel10(uint16_t y,
1689
+ uint16_t u,
1690
+ uint16_t v,
1691
+ uint8_t* b,
1692
+ uint8_t* g,
1693
+ uint8_t* r,
1694
+ const struct YuvConstants* yuvconstants) {
1695
+ int b16;
1696
+ int g16;
1697
+ int r16;
1698
+ YuvPixel10_16(y, u, v, &b16, &g16, &r16, yuvconstants);
1699
+ *b = STATIC_CAST(uint8_t, Clamp(b16 >> 6));
1700
+ *g = STATIC_CAST(uint8_t, Clamp(g16 >> 6));
1701
+ *r = STATIC_CAST(uint8_t, Clamp(r16 >> 6));
1702
+ }
1703
+
1704
+ // C reference code that mimics the YUV 12 bit assembly.
1705
+ // Reads 12 bit YUV and clamps down to 8 bit RGB.
1706
+ static __inline void YuvPixel12(uint16_t y,
1707
+ uint16_t u,
1708
+ uint16_t v,
1709
+ uint8_t* b,
1710
+ uint8_t* g,
1711
+ uint8_t* r,
1712
+ const struct YuvConstants* yuvconstants) {
1713
+ int b16;
1714
+ int g16;
1715
+ int r16;
1716
+ YuvPixel12_16(y, u, v, &b16, &g16, &r16, yuvconstants);
1717
+ *b = STATIC_CAST(uint8_t, Clamp(b16 >> 6));
1718
+ *g = STATIC_CAST(uint8_t, Clamp(g16 >> 6));
1719
+ *r = STATIC_CAST(uint8_t, Clamp(r16 >> 6));
1720
+ }
1721
+
1722
+ // C reference code that mimics the YUV 16 bit assembly.
1723
+ // Reads 16 bit YUV and leaves result as 8 bit.
1724
+ static __inline void YuvPixel16_8(uint16_t y,
1725
+ uint16_t u,
1726
+ uint16_t v,
1727
+ uint8_t* b,
1728
+ uint8_t* g,
1729
+ uint8_t* r,
1730
+ const struct YuvConstants* yuvconstants) {
1731
+ LOAD_YUV_CONSTANTS;
1732
+ uint32_t y32 = y;
1733
+ u = STATIC_CAST(uint16_t, clamp255(u >> 8));
1734
+ v = STATIC_CAST(uint16_t, clamp255(v >> 8));
1735
+ CALC_RGB16;
1736
+ *b = STATIC_CAST(uint8_t, Clamp((int32_t)(b16) >> 6));
1737
+ *g = STATIC_CAST(uint8_t, Clamp((int32_t)(g16) >> 6));
1738
+ *r = STATIC_CAST(uint8_t, Clamp((int32_t)(r16) >> 6));
1739
+ }
1740
+
1741
+ // C reference code that mimics the YUV 16 bit assembly.
1742
+ // Reads 16 bit YUV and leaves result as 16 bit.
1743
+ static __inline void YuvPixel16_16(uint16_t y,
1744
+ uint16_t u,
1745
+ uint16_t v,
1746
+ int* b,
1747
+ int* g,
1748
+ int* r,
1749
+ const struct YuvConstants* yuvconstants) {
1750
+ LOAD_YUV_CONSTANTS;
1751
+ uint32_t y32 = y;
1752
+ u = STATIC_CAST(uint16_t, clamp255(u >> 8));
1753
+ v = STATIC_CAST(uint16_t, clamp255(v >> 8));
1754
+ CALC_RGB16;
1755
+ *b = b16;
1756
+ *g = g16;
1757
+ *r = r16;
1758
+ }
1759
+
1760
+ // C reference code that mimics the YUV assembly.
1761
+ // Reads 8 bit YUV and leaves result as 8 bit.
1762
+ static __inline void YPixel(uint8_t y,
1763
+ uint8_t* b,
1764
+ uint8_t* g,
1765
+ uint8_t* r,
1766
+ const struct YuvConstants* yuvconstants) {
1767
+ #if defined(__aarch64__) || defined(__arm__) || defined(__riscv)
1768
+ int yg = yuvconstants->kRGBCoeffBias[0];
1769
+ int ygb = yuvconstants->kRGBCoeffBias[4];
1770
+ #else
1771
+ int ygb = yuvconstants->kYBiasToRgb[0];
1772
+ int yg = yuvconstants->kYToRgb[0];
1773
+ #endif
1774
+ uint32_t y1 = (uint32_t)(y * 0x0101 * yg) >> 16;
1775
+ uint8_t b8 = STATIC_CAST(uint8_t, Clamp(((int32_t)(y1) + ygb) >> 6));
1776
+ *b = b8;
1777
+ *g = b8;
1778
+ *r = b8;
1779
+ }
1780
+
1781
+ void I444ToARGBRow_C(const uint8_t* src_y,
1782
+ const uint8_t* src_u,
1783
+ const uint8_t* src_v,
1784
+ uint8_t* rgb_buf,
1785
+ const struct YuvConstants* yuvconstants,
1786
+ int width) {
1787
+ int x;
1788
+ for (x = 0; x < width; ++x) {
1789
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1790
+ rgb_buf + 2, yuvconstants);
1791
+ rgb_buf[3] = 255;
1792
+ src_y += 1;
1793
+ src_u += 1;
1794
+ src_v += 1;
1795
+ rgb_buf += 4; // Advance 1 pixel.
1796
+ }
1797
+ }
1798
+
1799
+ void I444ToRGB24Row_C(const uint8_t* src_y,
1800
+ const uint8_t* src_u,
1801
+ const uint8_t* src_v,
1802
+ uint8_t* rgb_buf,
1803
+ const struct YuvConstants* yuvconstants,
1804
+ int width) {
1805
+ int x;
1806
+ for (x = 0; x < width; ++x) {
1807
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1808
+ rgb_buf + 2, yuvconstants);
1809
+ src_y += 1;
1810
+ src_u += 1;
1811
+ src_v += 1;
1812
+ rgb_buf += 3; // Advance 1 pixel.
1813
+ }
1814
+ }
1815
+
1816
+ // Also used for 420
1817
+ void I422ToARGBRow_C(const uint8_t* src_y,
1818
+ const uint8_t* src_u,
1819
+ const uint8_t* src_v,
1820
+ uint8_t* rgb_buf,
1821
+ const struct YuvConstants* yuvconstants,
1822
+ int width) {
1823
+ int x;
1824
+ for (x = 0; x < width - 1; x += 2) {
1825
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1826
+ rgb_buf + 2, yuvconstants);
1827
+ rgb_buf[3] = 255;
1828
+ YuvPixel(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5,
1829
+ rgb_buf + 6, yuvconstants);
1830
+ rgb_buf[7] = 255;
1831
+ src_y += 2;
1832
+ src_u += 1;
1833
+ src_v += 1;
1834
+ rgb_buf += 8; // Advance 2 pixels.
1835
+ }
1836
+ if (width & 1) {
1837
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1838
+ rgb_buf + 2, yuvconstants);
1839
+ rgb_buf[3] = 255;
1840
+ }
1841
+ }
1842
+
1843
+ // 10 bit YUV to ARGB
1844
+ void I210ToARGBRow_C(const uint16_t* src_y,
1845
+ const uint16_t* src_u,
1846
+ const uint16_t* src_v,
1847
+ uint8_t* rgb_buf,
1848
+ const struct YuvConstants* yuvconstants,
1849
+ int width) {
1850
+ int x;
1851
+ for (x = 0; x < width - 1; x += 2) {
1852
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1853
+ rgb_buf + 2, yuvconstants);
1854
+ rgb_buf[3] = 255;
1855
+ YuvPixel10(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5,
1856
+ rgb_buf + 6, yuvconstants);
1857
+ rgb_buf[7] = 255;
1858
+ src_y += 2;
1859
+ src_u += 1;
1860
+ src_v += 1;
1861
+ rgb_buf += 8; // Advance 2 pixels.
1862
+ }
1863
+ if (width & 1) {
1864
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1865
+ rgb_buf + 2, yuvconstants);
1866
+ rgb_buf[3] = 255;
1867
+ }
1868
+ }
1869
+
1870
+ void I410ToARGBRow_C(const uint16_t* src_y,
1871
+ const uint16_t* src_u,
1872
+ const uint16_t* src_v,
1873
+ uint8_t* rgb_buf,
1874
+ const struct YuvConstants* yuvconstants,
1875
+ int width) {
1876
+ int x;
1877
+ for (x = 0; x < width; ++x) {
1878
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1879
+ rgb_buf + 2, yuvconstants);
1880
+ rgb_buf[3] = 255;
1881
+ src_y += 1;
1882
+ src_u += 1;
1883
+ src_v += 1;
1884
+ rgb_buf += 4; // Advance 1 pixels.
1885
+ }
1886
+ }
1887
+
1888
+ void I210AlphaToARGBRow_C(const uint16_t* src_y,
1889
+ const uint16_t* src_u,
1890
+ const uint16_t* src_v,
1891
+ const uint16_t* src_a,
1892
+ uint8_t* rgb_buf,
1893
+ const struct YuvConstants* yuvconstants,
1894
+ int width) {
1895
+ int x;
1896
+ for (x = 0; x < width - 1; x += 2) {
1897
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1898
+ rgb_buf + 2, yuvconstants);
1899
+ rgb_buf[3] = STATIC_CAST(uint8_t, clamp255(src_a[0] >> 2));
1900
+ YuvPixel10(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5,
1901
+ rgb_buf + 6, yuvconstants);
1902
+ rgb_buf[7] = STATIC_CAST(uint8_t, clamp255(src_a[1] >> 2));
1903
+ src_y += 2;
1904
+ src_u += 1;
1905
+ src_v += 1;
1906
+ src_a += 2;
1907
+ rgb_buf += 8; // Advance 2 pixels.
1908
+ }
1909
+ if (width & 1) {
1910
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1911
+ rgb_buf + 2, yuvconstants);
1912
+ rgb_buf[3] = STATIC_CAST(uint8_t, clamp255(src_a[0] >> 2));
1913
+ }
1914
+ }
1915
+
1916
+ void I410AlphaToARGBRow_C(const uint16_t* src_y,
1917
+ const uint16_t* src_u,
1918
+ const uint16_t* src_v,
1919
+ const uint16_t* src_a,
1920
+ uint8_t* rgb_buf,
1921
+ const struct YuvConstants* yuvconstants,
1922
+ int width) {
1923
+ int x;
1924
+ for (x = 0; x < width; ++x) {
1925
+ YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1926
+ rgb_buf + 2, yuvconstants);
1927
+ rgb_buf[3] = STATIC_CAST(uint8_t, clamp255(src_a[0] >> 2));
1928
+ src_y += 1;
1929
+ src_u += 1;
1930
+ src_v += 1;
1931
+ src_a += 1;
1932
+ rgb_buf += 4; // Advance 1 pixels.
1933
+ }
1934
+ }
1935
+
1936
+ // 12 bit YUV to ARGB
1937
+ void I212ToARGBRow_C(const uint16_t* src_y,
1938
+ const uint16_t* src_u,
1939
+ const uint16_t* src_v,
1940
+ uint8_t* rgb_buf,
1941
+ const struct YuvConstants* yuvconstants,
1942
+ int width) {
1943
+ int x;
1944
+ for (x = 0; x < width - 1; x += 2) {
1945
+ YuvPixel12(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1946
+ rgb_buf + 2, yuvconstants);
1947
+ rgb_buf[3] = 255;
1948
+ YuvPixel12(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5,
1949
+ rgb_buf + 6, yuvconstants);
1950
+ rgb_buf[7] = 255;
1951
+ src_y += 2;
1952
+ src_u += 1;
1953
+ src_v += 1;
1954
+ rgb_buf += 8; // Advance 2 pixels.
1955
+ }
1956
+ if (width & 1) {
1957
+ YuvPixel12(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
1958
+ rgb_buf + 2, yuvconstants);
1959
+ rgb_buf[3] = 255;
1960
+ }
1961
+ }
1962
+
1963
+ static void StoreAR30(uint8_t* rgb_buf, int b, int g, int r) {
1964
+ uint32_t ar30;
1965
+ b = b >> 4; // convert 8 bit 10.6 to 10 bit.
1966
+ g = g >> 4;
1967
+ r = r >> 4;
1968
+ b = Clamp10(b);
1969
+ g = Clamp10(g);
1970
+ r = Clamp10(r);
1971
+ ar30 = b | ((uint32_t)g << 10) | ((uint32_t)r << 20) | 0xc0000000;
1972
+ (*(uint32_t*)rgb_buf) = ar30;
1973
+ }
1974
+
1975
+ // 10 bit YUV to 10 bit AR30
1976
+ void I210ToAR30Row_C(const uint16_t* src_y,
1977
+ const uint16_t* src_u,
1978
+ const uint16_t* src_v,
1979
+ uint8_t* rgb_buf,
1980
+ const struct YuvConstants* yuvconstants,
1981
+ int width) {
1982
+ int x;
1983
+ int b;
1984
+ int g;
1985
+ int r;
1986
+ for (x = 0; x < width - 1; x += 2) {
1987
+ YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
1988
+ StoreAR30(rgb_buf, b, g, r);
1989
+ YuvPixel10_16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
1990
+ StoreAR30(rgb_buf + 4, b, g, r);
1991
+ src_y += 2;
1992
+ src_u += 1;
1993
+ src_v += 1;
1994
+ rgb_buf += 8; // Advance 2 pixels.
1995
+ }
1996
+ if (width & 1) {
1997
+ YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
1998
+ StoreAR30(rgb_buf, b, g, r);
1999
+ }
2000
+ }
2001
+
2002
+ // 12 bit YUV to 10 bit AR30
2003
+ void I212ToAR30Row_C(const uint16_t* src_y,
2004
+ const uint16_t* src_u,
2005
+ const uint16_t* src_v,
2006
+ uint8_t* rgb_buf,
2007
+ const struct YuvConstants* yuvconstants,
2008
+ int width) {
2009
+ int x;
2010
+ int b;
2011
+ int g;
2012
+ int r;
2013
+ for (x = 0; x < width - 1; x += 2) {
2014
+ YuvPixel12_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2015
+ StoreAR30(rgb_buf, b, g, r);
2016
+ YuvPixel12_16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2017
+ StoreAR30(rgb_buf + 4, b, g, r);
2018
+ src_y += 2;
2019
+ src_u += 1;
2020
+ src_v += 1;
2021
+ rgb_buf += 8; // Advance 2 pixels.
2022
+ }
2023
+ if (width & 1) {
2024
+ YuvPixel12_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2025
+ StoreAR30(rgb_buf, b, g, r);
2026
+ }
2027
+ }
2028
+
2029
+ void I410ToAR30Row_C(const uint16_t* src_y,
2030
+ const uint16_t* src_u,
2031
+ const uint16_t* src_v,
2032
+ uint8_t* rgb_buf,
2033
+ const struct YuvConstants* yuvconstants,
2034
+ int width) {
2035
+ int x;
2036
+ int b;
2037
+ int g;
2038
+ int r;
2039
+ for (x = 0; x < width; ++x) {
2040
+ YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2041
+ StoreAR30(rgb_buf, b, g, r);
2042
+ src_y += 1;
2043
+ src_u += 1;
2044
+ src_v += 1;
2045
+ rgb_buf += 4; // Advance 1 pixel.
2046
+ }
2047
+ }
2048
+
2049
+ // P210 has 10 bits in msb of 16 bit NV12 style layout.
2050
+ void P210ToARGBRow_C(const uint16_t* src_y,
2051
+ const uint16_t* src_uv,
2052
+ uint8_t* dst_argb,
2053
+ const struct YuvConstants* yuvconstants,
2054
+ int width) {
2055
+ int x;
2056
+ for (x = 0; x < width - 1; x += 2) {
2057
+ YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1,
2058
+ dst_argb + 2, yuvconstants);
2059
+ dst_argb[3] = 255;
2060
+ YuvPixel16_8(src_y[1], src_uv[0], src_uv[1], dst_argb + 4, dst_argb + 5,
2061
+ dst_argb + 6, yuvconstants);
2062
+ dst_argb[7] = 255;
2063
+ src_y += 2;
2064
+ src_uv += 2;
2065
+ dst_argb += 8; // Advance 2 pixels.
2066
+ }
2067
+ if (width & 1) {
2068
+ YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1,
2069
+ dst_argb + 2, yuvconstants);
2070
+ dst_argb[3] = 255;
2071
+ }
2072
+ }
2073
+
2074
+ void P410ToARGBRow_C(const uint16_t* src_y,
2075
+ const uint16_t* src_uv,
2076
+ uint8_t* dst_argb,
2077
+ const struct YuvConstants* yuvconstants,
2078
+ int width) {
2079
+ int x;
2080
+ for (x = 0; x < width; ++x) {
2081
+ YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1,
2082
+ dst_argb + 2, yuvconstants);
2083
+ dst_argb[3] = 255;
2084
+ src_y += 1;
2085
+ src_uv += 2;
2086
+ dst_argb += 4; // Advance 1 pixels.
2087
+ }
2088
+ }
2089
+
2090
+ void P210ToAR30Row_C(const uint16_t* src_y,
2091
+ const uint16_t* src_uv,
2092
+ uint8_t* dst_ar30,
2093
+ const struct YuvConstants* yuvconstants,
2094
+ int width) {
2095
+ int x;
2096
+ int b;
2097
+ int g;
2098
+ int r;
2099
+ for (x = 0; x < width - 1; x += 2) {
2100
+ YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants);
2101
+ StoreAR30(dst_ar30, b, g, r);
2102
+ YuvPixel16_16(src_y[1], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants);
2103
+ StoreAR30(dst_ar30 + 4, b, g, r);
2104
+ src_y += 2;
2105
+ src_uv += 2;
2106
+ dst_ar30 += 8; // Advance 2 pixels.
2107
+ }
2108
+ if (width & 1) {
2109
+ YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants);
2110
+ StoreAR30(dst_ar30, b, g, r);
2111
+ }
2112
+ }
2113
+
2114
+ void P410ToAR30Row_C(const uint16_t* src_y,
2115
+ const uint16_t* src_uv,
2116
+ uint8_t* dst_ar30,
2117
+ const struct YuvConstants* yuvconstants,
2118
+ int width) {
2119
+ int x;
2120
+ int b;
2121
+ int g;
2122
+ int r;
2123
+ for (x = 0; x < width; ++x) {
2124
+ YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants);
2125
+ StoreAR30(dst_ar30, b, g, r);
2126
+ src_y += 1;
2127
+ src_uv += 2;
2128
+ dst_ar30 += 4; // Advance 1 pixel.
2129
+ }
2130
+ }
2131
+
2132
+ // 8 bit YUV to 10 bit AR30
2133
+ // Uses same code as 10 bit YUV bit shifts the 8 bit values up to 10 bits.
2134
+ void I422ToAR30Row_C(const uint8_t* src_y,
2135
+ const uint8_t* src_u,
2136
+ const uint8_t* src_v,
2137
+ uint8_t* rgb_buf,
2138
+ const struct YuvConstants* yuvconstants,
2139
+ int width) {
2140
+ int x;
2141
+ int b;
2142
+ int g;
2143
+ int r;
2144
+ for (x = 0; x < width - 1; x += 2) {
2145
+ YuvPixel8_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2146
+ StoreAR30(rgb_buf, b, g, r);
2147
+ YuvPixel8_16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2148
+ StoreAR30(rgb_buf + 4, b, g, r);
2149
+ src_y += 2;
2150
+ src_u += 1;
2151
+ src_v += 1;
2152
+ rgb_buf += 8; // Advance 2 pixels.
2153
+ }
2154
+ if (width & 1) {
2155
+ YuvPixel8_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants);
2156
+ StoreAR30(rgb_buf, b, g, r);
2157
+ }
2158
+ }
2159
+
2160
+ void I444AlphaToARGBRow_C(const uint8_t* src_y,
2161
+ const uint8_t* src_u,
2162
+ const uint8_t* src_v,
2163
+ const uint8_t* src_a,
2164
+ uint8_t* rgb_buf,
2165
+ const struct YuvConstants* yuvconstants,
2166
+ int width) {
2167
+ int x;
2168
+ for (x = 0; x < width; ++x) {
2169
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
2170
+ rgb_buf + 2, yuvconstants);
2171
+ rgb_buf[3] = src_a[0];
2172
+ src_y += 1;
2173
+ src_u += 1;
2174
+ src_v += 1;
2175
+ src_a += 1;
2176
+ rgb_buf += 4; // Advance 1 pixel.
2177
+ }
2178
+ }
2179
+
2180
+ void I422AlphaToARGBRow_C(const uint8_t* src_y,
2181
+ const uint8_t* src_u,
2182
+ const uint8_t* src_v,
2183
+ const uint8_t* src_a,
2184
+ uint8_t* rgb_buf,
2185
+ const struct YuvConstants* yuvconstants,
2186
+ int width) {
2187
+ int x;
2188
+ for (x = 0; x < width - 1; x += 2) {
2189
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
2190
+ rgb_buf + 2, yuvconstants);
2191
+ rgb_buf[3] = src_a[0];
2192
+ YuvPixel(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5,
2193
+ rgb_buf + 6, yuvconstants);
2194
+ rgb_buf[7] = src_a[1];
2195
+ src_y += 2;
2196
+ src_u += 1;
2197
+ src_v += 1;
2198
+ src_a += 2;
2199
+ rgb_buf += 8; // Advance 2 pixels.
2200
+ }
2201
+ if (width & 1) {
2202
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
2203
+ rgb_buf + 2, yuvconstants);
2204
+ rgb_buf[3] = src_a[0];
2205
+ }
2206
+ }
2207
+
2208
+ void I422ToRGB24Row_C(const uint8_t* src_y,
2209
+ const uint8_t* src_u,
2210
+ const uint8_t* src_v,
2211
+ uint8_t* rgb_buf,
2212
+ const struct YuvConstants* yuvconstants,
2213
+ int width) {
2214
+ int x;
2215
+ for (x = 0; x < width - 1; x += 2) {
2216
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
2217
+ rgb_buf + 2, yuvconstants);
2218
+ YuvPixel(src_y[1], src_u[0], src_v[0], rgb_buf + 3, rgb_buf + 4,
2219
+ rgb_buf + 5, yuvconstants);
2220
+ src_y += 2;
2221
+ src_u += 1;
2222
+ src_v += 1;
2223
+ rgb_buf += 6; // Advance 2 pixels.
2224
+ }
2225
+ if (width & 1) {
2226
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1,
2227
+ rgb_buf + 2, yuvconstants);
2228
+ }
2229
+ }
2230
+
2231
+ void I422ToARGB4444Row_C(const uint8_t* src_y,
2232
+ const uint8_t* src_u,
2233
+ const uint8_t* src_v,
2234
+ uint8_t* dst_argb4444,
2235
+ const struct YuvConstants* yuvconstants,
2236
+ int width) {
2237
+ uint8_t b0;
2238
+ uint8_t g0;
2239
+ uint8_t r0;
2240
+ uint8_t b1;
2241
+ uint8_t g1;
2242
+ uint8_t r1;
2243
+ int x;
2244
+ for (x = 0; x < width - 1; x += 2) {
2245
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2246
+ YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
2247
+ b0 = b0 >> 4;
2248
+ g0 = g0 >> 4;
2249
+ r0 = r0 >> 4;
2250
+ b1 = b1 >> 4;
2251
+ g1 = g1 >> 4;
2252
+ r1 = r1 >> 4;
2253
+ *(uint16_t*)(dst_argb4444 + 0) =
2254
+ STATIC_CAST(uint16_t, b0 | (g0 << 4) | (r0 << 8) | 0xf000);
2255
+ *(uint16_t*)(dst_argb4444 + 2) =
2256
+ STATIC_CAST(uint16_t, b1 | (g1 << 4) | (r1 << 8) | 0xf000);
2257
+ src_y += 2;
2258
+ src_u += 1;
2259
+ src_v += 1;
2260
+ dst_argb4444 += 4; // Advance 2 pixels.
2261
+ }
2262
+ if (width & 1) {
2263
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2264
+ b0 = b0 >> 4;
2265
+ g0 = g0 >> 4;
2266
+ r0 = r0 >> 4;
2267
+ *(uint16_t*)(dst_argb4444) =
2268
+ STATIC_CAST(uint16_t, b0 | (g0 << 4) | (r0 << 8) | 0xf000);
2269
+ }
2270
+ }
2271
+
2272
+ void I422ToARGB1555Row_C(const uint8_t* src_y,
2273
+ const uint8_t* src_u,
2274
+ const uint8_t* src_v,
2275
+ uint8_t* dst_argb1555,
2276
+ const struct YuvConstants* yuvconstants,
2277
+ int width) {
2278
+ uint8_t b0;
2279
+ uint8_t g0;
2280
+ uint8_t r0;
2281
+ uint8_t b1;
2282
+ uint8_t g1;
2283
+ uint8_t r1;
2284
+ int x;
2285
+ for (x = 0; x < width - 1; x += 2) {
2286
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2287
+ YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
2288
+ b0 = b0 >> 3;
2289
+ g0 = g0 >> 3;
2290
+ r0 = r0 >> 3;
2291
+ b1 = b1 >> 3;
2292
+ g1 = g1 >> 3;
2293
+ r1 = r1 >> 3;
2294
+ *(uint16_t*)(dst_argb1555 + 0) =
2295
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 10) | 0x8000);
2296
+ *(uint16_t*)(dst_argb1555 + 2) =
2297
+ STATIC_CAST(uint16_t, b1 | (g1 << 5) | (r1 << 10) | 0x8000);
2298
+ src_y += 2;
2299
+ src_u += 1;
2300
+ src_v += 1;
2301
+ dst_argb1555 += 4; // Advance 2 pixels.
2302
+ }
2303
+ if (width & 1) {
2304
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2305
+ b0 = b0 >> 3;
2306
+ g0 = g0 >> 3;
2307
+ r0 = r0 >> 3;
2308
+ *(uint16_t*)(dst_argb1555) =
2309
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 10) | 0x8000);
2310
+ }
2311
+ }
2312
+
2313
+ void I422ToRGB565Row_C(const uint8_t* src_y,
2314
+ const uint8_t* src_u,
2315
+ const uint8_t* src_v,
2316
+ uint8_t* dst_rgb565,
2317
+ const struct YuvConstants* yuvconstants,
2318
+ int width) {
2319
+ uint8_t b0;
2320
+ uint8_t g0;
2321
+ uint8_t r0;
2322
+ uint8_t b1;
2323
+ uint8_t g1;
2324
+ uint8_t r1;
2325
+ int x;
2326
+ for (x = 0; x < width - 1; x += 2) {
2327
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2328
+ YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
2329
+ b0 = b0 >> 3;
2330
+ g0 = g0 >> 2;
2331
+ r0 = r0 >> 3;
2332
+ b1 = b1 >> 3;
2333
+ g1 = g1 >> 2;
2334
+ r1 = r1 >> 3;
2335
+ *(uint16_t*)(dst_rgb565 + 0) =
2336
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 11));
2337
+ *(uint16_t*)(dst_rgb565 + 2) =
2338
+ STATIC_CAST(uint16_t, b1 | (g1 << 5) | (r1 << 11));
2339
+ src_y += 2;
2340
+ src_u += 1;
2341
+ src_v += 1;
2342
+ dst_rgb565 += 4; // Advance 2 pixels.
2343
+ }
2344
+ if (width & 1) {
2345
+ YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
2346
+ b0 = b0 >> 3;
2347
+ g0 = g0 >> 2;
2348
+ r0 = r0 >> 3;
2349
+ *(uint16_t*)(dst_rgb565 + 0) =
2350
+ STATIC_CAST(uint16_t, b0 | (g0 << 5) | (r0 << 11));
2351
+ }
2352
+ }
2353
+
2354
+ void NV12ToARGBRow_C(const uint8_t* src_y,
2355
+ const uint8_t* src_uv,
2356
+ uint8_t* rgb_buf,
2357
+ const struct YuvConstants* yuvconstants,
2358
+ int width) {
2359
+ int x;
2360
+ for (x = 0; x < width - 1; x += 2) {
2361
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], rgb_buf + 0, rgb_buf + 1,
2362
+ rgb_buf + 2, yuvconstants);
2363
+ rgb_buf[3] = 255;
2364
+ YuvPixel(src_y[1], src_uv[0], src_uv[1], rgb_buf + 4, rgb_buf + 5,
2365
+ rgb_buf + 6, yuvconstants);
2366
+ rgb_buf[7] = 255;
2367
+ src_y += 2;
2368
+ src_uv += 2;
2369
+ rgb_buf += 8; // Advance 2 pixels.
2370
+ }
2371
+ if (width & 1) {
2372
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], rgb_buf + 0, rgb_buf + 1,
2373
+ rgb_buf + 2, yuvconstants);
2374
+ rgb_buf[3] = 255;
2375
+ }
2376
+ }
2377
+
2378
+ void NV21ToARGBRow_C(const uint8_t* src_y,
2379
+ const uint8_t* src_vu,
2380
+ uint8_t* rgb_buf,
2381
+ const struct YuvConstants* yuvconstants,
2382
+ int width) {
2383
+ int x;
2384
+ for (x = 0; x < width - 1; x += 2) {
2385
+ YuvPixel(src_y[0], src_vu[1], src_vu[0], rgb_buf + 0, rgb_buf + 1,
2386
+ rgb_buf + 2, yuvconstants);
2387
+ rgb_buf[3] = 255;
2388
+ YuvPixel(src_y[1], src_vu[1], src_vu[0], rgb_buf + 4, rgb_buf + 5,
2389
+ rgb_buf + 6, yuvconstants);
2390
+ rgb_buf[7] = 255;
2391
+ src_y += 2;
2392
+ src_vu += 2;
2393
+ rgb_buf += 8; // Advance 2 pixels.
2394
+ }
2395
+ if (width & 1) {
2396
+ YuvPixel(src_y[0], src_vu[1], src_vu[0], rgb_buf + 0, rgb_buf + 1,
2397
+ rgb_buf + 2, yuvconstants);
2398
+ rgb_buf[3] = 255;
2399
+ }
2400
+ }
2401
+
2402
+ void NV12ToRGB24Row_C(const uint8_t* src_y,
2403
+ const uint8_t* src_uv,
2404
+ uint8_t* rgb_buf,
2405
+ const struct YuvConstants* yuvconstants,
2406
+ int width) {
2407
+ int x;
2408
+ for (x = 0; x < width - 1; x += 2) {
2409
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], rgb_buf + 0, rgb_buf + 1,
2410
+ rgb_buf + 2, yuvconstants);
2411
+ YuvPixel(src_y[1], src_uv[0], src_uv[1], rgb_buf + 3, rgb_buf + 4,
2412
+ rgb_buf + 5, yuvconstants);
2413
+ src_y += 2;
2414
+ src_uv += 2;
2415
+ rgb_buf += 6; // Advance 2 pixels.
2416
+ }
2417
+ if (width & 1) {
2418
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], rgb_buf + 0, rgb_buf + 1,
2419
+ rgb_buf + 2, yuvconstants);
2420
+ }
2421
+ }
2422
+
2423
+ void NV21ToRGB24Row_C(const uint8_t* src_y,
2424
+ const uint8_t* src_vu,
2425
+ uint8_t* rgb_buf,
2426
+ const struct YuvConstants* yuvconstants,
2427
+ int width) {
2428
+ int x;
2429
+ for (x = 0; x < width - 1; x += 2) {
2430
+ YuvPixel(src_y[0], src_vu[1], src_vu[0], rgb_buf + 0, rgb_buf + 1,
2431
+ rgb_buf + 2, yuvconstants);
2432
+ YuvPixel(src_y[1], src_vu[1], src_vu[0], rgb_buf + 3, rgb_buf + 4,
2433
+ rgb_buf + 5, yuvconstants);
2434
+ src_y += 2;
2435
+ src_vu += 2;
2436
+ rgb_buf += 6; // Advance 2 pixels.
2437
+ }
2438
+ if (width & 1) {
2439
+ YuvPixel(src_y[0], src_vu[1], src_vu[0], rgb_buf + 0, rgb_buf + 1,
2440
+ rgb_buf + 2, yuvconstants);
2441
+ }
2442
+ }
2443
+
2444
+ void NV12ToRGB565Row_C(const uint8_t* src_y,
2445
+ const uint8_t* src_uv,
2446
+ uint8_t* dst_rgb565,
2447
+ const struct YuvConstants* yuvconstants,
2448
+ int width) {
2449
+ uint8_t b0;
2450
+ uint8_t g0;
2451
+ uint8_t r0;
2452
+ uint8_t b1;
2453
+ uint8_t g1;
2454
+ uint8_t r1;
2455
+ int x;
2456
+ for (x = 0; x < width - 1; x += 2) {
2457
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0, yuvconstants);
2458
+ YuvPixel(src_y[1], src_uv[0], src_uv[1], &b1, &g1, &r1, yuvconstants);
2459
+ b0 = b0 >> 3;
2460
+ g0 = g0 >> 2;
2461
+ r0 = r0 >> 3;
2462
+ b1 = b1 >> 3;
2463
+ g1 = g1 >> 2;
2464
+ r1 = r1 >> 3;
2465
+ *(uint16_t*)(dst_rgb565 + 0) = STATIC_CAST(uint16_t, b0) |
2466
+ STATIC_CAST(uint16_t, g0 << 5) |
2467
+ STATIC_CAST(uint16_t, r0 << 11);
2468
+ *(uint16_t*)(dst_rgb565 + 2) = STATIC_CAST(uint16_t, b1) |
2469
+ STATIC_CAST(uint16_t, g1 << 5) |
2470
+ STATIC_CAST(uint16_t, r1 << 11);
2471
+ src_y += 2;
2472
+ src_uv += 2;
2473
+ dst_rgb565 += 4; // Advance 2 pixels.
2474
+ }
2475
+ if (width & 1) {
2476
+ YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0, yuvconstants);
2477
+ b0 = b0 >> 3;
2478
+ g0 = g0 >> 2;
2479
+ r0 = r0 >> 3;
2480
+ *(uint16_t*)(dst_rgb565) = STATIC_CAST(uint16_t, b0) |
2481
+ STATIC_CAST(uint16_t, g0 << 5) |
2482
+ STATIC_CAST(uint16_t, r0 << 11);
2483
+ }
2484
+ }
2485
+
2486
+ void YUY2ToARGBRow_C(const uint8_t* src_yuy2,
2487
+ uint8_t* rgb_buf,
2488
+ const struct YuvConstants* yuvconstants,
2489
+ int width) {
2490
+ int x;
2491
+ for (x = 0; x < width - 1; x += 2) {
2492
+ YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3], rgb_buf + 0, rgb_buf + 1,
2493
+ rgb_buf + 2, yuvconstants);
2494
+ rgb_buf[3] = 255;
2495
+ YuvPixel(src_yuy2[2], src_yuy2[1], src_yuy2[3], rgb_buf + 4, rgb_buf + 5,
2496
+ rgb_buf + 6, yuvconstants);
2497
+ rgb_buf[7] = 255;
2498
+ src_yuy2 += 4;
2499
+ rgb_buf += 8; // Advance 2 pixels.
2500
+ }
2501
+ if (width & 1) {
2502
+ YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3], rgb_buf + 0, rgb_buf + 1,
2503
+ rgb_buf + 2, yuvconstants);
2504
+ rgb_buf[3] = 255;
2505
+ }
2506
+ }
2507
+
2508
+ void UYVYToARGBRow_C(const uint8_t* src_uyvy,
2509
+ uint8_t* rgb_buf,
2510
+ const struct YuvConstants* yuvconstants,
2511
+ int width) {
2512
+ int x;
2513
+ for (x = 0; x < width - 1; x += 2) {
2514
+ YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2], rgb_buf + 0, rgb_buf + 1,
2515
+ rgb_buf + 2, yuvconstants);
2516
+ rgb_buf[3] = 255;
2517
+ YuvPixel(src_uyvy[3], src_uyvy[0], src_uyvy[2], rgb_buf + 4, rgb_buf + 5,
2518
+ rgb_buf + 6, yuvconstants);
2519
+ rgb_buf[7] = 255;
2520
+ src_uyvy += 4;
2521
+ rgb_buf += 8; // Advance 2 pixels.
2522
+ }
2523
+ if (width & 1) {
2524
+ YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2], rgb_buf + 0, rgb_buf + 1,
2525
+ rgb_buf + 2, yuvconstants);
2526
+ rgb_buf[3] = 255;
2527
+ }
2528
+ }
2529
+
2530
+ void I422ToRGBARow_C(const uint8_t* src_y,
2531
+ const uint8_t* src_u,
2532
+ const uint8_t* src_v,
2533
+ uint8_t* rgb_buf,
2534
+ const struct YuvConstants* yuvconstants,
2535
+ int width) {
2536
+ int x;
2537
+ for (x = 0; x < width - 1; x += 2) {
2538
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 1, rgb_buf + 2,
2539
+ rgb_buf + 3, yuvconstants);
2540
+ rgb_buf[0] = 255;
2541
+ YuvPixel(src_y[1], src_u[0], src_v[0], rgb_buf + 5, rgb_buf + 6,
2542
+ rgb_buf + 7, yuvconstants);
2543
+ rgb_buf[4] = 255;
2544
+ src_y += 2;
2545
+ src_u += 1;
2546
+ src_v += 1;
2547
+ rgb_buf += 8; // Advance 2 pixels.
2548
+ }
2549
+ if (width & 1) {
2550
+ YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 1, rgb_buf + 2,
2551
+ rgb_buf + 3, yuvconstants);
2552
+ rgb_buf[0] = 255;
2553
+ }
2554
+ }
2555
+
2556
+ void I400ToARGBRow_C(const uint8_t* src_y,
2557
+ uint8_t* rgb_buf,
2558
+ const struct YuvConstants* yuvconstants,
2559
+ int width) {
2560
+ int x;
2561
+ for (x = 0; x < width - 1; x += 2) {
2562
+ YPixel(src_y[0], rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
2563
+ rgb_buf[3] = 255;
2564
+ YPixel(src_y[1], rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
2565
+ rgb_buf[7] = 255;
2566
+ src_y += 2;
2567
+ rgb_buf += 8; // Advance 2 pixels.
2568
+ }
2569
+ if (width & 1) {
2570
+ YPixel(src_y[0], rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
2571
+ rgb_buf[3] = 255;
2572
+ }
2573
+ }
2574
+
2575
+ void MirrorRow_C(const uint8_t* src, uint8_t* dst, int width) {
2576
+ int x;
2577
+ src += width - 1;
2578
+ for (x = 0; x < width - 1; x += 2) {
2579
+ dst[x] = src[0];
2580
+ dst[x + 1] = src[-1];
2581
+ src -= 2;
2582
+ }
2583
+ if (width & 1) {
2584
+ dst[width - 1] = src[0];
2585
+ }
2586
+ }
2587
+
2588
+ void MirrorRow_16_C(const uint16_t* src, uint16_t* dst, int width) {
2589
+ int x;
2590
+ src += width - 1;
2591
+ for (x = 0; x < width - 1; x += 2) {
2592
+ dst[x] = src[0];
2593
+ dst[x + 1] = src[-1];
2594
+ src -= 2;
2595
+ }
2596
+ if (width & 1) {
2597
+ dst[width - 1] = src[0];
2598
+ }
2599
+ }
2600
+
2601
+ void MirrorUVRow_C(const uint8_t* src_uv, uint8_t* dst_uv, int width) {
2602
+ int x;
2603
+ src_uv += (width - 1) << 1;
2604
+ for (x = 0; x < width; ++x) {
2605
+ dst_uv[0] = src_uv[0];
2606
+ dst_uv[1] = src_uv[1];
2607
+ src_uv -= 2;
2608
+ dst_uv += 2;
2609
+ }
2610
+ }
2611
+
2612
+ void MirrorSplitUVRow_C(const uint8_t* src_uv,
2613
+ uint8_t* dst_u,
2614
+ uint8_t* dst_v,
2615
+ int width) {
2616
+ int x;
2617
+ src_uv += (width - 1) << 1;
2618
+ for (x = 0; x < width - 1; x += 2) {
2619
+ dst_u[x] = src_uv[0];
2620
+ dst_u[x + 1] = src_uv[-2];
2621
+ dst_v[x] = src_uv[1];
2622
+ dst_v[x + 1] = src_uv[-2 + 1];
2623
+ src_uv -= 4;
2624
+ }
2625
+ if (width & 1) {
2626
+ dst_u[width - 1] = src_uv[0];
2627
+ dst_v[width - 1] = src_uv[1];
2628
+ }
2629
+ }
2630
+
2631
+ void ARGBMirrorRow_C(const uint8_t* src, uint8_t* dst, int width) {
2632
+ int x;
2633
+ const uint32_t* src32 = (const uint32_t*)(src);
2634
+ uint32_t* dst32 = (uint32_t*)(dst);
2635
+ src32 += width - 1;
2636
+ for (x = 0; x < width - 1; x += 2) {
2637
+ dst32[x] = src32[0];
2638
+ dst32[x + 1] = src32[-1];
2639
+ src32 -= 2;
2640
+ }
2641
+ if (width & 1) {
2642
+ dst32[width - 1] = src32[0];
2643
+ }
2644
+ }
2645
+
2646
+ void RGB24MirrorRow_C(const uint8_t* src_rgb24, uint8_t* dst_rgb24, int width) {
2647
+ int x;
2648
+ src_rgb24 += width * 3 - 3;
2649
+ for (x = 0; x < width; ++x) {
2650
+ uint8_t b = src_rgb24[0];
2651
+ uint8_t g = src_rgb24[1];
2652
+ uint8_t r = src_rgb24[2];
2653
+ dst_rgb24[0] = b;
2654
+ dst_rgb24[1] = g;
2655
+ dst_rgb24[2] = r;
2656
+ src_rgb24 -= 3;
2657
+ dst_rgb24 += 3;
2658
+ }
2659
+ }
2660
+
2661
+ void SplitUVRow_C(const uint8_t* src_uv,
2662
+ uint8_t* dst_u,
2663
+ uint8_t* dst_v,
2664
+ int width) {
2665
+ int x;
2666
+ for (x = 0; x < width - 1; x += 2) {
2667
+ dst_u[x] = src_uv[0];
2668
+ dst_u[x + 1] = src_uv[2];
2669
+ dst_v[x] = src_uv[1];
2670
+ dst_v[x + 1] = src_uv[3];
2671
+ src_uv += 4;
2672
+ }
2673
+ if (width & 1) {
2674
+ dst_u[width - 1] = src_uv[0];
2675
+ dst_v[width - 1] = src_uv[1];
2676
+ }
2677
+ }
2678
+
2679
+ void MergeUVRow_C(const uint8_t* src_u,
2680
+ const uint8_t* src_v,
2681
+ uint8_t* dst_uv,
2682
+ int width) {
2683
+ int x;
2684
+ for (x = 0; x < width - 1; x += 2) {
2685
+ dst_uv[0] = src_u[x];
2686
+ dst_uv[1] = src_v[x];
2687
+ dst_uv[2] = src_u[x + 1];
2688
+ dst_uv[3] = src_v[x + 1];
2689
+ dst_uv += 4;
2690
+ }
2691
+ if (width & 1) {
2692
+ dst_uv[0] = src_u[width - 1];
2693
+ dst_uv[1] = src_v[width - 1];
2694
+ }
2695
+ }
2696
+
2697
+ void DetileRow_C(const uint8_t* src,
2698
+ ptrdiff_t src_tile_stride,
2699
+ uint8_t* dst,
2700
+ int width) {
2701
+ int x;
2702
+ for (x = 0; x < width - 15; x += 16) {
2703
+ memcpy(dst, src, 16);
2704
+ dst += 16;
2705
+ src += src_tile_stride;
2706
+ }
2707
+ if (width & 15) {
2708
+ memcpy(dst, src, width & 15);
2709
+ }
2710
+ }
2711
+
2712
+ void DetileRow_16_C(const uint16_t* src,
2713
+ ptrdiff_t src_tile_stride,
2714
+ uint16_t* dst,
2715
+ int width) {
2716
+ int x;
2717
+ for (x = 0; x < width - 15; x += 16) {
2718
+ memcpy(dst, src, 16 * sizeof(uint16_t));
2719
+ dst += 16;
2720
+ src += src_tile_stride;
2721
+ }
2722
+ if (width & 15) {
2723
+ memcpy(dst, src, (width & 15) * sizeof(uint16_t));
2724
+ }
2725
+ }
2726
+
2727
+ void DetileSplitUVRow_C(const uint8_t* src_uv,
2728
+ ptrdiff_t src_tile_stride,
2729
+ uint8_t* dst_u,
2730
+ uint8_t* dst_v,
2731
+ int width) {
2732
+ int x;
2733
+ for (x = 0; x < width - 15; x += 16) {
2734
+ SplitUVRow_C(src_uv, dst_u, dst_v, 8);
2735
+ dst_u += 8;
2736
+ dst_v += 8;
2737
+ src_uv += src_tile_stride;
2738
+ }
2739
+ if (width & 15) {
2740
+ SplitUVRow_C(src_uv, dst_u, dst_v, ((width & 15) + 1) / 2);
2741
+ }
2742
+ }
2743
+
2744
+ void DetileToYUY2_C(const uint8_t* src_y,
2745
+ ptrdiff_t src_y_tile_stride,
2746
+ const uint8_t* src_uv,
2747
+ ptrdiff_t src_uv_tile_stride,
2748
+ uint8_t* dst_yuy2,
2749
+ int width) {
2750
+ for (int x = 0; x < width - 15; x += 16) {
2751
+ for (int i = 0; i < 8; i++) {
2752
+ dst_yuy2[0] = src_y[0];
2753
+ dst_yuy2[1] = src_uv[0];
2754
+ dst_yuy2[2] = src_y[1];
2755
+ dst_yuy2[3] = src_uv[1];
2756
+ dst_yuy2 += 4;
2757
+ src_y += 2;
2758
+ src_uv += 2;
2759
+ }
2760
+ src_y += src_y_tile_stride - 16;
2761
+ src_uv += src_uv_tile_stride - 16;
2762
+ }
2763
+ }
2764
+
2765
+ // Unpack MT2T into tiled P010 64 pixels at a time. MT2T's bitstream is encoded
2766
+ // in 80 byte blocks representing 64 pixels each. The first 16 bytes of the
2767
+ // block contain all of the lower 2 bits of each pixel packed together, and the
2768
+ // next 64 bytes represent all the upper 8 bits of the pixel. The lower bits are
2769
+ // packed into 1x4 blocks, whereas the upper bits are packed in normal raster
2770
+ // order.
2771
+ void UnpackMT2T_C(const uint8_t* src, uint16_t* dst, size_t size) {
2772
+ for (size_t i = 0; i < size; i += 80) {
2773
+ const uint8_t* src_lower_bits = src;
2774
+ const uint8_t* src_upper_bits = src + 16;
2775
+
2776
+ for (int j = 0; j < 4; j++) {
2777
+ for (int k = 0; k < 16; k++) {
2778
+ *dst++ = ((src_lower_bits[k] >> (j * 2)) & 0x3) << 6 |
2779
+ (uint16_t)*src_upper_bits << 8 |
2780
+ (uint16_t)*src_upper_bits >> 2;
2781
+ src_upper_bits++;
2782
+ }
2783
+ }
2784
+
2785
+ src += 80;
2786
+ }
2787
+ }
2788
+
2789
+ void SplitRGBRow_C(const uint8_t* src_rgb,
2790
+ uint8_t* dst_r,
2791
+ uint8_t* dst_g,
2792
+ uint8_t* dst_b,
2793
+ int width) {
2794
+ int x;
2795
+ for (x = 0; x < width; ++x) {
2796
+ dst_r[x] = src_rgb[0];
2797
+ dst_g[x] = src_rgb[1];
2798
+ dst_b[x] = src_rgb[2];
2799
+ src_rgb += 3;
2800
+ }
2801
+ }
2802
+
2803
+ void MergeRGBRow_C(const uint8_t* src_r,
2804
+ const uint8_t* src_g,
2805
+ const uint8_t* src_b,
2806
+ uint8_t* dst_rgb,
2807
+ int width) {
2808
+ int x;
2809
+ for (x = 0; x < width; ++x) {
2810
+ dst_rgb[0] = src_r[x];
2811
+ dst_rgb[1] = src_g[x];
2812
+ dst_rgb[2] = src_b[x];
2813
+ dst_rgb += 3;
2814
+ }
2815
+ }
2816
+
2817
+ void SplitARGBRow_C(const uint8_t* src_argb,
2818
+ uint8_t* dst_r,
2819
+ uint8_t* dst_g,
2820
+ uint8_t* dst_b,
2821
+ uint8_t* dst_a,
2822
+ int width) {
2823
+ int x;
2824
+ for (x = 0; x < width; ++x) {
2825
+ dst_b[x] = src_argb[0];
2826
+ dst_g[x] = src_argb[1];
2827
+ dst_r[x] = src_argb[2];
2828
+ dst_a[x] = src_argb[3];
2829
+ src_argb += 4;
2830
+ }
2831
+ }
2832
+
2833
+ void MergeARGBRow_C(const uint8_t* src_r,
2834
+ const uint8_t* src_g,
2835
+ const uint8_t* src_b,
2836
+ const uint8_t* src_a,
2837
+ uint8_t* dst_argb,
2838
+ int width) {
2839
+ int x;
2840
+ for (x = 0; x < width; ++x) {
2841
+ dst_argb[0] = src_b[x];
2842
+ dst_argb[1] = src_g[x];
2843
+ dst_argb[2] = src_r[x];
2844
+ dst_argb[3] = src_a[x];
2845
+ dst_argb += 4;
2846
+ }
2847
+ }
2848
+
2849
+ void MergeXR30Row_C(const uint16_t* src_r,
2850
+ const uint16_t* src_g,
2851
+ const uint16_t* src_b,
2852
+ uint8_t* dst_ar30,
2853
+ int depth,
2854
+ int width) {
2855
+ assert(depth >= 10);
2856
+ assert(depth <= 16);
2857
+ int x;
2858
+ int shift = depth - 10;
2859
+ uint32_t* dst_ar30_32 = (uint32_t*)dst_ar30;
2860
+ for (x = 0; x < width; ++x) {
2861
+ uint32_t r = clamp1023(src_r[x] >> shift);
2862
+ uint32_t g = clamp1023(src_g[x] >> shift);
2863
+ uint32_t b = clamp1023(src_b[x] >> shift);
2864
+ dst_ar30_32[x] = b | (g << 10) | (r << 20) | 0xc0000000;
2865
+ }
2866
+ }
2867
+
2868
+ void MergeAR64Row_C(const uint16_t* src_r,
2869
+ const uint16_t* src_g,
2870
+ const uint16_t* src_b,
2871
+ const uint16_t* src_a,
2872
+ uint16_t* dst_ar64,
2873
+ int depth,
2874
+ int width) {
2875
+ assert(depth >= 1);
2876
+ assert(depth <= 16);
2877
+ int x;
2878
+ int shift = 16 - depth;
2879
+ int max = (1 << depth) - 1;
2880
+ for (x = 0; x < width; ++x) {
2881
+ dst_ar64[0] = STATIC_CAST(uint16_t, ClampMax(src_b[x], max) << shift);
2882
+ dst_ar64[1] = STATIC_CAST(uint16_t, ClampMax(src_g[x], max) << shift);
2883
+ dst_ar64[2] = STATIC_CAST(uint16_t, ClampMax(src_r[x], max) << shift);
2884
+ dst_ar64[3] = STATIC_CAST(uint16_t, ClampMax(src_a[x], max) << shift);
2885
+ dst_ar64 += 4;
2886
+ }
2887
+ }
2888
+
2889
+ void MergeARGB16To8Row_C(const uint16_t* src_r,
2890
+ const uint16_t* src_g,
2891
+ const uint16_t* src_b,
2892
+ const uint16_t* src_a,
2893
+ uint8_t* dst_argb,
2894
+ int depth,
2895
+ int width) {
2896
+ assert(depth >= 8);
2897
+ assert(depth <= 16);
2898
+ int x;
2899
+ int shift = depth - 8;
2900
+ for (x = 0; x < width; ++x) {
2901
+ dst_argb[0] = STATIC_CAST(uint8_t, clamp255(src_b[x] >> shift));
2902
+ dst_argb[1] = STATIC_CAST(uint8_t, clamp255(src_g[x] >> shift));
2903
+ dst_argb[2] = STATIC_CAST(uint8_t, clamp255(src_r[x] >> shift));
2904
+ dst_argb[3] = STATIC_CAST(uint8_t, clamp255(src_a[x] >> shift));
2905
+ dst_argb += 4;
2906
+ }
2907
+ }
2908
+
2909
+ void MergeXR64Row_C(const uint16_t* src_r,
2910
+ const uint16_t* src_g,
2911
+ const uint16_t* src_b,
2912
+ uint16_t* dst_ar64,
2913
+ int depth,
2914
+ int width) {
2915
+ assert(depth >= 1);
2916
+ assert(depth <= 16);
2917
+ int x;
2918
+ int shift = 16 - depth;
2919
+ int max = (1 << depth) - 1;
2920
+ for (x = 0; x < width; ++x) {
2921
+ dst_ar64[0] = STATIC_CAST(uint16_t, ClampMax(src_b[x], max) << shift);
2922
+ dst_ar64[1] = STATIC_CAST(uint16_t, ClampMax(src_g[x], max) << shift);
2923
+ dst_ar64[2] = STATIC_CAST(uint16_t, ClampMax(src_r[x], max) << shift);
2924
+ dst_ar64[3] = 0xffff;
2925
+ dst_ar64 += 4;
2926
+ }
2927
+ }
2928
+
2929
+ void MergeXRGB16To8Row_C(const uint16_t* src_r,
2930
+ const uint16_t* src_g,
2931
+ const uint16_t* src_b,
2932
+ uint8_t* dst_argb,
2933
+ int depth,
2934
+ int width) {
2935
+ assert(depth >= 8);
2936
+ assert(depth <= 16);
2937
+ int x;
2938
+ int shift = depth - 8;
2939
+ for (x = 0; x < width; ++x) {
2940
+ dst_argb[0] = STATIC_CAST(uint8_t, clamp255(src_b[x] >> shift));
2941
+ dst_argb[1] = STATIC_CAST(uint8_t, clamp255(src_g[x] >> shift));
2942
+ dst_argb[2] = STATIC_CAST(uint8_t, clamp255(src_r[x] >> shift));
2943
+ dst_argb[3] = 0xff;
2944
+ dst_argb += 4;
2945
+ }
2946
+ }
2947
+
2948
+ void SplitXRGBRow_C(const uint8_t* src_argb,
2949
+ uint8_t* dst_r,
2950
+ uint8_t* dst_g,
2951
+ uint8_t* dst_b,
2952
+ int width) {
2953
+ int x;
2954
+ for (x = 0; x < width; ++x) {
2955
+ dst_b[x] = src_argb[0];
2956
+ dst_g[x] = src_argb[1];
2957
+ dst_r[x] = src_argb[2];
2958
+ src_argb += 4;
2959
+ }
2960
+ }
2961
+
2962
+ void MergeXRGBRow_C(const uint8_t* src_r,
2963
+ const uint8_t* src_g,
2964
+ const uint8_t* src_b,
2965
+ uint8_t* dst_argb,
2966
+ int width) {
2967
+ int x;
2968
+ for (x = 0; x < width; ++x) {
2969
+ dst_argb[0] = src_b[x];
2970
+ dst_argb[1] = src_g[x];
2971
+ dst_argb[2] = src_r[x];
2972
+ dst_argb[3] = 255;
2973
+ dst_argb += 4;
2974
+ }
2975
+ }
2976
+
2977
+ // Convert lsb formats to msb, depending on sample depth.
2978
+ void MergeUVRow_16_C(const uint16_t* src_u,
2979
+ const uint16_t* src_v,
2980
+ uint16_t* dst_uv,
2981
+ int depth,
2982
+ int width) {
2983
+ int shift = 16 - depth;
2984
+ assert(depth >= 8);
2985
+ assert(depth <= 16);
2986
+ int x;
2987
+ for (x = 0; x < width; ++x) {
2988
+ dst_uv[0] = STATIC_CAST(uint16_t, src_u[x] << shift);
2989
+ dst_uv[1] = STATIC_CAST(uint16_t, src_v[x] << shift);
2990
+ dst_uv += 2;
2991
+ }
2992
+ }
2993
+
2994
+ // Convert msb formats to lsb, depending on sample depth.
2995
+ void SplitUVRow_16_C(const uint16_t* src_uv,
2996
+ uint16_t* dst_u,
2997
+ uint16_t* dst_v,
2998
+ int depth,
2999
+ int width) {
3000
+ int shift = 16 - depth;
3001
+ int x;
3002
+ assert(depth >= 8);
3003
+ assert(depth <= 16);
3004
+ for (x = 0; x < width; ++x) {
3005
+ dst_u[x] = src_uv[0] >> shift;
3006
+ dst_v[x] = src_uv[1] >> shift;
3007
+ src_uv += 2;
3008
+ }
3009
+ }
3010
+
3011
+ void MultiplyRow_16_C(const uint16_t* src_y,
3012
+ uint16_t* dst_y,
3013
+ int scale,
3014
+ int width) {
3015
+ int x;
3016
+ for (x = 0; x < width; ++x) {
3017
+ dst_y[x] = STATIC_CAST(uint16_t, src_y[x] * scale);
3018
+ }
3019
+ }
3020
+
3021
+ void DivideRow_16_C(const uint16_t* src_y,
3022
+ uint16_t* dst_y,
3023
+ int scale,
3024
+ int width) {
3025
+ int x;
3026
+ for (x = 0; x < width; ++x) {
3027
+ dst_y[x] = (src_y[x] * scale) >> 16;
3028
+ }
3029
+ }
3030
+
3031
+ // Use scale to convert lsb formats to msb, depending how many bits there are:
3032
+ // 32768 = 9 bits
3033
+ // 16384 = 10 bits
3034
+ // 4096 = 12 bits
3035
+ // 256 = 16 bits
3036
+ // TODO(fbarchard): change scale to bits
3037
+ #define C16TO8(v, scale) clamp255(((v) * (scale)) >> 16)
3038
+
3039
+ void Convert16To8Row_C(const uint16_t* src_y,
3040
+ uint8_t* dst_y,
3041
+ int scale,
3042
+ int width) {
3043
+ int x;
3044
+ assert(scale >= 256);
3045
+ assert(scale <= 32768);
3046
+
3047
+ for (x = 0; x < width; ++x) {
3048
+ dst_y[x] = STATIC_CAST(uint8_t, C16TO8(src_y[x], scale));
3049
+ }
3050
+ }
3051
+
3052
+ // Use scale to convert lsb formats to msb, depending how many bits there are:
3053
+ // 1024 = 10 bits
3054
+ void Convert8To16Row_C(const uint8_t* src_y,
3055
+ uint16_t* dst_y,
3056
+ int scale,
3057
+ int width) {
3058
+ int x;
3059
+ scale *= 0x0101; // replicates the byte.
3060
+ for (x = 0; x < width; ++x) {
3061
+ dst_y[x] = (src_y[x] * scale) >> 16;
3062
+ }
3063
+ }
3064
+
3065
+ // Use scale to convert J420 to I420
3066
+ // scale parameter is 8.8 fixed point but limited to 0 to 255
3067
+ // Function is based on DivideRow, but adds a bias
3068
+ // Does not clamp
3069
+ void Convert8To8Row_C(const uint8_t* src_y,
3070
+ uint8_t* dst_y,
3071
+ int scale,
3072
+ int bias,
3073
+ int width) {
3074
+ int x;
3075
+ assert(scale >= 0);
3076
+ assert(scale <= 255);
3077
+
3078
+ for (x = 0; x < width; ++x) {
3079
+ dst_y[x] = ((src_y[x] * scale) >> 8) + bias;
3080
+ }
3081
+ }
3082
+
3083
+ void CopyRow_C(const uint8_t* src, uint8_t* dst, int count) {
3084
+ memcpy(dst, src, count);
3085
+ }
3086
+
3087
+ void CopyRow_16_C(const uint16_t* src, uint16_t* dst, int count) {
3088
+ memcpy(dst, src, count * 2);
3089
+ }
3090
+
3091
+ void SetRow_C(uint8_t* dst, uint8_t v8, int width) {
3092
+ memset(dst, v8, width);
3093
+ }
3094
+
3095
+ void ARGBSetRow_C(uint8_t* dst_argb, uint32_t v32, int width) {
3096
+ int x;
3097
+ for (x = 0; x < width; ++x) {
3098
+ memcpy(dst_argb + x * sizeof v32, &v32, sizeof v32);
3099
+ }
3100
+ }
3101
+
3102
+ // Filter 2 rows of YUY2 UV's (422) into U and V (420).
3103
+ void YUY2ToUVRow_C(const uint8_t* src_yuy2,
3104
+ int src_stride_yuy2,
3105
+ uint8_t* dst_u,
3106
+ uint8_t* dst_v,
3107
+ int width) {
3108
+ // Output a row of UV values, filtering 2 rows of YUY2.
3109
+ int x;
3110
+ for (x = 0; x < width; x += 2) {
3111
+ dst_u[0] = (src_yuy2[1] + src_yuy2[src_stride_yuy2 + 1] + 1) >> 1;
3112
+ dst_v[0] = (src_yuy2[3] + src_yuy2[src_stride_yuy2 + 3] + 1) >> 1;
3113
+ src_yuy2 += 4;
3114
+ dst_u += 1;
3115
+ dst_v += 1;
3116
+ }
3117
+ }
3118
+
3119
+ // Filter 2 rows of YUY2 UV's (422) into UV (NV12).
3120
+ void YUY2ToNVUVRow_C(const uint8_t* src_yuy2,
3121
+ int src_stride_yuy2,
3122
+ uint8_t* dst_uv,
3123
+ int width) {
3124
+ // Output a row of UV values, filtering 2 rows of YUY2.
3125
+ int x;
3126
+ for (x = 0; x < width; x += 2) {
3127
+ dst_uv[0] = (src_yuy2[1] + src_yuy2[src_stride_yuy2 + 1] + 1) >> 1;
3128
+ dst_uv[1] = (src_yuy2[3] + src_yuy2[src_stride_yuy2 + 3] + 1) >> 1;
3129
+ src_yuy2 += 4;
3130
+ dst_uv += 2;
3131
+ }
3132
+ }
3133
+
3134
+ // Copy row of YUY2 UV's (422) into U and V (422).
3135
+ void YUY2ToUV422Row_C(const uint8_t* src_yuy2,
3136
+ uint8_t* dst_u,
3137
+ uint8_t* dst_v,
3138
+ int width) {
3139
+ // Output a row of UV values.
3140
+ int x;
3141
+ for (x = 0; x < width; x += 2) {
3142
+ dst_u[0] = src_yuy2[1];
3143
+ dst_v[0] = src_yuy2[3];
3144
+ src_yuy2 += 4;
3145
+ dst_u += 1;
3146
+ dst_v += 1;
3147
+ }
3148
+ }
3149
+
3150
+ // Copy row of YUY2 Y's (422) into Y (420/422).
3151
+ void YUY2ToYRow_C(const uint8_t* src_yuy2, uint8_t* dst_y, int width) {
3152
+ // Output a row of Y values.
3153
+ int x;
3154
+ for (x = 0; x < width - 1; x += 2) {
3155
+ dst_y[x] = src_yuy2[0];
3156
+ dst_y[x + 1] = src_yuy2[2];
3157
+ src_yuy2 += 4;
3158
+ }
3159
+ if (width & 1) {
3160
+ dst_y[width - 1] = src_yuy2[0];
3161
+ }
3162
+ }
3163
+
3164
+ // Filter 2 rows of UYVY UV's (422) into U and V (420).
3165
+ void UYVYToUVRow_C(const uint8_t* src_uyvy,
3166
+ int src_stride_uyvy,
3167
+ uint8_t* dst_u,
3168
+ uint8_t* dst_v,
3169
+ int width) {
3170
+ // Output a row of UV values.
3171
+ int x;
3172
+ for (x = 0; x < width; x += 2) {
3173
+ dst_u[0] = (src_uyvy[0] + src_uyvy[src_stride_uyvy + 0] + 1) >> 1;
3174
+ dst_v[0] = (src_uyvy[2] + src_uyvy[src_stride_uyvy + 2] + 1) >> 1;
3175
+ src_uyvy += 4;
3176
+ dst_u += 1;
3177
+ dst_v += 1;
3178
+ }
3179
+ }
3180
+
3181
+ // Copy row of UYVY UV's (422) into U and V (422).
3182
+ void UYVYToUV422Row_C(const uint8_t* src_uyvy,
3183
+ uint8_t* dst_u,
3184
+ uint8_t* dst_v,
3185
+ int width) {
3186
+ // Output a row of UV values.
3187
+ int x;
3188
+ for (x = 0; x < width; x += 2) {
3189
+ dst_u[0] = src_uyvy[0];
3190
+ dst_v[0] = src_uyvy[2];
3191
+ src_uyvy += 4;
3192
+ dst_u += 1;
3193
+ dst_v += 1;
3194
+ }
3195
+ }
3196
+
3197
+ // Copy row of UYVY Y's (422) into Y (420/422).
3198
+ void UYVYToYRow_C(const uint8_t* src_uyvy, uint8_t* dst_y, int width) {
3199
+ // Output a row of Y values.
3200
+ int x;
3201
+ for (x = 0; x < width - 1; x += 2) {
3202
+ dst_y[x] = src_uyvy[1];
3203
+ dst_y[x + 1] = src_uyvy[3];
3204
+ src_uyvy += 4;
3205
+ }
3206
+ if (width & 1) {
3207
+ dst_y[width - 1] = src_uyvy[1];
3208
+ }
3209
+ }
3210
+
3211
+ #define BLEND(f, b, a) clamp255((((256 - a) * b) >> 8) + f)
3212
+
3213
+ // Blend src_argb over src_argb1 and store to dst_argb.
3214
+ // dst_argb may be src_argb or src_argb1.
3215
+ // This code mimics the SSSE3 version for better testability.
3216
+ void ARGBBlendRow_C(const uint8_t* src_argb,
3217
+ const uint8_t* src_argb1,
3218
+ uint8_t* dst_argb,
3219
+ int width) {
3220
+ int x;
3221
+ for (x = 0; x < width - 1; x += 2) {
3222
+ uint32_t fb = src_argb[0];
3223
+ uint32_t fg = src_argb[1];
3224
+ uint32_t fr = src_argb[2];
3225
+ uint32_t a = src_argb[3];
3226
+ uint32_t bb = src_argb1[0];
3227
+ uint32_t bg = src_argb1[1];
3228
+ uint32_t br = src_argb1[2];
3229
+ dst_argb[0] = STATIC_CAST(uint8_t, BLEND(fb, bb, a));
3230
+ dst_argb[1] = STATIC_CAST(uint8_t, BLEND(fg, bg, a));
3231
+ dst_argb[2] = STATIC_CAST(uint8_t, BLEND(fr, br, a));
3232
+ dst_argb[3] = 255u;
3233
+
3234
+ fb = src_argb[4 + 0];
3235
+ fg = src_argb[4 + 1];
3236
+ fr = src_argb[4 + 2];
3237
+ a = src_argb[4 + 3];
3238
+ bb = src_argb1[4 + 0];
3239
+ bg = src_argb1[4 + 1];
3240
+ br = src_argb1[4 + 2];
3241
+ dst_argb[4 + 0] = STATIC_CAST(uint8_t, BLEND(fb, bb, a));
3242
+ dst_argb[4 + 1] = STATIC_CAST(uint8_t, BLEND(fg, bg, a));
3243
+ dst_argb[4 + 2] = STATIC_CAST(uint8_t, BLEND(fr, br, a));
3244
+ dst_argb[4 + 3] = 255u;
3245
+ src_argb += 8;
3246
+ src_argb1 += 8;
3247
+ dst_argb += 8;
3248
+ }
3249
+
3250
+ if (width & 1) {
3251
+ uint32_t fb = src_argb[0];
3252
+ uint32_t fg = src_argb[1];
3253
+ uint32_t fr = src_argb[2];
3254
+ uint32_t a = src_argb[3];
3255
+ uint32_t bb = src_argb1[0];
3256
+ uint32_t bg = src_argb1[1];
3257
+ uint32_t br = src_argb1[2];
3258
+ dst_argb[0] = STATIC_CAST(uint8_t, BLEND(fb, bb, a));
3259
+ dst_argb[1] = STATIC_CAST(uint8_t, BLEND(fg, bg, a));
3260
+ dst_argb[2] = STATIC_CAST(uint8_t, BLEND(fr, br, a));
3261
+ dst_argb[3] = 255u;
3262
+ }
3263
+ }
3264
+ #undef BLEND
3265
+
3266
+ #define UBLEND(f, b, a) (((a)*f) + ((255 - a) * b) + 255) >> 8
3267
+ void BlendPlaneRow_C(const uint8_t* src0,
3268
+ const uint8_t* src1,
3269
+ const uint8_t* alpha,
3270
+ uint8_t* dst,
3271
+ int width) {
3272
+ int x;
3273
+ for (x = 0; x < width - 1; x += 2) {
3274
+ dst[0] = UBLEND(src0[0], src1[0], alpha[0]);
3275
+ dst[1] = UBLEND(src0[1], src1[1], alpha[1]);
3276
+ src0 += 2;
3277
+ src1 += 2;
3278
+ alpha += 2;
3279
+ dst += 2;
3280
+ }
3281
+ if (width & 1) {
3282
+ dst[0] = UBLEND(src0[0], src1[0], alpha[0]);
3283
+ }
3284
+ }
3285
+ #undef UBLEND
3286
+
3287
+ #define ATTENUATE(f, a) (f * a + 255) >> 8
3288
+
3289
+ // Multiply source RGB by alpha and store to destination.
3290
+ void ARGBAttenuateRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width) {
3291
+ int i;
3292
+ for (i = 0; i < width - 1; i += 2) {
3293
+ uint32_t b = src_argb[0];
3294
+ uint32_t g = src_argb[1];
3295
+ uint32_t r = src_argb[2];
3296
+ uint32_t a = src_argb[3];
3297
+ dst_argb[0] = ATTENUATE(b, a);
3298
+ dst_argb[1] = ATTENUATE(g, a);
3299
+ dst_argb[2] = ATTENUATE(r, a);
3300
+ dst_argb[3] = STATIC_CAST(uint8_t, a);
3301
+ b = src_argb[4];
3302
+ g = src_argb[5];
3303
+ r = src_argb[6];
3304
+ a = src_argb[7];
3305
+ dst_argb[4] = ATTENUATE(b, a);
3306
+ dst_argb[5] = ATTENUATE(g, a);
3307
+ dst_argb[6] = ATTENUATE(r, a);
3308
+ dst_argb[7] = STATIC_CAST(uint8_t, a);
3309
+ src_argb += 8;
3310
+ dst_argb += 8;
3311
+ }
3312
+
3313
+ if (width & 1) {
3314
+ const uint32_t b = src_argb[0];
3315
+ const uint32_t g = src_argb[1];
3316
+ const uint32_t r = src_argb[2];
3317
+ const uint32_t a = src_argb[3];
3318
+ dst_argb[0] = ATTENUATE(b, a);
3319
+ dst_argb[1] = ATTENUATE(g, a);
3320
+ dst_argb[2] = ATTENUATE(r, a);
3321
+ dst_argb[3] = STATIC_CAST(uint8_t, a);
3322
+ }
3323
+ }
3324
+ #undef ATTENUATE
3325
+
3326
+ // Divide source RGB by alpha and store to destination.
3327
+ // b = (b * 255 + (a / 2)) / a;
3328
+ // g = (g * 255 + (a / 2)) / a;
3329
+ // r = (r * 255 + (a / 2)) / a;
3330
+ // Reciprocal method is off by 1 on some values. ie 125
3331
+ // 8.8 fixed point inverse table with 1.0 in upper short and 1 / a in lower.
3332
+ #define T(a) 0x01000000 + (0x10000 / a)
3333
+ const uint32_t fixed_invtbl8[256] = {
3334
+ 0x01000000, 0x0100ffff, T(0x02), T(0x03), T(0x04), T(0x05), T(0x06),
3335
+ T(0x07), T(0x08), T(0x09), T(0x0a), T(0x0b), T(0x0c), T(0x0d),
3336
+ T(0x0e), T(0x0f), T(0x10), T(0x11), T(0x12), T(0x13), T(0x14),
3337
+ T(0x15), T(0x16), T(0x17), T(0x18), T(0x19), T(0x1a), T(0x1b),
3338
+ T(0x1c), T(0x1d), T(0x1e), T(0x1f), T(0x20), T(0x21), T(0x22),
3339
+ T(0x23), T(0x24), T(0x25), T(0x26), T(0x27), T(0x28), T(0x29),
3340
+ T(0x2a), T(0x2b), T(0x2c), T(0x2d), T(0x2e), T(0x2f), T(0x30),
3341
+ T(0x31), T(0x32), T(0x33), T(0x34), T(0x35), T(0x36), T(0x37),
3342
+ T(0x38), T(0x39), T(0x3a), T(0x3b), T(0x3c), T(0x3d), T(0x3e),
3343
+ T(0x3f), T(0x40), T(0x41), T(0x42), T(0x43), T(0x44), T(0x45),
3344
+ T(0x46), T(0x47), T(0x48), T(0x49), T(0x4a), T(0x4b), T(0x4c),
3345
+ T(0x4d), T(0x4e), T(0x4f), T(0x50), T(0x51), T(0x52), T(0x53),
3346
+ T(0x54), T(0x55), T(0x56), T(0x57), T(0x58), T(0x59), T(0x5a),
3347
+ T(0x5b), T(0x5c), T(0x5d), T(0x5e), T(0x5f), T(0x60), T(0x61),
3348
+ T(0x62), T(0x63), T(0x64), T(0x65), T(0x66), T(0x67), T(0x68),
3349
+ T(0x69), T(0x6a), T(0x6b), T(0x6c), T(0x6d), T(0x6e), T(0x6f),
3350
+ T(0x70), T(0x71), T(0x72), T(0x73), T(0x74), T(0x75), T(0x76),
3351
+ T(0x77), T(0x78), T(0x79), T(0x7a), T(0x7b), T(0x7c), T(0x7d),
3352
+ T(0x7e), T(0x7f), T(0x80), T(0x81), T(0x82), T(0x83), T(0x84),
3353
+ T(0x85), T(0x86), T(0x87), T(0x88), T(0x89), T(0x8a), T(0x8b),
3354
+ T(0x8c), T(0x8d), T(0x8e), T(0x8f), T(0x90), T(0x91), T(0x92),
3355
+ T(0x93), T(0x94), T(0x95), T(0x96), T(0x97), T(0x98), T(0x99),
3356
+ T(0x9a), T(0x9b), T(0x9c), T(0x9d), T(0x9e), T(0x9f), T(0xa0),
3357
+ T(0xa1), T(0xa2), T(0xa3), T(0xa4), T(0xa5), T(0xa6), T(0xa7),
3358
+ T(0xa8), T(0xa9), T(0xaa), T(0xab), T(0xac), T(0xad), T(0xae),
3359
+ T(0xaf), T(0xb0), T(0xb1), T(0xb2), T(0xb3), T(0xb4), T(0xb5),
3360
+ T(0xb6), T(0xb7), T(0xb8), T(0xb9), T(0xba), T(0xbb), T(0xbc),
3361
+ T(0xbd), T(0xbe), T(0xbf), T(0xc0), T(0xc1), T(0xc2), T(0xc3),
3362
+ T(0xc4), T(0xc5), T(0xc6), T(0xc7), T(0xc8), T(0xc9), T(0xca),
3363
+ T(0xcb), T(0xcc), T(0xcd), T(0xce), T(0xcf), T(0xd0), T(0xd1),
3364
+ T(0xd2), T(0xd3), T(0xd4), T(0xd5), T(0xd6), T(0xd7), T(0xd8),
3365
+ T(0xd9), T(0xda), T(0xdb), T(0xdc), T(0xdd), T(0xde), T(0xdf),
3366
+ T(0xe0), T(0xe1), T(0xe2), T(0xe3), T(0xe4), T(0xe5), T(0xe6),
3367
+ T(0xe7), T(0xe8), T(0xe9), T(0xea), T(0xeb), T(0xec), T(0xed),
3368
+ T(0xee), T(0xef), T(0xf0), T(0xf1), T(0xf2), T(0xf3), T(0xf4),
3369
+ T(0xf5), T(0xf6), T(0xf7), T(0xf8), T(0xf9), T(0xfa), T(0xfb),
3370
+ T(0xfc), T(0xfd), T(0xfe), 0x01000100};
3371
+ #undef T
3372
+
3373
+ #if defined(LIBYUV_UNATTENUATE_DUP)
3374
+ // This code mimics the Intel SIMD version for better testability.
3375
+ #define UNATTENUATE(f, ia) clamp255(((f | (f << 8)) * ia) >> 16)
3376
+ #else
3377
+ #define UNATTENUATE(f, ia) clamp255((f * ia) >> 8)
3378
+ #endif
3379
+
3380
+ // mimics the Intel SIMD code for exactness.
3381
+ void ARGBUnattenuateRow_C(const uint8_t* src_argb,
3382
+ uint8_t* dst_argb,
3383
+ int width) {
3384
+ int i;
3385
+ for (i = 0; i < width; ++i) {
3386
+ uint32_t b = src_argb[0];
3387
+ uint32_t g = src_argb[1];
3388
+ uint32_t r = src_argb[2];
3389
+ const uint32_t a = src_argb[3];
3390
+ const uint32_t ia = fixed_invtbl8[a] & 0xffff; // 8.8 fixed point
3391
+
3392
+ // Clamping should not be necessary but is free in assembly.
3393
+ dst_argb[0] = STATIC_CAST(uint8_t, UNATTENUATE(b, ia));
3394
+ dst_argb[1] = STATIC_CAST(uint8_t, UNATTENUATE(g, ia));
3395
+ dst_argb[2] = STATIC_CAST(uint8_t, UNATTENUATE(r, ia));
3396
+ dst_argb[3] = STATIC_CAST(uint8_t, a);
3397
+ src_argb += 4;
3398
+ dst_argb += 4;
3399
+ }
3400
+ }
3401
+
3402
+ void ComputeCumulativeSumRow_C(const uint8_t* row,
3403
+ int32_t* cumsum,
3404
+ const int32_t* previous_cumsum,
3405
+ int width) {
3406
+ int32_t row_sum[4] = {0, 0, 0, 0};
3407
+ int x;
3408
+ for (x = 0; x < width; ++x) {
3409
+ row_sum[0] += row[x * 4 + 0];
3410
+ row_sum[1] += row[x * 4 + 1];
3411
+ row_sum[2] += row[x * 4 + 2];
3412
+ row_sum[3] += row[x * 4 + 3];
3413
+ cumsum[x * 4 + 0] = row_sum[0] + previous_cumsum[x * 4 + 0];
3414
+ cumsum[x * 4 + 1] = row_sum[1] + previous_cumsum[x * 4 + 1];
3415
+ cumsum[x * 4 + 2] = row_sum[2] + previous_cumsum[x * 4 + 2];
3416
+ cumsum[x * 4 + 3] = row_sum[3] + previous_cumsum[x * 4 + 3];
3417
+ }
3418
+ }
3419
+
3420
+ void CumulativeSumToAverageRow_C(const int32_t* tl,
3421
+ const int32_t* bl,
3422
+ int w,
3423
+ int area,
3424
+ uint8_t* dst,
3425
+ int count) {
3426
+ float ooa;
3427
+ int i;
3428
+ assert(area != 0);
3429
+
3430
+ ooa = 1.0f / STATIC_CAST(float, area);
3431
+ for (i = 0; i < count; ++i) {
3432
+ dst[0] =
3433
+ (uint8_t)(STATIC_CAST(float, bl[w + 0] + tl[0] - bl[0] - tl[w + 0]) *
3434
+ ooa);
3435
+ dst[1] =
3436
+ (uint8_t)(STATIC_CAST(float, bl[w + 1] + tl[1] - bl[1] - tl[w + 1]) *
3437
+ ooa);
3438
+ dst[2] =
3439
+ (uint8_t)(STATIC_CAST(float, bl[w + 2] + tl[2] - bl[2] - tl[w + 2]) *
3440
+ ooa);
3441
+ dst[3] =
3442
+ (uint8_t)(STATIC_CAST(float, bl[w + 3] + tl[3] - bl[3] - tl[w + 3]) *
3443
+ ooa);
3444
+ dst += 4;
3445
+ tl += 4;
3446
+ bl += 4;
3447
+ }
3448
+ }
3449
+
3450
+ // Copy pixels from rotated source to destination row with a slope.
3451
+ LIBYUV_API
3452
+ void ARGBAffineRow_C(const uint8_t* src_argb,
3453
+ int src_argb_stride,
3454
+ uint8_t* dst_argb,
3455
+ const float* uv_dudv,
3456
+ int width) {
3457
+ int i;
3458
+ // Render a row of pixels from source into a buffer.
3459
+ float uv[2];
3460
+ uv[0] = uv_dudv[0];
3461
+ uv[1] = uv_dudv[1];
3462
+ for (i = 0; i < width; ++i) {
3463
+ int x = (int)(uv[0]);
3464
+ int y = (int)(uv[1]);
3465
+ *(uint32_t*)(dst_argb) =
3466
+ *(const uint32_t*)(src_argb + y * src_argb_stride + x * 4);
3467
+ dst_argb += 4;
3468
+ uv[0] += uv_dudv[2];
3469
+ uv[1] += uv_dudv[3];
3470
+ }
3471
+ }
3472
+
3473
+ // Blend 2 rows into 1.
3474
+ static void HalfRow_C(const uint8_t* src_uv,
3475
+ ptrdiff_t src_uv_stride,
3476
+ uint8_t* dst_uv,
3477
+ int width) {
3478
+ int x;
3479
+ for (x = 0; x < width; ++x) {
3480
+ dst_uv[x] = (src_uv[x] + src_uv[src_uv_stride + x] + 1) >> 1;
3481
+ }
3482
+ }
3483
+
3484
+ static void HalfRow_16_C(const uint16_t* src_uv,
3485
+ ptrdiff_t src_uv_stride,
3486
+ uint16_t* dst_uv,
3487
+ int width) {
3488
+ int x;
3489
+ for (x = 0; x < width; ++x) {
3490
+ dst_uv[x] = (src_uv[x] + src_uv[src_uv_stride + x] + 1) >> 1;
3491
+ }
3492
+ }
3493
+
3494
+ static void HalfRow_16To8_C(const uint16_t* src_uv,
3495
+ ptrdiff_t src_uv_stride,
3496
+ uint8_t* dst_uv,
3497
+ int scale,
3498
+ int width) {
3499
+ int x;
3500
+ for (x = 0; x < width; ++x) {
3501
+ dst_uv[x] = STATIC_CAST(
3502
+ uint8_t,
3503
+ C16TO8((src_uv[x] + src_uv[src_uv_stride + x] + 1) >> 1, scale));
3504
+ }
3505
+ }
3506
+
3507
+ // C version 2x2 -> 2x1.
3508
+ void InterpolateRow_C(uint8_t* dst_ptr,
3509
+ const uint8_t* src_ptr,
3510
+ ptrdiff_t src_stride,
3511
+ int width,
3512
+ int source_y_fraction) {
3513
+ int y1_fraction = source_y_fraction;
3514
+ int y0_fraction = 256 - y1_fraction;
3515
+ const uint8_t* src_ptr1 = src_ptr + src_stride;
3516
+ int x;
3517
+ assert(source_y_fraction >= 0);
3518
+ assert(source_y_fraction < 256);
3519
+
3520
+ if (y1_fraction == 0) {
3521
+ memcpy(dst_ptr, src_ptr, width);
3522
+ return;
3523
+ }
3524
+ if (y1_fraction == 128) {
3525
+ HalfRow_C(src_ptr, src_stride, dst_ptr, width);
3526
+ return;
3527
+ }
3528
+ for (x = 0; x < width; ++x) {
3529
+ dst_ptr[0] = STATIC_CAST(
3530
+ uint8_t,
3531
+ (src_ptr[0] * y0_fraction + src_ptr1[0] * y1_fraction + 128) >> 8);
3532
+ ++src_ptr;
3533
+ ++src_ptr1;
3534
+ ++dst_ptr;
3535
+ }
3536
+ }
3537
+
3538
+ // C version 2x2 -> 2x1.
3539
+ void InterpolateRow_16_C(uint16_t* dst_ptr,
3540
+ const uint16_t* src_ptr,
3541
+ ptrdiff_t src_stride,
3542
+ int width,
3543
+ int source_y_fraction) {
3544
+ int y1_fraction = source_y_fraction;
3545
+ int y0_fraction = 256 - y1_fraction;
3546
+ const uint16_t* src_ptr1 = src_ptr + src_stride;
3547
+ int x;
3548
+ assert(source_y_fraction >= 0);
3549
+ assert(source_y_fraction < 256);
3550
+
3551
+ if (y1_fraction == 0) {
3552
+ memcpy(dst_ptr, src_ptr, width * 2);
3553
+ return;
3554
+ }
3555
+ if (y1_fraction == 128) {
3556
+ HalfRow_16_C(src_ptr, src_stride, dst_ptr, width);
3557
+ return;
3558
+ }
3559
+ for (x = 0; x < width; ++x) {
3560
+ dst_ptr[0] = STATIC_CAST(
3561
+ uint16_t,
3562
+ (src_ptr[0] * y0_fraction + src_ptr1[0] * y1_fraction + 128) >> 8);
3563
+ ++src_ptr;
3564
+ ++src_ptr1;
3565
+ ++dst_ptr;
3566
+ }
3567
+ }
3568
+
3569
+ // C version 2x2 16 bit-> 2x1 8 bit.
3570
+ // Use scale to convert lsb formats to msb, depending how many bits there are:
3571
+ // 32768 = 9 bits
3572
+ // 16384 = 10 bits
3573
+ // 4096 = 12 bits
3574
+ // 256 = 16 bits
3575
+ // TODO(fbarchard): change scale to bits
3576
+
3577
+ void InterpolateRow_16To8_C(uint8_t* dst_ptr,
3578
+ const uint16_t* src_ptr,
3579
+ ptrdiff_t src_stride,
3580
+ int scale,
3581
+ int width,
3582
+ int source_y_fraction) {
3583
+ int y1_fraction = source_y_fraction;
3584
+ int y0_fraction = 256 - y1_fraction;
3585
+ const uint16_t* src_ptr1 = src_ptr + src_stride;
3586
+ int x;
3587
+ assert(source_y_fraction >= 0);
3588
+ assert(source_y_fraction < 256);
3589
+
3590
+ if (source_y_fraction == 0) {
3591
+ Convert16To8Row_C(src_ptr, dst_ptr, scale, width);
3592
+ return;
3593
+ }
3594
+ if (source_y_fraction == 128) {
3595
+ HalfRow_16To8_C(src_ptr, src_stride, dst_ptr, scale, width);
3596
+ return;
3597
+ }
3598
+ for (x = 0; x < width; ++x) {
3599
+ dst_ptr[0] = STATIC_CAST(
3600
+ uint8_t,
3601
+ C16TO8(
3602
+ (src_ptr[0] * y0_fraction + src_ptr1[0] * y1_fraction + 128) >> 8,
3603
+ scale));
3604
+ src_ptr += 1;
3605
+ src_ptr1 += 1;
3606
+ dst_ptr += 1;
3607
+ }
3608
+ }
3609
+
3610
+ // Use first 4 shuffler values to reorder ARGB channels.
3611
+ void ARGBShuffleRow_C(const uint8_t* src_argb,
3612
+ uint8_t* dst_argb,
3613
+ const uint8_t* shuffler,
3614
+ int width) {
3615
+ int index0 = shuffler[0];
3616
+ int index1 = shuffler[1];
3617
+ int index2 = shuffler[2];
3618
+ int index3 = shuffler[3];
3619
+ // Shuffle a row of ARGB.
3620
+ int x;
3621
+ for (x = 0; x < width; ++x) {
3622
+ // To support in-place conversion.
3623
+ uint8_t b = src_argb[index0];
3624
+ uint8_t g = src_argb[index1];
3625
+ uint8_t r = src_argb[index2];
3626
+ uint8_t a = src_argb[index3];
3627
+ dst_argb[0] = b;
3628
+ dst_argb[1] = g;
3629
+ dst_argb[2] = r;
3630
+ dst_argb[3] = a;
3631
+ src_argb += 4;
3632
+ dst_argb += 4;
3633
+ }
3634
+ }
3635
+
3636
+ void I422ToYUY2Row_C(const uint8_t* src_y,
3637
+ const uint8_t* src_u,
3638
+ const uint8_t* src_v,
3639
+ uint8_t* dst_frame,
3640
+ int width) {
3641
+ int x;
3642
+ for (x = 0; x < width - 1; x += 2) {
3643
+ dst_frame[0] = src_y[0];
3644
+ dst_frame[1] = src_u[0];
3645
+ dst_frame[2] = src_y[1];
3646
+ dst_frame[3] = src_v[0];
3647
+ dst_frame += 4;
3648
+ src_y += 2;
3649
+ src_u += 1;
3650
+ src_v += 1;
3651
+ }
3652
+ if (width & 1) {
3653
+ dst_frame[0] = src_y[0];
3654
+ dst_frame[1] = src_u[0];
3655
+ dst_frame[2] = 0;
3656
+ dst_frame[3] = src_v[0];
3657
+ }
3658
+ }
3659
+
3660
+ void I422ToUYVYRow_C(const uint8_t* src_y,
3661
+ const uint8_t* src_u,
3662
+ const uint8_t* src_v,
3663
+ uint8_t* dst_frame,
3664
+ int width) {
3665
+ int x;
3666
+ for (x = 0; x < width - 1; x += 2) {
3667
+ dst_frame[0] = src_u[0];
3668
+ dst_frame[1] = src_y[0];
3669
+ dst_frame[2] = src_v[0];
3670
+ dst_frame[3] = src_y[1];
3671
+ dst_frame += 4;
3672
+ src_y += 2;
3673
+ src_u += 1;
3674
+ src_v += 1;
3675
+ }
3676
+ if (width & 1) {
3677
+ dst_frame[0] = src_u[0];
3678
+ dst_frame[1] = src_y[0];
3679
+ dst_frame[2] = src_v[0];
3680
+ dst_frame[3] = 0;
3681
+ }
3682
+ }
3683
+
3684
+ void ARGBPolynomialRow_C(const uint8_t* src_argb,
3685
+ uint8_t* dst_argb,
3686
+ const float* poly,
3687
+ int width) {
3688
+ int i;
3689
+ for (i = 0; i < width; ++i) {
3690
+ float b = (float)(src_argb[0]);
3691
+ float g = (float)(src_argb[1]);
3692
+ float r = (float)(src_argb[2]);
3693
+ float a = (float)(src_argb[3]);
3694
+ float b2 = b * b;
3695
+ float g2 = g * g;
3696
+ float r2 = r * r;
3697
+ float a2 = a * a;
3698
+ float db = poly[0] + poly[4] * b;
3699
+ float dg = poly[1] + poly[5] * g;
3700
+ float dr = poly[2] + poly[6] * r;
3701
+ float da = poly[3] + poly[7] * a;
3702
+ float b3 = b2 * b;
3703
+ float g3 = g2 * g;
3704
+ float r3 = r2 * r;
3705
+ float a3 = a2 * a;
3706
+ db += poly[8] * b2;
3707
+ dg += poly[9] * g2;
3708
+ dr += poly[10] * r2;
3709
+ da += poly[11] * a2;
3710
+ db += poly[12] * b3;
3711
+ dg += poly[13] * g3;
3712
+ dr += poly[14] * r3;
3713
+ da += poly[15] * a3;
3714
+
3715
+ dst_argb[0] = STATIC_CAST(uint8_t, Clamp((int32_t)(db)));
3716
+ dst_argb[1] = STATIC_CAST(uint8_t, Clamp((int32_t)(dg)));
3717
+ dst_argb[2] = STATIC_CAST(uint8_t, Clamp((int32_t)(dr)));
3718
+ dst_argb[3] = STATIC_CAST(uint8_t, Clamp((int32_t)(da)));
3719
+ src_argb += 4;
3720
+ dst_argb += 4;
3721
+ }
3722
+ }
3723
+
3724
+ // Samples assumed to be unsigned in low 9, 10 or 12 bits. Scale factor
3725
+ // adjust the source integer range to the half float range desired.
3726
+
3727
+ // This magic constant is 2^-112. Multiplying by this
3728
+ // is the same as subtracting 112 from the exponent, which
3729
+ // is the difference in exponent bias between 32-bit and
3730
+ // 16-bit floats. Once we've done this subtraction, we can
3731
+ // simply extract the low bits of the exponent and the high
3732
+ // bits of the mantissa from our float and we're done.
3733
+
3734
+ // Work around GCC 7 punning warning -Wstrict-aliasing
3735
+ #if defined(__GNUC__)
3736
+ typedef uint32_t __attribute__((__may_alias__)) uint32_alias_t;
3737
+ #else
3738
+ typedef uint32_t uint32_alias_t;
3739
+ #endif
3740
+
3741
+ void HalfFloatRow_C(const uint16_t* src,
3742
+ uint16_t* dst,
3743
+ float scale,
3744
+ int width) {
3745
+ int i;
3746
+ float mult = 1.9259299444e-34f * scale;
3747
+ for (i = 0; i < width; ++i) {
3748
+ float value = src[i] * mult;
3749
+ dst[i] = (uint16_t)((*(const uint32_alias_t*)&value) >> 13);
3750
+ }
3751
+ }
3752
+
3753
+ void ByteToFloatRow_C(const uint8_t* src, float* dst, float scale, int width) {
3754
+ int i;
3755
+ for (i = 0; i < width; ++i) {
3756
+ float value = src[i] * scale;
3757
+ dst[i] = value;
3758
+ }
3759
+ }
3760
+
3761
+ void ARGBLumaColorTableRow_C(const uint8_t* src_argb,
3762
+ uint8_t* dst_argb,
3763
+ int width,
3764
+ const uint8_t* luma,
3765
+ uint32_t lumacoeff) {
3766
+ uint32_t bc = lumacoeff & 0xff;
3767
+ uint32_t gc = (lumacoeff >> 8) & 0xff;
3768
+ uint32_t rc = (lumacoeff >> 16) & 0xff;
3769
+
3770
+ int i;
3771
+ for (i = 0; i < width - 1; i += 2) {
3772
+ // Luminance in rows, color values in columns.
3773
+ const uint8_t* luma0 =
3774
+ ((src_argb[0] * bc + src_argb[1] * gc + src_argb[2] * rc) & 0x7F00u) +
3775
+ luma;
3776
+ const uint8_t* luma1;
3777
+ dst_argb[0] = luma0[src_argb[0]];
3778
+ dst_argb[1] = luma0[src_argb[1]];
3779
+ dst_argb[2] = luma0[src_argb[2]];
3780
+ dst_argb[3] = src_argb[3];
3781
+ luma1 =
3782
+ ((src_argb[4] * bc + src_argb[5] * gc + src_argb[6] * rc) & 0x7F00u) +
3783
+ luma;
3784
+ dst_argb[4] = luma1[src_argb[4]];
3785
+ dst_argb[5] = luma1[src_argb[5]];
3786
+ dst_argb[6] = luma1[src_argb[6]];
3787
+ dst_argb[7] = src_argb[7];
3788
+ src_argb += 8;
3789
+ dst_argb += 8;
3790
+ }
3791
+ if (width & 1) {
3792
+ // Luminance in rows, color values in columns.
3793
+ const uint8_t* luma0 =
3794
+ ((src_argb[0] * bc + src_argb[1] * gc + src_argb[2] * rc) & 0x7F00u) +
3795
+ luma;
3796
+ dst_argb[0] = luma0[src_argb[0]];
3797
+ dst_argb[1] = luma0[src_argb[1]];
3798
+ dst_argb[2] = luma0[src_argb[2]];
3799
+ dst_argb[3] = src_argb[3];
3800
+ }
3801
+ }
3802
+
3803
+ void ARGBCopyAlphaRow_C(const uint8_t* src, uint8_t* dst, int width) {
3804
+ int i;
3805
+ for (i = 0; i < width - 1; i += 2) {
3806
+ dst[3] = src[3];
3807
+ dst[7] = src[7];
3808
+ dst += 8;
3809
+ src += 8;
3810
+ }
3811
+ if (width & 1) {
3812
+ dst[3] = src[3];
3813
+ }
3814
+ }
3815
+
3816
+ void ARGBExtractAlphaRow_C(const uint8_t* src_argb, uint8_t* dst_a, int width) {
3817
+ int i;
3818
+ for (i = 0; i < width - 1; i += 2) {
3819
+ dst_a[0] = src_argb[3];
3820
+ dst_a[1] = src_argb[7];
3821
+ dst_a += 2;
3822
+ src_argb += 8;
3823
+ }
3824
+ if (width & 1) {
3825
+ dst_a[0] = src_argb[3];
3826
+ }
3827
+ }
3828
+
3829
+ void ARGBCopyYToAlphaRow_C(const uint8_t* src, uint8_t* dst, int width) {
3830
+ int i;
3831
+ for (i = 0; i < width - 1; i += 2) {
3832
+ dst[3] = src[0];
3833
+ dst[7] = src[1];
3834
+ dst += 8;
3835
+ src += 2;
3836
+ }
3837
+ if (width & 1) {
3838
+ dst[3] = src[0];
3839
+ }
3840
+ }
3841
+
3842
+ // Maximum temporary width for wrappers to process at a time, in pixels.
3843
+ #define MAXTWIDTH 2048
3844
+
3845
+ #if !(defined(_MSC_VER) && !defined(__clang__) && defined(_M_IX86)) && \
3846
+ defined(HAS_I422TORGB565ROW_SSSE3) && !defined(LIBYUV_ENABLE_ROWWIN)
3847
+ // row_win.cc has asm version, but GCC uses 2 step wrapper.
3848
+ void I422ToRGB565Row_SSSE3(const uint8_t* src_y,
3849
+ const uint8_t* src_u,
3850
+ const uint8_t* src_v,
3851
+ uint8_t* dst_rgb565,
3852
+ const struct YuvConstants* yuvconstants,
3853
+ int width) {
3854
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3855
+ while (width > 0) {
3856
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3857
+ I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
3858
+ ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
3859
+ src_y += twidth;
3860
+ src_u += twidth / 2;
3861
+ src_v += twidth / 2;
3862
+ dst_rgb565 += twidth * 2;
3863
+ width -= twidth;
3864
+ }
3865
+ }
3866
+ #endif
3867
+
3868
+ #if defined(HAS_I422TOARGB1555ROW_SSSE3)
3869
+ void I422ToARGB1555Row_SSSE3(const uint8_t* src_y,
3870
+ const uint8_t* src_u,
3871
+ const uint8_t* src_v,
3872
+ uint8_t* dst_argb1555,
3873
+ const struct YuvConstants* yuvconstants,
3874
+ int width) {
3875
+ // Row buffer for intermediate ARGB pixels.
3876
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3877
+ while (width > 0) {
3878
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3879
+ I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
3880
+ ARGBToARGB1555Row_SSE2(row, dst_argb1555, twidth);
3881
+ src_y += twidth;
3882
+ src_u += twidth / 2;
3883
+ src_v += twidth / 2;
3884
+ dst_argb1555 += twidth * 2;
3885
+ width -= twidth;
3886
+ }
3887
+ }
3888
+ #endif
3889
+
3890
+ #if defined(HAS_I422TOARGB4444ROW_SSSE3)
3891
+ void I422ToARGB4444Row_SSSE3(const uint8_t* src_y,
3892
+ const uint8_t* src_u,
3893
+ const uint8_t* src_v,
3894
+ uint8_t* dst_argb4444,
3895
+ const struct YuvConstants* yuvconstants,
3896
+ int width) {
3897
+ // Row buffer for intermediate ARGB pixels.
3898
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3899
+ while (width > 0) {
3900
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3901
+ I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
3902
+ ARGBToARGB4444Row_SSE2(row, dst_argb4444, twidth);
3903
+ src_y += twidth;
3904
+ src_u += twidth / 2;
3905
+ src_v += twidth / 2;
3906
+ dst_argb4444 += twidth * 2;
3907
+ width -= twidth;
3908
+ }
3909
+ }
3910
+ #endif
3911
+
3912
+ #if defined(HAS_NV12TORGB565ROW_SSSE3)
3913
+ void NV12ToRGB565Row_SSSE3(const uint8_t* src_y,
3914
+ const uint8_t* src_uv,
3915
+ uint8_t* dst_rgb565,
3916
+ const struct YuvConstants* yuvconstants,
3917
+ int width) {
3918
+ // Row buffer for intermediate ARGB pixels.
3919
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3920
+ while (width > 0) {
3921
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3922
+ NV12ToARGBRow_SSSE3(src_y, src_uv, row, yuvconstants, twidth);
3923
+ ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
3924
+ src_y += twidth;
3925
+ src_uv += twidth;
3926
+ dst_rgb565 += twidth * 2;
3927
+ width -= twidth;
3928
+ }
3929
+ }
3930
+ #endif
3931
+
3932
+ #if defined(HAS_NV12TORGB24ROW_SSSE3)
3933
+ void NV12ToRGB24Row_SSSE3(const uint8_t* src_y,
3934
+ const uint8_t* src_uv,
3935
+ uint8_t* dst_rgb24,
3936
+ const struct YuvConstants* yuvconstants,
3937
+ int width) {
3938
+ // Row buffer for intermediate ARGB pixels.
3939
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3940
+ while (width > 0) {
3941
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3942
+ NV12ToARGBRow_SSSE3(src_y, src_uv, row, yuvconstants, twidth);
3943
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
3944
+ src_y += twidth;
3945
+ src_uv += twidth;
3946
+ dst_rgb24 += twidth * 3;
3947
+ width -= twidth;
3948
+ }
3949
+ }
3950
+ #endif
3951
+
3952
+ #if defined(HAS_NV21TORGB24ROW_SSSE3)
3953
+ void NV21ToRGB24Row_SSSE3(const uint8_t* src_y,
3954
+ const uint8_t* src_vu,
3955
+ uint8_t* dst_rgb24,
3956
+ const struct YuvConstants* yuvconstants,
3957
+ int width) {
3958
+ // Row buffer for intermediate ARGB pixels.
3959
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3960
+ while (width > 0) {
3961
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3962
+ NV21ToARGBRow_SSSE3(src_y, src_vu, row, yuvconstants, twidth);
3963
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
3964
+ src_y += twidth;
3965
+ src_vu += twidth;
3966
+ dst_rgb24 += twidth * 3;
3967
+ width -= twidth;
3968
+ }
3969
+ }
3970
+ #endif
3971
+
3972
+ #if defined(HAS_NV12TORGB24ROW_AVX2)
3973
+ void NV12ToRGB24Row_AVX2(const uint8_t* src_y,
3974
+ const uint8_t* src_uv,
3975
+ uint8_t* dst_rgb24,
3976
+ const struct YuvConstants* yuvconstants,
3977
+ int width) {
3978
+ // Row buffer for intermediate ARGB pixels.
3979
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
3980
+ while (width > 0) {
3981
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
3982
+ NV12ToARGBRow_AVX2(src_y, src_uv, row, yuvconstants, twidth);
3983
+ #if defined(HAS_ARGBTORGB24ROW_AVX2)
3984
+ ARGBToRGB24Row_AVX2(row, dst_rgb24, twidth);
3985
+ #else
3986
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
3987
+ #endif
3988
+ src_y += twidth;
3989
+ src_uv += twidth;
3990
+ dst_rgb24 += twidth * 3;
3991
+ width -= twidth;
3992
+ }
3993
+ }
3994
+ #endif
3995
+
3996
+ #if defined(HAS_NV21TORGB24ROW_AVX2)
3997
+ void NV21ToRGB24Row_AVX2(const uint8_t* src_y,
3998
+ const uint8_t* src_vu,
3999
+ uint8_t* dst_rgb24,
4000
+ const struct YuvConstants* yuvconstants,
4001
+ int width) {
4002
+ // Row buffer for intermediate ARGB pixels.
4003
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4004
+ while (width > 0) {
4005
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4006
+ NV21ToARGBRow_AVX2(src_y, src_vu, row, yuvconstants, twidth);
4007
+ #if defined(HAS_ARGBTORGB24ROW_AVX2)
4008
+ ARGBToRGB24Row_AVX2(row, dst_rgb24, twidth);
4009
+ #else
4010
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
4011
+ #endif
4012
+ src_y += twidth;
4013
+ src_vu += twidth;
4014
+ dst_rgb24 += twidth * 3;
4015
+ width -= twidth;
4016
+ }
4017
+ }
4018
+ #endif
4019
+
4020
+ #if defined(HAS_I422TORGB565ROW_AVX2)
4021
+ void I422ToRGB565Row_AVX2(const uint8_t* src_y,
4022
+ const uint8_t* src_u,
4023
+ const uint8_t* src_v,
4024
+ uint8_t* dst_rgb565,
4025
+ const struct YuvConstants* yuvconstants,
4026
+ int width) {
4027
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4028
+ while (width > 0) {
4029
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4030
+ I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
4031
+ #if defined(HAS_ARGBTORGB565ROW_AVX2)
4032
+ ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth);
4033
+ #else
4034
+ ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
4035
+ #endif
4036
+ src_y += twidth;
4037
+ src_u += twidth / 2;
4038
+ src_v += twidth / 2;
4039
+ dst_rgb565 += twidth * 2;
4040
+ width -= twidth;
4041
+ }
4042
+ }
4043
+ #endif
4044
+
4045
+ #if defined(HAS_I422TOARGB1555ROW_AVX2)
4046
+ void I422ToARGB1555Row_AVX2(const uint8_t* src_y,
4047
+ const uint8_t* src_u,
4048
+ const uint8_t* src_v,
4049
+ uint8_t* dst_argb1555,
4050
+ const struct YuvConstants* yuvconstants,
4051
+ int width) {
4052
+ // Row buffer for intermediate ARGB pixels.
4053
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4054
+ while (width > 0) {
4055
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4056
+ I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
4057
+ #if defined(HAS_ARGBTOARGB1555ROW_AVX2)
4058
+ ARGBToARGB1555Row_AVX2(row, dst_argb1555, twidth);
4059
+ #else
4060
+ ARGBToARGB1555Row_SSE2(row, dst_argb1555, twidth);
4061
+ #endif
4062
+ src_y += twidth;
4063
+ src_u += twidth / 2;
4064
+ src_v += twidth / 2;
4065
+ dst_argb1555 += twidth * 2;
4066
+ width -= twidth;
4067
+ }
4068
+ }
4069
+ #endif
4070
+
4071
+ #if defined(HAS_I422TOARGB4444ROW_AVX2)
4072
+ void I422ToARGB4444Row_AVX2(const uint8_t* src_y,
4073
+ const uint8_t* src_u,
4074
+ const uint8_t* src_v,
4075
+ uint8_t* dst_argb4444,
4076
+ const struct YuvConstants* yuvconstants,
4077
+ int width) {
4078
+ // Row buffer for intermediate ARGB pixels.
4079
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4080
+ while (width > 0) {
4081
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4082
+ I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
4083
+ #if defined(HAS_ARGBTOARGB4444ROW_AVX2)
4084
+ ARGBToARGB4444Row_AVX2(row, dst_argb4444, twidth);
4085
+ #else
4086
+ ARGBToARGB4444Row_SSE2(row, dst_argb4444, twidth);
4087
+ #endif
4088
+ src_y += twidth;
4089
+ src_u += twidth / 2;
4090
+ src_v += twidth / 2;
4091
+ dst_argb4444 += twidth * 2;
4092
+ width -= twidth;
4093
+ }
4094
+ }
4095
+ #endif
4096
+
4097
+ #if defined(HAS_I422TORGB24ROW_AVX2)
4098
+ void I422ToRGB24Row_AVX2(const uint8_t* src_y,
4099
+ const uint8_t* src_u,
4100
+ const uint8_t* src_v,
4101
+ uint8_t* dst_rgb24,
4102
+ const struct YuvConstants* yuvconstants,
4103
+ int width) {
4104
+ // Row buffer for intermediate ARGB pixels.
4105
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4106
+ while (width > 0) {
4107
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4108
+ I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
4109
+ #if defined(HAS_ARGBTORGB24ROW_AVX2)
4110
+ ARGBToRGB24Row_AVX2(row, dst_rgb24, twidth);
4111
+ #else
4112
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
4113
+ #endif
4114
+ src_y += twidth;
4115
+ src_u += twidth / 2;
4116
+ src_v += twidth / 2;
4117
+ dst_rgb24 += twidth * 3;
4118
+ width -= twidth;
4119
+ }
4120
+ }
4121
+ #endif
4122
+
4123
+ #if defined(HAS_I444TORGB24ROW_AVX2)
4124
+ void I444ToRGB24Row_AVX2(const uint8_t* src_y,
4125
+ const uint8_t* src_u,
4126
+ const uint8_t* src_v,
4127
+ uint8_t* dst_rgb24,
4128
+ const struct YuvConstants* yuvconstants,
4129
+ int width) {
4130
+ // Row buffer for intermediate ARGB pixels.
4131
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4132
+ while (width > 0) {
4133
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4134
+ I444ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
4135
+ #if defined(HAS_ARGBTORGB24ROW_AVX2)
4136
+ ARGBToRGB24Row_AVX2(row, dst_rgb24, twidth);
4137
+ #else
4138
+ ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
4139
+ #endif
4140
+ src_y += twidth;
4141
+ src_u += twidth;
4142
+ src_v += twidth;
4143
+ dst_rgb24 += twidth * 3;
4144
+ width -= twidth;
4145
+ }
4146
+ }
4147
+ #endif
4148
+
4149
+ #if defined(HAS_NV12TORGB565ROW_AVX2)
4150
+ void NV12ToRGB565Row_AVX2(const uint8_t* src_y,
4151
+ const uint8_t* src_uv,
4152
+ uint8_t* dst_rgb565,
4153
+ const struct YuvConstants* yuvconstants,
4154
+ int width) {
4155
+ // Row buffer for intermediate ARGB pixels.
4156
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4157
+ while (width > 0) {
4158
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4159
+ NV12ToARGBRow_AVX2(src_y, src_uv, row, yuvconstants, twidth);
4160
+ #if defined(HAS_ARGBTORGB565ROW_AVX2)
4161
+ ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth);
4162
+ #else
4163
+ ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
4164
+ #endif
4165
+ src_y += twidth;
4166
+ src_uv += twidth;
4167
+ dst_rgb565 += twidth * 2;
4168
+ width -= twidth;
4169
+ }
4170
+ }
4171
+ #endif
4172
+
4173
+ #ifdef HAS_RGB24TOYJROW_AVX2
4174
+ // Convert 16 RGB24 pixels (64 bytes) to 16 YJ values.
4175
+ void RGB24ToYJRow_AVX2(const uint8_t* src_rgb24, uint8_t* dst_yj, int width) {
4176
+ // Row buffer for intermediate ARGB pixels.
4177
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4178
+ while (width > 0) {
4179
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4180
+ RGB24ToARGBRow_SSSE3(src_rgb24, row, twidth);
4181
+ ARGBToYJRow_AVX2(row, dst_yj, twidth);
4182
+ src_rgb24 += twidth * 3;
4183
+ dst_yj += twidth;
4184
+ width -= twidth;
4185
+ }
4186
+ }
4187
+ #endif // HAS_RGB24TOYJROW_AVX2
4188
+
4189
+ #ifdef HAS_RAWTOYJROW_AVX2
4190
+ // Convert 32 RAW pixels (128 bytes) to 32 YJ values.
4191
+ void RAWToYJRow_AVX2(const uint8_t* src_raw, uint8_t* dst_yj, int width) {
4192
+ // Row buffer for intermediate ARGB pixels.
4193
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4194
+ while (width > 0) {
4195
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4196
+ #ifdef HAS_RAWTOARGBROW_AVX2
4197
+ RAWToARGBRow_AVX2(src_raw, row, twidth);
4198
+ #else
4199
+ RAWToARGBRow_SSSE3(src_raw, row, twidth);
4200
+ #endif
4201
+ ARGBToYJRow_AVX2(row, dst_yj, twidth);
4202
+ src_raw += twidth * 3;
4203
+ dst_yj += twidth;
4204
+ width -= twidth;
4205
+ }
4206
+ }
4207
+ #endif // HAS_RAWTOYJROW_AVX2
4208
+
4209
+ #ifdef HAS_RGB24TOYJROW_SSSE3
4210
+ // Convert 16 RGB24 pixels (64 bytes) to 16 YJ values.
4211
+ void RGB24ToYJRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_yj, int width) {
4212
+ // Row buffer for intermediate ARGB pixels.
4213
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4214
+ while (width > 0) {
4215
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4216
+ RGB24ToARGBRow_SSSE3(src_rgb24, row, twidth);
4217
+ ARGBToYJRow_SSSE3(row, dst_yj, twidth);
4218
+ src_rgb24 += twidth * 3;
4219
+ dst_yj += twidth;
4220
+ width -= twidth;
4221
+ }
4222
+ }
4223
+ #endif // HAS_RGB24TOYJROW_SSSE3
4224
+
4225
+ #ifdef HAS_RAWTOYJROW_SSSE3
4226
+ // Convert 16 RAW pixels (64 bytes) to 16 YJ values.
4227
+ void RAWToYJRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_yj, int width) {
4228
+ // Row buffer for intermediate ARGB pixels.
4229
+ SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
4230
+ while (width > 0) {
4231
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4232
+ RAWToARGBRow_SSSE3(src_raw, row, twidth);
4233
+ ARGBToYJRow_SSSE3(row, dst_yj, twidth);
4234
+ src_raw += twidth * 3;
4235
+ dst_yj += twidth;
4236
+ width -= twidth;
4237
+ }
4238
+ }
4239
+ #endif // HAS_RAWTOYJROW_SSSE3
4240
+
4241
+ #ifdef HAS_INTERPOLATEROW_16TO8_AVX2
4242
+ void InterpolateRow_16To8_AVX2(uint8_t* dst_ptr,
4243
+ const uint16_t* src_ptr,
4244
+ ptrdiff_t src_stride,
4245
+ int scale,
4246
+ int width,
4247
+ int source_y_fraction) {
4248
+ // Row buffer for intermediate 16 bit pixels.
4249
+ SIMD_ALIGNED(uint16_t row[MAXTWIDTH]);
4250
+ while (width > 0) {
4251
+ int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
4252
+ InterpolateRow_16_C(row, src_ptr, src_stride, twidth, source_y_fraction);
4253
+ Convert16To8Row_AVX2(row, dst_ptr, scale, twidth);
4254
+ src_ptr += twidth;
4255
+ dst_ptr += twidth;
4256
+ width -= twidth;
4257
+ }
4258
+ }
4259
+ #endif // HAS_INTERPOLATEROW_16TO8_AVX2
4260
+
4261
+ float ScaleSumSamples_C(const float* src, float* dst, float scale, int width) {
4262
+ float fsum = 0.f;
4263
+ int i;
4264
+ for (i = 0; i < width; ++i) {
4265
+ float v = *src++;
4266
+ fsum += v * v;
4267
+ *dst++ = v * scale;
4268
+ }
4269
+ return fsum;
4270
+ }
4271
+
4272
+ float ScaleMaxSamples_C(const float* src, float* dst, float scale, int width) {
4273
+ float fmax = 0.f;
4274
+ int i;
4275
+ for (i = 0; i < width; ++i) {
4276
+ float v = *src++;
4277
+ float vs = v * scale;
4278
+ fmax = (v > fmax) ? v : fmax;
4279
+ *dst++ = vs;
4280
+ }
4281
+ return fmax;
4282
+ }
4283
+
4284
+ void ScaleSamples_C(const float* src, float* dst, float scale, int width) {
4285
+ int i;
4286
+ for (i = 0; i < width; ++i) {
4287
+ *dst++ = *src++ * scale;
4288
+ }
4289
+ }
4290
+
4291
+ void GaussRow_C(const uint32_t* src, uint16_t* dst, int width) {
4292
+ int i;
4293
+ for (i = 0; i < width; ++i) {
4294
+ *dst++ = STATIC_CAST(
4295
+ uint16_t,
4296
+ (src[0] + src[1] * 4 + src[2] * 6 + src[3] * 4 + src[4] + 128) >> 8);
4297
+ ++src;
4298
+ }
4299
+ }
4300
+
4301
+ // filter 5 rows with 1, 4, 6, 4, 1 coefficients to produce 1 row.
4302
+ void GaussCol_C(const uint16_t* src0,
4303
+ const uint16_t* src1,
4304
+ const uint16_t* src2,
4305
+ const uint16_t* src3,
4306
+ const uint16_t* src4,
4307
+ uint32_t* dst,
4308
+ int width) {
4309
+ int i;
4310
+ for (i = 0; i < width; ++i) {
4311
+ *dst++ = *src0++ + *src1++ * 4 + *src2++ * 6 + *src3++ * 4 + *src4++;
4312
+ }
4313
+ }
4314
+
4315
+ void GaussRow_F32_C(const float* src, float* dst, int width) {
4316
+ int i;
4317
+ for (i = 0; i < width; ++i) {
4318
+ *dst++ = (src[0] + src[1] * 4 + src[2] * 6 + src[3] * 4 + src[4]) *
4319
+ (1.0f / 256.0f);
4320
+ ++src;
4321
+ }
4322
+ }
4323
+
4324
+ // filter 5 rows with 1, 4, 6, 4, 1 coefficients to produce 1 row.
4325
+ void GaussCol_F32_C(const float* src0,
4326
+ const float* src1,
4327
+ const float* src2,
4328
+ const float* src3,
4329
+ const float* src4,
4330
+ float* dst,
4331
+ int width) {
4332
+ int i;
4333
+ for (i = 0; i < width; ++i) {
4334
+ *dst++ = *src0++ + *src1++ * 4 + *src2++ * 6 + *src3++ * 4 + *src4++;
4335
+ }
4336
+ }
4337
+
4338
+ // Convert biplanar NV21 to packed YUV24
4339
+ void NV21ToYUV24Row_C(const uint8_t* src_y,
4340
+ const uint8_t* src_vu,
4341
+ uint8_t* dst_yuv24,
4342
+ int width) {
4343
+ int x;
4344
+ for (x = 0; x < width - 1; x += 2) {
4345
+ dst_yuv24[0] = src_vu[0]; // V
4346
+ dst_yuv24[1] = src_vu[1]; // U
4347
+ dst_yuv24[2] = src_y[0]; // Y0
4348
+ dst_yuv24[3] = src_vu[0]; // V
4349
+ dst_yuv24[4] = src_vu[1]; // U
4350
+ dst_yuv24[5] = src_y[1]; // Y1
4351
+ src_y += 2;
4352
+ src_vu += 2;
4353
+ dst_yuv24 += 6; // Advance 2 pixels.
4354
+ }
4355
+ if (width & 1) {
4356
+ dst_yuv24[0] = src_vu[0]; // V
4357
+ dst_yuv24[1] = src_vu[1]; // U
4358
+ dst_yuv24[2] = src_y[0]; // Y0
4359
+ }
4360
+ }
4361
+
4362
+ // Filter 2 rows of AYUV UV's (444) into UV (420).
4363
+ // AYUV is VUYA in memory. UV for NV12 is UV order in memory.
4364
+ void AYUVToUVRow_C(const uint8_t* src_ayuv,
4365
+ int src_stride_ayuv,
4366
+ uint8_t* dst_uv,
4367
+ int width) {
4368
+ // Output a row of UV values, filtering 2x2 rows of AYUV.
4369
+ int x;
4370
+ for (x = 0; x < width - 1; x += 2) {
4371
+ dst_uv[0] = (src_ayuv[1] + src_ayuv[5] + src_ayuv[src_stride_ayuv + 1] +
4372
+ src_ayuv[src_stride_ayuv + 5] + 2) >>
4373
+ 2;
4374
+ dst_uv[1] = (src_ayuv[0] + src_ayuv[4] + src_ayuv[src_stride_ayuv + 0] +
4375
+ src_ayuv[src_stride_ayuv + 4] + 2) >>
4376
+ 2;
4377
+ src_ayuv += 8;
4378
+ dst_uv += 2;
4379
+ }
4380
+ if (width & 1) {
4381
+ dst_uv[0] = (src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + 1) >> 1;
4382
+ dst_uv[1] = (src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + 1) >> 1;
4383
+ }
4384
+ }
4385
+
4386
+ // Filter 2 rows of AYUV UV's (444) into VU (420).
4387
+ void AYUVToVURow_C(const uint8_t* src_ayuv,
4388
+ int src_stride_ayuv,
4389
+ uint8_t* dst_vu,
4390
+ int width) {
4391
+ // Output a row of VU values, filtering 2x2 rows of AYUV.
4392
+ int x;
4393
+ for (x = 0; x < width - 1; x += 2) {
4394
+ dst_vu[0] = (src_ayuv[0] + src_ayuv[4] + src_ayuv[src_stride_ayuv + 0] +
4395
+ src_ayuv[src_stride_ayuv + 4] + 2) >>
4396
+ 2;
4397
+ dst_vu[1] = (src_ayuv[1] + src_ayuv[5] + src_ayuv[src_stride_ayuv + 1] +
4398
+ src_ayuv[src_stride_ayuv + 5] + 2) >>
4399
+ 2;
4400
+ src_ayuv += 8;
4401
+ dst_vu += 2;
4402
+ }
4403
+ if (width & 1) {
4404
+ dst_vu[0] = (src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + 1) >> 1;
4405
+ dst_vu[1] = (src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + 1) >> 1;
4406
+ }
4407
+ }
4408
+
4409
+ // Copy row of AYUV Y's into Y
4410
+ void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width) {
4411
+ // Output a row of Y values.
4412
+ int x;
4413
+ for (x = 0; x < width; ++x) {
4414
+ dst_y[x] = src_ayuv[2]; // v,u,y,a
4415
+ src_ayuv += 4;
4416
+ }
4417
+ }
4418
+
4419
+ // Convert UV plane of NV12 to VU of NV21.
4420
+ void SwapUVRow_C(const uint8_t* src_uv, uint8_t* dst_vu, int width) {
4421
+ int x;
4422
+ for (x = 0; x < width; ++x) {
4423
+ uint8_t u = src_uv[0];
4424
+ uint8_t v = src_uv[1];
4425
+ dst_vu[0] = v;
4426
+ dst_vu[1] = u;
4427
+ src_uv += 2;
4428
+ dst_vu += 2;
4429
+ }
4430
+ }
4431
+
4432
+ void HalfMergeUVRow_C(const uint8_t* src_u,
4433
+ int src_stride_u,
4434
+ const uint8_t* src_v,
4435
+ int src_stride_v,
4436
+ uint8_t* dst_uv,
4437
+ int width) {
4438
+ int x;
4439
+ for (x = 0; x < width - 1; x += 2) {
4440
+ dst_uv[0] = (src_u[0] + src_u[1] + src_u[src_stride_u] +
4441
+ src_u[src_stride_u + 1] + 2) >>
4442
+ 2;
4443
+ dst_uv[1] = (src_v[0] + src_v[1] + src_v[src_stride_v] +
4444
+ src_v[src_stride_v + 1] + 2) >>
4445
+ 2;
4446
+ src_u += 2;
4447
+ src_v += 2;
4448
+ dst_uv += 2;
4449
+ }
4450
+ if (width & 1) {
4451
+ dst_uv[0] = (src_u[0] + src_u[src_stride_u] + 1) >> 1;
4452
+ dst_uv[1] = (src_v[0] + src_v[src_stride_v] + 1) >> 1;
4453
+ }
4454
+ }
4455
+
4456
+ #undef STATIC_CAST
4457
+
4458
+ #ifdef __cplusplus
4459
+ } // extern "C"
4460
+ } // namespace libyuv
4461
+ #endif