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,4731 @@
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 <math.h>
12
+ #include <stdlib.h>
13
+ #include <time.h>
14
+
15
+ #include "../unit_test/unit_test.h"
16
+ #include "libyuv/compare.h"
17
+ #include "libyuv/convert.h"
18
+ #include "libyuv/convert_argb.h"
19
+ #include "libyuv/convert_from.h"
20
+ #include "libyuv/convert_from_argb.h"
21
+ #include "libyuv/cpu_id.h"
22
+ #include "libyuv/planar_functions.h"
23
+ #include "libyuv/rotate.h"
24
+ #include "libyuv/scale.h"
25
+
26
+ #ifdef ENABLE_ROW_TESTS
27
+ // row.h defines SIMD_ALIGNED, overriding unit_test.h
28
+ // TODO(fbarchard): Remove row.h from unittests. Test public functions.
29
+ #include "libyuv/row.h" /* For ScaleSumSamples_Neon */
30
+ #endif
31
+
32
+ #if defined(LIBYUV_BIT_EXACT)
33
+ #define EXPECTED_UNATTENUATE_DIFF 0
34
+ #else
35
+ #define EXPECTED_UNATTENUATE_DIFF 2
36
+ #endif
37
+
38
+ namespace libyuv {
39
+
40
+ TEST_F(LibYUVPlanarTest, TestAttenuate) {
41
+ const int kSize = 1280 * 4;
42
+ align_buffer_page_end(orig_pixels, kSize);
43
+ align_buffer_page_end(atten_pixels, kSize);
44
+ align_buffer_page_end(unatten_pixels, kSize);
45
+ align_buffer_page_end(atten2_pixels, kSize);
46
+
47
+ // Test unattenuation clamps
48
+ orig_pixels[0 * 4 + 0] = 200u;
49
+ orig_pixels[0 * 4 + 1] = 129u;
50
+ orig_pixels[0 * 4 + 2] = 127u;
51
+ orig_pixels[0 * 4 + 3] = 128u;
52
+ // Test unattenuation transparent and opaque are unaffected
53
+ orig_pixels[1 * 4 + 0] = 16u;
54
+ orig_pixels[1 * 4 + 1] = 64u;
55
+ orig_pixels[1 * 4 + 2] = 192u;
56
+ orig_pixels[1 * 4 + 3] = 0u;
57
+ orig_pixels[2 * 4 + 0] = 16u;
58
+ orig_pixels[2 * 4 + 1] = 64u;
59
+ orig_pixels[2 * 4 + 2] = 192u;
60
+ orig_pixels[2 * 4 + 3] = 128u;
61
+ orig_pixels[3 * 4 + 0] = 16u;
62
+ orig_pixels[3 * 4 + 1] = 64u;
63
+ orig_pixels[3 * 4 + 2] = 192u;
64
+ orig_pixels[3 * 4 + 3] = 255u;
65
+ orig_pixels[4 * 4 + 0] = 255u;
66
+ orig_pixels[4 * 4 + 1] = 255u;
67
+ orig_pixels[4 * 4 + 2] = 255u;
68
+ orig_pixels[4 * 4 + 3] = 255u;
69
+
70
+ ARGBUnattenuate(orig_pixels, 0, unatten_pixels, 0, 5, 1);
71
+ EXPECT_EQ(255u, unatten_pixels[0 * 4 + 0]);
72
+ EXPECT_EQ(255u, unatten_pixels[0 * 4 + 1]);
73
+ EXPECT_EQ(254u, unatten_pixels[0 * 4 + 2]);
74
+ EXPECT_EQ(128u, unatten_pixels[0 * 4 + 3]);
75
+ EXPECT_EQ(0u, unatten_pixels[1 * 4 + 0]);
76
+ EXPECT_EQ(0u, unatten_pixels[1 * 4 + 1]);
77
+ EXPECT_EQ(0u, unatten_pixels[1 * 4 + 2]);
78
+ EXPECT_EQ(0u, unatten_pixels[1 * 4 + 3]);
79
+ EXPECT_EQ(32u, unatten_pixels[2 * 4 + 0]);
80
+ EXPECT_EQ(128u, unatten_pixels[2 * 4 + 1]);
81
+ EXPECT_EQ(255u, unatten_pixels[2 * 4 + 2]);
82
+ EXPECT_EQ(128u, unatten_pixels[2 * 4 + 3]);
83
+ EXPECT_EQ(16u, unatten_pixels[3 * 4 + 0]);
84
+ EXPECT_EQ(64u, unatten_pixels[3 * 4 + 1]);
85
+ EXPECT_EQ(192u, unatten_pixels[3 * 4 + 2]);
86
+ EXPECT_EQ(255u, unatten_pixels[3 * 4 + 3]);
87
+ EXPECT_EQ(255u, unatten_pixels[4 * 4 + 0]);
88
+ EXPECT_EQ(255u, unatten_pixels[4 * 4 + 1]);
89
+ EXPECT_EQ(255u, unatten_pixels[4 * 4 + 2]);
90
+ EXPECT_EQ(255u, unatten_pixels[4 * 4 + 3]);
91
+
92
+ ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 5, 1);
93
+ EXPECT_EQ(100u, atten_pixels[0 * 4 + 0]);
94
+ EXPECT_EQ(65u, atten_pixels[0 * 4 + 1]);
95
+ EXPECT_EQ(64u, atten_pixels[0 * 4 + 2]);
96
+ EXPECT_EQ(128u, atten_pixels[0 * 4 + 3]);
97
+ EXPECT_EQ(0u, atten_pixels[1 * 4 + 0]);
98
+ EXPECT_EQ(0u, atten_pixels[1 * 4 + 1]);
99
+ EXPECT_EQ(0u, atten_pixels[1 * 4 + 2]);
100
+ EXPECT_EQ(0u, atten_pixels[1 * 4 + 3]);
101
+ EXPECT_EQ(8u, atten_pixels[2 * 4 + 0]);
102
+ EXPECT_EQ(32u, atten_pixels[2 * 4 + 1]);
103
+ EXPECT_EQ(96u, atten_pixels[2 * 4 + 2]);
104
+ EXPECT_EQ(128u, atten_pixels[2 * 4 + 3]);
105
+ EXPECT_EQ(16u, atten_pixels[3 * 4 + 0]);
106
+ EXPECT_EQ(64u, atten_pixels[3 * 4 + 1]);
107
+ EXPECT_EQ(192u, atten_pixels[3 * 4 + 2]);
108
+ EXPECT_EQ(255u, atten_pixels[3 * 4 + 3]);
109
+ EXPECT_EQ(255u, atten_pixels[4 * 4 + 0]);
110
+ EXPECT_EQ(255u, atten_pixels[4 * 4 + 1]);
111
+ EXPECT_EQ(255u, atten_pixels[4 * 4 + 2]);
112
+ EXPECT_EQ(255u, atten_pixels[4 * 4 + 3]);
113
+
114
+ // test 255
115
+ for (int i = 0; i < 256; ++i) {
116
+ orig_pixels[i * 4 + 0] = i;
117
+ orig_pixels[i * 4 + 1] = 0;
118
+ orig_pixels[i * 4 + 2] = 0;
119
+ orig_pixels[i * 4 + 3] = 255;
120
+ }
121
+ ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 256, 1);
122
+ for (int i = 0; i < 256; ++i) {
123
+ EXPECT_EQ(orig_pixels[i * 4 + 0], atten_pixels[i * 4 + 0]);
124
+ EXPECT_EQ(0, atten_pixels[i * 4 + 1]);
125
+ EXPECT_EQ(0, atten_pixels[i * 4 + 2]);
126
+ EXPECT_EQ(255, atten_pixels[i * 4 + 3]);
127
+ }
128
+
129
+ for (int i = 0; i < 1280; ++i) {
130
+ orig_pixels[i * 4 + 0] = i;
131
+ orig_pixels[i * 4 + 1] = i / 2;
132
+ orig_pixels[i * 4 + 2] = i / 3;
133
+ orig_pixels[i * 4 + 3] = i;
134
+ }
135
+ ARGBAttenuate(orig_pixels, 0, atten_pixels, 0, 1280, 1);
136
+ ARGBUnattenuate(atten_pixels, 0, unatten_pixels, 0, 1280, 1);
137
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
138
+ ARGBAttenuate(unatten_pixels, 0, atten2_pixels, 0, 1280, 1);
139
+ }
140
+ for (int i = 0; i < 1280; ++i) {
141
+ EXPECT_NEAR(atten_pixels[i * 4 + 0], atten2_pixels[i * 4 + 0], 1);
142
+ EXPECT_NEAR(atten_pixels[i * 4 + 1], atten2_pixels[i * 4 + 1], 1);
143
+ EXPECT_NEAR(atten_pixels[i * 4 + 2], atten2_pixels[i * 4 + 2], 1);
144
+ EXPECT_NEAR(atten_pixels[i * 4 + 3], atten2_pixels[i * 4 + 3], 1);
145
+ }
146
+ // Make sure transparent, 50% and opaque are fully accurate.
147
+ EXPECT_EQ(0, atten_pixels[0 * 4 + 0]);
148
+ EXPECT_EQ(0, atten_pixels[0 * 4 + 1]);
149
+ EXPECT_EQ(0, atten_pixels[0 * 4 + 2]);
150
+ EXPECT_EQ(0, atten_pixels[0 * 4 + 3]);
151
+ EXPECT_EQ(64, atten_pixels[128 * 4 + 0]);
152
+ EXPECT_EQ(32, atten_pixels[128 * 4 + 1]);
153
+ EXPECT_EQ(21, atten_pixels[128 * 4 + 2]);
154
+ EXPECT_EQ(128, atten_pixels[128 * 4 + 3]);
155
+ EXPECT_EQ(255, atten_pixels[255 * 4 + 0]);
156
+ EXPECT_EQ(127, atten_pixels[255 * 4 + 1]);
157
+ EXPECT_EQ(85, atten_pixels[255 * 4 + 2]);
158
+ EXPECT_EQ(255, atten_pixels[255 * 4 + 3]);
159
+
160
+ free_aligned_buffer_page_end(atten2_pixels);
161
+ free_aligned_buffer_page_end(unatten_pixels);
162
+ free_aligned_buffer_page_end(atten_pixels);
163
+ free_aligned_buffer_page_end(orig_pixels);
164
+ }
165
+
166
+ static int TestAttenuateI(int width,
167
+ int height,
168
+ int benchmark_iterations,
169
+ int disable_cpu_flags,
170
+ int benchmark_cpu_info,
171
+ int invert,
172
+ int off) {
173
+ if (width < 1) {
174
+ width = 1;
175
+ }
176
+ const int kBpp = 4;
177
+ const int kStride = width * kBpp;
178
+ align_buffer_page_end(src_argb, kStride * height + off);
179
+ align_buffer_page_end(dst_argb_c, kStride * height);
180
+ align_buffer_page_end(dst_argb_opt, kStride * height);
181
+ for (int i = 0; i < kStride * height; ++i) {
182
+ src_argb[i + off] = (fastrand() & 0xff);
183
+ }
184
+ memset(dst_argb_c, 0, kStride * height);
185
+ memset(dst_argb_opt, 0, kStride * height);
186
+
187
+ MaskCpuFlags(disable_cpu_flags);
188
+ ARGBAttenuate(src_argb + off, kStride, dst_argb_c, kStride, width,
189
+ invert * height);
190
+ MaskCpuFlags(benchmark_cpu_info);
191
+ for (int i = 0; i < benchmark_iterations; ++i) {
192
+ ARGBAttenuate(src_argb + off, kStride, dst_argb_opt, kStride, width,
193
+ invert * height);
194
+ }
195
+ int max_diff = 0;
196
+ for (int i = 0; i < kStride * height; ++i) {
197
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
198
+ static_cast<int>(dst_argb_opt[i]));
199
+ if (abs_diff > max_diff) {
200
+ max_diff = abs_diff;
201
+ }
202
+ }
203
+ free_aligned_buffer_page_end(src_argb);
204
+ free_aligned_buffer_page_end(dst_argb_c);
205
+ free_aligned_buffer_page_end(dst_argb_opt);
206
+ return max_diff;
207
+ }
208
+
209
+ TEST_F(LibYUVPlanarTest, ARGBAttenuate_Any) {
210
+ int max_diff = TestAttenuateI(benchmark_width_ + 1, benchmark_height_,
211
+ benchmark_iterations_, disable_cpu_flags_,
212
+ benchmark_cpu_info_, +1, 0);
213
+
214
+ EXPECT_EQ(max_diff, 0);
215
+ }
216
+
217
+ TEST_F(LibYUVPlanarTest, ARGBAttenuate_Unaligned) {
218
+ int max_diff =
219
+ TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
220
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
221
+ EXPECT_EQ(max_diff, 0);
222
+ }
223
+
224
+ TEST_F(LibYUVPlanarTest, ARGBAttenuate_Invert) {
225
+ int max_diff =
226
+ TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
227
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
228
+ EXPECT_EQ(max_diff, 0);
229
+ }
230
+
231
+ TEST_F(LibYUVPlanarTest, ARGBAttenuate_Opt) {
232
+ int max_diff =
233
+ TestAttenuateI(benchmark_width_, benchmark_height_, benchmark_iterations_,
234
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
235
+ EXPECT_EQ(max_diff, 0);
236
+ }
237
+
238
+ static int TestUnattenuateI(int width,
239
+ int height,
240
+ int benchmark_iterations,
241
+ int disable_cpu_flags,
242
+ int benchmark_cpu_info,
243
+ int invert,
244
+ int off) {
245
+ if (width < 1) {
246
+ width = 1;
247
+ }
248
+ const int kBpp = 4;
249
+ const int kStride = width * kBpp;
250
+ align_buffer_page_end(src_argb, kStride * height + off);
251
+ align_buffer_page_end(dst_argb_c, kStride * height);
252
+ align_buffer_page_end(dst_argb_opt, kStride * height);
253
+ for (int i = 0; i < kStride * height; ++i) {
254
+ src_argb[i + off] = (fastrand() & 0xff);
255
+ }
256
+ ARGBAttenuate(src_argb + off, kStride, src_argb + off, kStride, width,
257
+ height);
258
+ memset(dst_argb_c, 0, kStride * height);
259
+ memset(dst_argb_opt, 0, kStride * height);
260
+
261
+ MaskCpuFlags(disable_cpu_flags);
262
+ ARGBUnattenuate(src_argb + off, kStride, dst_argb_c, kStride, width,
263
+ invert * height);
264
+ MaskCpuFlags(benchmark_cpu_info);
265
+ for (int i = 0; i < benchmark_iterations; ++i) {
266
+ ARGBUnattenuate(src_argb + off, kStride, dst_argb_opt, kStride, width,
267
+ invert * height);
268
+ }
269
+ int max_diff = 0;
270
+ for (int i = 0; i < kStride * height; ++i) {
271
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
272
+ static_cast<int>(dst_argb_opt[i]));
273
+ if (abs_diff > max_diff) {
274
+ max_diff = abs_diff;
275
+ }
276
+ }
277
+ free_aligned_buffer_page_end(src_argb);
278
+ free_aligned_buffer_page_end(dst_argb_c);
279
+ free_aligned_buffer_page_end(dst_argb_opt);
280
+ return max_diff;
281
+ }
282
+
283
+ TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Any) {
284
+ int max_diff = TestUnattenuateI(benchmark_width_ + 1, benchmark_height_,
285
+ benchmark_iterations_, disable_cpu_flags_,
286
+ benchmark_cpu_info_, +1, 0);
287
+ EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
288
+ }
289
+
290
+ TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Unaligned) {
291
+ int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
292
+ benchmark_iterations_, disable_cpu_flags_,
293
+ benchmark_cpu_info_, +1, 1);
294
+ EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
295
+ }
296
+
297
+ TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Invert) {
298
+ int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
299
+ benchmark_iterations_, disable_cpu_flags_,
300
+ benchmark_cpu_info_, -1, 0);
301
+ EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
302
+ }
303
+
304
+ TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Opt) {
305
+ int max_diff = TestUnattenuateI(benchmark_width_, benchmark_height_,
306
+ benchmark_iterations_, disable_cpu_flags_,
307
+ benchmark_cpu_info_, +1, 0);
308
+ EXPECT_LE(max_diff, EXPECTED_UNATTENUATE_DIFF);
309
+ }
310
+
311
+ TEST_F(LibYUVPlanarTest, TestARGBComputeCumulativeSum) {
312
+ SIMD_ALIGNED(uint8_t orig_pixels[16][16][4]);
313
+ SIMD_ALIGNED(int32_t added_pixels[16][16][4]);
314
+
315
+ for (int y = 0; y < 16; ++y) {
316
+ for (int x = 0; x < 16; ++x) {
317
+ orig_pixels[y][x][0] = 1u;
318
+ orig_pixels[y][x][1] = 2u;
319
+ orig_pixels[y][x][2] = 3u;
320
+ orig_pixels[y][x][3] = 255u;
321
+ }
322
+ }
323
+
324
+ ARGBComputeCumulativeSum(&orig_pixels[0][0][0], 16 * 4,
325
+ &added_pixels[0][0][0], 16 * 4, 16, 16);
326
+
327
+ for (int y = 0; y < 16; ++y) {
328
+ for (int x = 0; x < 16; ++x) {
329
+ EXPECT_EQ((x + 1) * (y + 1), added_pixels[y][x][0]);
330
+ EXPECT_EQ((x + 1) * (y + 1) * 2, added_pixels[y][x][1]);
331
+ EXPECT_EQ((x + 1) * (y + 1) * 3, added_pixels[y][x][2]);
332
+ EXPECT_EQ((x + 1) * (y + 1) * 255, added_pixels[y][x][3]);
333
+ }
334
+ }
335
+ }
336
+
337
+ // near is for legacy platforms.
338
+ TEST_F(LibYUVPlanarTest, TestARGBGray) {
339
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
340
+ memset(orig_pixels, 0, sizeof(orig_pixels));
341
+
342
+ // Test blue
343
+ orig_pixels[0][0] = 255u;
344
+ orig_pixels[0][1] = 0u;
345
+ orig_pixels[0][2] = 0u;
346
+ orig_pixels[0][3] = 128u;
347
+ // Test green
348
+ orig_pixels[1][0] = 0u;
349
+ orig_pixels[1][1] = 255u;
350
+ orig_pixels[1][2] = 0u;
351
+ orig_pixels[1][3] = 0u;
352
+ // Test red
353
+ orig_pixels[2][0] = 0u;
354
+ orig_pixels[2][1] = 0u;
355
+ orig_pixels[2][2] = 255u;
356
+ orig_pixels[2][3] = 255u;
357
+ // Test black
358
+ orig_pixels[3][0] = 0u;
359
+ orig_pixels[3][1] = 0u;
360
+ orig_pixels[3][2] = 0u;
361
+ orig_pixels[3][3] = 255u;
362
+ // Test white
363
+ orig_pixels[4][0] = 255u;
364
+ orig_pixels[4][1] = 255u;
365
+ orig_pixels[4][2] = 255u;
366
+ orig_pixels[4][3] = 255u;
367
+ // Test color
368
+ orig_pixels[5][0] = 16u;
369
+ orig_pixels[5][1] = 64u;
370
+ orig_pixels[5][2] = 192u;
371
+ orig_pixels[5][3] = 224u;
372
+ // Do 16 to test asm version.
373
+ ARGBGray(&orig_pixels[0][0], 0, 0, 0, 16, 1);
374
+ EXPECT_NEAR(29u, orig_pixels[0][0], 1);
375
+ EXPECT_NEAR(29u, orig_pixels[0][1], 1);
376
+ EXPECT_NEAR(29u, orig_pixels[0][2], 1);
377
+ EXPECT_EQ(128u, orig_pixels[0][3]);
378
+ EXPECT_EQ(149u, orig_pixels[1][0]);
379
+ EXPECT_EQ(149u, orig_pixels[1][1]);
380
+ EXPECT_EQ(149u, orig_pixels[1][2]);
381
+ EXPECT_EQ(0u, orig_pixels[1][3]);
382
+ EXPECT_NEAR(77u, orig_pixels[2][0], 1);
383
+ EXPECT_NEAR(77u, orig_pixels[2][1], 1);
384
+ EXPECT_NEAR(77u, orig_pixels[2][2], 1);
385
+ EXPECT_EQ(255u, orig_pixels[2][3]);
386
+ EXPECT_EQ(0u, orig_pixels[3][0]);
387
+ EXPECT_EQ(0u, orig_pixels[3][1]);
388
+ EXPECT_EQ(0u, orig_pixels[3][2]);
389
+ EXPECT_EQ(255u, orig_pixels[3][3]);
390
+ EXPECT_EQ(255u, orig_pixels[4][0]);
391
+ EXPECT_EQ(255u, orig_pixels[4][1]);
392
+ EXPECT_EQ(255u, orig_pixels[4][2]);
393
+ EXPECT_EQ(255u, orig_pixels[4][3]);
394
+ EXPECT_NEAR(97u, orig_pixels[5][0], 1);
395
+ EXPECT_NEAR(97u, orig_pixels[5][1], 1);
396
+ EXPECT_NEAR(97u, orig_pixels[5][2], 1);
397
+ EXPECT_EQ(224u, orig_pixels[5][3]);
398
+ for (int i = 0; i < 1280; ++i) {
399
+ orig_pixels[i][0] = i;
400
+ orig_pixels[i][1] = i / 2;
401
+ orig_pixels[i][2] = i / 3;
402
+ orig_pixels[i][3] = i;
403
+ }
404
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
405
+ ARGBGray(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
406
+ }
407
+ }
408
+
409
+ TEST_F(LibYUVPlanarTest, TestARGBGrayTo) {
410
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
411
+ SIMD_ALIGNED(uint8_t gray_pixels[1280][4]);
412
+ memset(orig_pixels, 0, sizeof(orig_pixels));
413
+
414
+ // Test blue
415
+ orig_pixels[0][0] = 255u;
416
+ orig_pixels[0][1] = 0u;
417
+ orig_pixels[0][2] = 0u;
418
+ orig_pixels[0][3] = 128u;
419
+ // Test green
420
+ orig_pixels[1][0] = 0u;
421
+ orig_pixels[1][1] = 255u;
422
+ orig_pixels[1][2] = 0u;
423
+ orig_pixels[1][3] = 0u;
424
+ // Test red
425
+ orig_pixels[2][0] = 0u;
426
+ orig_pixels[2][1] = 0u;
427
+ orig_pixels[2][2] = 255u;
428
+ orig_pixels[2][3] = 255u;
429
+ // Test black
430
+ orig_pixels[3][0] = 0u;
431
+ orig_pixels[3][1] = 0u;
432
+ orig_pixels[3][2] = 0u;
433
+ orig_pixels[3][3] = 255u;
434
+ // Test white
435
+ orig_pixels[4][0] = 255u;
436
+ orig_pixels[4][1] = 255u;
437
+ orig_pixels[4][2] = 255u;
438
+ orig_pixels[4][3] = 255u;
439
+ // Test color
440
+ orig_pixels[5][0] = 16u;
441
+ orig_pixels[5][1] = 64u;
442
+ orig_pixels[5][2] = 192u;
443
+ orig_pixels[5][3] = 224u;
444
+ // Do 16 to test asm version.
445
+ ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 16, 1);
446
+ EXPECT_NEAR(30u, gray_pixels[0][0], 1);
447
+ EXPECT_NEAR(30u, gray_pixels[0][1], 1);
448
+ EXPECT_NEAR(30u, gray_pixels[0][2], 1);
449
+ EXPECT_NEAR(128u, gray_pixels[0][3], 1);
450
+ EXPECT_NEAR(149u, gray_pixels[1][0], 1);
451
+ EXPECT_NEAR(149u, gray_pixels[1][1], 1);
452
+ EXPECT_NEAR(149u, gray_pixels[1][2], 1);
453
+ EXPECT_NEAR(0u, gray_pixels[1][3], 1);
454
+ EXPECT_NEAR(76u, gray_pixels[2][0], 1);
455
+ EXPECT_NEAR(76u, gray_pixels[2][1], 1);
456
+ EXPECT_NEAR(76u, gray_pixels[2][2], 1);
457
+ EXPECT_NEAR(255u, gray_pixels[2][3], 1);
458
+ EXPECT_NEAR(0u, gray_pixels[3][0], 1);
459
+ EXPECT_NEAR(0u, gray_pixels[3][1], 1);
460
+ EXPECT_NEAR(0u, gray_pixels[3][2], 1);
461
+ EXPECT_NEAR(255u, gray_pixels[3][3], 1);
462
+ EXPECT_NEAR(255u, gray_pixels[4][0], 1);
463
+ EXPECT_NEAR(255u, gray_pixels[4][1], 1);
464
+ EXPECT_NEAR(255u, gray_pixels[4][2], 1);
465
+ EXPECT_NEAR(255u, gray_pixels[4][3], 1);
466
+ EXPECT_NEAR(96u, gray_pixels[5][0], 1);
467
+ EXPECT_NEAR(96u, gray_pixels[5][1], 1);
468
+ EXPECT_NEAR(96u, gray_pixels[5][2], 1);
469
+ EXPECT_NEAR(224u, gray_pixels[5][3], 1);
470
+ for (int i = 0; i < 1280; ++i) {
471
+ orig_pixels[i][0] = i;
472
+ orig_pixels[i][1] = i / 2;
473
+ orig_pixels[i][2] = i / 3;
474
+ orig_pixels[i][3] = i;
475
+ }
476
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
477
+ ARGBGrayTo(&orig_pixels[0][0], 0, &gray_pixels[0][0], 0, 1280, 1);
478
+ }
479
+
480
+ for (int i = 0; i < 256; ++i) {
481
+ orig_pixels[i][0] = i;
482
+ orig_pixels[i][1] = i;
483
+ orig_pixels[i][2] = i;
484
+ orig_pixels[i][3] = i;
485
+ }
486
+ ARGBGray(&orig_pixels[0][0], 0, 0, 0, 256, 1);
487
+ for (int i = 0; i < 256; ++i) {
488
+ EXPECT_EQ(i, orig_pixels[i][0]);
489
+ EXPECT_EQ(i, orig_pixels[i][1]);
490
+ EXPECT_EQ(i, orig_pixels[i][2]);
491
+ EXPECT_EQ(i, orig_pixels[i][3]);
492
+ }
493
+ }
494
+
495
+ TEST_F(LibYUVPlanarTest, TestARGBSepia) {
496
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
497
+ memset(orig_pixels, 0, sizeof(orig_pixels));
498
+
499
+ // Test blue
500
+ orig_pixels[0][0] = 255u;
501
+ orig_pixels[0][1] = 0u;
502
+ orig_pixels[0][2] = 0u;
503
+ orig_pixels[0][3] = 128u;
504
+ // Test green
505
+ orig_pixels[1][0] = 0u;
506
+ orig_pixels[1][1] = 255u;
507
+ orig_pixels[1][2] = 0u;
508
+ orig_pixels[1][3] = 0u;
509
+ // Test red
510
+ orig_pixels[2][0] = 0u;
511
+ orig_pixels[2][1] = 0u;
512
+ orig_pixels[2][2] = 255u;
513
+ orig_pixels[2][3] = 255u;
514
+ // Test black
515
+ orig_pixels[3][0] = 0u;
516
+ orig_pixels[3][1] = 0u;
517
+ orig_pixels[3][2] = 0u;
518
+ orig_pixels[3][3] = 255u;
519
+ // Test white
520
+ orig_pixels[4][0] = 255u;
521
+ orig_pixels[4][1] = 255u;
522
+ orig_pixels[4][2] = 255u;
523
+ orig_pixels[4][3] = 255u;
524
+ // Test color
525
+ orig_pixels[5][0] = 16u;
526
+ orig_pixels[5][1] = 64u;
527
+ orig_pixels[5][2] = 192u;
528
+ orig_pixels[5][3] = 224u;
529
+ // Do 16 to test asm version.
530
+ ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 16, 1);
531
+ EXPECT_EQ(33u, orig_pixels[0][0]);
532
+ EXPECT_EQ(43u, orig_pixels[0][1]);
533
+ EXPECT_EQ(47u, orig_pixels[0][2]);
534
+ EXPECT_EQ(128u, orig_pixels[0][3]);
535
+ EXPECT_EQ(135u, orig_pixels[1][0]);
536
+ EXPECT_EQ(175u, orig_pixels[1][1]);
537
+ EXPECT_EQ(195u, orig_pixels[1][2]);
538
+ EXPECT_EQ(0u, orig_pixels[1][3]);
539
+ EXPECT_EQ(69u, orig_pixels[2][0]);
540
+ EXPECT_EQ(89u, orig_pixels[2][1]);
541
+ EXPECT_EQ(99u, orig_pixels[2][2]);
542
+ EXPECT_EQ(255u, orig_pixels[2][3]);
543
+ EXPECT_EQ(0u, orig_pixels[3][0]);
544
+ EXPECT_EQ(0u, orig_pixels[3][1]);
545
+ EXPECT_EQ(0u, orig_pixels[3][2]);
546
+ EXPECT_EQ(255u, orig_pixels[3][3]);
547
+ EXPECT_EQ(239u, orig_pixels[4][0]);
548
+ EXPECT_EQ(255u, orig_pixels[4][1]);
549
+ EXPECT_EQ(255u, orig_pixels[4][2]);
550
+ EXPECT_EQ(255u, orig_pixels[4][3]);
551
+ EXPECT_EQ(88u, orig_pixels[5][0]);
552
+ EXPECT_EQ(114u, orig_pixels[5][1]);
553
+ EXPECT_EQ(127u, orig_pixels[5][2]);
554
+ EXPECT_EQ(224u, orig_pixels[5][3]);
555
+
556
+ for (int i = 0; i < 1280; ++i) {
557
+ orig_pixels[i][0] = i;
558
+ orig_pixels[i][1] = i / 2;
559
+ orig_pixels[i][2] = i / 3;
560
+ orig_pixels[i][3] = i;
561
+ }
562
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
563
+ ARGBSepia(&orig_pixels[0][0], 0, 0, 0, 1280, 1);
564
+ }
565
+ }
566
+
567
+ TEST_F(LibYUVPlanarTest, TestARGBColorMatrix) {
568
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
569
+ SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
570
+ SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
571
+
572
+ // Matrix for Sepia.
573
+ SIMD_ALIGNED(static const int8_t kRGBToSepia[]) = {
574
+ 17 / 2, 68 / 2, 35 / 2, 0, 22 / 2, 88 / 2, 45 / 2, 0,
575
+ 24 / 2, 98 / 2, 50 / 2, 0, 0, 0, 0, 64, // Copy alpha.
576
+ };
577
+ memset(orig_pixels, 0, sizeof(orig_pixels));
578
+
579
+ // Test blue
580
+ orig_pixels[0][0] = 255u;
581
+ orig_pixels[0][1] = 0u;
582
+ orig_pixels[0][2] = 0u;
583
+ orig_pixels[0][3] = 128u;
584
+ // Test green
585
+ orig_pixels[1][0] = 0u;
586
+ orig_pixels[1][1] = 255u;
587
+ orig_pixels[1][2] = 0u;
588
+ orig_pixels[1][3] = 0u;
589
+ // Test red
590
+ orig_pixels[2][0] = 0u;
591
+ orig_pixels[2][1] = 0u;
592
+ orig_pixels[2][2] = 255u;
593
+ orig_pixels[2][3] = 255u;
594
+ // Test color
595
+ orig_pixels[3][0] = 16u;
596
+ orig_pixels[3][1] = 64u;
597
+ orig_pixels[3][2] = 192u;
598
+ orig_pixels[3][3] = 224u;
599
+ // Do 16 to test asm version.
600
+ ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
601
+ &kRGBToSepia[0], 16, 1);
602
+ EXPECT_EQ(31u, dst_pixels_opt[0][0]);
603
+ EXPECT_EQ(43u, dst_pixels_opt[0][1]);
604
+ EXPECT_EQ(47u, dst_pixels_opt[0][2]);
605
+ EXPECT_EQ(128u, dst_pixels_opt[0][3]);
606
+ EXPECT_EQ(135u, dst_pixels_opt[1][0]);
607
+ EXPECT_EQ(175u, dst_pixels_opt[1][1]);
608
+ EXPECT_EQ(195u, dst_pixels_opt[1][2]);
609
+ EXPECT_EQ(0u, dst_pixels_opt[1][3]);
610
+ EXPECT_EQ(67u, dst_pixels_opt[2][0]);
611
+ EXPECT_EQ(87u, dst_pixels_opt[2][1]);
612
+ EXPECT_EQ(99u, dst_pixels_opt[2][2]);
613
+ EXPECT_EQ(255u, dst_pixels_opt[2][3]);
614
+ EXPECT_EQ(87u, dst_pixels_opt[3][0]);
615
+ EXPECT_EQ(112u, dst_pixels_opt[3][1]);
616
+ EXPECT_EQ(127u, dst_pixels_opt[3][2]);
617
+ EXPECT_EQ(224u, dst_pixels_opt[3][3]);
618
+
619
+ for (int i = 0; i < 1280; ++i) {
620
+ orig_pixels[i][0] = i;
621
+ orig_pixels[i][1] = i / 2;
622
+ orig_pixels[i][2] = i / 3;
623
+ orig_pixels[i][3] = i;
624
+ }
625
+ MaskCpuFlags(disable_cpu_flags_);
626
+ ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
627
+ &kRGBToSepia[0], 1280, 1);
628
+ MaskCpuFlags(benchmark_cpu_info_);
629
+
630
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
631
+ ARGBColorMatrix(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
632
+ &kRGBToSepia[0], 1280, 1);
633
+ }
634
+
635
+ for (int i = 0; i < 1280; ++i) {
636
+ EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
637
+ EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
638
+ EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
639
+ EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
640
+ }
641
+ }
642
+
643
+ TEST_F(LibYUVPlanarTest, TestRGBColorMatrix) {
644
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
645
+
646
+ // Matrix for Sepia.
647
+ SIMD_ALIGNED(static const int8_t kRGBToSepia[]) = {
648
+ 17, 68, 35, 0, 22, 88, 45, 0,
649
+ 24, 98, 50, 0, 0, 0, 0, 0, // Unused but makes matrix 16 bytes.
650
+ };
651
+ memset(orig_pixels, 0, sizeof(orig_pixels));
652
+
653
+ // Test blue
654
+ orig_pixels[0][0] = 255u;
655
+ orig_pixels[0][1] = 0u;
656
+ orig_pixels[0][2] = 0u;
657
+ orig_pixels[0][3] = 128u;
658
+ // Test green
659
+ orig_pixels[1][0] = 0u;
660
+ orig_pixels[1][1] = 255u;
661
+ orig_pixels[1][2] = 0u;
662
+ orig_pixels[1][3] = 0u;
663
+ // Test red
664
+ orig_pixels[2][0] = 0u;
665
+ orig_pixels[2][1] = 0u;
666
+ orig_pixels[2][2] = 255u;
667
+ orig_pixels[2][3] = 255u;
668
+ // Test color
669
+ orig_pixels[3][0] = 16u;
670
+ orig_pixels[3][1] = 64u;
671
+ orig_pixels[3][2] = 192u;
672
+ orig_pixels[3][3] = 224u;
673
+ // Do 16 to test asm version.
674
+ RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 16, 1);
675
+ EXPECT_EQ(31u, orig_pixels[0][0]);
676
+ EXPECT_EQ(43u, orig_pixels[0][1]);
677
+ EXPECT_EQ(47u, orig_pixels[0][2]);
678
+ EXPECT_EQ(128u, orig_pixels[0][3]);
679
+ EXPECT_EQ(135u, orig_pixels[1][0]);
680
+ EXPECT_EQ(175u, orig_pixels[1][1]);
681
+ EXPECT_EQ(195u, orig_pixels[1][2]);
682
+ EXPECT_EQ(0u, orig_pixels[1][3]);
683
+ EXPECT_EQ(67u, orig_pixels[2][0]);
684
+ EXPECT_EQ(87u, orig_pixels[2][1]);
685
+ EXPECT_EQ(99u, orig_pixels[2][2]);
686
+ EXPECT_EQ(255u, orig_pixels[2][3]);
687
+ EXPECT_EQ(87u, orig_pixels[3][0]);
688
+ EXPECT_EQ(112u, orig_pixels[3][1]);
689
+ EXPECT_EQ(127u, orig_pixels[3][2]);
690
+ EXPECT_EQ(224u, orig_pixels[3][3]);
691
+
692
+ for (int i = 0; i < 1280; ++i) {
693
+ orig_pixels[i][0] = i;
694
+ orig_pixels[i][1] = i / 2;
695
+ orig_pixels[i][2] = i / 3;
696
+ orig_pixels[i][3] = i;
697
+ }
698
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
699
+ RGBColorMatrix(&orig_pixels[0][0], 0, &kRGBToSepia[0], 0, 0, 1280, 1);
700
+ }
701
+ }
702
+
703
+ TEST_F(LibYUVPlanarTest, TestARGBColorTable) {
704
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
705
+ memset(orig_pixels, 0, sizeof(orig_pixels));
706
+
707
+ // Matrix for Sepia.
708
+ static const uint8_t kARGBTable[256 * 4] = {
709
+ 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u,
710
+ };
711
+
712
+ orig_pixels[0][0] = 0u;
713
+ orig_pixels[0][1] = 0u;
714
+ orig_pixels[0][2] = 0u;
715
+ orig_pixels[0][3] = 0u;
716
+ orig_pixels[1][0] = 1u;
717
+ orig_pixels[1][1] = 1u;
718
+ orig_pixels[1][2] = 1u;
719
+ orig_pixels[1][3] = 1u;
720
+ orig_pixels[2][0] = 2u;
721
+ orig_pixels[2][1] = 2u;
722
+ orig_pixels[2][2] = 2u;
723
+ orig_pixels[2][3] = 2u;
724
+ orig_pixels[3][0] = 0u;
725
+ orig_pixels[3][1] = 1u;
726
+ orig_pixels[3][2] = 2u;
727
+ orig_pixels[3][3] = 3u;
728
+ // Do 16 to test asm version.
729
+ ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
730
+ EXPECT_EQ(1u, orig_pixels[0][0]);
731
+ EXPECT_EQ(2u, orig_pixels[0][1]);
732
+ EXPECT_EQ(3u, orig_pixels[0][2]);
733
+ EXPECT_EQ(4u, orig_pixels[0][3]);
734
+ EXPECT_EQ(5u, orig_pixels[1][0]);
735
+ EXPECT_EQ(6u, orig_pixels[1][1]);
736
+ EXPECT_EQ(7u, orig_pixels[1][2]);
737
+ EXPECT_EQ(8u, orig_pixels[1][3]);
738
+ EXPECT_EQ(9u, orig_pixels[2][0]);
739
+ EXPECT_EQ(10u, orig_pixels[2][1]);
740
+ EXPECT_EQ(11u, orig_pixels[2][2]);
741
+ EXPECT_EQ(12u, orig_pixels[2][3]);
742
+ EXPECT_EQ(1u, orig_pixels[3][0]);
743
+ EXPECT_EQ(6u, orig_pixels[3][1]);
744
+ EXPECT_EQ(11u, orig_pixels[3][2]);
745
+ EXPECT_EQ(16u, orig_pixels[3][3]);
746
+
747
+ for (int i = 0; i < 1280; ++i) {
748
+ orig_pixels[i][0] = i;
749
+ orig_pixels[i][1] = i / 2;
750
+ orig_pixels[i][2] = i / 3;
751
+ orig_pixels[i][3] = i;
752
+ }
753
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
754
+ ARGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
755
+ }
756
+ }
757
+
758
+ // Same as TestARGBColorTable except alpha does not change.
759
+ TEST_F(LibYUVPlanarTest, TestRGBColorTable) {
760
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
761
+ memset(orig_pixels, 0, sizeof(orig_pixels));
762
+
763
+ // Matrix for Sepia.
764
+ static const uint8_t kARGBTable[256 * 4] = {
765
+ 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u,
766
+ };
767
+
768
+ orig_pixels[0][0] = 0u;
769
+ orig_pixels[0][1] = 0u;
770
+ orig_pixels[0][2] = 0u;
771
+ orig_pixels[0][3] = 0u;
772
+ orig_pixels[1][0] = 1u;
773
+ orig_pixels[1][1] = 1u;
774
+ orig_pixels[1][2] = 1u;
775
+ orig_pixels[1][3] = 1u;
776
+ orig_pixels[2][0] = 2u;
777
+ orig_pixels[2][1] = 2u;
778
+ orig_pixels[2][2] = 2u;
779
+ orig_pixels[2][3] = 2u;
780
+ orig_pixels[3][0] = 0u;
781
+ orig_pixels[3][1] = 1u;
782
+ orig_pixels[3][2] = 2u;
783
+ orig_pixels[3][3] = 3u;
784
+ // Do 16 to test asm version.
785
+ RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 16, 1);
786
+ EXPECT_EQ(1u, orig_pixels[0][0]);
787
+ EXPECT_EQ(2u, orig_pixels[0][1]);
788
+ EXPECT_EQ(3u, orig_pixels[0][2]);
789
+ EXPECT_EQ(0u, orig_pixels[0][3]); // Alpha unchanged.
790
+ EXPECT_EQ(5u, orig_pixels[1][0]);
791
+ EXPECT_EQ(6u, orig_pixels[1][1]);
792
+ EXPECT_EQ(7u, orig_pixels[1][2]);
793
+ EXPECT_EQ(1u, orig_pixels[1][3]); // Alpha unchanged.
794
+ EXPECT_EQ(9u, orig_pixels[2][0]);
795
+ EXPECT_EQ(10u, orig_pixels[2][1]);
796
+ EXPECT_EQ(11u, orig_pixels[2][2]);
797
+ EXPECT_EQ(2u, orig_pixels[2][3]); // Alpha unchanged.
798
+ EXPECT_EQ(1u, orig_pixels[3][0]);
799
+ EXPECT_EQ(6u, orig_pixels[3][1]);
800
+ EXPECT_EQ(11u, orig_pixels[3][2]);
801
+ EXPECT_EQ(3u, orig_pixels[3][3]); // Alpha unchanged.
802
+
803
+ for (int i = 0; i < 1280; ++i) {
804
+ orig_pixels[i][0] = i;
805
+ orig_pixels[i][1] = i / 2;
806
+ orig_pixels[i][2] = i / 3;
807
+ orig_pixels[i][3] = i;
808
+ }
809
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
810
+ RGBColorTable(&orig_pixels[0][0], 0, &kARGBTable[0], 0, 0, 1280, 1);
811
+ }
812
+ }
813
+
814
+ TEST_F(LibYUVPlanarTest, TestARGBQuantize) {
815
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
816
+
817
+ for (int i = 0; i < 1280; ++i) {
818
+ orig_pixels[i][0] = i;
819
+ orig_pixels[i][1] = i / 2;
820
+ orig_pixels[i][2] = i / 3;
821
+ orig_pixels[i][3] = i;
822
+ }
823
+ ARGBQuantize(&orig_pixels[0][0], 0, (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0,
824
+ 1280, 1);
825
+
826
+ for (int i = 0; i < 1280; ++i) {
827
+ EXPECT_EQ((i / 8 * 8 + 8 / 2) & 255, orig_pixels[i][0]);
828
+ EXPECT_EQ((i / 2 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][1]);
829
+ EXPECT_EQ((i / 3 / 8 * 8 + 8 / 2) & 255, orig_pixels[i][2]);
830
+ EXPECT_EQ(i & 255, orig_pixels[i][3]);
831
+ }
832
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
833
+ ARGBQuantize(&orig_pixels[0][0], 0, (65536 + (8 / 2)) / 8, 8, 8 / 2, 0, 0,
834
+ 1280, 1);
835
+ }
836
+ }
837
+
838
+ TEST_F(LibYUVPlanarTest, ARGBMirror_Opt) {
839
+ align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_ * 4);
840
+ align_buffer_page_end(dst_pixels_opt,
841
+ benchmark_width_ * benchmark_height_ * 4);
842
+ align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_ * 4);
843
+
844
+ MemRandomize(src_pixels, benchmark_width_ * benchmark_height_ * 4);
845
+ MaskCpuFlags(disable_cpu_flags_);
846
+ ARGBMirror(src_pixels, benchmark_width_ * 4, dst_pixels_c,
847
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
848
+ MaskCpuFlags(benchmark_cpu_info_);
849
+
850
+ for (int i = 0; i < benchmark_iterations_; ++i) {
851
+ ARGBMirror(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
852
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
853
+ }
854
+ for (int i = 0; i < benchmark_width_ * benchmark_height_ * 4; ++i) {
855
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
856
+ }
857
+ free_aligned_buffer_page_end(src_pixels);
858
+ free_aligned_buffer_page_end(dst_pixels_opt);
859
+ free_aligned_buffer_page_end(dst_pixels_c);
860
+ }
861
+
862
+ TEST_F(LibYUVPlanarTest, MirrorPlane_Opt) {
863
+ align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_);
864
+ align_buffer_page_end(dst_pixels_opt, benchmark_width_ * benchmark_height_);
865
+ align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_);
866
+
867
+ MemRandomize(src_pixels, benchmark_width_ * benchmark_height_);
868
+ MaskCpuFlags(disable_cpu_flags_);
869
+ MirrorPlane(src_pixels, benchmark_width_, dst_pixels_c, benchmark_width_,
870
+ benchmark_width_, benchmark_height_);
871
+ MaskCpuFlags(benchmark_cpu_info_);
872
+
873
+ for (int i = 0; i < benchmark_iterations_; ++i) {
874
+ MirrorPlane(src_pixels, benchmark_width_, dst_pixels_opt, benchmark_width_,
875
+ benchmark_width_, benchmark_height_);
876
+ }
877
+ for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
878
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
879
+ }
880
+ free_aligned_buffer_page_end(src_pixels);
881
+ free_aligned_buffer_page_end(dst_pixels_opt);
882
+ free_aligned_buffer_page_end(dst_pixels_c);
883
+ }
884
+
885
+ TEST_F(LibYUVPlanarTest, MirrorUVPlane_Opt) {
886
+ align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_ * 2);
887
+ align_buffer_page_end(dst_pixels_opt,
888
+ benchmark_width_ * benchmark_height_ * 2);
889
+ align_buffer_page_end(dst_pixels_c, benchmark_width_ * benchmark_height_ * 2);
890
+
891
+ MemRandomize(src_pixels, benchmark_width_ * benchmark_height_ * 2);
892
+ MaskCpuFlags(disable_cpu_flags_);
893
+ MirrorUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_c,
894
+ benchmark_width_ * 2, benchmark_width_, benchmark_height_);
895
+ MaskCpuFlags(benchmark_cpu_info_);
896
+
897
+ for (int i = 0; i < benchmark_iterations_; ++i) {
898
+ MirrorUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_opt,
899
+ benchmark_width_ * 2, benchmark_width_, benchmark_height_);
900
+ }
901
+ for (int i = 0; i < benchmark_width_ * benchmark_height_ * 2; ++i) {
902
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
903
+ }
904
+ free_aligned_buffer_page_end(src_pixels);
905
+ free_aligned_buffer_page_end(dst_pixels_opt);
906
+ free_aligned_buffer_page_end(dst_pixels_c);
907
+ }
908
+
909
+ TEST_F(LibYUVPlanarTest, TestShade) {
910
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
911
+ SIMD_ALIGNED(uint8_t shade_pixels[1280][4]);
912
+ memset(orig_pixels, 0, sizeof(orig_pixels));
913
+
914
+ orig_pixels[0][0] = 10u;
915
+ orig_pixels[0][1] = 20u;
916
+ orig_pixels[0][2] = 40u;
917
+ orig_pixels[0][3] = 80u;
918
+ orig_pixels[1][0] = 0u;
919
+ orig_pixels[1][1] = 0u;
920
+ orig_pixels[1][2] = 0u;
921
+ orig_pixels[1][3] = 255u;
922
+ orig_pixels[2][0] = 0u;
923
+ orig_pixels[2][1] = 0u;
924
+ orig_pixels[2][2] = 0u;
925
+ orig_pixels[2][3] = 0u;
926
+ orig_pixels[3][0] = 0u;
927
+ orig_pixels[3][1] = 0u;
928
+ orig_pixels[3][2] = 0u;
929
+ orig_pixels[3][3] = 0u;
930
+ // Do 8 pixels to allow opt version to be used.
931
+ ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80ffffff);
932
+ EXPECT_EQ(10u, shade_pixels[0][0]);
933
+ EXPECT_EQ(20u, shade_pixels[0][1]);
934
+ EXPECT_EQ(40u, shade_pixels[0][2]);
935
+ EXPECT_EQ(40u, shade_pixels[0][3]);
936
+ EXPECT_EQ(0u, shade_pixels[1][0]);
937
+ EXPECT_EQ(0u, shade_pixels[1][1]);
938
+ EXPECT_EQ(0u, shade_pixels[1][2]);
939
+ EXPECT_EQ(128u, shade_pixels[1][3]);
940
+ EXPECT_EQ(0u, shade_pixels[2][0]);
941
+ EXPECT_EQ(0u, shade_pixels[2][1]);
942
+ EXPECT_EQ(0u, shade_pixels[2][2]);
943
+ EXPECT_EQ(0u, shade_pixels[2][3]);
944
+ EXPECT_EQ(0u, shade_pixels[3][0]);
945
+ EXPECT_EQ(0u, shade_pixels[3][1]);
946
+ EXPECT_EQ(0u, shade_pixels[3][2]);
947
+ EXPECT_EQ(0u, shade_pixels[3][3]);
948
+
949
+ ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x80808080);
950
+ EXPECT_EQ(5u, shade_pixels[0][0]);
951
+ EXPECT_EQ(10u, shade_pixels[0][1]);
952
+ EXPECT_EQ(20u, shade_pixels[0][2]);
953
+ EXPECT_EQ(40u, shade_pixels[0][3]);
954
+
955
+ ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 8, 1, 0x10204080);
956
+ EXPECT_EQ(5u, shade_pixels[0][0]);
957
+ EXPECT_EQ(5u, shade_pixels[0][1]);
958
+ EXPECT_EQ(5u, shade_pixels[0][2]);
959
+ EXPECT_EQ(5u, shade_pixels[0][3]);
960
+
961
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
962
+ ARGBShade(&orig_pixels[0][0], 0, &shade_pixels[0][0], 0, 1280, 1,
963
+ 0x80808080);
964
+ }
965
+ }
966
+
967
+ TEST_F(LibYUVPlanarTest, TestARGBInterpolate) {
968
+ SIMD_ALIGNED(uint8_t orig_pixels_0[1280][4]);
969
+ SIMD_ALIGNED(uint8_t orig_pixels_1[1280][4]);
970
+ SIMD_ALIGNED(uint8_t interpolate_pixels[1280][4]);
971
+ memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
972
+ memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
973
+
974
+ orig_pixels_0[0][0] = 16u;
975
+ orig_pixels_0[0][1] = 32u;
976
+ orig_pixels_0[0][2] = 64u;
977
+ orig_pixels_0[0][3] = 128u;
978
+ orig_pixels_0[1][0] = 0u;
979
+ orig_pixels_0[1][1] = 0u;
980
+ orig_pixels_0[1][2] = 0u;
981
+ orig_pixels_0[1][3] = 255u;
982
+ orig_pixels_0[2][0] = 0u;
983
+ orig_pixels_0[2][1] = 0u;
984
+ orig_pixels_0[2][2] = 0u;
985
+ orig_pixels_0[2][3] = 0u;
986
+ orig_pixels_0[3][0] = 0u;
987
+ orig_pixels_0[3][1] = 0u;
988
+ orig_pixels_0[3][2] = 0u;
989
+ orig_pixels_0[3][3] = 0u;
990
+
991
+ orig_pixels_1[0][0] = 0u;
992
+ orig_pixels_1[0][1] = 0u;
993
+ orig_pixels_1[0][2] = 0u;
994
+ orig_pixels_1[0][3] = 0u;
995
+ orig_pixels_1[1][0] = 0u;
996
+ orig_pixels_1[1][1] = 0u;
997
+ orig_pixels_1[1][2] = 0u;
998
+ orig_pixels_1[1][3] = 0u;
999
+ orig_pixels_1[2][0] = 0u;
1000
+ orig_pixels_1[2][1] = 0u;
1001
+ orig_pixels_1[2][2] = 0u;
1002
+ orig_pixels_1[2][3] = 0u;
1003
+ orig_pixels_1[3][0] = 255u;
1004
+ orig_pixels_1[3][1] = 255u;
1005
+ orig_pixels_1[3][2] = 255u;
1006
+ orig_pixels_1[3][3] = 255u;
1007
+
1008
+ ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1009
+ &interpolate_pixels[0][0], 0, 4, 1, 128);
1010
+ EXPECT_EQ(8u, interpolate_pixels[0][0]);
1011
+ EXPECT_EQ(16u, interpolate_pixels[0][1]);
1012
+ EXPECT_EQ(32u, interpolate_pixels[0][2]);
1013
+ EXPECT_EQ(64u, interpolate_pixels[0][3]);
1014
+ EXPECT_EQ(0u, interpolate_pixels[1][0]);
1015
+ EXPECT_EQ(0u, interpolate_pixels[1][1]);
1016
+ EXPECT_EQ(0u, interpolate_pixels[1][2]);
1017
+ EXPECT_EQ(128u, interpolate_pixels[1][3]);
1018
+ EXPECT_EQ(0u, interpolate_pixels[2][0]);
1019
+ EXPECT_EQ(0u, interpolate_pixels[2][1]);
1020
+ EXPECT_EQ(0u, interpolate_pixels[2][2]);
1021
+ EXPECT_EQ(0u, interpolate_pixels[2][3]);
1022
+ EXPECT_EQ(128u, interpolate_pixels[3][0]);
1023
+ EXPECT_EQ(128u, interpolate_pixels[3][1]);
1024
+ EXPECT_EQ(128u, interpolate_pixels[3][2]);
1025
+ EXPECT_EQ(128u, interpolate_pixels[3][3]);
1026
+
1027
+ ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1028
+ &interpolate_pixels[0][0], 0, 4, 1, 0);
1029
+ EXPECT_EQ(16u, interpolate_pixels[0][0]);
1030
+ EXPECT_EQ(32u, interpolate_pixels[0][1]);
1031
+ EXPECT_EQ(64u, interpolate_pixels[0][2]);
1032
+ EXPECT_EQ(128u, interpolate_pixels[0][3]);
1033
+
1034
+ ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1035
+ &interpolate_pixels[0][0], 0, 4, 1, 192);
1036
+
1037
+ EXPECT_EQ(4u, interpolate_pixels[0][0]);
1038
+ EXPECT_EQ(8u, interpolate_pixels[0][1]);
1039
+ EXPECT_EQ(16u, interpolate_pixels[0][2]);
1040
+ EXPECT_EQ(32u, interpolate_pixels[0][3]);
1041
+
1042
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1043
+ ARGBInterpolate(&orig_pixels_0[0][0], 0, &orig_pixels_1[0][0], 0,
1044
+ &interpolate_pixels[0][0], 0, 1280, 1, 128);
1045
+ }
1046
+ }
1047
+
1048
+ TEST_F(LibYUVPlanarTest, TestInterpolatePlane) {
1049
+ SIMD_ALIGNED(uint8_t orig_pixels_0[1280]);
1050
+ SIMD_ALIGNED(uint8_t orig_pixels_1[1280]);
1051
+ SIMD_ALIGNED(uint8_t interpolate_pixels[1280]);
1052
+ memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
1053
+ memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
1054
+
1055
+ orig_pixels_0[0] = 16u;
1056
+ orig_pixels_0[1] = 32u;
1057
+ orig_pixels_0[2] = 64u;
1058
+ orig_pixels_0[3] = 128u;
1059
+ orig_pixels_0[4] = 0u;
1060
+ orig_pixels_0[5] = 0u;
1061
+ orig_pixels_0[6] = 0u;
1062
+ orig_pixels_0[7] = 255u;
1063
+ orig_pixels_0[8] = 0u;
1064
+ orig_pixels_0[9] = 0u;
1065
+ orig_pixels_0[10] = 0u;
1066
+ orig_pixels_0[11] = 0u;
1067
+ orig_pixels_0[12] = 0u;
1068
+ orig_pixels_0[13] = 0u;
1069
+ orig_pixels_0[14] = 0u;
1070
+ orig_pixels_0[15] = 0u;
1071
+
1072
+ orig_pixels_1[0] = 0u;
1073
+ orig_pixels_1[1] = 0u;
1074
+ orig_pixels_1[2] = 0u;
1075
+ orig_pixels_1[3] = 0u;
1076
+ orig_pixels_1[4] = 0u;
1077
+ orig_pixels_1[5] = 0u;
1078
+ orig_pixels_1[6] = 0u;
1079
+ orig_pixels_1[7] = 0u;
1080
+ orig_pixels_1[8] = 0u;
1081
+ orig_pixels_1[9] = 0u;
1082
+ orig_pixels_1[10] = 0u;
1083
+ orig_pixels_1[11] = 0u;
1084
+ orig_pixels_1[12] = 255u;
1085
+ orig_pixels_1[13] = 255u;
1086
+ orig_pixels_1[14] = 255u;
1087
+ orig_pixels_1[15] = 255u;
1088
+
1089
+ InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1090
+ &interpolate_pixels[0], 0, 16, 1, 128);
1091
+ EXPECT_EQ(8u, interpolate_pixels[0]);
1092
+ EXPECT_EQ(16u, interpolate_pixels[1]);
1093
+ EXPECT_EQ(32u, interpolate_pixels[2]);
1094
+ EXPECT_EQ(64u, interpolate_pixels[3]);
1095
+ EXPECT_EQ(0u, interpolate_pixels[4]);
1096
+ EXPECT_EQ(0u, interpolate_pixels[5]);
1097
+ EXPECT_EQ(0u, interpolate_pixels[6]);
1098
+ EXPECT_EQ(128u, interpolate_pixels[7]);
1099
+ EXPECT_EQ(0u, interpolate_pixels[8]);
1100
+ EXPECT_EQ(0u, interpolate_pixels[9]);
1101
+ EXPECT_EQ(0u, interpolate_pixels[10]);
1102
+ EXPECT_EQ(0u, interpolate_pixels[11]);
1103
+ EXPECT_EQ(128u, interpolate_pixels[12]);
1104
+ EXPECT_EQ(128u, interpolate_pixels[13]);
1105
+ EXPECT_EQ(128u, interpolate_pixels[14]);
1106
+ EXPECT_EQ(128u, interpolate_pixels[15]);
1107
+
1108
+ InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1109
+ &interpolate_pixels[0], 0, 16, 1, 0);
1110
+ EXPECT_EQ(16u, interpolate_pixels[0]);
1111
+ EXPECT_EQ(32u, interpolate_pixels[1]);
1112
+ EXPECT_EQ(64u, interpolate_pixels[2]);
1113
+ EXPECT_EQ(128u, interpolate_pixels[3]);
1114
+
1115
+ InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1116
+ &interpolate_pixels[0], 0, 16, 1, 192);
1117
+
1118
+ EXPECT_EQ(4u, interpolate_pixels[0]);
1119
+ EXPECT_EQ(8u, interpolate_pixels[1]);
1120
+ EXPECT_EQ(16u, interpolate_pixels[2]);
1121
+ EXPECT_EQ(32u, interpolate_pixels[3]);
1122
+
1123
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1124
+ InterpolatePlane(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1125
+ &interpolate_pixels[0], 0, 1280, 1, 123);
1126
+ }
1127
+ }
1128
+
1129
+ TEST_F(LibYUVPlanarTest, TestInterpolatePlane_16) {
1130
+ SIMD_ALIGNED(uint16_t orig_pixels_0[1280]);
1131
+ SIMD_ALIGNED(uint16_t orig_pixels_1[1280]);
1132
+ SIMD_ALIGNED(uint16_t interpolate_pixels[1280]);
1133
+ memset(orig_pixels_0, 0, sizeof(orig_pixels_0));
1134
+ memset(orig_pixels_1, 0, sizeof(orig_pixels_1));
1135
+
1136
+ orig_pixels_0[0] = 16u;
1137
+ orig_pixels_0[1] = 32u;
1138
+ orig_pixels_0[2] = 64u;
1139
+ orig_pixels_0[3] = 128u;
1140
+ orig_pixels_0[4] = 0u;
1141
+ orig_pixels_0[5] = 0u;
1142
+ orig_pixels_0[6] = 0u;
1143
+ orig_pixels_0[7] = 255u;
1144
+ orig_pixels_0[8] = 0u;
1145
+ orig_pixels_0[9] = 0u;
1146
+ orig_pixels_0[10] = 0u;
1147
+ orig_pixels_0[11] = 0u;
1148
+ orig_pixels_0[12] = 0u;
1149
+ orig_pixels_0[13] = 0u;
1150
+ orig_pixels_0[14] = 0u;
1151
+ orig_pixels_0[15] = 0u;
1152
+
1153
+ orig_pixels_1[0] = 0u;
1154
+ orig_pixels_1[1] = 0u;
1155
+ orig_pixels_1[2] = 0u;
1156
+ orig_pixels_1[3] = 0u;
1157
+ orig_pixels_1[4] = 0u;
1158
+ orig_pixels_1[5] = 0u;
1159
+ orig_pixels_1[6] = 0u;
1160
+ orig_pixels_1[7] = 0u;
1161
+ orig_pixels_1[8] = 0u;
1162
+ orig_pixels_1[9] = 0u;
1163
+ orig_pixels_1[10] = 0u;
1164
+ orig_pixels_1[11] = 0u;
1165
+ orig_pixels_1[12] = 255u;
1166
+ orig_pixels_1[13] = 255u;
1167
+ orig_pixels_1[14] = 255u;
1168
+ orig_pixels_1[15] = 255u;
1169
+
1170
+ InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1171
+ &interpolate_pixels[0], 0, 16, 1, 128);
1172
+ EXPECT_EQ(8u, interpolate_pixels[0]);
1173
+ EXPECT_EQ(16u, interpolate_pixels[1]);
1174
+ EXPECT_EQ(32u, interpolate_pixels[2]);
1175
+ EXPECT_EQ(64u, interpolate_pixels[3]);
1176
+ EXPECT_EQ(0u, interpolate_pixels[4]);
1177
+ EXPECT_EQ(0u, interpolate_pixels[5]);
1178
+ EXPECT_EQ(0u, interpolate_pixels[6]);
1179
+ EXPECT_EQ(128u, interpolate_pixels[7]);
1180
+ EXPECT_EQ(0u, interpolate_pixels[8]);
1181
+ EXPECT_EQ(0u, interpolate_pixels[9]);
1182
+ EXPECT_EQ(0u, interpolate_pixels[10]);
1183
+ EXPECT_EQ(0u, interpolate_pixels[11]);
1184
+ EXPECT_EQ(128u, interpolate_pixels[12]);
1185
+ EXPECT_EQ(128u, interpolate_pixels[13]);
1186
+ EXPECT_EQ(128u, interpolate_pixels[14]);
1187
+ EXPECT_EQ(128u, interpolate_pixels[15]);
1188
+
1189
+ InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1190
+ &interpolate_pixels[0], 0, 16, 1, 0);
1191
+ EXPECT_EQ(16u, interpolate_pixels[0]);
1192
+ EXPECT_EQ(32u, interpolate_pixels[1]);
1193
+ EXPECT_EQ(64u, interpolate_pixels[2]);
1194
+ EXPECT_EQ(128u, interpolate_pixels[3]);
1195
+
1196
+ InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1197
+ &interpolate_pixels[0], 0, 16, 1, 192);
1198
+
1199
+ EXPECT_EQ(4u, interpolate_pixels[0]);
1200
+ EXPECT_EQ(8u, interpolate_pixels[1]);
1201
+ EXPECT_EQ(16u, interpolate_pixels[2]);
1202
+ EXPECT_EQ(32u, interpolate_pixels[3]);
1203
+
1204
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1205
+ InterpolatePlane_16(&orig_pixels_0[0], 0, &orig_pixels_1[0], 0,
1206
+ &interpolate_pixels[0], 0, 1280, 1, 123);
1207
+ }
1208
+ }
1209
+
1210
+ #define TESTTERP(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, STRIDE_B, W1280, TERP, \
1211
+ N, NEG, OFF) \
1212
+ TEST_F(LibYUVPlanarTest, ARGBInterpolate##TERP##N) { \
1213
+ const int kWidth = W1280; \
1214
+ const int kHeight = benchmark_height_; \
1215
+ const int kStrideA = \
1216
+ (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \
1217
+ const int kStrideB = \
1218
+ (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \
1219
+ align_buffer_page_end(src_argb_a, kStrideA* kHeight + OFF); \
1220
+ align_buffer_page_end(src_argb_b, kStrideA* kHeight + OFF); \
1221
+ align_buffer_page_end(dst_argb_c, kStrideB* kHeight); \
1222
+ align_buffer_page_end(dst_argb_opt, kStrideB* kHeight); \
1223
+ for (int i = 0; i < kStrideA * kHeight; ++i) { \
1224
+ src_argb_a[i + OFF] = (fastrand() & 0xff); \
1225
+ src_argb_b[i + OFF] = (fastrand() & 0xff); \
1226
+ } \
1227
+ MaskCpuFlags(disable_cpu_flags_); \
1228
+ ARGBInterpolate(src_argb_a + OFF, kStrideA, src_argb_b + OFF, kStrideA, \
1229
+ dst_argb_c, kStrideB, kWidth, NEG kHeight, TERP); \
1230
+ MaskCpuFlags(benchmark_cpu_info_); \
1231
+ for (int i = 0; i < benchmark_iterations_; ++i) { \
1232
+ ARGBInterpolate(src_argb_a + OFF, kStrideA, src_argb_b + OFF, kStrideA, \
1233
+ dst_argb_opt, kStrideB, kWidth, NEG kHeight, TERP); \
1234
+ } \
1235
+ for (int i = 0; i < kStrideB * kHeight; ++i) { \
1236
+ EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \
1237
+ } \
1238
+ free_aligned_buffer_page_end(src_argb_a); \
1239
+ free_aligned_buffer_page_end(src_argb_b); \
1240
+ free_aligned_buffer_page_end(dst_argb_c); \
1241
+ free_aligned_buffer_page_end(dst_argb_opt); \
1242
+ }
1243
+
1244
+ #define TESTINTERPOLATE(TERP) \
1245
+ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_ + 1, TERP, _Any, +, 0) \
1246
+ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Unaligned, +, 1) \
1247
+ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Invert, -, 0) \
1248
+ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Opt, +, 0)
1249
+
1250
+ TESTINTERPOLATE(0)
1251
+ TESTINTERPOLATE(64)
1252
+ TESTINTERPOLATE(128)
1253
+ TESTINTERPOLATE(192)
1254
+ TESTINTERPOLATE(255)
1255
+
1256
+ static int TestBlend(int width,
1257
+ int height,
1258
+ int benchmark_iterations,
1259
+ int disable_cpu_flags,
1260
+ int benchmark_cpu_info,
1261
+ int invert,
1262
+ int off,
1263
+ int attenuate) {
1264
+ if (width < 1) {
1265
+ width = 1;
1266
+ }
1267
+ const int kBpp = 4;
1268
+ const int kStride = width * kBpp;
1269
+ align_buffer_page_end(src_argb_a, kStride * height + off);
1270
+ align_buffer_page_end(src_argb_b, kStride * height + off);
1271
+ align_buffer_page_end(dst_argb_c, kStride * height);
1272
+ align_buffer_page_end(dst_argb_opt, kStride * height);
1273
+ for (int i = 0; i < kStride * height; ++i) {
1274
+ src_argb_a[i + off] = (fastrand() & 0xff);
1275
+ src_argb_b[i + off] = (fastrand() & 0xff);
1276
+ }
1277
+ MemRandomize(src_argb_a, kStride * height + off);
1278
+ MemRandomize(src_argb_b, kStride * height + off);
1279
+ if (attenuate) {
1280
+ ARGBAttenuate(src_argb_a + off, kStride, src_argb_a + off, kStride, width,
1281
+ height);
1282
+ }
1283
+ memset(dst_argb_c, 255, kStride * height);
1284
+ memset(dst_argb_opt, 255, kStride * height);
1285
+
1286
+ MaskCpuFlags(disable_cpu_flags);
1287
+ ARGBBlend(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1288
+ kStride, width, invert * height);
1289
+ MaskCpuFlags(benchmark_cpu_info);
1290
+ for (int i = 0; i < benchmark_iterations; ++i) {
1291
+ ARGBBlend(src_argb_a + off, kStride, src_argb_b + off, kStride,
1292
+ dst_argb_opt, kStride, width, invert * height);
1293
+ }
1294
+ int max_diff = 0;
1295
+ for (int i = 0; i < kStride * height; ++i) {
1296
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1297
+ static_cast<int>(dst_argb_opt[i]));
1298
+ if (abs_diff > max_diff) {
1299
+ max_diff = abs_diff;
1300
+ }
1301
+ }
1302
+ free_aligned_buffer_page_end(src_argb_a);
1303
+ free_aligned_buffer_page_end(src_argb_b);
1304
+ free_aligned_buffer_page_end(dst_argb_c);
1305
+ free_aligned_buffer_page_end(dst_argb_opt);
1306
+ return max_diff;
1307
+ }
1308
+
1309
+ TEST_F(LibYUVPlanarTest, ARGBBlend_Any) {
1310
+ int max_diff =
1311
+ TestBlend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1312
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
1313
+ EXPECT_LE(max_diff, 1);
1314
+ }
1315
+
1316
+ TEST_F(LibYUVPlanarTest, ARGBBlend_Unaligned) {
1317
+ int max_diff =
1318
+ TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1319
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 1);
1320
+ EXPECT_LE(max_diff, 1);
1321
+ }
1322
+
1323
+ TEST_F(LibYUVPlanarTest, ARGBBlend_Invert) {
1324
+ int max_diff =
1325
+ TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1326
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 1);
1327
+ EXPECT_LE(max_diff, 1);
1328
+ }
1329
+
1330
+ TEST_F(LibYUVPlanarTest, ARGBBlend_Unattenuated) {
1331
+ int max_diff =
1332
+ TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1333
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 0);
1334
+ EXPECT_LE(max_diff, 1);
1335
+ }
1336
+
1337
+ TEST_F(LibYUVPlanarTest, ARGBBlend_Opt) {
1338
+ int max_diff =
1339
+ TestBlend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1340
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
1341
+ EXPECT_LE(max_diff, 1);
1342
+ }
1343
+
1344
+ static void TestBlendPlane(int width,
1345
+ int height,
1346
+ int benchmark_iterations,
1347
+ int disable_cpu_flags,
1348
+ int benchmark_cpu_info,
1349
+ int invert,
1350
+ int off) {
1351
+ if (width < 1) {
1352
+ width = 1;
1353
+ }
1354
+ const int kBpp = 1;
1355
+ const int kStride = width * kBpp;
1356
+ align_buffer_page_end(src_argb_a, kStride * height + off);
1357
+ align_buffer_page_end(src_argb_b, kStride * height + off);
1358
+ align_buffer_page_end(src_argb_alpha, kStride * height + off);
1359
+ align_buffer_page_end(dst_argb_c, kStride * height + off);
1360
+ align_buffer_page_end(dst_argb_opt, kStride * height + off);
1361
+ memset(dst_argb_c, 255, kStride * height + off);
1362
+ memset(dst_argb_opt, 255, kStride * height + off);
1363
+
1364
+ // Test source is maintained exactly if alpha is 255.
1365
+ for (int i = 0; i < width; ++i) {
1366
+ src_argb_a[i + off] = i & 255;
1367
+ src_argb_b[i + off] = 255 - (i & 255);
1368
+ }
1369
+ memset(src_argb_alpha + off, 255, width);
1370
+ BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1371
+ src_argb_alpha + off, width, dst_argb_opt + off, width, width, 1);
1372
+ for (int i = 0; i < width; ++i) {
1373
+ EXPECT_EQ(src_argb_a[i + off], dst_argb_opt[i + off]);
1374
+ }
1375
+ // Test destination is maintained exactly if alpha is 0.
1376
+ memset(src_argb_alpha + off, 0, width);
1377
+ BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1378
+ src_argb_alpha + off, width, dst_argb_opt + off, width, width, 1);
1379
+ for (int i = 0; i < width; ++i) {
1380
+ EXPECT_EQ(src_argb_b[i + off], dst_argb_opt[i + off]);
1381
+ }
1382
+ for (int i = 0; i < kStride * height; ++i) {
1383
+ src_argb_a[i + off] = (fastrand() & 0xff);
1384
+ src_argb_b[i + off] = (fastrand() & 0xff);
1385
+ src_argb_alpha[i + off] = (fastrand() & 0xff);
1386
+ }
1387
+
1388
+ MaskCpuFlags(disable_cpu_flags);
1389
+ BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1390
+ src_argb_alpha + off, width, dst_argb_c + off, width, width,
1391
+ invert * height);
1392
+ MaskCpuFlags(benchmark_cpu_info);
1393
+ for (int i = 0; i < benchmark_iterations; ++i) {
1394
+ BlendPlane(src_argb_a + off, width, src_argb_b + off, width,
1395
+ src_argb_alpha + off, width, dst_argb_opt + off, width, width,
1396
+ invert * height);
1397
+ }
1398
+ for (int i = 0; i < kStride * height; ++i) {
1399
+ EXPECT_EQ(dst_argb_c[i + off], dst_argb_opt[i + off]);
1400
+ }
1401
+ free_aligned_buffer_page_end(src_argb_a);
1402
+ free_aligned_buffer_page_end(src_argb_b);
1403
+ free_aligned_buffer_page_end(src_argb_alpha);
1404
+ free_aligned_buffer_page_end(dst_argb_c);
1405
+ free_aligned_buffer_page_end(dst_argb_opt);
1406
+ }
1407
+
1408
+ TEST_F(LibYUVPlanarTest, BlendPlane_Opt) {
1409
+ TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1410
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1411
+ }
1412
+ TEST_F(LibYUVPlanarTest, BlendPlane_Unaligned) {
1413
+ TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1414
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1415
+ }
1416
+ TEST_F(LibYUVPlanarTest, BlendPlane_Any) {
1417
+ TestBlendPlane(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1418
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1419
+ }
1420
+ TEST_F(LibYUVPlanarTest, BlendPlane_Invert) {
1421
+ TestBlendPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1422
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 1);
1423
+ }
1424
+
1425
+ #define SUBSAMPLE(v, a) ((((v) + (a)-1)) / (a))
1426
+
1427
+ static void TestI420Blend(int width,
1428
+ int height,
1429
+ int benchmark_iterations,
1430
+ int disable_cpu_flags,
1431
+ int benchmark_cpu_info,
1432
+ int invert,
1433
+ int off) {
1434
+ width = ((width) > 0) ? (width) : 1;
1435
+ const int kStrideUV = SUBSAMPLE(width, 2);
1436
+ const int kSizeUV = kStrideUV * SUBSAMPLE(height, 2);
1437
+ align_buffer_page_end(src_y0, width * height + off);
1438
+ align_buffer_page_end(src_u0, kSizeUV + off);
1439
+ align_buffer_page_end(src_v0, kSizeUV + off);
1440
+ align_buffer_page_end(src_y1, width * height + off);
1441
+ align_buffer_page_end(src_u1, kSizeUV + off);
1442
+ align_buffer_page_end(src_v1, kSizeUV + off);
1443
+ align_buffer_page_end(src_a, width * height + off);
1444
+ align_buffer_page_end(dst_y_c, width * height + off);
1445
+ align_buffer_page_end(dst_u_c, kSizeUV + off);
1446
+ align_buffer_page_end(dst_v_c, kSizeUV + off);
1447
+ align_buffer_page_end(dst_y_opt, width * height + off);
1448
+ align_buffer_page_end(dst_u_opt, kSizeUV + off);
1449
+ align_buffer_page_end(dst_v_opt, kSizeUV + off);
1450
+
1451
+ MemRandomize(src_y0, width * height + off);
1452
+ MemRandomize(src_u0, kSizeUV + off);
1453
+ MemRandomize(src_v0, kSizeUV + off);
1454
+ MemRandomize(src_y1, width * height + off);
1455
+ MemRandomize(src_u1, kSizeUV + off);
1456
+ MemRandomize(src_v1, kSizeUV + off);
1457
+ MemRandomize(src_a, width * height + off);
1458
+ memset(dst_y_c, 255, width * height + off);
1459
+ memset(dst_u_c, 255, kSizeUV + off);
1460
+ memset(dst_v_c, 255, kSizeUV + off);
1461
+ memset(dst_y_opt, 255, width * height + off);
1462
+ memset(dst_u_opt, 255, kSizeUV + off);
1463
+ memset(dst_v_opt, 255, kSizeUV + off);
1464
+
1465
+ MaskCpuFlags(disable_cpu_flags);
1466
+ I420Blend(src_y0 + off, width, src_u0 + off, kStrideUV, src_v0 + off,
1467
+ kStrideUV, src_y1 + off, width, src_u1 + off, kStrideUV,
1468
+ src_v1 + off, kStrideUV, src_a + off, width, dst_y_c + off, width,
1469
+ dst_u_c + off, kStrideUV, dst_v_c + off, kStrideUV, width,
1470
+ invert * height);
1471
+ MaskCpuFlags(benchmark_cpu_info);
1472
+ for (int i = 0; i < benchmark_iterations; ++i) {
1473
+ I420Blend(src_y0 + off, width, src_u0 + off, kStrideUV, src_v0 + off,
1474
+ kStrideUV, src_y1 + off, width, src_u1 + off, kStrideUV,
1475
+ src_v1 + off, kStrideUV, src_a + off, width, dst_y_opt + off,
1476
+ width, dst_u_opt + off, kStrideUV, dst_v_opt + off, kStrideUV,
1477
+ width, invert * height);
1478
+ }
1479
+ for (int i = 0; i < width * height; ++i) {
1480
+ EXPECT_EQ(dst_y_c[i + off], dst_y_opt[i + off]);
1481
+ }
1482
+ for (int i = 0; i < kSizeUV; ++i) {
1483
+ EXPECT_EQ(dst_u_c[i + off], dst_u_opt[i + off]);
1484
+ EXPECT_EQ(dst_v_c[i + off], dst_v_opt[i + off]);
1485
+ }
1486
+ free_aligned_buffer_page_end(src_y0);
1487
+ free_aligned_buffer_page_end(src_u0);
1488
+ free_aligned_buffer_page_end(src_v0);
1489
+ free_aligned_buffer_page_end(src_y1);
1490
+ free_aligned_buffer_page_end(src_u1);
1491
+ free_aligned_buffer_page_end(src_v1);
1492
+ free_aligned_buffer_page_end(src_a);
1493
+ free_aligned_buffer_page_end(dst_y_c);
1494
+ free_aligned_buffer_page_end(dst_u_c);
1495
+ free_aligned_buffer_page_end(dst_v_c);
1496
+ free_aligned_buffer_page_end(dst_y_opt);
1497
+ free_aligned_buffer_page_end(dst_u_opt);
1498
+ free_aligned_buffer_page_end(dst_v_opt);
1499
+ }
1500
+
1501
+ TEST_F(LibYUVPlanarTest, I420Blend_Opt) {
1502
+ TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1503
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1504
+ }
1505
+ TEST_F(LibYUVPlanarTest, I420Blend_Unaligned) {
1506
+ TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1507
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1508
+ }
1509
+
1510
+ // TODO(fbarchard): DISABLED because _Any uses C. Avoid C and re-enable.
1511
+ TEST_F(LibYUVPlanarTest, DISABLED_I420Blend_Any) {
1512
+ TestI420Blend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1513
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1514
+ }
1515
+ TEST_F(LibYUVPlanarTest, I420Blend_Invert) {
1516
+ TestI420Blend(benchmark_width_, benchmark_height_, benchmark_iterations_,
1517
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1518
+ }
1519
+
1520
+ #ifdef ENABLE_ROW_TESTS
1521
+ TEST_F(LibYUVPlanarTest, TestAffine) {
1522
+ SIMD_ALIGNED(uint8_t orig_pixels_0[1280][4]);
1523
+ SIMD_ALIGNED(uint8_t interpolate_pixels_C[1280][4]);
1524
+
1525
+ for (int i = 0; i < 1280; ++i) {
1526
+ for (int j = 0; j < 4; ++j) {
1527
+ orig_pixels_0[i][j] = i;
1528
+ }
1529
+ }
1530
+
1531
+ float uv_step[4] = {0.f, 0.f, 0.75f, 0.f};
1532
+
1533
+ ARGBAffineRow_C(&orig_pixels_0[0][0], 0, &interpolate_pixels_C[0][0], uv_step,
1534
+ 1280);
1535
+ EXPECT_EQ(0u, interpolate_pixels_C[0][0]);
1536
+ EXPECT_EQ(96u, interpolate_pixels_C[128][0]);
1537
+ EXPECT_EQ(191u, interpolate_pixels_C[255][3]);
1538
+
1539
+ #if defined(HAS_ARGBAFFINEROW_SSE2)
1540
+ SIMD_ALIGNED(uint8_t interpolate_pixels_Opt[1280][4]);
1541
+ ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
1542
+ uv_step, 1280);
1543
+ EXPECT_EQ(0, memcmp(interpolate_pixels_Opt, interpolate_pixels_C, 1280 * 4));
1544
+
1545
+ int has_sse2 = TestCpuFlag(kCpuHasSSE2);
1546
+ if (has_sse2) {
1547
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
1548
+ ARGBAffineRow_SSE2(&orig_pixels_0[0][0], 0, &interpolate_pixels_Opt[0][0],
1549
+ uv_step, 1280);
1550
+ }
1551
+ }
1552
+ #endif
1553
+ }
1554
+ #endif // ENABLE_ROW_TESTS
1555
+
1556
+ static int TestCopyPlane(int benchmark_width,
1557
+ int benchmark_height,
1558
+ int benchmark_iterations,
1559
+ int disable_cpu_flags,
1560
+ int benchmark_cpu_info,
1561
+ int invert,
1562
+ int off) {
1563
+ const int y_plane_size = benchmark_width * benchmark_height;
1564
+ align_buffer_page_end(orig_y, y_plane_size + off);
1565
+ align_buffer_page_end(dst_c, y_plane_size);
1566
+ align_buffer_page_end(dst_opt, y_plane_size);
1567
+
1568
+ MemRandomize(orig_y + off, y_plane_size);
1569
+ memset(dst_c, 1, y_plane_size);
1570
+ memset(dst_opt, 2, y_plane_size);
1571
+
1572
+ // Disable all optimizations.
1573
+ MaskCpuFlags(disable_cpu_flags);
1574
+ for (int i = 0; i < benchmark_iterations; i++) {
1575
+ CopyPlane(orig_y + off, benchmark_width, dst_c, benchmark_width,
1576
+ benchmark_width, benchmark_height * invert);
1577
+ }
1578
+
1579
+ // Enable optimizations.
1580
+ MaskCpuFlags(benchmark_cpu_info);
1581
+ for (int i = 0; i < benchmark_iterations; i++) {
1582
+ CopyPlane(orig_y + off, benchmark_width, dst_opt, benchmark_width,
1583
+ benchmark_width, benchmark_height * invert);
1584
+ }
1585
+
1586
+ int max_diff = 0;
1587
+ for (int i = 0; i < y_plane_size; ++i) {
1588
+ int abs_diff =
1589
+ abs(static_cast<int>(dst_c[i]) - static_cast<int>(dst_opt[i]));
1590
+ if (abs_diff > max_diff) {
1591
+ max_diff = abs_diff;
1592
+ }
1593
+ }
1594
+
1595
+ free_aligned_buffer_page_end(orig_y);
1596
+ free_aligned_buffer_page_end(dst_c);
1597
+ free_aligned_buffer_page_end(dst_opt);
1598
+
1599
+ return max_diff;
1600
+ }
1601
+
1602
+ TEST_F(LibYUVPlanarTest, CopyPlane_Any) {
1603
+ int max_diff = TestCopyPlane(benchmark_width_ + 1, benchmark_height_,
1604
+ benchmark_iterations_, disable_cpu_flags_,
1605
+ benchmark_cpu_info_, +1, 0);
1606
+ EXPECT_LE(max_diff, 0);
1607
+ }
1608
+
1609
+ TEST_F(LibYUVPlanarTest, CopyPlane_Unaligned) {
1610
+ int max_diff =
1611
+ TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1612
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1613
+ EXPECT_LE(max_diff, 0);
1614
+ }
1615
+
1616
+ TEST_F(LibYUVPlanarTest, CopyPlane_Invert) {
1617
+ int max_diff =
1618
+ TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1619
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1620
+ EXPECT_LE(max_diff, 0);
1621
+ }
1622
+
1623
+ TEST_F(LibYUVPlanarTest, CopyPlane_Opt) {
1624
+ int max_diff =
1625
+ TestCopyPlane(benchmark_width_, benchmark_height_, benchmark_iterations_,
1626
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1627
+ EXPECT_LE(max_diff, 0);
1628
+ }
1629
+
1630
+ TEST_F(LibYUVPlanarTest, TestCopyPlaneZero) {
1631
+ // Test to verify copying a rect with a zero height or width does
1632
+ // not touch destination memory.
1633
+ uint8_t src = 42;
1634
+ uint8_t dst = 0;
1635
+
1636
+ // Disable all optimizations.
1637
+ MaskCpuFlags(disable_cpu_flags_);
1638
+ CopyPlane(&src, 0, &dst, 0, 0, 0);
1639
+ EXPECT_EQ(src, 42);
1640
+ EXPECT_EQ(dst, 0);
1641
+
1642
+ CopyPlane(&src, 1, &dst, 1, 1, 0);
1643
+ EXPECT_EQ(src, 42);
1644
+ EXPECT_EQ(dst, 0);
1645
+
1646
+ CopyPlane(&src, 1, &dst, 1, 0, 1);
1647
+ EXPECT_EQ(src, 42);
1648
+ EXPECT_EQ(dst, 0);
1649
+
1650
+ // Enable optimizations.
1651
+ MaskCpuFlags(benchmark_cpu_info_);
1652
+ CopyPlane(&src, 0, &dst, 0, 0, 0);
1653
+ EXPECT_EQ(src, 42);
1654
+ EXPECT_EQ(dst, 0);
1655
+
1656
+ CopyPlane(&src, 1, &dst, 1, 1, 0);
1657
+ EXPECT_EQ(src, 42);
1658
+ EXPECT_EQ(dst, 0);
1659
+
1660
+ CopyPlane(&src, 1, &dst, 1, 0, 1);
1661
+ EXPECT_EQ(src, 42);
1662
+ EXPECT_EQ(dst, 0);
1663
+ }
1664
+
1665
+ TEST_F(LibYUVPlanarTest, TestDetilePlane) {
1666
+ int i, j;
1667
+
1668
+ // orig is tiled. Allocate enough memory for tiles.
1669
+ int tile_width = (benchmark_width_ + 15) & ~15;
1670
+ int tile_height = (benchmark_height_ + 15) & ~15;
1671
+ int tile_plane_size = tile_width * tile_height;
1672
+ int y_plane_size = benchmark_width_ * benchmark_height_;
1673
+ align_buffer_page_end(tile_y, tile_plane_size);
1674
+ align_buffer_page_end(dst_c, y_plane_size);
1675
+ align_buffer_page_end(dst_opt, y_plane_size);
1676
+
1677
+ MemRandomize(tile_y, tile_plane_size);
1678
+ memset(dst_c, 0, y_plane_size);
1679
+ memset(dst_opt, 0, y_plane_size);
1680
+
1681
+ // Disable all optimizations.
1682
+ MaskCpuFlags(disable_cpu_flags_);
1683
+ for (j = 0; j < benchmark_iterations_; j++) {
1684
+ DetilePlane(tile_y, tile_width, dst_c, benchmark_width_, benchmark_width_,
1685
+ benchmark_height_, 16);
1686
+ }
1687
+
1688
+ // Enable optimizations.
1689
+ MaskCpuFlags(benchmark_cpu_info_);
1690
+ for (j = 0; j < benchmark_iterations_; j++) {
1691
+ DetilePlane(tile_y, tile_width, dst_opt, benchmark_width_, benchmark_width_,
1692
+ benchmark_height_, 16);
1693
+ }
1694
+
1695
+ for (i = 0; i < y_plane_size; ++i) {
1696
+ EXPECT_EQ(dst_c[i], dst_opt[i]);
1697
+ }
1698
+
1699
+ free_aligned_buffer_page_end(tile_y);
1700
+ free_aligned_buffer_page_end(dst_c);
1701
+ free_aligned_buffer_page_end(dst_opt);
1702
+ }
1703
+
1704
+ TEST_F(LibYUVPlanarTest, TestDetilePlane_16) {
1705
+ int i, j;
1706
+
1707
+ // orig is tiled. Allocate enough memory for tiles.
1708
+ int tile_width = (benchmark_width_ + 15) & ~15;
1709
+ int tile_height = (benchmark_height_ + 15) & ~15;
1710
+ int tile_plane_size = tile_width * tile_height * 2;
1711
+ int y_plane_size = benchmark_width_ * benchmark_height_ * 2;
1712
+ align_buffer_page_end(tile_y, tile_plane_size);
1713
+ align_buffer_page_end(dst_c, y_plane_size);
1714
+ align_buffer_page_end(dst_opt, y_plane_size);
1715
+
1716
+ MemRandomize(tile_y, tile_plane_size);
1717
+ memset(dst_c, 0, y_plane_size);
1718
+ memset(dst_opt, 0, y_plane_size);
1719
+
1720
+ // Disable all optimizations.
1721
+ MaskCpuFlags(disable_cpu_flags_);
1722
+ for (j = 0; j < benchmark_iterations_; j++) {
1723
+ DetilePlane_16((const uint16_t*)tile_y, tile_width, (uint16_t*)dst_c,
1724
+ benchmark_width_, benchmark_width_, benchmark_height_, 16);
1725
+ }
1726
+
1727
+ // Enable optimizations.
1728
+ MaskCpuFlags(benchmark_cpu_info_);
1729
+ for (j = 0; j < benchmark_iterations_; j++) {
1730
+ DetilePlane_16((const uint16_t*)tile_y, tile_width, (uint16_t*)dst_opt,
1731
+ benchmark_width_, benchmark_width_, benchmark_height_, 16);
1732
+ }
1733
+
1734
+ for (i = 0; i < y_plane_size; ++i) {
1735
+ EXPECT_EQ(dst_c[i], dst_opt[i]);
1736
+ }
1737
+
1738
+ free_aligned_buffer_page_end(tile_y);
1739
+ free_aligned_buffer_page_end(dst_c);
1740
+ free_aligned_buffer_page_end(dst_opt);
1741
+ }
1742
+
1743
+ // Compares DetileSplitUV to 2 step Detile + SplitUV
1744
+ TEST_F(LibYUVPlanarTest, TestDetileSplitUVPlane_Correctness) {
1745
+ int i, j;
1746
+
1747
+ // orig is tiled. Allocate enough memory for tiles.
1748
+ int tile_width = (benchmark_width_ + 15) & ~15;
1749
+ int tile_height = (benchmark_height_ + 15) & ~15;
1750
+ int tile_plane_size = tile_width * tile_height;
1751
+ int uv_plane_size = ((benchmark_width_ + 1) / 2) * benchmark_height_;
1752
+ align_buffer_page_end(tile_uv, tile_plane_size);
1753
+ align_buffer_page_end(detiled_uv, tile_plane_size);
1754
+ align_buffer_page_end(dst_u_two_stage, uv_plane_size);
1755
+ align_buffer_page_end(dst_u_opt, uv_plane_size);
1756
+ align_buffer_page_end(dst_v_two_stage, uv_plane_size);
1757
+ align_buffer_page_end(dst_v_opt, uv_plane_size);
1758
+
1759
+ MemRandomize(tile_uv, tile_plane_size);
1760
+ memset(detiled_uv, 0, tile_plane_size);
1761
+ memset(dst_u_two_stage, 0, uv_plane_size);
1762
+ memset(dst_u_opt, 0, uv_plane_size);
1763
+ memset(dst_v_two_stage, 0, uv_plane_size);
1764
+ memset(dst_v_opt, 0, uv_plane_size);
1765
+
1766
+ DetileSplitUVPlane(tile_uv, tile_width, dst_u_opt, (benchmark_width_ + 1) / 2,
1767
+ dst_v_opt, (benchmark_width_ + 1) / 2, benchmark_width_,
1768
+ benchmark_height_, 16);
1769
+
1770
+ // Benchmark 2 step conversion for comparison.
1771
+ for (j = 0; j < benchmark_iterations_; j++) {
1772
+ DetilePlane(tile_uv, tile_width, detiled_uv, benchmark_width_,
1773
+ benchmark_width_, benchmark_height_, 16);
1774
+ SplitUVPlane(detiled_uv, tile_width, dst_u_two_stage,
1775
+ (benchmark_width_ + 1) / 2, dst_v_two_stage,
1776
+ (benchmark_width_ + 1) / 2, (benchmark_width_ + 1) / 2,
1777
+ benchmark_height_);
1778
+ }
1779
+
1780
+ for (i = 0; i < uv_plane_size; ++i) {
1781
+ EXPECT_EQ(dst_u_two_stage[i], dst_u_opt[i]);
1782
+ EXPECT_EQ(dst_v_two_stage[i], dst_v_opt[i]);
1783
+ }
1784
+
1785
+ free_aligned_buffer_page_end(tile_uv);
1786
+ free_aligned_buffer_page_end(detiled_uv);
1787
+ free_aligned_buffer_page_end(dst_u_two_stage);
1788
+ free_aligned_buffer_page_end(dst_u_opt);
1789
+ free_aligned_buffer_page_end(dst_v_two_stage);
1790
+ free_aligned_buffer_page_end(dst_v_opt);
1791
+ }
1792
+
1793
+ TEST_F(LibYUVPlanarTest, TestDetileSplitUVPlane_Benchmark) {
1794
+ int i, j;
1795
+
1796
+ // orig is tiled. Allocate enough memory for tiles.
1797
+ int tile_width = (benchmark_width_ + 15) & ~15;
1798
+ int tile_height = (benchmark_height_ + 15) & ~15;
1799
+ int tile_plane_size = tile_width * tile_height;
1800
+ int uv_plane_size = ((benchmark_width_ + 1) / 2) * benchmark_height_;
1801
+ align_buffer_page_end(tile_uv, tile_plane_size);
1802
+ align_buffer_page_end(dst_u_c, uv_plane_size);
1803
+ align_buffer_page_end(dst_u_opt, uv_plane_size);
1804
+ align_buffer_page_end(dst_v_c, uv_plane_size);
1805
+ align_buffer_page_end(dst_v_opt, uv_plane_size);
1806
+
1807
+ MemRandomize(tile_uv, tile_plane_size);
1808
+ memset(dst_u_c, 0, uv_plane_size);
1809
+ memset(dst_u_opt, 0, uv_plane_size);
1810
+ memset(dst_v_c, 0, uv_plane_size);
1811
+ memset(dst_v_opt, 0, uv_plane_size);
1812
+
1813
+ // Disable all optimizations.
1814
+ MaskCpuFlags(disable_cpu_flags_);
1815
+
1816
+ DetileSplitUVPlane(tile_uv, tile_width, dst_u_c, (benchmark_width_ + 1) / 2,
1817
+ dst_v_c, (benchmark_width_ + 1) / 2, benchmark_width_,
1818
+ benchmark_height_, 16);
1819
+
1820
+ // Enable optimizations.
1821
+ MaskCpuFlags(benchmark_cpu_info_);
1822
+
1823
+ for (j = 0; j < benchmark_iterations_; j++) {
1824
+ DetileSplitUVPlane(
1825
+ tile_uv, tile_width, dst_u_opt, (benchmark_width_ + 1) / 2, dst_v_opt,
1826
+ (benchmark_width_ + 1) / 2, benchmark_width_, benchmark_height_, 16);
1827
+ }
1828
+
1829
+ for (i = 0; i < uv_plane_size; ++i) {
1830
+ EXPECT_EQ(dst_u_c[i], dst_u_opt[i]);
1831
+ EXPECT_EQ(dst_v_c[i], dst_v_opt[i]);
1832
+ }
1833
+
1834
+ free_aligned_buffer_page_end(tile_uv);
1835
+ free_aligned_buffer_page_end(dst_u_c);
1836
+ free_aligned_buffer_page_end(dst_u_opt);
1837
+ free_aligned_buffer_page_end(dst_v_c);
1838
+ free_aligned_buffer_page_end(dst_v_opt);
1839
+ }
1840
+
1841
+ static int TestMultiply(int width,
1842
+ int height,
1843
+ int benchmark_iterations,
1844
+ int disable_cpu_flags,
1845
+ int benchmark_cpu_info,
1846
+ int invert,
1847
+ int off) {
1848
+ if (width < 1) {
1849
+ width = 1;
1850
+ }
1851
+ const int kBpp = 4;
1852
+ const int kStride = width * kBpp;
1853
+ align_buffer_page_end(src_argb_a, kStride * height + off);
1854
+ align_buffer_page_end(src_argb_b, kStride * height + off);
1855
+ align_buffer_page_end(dst_argb_c, kStride * height);
1856
+ align_buffer_page_end(dst_argb_opt, kStride * height);
1857
+ for (int i = 0; i < kStride * height; ++i) {
1858
+ src_argb_a[i + off] = (fastrand() & 0xff);
1859
+ src_argb_b[i + off] = (fastrand() & 0xff);
1860
+ }
1861
+ memset(dst_argb_c, 0, kStride * height);
1862
+ memset(dst_argb_opt, 0, kStride * height);
1863
+
1864
+ MaskCpuFlags(disable_cpu_flags);
1865
+ ARGBMultiply(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1866
+ kStride, width, invert * height);
1867
+ MaskCpuFlags(benchmark_cpu_info);
1868
+ for (int i = 0; i < benchmark_iterations; ++i) {
1869
+ ARGBMultiply(src_argb_a + off, kStride, src_argb_b + off, kStride,
1870
+ dst_argb_opt, kStride, width, invert * height);
1871
+ }
1872
+ int max_diff = 0;
1873
+ for (int i = 0; i < kStride * height; ++i) {
1874
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1875
+ static_cast<int>(dst_argb_opt[i]));
1876
+ if (abs_diff > max_diff) {
1877
+ max_diff = abs_diff;
1878
+ }
1879
+ }
1880
+ free_aligned_buffer_page_end(src_argb_a);
1881
+ free_aligned_buffer_page_end(src_argb_b);
1882
+ free_aligned_buffer_page_end(dst_argb_c);
1883
+ free_aligned_buffer_page_end(dst_argb_opt);
1884
+ return max_diff;
1885
+ }
1886
+
1887
+ TEST_F(LibYUVPlanarTest, ARGBMultiply_Any) {
1888
+ int max_diff = TestMultiply(benchmark_width_ + 1, benchmark_height_,
1889
+ benchmark_iterations_, disable_cpu_flags_,
1890
+ benchmark_cpu_info_, +1, 0);
1891
+ EXPECT_LE(max_diff, 0);
1892
+ }
1893
+
1894
+ TEST_F(LibYUVPlanarTest, ARGBMultiply_Unaligned) {
1895
+ int max_diff =
1896
+ TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1897
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1898
+ EXPECT_LE(max_diff, 0);
1899
+ }
1900
+
1901
+ TEST_F(LibYUVPlanarTest, ARGBMultiply_Invert) {
1902
+ int max_diff =
1903
+ TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1904
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1905
+ EXPECT_LE(max_diff, 0);
1906
+ }
1907
+
1908
+ TEST_F(LibYUVPlanarTest, ARGBMultiply_Opt) {
1909
+ int max_diff =
1910
+ TestMultiply(benchmark_width_, benchmark_height_, benchmark_iterations_,
1911
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1912
+ EXPECT_LE(max_diff, 0);
1913
+ }
1914
+
1915
+ static int TestAdd(int width,
1916
+ int height,
1917
+ int benchmark_iterations,
1918
+ int disable_cpu_flags,
1919
+ int benchmark_cpu_info,
1920
+ int invert,
1921
+ int off) {
1922
+ if (width < 1) {
1923
+ width = 1;
1924
+ }
1925
+ const int kBpp = 4;
1926
+ const int kStride = width * kBpp;
1927
+ align_buffer_page_end(src_argb_a, kStride * height + off);
1928
+ align_buffer_page_end(src_argb_b, kStride * height + off);
1929
+ align_buffer_page_end(dst_argb_c, kStride * height);
1930
+ align_buffer_page_end(dst_argb_opt, kStride * height);
1931
+ for (int i = 0; i < kStride * height; ++i) {
1932
+ src_argb_a[i + off] = (fastrand() & 0xff);
1933
+ src_argb_b[i + off] = (fastrand() & 0xff);
1934
+ }
1935
+ memset(dst_argb_c, 0, kStride * height);
1936
+ memset(dst_argb_opt, 0, kStride * height);
1937
+
1938
+ MaskCpuFlags(disable_cpu_flags);
1939
+ ARGBAdd(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
1940
+ kStride, width, invert * height);
1941
+ MaskCpuFlags(benchmark_cpu_info);
1942
+ for (int i = 0; i < benchmark_iterations; ++i) {
1943
+ ARGBAdd(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_opt,
1944
+ kStride, width, invert * height);
1945
+ }
1946
+ int max_diff = 0;
1947
+ for (int i = 0; i < kStride * height; ++i) {
1948
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
1949
+ static_cast<int>(dst_argb_opt[i]));
1950
+ if (abs_diff > max_diff) {
1951
+ max_diff = abs_diff;
1952
+ }
1953
+ }
1954
+ free_aligned_buffer_page_end(src_argb_a);
1955
+ free_aligned_buffer_page_end(src_argb_b);
1956
+ free_aligned_buffer_page_end(dst_argb_c);
1957
+ free_aligned_buffer_page_end(dst_argb_opt);
1958
+ return max_diff;
1959
+ }
1960
+
1961
+ TEST_F(LibYUVPlanarTest, ARGBAdd_Any) {
1962
+ int max_diff =
1963
+ TestAdd(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
1964
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1965
+ EXPECT_LE(max_diff, 1);
1966
+ }
1967
+
1968
+ TEST_F(LibYUVPlanarTest, ARGBAdd_Unaligned) {
1969
+ int max_diff =
1970
+ TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1971
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
1972
+ EXPECT_LE(max_diff, 1);
1973
+ }
1974
+
1975
+ TEST_F(LibYUVPlanarTest, ARGBAdd_Invert) {
1976
+ int max_diff =
1977
+ TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1978
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
1979
+ EXPECT_LE(max_diff, 1);
1980
+ }
1981
+
1982
+ TEST_F(LibYUVPlanarTest, ARGBAdd_Opt) {
1983
+ int max_diff =
1984
+ TestAdd(benchmark_width_, benchmark_height_, benchmark_iterations_,
1985
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
1986
+ EXPECT_LE(max_diff, 1);
1987
+ }
1988
+
1989
+ static int TestSubtract(int width,
1990
+ int height,
1991
+ int benchmark_iterations,
1992
+ int disable_cpu_flags,
1993
+ int benchmark_cpu_info,
1994
+ int invert,
1995
+ int off) {
1996
+ if (width < 1) {
1997
+ width = 1;
1998
+ }
1999
+ const int kBpp = 4;
2000
+ const int kStride = width * kBpp;
2001
+ align_buffer_page_end(src_argb_a, kStride * height + off);
2002
+ align_buffer_page_end(src_argb_b, kStride * height + off);
2003
+ align_buffer_page_end(dst_argb_c, kStride * height);
2004
+ align_buffer_page_end(dst_argb_opt, kStride * height);
2005
+ for (int i = 0; i < kStride * height; ++i) {
2006
+ src_argb_a[i + off] = (fastrand() & 0xff);
2007
+ src_argb_b[i + off] = (fastrand() & 0xff);
2008
+ }
2009
+ memset(dst_argb_c, 0, kStride * height);
2010
+ memset(dst_argb_opt, 0, kStride * height);
2011
+
2012
+ MaskCpuFlags(disable_cpu_flags);
2013
+ ARGBSubtract(src_argb_a + off, kStride, src_argb_b + off, kStride, dst_argb_c,
2014
+ kStride, width, invert * height);
2015
+ MaskCpuFlags(benchmark_cpu_info);
2016
+ for (int i = 0; i < benchmark_iterations; ++i) {
2017
+ ARGBSubtract(src_argb_a + off, kStride, src_argb_b + off, kStride,
2018
+ dst_argb_opt, kStride, width, invert * height);
2019
+ }
2020
+ int max_diff = 0;
2021
+ for (int i = 0; i < kStride * height; ++i) {
2022
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2023
+ static_cast<int>(dst_argb_opt[i]));
2024
+ if (abs_diff > max_diff) {
2025
+ max_diff = abs_diff;
2026
+ }
2027
+ }
2028
+ free_aligned_buffer_page_end(src_argb_a);
2029
+ free_aligned_buffer_page_end(src_argb_b);
2030
+ free_aligned_buffer_page_end(dst_argb_c);
2031
+ free_aligned_buffer_page_end(dst_argb_opt);
2032
+ return max_diff;
2033
+ }
2034
+
2035
+ TEST_F(LibYUVPlanarTest, ARGBSubtract_Any) {
2036
+ int max_diff = TestSubtract(benchmark_width_ + 1, benchmark_height_,
2037
+ benchmark_iterations_, disable_cpu_flags_,
2038
+ benchmark_cpu_info_, +1, 0);
2039
+ EXPECT_LE(max_diff, 1);
2040
+ }
2041
+
2042
+ TEST_F(LibYUVPlanarTest, ARGBSubtract_Unaligned) {
2043
+ int max_diff =
2044
+ TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2045
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2046
+ EXPECT_LE(max_diff, 1);
2047
+ }
2048
+
2049
+ TEST_F(LibYUVPlanarTest, ARGBSubtract_Invert) {
2050
+ int max_diff =
2051
+ TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2052
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2053
+ EXPECT_LE(max_diff, 1);
2054
+ }
2055
+
2056
+ TEST_F(LibYUVPlanarTest, ARGBSubtract_Opt) {
2057
+ int max_diff =
2058
+ TestSubtract(benchmark_width_, benchmark_height_, benchmark_iterations_,
2059
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2060
+ EXPECT_LE(max_diff, 1);
2061
+ }
2062
+
2063
+ static int TestSobel(int width,
2064
+ int height,
2065
+ int benchmark_iterations,
2066
+ int disable_cpu_flags,
2067
+ int benchmark_cpu_info,
2068
+ int invert,
2069
+ int off) {
2070
+ if (width < 1) {
2071
+ width = 1;
2072
+ }
2073
+ const int kBpp = 4;
2074
+ const int kStride = width * kBpp;
2075
+ align_buffer_page_end(src_argb_a, kStride * height + off);
2076
+ align_buffer_page_end(dst_argb_c, kStride * height);
2077
+ align_buffer_page_end(dst_argb_opt, kStride * height);
2078
+ memset(src_argb_a, 0, kStride * height + off);
2079
+ for (int i = 0; i < kStride * height; ++i) {
2080
+ src_argb_a[i + off] = (fastrand() & 0xff);
2081
+ }
2082
+ memset(dst_argb_c, 0, kStride * height);
2083
+ memset(dst_argb_opt, 0, kStride * height);
2084
+
2085
+ MaskCpuFlags(disable_cpu_flags);
2086
+ ARGBSobel(src_argb_a + off, kStride, dst_argb_c, kStride, width,
2087
+ invert * height);
2088
+ MaskCpuFlags(benchmark_cpu_info);
2089
+ for (int i = 0; i < benchmark_iterations; ++i) {
2090
+ ARGBSobel(src_argb_a + off, kStride, dst_argb_opt, kStride, width,
2091
+ invert * height);
2092
+ }
2093
+ int max_diff = 0;
2094
+ for (int i = 0; i < kStride * height; ++i) {
2095
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2096
+ static_cast<int>(dst_argb_opt[i]));
2097
+ if (abs_diff > max_diff) {
2098
+ max_diff = abs_diff;
2099
+ }
2100
+ }
2101
+ free_aligned_buffer_page_end(src_argb_a);
2102
+ free_aligned_buffer_page_end(dst_argb_c);
2103
+ free_aligned_buffer_page_end(dst_argb_opt);
2104
+ return max_diff;
2105
+ }
2106
+
2107
+ TEST_F(LibYUVPlanarTest, ARGBSobel_Any) {
2108
+ int max_diff =
2109
+ TestSobel(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2110
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2111
+ EXPECT_EQ(0, max_diff);
2112
+ }
2113
+
2114
+ TEST_F(LibYUVPlanarTest, ARGBSobel_Unaligned) {
2115
+ int max_diff =
2116
+ TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2117
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2118
+ EXPECT_EQ(0, max_diff);
2119
+ }
2120
+
2121
+ TEST_F(LibYUVPlanarTest, ARGBSobel_Invert) {
2122
+ int max_diff =
2123
+ TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2124
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2125
+ EXPECT_EQ(0, max_diff);
2126
+ }
2127
+
2128
+ TEST_F(LibYUVPlanarTest, ARGBSobel_Opt) {
2129
+ int max_diff =
2130
+ TestSobel(benchmark_width_, benchmark_height_, benchmark_iterations_,
2131
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2132
+ EXPECT_EQ(0, max_diff);
2133
+ }
2134
+
2135
+ static int TestSobelToPlane(int width,
2136
+ int height,
2137
+ int benchmark_iterations,
2138
+ int disable_cpu_flags,
2139
+ int benchmark_cpu_info,
2140
+ int invert,
2141
+ int off) {
2142
+ if (width < 1) {
2143
+ width = 1;
2144
+ }
2145
+ const int kSrcBpp = 4;
2146
+ const int kDstBpp = 1;
2147
+ const int kSrcStride = (width * kSrcBpp + 15) & ~15;
2148
+ const int kDstStride = (width * kDstBpp + 15) & ~15;
2149
+ align_buffer_page_end(src_argb_a, kSrcStride * height + off);
2150
+ align_buffer_page_end(dst_argb_c, kDstStride * height);
2151
+ align_buffer_page_end(dst_argb_opt, kDstStride * height);
2152
+ memset(src_argb_a, 0, kSrcStride * height + off);
2153
+ for (int i = 0; i < kSrcStride * height; ++i) {
2154
+ src_argb_a[i + off] = (fastrand() & 0xff);
2155
+ }
2156
+ memset(dst_argb_c, 0, kDstStride * height);
2157
+ memset(dst_argb_opt, 0, kDstStride * height);
2158
+
2159
+ MaskCpuFlags(disable_cpu_flags);
2160
+ ARGBSobelToPlane(src_argb_a + off, kSrcStride, dst_argb_c, kDstStride, width,
2161
+ invert * height);
2162
+ MaskCpuFlags(benchmark_cpu_info);
2163
+ for (int i = 0; i < benchmark_iterations; ++i) {
2164
+ ARGBSobelToPlane(src_argb_a + off, kSrcStride, dst_argb_opt, kDstStride,
2165
+ width, invert * height);
2166
+ }
2167
+ int max_diff = 0;
2168
+ for (int i = 0; i < kDstStride * height; ++i) {
2169
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2170
+ static_cast<int>(dst_argb_opt[i]));
2171
+ if (abs_diff > max_diff) {
2172
+ max_diff = abs_diff;
2173
+ }
2174
+ }
2175
+ free_aligned_buffer_page_end(src_argb_a);
2176
+ free_aligned_buffer_page_end(dst_argb_c);
2177
+ free_aligned_buffer_page_end(dst_argb_opt);
2178
+ return max_diff;
2179
+ }
2180
+
2181
+ TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Any) {
2182
+ int max_diff = TestSobelToPlane(benchmark_width_ + 1, benchmark_height_,
2183
+ benchmark_iterations_, disable_cpu_flags_,
2184
+ benchmark_cpu_info_, +1, 0);
2185
+ EXPECT_EQ(0, max_diff);
2186
+ }
2187
+
2188
+ TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Unaligned) {
2189
+ int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2190
+ benchmark_iterations_, disable_cpu_flags_,
2191
+ benchmark_cpu_info_, +1, 1);
2192
+ EXPECT_EQ(0, max_diff);
2193
+ }
2194
+
2195
+ TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Invert) {
2196
+ int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2197
+ benchmark_iterations_, disable_cpu_flags_,
2198
+ benchmark_cpu_info_, -1, 0);
2199
+ EXPECT_EQ(0, max_diff);
2200
+ }
2201
+
2202
+ TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Opt) {
2203
+ int max_diff = TestSobelToPlane(benchmark_width_, benchmark_height_,
2204
+ benchmark_iterations_, disable_cpu_flags_,
2205
+ benchmark_cpu_info_, +1, 0);
2206
+ EXPECT_EQ(0, max_diff);
2207
+ }
2208
+
2209
+ static int TestSobelXY(int width,
2210
+ int height,
2211
+ int benchmark_iterations,
2212
+ int disable_cpu_flags,
2213
+ int benchmark_cpu_info,
2214
+ int invert,
2215
+ int off) {
2216
+ if (width < 1) {
2217
+ width = 1;
2218
+ }
2219
+ const int kBpp = 4;
2220
+ const int kStride = width * kBpp;
2221
+ align_buffer_page_end(src_argb_a, kStride * height + off);
2222
+ align_buffer_page_end(dst_argb_c, kStride * height);
2223
+ align_buffer_page_end(dst_argb_opt, kStride * height);
2224
+ memset(src_argb_a, 0, kStride * height + off);
2225
+ for (int i = 0; i < kStride * height; ++i) {
2226
+ src_argb_a[i + off] = (fastrand() & 0xff);
2227
+ }
2228
+ memset(dst_argb_c, 0, kStride * height);
2229
+ memset(dst_argb_opt, 0, kStride * height);
2230
+
2231
+ MaskCpuFlags(disable_cpu_flags);
2232
+ ARGBSobelXY(src_argb_a + off, kStride, dst_argb_c, kStride, width,
2233
+ invert * height);
2234
+ MaskCpuFlags(benchmark_cpu_info);
2235
+ for (int i = 0; i < benchmark_iterations; ++i) {
2236
+ ARGBSobelXY(src_argb_a + off, kStride, dst_argb_opt, kStride, width,
2237
+ invert * height);
2238
+ }
2239
+ int max_diff = 0;
2240
+ for (int i = 0; i < kStride * height; ++i) {
2241
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2242
+ static_cast<int>(dst_argb_opt[i]));
2243
+ if (abs_diff > max_diff) {
2244
+ max_diff = abs_diff;
2245
+ }
2246
+ }
2247
+ free_aligned_buffer_page_end(src_argb_a);
2248
+ free_aligned_buffer_page_end(dst_argb_c);
2249
+ free_aligned_buffer_page_end(dst_argb_opt);
2250
+ return max_diff;
2251
+ }
2252
+
2253
+ TEST_F(LibYUVPlanarTest, ARGBSobelXY_Any) {
2254
+ int max_diff = TestSobelXY(benchmark_width_ + 1, benchmark_height_,
2255
+ benchmark_iterations_, disable_cpu_flags_,
2256
+ benchmark_cpu_info_, +1, 0);
2257
+ EXPECT_EQ(0, max_diff);
2258
+ }
2259
+
2260
+ TEST_F(LibYUVPlanarTest, ARGBSobelXY_Unaligned) {
2261
+ int max_diff =
2262
+ TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2263
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1);
2264
+ EXPECT_EQ(0, max_diff);
2265
+ }
2266
+
2267
+ TEST_F(LibYUVPlanarTest, ARGBSobelXY_Invert) {
2268
+ int max_diff =
2269
+ TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2270
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0);
2271
+ EXPECT_EQ(0, max_diff);
2272
+ }
2273
+
2274
+ TEST_F(LibYUVPlanarTest, ARGBSobelXY_Opt) {
2275
+ int max_diff =
2276
+ TestSobelXY(benchmark_width_, benchmark_height_, benchmark_iterations_,
2277
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0);
2278
+ EXPECT_EQ(0, max_diff);
2279
+ }
2280
+
2281
+ static int TestBlur(int width,
2282
+ int height,
2283
+ int benchmark_iterations,
2284
+ int disable_cpu_flags,
2285
+ int benchmark_cpu_info,
2286
+ int invert,
2287
+ int off,
2288
+ int radius) {
2289
+ if (width < 1) {
2290
+ width = 1;
2291
+ }
2292
+ const int kBpp = 4;
2293
+ const int kStride = width * kBpp;
2294
+ align_buffer_page_end(src_argb_a, kStride * height + off);
2295
+ align_buffer_page_end(dst_cumsum, width * height * 16);
2296
+ align_buffer_page_end(dst_argb_c, kStride * height);
2297
+ align_buffer_page_end(dst_argb_opt, kStride * height);
2298
+ for (int i = 0; i < kStride * height; ++i) {
2299
+ src_argb_a[i + off] = (fastrand() & 0xff);
2300
+ }
2301
+ memset(dst_cumsum, 0, width * height * 16);
2302
+ memset(dst_argb_c, 0, kStride * height);
2303
+ memset(dst_argb_opt, 0, kStride * height);
2304
+
2305
+ MaskCpuFlags(disable_cpu_flags);
2306
+ ARGBBlur(src_argb_a + off, kStride, dst_argb_c, kStride,
2307
+ reinterpret_cast<int32_t*>(dst_cumsum), width * 4, width,
2308
+ invert * height, radius);
2309
+ MaskCpuFlags(benchmark_cpu_info);
2310
+ for (int i = 0; i < benchmark_iterations; ++i) {
2311
+ ARGBBlur(src_argb_a + off, kStride, dst_argb_opt, kStride,
2312
+ reinterpret_cast<int32_t*>(dst_cumsum), width * 4, width,
2313
+ invert * height, radius);
2314
+ }
2315
+ int max_diff = 0;
2316
+ for (int i = 0; i < kStride * height; ++i) {
2317
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i]) -
2318
+ static_cast<int>(dst_argb_opt[i]));
2319
+ if (abs_diff > max_diff) {
2320
+ max_diff = abs_diff;
2321
+ }
2322
+ }
2323
+ free_aligned_buffer_page_end(src_argb_a);
2324
+ free_aligned_buffer_page_end(dst_cumsum);
2325
+ free_aligned_buffer_page_end(dst_argb_c);
2326
+ free_aligned_buffer_page_end(dst_argb_opt);
2327
+ return max_diff;
2328
+ }
2329
+
2330
+ #if !defined(DISABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__)
2331
+ #define DISABLED_ARM(name) name
2332
+ #else
2333
+ #define DISABLED_ARM(name) DISABLED_##name
2334
+ #endif
2335
+
2336
+ static const int kBlurSize = 55;
2337
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Any)) {
2338
+ int max_diff =
2339
+ TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2340
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize);
2341
+ EXPECT_LE(max_diff, 1);
2342
+ }
2343
+
2344
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Unaligned)) {
2345
+ int max_diff =
2346
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2347
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSize);
2348
+ EXPECT_LE(max_diff, 1);
2349
+ }
2350
+
2351
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Invert)) {
2352
+ int max_diff =
2353
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2354
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSize);
2355
+ EXPECT_LE(max_diff, 1);
2356
+ }
2357
+
2358
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Opt)) {
2359
+ int max_diff =
2360
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2361
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize);
2362
+ EXPECT_LE(max_diff, 1);
2363
+ }
2364
+
2365
+ static const int kBlurSmallSize = 5;
2366
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Any)) {
2367
+ int max_diff =
2368
+ TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2369
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize);
2370
+ EXPECT_LE(max_diff, 1);
2371
+ }
2372
+
2373
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Unaligned)) {
2374
+ int max_diff =
2375
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2376
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSmallSize);
2377
+ EXPECT_LE(max_diff, 1);
2378
+ }
2379
+
2380
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Invert)) {
2381
+ int max_diff =
2382
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2383
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSmallSize);
2384
+ EXPECT_LE(max_diff, 1);
2385
+ }
2386
+
2387
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Opt)) {
2388
+ int max_diff =
2389
+ TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_,
2390
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize);
2391
+ EXPECT_LE(max_diff, 1);
2392
+ }
2393
+
2394
+ TEST_F(LibYUVPlanarTest, DISABLED_ARM(TestARGBPolynomial)) {
2395
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
2396
+ SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
2397
+ SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
2398
+ memset(orig_pixels, 0, sizeof(orig_pixels));
2399
+
2400
+ SIMD_ALIGNED(static const float kWarmifyPolynomial[16]) = {
2401
+ 0.94230f, -3.03300f, -2.92500f, 0.f, // C0
2402
+ 0.584500f, 1.112000f, 1.535000f, 1.f, // C1 x
2403
+ 0.001313f, -0.002503f, -0.004496f, 0.f, // C2 x * x
2404
+ 0.0f, 0.000006965f, 0.000008781f, 0.f, // C3 x * x * x
2405
+ };
2406
+
2407
+ // Test blue
2408
+ orig_pixels[0][0] = 255u;
2409
+ orig_pixels[0][1] = 0u;
2410
+ orig_pixels[0][2] = 0u;
2411
+ orig_pixels[0][3] = 128u;
2412
+ // Test green
2413
+ orig_pixels[1][0] = 0u;
2414
+ orig_pixels[1][1] = 255u;
2415
+ orig_pixels[1][2] = 0u;
2416
+ orig_pixels[1][3] = 0u;
2417
+ // Test red
2418
+ orig_pixels[2][0] = 0u;
2419
+ orig_pixels[2][1] = 0u;
2420
+ orig_pixels[2][2] = 255u;
2421
+ orig_pixels[2][3] = 255u;
2422
+ // Test white
2423
+ orig_pixels[3][0] = 255u;
2424
+ orig_pixels[3][1] = 255u;
2425
+ orig_pixels[3][2] = 255u;
2426
+ orig_pixels[3][3] = 255u;
2427
+ // Test color
2428
+ orig_pixels[4][0] = 16u;
2429
+ orig_pixels[4][1] = 64u;
2430
+ orig_pixels[4][2] = 192u;
2431
+ orig_pixels[4][3] = 224u;
2432
+ // Do 16 to test asm version.
2433
+ ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2434
+ &kWarmifyPolynomial[0], 16, 1);
2435
+ EXPECT_EQ(235u, dst_pixels_opt[0][0]);
2436
+ EXPECT_EQ(0u, dst_pixels_opt[0][1]);
2437
+ EXPECT_EQ(0u, dst_pixels_opt[0][2]);
2438
+ EXPECT_EQ(128u, dst_pixels_opt[0][3]);
2439
+ EXPECT_EQ(0u, dst_pixels_opt[1][0]);
2440
+ EXPECT_EQ(233u, dst_pixels_opt[1][1]);
2441
+ EXPECT_EQ(0u, dst_pixels_opt[1][2]);
2442
+ EXPECT_EQ(0u, dst_pixels_opt[1][3]);
2443
+ EXPECT_EQ(0u, dst_pixels_opt[2][0]);
2444
+ EXPECT_EQ(0u, dst_pixels_opt[2][1]);
2445
+ EXPECT_EQ(241u, dst_pixels_opt[2][2]);
2446
+ EXPECT_EQ(255u, dst_pixels_opt[2][3]);
2447
+ EXPECT_EQ(235u, dst_pixels_opt[3][0]);
2448
+ EXPECT_EQ(233u, dst_pixels_opt[3][1]);
2449
+ EXPECT_EQ(241u, dst_pixels_opt[3][2]);
2450
+ EXPECT_EQ(255u, dst_pixels_opt[3][3]);
2451
+ EXPECT_EQ(10u, dst_pixels_opt[4][0]);
2452
+ EXPECT_EQ(59u, dst_pixels_opt[4][1]);
2453
+ EXPECT_EQ(188u, dst_pixels_opt[4][2]);
2454
+ EXPECT_EQ(224u, dst_pixels_opt[4][3]);
2455
+
2456
+ for (int i = 0; i < 1280; ++i) {
2457
+ orig_pixels[i][0] = i;
2458
+ orig_pixels[i][1] = i / 2;
2459
+ orig_pixels[i][2] = i / 3;
2460
+ orig_pixels[i][3] = i;
2461
+ }
2462
+
2463
+ MaskCpuFlags(disable_cpu_flags_);
2464
+ ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
2465
+ &kWarmifyPolynomial[0], 1280, 1);
2466
+ MaskCpuFlags(benchmark_cpu_info_);
2467
+
2468
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
2469
+ ARGBPolynomial(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2470
+ &kWarmifyPolynomial[0], 1280, 1);
2471
+ }
2472
+
2473
+ for (int i = 0; i < 1280; ++i) {
2474
+ EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
2475
+ EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
2476
+ EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
2477
+ EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
2478
+ }
2479
+ }
2480
+
2481
+ static int TestHalfFloatPlane(int benchmark_width,
2482
+ int benchmark_height,
2483
+ int benchmark_iterations,
2484
+ int disable_cpu_flags,
2485
+ int benchmark_cpu_info,
2486
+ float scale,
2487
+ int mask,
2488
+ int invert,
2489
+ int off) {
2490
+ int i, j;
2491
+ const int y_plane_size = benchmark_width * benchmark_height * 2;
2492
+ align_buffer_page_end(orig_y, y_plane_size + off);
2493
+ align_buffer_page_end(dst_c, y_plane_size);
2494
+ align_buffer_page_end(dst_opt, y_plane_size);
2495
+
2496
+ MemRandomize(orig_y + off, y_plane_size);
2497
+ memset(dst_c, 1, y_plane_size);
2498
+ memset(dst_opt, 2, y_plane_size);
2499
+
2500
+ for (i = 0; i < y_plane_size / 2; ++i) {
2501
+ reinterpret_cast<uint16_t*>(orig_y + off)[i] &= mask;
2502
+ }
2503
+
2504
+ // Disable all optimizations.
2505
+ MaskCpuFlags(disable_cpu_flags);
2506
+ for (j = 0; j < benchmark_iterations; j++) {
2507
+ HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
2508
+ benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_c),
2509
+ benchmark_width * 2, scale, benchmark_width,
2510
+ benchmark_height * invert);
2511
+ }
2512
+
2513
+ // Enable optimizations.
2514
+ MaskCpuFlags(benchmark_cpu_info);
2515
+ for (j = 0; j < benchmark_iterations; j++) {
2516
+ HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
2517
+ benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_opt),
2518
+ benchmark_width * 2, scale, benchmark_width,
2519
+ benchmark_height * invert);
2520
+ }
2521
+
2522
+ int max_diff = 0;
2523
+ for (i = 0; i < y_plane_size / 2; ++i) {
2524
+ int abs_diff =
2525
+ abs(static_cast<int>(reinterpret_cast<uint16_t*>(dst_c)[i]) -
2526
+ static_cast<int>(reinterpret_cast<uint16_t*>(dst_opt)[i]));
2527
+ if (abs_diff > max_diff) {
2528
+ max_diff = abs_diff;
2529
+ }
2530
+ }
2531
+
2532
+ free_aligned_buffer_page_end(orig_y);
2533
+ free_aligned_buffer_page_end(dst_c);
2534
+ free_aligned_buffer_page_end(dst_opt);
2535
+ return max_diff;
2536
+ }
2537
+
2538
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_One) {
2539
+ int diff = TestHalfFloatPlane(benchmark_width_, benchmark_height_,
2540
+ benchmark_iterations_, disable_cpu_flags_,
2541
+ benchmark_cpu_info_, 1.0f, 65535, +1, 0);
2542
+ EXPECT_LE(diff, 1);
2543
+ }
2544
+
2545
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_Opt) {
2546
+ int diff = TestHalfFloatPlane(
2547
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2548
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2549
+ EXPECT_EQ(0, diff);
2550
+ }
2551
+
2552
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_12bit_Opt) {
2553
+ int diff = TestHalfFloatPlane(
2554
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2555
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4095.0f, 4095, +1, 0);
2556
+ EXPECT_EQ(0, diff);
2557
+ }
2558
+
2559
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_10bit_Opt) {
2560
+ int diff = TestHalfFloatPlane(
2561
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2562
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 1023.0f, 1023, +1, 0);
2563
+ EXPECT_EQ(0, diff);
2564
+ }
2565
+
2566
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_9bit_Opt) {
2567
+ int diff = TestHalfFloatPlane(benchmark_width_, benchmark_height_,
2568
+ benchmark_iterations_, disable_cpu_flags_,
2569
+ benchmark_cpu_info_, 1.0f / 511.0f, 511, +1, 0);
2570
+ EXPECT_EQ(0, diff);
2571
+ }
2572
+
2573
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Any) {
2574
+ int diff = TestHalfFloatPlane(
2575
+ benchmark_width_ + 1, benchmark_height_, benchmark_iterations_,
2576
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 0);
2577
+ EXPECT_EQ(0, diff);
2578
+ }
2579
+
2580
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Unaligned) {
2581
+ int diff = TestHalfFloatPlane(
2582
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2583
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 2);
2584
+ EXPECT_EQ(0, diff);
2585
+ }
2586
+
2587
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Invert) {
2588
+ int diff = TestHalfFloatPlane(
2589
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2590
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, -1, 0);
2591
+ EXPECT_EQ(0, diff);
2592
+ }
2593
+
2594
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_Opt) {
2595
+ int diff = TestHalfFloatPlane(
2596
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2597
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 4096.0f, 4095, +1, 0);
2598
+ EXPECT_EQ(0, diff);
2599
+ }
2600
+
2601
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_denormal) {
2602
+ int diff = TestHalfFloatPlane(
2603
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2604
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2605
+ EXPECT_EQ(0, diff);
2606
+ }
2607
+
2608
+ #if defined(__arm__) && !defined(__SOFTFP__)
2609
+ static void EnableFlushDenormalToZero(void) {
2610
+ uint32_t cw;
2611
+ asm volatile(
2612
+ "vmrs %0, fpscr \n"
2613
+ "orr %0, %0, #0x1000000 \n"
2614
+ "vmsr fpscr, %0 \n"
2615
+ : "=r"(cw)::"memory", "cc"); // Clobber List
2616
+ }
2617
+
2618
+ static void DisableFlushDenormalToZero(void) {
2619
+ uint32_t cw;
2620
+ asm volatile(
2621
+ "vmrs %0, fpscr \n"
2622
+ "bic %0, %0, #0x1000000 \n"
2623
+ "vmsr fpscr, %0 \n"
2624
+ : "=r"(cw)::"memory", "cc"); // Clobber List
2625
+ }
2626
+
2627
+ // 5 bit exponent with bias of 15 will underflow to a denormal if scale causes
2628
+ // exponent to be less than 0. 15 - log2(65536) = -1/ This shouldnt normally
2629
+ // happen since scale is 1/(1<<bits) where bits is 9, 10 or 12.
2630
+
2631
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_16bit_flush_denormal) {
2632
+ // 32 bit arm rounding on denormal case is off by 1 compared to C.
2633
+ EnableFlushDenormalToZero();
2634
+ int diff = TestHalfFloatPlane(
2635
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2636
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 65535.0f, 65535, +1, 0);
2637
+ DisableFlushDenormalToZero();
2638
+ EXPECT_EQ(0, diff);
2639
+ }
2640
+
2641
+ TEST_F(LibYUVPlanarTest, TestHalfFloatPlane_10bit_flush_denormal) {
2642
+ EnableFlushDenormalToZero();
2643
+ int diff = TestHalfFloatPlane(
2644
+ benchmark_width_, benchmark_height_, benchmark_iterations_,
2645
+ disable_cpu_flags_, benchmark_cpu_info_, 1.0f / 1023.0f, 1023, +1, 0);
2646
+ DisableFlushDenormalToZero();
2647
+ EXPECT_EQ(0, diff);
2648
+ }
2649
+ #endif // defined(__arm__) && !defined(__SOFTFP__)
2650
+
2651
+ static float TestByteToFloat(int benchmark_width,
2652
+ int benchmark_height,
2653
+ int benchmark_iterations,
2654
+ int disable_cpu_flags,
2655
+ int benchmark_cpu_info,
2656
+ float scale) {
2657
+ int i, j;
2658
+ const int y_plane_size = benchmark_width * benchmark_height;
2659
+
2660
+ align_buffer_page_end(orig_y, y_plane_size * (1 + 4 + 4));
2661
+ float* dst_opt = reinterpret_cast<float*>(orig_y + y_plane_size);
2662
+ float* dst_c = reinterpret_cast<float*>(orig_y + y_plane_size * 5);
2663
+
2664
+ MemRandomize(orig_y, y_plane_size);
2665
+ memset(dst_c, 0, y_plane_size * 4);
2666
+ memset(dst_opt, 1, y_plane_size * 4);
2667
+
2668
+ // Disable all optimizations.
2669
+ MaskCpuFlags(disable_cpu_flags);
2670
+ ByteToFloat(orig_y, dst_c, scale, y_plane_size);
2671
+
2672
+ // Enable optimizations.
2673
+ MaskCpuFlags(benchmark_cpu_info);
2674
+ for (j = 0; j < benchmark_iterations; j++) {
2675
+ ByteToFloat(orig_y, dst_opt, scale, y_plane_size);
2676
+ }
2677
+
2678
+ float max_diff = 0;
2679
+ for (i = 0; i < y_plane_size; ++i) {
2680
+ float abs_diff = fabs(dst_c[i] - dst_opt[i]);
2681
+ if (abs_diff > max_diff) {
2682
+ max_diff = abs_diff;
2683
+ }
2684
+ }
2685
+
2686
+ free_aligned_buffer_page_end(orig_y);
2687
+ return max_diff;
2688
+ }
2689
+
2690
+ TEST_F(LibYUVPlanarTest, TestByteToFloat) {
2691
+ float diff = TestByteToFloat(benchmark_width_, benchmark_height_,
2692
+ benchmark_iterations_, disable_cpu_flags_,
2693
+ benchmark_cpu_info_, 1.0f);
2694
+ EXPECT_EQ(0.f, diff);
2695
+ }
2696
+
2697
+ TEST_F(LibYUVPlanarTest, TestARGBLumaColorTable) {
2698
+ SIMD_ALIGNED(uint8_t orig_pixels[1280][4]);
2699
+ SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]);
2700
+ SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]);
2701
+ memset(orig_pixels, 0, sizeof(orig_pixels));
2702
+
2703
+ align_buffer_page_end(lumacolortable, 32768);
2704
+ int v = 0;
2705
+ for (int i = 0; i < 32768; ++i) {
2706
+ lumacolortable[i] = v;
2707
+ v += 3;
2708
+ }
2709
+ // Test blue
2710
+ orig_pixels[0][0] = 255u;
2711
+ orig_pixels[0][1] = 0u;
2712
+ orig_pixels[0][2] = 0u;
2713
+ orig_pixels[0][3] = 128u;
2714
+ // Test green
2715
+ orig_pixels[1][0] = 0u;
2716
+ orig_pixels[1][1] = 255u;
2717
+ orig_pixels[1][2] = 0u;
2718
+ orig_pixels[1][3] = 0u;
2719
+ // Test red
2720
+ orig_pixels[2][0] = 0u;
2721
+ orig_pixels[2][1] = 0u;
2722
+ orig_pixels[2][2] = 255u;
2723
+ orig_pixels[2][3] = 255u;
2724
+ // Test color
2725
+ orig_pixels[3][0] = 16u;
2726
+ orig_pixels[3][1] = 64u;
2727
+ orig_pixels[3][2] = 192u;
2728
+ orig_pixels[3][3] = 224u;
2729
+ // Do 16 to test asm version.
2730
+ ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2731
+ &lumacolortable[0], 16, 1);
2732
+ EXPECT_EQ(253u, dst_pixels_opt[0][0]);
2733
+ EXPECT_EQ(0u, dst_pixels_opt[0][1]);
2734
+ EXPECT_EQ(0u, dst_pixels_opt[0][2]);
2735
+ EXPECT_EQ(128u, dst_pixels_opt[0][3]);
2736
+ EXPECT_EQ(0u, dst_pixels_opt[1][0]);
2737
+ EXPECT_EQ(253u, dst_pixels_opt[1][1]);
2738
+ EXPECT_EQ(0u, dst_pixels_opt[1][2]);
2739
+ EXPECT_EQ(0u, dst_pixels_opt[1][3]);
2740
+ EXPECT_EQ(0u, dst_pixels_opt[2][0]);
2741
+ EXPECT_EQ(0u, dst_pixels_opt[2][1]);
2742
+ EXPECT_EQ(253u, dst_pixels_opt[2][2]);
2743
+ EXPECT_EQ(255u, dst_pixels_opt[2][3]);
2744
+ EXPECT_EQ(48u, dst_pixels_opt[3][0]);
2745
+ EXPECT_EQ(192u, dst_pixels_opt[3][1]);
2746
+ EXPECT_EQ(64u, dst_pixels_opt[3][2]);
2747
+ EXPECT_EQ(224u, dst_pixels_opt[3][3]);
2748
+
2749
+ for (int i = 0; i < 1280; ++i) {
2750
+ orig_pixels[i][0] = i;
2751
+ orig_pixels[i][1] = i / 2;
2752
+ orig_pixels[i][2] = i / 3;
2753
+ orig_pixels[i][3] = i;
2754
+ }
2755
+
2756
+ MaskCpuFlags(disable_cpu_flags_);
2757
+ ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_c[0][0], 0,
2758
+ lumacolortable, 1280, 1);
2759
+ MaskCpuFlags(benchmark_cpu_info_);
2760
+
2761
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
2762
+ ARGBLumaColorTable(&orig_pixels[0][0], 0, &dst_pixels_opt[0][0], 0,
2763
+ lumacolortable, 1280, 1);
2764
+ }
2765
+ for (int i = 0; i < 1280; ++i) {
2766
+ EXPECT_EQ(dst_pixels_c[i][0], dst_pixels_opt[i][0]);
2767
+ EXPECT_EQ(dst_pixels_c[i][1], dst_pixels_opt[i][1]);
2768
+ EXPECT_EQ(dst_pixels_c[i][2], dst_pixels_opt[i][2]);
2769
+ EXPECT_EQ(dst_pixels_c[i][3], dst_pixels_opt[i][3]);
2770
+ }
2771
+
2772
+ free_aligned_buffer_page_end(lumacolortable);
2773
+ }
2774
+
2775
+ TEST_F(LibYUVPlanarTest, TestARGBCopyAlpha) {
2776
+ const int kSize = benchmark_width_ * benchmark_height_ * 4;
2777
+ align_buffer_page_end(orig_pixels, kSize);
2778
+ align_buffer_page_end(dst_pixels_opt, kSize);
2779
+ align_buffer_page_end(dst_pixels_c, kSize);
2780
+
2781
+ MemRandomize(orig_pixels, kSize);
2782
+ MemRandomize(dst_pixels_opt, kSize);
2783
+ memcpy(dst_pixels_c, dst_pixels_opt, kSize);
2784
+
2785
+ MaskCpuFlags(disable_cpu_flags_);
2786
+ ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4, dst_pixels_c,
2787
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2788
+ MaskCpuFlags(benchmark_cpu_info_);
2789
+
2790
+ for (int i = 0; i < benchmark_iterations_; ++i) {
2791
+ ARGBCopyAlpha(orig_pixels, benchmark_width_ * 4, dst_pixels_opt,
2792
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2793
+ }
2794
+ for (int i = 0; i < kSize; ++i) {
2795
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2796
+ }
2797
+
2798
+ free_aligned_buffer_page_end(dst_pixels_c);
2799
+ free_aligned_buffer_page_end(dst_pixels_opt);
2800
+ free_aligned_buffer_page_end(orig_pixels);
2801
+ }
2802
+
2803
+ TEST_F(LibYUVPlanarTest, TestARGBExtractAlpha) {
2804
+ const int kPixels = benchmark_width_ * benchmark_height_;
2805
+ align_buffer_page_end(src_pixels, kPixels * 4);
2806
+ align_buffer_page_end(dst_pixels_opt, kPixels);
2807
+ align_buffer_page_end(dst_pixels_c, kPixels);
2808
+
2809
+ MemRandomize(src_pixels, kPixels * 4);
2810
+ MemRandomize(dst_pixels_opt, kPixels);
2811
+ memcpy(dst_pixels_c, dst_pixels_opt, kPixels);
2812
+
2813
+ MaskCpuFlags(disable_cpu_flags_);
2814
+ ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_c,
2815
+ benchmark_width_, benchmark_width_, benchmark_height_);
2816
+ double c_time = get_time();
2817
+ ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_c,
2818
+ benchmark_width_, benchmark_width_, benchmark_height_);
2819
+ c_time = (get_time() - c_time);
2820
+
2821
+ MaskCpuFlags(benchmark_cpu_info_);
2822
+ ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
2823
+ benchmark_width_, benchmark_width_, benchmark_height_);
2824
+ double opt_time = get_time();
2825
+ for (int i = 0; i < benchmark_iterations_; ++i) {
2826
+ ARGBExtractAlpha(src_pixels, benchmark_width_ * 4, dst_pixels_opt,
2827
+ benchmark_width_, benchmark_width_, benchmark_height_);
2828
+ }
2829
+ opt_time = (get_time() - opt_time) / benchmark_iterations_;
2830
+ // Report performance of C vs OPT
2831
+ printf("%8d us C - %8d us OPT\n", static_cast<int>(c_time * 1e6),
2832
+ static_cast<int>(opt_time * 1e6));
2833
+ for (int i = 0; i < kPixels; ++i) {
2834
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2835
+ }
2836
+
2837
+ free_aligned_buffer_page_end(dst_pixels_c);
2838
+ free_aligned_buffer_page_end(dst_pixels_opt);
2839
+ free_aligned_buffer_page_end(src_pixels);
2840
+ }
2841
+
2842
+ TEST_F(LibYUVPlanarTest, TestARGBCopyYToAlpha) {
2843
+ const int kPixels = benchmark_width_ * benchmark_height_;
2844
+ align_buffer_page_end(orig_pixels, kPixels);
2845
+ align_buffer_page_end(dst_pixels_opt, kPixels * 4);
2846
+ align_buffer_page_end(dst_pixels_c, kPixels * 4);
2847
+
2848
+ MemRandomize(orig_pixels, kPixels);
2849
+ MemRandomize(dst_pixels_opt, kPixels * 4);
2850
+ memcpy(dst_pixels_c, dst_pixels_opt, kPixels * 4);
2851
+
2852
+ MaskCpuFlags(disable_cpu_flags_);
2853
+ ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_c,
2854
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2855
+ double c_time = get_time();
2856
+ ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_c,
2857
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2858
+ c_time = (get_time() - c_time);
2859
+
2860
+ MaskCpuFlags(benchmark_cpu_info_);
2861
+ ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_opt,
2862
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2863
+ double opt_time = get_time();
2864
+ for (int i = 0; i < benchmark_iterations_; ++i) {
2865
+ ARGBCopyYToAlpha(orig_pixels, benchmark_width_, dst_pixels_opt,
2866
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
2867
+ }
2868
+ opt_time = (get_time() - opt_time) / benchmark_iterations_;
2869
+
2870
+ // Report performance of C vs OPT
2871
+ printf("%8d us C - %8d us OPT\n", static_cast<int>(c_time * 1e6),
2872
+ static_cast<int>(opt_time * 1e6));
2873
+ for (int i = 0; i < kPixels * 4; ++i) {
2874
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
2875
+ }
2876
+
2877
+ free_aligned_buffer_page_end(dst_pixels_c);
2878
+ free_aligned_buffer_page_end(dst_pixels_opt);
2879
+ free_aligned_buffer_page_end(orig_pixels);
2880
+ }
2881
+
2882
+ static int TestARGBRect(int width,
2883
+ int height,
2884
+ int benchmark_iterations,
2885
+ int disable_cpu_flags,
2886
+ int benchmark_cpu_info,
2887
+ int invert,
2888
+ int off,
2889
+ int bpp) {
2890
+ if (width < 1) {
2891
+ width = 1;
2892
+ }
2893
+ const int kStride = width * bpp;
2894
+ const int kSize = kStride * height;
2895
+ const uint32_t v32 = fastrand() & (bpp == 4 ? 0xffffffff : 0xff);
2896
+
2897
+ align_buffer_page_end(dst_argb_c, kSize + off);
2898
+ align_buffer_page_end(dst_argb_opt, kSize + off);
2899
+
2900
+ MemRandomize(dst_argb_c + off, kSize);
2901
+ memcpy(dst_argb_opt + off, dst_argb_c + off, kSize);
2902
+
2903
+ MaskCpuFlags(disable_cpu_flags);
2904
+ if (bpp == 4) {
2905
+ ARGBRect(dst_argb_c + off, kStride, 0, 0, width, invert * height, v32);
2906
+ } else {
2907
+ SetPlane(dst_argb_c + off, kStride, width, invert * height, v32);
2908
+ }
2909
+
2910
+ MaskCpuFlags(benchmark_cpu_info);
2911
+ for (int i = 0; i < benchmark_iterations; ++i) {
2912
+ if (bpp == 4) {
2913
+ ARGBRect(dst_argb_opt + off, kStride, 0, 0, width, invert * height, v32);
2914
+ } else {
2915
+ SetPlane(dst_argb_opt + off, kStride, width, invert * height, v32);
2916
+ }
2917
+ }
2918
+ int max_diff = 0;
2919
+ for (int i = 0; i < kStride * height; ++i) {
2920
+ int abs_diff = abs(static_cast<int>(dst_argb_c[i + off]) -
2921
+ static_cast<int>(dst_argb_opt[i + off]));
2922
+ if (abs_diff > max_diff) {
2923
+ max_diff = abs_diff;
2924
+ }
2925
+ }
2926
+ free_aligned_buffer_page_end(dst_argb_c);
2927
+ free_aligned_buffer_page_end(dst_argb_opt);
2928
+ return max_diff;
2929
+ }
2930
+
2931
+ TEST_F(LibYUVPlanarTest, ARGBRect_Any) {
2932
+ int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_,
2933
+ benchmark_iterations_, disable_cpu_flags_,
2934
+ benchmark_cpu_info_, +1, 0, 4);
2935
+ EXPECT_EQ(0, max_diff);
2936
+ }
2937
+
2938
+ TEST_F(LibYUVPlanarTest, ARGBRect_Unaligned) {
2939
+ int max_diff =
2940
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2941
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 4);
2942
+ EXPECT_EQ(0, max_diff);
2943
+ }
2944
+
2945
+ TEST_F(LibYUVPlanarTest, ARGBRect_Invert) {
2946
+ int max_diff =
2947
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2948
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 4);
2949
+ EXPECT_EQ(0, max_diff);
2950
+ }
2951
+
2952
+ TEST_F(LibYUVPlanarTest, ARGBRect_Opt) {
2953
+ int max_diff =
2954
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2955
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 4);
2956
+ EXPECT_EQ(0, max_diff);
2957
+ }
2958
+
2959
+ TEST_F(LibYUVPlanarTest, SetPlane_Any) {
2960
+ int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_,
2961
+ benchmark_iterations_, disable_cpu_flags_,
2962
+ benchmark_cpu_info_, +1, 0, 1);
2963
+ EXPECT_EQ(0, max_diff);
2964
+ }
2965
+
2966
+ TEST_F(LibYUVPlanarTest, SetPlane_Unaligned) {
2967
+ int max_diff =
2968
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2969
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 1, 1);
2970
+ EXPECT_EQ(0, max_diff);
2971
+ }
2972
+
2973
+ TEST_F(LibYUVPlanarTest, SetPlane_Invert) {
2974
+ int max_diff =
2975
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2976
+ disable_cpu_flags_, benchmark_cpu_info_, -1, 0, 1);
2977
+ EXPECT_EQ(0, max_diff);
2978
+ }
2979
+
2980
+ TEST_F(LibYUVPlanarTest, SetPlane_Opt) {
2981
+ int max_diff =
2982
+ TestARGBRect(benchmark_width_, benchmark_height_, benchmark_iterations_,
2983
+ disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1);
2984
+ EXPECT_EQ(0, max_diff);
2985
+ }
2986
+
2987
+ TEST_F(LibYUVPlanarTest, MergeUVPlane_Opt) {
2988
+ const int kPixels = benchmark_width_ * benchmark_height_;
2989
+ align_buffer_page_end(src_pixels_u, kPixels);
2990
+ align_buffer_page_end(src_pixels_v, kPixels);
2991
+ align_buffer_page_end(dst_pixels_opt, kPixels * 2);
2992
+ align_buffer_page_end(dst_pixels_c, kPixels * 2);
2993
+
2994
+ MemRandomize(src_pixels_u, kPixels);
2995
+ MemRandomize(src_pixels_v, kPixels);
2996
+ MemRandomize(dst_pixels_opt, kPixels * 2);
2997
+ MemRandomize(dst_pixels_c, kPixels * 2);
2998
+
2999
+ MaskCpuFlags(disable_cpu_flags_);
3000
+ MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_,
3001
+ dst_pixels_c, benchmark_width_ * 2, benchmark_width_,
3002
+ benchmark_height_);
3003
+ MaskCpuFlags(benchmark_cpu_info_);
3004
+
3005
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3006
+ MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_,
3007
+ dst_pixels_opt, benchmark_width_ * 2, benchmark_width_,
3008
+ benchmark_height_);
3009
+ }
3010
+
3011
+ for (int i = 0; i < kPixels * 2; ++i) {
3012
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3013
+ }
3014
+
3015
+ free_aligned_buffer_page_end(src_pixels_u);
3016
+ free_aligned_buffer_page_end(src_pixels_v);
3017
+ free_aligned_buffer_page_end(dst_pixels_opt);
3018
+ free_aligned_buffer_page_end(dst_pixels_c);
3019
+ }
3020
+
3021
+ // 16 bit channel split and merge
3022
+ TEST_F(LibYUVPlanarTest, MergeUVPlane_16_Opt) {
3023
+ const int kPixels = benchmark_width_ * benchmark_height_;
3024
+ align_buffer_page_end(src_pixels_u, kPixels * 2);
3025
+ align_buffer_page_end(src_pixels_v, kPixels * 2);
3026
+ align_buffer_page_end(dst_pixels_opt, kPixels * 2 * 2);
3027
+ align_buffer_page_end(dst_pixels_c, kPixels * 2 * 2);
3028
+ MemRandomize(src_pixels_u, kPixels * 2);
3029
+ MemRandomize(src_pixels_v, kPixels * 2);
3030
+ MemRandomize(dst_pixels_opt, kPixels * 2 * 2);
3031
+ MemRandomize(dst_pixels_c, kPixels * 2 * 2);
3032
+
3033
+ MaskCpuFlags(disable_cpu_flags_);
3034
+ MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_,
3035
+ (const uint16_t*)src_pixels_v, benchmark_width_,
3036
+ (uint16_t*)dst_pixels_c, benchmark_width_ * 2,
3037
+ benchmark_width_, benchmark_height_, 12);
3038
+ MaskCpuFlags(benchmark_cpu_info_);
3039
+
3040
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3041
+ MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_,
3042
+ (const uint16_t*)src_pixels_v, benchmark_width_,
3043
+ (uint16_t*)dst_pixels_opt, benchmark_width_ * 2,
3044
+ benchmark_width_, benchmark_height_, 12);
3045
+ }
3046
+
3047
+ for (int i = 0; i < kPixels * 2 * 2; ++i) {
3048
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3049
+ }
3050
+ free_aligned_buffer_page_end(src_pixels_u);
3051
+ free_aligned_buffer_page_end(src_pixels_v);
3052
+ free_aligned_buffer_page_end(dst_pixels_opt);
3053
+ free_aligned_buffer_page_end(dst_pixels_c);
3054
+ }
3055
+
3056
+ TEST_F(LibYUVPlanarTest, SplitUVPlane_Opt) {
3057
+ const int kPixels = benchmark_width_ * benchmark_height_;
3058
+ align_buffer_page_end(src_pixels, kPixels * 2);
3059
+ align_buffer_page_end(dst_pixels_u_c, kPixels);
3060
+ align_buffer_page_end(dst_pixels_v_c, kPixels);
3061
+ align_buffer_page_end(dst_pixels_u_opt, kPixels);
3062
+ align_buffer_page_end(dst_pixels_v_opt, kPixels);
3063
+
3064
+ MemRandomize(src_pixels, kPixels * 2);
3065
+ MemRandomize(dst_pixels_u_c, kPixels);
3066
+ MemRandomize(dst_pixels_v_c, kPixels);
3067
+ MemRandomize(dst_pixels_u_opt, kPixels);
3068
+ MemRandomize(dst_pixels_v_opt, kPixels);
3069
+
3070
+ MaskCpuFlags(disable_cpu_flags_);
3071
+ SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_c,
3072
+ benchmark_width_, dst_pixels_v_c, benchmark_width_,
3073
+ benchmark_width_, benchmark_height_);
3074
+ MaskCpuFlags(benchmark_cpu_info_);
3075
+
3076
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3077
+ SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_opt,
3078
+ benchmark_width_, dst_pixels_v_opt, benchmark_width_,
3079
+ benchmark_width_, benchmark_height_);
3080
+ }
3081
+
3082
+ for (int i = 0; i < kPixels; ++i) {
3083
+ EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]);
3084
+ EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]);
3085
+ }
3086
+
3087
+ free_aligned_buffer_page_end(src_pixels);
3088
+ free_aligned_buffer_page_end(dst_pixels_u_c);
3089
+ free_aligned_buffer_page_end(dst_pixels_v_c);
3090
+ free_aligned_buffer_page_end(dst_pixels_u_opt);
3091
+ free_aligned_buffer_page_end(dst_pixels_v_opt);
3092
+ }
3093
+
3094
+ // 16 bit channel split
3095
+ TEST_F(LibYUVPlanarTest, SplitUVPlane_16_Opt) {
3096
+ const int kPixels = benchmark_width_ * benchmark_height_;
3097
+ align_buffer_page_end(src_pixels, kPixels * 2 * 2);
3098
+ align_buffer_page_end(dst_pixels_u_c, kPixels * 2);
3099
+ align_buffer_page_end(dst_pixels_v_c, kPixels * 2);
3100
+ align_buffer_page_end(dst_pixels_u_opt, kPixels * 2);
3101
+ align_buffer_page_end(dst_pixels_v_opt, kPixels * 2);
3102
+ MemRandomize(src_pixels, kPixels * 2 * 2);
3103
+ MemRandomize(dst_pixels_u_c, kPixels * 2);
3104
+ MemRandomize(dst_pixels_v_c, kPixels * 2);
3105
+ MemRandomize(dst_pixels_u_opt, kPixels * 2);
3106
+ MemRandomize(dst_pixels_v_opt, kPixels * 2);
3107
+
3108
+ MaskCpuFlags(disable_cpu_flags_);
3109
+ SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2,
3110
+ (uint16_t*)dst_pixels_u_c, benchmark_width_,
3111
+ (uint16_t*)dst_pixels_v_c, benchmark_width_, benchmark_width_,
3112
+ benchmark_height_, 10);
3113
+ MaskCpuFlags(benchmark_cpu_info_);
3114
+
3115
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3116
+ SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2,
3117
+ (uint16_t*)dst_pixels_u_opt, benchmark_width_,
3118
+ (uint16_t*)dst_pixels_v_opt, benchmark_width_,
3119
+ benchmark_width_, benchmark_height_, 10);
3120
+ }
3121
+
3122
+ for (int i = 0; i < kPixels * 2; ++i) {
3123
+ EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]);
3124
+ EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]);
3125
+ }
3126
+ free_aligned_buffer_page_end(src_pixels);
3127
+ free_aligned_buffer_page_end(dst_pixels_u_c);
3128
+ free_aligned_buffer_page_end(dst_pixels_v_c);
3129
+ free_aligned_buffer_page_end(dst_pixels_u_opt);
3130
+ free_aligned_buffer_page_end(dst_pixels_v_opt);
3131
+ }
3132
+
3133
+ TEST_F(LibYUVPlanarTest, SwapUVPlane_Opt) {
3134
+ // Round count up to multiple of 16
3135
+ const int kPixels = benchmark_width_ * benchmark_height_;
3136
+ align_buffer_page_end(src_pixels, kPixels * 2);
3137
+ align_buffer_page_end(dst_pixels_opt, kPixels * 2);
3138
+ align_buffer_page_end(dst_pixels_c, kPixels * 2);
3139
+
3140
+ MemRandomize(src_pixels, kPixels * 2);
3141
+ MemRandomize(dst_pixels_opt, kPixels * 2);
3142
+ MemRandomize(dst_pixels_c, kPixels * 2);
3143
+
3144
+ MaskCpuFlags(disable_cpu_flags_);
3145
+ SwapUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_c,
3146
+ benchmark_width_ * 2, benchmark_width_, benchmark_height_);
3147
+ MaskCpuFlags(benchmark_cpu_info_);
3148
+
3149
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3150
+ SwapUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_opt,
3151
+ benchmark_width_ * 2, benchmark_width_, benchmark_height_);
3152
+ }
3153
+
3154
+ for (int i = 0; i < kPixels * 2; ++i) {
3155
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3156
+ }
3157
+
3158
+ free_aligned_buffer_page_end(src_pixels);
3159
+ free_aligned_buffer_page_end(dst_pixels_opt);
3160
+ free_aligned_buffer_page_end(dst_pixels_c);
3161
+ }
3162
+
3163
+ TEST_F(LibYUVPlanarTest, MergeRGBPlane_Opt) {
3164
+ // Round count up to multiple of 16
3165
+ const int kPixels = benchmark_width_ * benchmark_height_;
3166
+ align_buffer_page_end(src_pixels, kPixels * 3);
3167
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3168
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3169
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3170
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3171
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3172
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3173
+ align_buffer_page_end(dst_pixels_c, kPixels * 3);
3174
+ align_buffer_page_end(dst_pixels_opt, kPixels * 3);
3175
+
3176
+ MemRandomize(src_pixels, kPixels * 3);
3177
+ MemRandomize(tmp_pixels_c_r, kPixels);
3178
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3179
+ MemRandomize(tmp_pixels_c_g, kPixels);
3180
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3181
+ MemRandomize(tmp_pixels_c_b, kPixels);
3182
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3183
+ MemRandomize(dst_pixels_c, kPixels * 3);
3184
+ MemRandomize(dst_pixels_opt, kPixels * 3);
3185
+
3186
+ MaskCpuFlags(disable_cpu_flags_);
3187
+ SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_c_r,
3188
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3189
+ tmp_pixels_c_b, benchmark_width_, benchmark_width_,
3190
+ benchmark_height_);
3191
+ MergeRGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3192
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3193
+ dst_pixels_c, benchmark_width_ * 3, benchmark_width_,
3194
+ benchmark_height_);
3195
+ MaskCpuFlags(benchmark_cpu_info_);
3196
+
3197
+ SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_opt_r,
3198
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3199
+ tmp_pixels_opt_b, benchmark_width_, benchmark_width_,
3200
+ benchmark_height_);
3201
+
3202
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3203
+ MergeRGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3204
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3205
+ dst_pixels_opt, benchmark_width_ * 3, benchmark_width_,
3206
+ benchmark_height_);
3207
+ }
3208
+
3209
+ for (int i = 0; i < kPixels * 3; ++i) {
3210
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3211
+ }
3212
+
3213
+ free_aligned_buffer_page_end(src_pixels);
3214
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3215
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3216
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3217
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3218
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3219
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3220
+ free_aligned_buffer_page_end(dst_pixels_c);
3221
+ free_aligned_buffer_page_end(dst_pixels_opt);
3222
+ }
3223
+
3224
+ TEST_F(LibYUVPlanarTest, SplitRGBPlane_Opt) {
3225
+ // Round count up to multiple of 16
3226
+ const int kPixels = benchmark_width_ * benchmark_height_;
3227
+ align_buffer_page_end(src_pixels, kPixels * 3);
3228
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3229
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3230
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3231
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3232
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3233
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3234
+ align_buffer_page_end(dst_pixels_c, kPixels * 3);
3235
+ align_buffer_page_end(dst_pixels_opt, kPixels * 3);
3236
+
3237
+ MemRandomize(src_pixels, kPixels * 3);
3238
+ MemRandomize(tmp_pixels_c_r, kPixels);
3239
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3240
+ MemRandomize(tmp_pixels_c_g, kPixels);
3241
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3242
+ MemRandomize(tmp_pixels_c_b, kPixels);
3243
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3244
+ MemRandomize(dst_pixels_c, kPixels * 3);
3245
+ MemRandomize(dst_pixels_opt, kPixels * 3);
3246
+
3247
+ MaskCpuFlags(disable_cpu_flags_);
3248
+ SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_c_r,
3249
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3250
+ tmp_pixels_c_b, benchmark_width_, benchmark_width_,
3251
+ benchmark_height_);
3252
+ MergeRGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3253
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3254
+ dst_pixels_c, benchmark_width_ * 3, benchmark_width_,
3255
+ benchmark_height_);
3256
+ MaskCpuFlags(benchmark_cpu_info_);
3257
+
3258
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3259
+ SplitRGBPlane(src_pixels, benchmark_width_ * 3, tmp_pixels_opt_r,
3260
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3261
+ tmp_pixels_opt_b, benchmark_width_, benchmark_width_,
3262
+ benchmark_height_);
3263
+ }
3264
+ MergeRGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3265
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3266
+ dst_pixels_opt, benchmark_width_ * 3, benchmark_width_,
3267
+ benchmark_height_);
3268
+
3269
+ for (int i = 0; i < kPixels * 3; ++i) {
3270
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3271
+ }
3272
+
3273
+ free_aligned_buffer_page_end(src_pixels);
3274
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3275
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3276
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3277
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3278
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3279
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3280
+ free_aligned_buffer_page_end(dst_pixels_c);
3281
+ free_aligned_buffer_page_end(dst_pixels_opt);
3282
+ }
3283
+
3284
+ TEST_F(LibYUVPlanarTest, MergeARGBPlane_Opt) {
3285
+ const int kPixels = benchmark_width_ * benchmark_height_;
3286
+ align_buffer_page_end(src_pixels, kPixels * 4);
3287
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3288
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3289
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3290
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3291
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3292
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3293
+ align_buffer_page_end(tmp_pixels_c_a, kPixels);
3294
+ align_buffer_page_end(tmp_pixels_opt_a, kPixels);
3295
+ align_buffer_page_end(dst_pixels_c, kPixels * 4);
3296
+ align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3297
+
3298
+ MemRandomize(src_pixels, kPixels * 4);
3299
+ MemRandomize(tmp_pixels_c_r, kPixels);
3300
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3301
+ MemRandomize(tmp_pixels_c_g, kPixels);
3302
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3303
+ MemRandomize(tmp_pixels_c_b, kPixels);
3304
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3305
+ MemRandomize(tmp_pixels_c_a, kPixels);
3306
+ MemRandomize(tmp_pixels_opt_a, kPixels);
3307
+ MemRandomize(dst_pixels_opt, kPixels * 4);
3308
+ MemRandomize(dst_pixels_c, kPixels * 4);
3309
+
3310
+ MaskCpuFlags(disable_cpu_flags_);
3311
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3312
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3313
+ tmp_pixels_c_b, benchmark_width_, tmp_pixels_c_a,
3314
+ benchmark_width_, benchmark_width_, benchmark_height_);
3315
+ MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3316
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3317
+ tmp_pixels_c_a, benchmark_width_, dst_pixels_c,
3318
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3319
+
3320
+ MaskCpuFlags(benchmark_cpu_info_);
3321
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3322
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3323
+ tmp_pixels_opt_b, benchmark_width_, tmp_pixels_opt_a,
3324
+ benchmark_width_, benchmark_width_, benchmark_height_);
3325
+
3326
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3327
+ MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3328
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3329
+ tmp_pixels_opt_a, benchmark_width_, dst_pixels_opt,
3330
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3331
+ }
3332
+
3333
+ for (int i = 0; i < kPixels * 4; ++i) {
3334
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3335
+ }
3336
+
3337
+ free_aligned_buffer_page_end(src_pixels);
3338
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3339
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3340
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3341
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3342
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3343
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3344
+ free_aligned_buffer_page_end(tmp_pixels_c_a);
3345
+ free_aligned_buffer_page_end(tmp_pixels_opt_a);
3346
+ free_aligned_buffer_page_end(dst_pixels_opt);
3347
+ free_aligned_buffer_page_end(dst_pixels_c);
3348
+ }
3349
+
3350
+ TEST_F(LibYUVPlanarTest, SplitARGBPlane_Opt) {
3351
+ const int kPixels = benchmark_width_ * benchmark_height_;
3352
+ align_buffer_page_end(src_pixels, kPixels * 4);
3353
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3354
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3355
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3356
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3357
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3358
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3359
+ align_buffer_page_end(tmp_pixels_c_a, kPixels);
3360
+ align_buffer_page_end(tmp_pixels_opt_a, kPixels);
3361
+ align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3362
+ align_buffer_page_end(dst_pixels_c, kPixels * 4);
3363
+
3364
+ MemRandomize(src_pixels, kPixels * 4);
3365
+ MemRandomize(tmp_pixels_c_r, kPixels);
3366
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3367
+ MemRandomize(tmp_pixels_c_g, kPixels);
3368
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3369
+ MemRandomize(tmp_pixels_c_b, kPixels);
3370
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3371
+ MemRandomize(tmp_pixels_c_a, kPixels);
3372
+ MemRandomize(tmp_pixels_opt_a, kPixels);
3373
+ MemRandomize(dst_pixels_opt, kPixels * 4);
3374
+ MemRandomize(dst_pixels_c, kPixels * 4);
3375
+
3376
+ MaskCpuFlags(disable_cpu_flags_);
3377
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3378
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3379
+ tmp_pixels_c_b, benchmark_width_, tmp_pixels_c_a,
3380
+ benchmark_width_, benchmark_width_, benchmark_height_);
3381
+ MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3382
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_,
3383
+ tmp_pixels_c_a, benchmark_width_, dst_pixels_c,
3384
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3385
+
3386
+ MaskCpuFlags(benchmark_cpu_info_);
3387
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3388
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3389
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3390
+ tmp_pixels_opt_b, benchmark_width_, tmp_pixels_opt_a,
3391
+ benchmark_width_, benchmark_width_, benchmark_height_);
3392
+ }
3393
+
3394
+ MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3395
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_,
3396
+ tmp_pixels_opt_a, benchmark_width_, dst_pixels_opt,
3397
+ benchmark_width_ * 4, benchmark_width_, benchmark_height_);
3398
+
3399
+ for (int i = 0; i < kPixels * 4; ++i) {
3400
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3401
+ }
3402
+
3403
+ free_aligned_buffer_page_end(src_pixels);
3404
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3405
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3406
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3407
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3408
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3409
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3410
+ free_aligned_buffer_page_end(tmp_pixels_c_a);
3411
+ free_aligned_buffer_page_end(tmp_pixels_opt_a);
3412
+ free_aligned_buffer_page_end(dst_pixels_c);
3413
+ free_aligned_buffer_page_end(dst_pixels_opt);
3414
+ }
3415
+
3416
+ TEST_F(LibYUVPlanarTest, MergeXRGBPlane_Opt) {
3417
+ const int kPixels = benchmark_width_ * benchmark_height_;
3418
+ align_buffer_page_end(src_pixels, kPixels * 4);
3419
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3420
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3421
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3422
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3423
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3424
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3425
+ align_buffer_page_end(dst_pixels_c, kPixels * 4);
3426
+ align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3427
+
3428
+ MemRandomize(src_pixels, kPixels * 4);
3429
+ MemRandomize(tmp_pixels_c_r, kPixels);
3430
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3431
+ MemRandomize(tmp_pixels_c_g, kPixels);
3432
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3433
+ MemRandomize(tmp_pixels_c_b, kPixels);
3434
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3435
+ MemRandomize(dst_pixels_c, kPixels * 4);
3436
+ MemRandomize(dst_pixels_opt, kPixels * 4);
3437
+
3438
+ MaskCpuFlags(disable_cpu_flags_);
3439
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3440
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3441
+ tmp_pixels_c_b, benchmark_width_, NULL, 0, benchmark_width_,
3442
+ benchmark_height_);
3443
+ MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3444
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_, NULL, 0,
3445
+ dst_pixels_c, benchmark_width_ * 4, benchmark_width_,
3446
+ benchmark_height_);
3447
+
3448
+ MaskCpuFlags(benchmark_cpu_info_);
3449
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3450
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3451
+ tmp_pixels_opt_b, benchmark_width_, NULL, 0, benchmark_width_,
3452
+ benchmark_height_);
3453
+
3454
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3455
+ MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3456
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_, NULL,
3457
+ 0, dst_pixels_opt, benchmark_width_ * 4, benchmark_width_,
3458
+ benchmark_height_);
3459
+ }
3460
+
3461
+ for (int i = 0; i < kPixels * 4; ++i) {
3462
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3463
+ }
3464
+
3465
+ free_aligned_buffer_page_end(src_pixels);
3466
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3467
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3468
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3469
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3470
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3471
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3472
+ free_aligned_buffer_page_end(dst_pixels_c);
3473
+ free_aligned_buffer_page_end(dst_pixels_opt);
3474
+ }
3475
+
3476
+ TEST_F(LibYUVPlanarTest, SplitXRGBPlane_Opt) {
3477
+ const int kPixels = benchmark_width_ * benchmark_height_;
3478
+ align_buffer_page_end(src_pixels, kPixels * 4);
3479
+ align_buffer_page_end(tmp_pixels_c_r, kPixels);
3480
+ align_buffer_page_end(tmp_pixels_opt_r, kPixels);
3481
+ align_buffer_page_end(tmp_pixels_c_g, kPixels);
3482
+ align_buffer_page_end(tmp_pixels_opt_g, kPixels);
3483
+ align_buffer_page_end(tmp_pixels_c_b, kPixels);
3484
+ align_buffer_page_end(tmp_pixels_opt_b, kPixels);
3485
+ align_buffer_page_end(dst_pixels_c, kPixels * 4);
3486
+ align_buffer_page_end(dst_pixels_opt, kPixels * 4);
3487
+
3488
+ MemRandomize(src_pixels, kPixels * 4);
3489
+ MemRandomize(tmp_pixels_c_r, kPixels);
3490
+ MemRandomize(tmp_pixels_opt_r, kPixels);
3491
+ MemRandomize(tmp_pixels_c_g, kPixels);
3492
+ MemRandomize(tmp_pixels_opt_g, kPixels);
3493
+ MemRandomize(tmp_pixels_c_b, kPixels);
3494
+ MemRandomize(tmp_pixels_opt_b, kPixels);
3495
+ MemRandomize(dst_pixels_c, kPixels * 4);
3496
+ MemRandomize(dst_pixels_opt, kPixels * 4);
3497
+
3498
+ MaskCpuFlags(disable_cpu_flags_);
3499
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_c_r,
3500
+ benchmark_width_, tmp_pixels_c_g, benchmark_width_,
3501
+ tmp_pixels_c_b, benchmark_width_, NULL, 0, benchmark_width_,
3502
+ benchmark_height_);
3503
+ MergeARGBPlane(tmp_pixels_c_r, benchmark_width_, tmp_pixels_c_g,
3504
+ benchmark_width_, tmp_pixels_c_b, benchmark_width_, NULL, 0,
3505
+ dst_pixels_c, benchmark_width_ * 4, benchmark_width_,
3506
+ benchmark_height_);
3507
+
3508
+ MaskCpuFlags(benchmark_cpu_info_);
3509
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3510
+ SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_opt_r,
3511
+ benchmark_width_, tmp_pixels_opt_g, benchmark_width_,
3512
+ tmp_pixels_opt_b, benchmark_width_, NULL, 0,
3513
+ benchmark_width_, benchmark_height_);
3514
+ }
3515
+
3516
+ MergeARGBPlane(tmp_pixels_opt_r, benchmark_width_, tmp_pixels_opt_g,
3517
+ benchmark_width_, tmp_pixels_opt_b, benchmark_width_, NULL, 0,
3518
+ dst_pixels_opt, benchmark_width_ * 4, benchmark_width_,
3519
+ benchmark_height_);
3520
+
3521
+ for (int i = 0; i < kPixels * 4; ++i) {
3522
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
3523
+ }
3524
+
3525
+ free_aligned_buffer_page_end(src_pixels);
3526
+ free_aligned_buffer_page_end(tmp_pixels_c_r);
3527
+ free_aligned_buffer_page_end(tmp_pixels_opt_r);
3528
+ free_aligned_buffer_page_end(tmp_pixels_c_g);
3529
+ free_aligned_buffer_page_end(tmp_pixels_opt_g);
3530
+ free_aligned_buffer_page_end(tmp_pixels_c_b);
3531
+ free_aligned_buffer_page_end(tmp_pixels_opt_b);
3532
+ free_aligned_buffer_page_end(dst_pixels_c);
3533
+ free_aligned_buffer_page_end(dst_pixels_opt);
3534
+ }
3535
+
3536
+ // Merge 4 channels
3537
+ #define TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3538
+ TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \
3539
+ const int kWidth = W1280; \
3540
+ const int kPixels = kWidth * benchmark_height_; \
3541
+ align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3542
+ align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3543
+ align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3544
+ align_buffer_page_end(src_memory_a, kPixels * sizeof(STYPE) + OFF); \
3545
+ align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3546
+ align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3547
+ MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3548
+ MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3549
+ MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3550
+ MemRandomize(src_memory_a, kPixels * sizeof(STYPE) + OFF); \
3551
+ memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \
3552
+ memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \
3553
+ STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3554
+ STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3555
+ STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3556
+ STYPE* src_pixels_a = reinterpret_cast<STYPE*>(src_memory_a + OFF); \
3557
+ DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3558
+ DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3559
+ MaskCpuFlags(disable_cpu_flags_); \
3560
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3561
+ kWidth, src_pixels_a, kWidth, dst_pixels_c, kWidth * 4, \
3562
+ kWidth, NEG benchmark_height_, DEPTH); \
3563
+ MaskCpuFlags(benchmark_cpu_info_); \
3564
+ for (int i = 0; i < benchmark_iterations_; ++i) { \
3565
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3566
+ kWidth, src_pixels_a, kWidth, dst_pixels_opt, kWidth * 4, \
3567
+ kWidth, NEG benchmark_height_, DEPTH); \
3568
+ } \
3569
+ for (int i = 0; i < kPixels * 4; ++i) { \
3570
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3571
+ } \
3572
+ free_aligned_buffer_page_end(src_memory_r); \
3573
+ free_aligned_buffer_page_end(src_memory_g); \
3574
+ free_aligned_buffer_page_end(src_memory_b); \
3575
+ free_aligned_buffer_page_end(src_memory_a); \
3576
+ free_aligned_buffer_page_end(dst_memory_c); \
3577
+ free_aligned_buffer_page_end(dst_memory_opt); \
3578
+ }
3579
+
3580
+ // Merge 3 channel RGB into 4 channel XRGB with opaque alpha
3581
+ #define TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3582
+ TEST_F(LibYUVPlanarTest, FUNC##Plane_Opaque_##DEPTH##N) { \
3583
+ const int kWidth = W1280; \
3584
+ const int kPixels = kWidth * benchmark_height_; \
3585
+ align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3586
+ align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3587
+ align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3588
+ align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3589
+ align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3590
+ MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3591
+ MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3592
+ MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3593
+ memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \
3594
+ memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \
3595
+ STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3596
+ STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3597
+ STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3598
+ DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3599
+ DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3600
+ MaskCpuFlags(disable_cpu_flags_); \
3601
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3602
+ kWidth, NULL, 0, dst_pixels_c, kWidth * 4, kWidth, \
3603
+ NEG benchmark_height_, DEPTH); \
3604
+ MaskCpuFlags(benchmark_cpu_info_); \
3605
+ for (int i = 0; i < benchmark_iterations_; ++i) { \
3606
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3607
+ kWidth, NULL, 0, dst_pixels_opt, kWidth * 4, kWidth, \
3608
+ NEG benchmark_height_, DEPTH); \
3609
+ } \
3610
+ for (int i = 0; i < kPixels * 4; ++i) { \
3611
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3612
+ } \
3613
+ free_aligned_buffer_page_end(src_memory_r); \
3614
+ free_aligned_buffer_page_end(src_memory_g); \
3615
+ free_aligned_buffer_page_end(src_memory_b); \
3616
+ free_aligned_buffer_page_end(dst_memory_c); \
3617
+ free_aligned_buffer_page_end(dst_memory_opt); \
3618
+ }
3619
+
3620
+ #define TESTQPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \
3621
+ TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \
3622
+ TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3623
+ 2) \
3624
+ TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3625
+ TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0) \
3626
+ TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, \
3627
+ 0) \
3628
+ TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3629
+ 2) \
3630
+ TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3631
+ TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0)
3632
+
3633
+ TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 10)
3634
+ TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 12)
3635
+ TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 16)
3636
+ TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 10)
3637
+ TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 12)
3638
+ TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 16)
3639
+
3640
+ #define TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \
3641
+ TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \
3642
+ const int kWidth = W1280; \
3643
+ const int kPixels = kWidth * benchmark_height_; \
3644
+ align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3645
+ align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3646
+ align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3647
+ align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \
3648
+ align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \
3649
+ MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \
3650
+ MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \
3651
+ MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \
3652
+ STYPE* src_pixels_r = reinterpret_cast<STYPE*>(src_memory_r + OFF); \
3653
+ STYPE* src_pixels_g = reinterpret_cast<STYPE*>(src_memory_g + OFF); \
3654
+ STYPE* src_pixels_b = reinterpret_cast<STYPE*>(src_memory_b + OFF); \
3655
+ DTYPE* dst_pixels_c = reinterpret_cast<DTYPE*>(dst_memory_c); \
3656
+ DTYPE* dst_pixels_opt = reinterpret_cast<DTYPE*>(dst_memory_opt); \
3657
+ memset(dst_pixels_c, 1, kPixels * 4 * sizeof(DTYPE)); \
3658
+ memset(dst_pixels_opt, 2, kPixels * 4 * sizeof(DTYPE)); \
3659
+ MaskCpuFlags(disable_cpu_flags_); \
3660
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3661
+ kWidth, dst_pixels_c, kWidth * 4, kWidth, \
3662
+ NEG benchmark_height_, DEPTH); \
3663
+ MaskCpuFlags(benchmark_cpu_info_); \
3664
+ for (int i = 0; i < benchmark_iterations_; ++i) { \
3665
+ FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \
3666
+ kWidth, dst_pixels_opt, kWidth * 4, kWidth, \
3667
+ NEG benchmark_height_, DEPTH); \
3668
+ } \
3669
+ for (int i = 0; i < kPixels * 4; ++i) { \
3670
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \
3671
+ } \
3672
+ free_aligned_buffer_page_end(src_memory_r); \
3673
+ free_aligned_buffer_page_end(src_memory_g); \
3674
+ free_aligned_buffer_page_end(src_memory_b); \
3675
+ free_aligned_buffer_page_end(dst_memory_c); \
3676
+ free_aligned_buffer_page_end(dst_memory_opt); \
3677
+ }
3678
+
3679
+ #define TESTTPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \
3680
+ TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \
3681
+ TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \
3682
+ 2) \
3683
+ TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \
3684
+ TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0)
3685
+
3686
+ TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 10)
3687
+ TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 12)
3688
+ TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 16)
3689
+
3690
+ // TODO(fbarchard): improve test for platforms and cpu detect
3691
+ #ifdef HAS_MERGEUVROW_16_AVX2
3692
+ TEST_F(LibYUVPlanarTest, MergeUVRow_16_Opt) {
3693
+ // Round count up to multiple of 8
3694
+ const int kPixels = (benchmark_width_ * benchmark_height_ + 7) & ~7;
3695
+
3696
+ align_buffer_page_end(src_pixels_u, kPixels * 2);
3697
+ align_buffer_page_end(src_pixels_v, kPixels * 2);
3698
+ align_buffer_page_end(dst_pixels_uv_opt, kPixels * 2 * 2);
3699
+ align_buffer_page_end(dst_pixels_uv_c, kPixels * 2 * 2);
3700
+
3701
+ MemRandomize(src_pixels_u, kPixels * 2);
3702
+ MemRandomize(src_pixels_v, kPixels * 2);
3703
+ memset(dst_pixels_uv_opt, 0, kPixels * 2 * 2);
3704
+ memset(dst_pixels_uv_c, 1, kPixels * 2 * 2);
3705
+
3706
+ MergeUVRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_u),
3707
+ reinterpret_cast<const uint16_t*>(src_pixels_v),
3708
+ reinterpret_cast<uint16_t*>(dst_pixels_uv_c), 16, kPixels);
3709
+
3710
+ int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3711
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3712
+ if (has_avx2) {
3713
+ MergeUVRow_16_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_u),
3714
+ reinterpret_cast<const uint16_t*>(src_pixels_v),
3715
+ reinterpret_cast<uint16_t*>(dst_pixels_uv_opt), 16,
3716
+ kPixels);
3717
+ } else {
3718
+ MergeUVRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_u),
3719
+ reinterpret_cast<const uint16_t*>(src_pixels_v),
3720
+ reinterpret_cast<uint16_t*>(dst_pixels_uv_opt), 16,
3721
+ kPixels);
3722
+ }
3723
+ }
3724
+
3725
+ for (int i = 0; i < kPixels * 2 * 2; ++i) {
3726
+ EXPECT_EQ(dst_pixels_uv_opt[i], dst_pixels_uv_c[i]);
3727
+ }
3728
+
3729
+ free_aligned_buffer_page_end(src_pixels_u);
3730
+ free_aligned_buffer_page_end(src_pixels_v);
3731
+ free_aligned_buffer_page_end(dst_pixels_uv_opt);
3732
+ free_aligned_buffer_page_end(dst_pixels_uv_c);
3733
+ }
3734
+ #endif
3735
+
3736
+ // TODO(fbarchard): Improve test for more platforms.
3737
+ #ifdef HAS_MULTIPLYROW_16_AVX2
3738
+ TEST_F(LibYUVPlanarTest, MultiplyRow_16_Opt) {
3739
+ // Round count up to multiple of 32
3740
+ const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
3741
+
3742
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3743
+ align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
3744
+ align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
3745
+
3746
+ MemRandomize(src_pixels_y, kPixels * 2);
3747
+ memset(dst_pixels_y_opt, 0, kPixels * 2);
3748
+ memset(dst_pixels_y_c, 1, kPixels * 2);
3749
+
3750
+ MultiplyRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3751
+ reinterpret_cast<uint16_t*>(dst_pixels_y_c), 64, kPixels);
3752
+
3753
+ int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3754
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3755
+ if (has_avx2) {
3756
+ MultiplyRow_16_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_y),
3757
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64,
3758
+ kPixels);
3759
+ } else {
3760
+ MultiplyRow_16_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3761
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64,
3762
+ kPixels);
3763
+ }
3764
+ }
3765
+
3766
+ for (int i = 0; i < kPixels * 2; ++i) {
3767
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3768
+ }
3769
+
3770
+ free_aligned_buffer_page_end(src_pixels_y);
3771
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3772
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3773
+ }
3774
+ #endif // HAS_MULTIPLYROW_16_AVX2
3775
+
3776
+ TEST_F(LibYUVPlanarTest, Convert16To8Plane) {
3777
+ const int kPixels = benchmark_width_ * benchmark_height_;
3778
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3779
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3780
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3781
+
3782
+ MemRandomize(src_pixels_y, kPixels * 2);
3783
+ memset(dst_pixels_y_opt, 0, kPixels);
3784
+ memset(dst_pixels_y_c, 1, kPixels);
3785
+
3786
+ MaskCpuFlags(disable_cpu_flags_);
3787
+ Convert16To8Plane(reinterpret_cast<const uint16_t*>(src_pixels_y),
3788
+ benchmark_width_, dst_pixels_y_c, benchmark_width_, 16384,
3789
+ benchmark_width_, benchmark_height_);
3790
+ MaskCpuFlags(benchmark_cpu_info_);
3791
+
3792
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3793
+ Convert16To8Plane(reinterpret_cast<const uint16_t*>(src_pixels_y),
3794
+ benchmark_width_, dst_pixels_y_opt, benchmark_width_,
3795
+ 16384, benchmark_width_, benchmark_height_);
3796
+ }
3797
+
3798
+ for (int i = 0; i < kPixels; ++i) {
3799
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3800
+ }
3801
+
3802
+ free_aligned_buffer_page_end(src_pixels_y);
3803
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3804
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3805
+ }
3806
+
3807
+ TEST_F(LibYUVPlanarTest, Convert8To8Plane) {
3808
+ const int kPixels = benchmark_width_ * benchmark_height_;
3809
+ align_buffer_page_end(src_pixels_y, kPixels);
3810
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3811
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3812
+
3813
+ MemRandomize(src_pixels_y, kPixels);
3814
+ memset(dst_pixels_y_opt, 0, kPixels);
3815
+ memset(dst_pixels_y_c, 1, kPixels);
3816
+
3817
+ MaskCpuFlags(disable_cpu_flags_);
3818
+ Convert8To8Plane(src_pixels_y, benchmark_width_, dst_pixels_y_c,
3819
+ benchmark_width_, 220, 16, benchmark_width_,
3820
+ benchmark_height_);
3821
+ MaskCpuFlags(benchmark_cpu_info_);
3822
+
3823
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3824
+ Convert8To8Plane(src_pixels_y, benchmark_width_, dst_pixels_y_opt,
3825
+ benchmark_width_, 220, 16, benchmark_width_,
3826
+ benchmark_height_);
3827
+ }
3828
+
3829
+ for (int i = 0; i < kPixels; ++i) {
3830
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3831
+ }
3832
+
3833
+ free_aligned_buffer_page_end(src_pixels_y);
3834
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3835
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3836
+ }
3837
+
3838
+ TEST_F(LibYUVPlanarTest, YUY2ToY) {
3839
+ const int kPixels = benchmark_width_ * benchmark_height_;
3840
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3841
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3842
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3843
+
3844
+ MemRandomize(src_pixels_y, kPixels * 2);
3845
+ memset(dst_pixels_y_opt, 0, kPixels);
3846
+ memset(dst_pixels_y_c, 1, kPixels);
3847
+
3848
+ MaskCpuFlags(disable_cpu_flags_);
3849
+ YUY2ToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_c, benchmark_width_,
3850
+ benchmark_width_, benchmark_height_);
3851
+ MaskCpuFlags(benchmark_cpu_info_);
3852
+
3853
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3854
+ YUY2ToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_opt,
3855
+ benchmark_width_, benchmark_width_, benchmark_height_);
3856
+ }
3857
+
3858
+ for (int i = 0; i < kPixels; ++i) {
3859
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3860
+ }
3861
+
3862
+ free_aligned_buffer_page_end(src_pixels_y);
3863
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3864
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3865
+ }
3866
+
3867
+ TEST_F(LibYUVPlanarTest, UYVYToY) {
3868
+ const int kPixels = benchmark_width_ * benchmark_height_;
3869
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3870
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3871
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3872
+
3873
+ MemRandomize(src_pixels_y, kPixels * 2);
3874
+ memset(dst_pixels_y_opt, 0, kPixels);
3875
+ memset(dst_pixels_y_c, 1, kPixels);
3876
+
3877
+ MaskCpuFlags(disable_cpu_flags_);
3878
+ UYVYToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_c, benchmark_width_,
3879
+ benchmark_width_, benchmark_height_);
3880
+ MaskCpuFlags(benchmark_cpu_info_);
3881
+
3882
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3883
+ UYVYToY(src_pixels_y, benchmark_width_ * 2, dst_pixels_y_opt,
3884
+ benchmark_width_, benchmark_width_, benchmark_height_);
3885
+ }
3886
+
3887
+ for (int i = 0; i < kPixels; ++i) {
3888
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3889
+ }
3890
+
3891
+ free_aligned_buffer_page_end(src_pixels_y);
3892
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3893
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3894
+ }
3895
+
3896
+ #ifdef ENABLE_ROW_TESTS
3897
+ // TODO(fbarchard): Improve test for more platforms.
3898
+ #ifdef HAS_CONVERT16TO8ROW_AVX2
3899
+ TEST_F(LibYUVPlanarTest, Convert16To8Row_Opt) {
3900
+ // AVX2 does multiple of 32, so round count up
3901
+ const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
3902
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3903
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3904
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3905
+
3906
+ MemRandomize(src_pixels_y, kPixels * 2);
3907
+ // clamp source range to 10 bits.
3908
+ for (int i = 0; i < kPixels; ++i) {
3909
+ reinterpret_cast<uint16_t*>(src_pixels_y)[i] &= 1023;
3910
+ }
3911
+
3912
+ memset(dst_pixels_y_opt, 0, kPixels);
3913
+ memset(dst_pixels_y_c, 1, kPixels);
3914
+
3915
+ Convert16To8Row_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3916
+ dst_pixels_y_c, 16384, kPixels);
3917
+
3918
+ int has_avx2 = TestCpuFlag(kCpuHasAVX2);
3919
+ int has_ssse3 = TestCpuFlag(kCpuHasSSSE3);
3920
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3921
+ if (has_avx2) {
3922
+ Convert16To8Row_AVX2(reinterpret_cast<const uint16_t*>(src_pixels_y),
3923
+ dst_pixels_y_opt, 16384, kPixels);
3924
+ } else if (has_ssse3) {
3925
+ Convert16To8Row_SSSE3(reinterpret_cast<const uint16_t*>(src_pixels_y),
3926
+ dst_pixels_y_opt, 16384, kPixels);
3927
+ } else {
3928
+ Convert16To8Row_C(reinterpret_cast<const uint16_t*>(src_pixels_y),
3929
+ dst_pixels_y_opt, 16384, kPixels);
3930
+ }
3931
+ }
3932
+
3933
+ for (int i = 0; i < kPixels; ++i) {
3934
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3935
+ }
3936
+
3937
+ free_aligned_buffer_page_end(src_pixels_y);
3938
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3939
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3940
+ }
3941
+ #endif // HAS_CONVERT16TO8ROW_AVX2
3942
+
3943
+ #ifdef HAS_UYVYTOYROW_NEON
3944
+ TEST_F(LibYUVPlanarTest, UYVYToYRow_Opt) {
3945
+ // NEON does multiple of 16, so round count up
3946
+ const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15;
3947
+ align_buffer_page_end(src_pixels_y, kPixels * 2);
3948
+ align_buffer_page_end(dst_pixels_y_opt, kPixels);
3949
+ align_buffer_page_end(dst_pixels_y_c, kPixels);
3950
+
3951
+ MemRandomize(src_pixels_y, kPixels * 2);
3952
+ memset(dst_pixels_y_opt, 0, kPixels);
3953
+ memset(dst_pixels_y_c, 1, kPixels);
3954
+
3955
+ UYVYToYRow_C(src_pixels_y, dst_pixels_y_c, kPixels);
3956
+
3957
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3958
+ UYVYToYRow_NEON(src_pixels_y, dst_pixels_y_opt, kPixels);
3959
+ }
3960
+
3961
+ for (int i = 0; i < kPixels; ++i) {
3962
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3963
+ }
3964
+
3965
+ free_aligned_buffer_page_end(src_pixels_y);
3966
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
3967
+ free_aligned_buffer_page_end(dst_pixels_y_c);
3968
+ }
3969
+ #endif // HAS_UYVYTOYROW_NEON
3970
+
3971
+ #endif // ENABLE_ROW_TESTS
3972
+
3973
+ TEST_F(LibYUVPlanarTest, Convert8To16Plane) {
3974
+ const int kPixels = benchmark_width_ * benchmark_height_;
3975
+ align_buffer_page_end(src_pixels_y, kPixels);
3976
+ align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
3977
+ align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
3978
+
3979
+ MemRandomize(src_pixels_y, kPixels);
3980
+ memset(dst_pixels_y_opt, 0, kPixels * 2);
3981
+ memset(dst_pixels_y_c, 1, kPixels * 2);
3982
+
3983
+ MaskCpuFlags(disable_cpu_flags_);
3984
+ Convert8To16Plane(src_pixels_y, benchmark_width_,
3985
+ reinterpret_cast<uint16_t*>(dst_pixels_y_c),
3986
+ benchmark_width_, 1024, benchmark_width_,
3987
+ benchmark_height_);
3988
+ MaskCpuFlags(benchmark_cpu_info_);
3989
+
3990
+ for (int i = 0; i < benchmark_iterations_; ++i) {
3991
+ Convert8To16Plane(src_pixels_y, benchmark_width_,
3992
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt),
3993
+ benchmark_width_, 1024, benchmark_width_,
3994
+ benchmark_height_);
3995
+ }
3996
+
3997
+ for (int i = 0; i < kPixels * 2; ++i) {
3998
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
3999
+ }
4000
+
4001
+ free_aligned_buffer_page_end(src_pixels_y);
4002
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
4003
+ free_aligned_buffer_page_end(dst_pixels_y_c);
4004
+ }
4005
+
4006
+ #ifdef ENABLE_ROW_TESTS
4007
+ // TODO(fbarchard): Improve test for more platforms.
4008
+ #ifdef HAS_CONVERT8TO16ROW_AVX2
4009
+ TEST_F(LibYUVPlanarTest, Convert8To16Row_Opt) {
4010
+ const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31;
4011
+ align_buffer_page_end(src_pixels_y, kPixels);
4012
+ align_buffer_page_end(dst_pixels_y_opt, kPixels * 2);
4013
+ align_buffer_page_end(dst_pixels_y_c, kPixels * 2);
4014
+
4015
+ MemRandomize(src_pixels_y, kPixels);
4016
+ memset(dst_pixels_y_opt, 0, kPixels * 2);
4017
+ memset(dst_pixels_y_c, 1, kPixels * 2);
4018
+
4019
+ Convert8To16Row_C(src_pixels_y, reinterpret_cast<uint16_t*>(dst_pixels_y_c),
4020
+ 1024, kPixels);
4021
+
4022
+ int has_avx2 = TestCpuFlag(kCpuHasAVX2);
4023
+ int has_sse2 = TestCpuFlag(kCpuHasSSE2);
4024
+ for (int i = 0; i < benchmark_iterations_; ++i) {
4025
+ if (has_avx2) {
4026
+ Convert8To16Row_AVX2(src_pixels_y,
4027
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4028
+ kPixels);
4029
+ } else if (has_sse2) {
4030
+ Convert8To16Row_SSE2(src_pixels_y,
4031
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4032
+ kPixels);
4033
+ } else {
4034
+ Convert8To16Row_C(src_pixels_y,
4035
+ reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 1024,
4036
+ kPixels);
4037
+ }
4038
+ }
4039
+
4040
+ for (int i = 0; i < kPixels * 2; ++i) {
4041
+ EXPECT_EQ(dst_pixels_y_opt[i], dst_pixels_y_c[i]);
4042
+ }
4043
+
4044
+ free_aligned_buffer_page_end(src_pixels_y);
4045
+ free_aligned_buffer_page_end(dst_pixels_y_opt);
4046
+ free_aligned_buffer_page_end(dst_pixels_y_c);
4047
+ }
4048
+ #endif // HAS_CONVERT8TO16ROW_AVX2
4049
+
4050
+ float TestScaleMaxSamples(int benchmark_width,
4051
+ int benchmark_height,
4052
+ int benchmark_iterations,
4053
+ float scale,
4054
+ bool opt) {
4055
+ int i, j;
4056
+ float max_c, max_opt = 0.f;
4057
+ // NEON does multiple of 8, so round count up
4058
+ const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4059
+ align_buffer_page_end(orig_y, kPixels * 4 * 3 + 48);
4060
+ uint8_t* dst_c = orig_y + kPixels * 4 + 16;
4061
+ uint8_t* dst_opt = orig_y + kPixels * 4 * 2 + 32;
4062
+
4063
+ // Randomize works but may contain some denormals affecting performance.
4064
+ // MemRandomize(orig_y, kPixels * 4);
4065
+ // large values are problematic. audio is really -1 to 1.
4066
+ for (i = 0; i < kPixels; ++i) {
4067
+ (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4068
+ }
4069
+ memset(dst_c, 0, kPixels * 4);
4070
+ memset(dst_opt, 1, kPixels * 4);
4071
+
4072
+ max_c = ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4073
+ reinterpret_cast<float*>(dst_c), scale, kPixels);
4074
+
4075
+ for (j = 0; j < benchmark_iterations; j++) {
4076
+ if (opt) {
4077
+ #ifdef HAS_SCALESUMSAMPLES_NEON
4078
+ max_opt = ScaleMaxSamples_NEON(reinterpret_cast<float*>(orig_y),
4079
+ reinterpret_cast<float*>(dst_opt), scale,
4080
+ kPixels);
4081
+ #else
4082
+ max_opt =
4083
+ ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4084
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4085
+ #endif
4086
+ } else {
4087
+ max_opt =
4088
+ ScaleMaxSamples_C(reinterpret_cast<float*>(orig_y),
4089
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4090
+ }
4091
+ }
4092
+
4093
+ float max_diff = FAbs(max_opt - max_c);
4094
+ for (i = 0; i < kPixels; ++i) {
4095
+ float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4096
+ (reinterpret_cast<float*>(dst_opt)[i]));
4097
+ if (abs_diff > max_diff) {
4098
+ max_diff = abs_diff;
4099
+ }
4100
+ }
4101
+
4102
+ free_aligned_buffer_page_end(orig_y);
4103
+ return max_diff;
4104
+ }
4105
+
4106
+ TEST_F(LibYUVPlanarTest, TestScaleMaxSamples_C) {
4107
+ float diff = TestScaleMaxSamples(benchmark_width_, benchmark_height_,
4108
+ benchmark_iterations_, 1.2f, false);
4109
+ EXPECT_EQ(0, diff);
4110
+ }
4111
+
4112
+ TEST_F(LibYUVPlanarTest, TestScaleMaxSamples_Opt) {
4113
+ float diff = TestScaleMaxSamples(benchmark_width_, benchmark_height_,
4114
+ benchmark_iterations_, 1.2f, true);
4115
+ EXPECT_EQ(0, diff);
4116
+ }
4117
+
4118
+ float TestScaleSumSamples(int benchmark_width,
4119
+ int benchmark_height,
4120
+ int benchmark_iterations,
4121
+ float scale,
4122
+ bool opt) {
4123
+ int i, j;
4124
+ float sum_c, sum_opt = 0.f;
4125
+ // NEON does multiple of 8, so round count up
4126
+ const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4127
+ align_buffer_page_end(orig_y, kPixels * 4 * 3);
4128
+ uint8_t* dst_c = orig_y + kPixels * 4;
4129
+ uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4130
+
4131
+ // Randomize works but may contain some denormals affecting performance.
4132
+ // MemRandomize(orig_y, kPixels * 4);
4133
+ // large values are problematic. audio is really -1 to 1.
4134
+ for (i = 0; i < kPixels; ++i) {
4135
+ (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4136
+ }
4137
+ memset(dst_c, 0, kPixels * 4);
4138
+ memset(dst_opt, 1, kPixels * 4);
4139
+
4140
+ sum_c = ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4141
+ reinterpret_cast<float*>(dst_c), scale, kPixels);
4142
+
4143
+ for (j = 0; j < benchmark_iterations; j++) {
4144
+ if (opt) {
4145
+ #ifdef HAS_SCALESUMSAMPLES_NEON
4146
+ sum_opt = ScaleSumSamples_NEON(reinterpret_cast<float*>(orig_y),
4147
+ reinterpret_cast<float*>(dst_opt), scale,
4148
+ kPixels);
4149
+ #else
4150
+ sum_opt =
4151
+ ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4152
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4153
+ #endif
4154
+ } else {
4155
+ sum_opt =
4156
+ ScaleSumSamples_C(reinterpret_cast<float*>(orig_y),
4157
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4158
+ }
4159
+ }
4160
+
4161
+ float mse_opt = sum_opt / kPixels * 4;
4162
+ float mse_c = sum_c / kPixels * 4;
4163
+ float mse_error = FAbs(mse_opt - mse_c) / mse_c;
4164
+
4165
+ // If the sum of a float is more than 4 million, small adds are round down on
4166
+ // float and produce different results with vectorized sum vs scalar sum.
4167
+ // Ignore the difference if the sum is large.
4168
+ float max_diff = 0.f;
4169
+ if (mse_error > 0.0001 && sum_c < 4000000) { // allow .01% difference of mse
4170
+ max_diff = mse_error;
4171
+ }
4172
+
4173
+ for (i = 0; i < kPixels; ++i) {
4174
+ float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4175
+ (reinterpret_cast<float*>(dst_opt)[i]));
4176
+ if (abs_diff > max_diff) {
4177
+ max_diff = abs_diff;
4178
+ }
4179
+ }
4180
+
4181
+ free_aligned_buffer_page_end(orig_y);
4182
+ return max_diff;
4183
+ }
4184
+
4185
+ TEST_F(LibYUVPlanarTest, TestScaleSumSamples_C) {
4186
+ float diff = TestScaleSumSamples(benchmark_width_, benchmark_height_,
4187
+ benchmark_iterations_, 1.2f, false);
4188
+ EXPECT_EQ(0, diff);
4189
+ }
4190
+
4191
+ TEST_F(LibYUVPlanarTest, TestScaleSumSamples_Opt) {
4192
+ float diff = TestScaleSumSamples(benchmark_width_, benchmark_height_,
4193
+ benchmark_iterations_, 1.2f, true);
4194
+ EXPECT_EQ(0, diff);
4195
+ }
4196
+
4197
+ float TestScaleSamples(int benchmark_width,
4198
+ int benchmark_height,
4199
+ int benchmark_iterations,
4200
+ float scale,
4201
+ bool opt) {
4202
+ int i, j;
4203
+ // NEON does multiple of 8, so round count up
4204
+ const int kPixels = (benchmark_width * benchmark_height + 7) & ~7;
4205
+ align_buffer_page_end(orig_y, kPixels * 4 * 3);
4206
+ uint8_t* dst_c = orig_y + kPixels * 4;
4207
+ uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4208
+
4209
+ // Randomize works but may contain some denormals affecting performance.
4210
+ // MemRandomize(orig_y, kPixels * 4);
4211
+ // large values are problematic. audio is really -1 to 1.
4212
+ for (i = 0; i < kPixels; ++i) {
4213
+ (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4214
+ }
4215
+ memset(dst_c, 0, kPixels * 4);
4216
+ memset(dst_opt, 1, kPixels * 4);
4217
+
4218
+ ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4219
+ reinterpret_cast<float*>(dst_c), scale, kPixels);
4220
+
4221
+ for (j = 0; j < benchmark_iterations; j++) {
4222
+ if (opt) {
4223
+ #ifdef HAS_SCALESUMSAMPLES_NEON
4224
+ ScaleSamples_NEON(reinterpret_cast<float*>(orig_y),
4225
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4226
+ #else
4227
+ ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4228
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4229
+ #endif
4230
+ } else {
4231
+ ScaleSamples_C(reinterpret_cast<float*>(orig_y),
4232
+ reinterpret_cast<float*>(dst_opt), scale, kPixels);
4233
+ }
4234
+ }
4235
+
4236
+ float max_diff = 0.f;
4237
+ for (i = 0; i < kPixels; ++i) {
4238
+ float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4239
+ (reinterpret_cast<float*>(dst_opt)[i]));
4240
+ if (abs_diff > max_diff) {
4241
+ max_diff = abs_diff;
4242
+ }
4243
+ }
4244
+
4245
+ free_aligned_buffer_page_end(orig_y);
4246
+ return max_diff;
4247
+ }
4248
+
4249
+ TEST_F(LibYUVPlanarTest, TestScaleSamples_C) {
4250
+ float diff = TestScaleSamples(benchmark_width_, benchmark_height_,
4251
+ benchmark_iterations_, 1.2f, false);
4252
+ EXPECT_EQ(0, diff);
4253
+ }
4254
+
4255
+ TEST_F(LibYUVPlanarTest, TestScaleSamples_Opt) {
4256
+ float diff = TestScaleSamples(benchmark_width_, benchmark_height_,
4257
+ benchmark_iterations_, 1.2f, true);
4258
+ EXPECT_EQ(0, diff);
4259
+ }
4260
+
4261
+ float TestCopySamples(int benchmark_width,
4262
+ int benchmark_height,
4263
+ int benchmark_iterations,
4264
+ bool opt) {
4265
+ int i, j;
4266
+ // NEON does multiple of 16 floats, so round count up
4267
+ const int kPixels = (benchmark_width * benchmark_height + 15) & ~15;
4268
+ align_buffer_page_end(orig_y, kPixels * 4 * 3);
4269
+ uint8_t* dst_c = orig_y + kPixels * 4;
4270
+ uint8_t* dst_opt = orig_y + kPixels * 4 * 2;
4271
+
4272
+ // Randomize works but may contain some denormals affecting performance.
4273
+ // MemRandomize(orig_y, kPixels * 4);
4274
+ // large values are problematic. audio is really -1 to 1.
4275
+ for (i = 0; i < kPixels; ++i) {
4276
+ (reinterpret_cast<float*>(orig_y))[i] = sinf(static_cast<float>(i) * 0.1f);
4277
+ }
4278
+ memset(dst_c, 0, kPixels * 4);
4279
+ memset(dst_opt, 1, kPixels * 4);
4280
+
4281
+ memcpy(reinterpret_cast<void*>(dst_c), reinterpret_cast<void*>(orig_y),
4282
+ kPixels * 4);
4283
+
4284
+ for (j = 0; j < benchmark_iterations; j++) {
4285
+ if (opt) {
4286
+ #ifdef HAS_COPYROW_NEON
4287
+ CopyRow_NEON(orig_y, dst_opt, kPixels * 4);
4288
+ #else
4289
+ CopyRow_C(orig_y, dst_opt, kPixels * 4);
4290
+ #endif
4291
+ } else {
4292
+ CopyRow_C(orig_y, dst_opt, kPixels * 4);
4293
+ }
4294
+ }
4295
+
4296
+ float max_diff = 0.f;
4297
+ for (i = 0; i < kPixels; ++i) {
4298
+ float abs_diff = FAbs((reinterpret_cast<float*>(dst_c)[i]) -
4299
+ (reinterpret_cast<float*>(dst_opt)[i]));
4300
+ if (abs_diff > max_diff) {
4301
+ max_diff = abs_diff;
4302
+ }
4303
+ }
4304
+
4305
+ free_aligned_buffer_page_end(orig_y);
4306
+ return max_diff;
4307
+ }
4308
+
4309
+ TEST_F(LibYUVPlanarTest, TestCopySamples_C) {
4310
+ float diff = TestCopySamples(benchmark_width_, benchmark_height_,
4311
+ benchmark_iterations_, false);
4312
+ EXPECT_EQ(0, diff);
4313
+ }
4314
+
4315
+ TEST_F(LibYUVPlanarTest, TestCopySamples_Opt) {
4316
+ float diff = TestCopySamples(benchmark_width_, benchmark_height_,
4317
+ benchmark_iterations_, true);
4318
+ EXPECT_EQ(0, diff);
4319
+ }
4320
+
4321
+ extern "C" void GaussRow_NEON(const uint32_t* src, uint16_t* dst, int width);
4322
+ extern "C" void GaussRow_C(const uint32_t* src, uint16_t* dst, int width);
4323
+
4324
+ TEST_F(LibYUVPlanarTest, TestGaussRow_Opt) {
4325
+ SIMD_ALIGNED(uint32_t orig_pixels[1280 + 8]);
4326
+ SIMD_ALIGNED(uint16_t dst_pixels_c[1280]);
4327
+ SIMD_ALIGNED(uint16_t dst_pixels_opt[1280]);
4328
+
4329
+ memset(orig_pixels, 0, sizeof(orig_pixels));
4330
+ memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4331
+ memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4332
+
4333
+ for (int i = 0; i < 1280 + 8; ++i) {
4334
+ orig_pixels[i] = i * 256;
4335
+ }
4336
+ GaussRow_C(&orig_pixels[0], &dst_pixels_c[0], 1280);
4337
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4338
+ #if !defined(LIBYUV_DISABLE_NEON) && \
4339
+ (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON))
4340
+ int has_neon = TestCpuFlag(kCpuHasNEON);
4341
+ if (has_neon) {
4342
+ GaussRow_NEON(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4343
+ } else {
4344
+ GaussRow_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4345
+ }
4346
+ #else
4347
+ GaussRow_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4348
+ #endif
4349
+ }
4350
+
4351
+ for (int i = 0; i < 1280; ++i) {
4352
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4353
+ }
4354
+
4355
+ EXPECT_EQ(dst_pixels_c[0],
4356
+ static_cast<uint16_t>(0 * 1 + 1 * 4 + 2 * 6 + 3 * 4 + 4 * 1));
4357
+ EXPECT_EQ(dst_pixels_c[639], static_cast<uint16_t>(10256));
4358
+ }
4359
+
4360
+ extern "C" void GaussCol_NEON(const uint16_t* src0,
4361
+ const uint16_t* src1,
4362
+ const uint16_t* src2,
4363
+ const uint16_t* src3,
4364
+ const uint16_t* src4,
4365
+ uint32_t* dst,
4366
+ int width);
4367
+
4368
+ extern "C" void GaussCol_C(const uint16_t* src0,
4369
+ const uint16_t* src1,
4370
+ const uint16_t* src2,
4371
+ const uint16_t* src3,
4372
+ const uint16_t* src4,
4373
+ uint32_t* dst,
4374
+ int width);
4375
+
4376
+ TEST_F(LibYUVPlanarTest, TestGaussCol_Opt) {
4377
+ SIMD_ALIGNED(uint16_t orig_pixels[1280 * 5]);
4378
+ SIMD_ALIGNED(uint32_t dst_pixels_c[1280]);
4379
+ SIMD_ALIGNED(uint32_t dst_pixels_opt[1280]);
4380
+
4381
+ memset(orig_pixels, 0, sizeof(orig_pixels));
4382
+ memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4383
+ memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4384
+
4385
+ for (int i = 0; i < 1280 * 5; ++i) {
4386
+ orig_pixels[i] = static_cast<float>(i);
4387
+ }
4388
+ GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4389
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4], &dst_pixels_c[0],
4390
+ 1280);
4391
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4392
+ #if !defined(LIBYUV_DISABLE_NEON) && \
4393
+ (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON))
4394
+ int has_neon = TestCpuFlag(kCpuHasNEON);
4395
+ if (has_neon) {
4396
+ GaussCol_NEON(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4397
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4398
+ &dst_pixels_opt[0], 1280);
4399
+ } else {
4400
+ GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4401
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4402
+ &dst_pixels_opt[0], 1280);
4403
+ }
4404
+ #else
4405
+ GaussCol_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4406
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4407
+ &dst_pixels_opt[0], 1280);
4408
+ #endif
4409
+ }
4410
+
4411
+ for (int i = 0; i < 1280; ++i) {
4412
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4413
+ }
4414
+ }
4415
+
4416
+ TEST_F(LibYUVPlanarTest, TestGaussRow_F32_Opt) {
4417
+ SIMD_ALIGNED(float orig_pixels[1280 + 4]);
4418
+ SIMD_ALIGNED(float dst_pixels_c[1280]);
4419
+ SIMD_ALIGNED(float dst_pixels_opt[1280]);
4420
+
4421
+ memset(orig_pixels, 0, sizeof(orig_pixels));
4422
+ memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4423
+ memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4424
+
4425
+ for (int i = 0; i < 1280 + 4; ++i) {
4426
+ orig_pixels[i] = static_cast<float>(i);
4427
+ }
4428
+ GaussRow_F32_C(&orig_pixels[0], &dst_pixels_c[0], 1280);
4429
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4430
+ #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
4431
+ int has_neon = TestCpuFlag(kCpuHasNEON);
4432
+ if (has_neon) {
4433
+ GaussRow_F32_NEON(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4434
+ } else {
4435
+ GaussRow_F32_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4436
+ }
4437
+ #else
4438
+ GaussRow_F32_C(&orig_pixels[0], &dst_pixels_opt[0], 1280);
4439
+ #endif
4440
+ }
4441
+
4442
+ for (int i = 0; i < 1280; ++i) {
4443
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4444
+ }
4445
+ }
4446
+
4447
+ TEST_F(LibYUVPlanarTest, TestGaussCol_F32_Opt) {
4448
+ SIMD_ALIGNED(float dst_pixels_c[1280]);
4449
+ SIMD_ALIGNED(float dst_pixels_opt[1280]);
4450
+ align_buffer_page_end(orig_pixels_buf, 1280 * 5 * 4); // 5 rows
4451
+ float* orig_pixels = reinterpret_cast<float*>(orig_pixels_buf);
4452
+
4453
+ memset(orig_pixels, 0, 1280 * 5 * 4);
4454
+ memset(dst_pixels_c, 1, sizeof(dst_pixels_c));
4455
+ memset(dst_pixels_opt, 2, sizeof(dst_pixels_opt));
4456
+
4457
+ for (int i = 0; i < 1280 * 5; ++i) {
4458
+ orig_pixels[i] = static_cast<float>(i);
4459
+ }
4460
+ GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4461
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4462
+ &dst_pixels_c[0], 1280);
4463
+ for (int i = 0; i < benchmark_pixels_div1280_; ++i) {
4464
+ #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__)
4465
+ int has_neon = TestCpuFlag(kCpuHasNEON);
4466
+ if (has_neon) {
4467
+ GaussCol_F32_NEON(&orig_pixels[0], &orig_pixels[1280],
4468
+ &orig_pixels[1280 * 2], &orig_pixels[1280 * 3],
4469
+ &orig_pixels[1280 * 4], &dst_pixels_opt[0], 1280);
4470
+ } else {
4471
+ GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280],
4472
+ &orig_pixels[1280 * 2], &orig_pixels[1280 * 3],
4473
+ &orig_pixels[1280 * 4], &dst_pixels_opt[0], 1280);
4474
+ }
4475
+ #else
4476
+ GaussCol_F32_C(&orig_pixels[0], &orig_pixels[1280], &orig_pixels[1280 * 2],
4477
+ &orig_pixels[1280 * 3], &orig_pixels[1280 * 4],
4478
+ &dst_pixels_opt[0], 1280);
4479
+ #endif
4480
+ }
4481
+
4482
+ for (int i = 0; i < 1280; ++i) {
4483
+ EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
4484
+ }
4485
+ free_aligned_buffer_page_end(orig_pixels_buf);
4486
+ }
4487
+
4488
+ TEST_F(LibYUVPlanarTest, SwapUVRow) {
4489
+ const int kPixels = benchmark_width_ * benchmark_height_;
4490
+ void (*SwapUVRow)(const uint8_t* src_uv, uint8_t* dst_vu, int width) =
4491
+ SwapUVRow_C;
4492
+
4493
+ align_buffer_page_end(src_pixels_vu, kPixels * 2);
4494
+ align_buffer_page_end(dst_pixels_uv, kPixels * 2);
4495
+ MemRandomize(src_pixels_vu, kPixels * 2);
4496
+ memset(dst_pixels_uv, 1, kPixels * 2);
4497
+
4498
+ #if defined(HAS_SWAPUVROW_NEON)
4499
+ if (TestCpuFlag(kCpuHasNEON)) {
4500
+ SwapUVRow = SwapUVRow_Any_NEON;
4501
+ if (IS_ALIGNED(kPixels, 16)) {
4502
+ SwapUVRow = SwapUVRow_NEON;
4503
+ }
4504
+ }
4505
+ #endif
4506
+
4507
+ for (int j = 0; j < benchmark_iterations_; j++) {
4508
+ SwapUVRow(src_pixels_vu, dst_pixels_uv, kPixels);
4509
+ }
4510
+ for (int i = 0; i < kPixels; ++i) {
4511
+ EXPECT_EQ(dst_pixels_uv[i * 2 + 0], src_pixels_vu[i * 2 + 1]);
4512
+ EXPECT_EQ(dst_pixels_uv[i * 2 + 1], src_pixels_vu[i * 2 + 0]);
4513
+ }
4514
+
4515
+ free_aligned_buffer_page_end(src_pixels_vu);
4516
+ free_aligned_buffer_page_end(dst_pixels_uv);
4517
+ }
4518
+ #endif // ENABLE_ROW_TESTS
4519
+
4520
+ TEST_F(LibYUVPlanarTest, TestGaussPlane_F32) {
4521
+ const int kSize = benchmark_width_ * benchmark_height_ * 4;
4522
+ align_buffer_page_end(orig_pixels, kSize);
4523
+ align_buffer_page_end(dst_pixels_opt, kSize);
4524
+ align_buffer_page_end(dst_pixels_c, kSize);
4525
+
4526
+ for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4527
+ ((float*)(orig_pixels))[i] = (i & 1023) * 3.14f;
4528
+ }
4529
+ memset(dst_pixels_opt, 1, kSize);
4530
+ memset(dst_pixels_c, 2, kSize);
4531
+
4532
+ MaskCpuFlags(disable_cpu_flags_);
4533
+ GaussPlane_F32((const float*)(orig_pixels), benchmark_width_,
4534
+ (float*)(dst_pixels_c), benchmark_width_, benchmark_width_,
4535
+ benchmark_height_);
4536
+ MaskCpuFlags(benchmark_cpu_info_);
4537
+
4538
+ for (int i = 0; i < benchmark_iterations_; ++i) {
4539
+ GaussPlane_F32((const float*)(orig_pixels), benchmark_width_,
4540
+ (float*)(dst_pixels_opt), benchmark_width_, benchmark_width_,
4541
+ benchmark_height_);
4542
+ }
4543
+ for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4544
+ EXPECT_NEAR(((float*)(dst_pixels_c))[i], ((float*)(dst_pixels_opt))[i], 1.f)
4545
+ << i;
4546
+ }
4547
+
4548
+ free_aligned_buffer_page_end(dst_pixels_c);
4549
+ free_aligned_buffer_page_end(dst_pixels_opt);
4550
+ free_aligned_buffer_page_end(orig_pixels);
4551
+ }
4552
+
4553
+ TEST_F(LibYUVPlanarTest, HalfMergeUVPlane_Opt) {
4554
+ int dst_width = (benchmark_width_ + 1) / 2;
4555
+ int dst_height = (benchmark_height_ + 1) / 2;
4556
+ align_buffer_page_end(src_pixels_u, benchmark_width_ * benchmark_height_);
4557
+ align_buffer_page_end(src_pixels_v, benchmark_width_ * benchmark_height_);
4558
+ align_buffer_page_end(dst_pixels_uv_opt, dst_width * 2 * dst_height);
4559
+ align_buffer_page_end(dst_pixels_uv_c, dst_width * 2 * dst_height);
4560
+
4561
+ MemRandomize(src_pixels_u, benchmark_width_ * benchmark_height_);
4562
+ MemRandomize(src_pixels_v, benchmark_width_ * benchmark_height_);
4563
+ MemRandomize(dst_pixels_uv_opt, dst_width * 2 * dst_height);
4564
+ MemRandomize(dst_pixels_uv_c, dst_width * 2 * dst_height);
4565
+
4566
+ MaskCpuFlags(disable_cpu_flags_);
4567
+ HalfMergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v,
4568
+ benchmark_width_, dst_pixels_uv_c, dst_width * 2,
4569
+ benchmark_width_, benchmark_height_);
4570
+ MaskCpuFlags(benchmark_cpu_info_);
4571
+
4572
+ for (int i = 0; i < benchmark_iterations_; ++i) {
4573
+ HalfMergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v,
4574
+ benchmark_width_, dst_pixels_uv_opt, dst_width * 2,
4575
+ benchmark_width_, benchmark_height_);
4576
+ }
4577
+
4578
+ for (int i = 0; i < dst_width * 2 * dst_height; ++i) {
4579
+ EXPECT_EQ(dst_pixels_uv_c[i], dst_pixels_uv_opt[i]);
4580
+ }
4581
+
4582
+ free_aligned_buffer_page_end(src_pixels_u);
4583
+ free_aligned_buffer_page_end(src_pixels_v);
4584
+ free_aligned_buffer_page_end(dst_pixels_uv_opt);
4585
+ free_aligned_buffer_page_end(dst_pixels_uv_c);
4586
+ }
4587
+
4588
+ TEST_F(LibYUVPlanarTest, NV12Copy) {
4589
+ const int halfwidth = (benchmark_width_ + 1) >> 1;
4590
+ const int halfheight = (benchmark_height_ + 1) >> 1;
4591
+ align_buffer_page_end(src_y, benchmark_width_ * benchmark_height_);
4592
+ align_buffer_page_end(src_uv, halfwidth * 2 * halfheight);
4593
+ align_buffer_page_end(dst_y, benchmark_width_ * benchmark_height_);
4594
+ align_buffer_page_end(dst_uv, halfwidth * 2 * halfheight);
4595
+
4596
+ MemRandomize(src_y, benchmark_width_ * benchmark_height_);
4597
+ MemRandomize(src_uv, halfwidth * 2 * halfheight);
4598
+ MemRandomize(dst_y, benchmark_width_ * benchmark_height_);
4599
+ MemRandomize(dst_uv, halfwidth * 2 * halfheight);
4600
+
4601
+ for (int i = 0; i < benchmark_iterations_; ++i) {
4602
+ NV12Copy(src_y, benchmark_width_, src_uv, halfwidth * 2, dst_y,
4603
+ benchmark_width_, dst_uv, halfwidth * 2, benchmark_width_,
4604
+ benchmark_height_);
4605
+ }
4606
+
4607
+ for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4608
+ EXPECT_EQ(src_y[i], dst_y[i]);
4609
+ }
4610
+ for (int i = 0; i < halfwidth * 2 * halfheight; ++i) {
4611
+ EXPECT_EQ(src_uv[i], dst_uv[i]);
4612
+ }
4613
+
4614
+ free_aligned_buffer_page_end(src_y);
4615
+ free_aligned_buffer_page_end(src_uv);
4616
+ free_aligned_buffer_page_end(dst_y);
4617
+ free_aligned_buffer_page_end(dst_uv);
4618
+ }
4619
+
4620
+ TEST_F(LibYUVPlanarTest, NV21Copy) {
4621
+ const int halfwidth = (benchmark_width_ + 1) >> 1;
4622
+ const int halfheight = (benchmark_height_ + 1) >> 1;
4623
+ align_buffer_page_end(src_y, benchmark_width_ * benchmark_height_);
4624
+ align_buffer_page_end(src_vu, halfwidth * 2 * halfheight);
4625
+ align_buffer_page_end(dst_y, benchmark_width_ * benchmark_height_);
4626
+ align_buffer_page_end(dst_vu, halfwidth * 2 * halfheight);
4627
+
4628
+ MemRandomize(src_y, benchmark_width_ * benchmark_height_);
4629
+ MemRandomize(src_vu, halfwidth * 2 * halfheight);
4630
+ MemRandomize(dst_y, benchmark_width_ * benchmark_height_);
4631
+ MemRandomize(dst_vu, halfwidth * 2 * halfheight);
4632
+
4633
+ for (int i = 0; i < benchmark_iterations_; ++i) {
4634
+ NV21Copy(src_y, benchmark_width_, src_vu, halfwidth * 2, dst_y,
4635
+ benchmark_width_, dst_vu, halfwidth * 2, benchmark_width_,
4636
+ benchmark_height_);
4637
+ }
4638
+
4639
+ for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
4640
+ EXPECT_EQ(src_y[i], dst_y[i]);
4641
+ }
4642
+ for (int i = 0; i < halfwidth * 2 * halfheight; ++i) {
4643
+ EXPECT_EQ(src_vu[i], dst_vu[i]);
4644
+ }
4645
+
4646
+ free_aligned_buffer_page_end(src_y);
4647
+ free_aligned_buffer_page_end(src_vu);
4648
+ free_aligned_buffer_page_end(dst_y);
4649
+ free_aligned_buffer_page_end(dst_vu);
4650
+ }
4651
+
4652
+ #if defined(ENABLE_ROW_TESTS) && !defined(LIBYUV_DISABLE_NEON) && \
4653
+ defined(__aarch64__)
4654
+
4655
+ TEST_F(LibYUVPlanarTest, TestConvertFP16ToFP32) {
4656
+ int i, j;
4657
+ const int y_plane_size = benchmark_width_ * benchmark_height_;
4658
+
4659
+ align_buffer_page_end(orig_f, y_plane_size * 4);
4660
+ align_buffer_page_end(orig_y, y_plane_size * 2);
4661
+ align_buffer_page_end(dst_opt, y_plane_size * 4);
4662
+ align_buffer_page_end(rec_opt, y_plane_size * 2);
4663
+
4664
+ for (i = 0; i < y_plane_size; ++i) {
4665
+ ((float*)orig_f)[i] = (float)(i % 10000) * 3.14f;
4666
+ }
4667
+ memset(orig_y, 1, y_plane_size * 2);
4668
+ memset(dst_opt, 2, y_plane_size * 4);
4669
+ memset(rec_opt, 3, y_plane_size * 2);
4670
+
4671
+ ConvertFP32ToFP16Row_NEON((const float*)orig_f, (uint16_t*)orig_y,
4672
+ y_plane_size);
4673
+
4674
+ for (j = 0; j < benchmark_iterations_; j++) {
4675
+ ConvertFP16ToFP32Row_NEON((const uint16_t*)orig_y, (float*)dst_opt,
4676
+ y_plane_size);
4677
+ }
4678
+
4679
+ ConvertFP32ToFP16Row_NEON((const float*)dst_opt, (uint16_t*)rec_opt,
4680
+ y_plane_size);
4681
+
4682
+ for (i = 0; i < y_plane_size; ++i) {
4683
+ EXPECT_EQ(((const uint16_t*)orig_y)[i], ((const uint16_t*)rec_opt)[i]);
4684
+ }
4685
+
4686
+ free_aligned_buffer_page_end(orig_f);
4687
+ free_aligned_buffer_page_end(orig_y);
4688
+ free_aligned_buffer_page_end(dst_opt);
4689
+ free_aligned_buffer_page_end(rec_opt);
4690
+ }
4691
+
4692
+ TEST_F(LibYUVPlanarTest, TestConvertFP16ToFP32Column) {
4693
+ int i, j;
4694
+ const int y_plane_size = benchmark_width_ * benchmark_height_;
4695
+
4696
+ align_buffer_page_end(orig_f, y_plane_size * 4);
4697
+ align_buffer_page_end(orig_y, y_plane_size * 2);
4698
+ align_buffer_page_end(dst_opt, y_plane_size * 4);
4699
+ align_buffer_page_end(rec_opt, y_plane_size * 2);
4700
+
4701
+ for (i = 0; i < y_plane_size; ++i) {
4702
+ ((float*)orig_f)[i] = (float)(i % 10000) * 3.14f;
4703
+ }
4704
+ memset(orig_y, 1, y_plane_size * 2);
4705
+ memset(dst_opt, 2, y_plane_size * 4);
4706
+ memset(rec_opt, 3, y_plane_size * 2);
4707
+
4708
+ ConvertFP32ToFP16Row_NEON((const float*)orig_f, (uint16_t*)orig_y,
4709
+ y_plane_size);
4710
+
4711
+ for (j = 0; j < benchmark_iterations_; j++) {
4712
+ ConvertFP16ToFP32Column_NEON((const uint16_t*)orig_y, 1, (float*)dst_opt,
4713
+ y_plane_size);
4714
+ }
4715
+
4716
+ ConvertFP32ToFP16Row_NEON((const float*)dst_opt, (uint16_t*)rec_opt,
4717
+ y_plane_size);
4718
+
4719
+ for (i = 0; i < y_plane_size; ++i) {
4720
+ EXPECT_EQ(((const uint16_t*)orig_y)[i], ((const uint16_t*)rec_opt)[i]);
4721
+ }
4722
+
4723
+ free_aligned_buffer_page_end(orig_f);
4724
+ free_aligned_buffer_page_end(orig_y);
4725
+ free_aligned_buffer_page_end(dst_opt);
4726
+ free_aligned_buffer_page_end(rec_opt);
4727
+ }
4728
+
4729
+ #endif // defined(ENABLE_ROW_TESTS) && defined(__aarch64__)
4730
+
4731
+ } // namespace libyuv