react-native-vision-camera-spoof-detector 1.1.23 → 1.1.24

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 (199) hide show
  1. package/android/CMakeLists.txt +12 -0
  2. package/android/build.gradle +10 -9
  3. package/android/src/main/cpp/cpp-adapter.cpp +6 -3
  4. package/package.json +1 -1
  5. package/android/src/main/cpp/CMakeLists.txt +0 -33
  6. package/android/src/main/cpp/FaceAntiSpoofJSI.cpp +0 -142
  7. package/android/src/main/cpp/FastYuvJni.cpp +0 -111
  8. package/android/src/main/cpp/fast_yuv.cpp +0 -342
  9. package/android/src/main/cpp/fast_yuv.h +0 -23
  10. package/android/src/main/cpp/libyuv/.clang-format +0 -6
  11. package/android/src/main/cpp/libyuv/.gn +0 -40
  12. package/android/src/main/cpp/libyuv/.vpython3 +0 -410
  13. package/android/src/main/cpp/libyuv/AUTHORS +0 -7
  14. package/android/src/main/cpp/libyuv/Android.bp +0 -202
  15. package/android/src/main/cpp/libyuv/Android.mk +0 -106
  16. package/android/src/main/cpp/libyuv/BUILD.gn +0 -490
  17. package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +0 -70
  18. package/android/src/main/cpp/libyuv/CMakeLists.txt +0 -259
  19. package/android/src/main/cpp/libyuv/DEPS +0 -935
  20. package/android/src/main/cpp/libyuv/DIR_METADATA +0 -3
  21. package/android/src/main/cpp/libyuv/LICENSE +0 -29
  22. package/android/src/main/cpp/libyuv/OWNERS +0 -11
  23. package/android/src/main/cpp/libyuv/PATENTS +0 -24
  24. package/android/src/main/cpp/libyuv/PRESUBMIT.py +0 -65
  25. package/android/src/main/cpp/libyuv/README.chromium +0 -11
  26. package/android/src/main/cpp/libyuv/README.md +0 -19
  27. package/android/src/main/cpp/libyuv/build_overrides/build.gni +0 -60
  28. package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +0 -19
  29. package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +0 -17
  30. package/android/src/main/cpp/libyuv/codereview.settings +0 -5
  31. package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +0 -409
  32. package/android/src/main/cpp/libyuv/docs/environment_variables.md +0 -64
  33. package/android/src/main/cpp/libyuv/docs/feature_detection.md +0 -108
  34. package/android/src/main/cpp/libyuv/docs/filtering.md +0 -196
  35. package/android/src/main/cpp/libyuv/docs/formats.md +0 -208
  36. package/android/src/main/cpp/libyuv/docs/getting_started.md +0 -296
  37. package/android/src/main/cpp/libyuv/docs/rotation.md +0 -107
  38. package/android/src/main/cpp/libyuv/download_vs_toolchain.py +0 -29
  39. package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +0 -68
  40. package/android/src/main/cpp/libyuv/include/libyuv/compare.h +0 -111
  41. package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +0 -112
  42. package/android/src/main/cpp/libyuv/include/libyuv/convert.h +0 -1117
  43. package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +0 -2335
  44. package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +0 -203
  45. package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +0 -394
  46. package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +0 -147
  47. package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +0 -99
  48. package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +0 -1949
  49. package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +0 -195
  50. package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +0 -1131
  51. package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +0 -296
  52. package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +0 -37
  53. package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +0 -265
  54. package/android/src/main/cpp/libyuv/include/libyuv/row.h +0 -6738
  55. package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +0 -2154
  56. package/android/src/main/cpp/libyuv/include/libyuv/scale.h +0 -336
  57. package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +0 -76
  58. package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +0 -42
  59. package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +0 -1726
  60. package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +0 -51
  61. package/android/src/main/cpp/libyuv/include/libyuv/version.h +0 -16
  62. package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +0 -222
  63. package/android/src/main/cpp/libyuv/include/libyuv.h +0 -33
  64. package/android/src/main/cpp/libyuv/infra/config/OWNERS +0 -3
  65. package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +0 -17
  66. package/android/src/main/cpp/libyuv/infra/config/README.md +0 -2
  67. package/android/src/main/cpp/libyuv/infra/config/codereview.settings +0 -6
  68. package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +0 -144
  69. package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +0 -1185
  70. package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +0 -9
  71. package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +0 -246
  72. package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +0 -385
  73. package/android/src/main/cpp/libyuv/infra/config/main.star +0 -402
  74. package/android/src/main/cpp/libyuv/infra/config/project.cfg +0 -16
  75. package/android/src/main/cpp/libyuv/infra/config/realms.cfg +0 -111
  76. package/android/src/main/cpp/libyuv/libyuv.gni +0 -34
  77. package/android/src/main/cpp/libyuv/libyuv.gyp +0 -149
  78. package/android/src/main/cpp/libyuv/libyuv.gypi +0 -87
  79. package/android/src/main/cpp/libyuv/linux.mk +0 -96
  80. package/android/src/main/cpp/libyuv/public.mk +0 -13
  81. package/android/src/main/cpp/libyuv/pylintrc +0 -49
  82. package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +0 -74
  83. package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +0 -56
  84. package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +0 -15
  85. package/android/src/main/cpp/libyuv/source/compare.cc +0 -435
  86. package/android/src/main/cpp/libyuv/source/compare_common.cc +0 -74
  87. package/android/src/main/cpp/libyuv/source/compare_gcc.cc +0 -362
  88. package/android/src/main/cpp/libyuv/source/compare_neon.cc +0 -96
  89. package/android/src/main/cpp/libyuv/source/compare_neon64.cc +0 -223
  90. package/android/src/main/cpp/libyuv/source/compare_win.cc +0 -241
  91. package/android/src/main/cpp/libyuv/source/convert.cc +0 -4746
  92. package/android/src/main/cpp/libyuv/source/convert_argb.cc +0 -9179
  93. package/android/src/main/cpp/libyuv/source/convert_from.cc +0 -866
  94. package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +0 -3671
  95. package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +0 -602
  96. package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +0 -391
  97. package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +0 -288
  98. package/android/src/main/cpp/libyuv/source/cpu_id.cc +0 -496
  99. package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +0 -580
  100. package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +0 -71
  101. package/android/src/main/cpp/libyuv/source/planar_functions.cc +0 -5663
  102. package/android/src/main/cpp/libyuv/source/rotate.cc +0 -1241
  103. package/android/src/main/cpp/libyuv/source/rotate_any.cc +0 -76
  104. package/android/src/main/cpp/libyuv/source/rotate_argb.cc +0 -259
  105. package/android/src/main/cpp/libyuv/source/rotate_common.cc +0 -208
  106. package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +0 -505
  107. package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +0 -233
  108. package/android/src/main/cpp/libyuv/source/rotate_neon.cc +0 -219
  109. package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +0 -273
  110. package/android/src/main/cpp/libyuv/source/rotate_sme.cc +0 -174
  111. package/android/src/main/cpp/libyuv/source/rotate_win.cc +0 -253
  112. package/android/src/main/cpp/libyuv/source/row_any.cc +0 -2519
  113. package/android/src/main/cpp/libyuv/source/row_common.cc +0 -4461
  114. package/android/src/main/cpp/libyuv/source/row_gcc.cc +0 -9570
  115. package/android/src/main/cpp/libyuv/source/row_lasx.cc +0 -2343
  116. package/android/src/main/cpp/libyuv/source/row_lsx.cc +0 -3030
  117. package/android/src/main/cpp/libyuv/source/row_neon.cc +0 -4026
  118. package/android/src/main/cpp/libyuv/source/row_neon64.cc +0 -5617
  119. package/android/src/main/cpp/libyuv/source/row_rvv.cc +0 -2599
  120. package/android/src/main/cpp/libyuv/source/row_sme.cc +0 -1183
  121. package/android/src/main/cpp/libyuv/source/row_sve.cc +0 -1088
  122. package/android/src/main/cpp/libyuv/source/row_win.cc +0 -6453
  123. package/android/src/main/cpp/libyuv/source/scale.cc +0 -2710
  124. package/android/src/main/cpp/libyuv/source/scale_any.cc +0 -991
  125. package/android/src/main/cpp/libyuv/source/scale_argb.cc +0 -1158
  126. package/android/src/main/cpp/libyuv/source/scale_common.cc +0 -1977
  127. package/android/src/main/cpp/libyuv/source/scale_gcc.cc +0 -2947
  128. package/android/src/main/cpp/libyuv/source/scale_lsx.cc +0 -739
  129. package/android/src/main/cpp/libyuv/source/scale_neon.cc +0 -1449
  130. package/android/src/main/cpp/libyuv/source/scale_neon64.cc +0 -1552
  131. package/android/src/main/cpp/libyuv/source/scale_rgb.cc +0 -82
  132. package/android/src/main/cpp/libyuv/source/scale_rvv.cc +0 -1971
  133. package/android/src/main/cpp/libyuv/source/scale_sme.cc +0 -555
  134. package/android/src/main/cpp/libyuv/source/scale_uv.cc +0 -1159
  135. package/android/src/main/cpp/libyuv/source/scale_win.cc +0 -1392
  136. package/android/src/main/cpp/libyuv/source/test.sh +0 -35
  137. package/android/src/main/cpp/libyuv/source/video_common.cc +0 -62
  138. package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +0 -4
  139. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +0 -931
  140. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +0 -164
  141. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +0 -21
  142. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +0 -13
  143. package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +0 -13
  144. package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +0 -38
  145. package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +0 -3
  146. package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +0 -9
  147. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +0 -3
  148. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +0 -15
  149. package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +0 -25
  150. package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +0 -43
  151. package/android/src/main/cpp/libyuv/unit_test/color_test.cc +0 -848
  152. package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +0 -739
  153. package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +0 -2867
  154. package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +0 -2133
  155. package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +0 -427
  156. package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +0 -63
  157. package/android/src/main/cpp/libyuv/unit_test/math_test.cc +0 -160
  158. package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +0 -4731
  159. package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +0 -334
  160. package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +0 -962
  161. package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +0 -590
  162. package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +0 -465
  163. package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +0 -280
  164. package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +0 -1135
  165. package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +0 -249
  166. package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +0 -12
  167. package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +0 -7
  168. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +0 -5
  169. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +0 -10
  170. package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +0 -7
  171. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +0 -4
  172. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +0 -4
  173. package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +0 -4
  174. package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +0 -23
  175. package/android/src/main/cpp/libyuv/unit_test/testdata/test0.jpg +0 -0
  176. package/android/src/main/cpp/libyuv/unit_test/testdata/test1.jpg +0 -0
  177. package/android/src/main/cpp/libyuv/unit_test/testdata/test2.jpg +0 -0
  178. package/android/src/main/cpp/libyuv/unit_test/testdata/test3.jpg +0 -0
  179. package/android/src/main/cpp/libyuv/unit_test/testdata/test4.jpg +0 -0
  180. package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +0 -581
  181. package/android/src/main/cpp/libyuv/unit_test/unit_test.h +0 -232
  182. package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +0 -112
  183. package/android/src/main/cpp/libyuv/util/Makefile +0 -9
  184. package/android/src/main/cpp/libyuv/util/color.cc +0 -120
  185. package/android/src/main/cpp/libyuv/util/compare.cc +0 -67
  186. package/android/src/main/cpp/libyuv/util/cpuid.c +0 -211
  187. package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +0 -28
  188. package/android/src/main/cpp/libyuv/util/psnr.cc +0 -291
  189. package/android/src/main/cpp/libyuv/util/psnr.h +0 -47
  190. package/android/src/main/cpp/libyuv/util/psnr_main.cc +0 -620
  191. package/android/src/main/cpp/libyuv/util/ssim.cc +0 -364
  192. package/android/src/main/cpp/libyuv/util/ssim.h +0 -38
  193. package/android/src/main/cpp/libyuv/util/yuvconstants.c +0 -114
  194. package/android/src/main/cpp/libyuv/util/yuvconvert.cc +0 -367
  195. package/android/src/main/cpp/libyuv/winarm.mk +0 -47
  196. package/android/src/main/java/com/faceantispoof/ByteBufferPool.kt +0 -68
  197. package/android/src/main/java/com/faceantispoof/FastYuv.kt +0 -51
  198. package/android/src/main/java/com/faceantispoof/YuvToFloatArrayConverter.kt +0 -584
  199. package/android/src/main/java/com/faceantispoof/YuvToRgbConverter.kt +0 -73
@@ -1,3671 +0,0 @@
1
- /*
2
- * Copyright 2012 The LibYuv Project Authors. All rights reserved.
3
- *
4
- * Use of this source code is governed by a BSD-style license
5
- * that can be found in the LICENSE file in the root of the source
6
- * tree. An additional intellectual property rights grant can be found
7
- * in the file PATENTS. All contributing project authors may
8
- * be found in the AUTHORS file in the root of the source tree.
9
- */
10
-
11
- #include "libyuv/convert_from_argb.h"
12
-
13
- #include "libyuv/basic_types.h"
14
- #include "libyuv/cpu_id.h"
15
- #include "libyuv/planar_functions.h"
16
- #include "libyuv/row.h"
17
-
18
- #ifdef __cplusplus
19
- namespace libyuv {
20
- extern "C" {
21
- #endif
22
-
23
- // ARGB little endian (bgra in memory) to I444
24
- LIBYUV_API
25
- int ARGBToI444(const uint8_t* src_argb,
26
- int src_stride_argb,
27
- uint8_t* dst_y,
28
- int dst_stride_y,
29
- uint8_t* dst_u,
30
- int dst_stride_u,
31
- uint8_t* dst_v,
32
- int dst_stride_v,
33
- int width,
34
- int height) {
35
- int y;
36
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
37
- ARGBToYRow_C;
38
- void (*ARGBToUV444Row)(const uint8_t* src_argb, uint8_t* dst_u,
39
- uint8_t* dst_v, int width) = ARGBToUV444Row_C;
40
- if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) {
41
- return -1;
42
- }
43
- if (height < 0) {
44
- height = -height;
45
- src_argb = src_argb + (height - 1) * src_stride_argb;
46
- src_stride_argb = -src_stride_argb;
47
- }
48
- // Coalesce rows.
49
- if (src_stride_argb == width * 4 && dst_stride_y == width &&
50
- dst_stride_u == width && dst_stride_v == width) {
51
- width *= height;
52
- height = 1;
53
- src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0;
54
- }
55
- #if defined(HAS_ARGBTOUV444ROW_SSSE3)
56
- if (TestCpuFlag(kCpuHasSSSE3)) {
57
- ARGBToUV444Row = ARGBToUV444Row_Any_SSSE3;
58
- if (IS_ALIGNED(width, 16)) {
59
- ARGBToUV444Row = ARGBToUV444Row_SSSE3;
60
- }
61
- }
62
- #endif
63
- #if defined(HAS_ARGBTOUV444ROW_AVX2)
64
- if (TestCpuFlag(kCpuHasAVX2)) {
65
- ARGBToUV444Row = ARGBToUV444Row_Any_AVX2;
66
- if (IS_ALIGNED(width, 32)) {
67
- ARGBToUV444Row = ARGBToUV444Row_AVX2;
68
- }
69
- }
70
- #endif
71
- #if defined(HAS_ARGBTOUV444ROW_NEON)
72
- if (TestCpuFlag(kCpuHasNEON)) {
73
- ARGBToUV444Row = ARGBToUV444Row_Any_NEON;
74
- if (IS_ALIGNED(width, 8)) {
75
- ARGBToUV444Row = ARGBToUV444Row_NEON;
76
- }
77
- }
78
- #endif
79
- #if defined(HAS_ARGBTOUV444ROW_NEON_I8MM)
80
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
81
- ARGBToUV444Row = ARGBToUV444Row_Any_NEON_I8MM;
82
- if (IS_ALIGNED(width, 8)) {
83
- ARGBToUV444Row = ARGBToUV444Row_NEON_I8MM;
84
- }
85
- }
86
- #endif
87
- #if defined(HAS_ARGBTOUV444ROW_LSX)
88
- if (TestCpuFlag(kCpuHasLSX)) {
89
- ARGBToUV444Row = ARGBToUV444Row_Any_LSX;
90
- if (IS_ALIGNED(width, 16)) {
91
- ARGBToUV444Row = ARGBToUV444Row_LSX;
92
- }
93
- }
94
- #endif
95
- #if defined(HAS_ARGBTOUV444ROW_LASX)
96
- if (TestCpuFlag(kCpuHasLASX)) {
97
- ARGBToUV444Row = ARGBToUV444Row_Any_LASX;
98
- if (IS_ALIGNED(width, 32)) {
99
- ARGBToUV444Row = ARGBToUV444Row_LASX;
100
- }
101
- }
102
- #endif
103
- #if defined(HAS_ARGBTOYROW_SSSE3)
104
- if (TestCpuFlag(kCpuHasSSSE3)) {
105
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
106
- if (IS_ALIGNED(width, 16)) {
107
- ARGBToYRow = ARGBToYRow_SSSE3;
108
- }
109
- }
110
- #endif
111
- #if defined(HAS_ARGBTOYROW_AVX2)
112
- if (TestCpuFlag(kCpuHasAVX2)) {
113
- ARGBToYRow = ARGBToYRow_Any_AVX2;
114
- if (IS_ALIGNED(width, 32)) {
115
- ARGBToYRow = ARGBToYRow_AVX2;
116
- }
117
- }
118
- #endif
119
- #if defined(HAS_ARGBTOYROW_NEON)
120
- if (TestCpuFlag(kCpuHasNEON)) {
121
- ARGBToYRow = ARGBToYRow_Any_NEON;
122
- if (IS_ALIGNED(width, 16)) {
123
- ARGBToYRow = ARGBToYRow_NEON;
124
- }
125
- }
126
- #endif
127
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
128
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
129
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
130
- if (IS_ALIGNED(width, 16)) {
131
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
132
- }
133
- }
134
- #endif
135
- #if defined(HAS_ARGBTOYROW_LSX)
136
- if (TestCpuFlag(kCpuHasLSX)) {
137
- ARGBToYRow = ARGBToYRow_Any_LSX;
138
- if (IS_ALIGNED(width, 16)) {
139
- ARGBToYRow = ARGBToYRow_LSX;
140
- }
141
- }
142
- #endif
143
- #if defined(HAS_ARGBTOYROW_LASX)
144
- if (TestCpuFlag(kCpuHasLASX)) {
145
- ARGBToYRow = ARGBToYRow_Any_LASX;
146
- if (IS_ALIGNED(width, 32)) {
147
- ARGBToYRow = ARGBToYRow_LASX;
148
- }
149
- }
150
- #endif
151
- #if defined(HAS_ARGBTOYROW_RVV)
152
- if (TestCpuFlag(kCpuHasRVV)) {
153
- ARGBToYRow = ARGBToYRow_RVV;
154
- }
155
- #endif
156
-
157
- for (y = 0; y < height; ++y) {
158
- ARGBToUV444Row(src_argb, dst_u, dst_v, width);
159
- ARGBToYRow(src_argb, dst_y, width);
160
- src_argb += src_stride_argb;
161
- dst_y += dst_stride_y;
162
- dst_u += dst_stride_u;
163
- dst_v += dst_stride_v;
164
- }
165
- return 0;
166
- }
167
-
168
- // ARGB little endian (bgra in memory) to I422
169
- LIBYUV_API
170
- int ARGBToI422(const uint8_t* src_argb,
171
- int src_stride_argb,
172
- uint8_t* dst_y,
173
- int dst_stride_y,
174
- uint8_t* dst_u,
175
- int dst_stride_u,
176
- uint8_t* dst_v,
177
- int dst_stride_v,
178
- int width,
179
- int height) {
180
- int y;
181
- void (*ARGBToUVRow)(const uint8_t* src_argb0, int src_stride_argb,
182
- uint8_t* dst_u, uint8_t* dst_v, int width) =
183
- ARGBToUVRow_C;
184
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
185
- ARGBToYRow_C;
186
- if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) {
187
- return -1;
188
- }
189
- // Negative height means invert the image.
190
- if (height < 0) {
191
- height = -height;
192
- src_argb = src_argb + (height - 1) * src_stride_argb;
193
- src_stride_argb = -src_stride_argb;
194
- }
195
- // Coalesce rows.
196
- if (src_stride_argb == width * 4 && dst_stride_y == width &&
197
- dst_stride_u * 2 == width && dst_stride_v * 2 == width) {
198
- width *= height;
199
- height = 1;
200
- src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0;
201
- }
202
- #if defined(HAS_ARGBTOYROW_SSSE3)
203
- if (TestCpuFlag(kCpuHasSSSE3)) {
204
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
205
- if (IS_ALIGNED(width, 16)) {
206
- ARGBToYRow = ARGBToYRow_SSSE3;
207
- }
208
- }
209
- #endif
210
- #if defined(HAS_ARGBTOUVROW_SSSE3)
211
- if (TestCpuFlag(kCpuHasSSSE3)) {
212
- ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
213
- if (IS_ALIGNED(width, 16)) {
214
- ARGBToUVRow = ARGBToUVRow_SSSE3;
215
- }
216
- }
217
- #endif
218
- #if defined(HAS_ARGBTOYROW_AVX2)
219
- if (TestCpuFlag(kCpuHasAVX2)) {
220
- ARGBToYRow = ARGBToYRow_Any_AVX2;
221
- if (IS_ALIGNED(width, 32)) {
222
- ARGBToYRow = ARGBToYRow_AVX2;
223
- }
224
- }
225
- #endif
226
- #if defined(HAS_ARGBTOUVROW_AVX2)
227
- if (TestCpuFlag(kCpuHasAVX2)) {
228
- ARGBToUVRow = ARGBToUVRow_Any_AVX2;
229
- if (IS_ALIGNED(width, 32)) {
230
- ARGBToUVRow = ARGBToUVRow_AVX2;
231
- }
232
- }
233
- #endif
234
- #if defined(HAS_ARGBTOYROW_NEON)
235
- if (TestCpuFlag(kCpuHasNEON)) {
236
- ARGBToYRow = ARGBToYRow_Any_NEON;
237
- if (IS_ALIGNED(width, 16)) {
238
- ARGBToYRow = ARGBToYRow_NEON;
239
- }
240
- }
241
- #endif
242
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
243
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
244
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
245
- if (IS_ALIGNED(width, 16)) {
246
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
247
- }
248
- }
249
- #endif
250
- #if defined(HAS_ARGBTOUVROW_NEON)
251
- if (TestCpuFlag(kCpuHasNEON)) {
252
- ARGBToUVRow = ARGBToUVRow_Any_NEON;
253
- if (IS_ALIGNED(width, 16)) {
254
- ARGBToUVRow = ARGBToUVRow_NEON;
255
- }
256
- }
257
- #endif
258
- #if defined(HAS_ARGBTOUVROW_NEON_I8MM)
259
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
260
- ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM;
261
- if (IS_ALIGNED(width, 16)) {
262
- ARGBToUVRow = ARGBToUVRow_NEON_I8MM;
263
- }
264
- }
265
- #endif
266
- #if defined(HAS_ARGBTOUVROW_SVE2)
267
- if (TestCpuFlag(kCpuHasSVE2)) {
268
- ARGBToUVRow = ARGBToUVRow_Any_SVE2;
269
- if (IS_ALIGNED(width, 2)) {
270
- ARGBToUVRow = ARGBToUVRow_SVE2;
271
- }
272
- }
273
- #endif
274
- #if defined(HAS_ARGBTOUVROW_SME)
275
- if (TestCpuFlag(kCpuHasSME)) {
276
- ARGBToUVRow = ARGBToUVRow_Any_SME;
277
- if (IS_ALIGNED(width, 2)) {
278
- ARGBToUVRow = ARGBToUVRow_SME;
279
- }
280
- }
281
- #endif
282
- #if defined(HAS_ARGBTOYROW_LSX)
283
- if (TestCpuFlag(kCpuHasLSX)) {
284
- ARGBToYRow = ARGBToYRow_Any_LSX;
285
- if (IS_ALIGNED(width, 16)) {
286
- ARGBToYRow = ARGBToYRow_LSX;
287
- }
288
- }
289
- #endif
290
- #if defined(HAS_ARGBTOYROW_LSX) && defined(HAS_ARGBTOUVROW_LSX)
291
- if (TestCpuFlag(kCpuHasLSX)) {
292
- ARGBToYRow = ARGBToYRow_Any_LSX;
293
- ARGBToUVRow = ARGBToUVRow_Any_LSX;
294
- if (IS_ALIGNED(width, 16)) {
295
- ARGBToYRow = ARGBToYRow_LSX;
296
- ARGBToUVRow = ARGBToUVRow_LSX;
297
- }
298
- }
299
- #endif
300
- #if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX)
301
- if (TestCpuFlag(kCpuHasLASX)) {
302
- ARGBToYRow = ARGBToYRow_Any_LASX;
303
- ARGBToUVRow = ARGBToUVRow_Any_LASX;
304
- if (IS_ALIGNED(width, 32)) {
305
- ARGBToYRow = ARGBToYRow_LASX;
306
- ARGBToUVRow = ARGBToUVRow_LASX;
307
- }
308
- }
309
- #endif
310
- #if defined(HAS_ARGBTOYROW_RVV)
311
- if (TestCpuFlag(kCpuHasRVV)) {
312
- ARGBToYRow = ARGBToYRow_RVV;
313
- }
314
- #endif
315
-
316
- for (y = 0; y < height; ++y) {
317
- ARGBToUVRow(src_argb, 0, dst_u, dst_v, width);
318
- ARGBToYRow(src_argb, dst_y, width);
319
- src_argb += src_stride_argb;
320
- dst_y += dst_stride_y;
321
- dst_u += dst_stride_u;
322
- dst_v += dst_stride_v;
323
- }
324
- return 0;
325
- }
326
-
327
- LIBYUV_API
328
- int ARGBToNV12(const uint8_t* src_argb,
329
- int src_stride_argb,
330
- uint8_t* dst_y,
331
- int dst_stride_y,
332
- uint8_t* dst_uv,
333
- int dst_stride_uv,
334
- int width,
335
- int height) {
336
- int y;
337
- int halfwidth = (width + 1) >> 1;
338
- void (*ARGBToUVRow)(const uint8_t* src_argb0, int src_stride_argb,
339
- uint8_t* dst_u, uint8_t* dst_v, int width) =
340
- ARGBToUVRow_C;
341
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
342
- ARGBToYRow_C;
343
- void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
344
- uint8_t* dst_uv, int width) = MergeUVRow_C;
345
- if (!src_argb || !dst_y || !dst_uv || width <= 0 || height == 0) {
346
- return -1;
347
- }
348
- // Negative height means invert the image.
349
- if (height < 0) {
350
- height = -height;
351
- src_argb = src_argb + (height - 1) * src_stride_argb;
352
- src_stride_argb = -src_stride_argb;
353
- }
354
- #if defined(HAS_ARGBTOYROW_NEON)
355
- if (TestCpuFlag(kCpuHasNEON)) {
356
- ARGBToYRow = ARGBToYRow_Any_NEON;
357
- if (IS_ALIGNED(width, 16)) {
358
- ARGBToYRow = ARGBToYRow_NEON;
359
- }
360
- }
361
- #endif
362
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
363
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
364
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
365
- if (IS_ALIGNED(width, 16)) {
366
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
367
- }
368
- }
369
- #endif
370
- #if defined(HAS_ARGBTOUVROW_NEON)
371
- if (TestCpuFlag(kCpuHasNEON)) {
372
- ARGBToUVRow = ARGBToUVRow_Any_NEON;
373
- if (IS_ALIGNED(width, 16)) {
374
- ARGBToUVRow = ARGBToUVRow_NEON;
375
- }
376
- }
377
- #endif
378
- #if defined(HAS_ARGBTOUVROW_NEON_I8MM)
379
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
380
- ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM;
381
- if (IS_ALIGNED(width, 16)) {
382
- ARGBToUVRow = ARGBToUVRow_NEON_I8MM;
383
- }
384
- }
385
- #endif
386
- #if defined(HAS_ARGBTOUVROW_SVE2)
387
- if (TestCpuFlag(kCpuHasSVE2)) {
388
- ARGBToUVRow = ARGBToUVRow_Any_SVE2;
389
- if (IS_ALIGNED(width, 2)) {
390
- ARGBToUVRow = ARGBToUVRow_SVE2;
391
- }
392
- }
393
- #endif
394
- #if defined(HAS_ARGBTOUVROW_SME)
395
- if (TestCpuFlag(kCpuHasSME)) {
396
- ARGBToUVRow = ARGBToUVRow_Any_SME;
397
- if (IS_ALIGNED(width, 2)) {
398
- ARGBToUVRow = ARGBToUVRow_SME;
399
- }
400
- }
401
- #endif
402
- #if defined(HAS_ARGBTOYROW_SSSE3)
403
- if (TestCpuFlag(kCpuHasSSSE3)) {
404
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
405
- if (IS_ALIGNED(width, 16)) {
406
- ARGBToYRow = ARGBToYRow_SSSE3;
407
- }
408
- }
409
- #endif
410
- #if defined(HAS_ARGBTOUVROW_SSSE3)
411
- if (TestCpuFlag(kCpuHasSSSE3)) {
412
- ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
413
- if (IS_ALIGNED(width, 16)) {
414
- ARGBToUVRow = ARGBToUVRow_SSSE3;
415
- }
416
- }
417
- #endif
418
- #if defined(HAS_ARGBTOYROW_AVX2)
419
- if (TestCpuFlag(kCpuHasAVX2)) {
420
- ARGBToYRow = ARGBToYRow_Any_AVX2;
421
- if (IS_ALIGNED(width, 32)) {
422
- ARGBToYRow = ARGBToYRow_AVX2;
423
- }
424
- }
425
- #endif
426
- #if defined(HAS_ARGBTOUVROW_AVX2)
427
- if (TestCpuFlag(kCpuHasAVX2)) {
428
- ARGBToUVRow = ARGBToUVRow_Any_AVX2;
429
- if (IS_ALIGNED(width, 32)) {
430
- ARGBToUVRow = ARGBToUVRow_AVX2;
431
- }
432
- }
433
- #endif
434
- #if defined(HAS_ARGBTOYROW_LSX)
435
- if (TestCpuFlag(kCpuHasLSX)) {
436
- ARGBToYRow = ARGBToYRow_Any_LSX;
437
- if (IS_ALIGNED(width, 16)) {
438
- ARGBToYRow = ARGBToYRow_LSX;
439
- }
440
- }
441
- #endif
442
- #if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX)
443
- if (TestCpuFlag(kCpuHasLASX)) {
444
- ARGBToYRow = ARGBToYRow_Any_LASX;
445
- ARGBToUVRow = ARGBToUVRow_Any_LASX;
446
- if (IS_ALIGNED(width, 32)) {
447
- ARGBToYRow = ARGBToYRow_LASX;
448
- ARGBToUVRow = ARGBToUVRow_LASX;
449
- }
450
- }
451
- #endif
452
- #if defined(HAS_ARGBTOYROW_RVV)
453
- if (TestCpuFlag(kCpuHasRVV)) {
454
- ARGBToYRow = ARGBToYRow_RVV;
455
- }
456
- #endif
457
- #if defined(HAS_MERGEUVROW_SSE2)
458
- if (TestCpuFlag(kCpuHasSSE2)) {
459
- MergeUVRow_ = MergeUVRow_Any_SSE2;
460
- if (IS_ALIGNED(halfwidth, 16)) {
461
- MergeUVRow_ = MergeUVRow_SSE2;
462
- }
463
- }
464
- #endif
465
- #if defined(HAS_MERGEUVROW_AVX2)
466
- if (TestCpuFlag(kCpuHasAVX2)) {
467
- MergeUVRow_ = MergeUVRow_Any_AVX2;
468
- if (IS_ALIGNED(halfwidth, 16)) {
469
- MergeUVRow_ = MergeUVRow_AVX2;
470
- }
471
- }
472
- #endif
473
- #if defined(HAS_MERGEUVROW_AVX512BW)
474
- if (TestCpuFlag(kCpuHasAVX512BW)) {
475
- MergeUVRow_ = MergeUVRow_Any_AVX512BW;
476
- if (IS_ALIGNED(halfwidth, 32)) {
477
- MergeUVRow_ = MergeUVRow_AVX512BW;
478
- }
479
- }
480
- #endif
481
- #if defined(HAS_MERGEUVROW_NEON)
482
- if (TestCpuFlag(kCpuHasNEON)) {
483
- MergeUVRow_ = MergeUVRow_Any_NEON;
484
- if (IS_ALIGNED(halfwidth, 16)) {
485
- MergeUVRow_ = MergeUVRow_NEON;
486
- }
487
- }
488
- #endif
489
- #if defined(HAS_MERGEUVROW_SME)
490
- if (TestCpuFlag(kCpuHasSME)) {
491
- MergeUVRow_ = MergeUVRow_SME;
492
- }
493
- #endif
494
- #if defined(HAS_MERGEUVROW_LSX)
495
- if (TestCpuFlag(kCpuHasLSX)) {
496
- MergeUVRow_ = MergeUVRow_Any_LSX;
497
- if (IS_ALIGNED(halfwidth, 16)) {
498
- MergeUVRow_ = MergeUVRow_LSX;
499
- }
500
- }
501
- #endif
502
- #if defined(HAS_MERGEUVROW_RVV)
503
- if (TestCpuFlag(kCpuHasRVV)) {
504
- MergeUVRow_ = MergeUVRow_RVV;
505
- }
506
- #endif
507
- {
508
- // Allocate a rows of uv.
509
- align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
510
- uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
511
- if (!row_u)
512
- return 1;
513
-
514
- for (y = 0; y < height - 1; y += 2) {
515
- ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
516
- MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
517
- ARGBToYRow(src_argb, dst_y, width);
518
- ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
519
- src_argb += src_stride_argb * 2;
520
- dst_y += dst_stride_y * 2;
521
- dst_uv += dst_stride_uv;
522
- }
523
- if (height & 1) {
524
- ARGBToUVRow(src_argb, 0, row_u, row_v, width);
525
- MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
526
- ARGBToYRow(src_argb, dst_y, width);
527
- }
528
- free_aligned_buffer_64(row_u);
529
- }
530
- return 0;
531
- }
532
-
533
- // Same as NV12 but U and V swapped.
534
- LIBYUV_API
535
- int ARGBToNV21(const uint8_t* src_argb,
536
- int src_stride_argb,
537
- uint8_t* dst_y,
538
- int dst_stride_y,
539
- uint8_t* dst_vu,
540
- int dst_stride_vu,
541
- int width,
542
- int height) {
543
- int y;
544
- int halfwidth = (width + 1) >> 1;
545
- void (*ARGBToUVRow)(const uint8_t* src_argb0, int src_stride_argb,
546
- uint8_t* dst_u, uint8_t* dst_v, int width) =
547
- ARGBToUVRow_C;
548
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
549
- ARGBToYRow_C;
550
- void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
551
- uint8_t* dst_vu, int width) = MergeUVRow_C;
552
- if (!src_argb || !dst_y || !dst_vu || width <= 0 || height == 0) {
553
- return -1;
554
- }
555
- // Negative height means invert the image.
556
- if (height < 0) {
557
- height = -height;
558
- src_argb = src_argb + (height - 1) * src_stride_argb;
559
- src_stride_argb = -src_stride_argb;
560
- }
561
- #if defined(HAS_ARGBTOYROW_SSSE3)
562
- if (TestCpuFlag(kCpuHasSSSE3)) {
563
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
564
- if (IS_ALIGNED(width, 16)) {
565
- ARGBToYRow = ARGBToYRow_SSSE3;
566
- }
567
- }
568
- #endif
569
- #if defined(HAS_ARGBTOUVROW_SSSE3)
570
- if (TestCpuFlag(kCpuHasSSSE3)) {
571
- ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
572
- if (IS_ALIGNED(width, 16)) {
573
- ARGBToUVRow = ARGBToUVRow_SSSE3;
574
- }
575
- }
576
- #endif
577
- #if defined(HAS_ARGBTOYROW_AVX2)
578
- if (TestCpuFlag(kCpuHasAVX2)) {
579
- ARGBToYRow = ARGBToYRow_Any_AVX2;
580
- if (IS_ALIGNED(width, 32)) {
581
- ARGBToYRow = ARGBToYRow_AVX2;
582
- }
583
- }
584
- #endif
585
- #if defined(HAS_ARGBTOUVROW_AVX2)
586
- if (TestCpuFlag(kCpuHasAVX2)) {
587
- ARGBToUVRow = ARGBToUVRow_Any_AVX2;
588
- if (IS_ALIGNED(width, 32)) {
589
- ARGBToUVRow = ARGBToUVRow_AVX2;
590
- }
591
- }
592
- #endif
593
- #if defined(HAS_ARGBTOYROW_NEON)
594
- if (TestCpuFlag(kCpuHasNEON)) {
595
- ARGBToYRow = ARGBToYRow_Any_NEON;
596
- if (IS_ALIGNED(width, 16)) {
597
- ARGBToYRow = ARGBToYRow_NEON;
598
- }
599
- }
600
- #endif
601
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
602
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
603
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
604
- if (IS_ALIGNED(width, 16)) {
605
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
606
- }
607
- }
608
- #endif
609
- #if defined(HAS_ARGBTOUVROW_NEON)
610
- if (TestCpuFlag(kCpuHasNEON)) {
611
- ARGBToUVRow = ARGBToUVRow_Any_NEON;
612
- if (IS_ALIGNED(width, 16)) {
613
- ARGBToUVRow = ARGBToUVRow_NEON;
614
- }
615
- }
616
- #endif
617
- #if defined(HAS_ARGBTOUVROW_NEON_I8MM)
618
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
619
- ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM;
620
- if (IS_ALIGNED(width, 16)) {
621
- ARGBToUVRow = ARGBToUVRow_NEON_I8MM;
622
- }
623
- }
624
- #endif
625
- #if defined(HAS_ARGBTOUVROW_SVE2)
626
- if (TestCpuFlag(kCpuHasSVE2)) {
627
- ARGBToUVRow = ARGBToUVRow_Any_SVE2;
628
- if (IS_ALIGNED(width, 2)) {
629
- ARGBToUVRow = ARGBToUVRow_SVE2;
630
- }
631
- }
632
- #endif
633
- #if defined(HAS_ARGBTOUVROW_SME)
634
- if (TestCpuFlag(kCpuHasSME)) {
635
- ARGBToUVRow = ARGBToUVRow_Any_SME;
636
- if (IS_ALIGNED(width, 2)) {
637
- ARGBToUVRow = ARGBToUVRow_SME;
638
- }
639
- }
640
- #endif
641
- #if defined(HAS_ARGBTOYROW_LSX)
642
- if (TestCpuFlag(kCpuHasLSX)) {
643
- ARGBToYRow = ARGBToYRow_Any_LSX;
644
- if (IS_ALIGNED(width, 16)) {
645
- ARGBToYRow = ARGBToYRow_LSX;
646
- }
647
- }
648
- #endif
649
- #if defined(HAS_ARGBTOYROW_LSX) && defined(HAS_ARGBTOUVROW_LSX)
650
- if (TestCpuFlag(kCpuHasLSX)) {
651
- ARGBToYRow = ARGBToYRow_Any_LSX;
652
- ARGBToUVRow = ARGBToUVRow_Any_LSX;
653
- if (IS_ALIGNED(width, 16)) {
654
- ARGBToYRow = ARGBToYRow_LSX;
655
- ARGBToUVRow = ARGBToUVRow_LSX;
656
- }
657
- }
658
- #endif
659
- #if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX)
660
- if (TestCpuFlag(kCpuHasLASX)) {
661
- ARGBToYRow = ARGBToYRow_Any_LASX;
662
- ARGBToUVRow = ARGBToUVRow_Any_LASX;
663
- if (IS_ALIGNED(width, 32)) {
664
- ARGBToYRow = ARGBToYRow_LASX;
665
- ARGBToUVRow = ARGBToUVRow_LASX;
666
- }
667
- }
668
- #endif
669
- #if defined(HAS_ARGBTOYROW_RVV)
670
- if (TestCpuFlag(kCpuHasRVV)) {
671
- ARGBToYRow = ARGBToYRow_RVV;
672
- }
673
- #endif
674
- #if defined(HAS_MERGEUVROW_SSE2)
675
- if (TestCpuFlag(kCpuHasSSE2)) {
676
- MergeUVRow_ = MergeUVRow_Any_SSE2;
677
- if (IS_ALIGNED(halfwidth, 16)) {
678
- MergeUVRow_ = MergeUVRow_SSE2;
679
- }
680
- }
681
- #endif
682
- #if defined(HAS_MERGEUVROW_AVX2)
683
- if (TestCpuFlag(kCpuHasAVX2)) {
684
- MergeUVRow_ = MergeUVRow_Any_AVX2;
685
- if (IS_ALIGNED(halfwidth, 16)) {
686
- MergeUVRow_ = MergeUVRow_AVX2;
687
- }
688
- }
689
- #endif
690
- #if defined(HAS_MERGEUVROW_AVX512BW)
691
- if (TestCpuFlag(kCpuHasAVX512BW)) {
692
- MergeUVRow_ = MergeUVRow_Any_AVX512BW;
693
- if (IS_ALIGNED(halfwidth, 64)) {
694
- MergeUVRow_ = MergeUVRow_AVX512BW;
695
- }
696
- }
697
- #endif
698
- #if defined(HAS_MERGEUVROW_NEON)
699
- if (TestCpuFlag(kCpuHasNEON)) {
700
- MergeUVRow_ = MergeUVRow_Any_NEON;
701
- if (IS_ALIGNED(halfwidth, 16)) {
702
- MergeUVRow_ = MergeUVRow_NEON;
703
- }
704
- }
705
- #endif
706
- #if defined(HAS_MERGEUVROW_SME)
707
- if (TestCpuFlag(kCpuHasSME)) {
708
- MergeUVRow_ = MergeUVRow_SME;
709
- }
710
- #endif
711
- #if defined(HAS_MERGEUVROW_LSX)
712
- if (TestCpuFlag(kCpuHasLSX)) {
713
- MergeUVRow_ = MergeUVRow_Any_LSX;
714
- if (IS_ALIGNED(halfwidth, 16)) {
715
- MergeUVRow_ = MergeUVRow_LSX;
716
- }
717
- }
718
- #endif
719
- #if defined(HAS_MERGEUVROW_RVV)
720
- if (TestCpuFlag(kCpuHasRVV)) {
721
- MergeUVRow_ = MergeUVRow_RVV;
722
- }
723
- #endif
724
- {
725
- // Allocate a rows of uv.
726
- align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
727
- uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
728
- if (!row_u)
729
- return 1;
730
-
731
- for (y = 0; y < height - 1; y += 2) {
732
- ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width);
733
- MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
734
- ARGBToYRow(src_argb, dst_y, width);
735
- ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width);
736
- src_argb += src_stride_argb * 2;
737
- dst_y += dst_stride_y * 2;
738
- dst_vu += dst_stride_vu;
739
- }
740
- if (height & 1) {
741
- ARGBToUVRow(src_argb, 0, row_u, row_v, width);
742
- MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
743
- ARGBToYRow(src_argb, dst_y, width);
744
- }
745
- free_aligned_buffer_64(row_u);
746
- }
747
- return 0;
748
- }
749
-
750
- LIBYUV_API
751
- int ABGRToNV12(const uint8_t* src_abgr,
752
- int src_stride_abgr,
753
- uint8_t* dst_y,
754
- int dst_stride_y,
755
- uint8_t* dst_uv,
756
- int dst_stride_uv,
757
- int width,
758
- int height) {
759
- int y;
760
- int halfwidth = (width + 1) >> 1;
761
- void (*ABGRToUVRow)(const uint8_t* src_abgr0, int src_stride_abgr,
762
- uint8_t* dst_u, uint8_t* dst_v, int width) =
763
- ABGRToUVRow_C;
764
- void (*ABGRToYRow)(const uint8_t* src_abgr, uint8_t* dst_y, int width) =
765
- ABGRToYRow_C;
766
- void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
767
- uint8_t* dst_uv, int width) = MergeUVRow_C;
768
- if (!src_abgr || !dst_y || !dst_uv || width <= 0 || height == 0) {
769
- return -1;
770
- }
771
- // Negative height means invert the image.
772
- if (height < 0) {
773
- height = -height;
774
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
775
- src_stride_abgr = -src_stride_abgr;
776
- }
777
- #if defined(HAS_ABGRTOYROW_SSSE3)
778
- if (TestCpuFlag(kCpuHasSSSE3)) {
779
- ABGRToYRow = ABGRToYRow_Any_SSSE3;
780
- if (IS_ALIGNED(width, 16)) {
781
- ABGRToYRow = ABGRToYRow_SSSE3;
782
- }
783
- }
784
- #endif
785
- #if defined(HAS_ABGRTOUVROW_SSSE3)
786
- if (TestCpuFlag(kCpuHasSSSE3)) {
787
- ABGRToUVRow = ABGRToUVRow_Any_SSSE3;
788
- if (IS_ALIGNED(width, 16)) {
789
- ABGRToUVRow = ABGRToUVRow_SSSE3;
790
- }
791
- }
792
- #endif
793
- #if defined(HAS_ABGRTOYROW_AVX2)
794
- if (TestCpuFlag(kCpuHasAVX2)) {
795
- ABGRToYRow = ABGRToYRow_Any_AVX2;
796
- if (IS_ALIGNED(width, 32)) {
797
- ABGRToYRow = ABGRToYRow_AVX2;
798
- }
799
- }
800
- #endif
801
- #if defined(HAS_ABGRTOUVROW_AVX2)
802
- if (TestCpuFlag(kCpuHasAVX2)) {
803
- ABGRToUVRow = ABGRToUVRow_Any_AVX2;
804
- if (IS_ALIGNED(width, 32)) {
805
- ABGRToUVRow = ABGRToUVRow_AVX2;
806
- }
807
- }
808
- #endif
809
- #if defined(HAS_ABGRTOYROW_NEON)
810
- if (TestCpuFlag(kCpuHasNEON)) {
811
- ABGRToYRow = ABGRToYRow_Any_NEON;
812
- if (IS_ALIGNED(width, 16)) {
813
- ABGRToYRow = ABGRToYRow_NEON;
814
- }
815
- }
816
- #endif
817
- #if defined(HAS_ABGRTOYROW_NEON_DOTPROD)
818
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
819
- ABGRToYRow = ABGRToYRow_Any_NEON_DotProd;
820
- if (IS_ALIGNED(width, 16)) {
821
- ABGRToYRow = ABGRToYRow_NEON_DotProd;
822
- }
823
- }
824
- #endif
825
- #if defined(HAS_ABGRTOUVROW_NEON)
826
- if (TestCpuFlag(kCpuHasNEON)) {
827
- ABGRToUVRow = ABGRToUVRow_Any_NEON;
828
- if (IS_ALIGNED(width, 16)) {
829
- ABGRToUVRow = ABGRToUVRow_NEON;
830
- }
831
- }
832
- #endif
833
- #if defined(HAS_ABGRTOUVROW_NEON_I8MM)
834
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
835
- ABGRToUVRow = ABGRToUVRow_Any_NEON_I8MM;
836
- if (IS_ALIGNED(width, 16)) {
837
- ABGRToUVRow = ABGRToUVRow_NEON_I8MM;
838
- }
839
- }
840
- #endif
841
- #if defined(HAS_ABGRTOUVROW_SVE2)
842
- if (TestCpuFlag(kCpuHasSVE2)) {
843
- ABGRToUVRow = ABGRToUVRow_Any_SVE2;
844
- if (IS_ALIGNED(width, 2)) {
845
- ABGRToUVRow = ABGRToUVRow_SVE2;
846
- }
847
- }
848
- #endif
849
- #if defined(HAS_ABGRTOUVROW_SME)
850
- if (TestCpuFlag(kCpuHasSME)) {
851
- ABGRToUVRow = ABGRToUVRow_Any_SME;
852
- if (IS_ALIGNED(width, 2)) {
853
- ABGRToUVRow = ABGRToUVRow_SME;
854
- }
855
- }
856
- #endif
857
- #if defined(HAS_ABGRTOYROW_LSX)
858
- if (TestCpuFlag(kCpuHasLSX)) {
859
- ABGRToYRow = ABGRToYRow_Any_LSX;
860
- if (IS_ALIGNED(width, 16)) {
861
- ABGRToYRow = ABGRToYRow_LSX;
862
- }
863
- }
864
- #endif
865
- #if defined(HAS_ABGRTOYROW_LASX)
866
- if (TestCpuFlag(kCpuHasLASX)) {
867
- ABGRToYRow = ABGRToYRow_Any_LASX;
868
- if (IS_ALIGNED(width, 32)) {
869
- ABGRToYRow = ABGRToYRow_LASX;
870
- }
871
- }
872
- #endif
873
- #if defined(HAS_ABGRTOYROW_RVV)
874
- if (TestCpuFlag(kCpuHasRVV)) {
875
- ABGRToYRow = ABGRToYRow_RVV;
876
- }
877
- #endif
878
- #if defined(HAS_MERGEUVROW_SSE2)
879
- if (TestCpuFlag(kCpuHasSSE2)) {
880
- MergeUVRow_ = MergeUVRow_Any_SSE2;
881
- if (IS_ALIGNED(halfwidth, 16)) {
882
- MergeUVRow_ = MergeUVRow_SSE2;
883
- }
884
- }
885
- #endif
886
- #if defined(HAS_MERGEUVROW_AVX2)
887
- if (TestCpuFlag(kCpuHasAVX2)) {
888
- MergeUVRow_ = MergeUVRow_Any_AVX2;
889
- if (IS_ALIGNED(halfwidth, 16)) {
890
- MergeUVRow_ = MergeUVRow_AVX2;
891
- }
892
- }
893
- #endif
894
- #if defined(HAS_MERGEUVROW_AVX512BW)
895
- if (TestCpuFlag(kCpuHasAVX512BW)) {
896
- MergeUVRow_ = MergeUVRow_Any_AVX512BW;
897
- if (IS_ALIGNED(halfwidth, 64)) {
898
- MergeUVRow_ = MergeUVRow_AVX512BW;
899
- }
900
- }
901
- #endif
902
- #if defined(HAS_MERGEUVROW_NEON)
903
- if (TestCpuFlag(kCpuHasNEON)) {
904
- MergeUVRow_ = MergeUVRow_Any_NEON;
905
- if (IS_ALIGNED(halfwidth, 16)) {
906
- MergeUVRow_ = MergeUVRow_NEON;
907
- }
908
- }
909
- #endif
910
- #if defined(HAS_MERGEUVROW_SME)
911
- if (TestCpuFlag(kCpuHasSME)) {
912
- MergeUVRow_ = MergeUVRow_SME;
913
- }
914
- #endif
915
- #if defined(HAS_MERGEUVROW_LSX)
916
- if (TestCpuFlag(kCpuHasLSX)) {
917
- MergeUVRow_ = MergeUVRow_Any_LSX;
918
- if (IS_ALIGNED(halfwidth, 16)) {
919
- MergeUVRow_ = MergeUVRow_LSX;
920
- }
921
- }
922
- #endif
923
- #if defined(HAS_MERGEUVROW_RVV)
924
- if (TestCpuFlag(kCpuHasRVV)) {
925
- MergeUVRow_ = MergeUVRow_RVV;
926
- }
927
- #endif
928
- {
929
- // Allocate a rows of uv.
930
- align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
931
- uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
932
- if (!row_u)
933
- return 1;
934
-
935
- for (y = 0; y < height - 1; y += 2) {
936
- ABGRToUVRow(src_abgr, src_stride_abgr, row_u, row_v, width);
937
- MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
938
- ABGRToYRow(src_abgr, dst_y, width);
939
- ABGRToYRow(src_abgr + src_stride_abgr, dst_y + dst_stride_y, width);
940
- src_abgr += src_stride_abgr * 2;
941
- dst_y += dst_stride_y * 2;
942
- dst_uv += dst_stride_uv;
943
- }
944
- if (height & 1) {
945
- ABGRToUVRow(src_abgr, 0, row_u, row_v, width);
946
- MergeUVRow_(row_u, row_v, dst_uv, halfwidth);
947
- ABGRToYRow(src_abgr, dst_y, width);
948
- }
949
- free_aligned_buffer_64(row_u);
950
- }
951
- return 0;
952
- }
953
-
954
- // Same as NV12 but U and V swapped.
955
- LIBYUV_API
956
- int ABGRToNV21(const uint8_t* src_abgr,
957
- int src_stride_abgr,
958
- uint8_t* dst_y,
959
- int dst_stride_y,
960
- uint8_t* dst_vu,
961
- int dst_stride_vu,
962
- int width,
963
- int height) {
964
- int y;
965
- int halfwidth = (width + 1) >> 1;
966
- void (*ABGRToUVRow)(const uint8_t* src_abgr0, int src_stride_abgr,
967
- uint8_t* dst_u, uint8_t* dst_v, int width) =
968
- ABGRToUVRow_C;
969
- void (*ABGRToYRow)(const uint8_t* src_abgr, uint8_t* dst_y, int width) =
970
- ABGRToYRow_C;
971
- void (*MergeUVRow_)(const uint8_t* src_u, const uint8_t* src_v,
972
- uint8_t* dst_vu, int width) = MergeUVRow_C;
973
- if (!src_abgr || !dst_y || !dst_vu || width <= 0 || height == 0) {
974
- return -1;
975
- }
976
- // Negative height means invert the image.
977
- if (height < 0) {
978
- height = -height;
979
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
980
- src_stride_abgr = -src_stride_abgr;
981
- }
982
- #if defined(HAS_ABGRTOYROW_SSSE3)
983
- if (TestCpuFlag(kCpuHasSSSE3)) {
984
- ABGRToYRow = ABGRToYRow_Any_SSSE3;
985
- if (IS_ALIGNED(width, 16)) {
986
- ABGRToYRow = ABGRToYRow_SSSE3;
987
- }
988
- }
989
- #endif
990
- #if defined(HAS_ABGRTOUVROW_SSSE3)
991
- if (TestCpuFlag(kCpuHasSSSE3)) {
992
- ABGRToUVRow = ABGRToUVRow_Any_SSSE3;
993
- if (IS_ALIGNED(width, 16)) {
994
- ABGRToUVRow = ABGRToUVRow_SSSE3;
995
- }
996
- }
997
- #endif
998
- #if defined(HAS_ABGRTOYROW_AVX2)
999
- if (TestCpuFlag(kCpuHasAVX2)) {
1000
- ABGRToYRow = ABGRToYRow_Any_AVX2;
1001
- if (IS_ALIGNED(width, 32)) {
1002
- ABGRToYRow = ABGRToYRow_AVX2;
1003
- }
1004
- }
1005
- #endif
1006
- #if defined(HAS_ABGRTOUVROW_AVX2)
1007
- if (TestCpuFlag(kCpuHasAVX2)) {
1008
- ABGRToUVRow = ABGRToUVRow_Any_AVX2;
1009
- if (IS_ALIGNED(width, 32)) {
1010
- ABGRToUVRow = ABGRToUVRow_AVX2;
1011
- }
1012
- }
1013
- #endif
1014
- #if defined(HAS_ABGRTOYROW_NEON)
1015
- if (TestCpuFlag(kCpuHasNEON)) {
1016
- ABGRToYRow = ABGRToYRow_Any_NEON;
1017
- if (IS_ALIGNED(width, 16)) {
1018
- ABGRToYRow = ABGRToYRow_NEON;
1019
- }
1020
- }
1021
- #endif
1022
- #if defined(HAS_ABGRTOYROW_NEON_DOTPROD)
1023
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
1024
- ABGRToYRow = ABGRToYRow_Any_NEON_DotProd;
1025
- if (IS_ALIGNED(width, 16)) {
1026
- ABGRToYRow = ABGRToYRow_NEON_DotProd;
1027
- }
1028
- }
1029
- #endif
1030
- #if defined(HAS_ABGRTOUVROW_NEON)
1031
- if (TestCpuFlag(kCpuHasNEON)) {
1032
- ABGRToUVRow = ABGRToUVRow_Any_NEON;
1033
- if (IS_ALIGNED(width, 16)) {
1034
- ABGRToUVRow = ABGRToUVRow_NEON;
1035
- }
1036
- }
1037
- #endif
1038
- #if defined(HAS_ABGRTOUVROW_NEON_I8MM)
1039
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
1040
- ABGRToUVRow = ABGRToUVRow_Any_NEON_I8MM;
1041
- if (IS_ALIGNED(width, 16)) {
1042
- ABGRToUVRow = ABGRToUVRow_NEON_I8MM;
1043
- }
1044
- }
1045
- #endif
1046
- #if defined(HAS_ABGRTOUVROW_SVE2)
1047
- if (TestCpuFlag(kCpuHasSVE2)) {
1048
- ABGRToUVRow = ABGRToUVRow_Any_SVE2;
1049
- if (IS_ALIGNED(width, 2)) {
1050
- ABGRToUVRow = ABGRToUVRow_SVE2;
1051
- }
1052
- }
1053
- #endif
1054
- #if defined(HAS_ABGRTOUVROW_SME)
1055
- if (TestCpuFlag(kCpuHasSME)) {
1056
- ABGRToUVRow = ABGRToUVRow_Any_SME;
1057
- if (IS_ALIGNED(width, 2)) {
1058
- ABGRToUVRow = ABGRToUVRow_SME;
1059
- }
1060
- }
1061
- #endif
1062
- #if defined(HAS_ABGRTOYROW_LSX)
1063
- if (TestCpuFlag(kCpuHasLSX)) {
1064
- ABGRToYRow = ABGRToYRow_Any_LSX;
1065
- if (IS_ALIGNED(width, 16)) {
1066
- ABGRToYRow = ABGRToYRow_LSX;
1067
- }
1068
- }
1069
- #endif
1070
- #if defined(HAS_ABGRTOYROW_LASX)
1071
- if (TestCpuFlag(kCpuHasLASX)) {
1072
- ABGRToYRow = ABGRToYRow_Any_LASX;
1073
- if (IS_ALIGNED(width, 32)) {
1074
- ABGRToYRow = ABGRToYRow_LASX;
1075
- }
1076
- }
1077
- #endif
1078
- #if defined(HAS_ABGRTOYROW_RVV)
1079
- if (TestCpuFlag(kCpuHasRVV)) {
1080
- ABGRToYRow = ABGRToYRow_RVV;
1081
- }
1082
- #endif
1083
- #if defined(HAS_MERGEUVROW_SSE2)
1084
- if (TestCpuFlag(kCpuHasSSE2)) {
1085
- MergeUVRow_ = MergeUVRow_Any_SSE2;
1086
- if (IS_ALIGNED(halfwidth, 16)) {
1087
- MergeUVRow_ = MergeUVRow_SSE2;
1088
- }
1089
- }
1090
- #endif
1091
- #if defined(HAS_MERGEUVROW_AVX2)
1092
- if (TestCpuFlag(kCpuHasAVX2)) {
1093
- MergeUVRow_ = MergeUVRow_Any_AVX2;
1094
- if (IS_ALIGNED(halfwidth, 16)) {
1095
- MergeUVRow_ = MergeUVRow_AVX2;
1096
- }
1097
- }
1098
- #endif
1099
- #if defined(HAS_MERGEUVROW_AVX512BW)
1100
- if (TestCpuFlag(kCpuHasAVX512BW)) {
1101
- MergeUVRow_ = MergeUVRow_Any_AVX512BW;
1102
- if (IS_ALIGNED(halfwidth, 64)) {
1103
- MergeUVRow_ = MergeUVRow_AVX512BW;
1104
- }
1105
- }
1106
- #endif
1107
- #if defined(HAS_MERGEUVROW_NEON)
1108
- if (TestCpuFlag(kCpuHasNEON)) {
1109
- MergeUVRow_ = MergeUVRow_Any_NEON;
1110
- if (IS_ALIGNED(halfwidth, 16)) {
1111
- MergeUVRow_ = MergeUVRow_NEON;
1112
- }
1113
- }
1114
- #endif
1115
- #if defined(HAS_MERGEUVROW_SME)
1116
- if (TestCpuFlag(kCpuHasSME)) {
1117
- MergeUVRow_ = MergeUVRow_SME;
1118
- }
1119
- #endif
1120
- #if defined(HAS_MERGEUVROW_LSX)
1121
- if (TestCpuFlag(kCpuHasLSX)) {
1122
- MergeUVRow_ = MergeUVRow_Any_LSX;
1123
- if (IS_ALIGNED(halfwidth, 16)) {
1124
- MergeUVRow_ = MergeUVRow_LSX;
1125
- }
1126
- }
1127
- #endif
1128
- #if defined(HAS_MERGEUVROW_RVV)
1129
- if (TestCpuFlag(kCpuHasRVV)) {
1130
- MergeUVRow_ = MergeUVRow_RVV;
1131
- }
1132
- #endif
1133
- {
1134
- // Allocate a rows of uv.
1135
- align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2);
1136
- uint8_t* row_v = row_u + ((halfwidth + 31) & ~31);
1137
- if (!row_u)
1138
- return 1;
1139
-
1140
- for (y = 0; y < height - 1; y += 2) {
1141
- ABGRToUVRow(src_abgr, src_stride_abgr, row_u, row_v, width);
1142
- MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
1143
- ABGRToYRow(src_abgr, dst_y, width);
1144
- ABGRToYRow(src_abgr + src_stride_abgr, dst_y + dst_stride_y, width);
1145
- src_abgr += src_stride_abgr * 2;
1146
- dst_y += dst_stride_y * 2;
1147
- dst_vu += dst_stride_vu;
1148
- }
1149
- if (height & 1) {
1150
- ABGRToUVRow(src_abgr, 0, row_u, row_v, width);
1151
- MergeUVRow_(row_v, row_u, dst_vu, halfwidth);
1152
- ABGRToYRow(src_abgr, dst_y, width);
1153
- }
1154
- free_aligned_buffer_64(row_u);
1155
- }
1156
- return 0;
1157
- }
1158
-
1159
- // Convert ARGB to YUY2.
1160
- LIBYUV_API
1161
- int ARGBToYUY2(const uint8_t* src_argb,
1162
- int src_stride_argb,
1163
- uint8_t* dst_yuy2,
1164
- int dst_stride_yuy2,
1165
- int width,
1166
- int height) {
1167
- int y;
1168
- void (*ARGBToUVRow)(const uint8_t* src_argb, int src_stride_argb,
1169
- uint8_t* dst_u, uint8_t* dst_v, int width) =
1170
- ARGBToUVRow_C;
1171
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
1172
- ARGBToYRow_C;
1173
- void (*I422ToYUY2Row)(const uint8_t* src_y, const uint8_t* src_u,
1174
- const uint8_t* src_v, uint8_t* dst_yuy2, int width) =
1175
- I422ToYUY2Row_C;
1176
-
1177
- if (!src_argb || !dst_yuy2 || width <= 0 || height == 0) {
1178
- return -1;
1179
- }
1180
- // Negative height means invert the image.
1181
- if (height < 0) {
1182
- height = -height;
1183
- dst_yuy2 = dst_yuy2 + (height - 1) * dst_stride_yuy2;
1184
- dst_stride_yuy2 = -dst_stride_yuy2;
1185
- }
1186
- // Coalesce rows.
1187
- if (src_stride_argb == width * 4 && dst_stride_yuy2 == width * 2) {
1188
- width *= height;
1189
- height = 1;
1190
- src_stride_argb = dst_stride_yuy2 = 0;
1191
- }
1192
- #if defined(HAS_ARGBTOYROW_SSSE3)
1193
- if (TestCpuFlag(kCpuHasSSSE3)) {
1194
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
1195
- if (IS_ALIGNED(width, 16)) {
1196
- ARGBToYRow = ARGBToYRow_SSSE3;
1197
- }
1198
- }
1199
- #endif
1200
- #if defined(HAS_ARGBTOUVROW_SSSE3)
1201
- if (TestCpuFlag(kCpuHasSSSE3)) {
1202
- ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
1203
- if (IS_ALIGNED(width, 16)) {
1204
- ARGBToUVRow = ARGBToUVRow_SSSE3;
1205
- }
1206
- }
1207
- #endif
1208
- #if defined(HAS_ARGBTOYROW_AVX2)
1209
- if (TestCpuFlag(kCpuHasAVX2)) {
1210
- ARGBToYRow = ARGBToYRow_Any_AVX2;
1211
- if (IS_ALIGNED(width, 32)) {
1212
- ARGBToYRow = ARGBToYRow_AVX2;
1213
- }
1214
- }
1215
- #endif
1216
- #if defined(HAS_ARGBTOUVROW_AVX2)
1217
- if (TestCpuFlag(kCpuHasAVX2)) {
1218
- ARGBToUVRow = ARGBToUVRow_Any_AVX2;
1219
- if (IS_ALIGNED(width, 32)) {
1220
- ARGBToUVRow = ARGBToUVRow_AVX2;
1221
- }
1222
- }
1223
- #endif
1224
- #if defined(HAS_ARGBTOYROW_NEON)
1225
- if (TestCpuFlag(kCpuHasNEON)) {
1226
- ARGBToYRow = ARGBToYRow_Any_NEON;
1227
- if (IS_ALIGNED(width, 16)) {
1228
- ARGBToYRow = ARGBToYRow_NEON;
1229
- }
1230
- }
1231
- #endif
1232
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
1233
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
1234
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
1235
- if (IS_ALIGNED(width, 16)) {
1236
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
1237
- }
1238
- }
1239
- #endif
1240
- #if defined(HAS_ARGBTOUVROW_NEON)
1241
- if (TestCpuFlag(kCpuHasNEON)) {
1242
- ARGBToUVRow = ARGBToUVRow_Any_NEON;
1243
- if (IS_ALIGNED(width, 16)) {
1244
- ARGBToUVRow = ARGBToUVRow_NEON;
1245
- }
1246
- }
1247
- #endif
1248
- #if defined(HAS_ARGBTOUVROW_NEON_I8MM)
1249
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
1250
- ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM;
1251
- if (IS_ALIGNED(width, 16)) {
1252
- ARGBToUVRow = ARGBToUVRow_NEON_I8MM;
1253
- }
1254
- }
1255
- #endif
1256
- #if defined(HAS_ARGBTOUVROW_SVE2)
1257
- if (TestCpuFlag(kCpuHasSVE2)) {
1258
- ARGBToUVRow = ARGBToUVRow_Any_SVE2;
1259
- if (IS_ALIGNED(width, 2)) {
1260
- ARGBToUVRow = ARGBToUVRow_SVE2;
1261
- }
1262
- }
1263
- #endif
1264
- #if defined(HAS_ARGBTOUVROW_SME)
1265
- if (TestCpuFlag(kCpuHasSME)) {
1266
- ARGBToUVRow = ARGBToUVRow_Any_SME;
1267
- if (IS_ALIGNED(width, 2)) {
1268
- ARGBToUVRow = ARGBToUVRow_SME;
1269
- }
1270
- }
1271
- #endif
1272
- #if defined(HAS_ARGBTOYROW_LSX)
1273
- if (TestCpuFlag(kCpuHasLSX)) {
1274
- ARGBToYRow = ARGBToYRow_Any_LSX;
1275
- if (IS_ALIGNED(width, 16)) {
1276
- ARGBToYRow = ARGBToYRow_LSX;
1277
- }
1278
- }
1279
- #endif
1280
- #if defined(HAS_ARGBTOYROW_LSX) && defined(HAS_ARGBTOUVROW_LSX)
1281
- if (TestCpuFlag(kCpuHasLSX)) {
1282
- ARGBToYRow = ARGBToYRow_Any_LSX;
1283
- ARGBToUVRow = ARGBToUVRow_Any_LSX;
1284
- if (IS_ALIGNED(width, 16)) {
1285
- ARGBToYRow = ARGBToYRow_LSX;
1286
- ARGBToUVRow = ARGBToUVRow_LSX;
1287
- }
1288
- }
1289
- #endif
1290
- #if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX)
1291
- if (TestCpuFlag(kCpuHasLASX)) {
1292
- ARGBToYRow = ARGBToYRow_Any_LASX;
1293
- ARGBToUVRow = ARGBToUVRow_Any_LASX;
1294
- if (IS_ALIGNED(width, 32)) {
1295
- ARGBToYRow = ARGBToYRow_LASX;
1296
- ARGBToUVRow = ARGBToUVRow_LASX;
1297
- }
1298
- }
1299
- #endif
1300
- #if defined(HAS_ARGBTOYROW_RVV)
1301
- if (TestCpuFlag(kCpuHasRVV)) {
1302
- ARGBToYRow = ARGBToYRow_RVV;
1303
- }
1304
- #endif
1305
- #if defined(HAS_I422TOYUY2ROW_SSE2)
1306
- if (TestCpuFlag(kCpuHasSSE2)) {
1307
- I422ToYUY2Row = I422ToYUY2Row_Any_SSE2;
1308
- if (IS_ALIGNED(width, 16)) {
1309
- I422ToYUY2Row = I422ToYUY2Row_SSE2;
1310
- }
1311
- }
1312
- #endif
1313
- #if defined(HAS_I422TOYUY2ROW_AVX2)
1314
- if (TestCpuFlag(kCpuHasAVX2)) {
1315
- I422ToYUY2Row = I422ToYUY2Row_Any_AVX2;
1316
- if (IS_ALIGNED(width, 32)) {
1317
- I422ToYUY2Row = I422ToYUY2Row_AVX2;
1318
- }
1319
- }
1320
- #endif
1321
- #if defined(HAS_I422TOYUY2ROW_NEON)
1322
- if (TestCpuFlag(kCpuHasNEON)) {
1323
- I422ToYUY2Row = I422ToYUY2Row_Any_NEON;
1324
- if (IS_ALIGNED(width, 16)) {
1325
- I422ToYUY2Row = I422ToYUY2Row_NEON;
1326
- }
1327
- }
1328
- #endif
1329
- #if defined(HAS_I422TOYUY2ROW_LSX)
1330
- if (TestCpuFlag(kCpuHasLSX)) {
1331
- I422ToYUY2Row = I422ToYUY2Row_Any_LSX;
1332
- if (IS_ALIGNED(width, 16)) {
1333
- I422ToYUY2Row = I422ToYUY2Row_LSX;
1334
- }
1335
- }
1336
- #endif
1337
- #if defined(HAS_I422TOYUY2ROW_LASX)
1338
- if (TestCpuFlag(kCpuHasLASX)) {
1339
- I422ToYUY2Row = I422ToYUY2Row_Any_LASX;
1340
- if (IS_ALIGNED(width, 32)) {
1341
- I422ToYUY2Row = I422ToYUY2Row_LASX;
1342
- }
1343
- }
1344
- #endif
1345
-
1346
- {
1347
- // Allocate a rows of yuv.
1348
- align_buffer_64(row_y, ((width + 63) & ~63) * 2);
1349
- uint8_t* row_u = row_y + ((width + 63) & ~63);
1350
- uint8_t* row_v = row_u + ((width + 63) & ~63) / 2;
1351
- if (!row_y)
1352
- return 1;
1353
-
1354
- for (y = 0; y < height; ++y) {
1355
- ARGBToUVRow(src_argb, 0, row_u, row_v, width);
1356
- ARGBToYRow(src_argb, row_y, width);
1357
- I422ToYUY2Row(row_y, row_u, row_v, dst_yuy2, width);
1358
- src_argb += src_stride_argb;
1359
- dst_yuy2 += dst_stride_yuy2;
1360
- }
1361
-
1362
- free_aligned_buffer_64(row_y);
1363
- }
1364
- return 0;
1365
- }
1366
-
1367
- // Convert ARGB to UYVY.
1368
- LIBYUV_API
1369
- int ARGBToUYVY(const uint8_t* src_argb,
1370
- int src_stride_argb,
1371
- uint8_t* dst_uyvy,
1372
- int dst_stride_uyvy,
1373
- int width,
1374
- int height) {
1375
- int y;
1376
- void (*ARGBToUVRow)(const uint8_t* src_argb, int src_stride_argb,
1377
- uint8_t* dst_u, uint8_t* dst_v, int width) =
1378
- ARGBToUVRow_C;
1379
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
1380
- ARGBToYRow_C;
1381
- void (*I422ToUYVYRow)(const uint8_t* src_y, const uint8_t* src_u,
1382
- const uint8_t* src_v, uint8_t* dst_uyvy, int width) =
1383
- I422ToUYVYRow_C;
1384
-
1385
- if (!src_argb || !dst_uyvy || width <= 0 || height == 0) {
1386
- return -1;
1387
- }
1388
- // Negative height means invert the image.
1389
- if (height < 0) {
1390
- height = -height;
1391
- dst_uyvy = dst_uyvy + (height - 1) * dst_stride_uyvy;
1392
- dst_stride_uyvy = -dst_stride_uyvy;
1393
- }
1394
- // Coalesce rows.
1395
- if (src_stride_argb == width * 4 && dst_stride_uyvy == width * 2) {
1396
- width *= height;
1397
- height = 1;
1398
- src_stride_argb = dst_stride_uyvy = 0;
1399
- }
1400
- #if defined(HAS_ARGBTOYROW_SSSE3)
1401
- if (TestCpuFlag(kCpuHasSSSE3)) {
1402
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
1403
- if (IS_ALIGNED(width, 16)) {
1404
- ARGBToYRow = ARGBToYRow_SSSE3;
1405
- }
1406
- }
1407
- #endif
1408
- #if defined(HAS_ARGBTOUVROW_SSSE3)
1409
- if (TestCpuFlag(kCpuHasSSSE3)) {
1410
- ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
1411
- if (IS_ALIGNED(width, 16)) {
1412
- ARGBToUVRow = ARGBToUVRow_SSSE3;
1413
- }
1414
- }
1415
- #endif
1416
- #if defined(HAS_ARGBTOYROW_AVX2)
1417
- if (TestCpuFlag(kCpuHasAVX2)) {
1418
- ARGBToYRow = ARGBToYRow_Any_AVX2;
1419
- if (IS_ALIGNED(width, 32)) {
1420
- ARGBToYRow = ARGBToYRow_AVX2;
1421
- }
1422
- }
1423
- #endif
1424
- #if defined(HAS_ARGBTOUVROW_AVX2)
1425
- if (TestCpuFlag(kCpuHasAVX2)) {
1426
- ARGBToUVRow = ARGBToUVRow_Any_AVX2;
1427
- if (IS_ALIGNED(width, 32)) {
1428
- ARGBToUVRow = ARGBToUVRow_AVX2;
1429
- }
1430
- }
1431
- #endif
1432
- #if defined(HAS_ARGBTOYROW_NEON)
1433
- if (TestCpuFlag(kCpuHasNEON)) {
1434
- ARGBToYRow = ARGBToYRow_Any_NEON;
1435
- if (IS_ALIGNED(width, 16)) {
1436
- ARGBToYRow = ARGBToYRow_NEON;
1437
- }
1438
- }
1439
- #endif
1440
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
1441
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
1442
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
1443
- if (IS_ALIGNED(width, 16)) {
1444
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
1445
- }
1446
- }
1447
- #endif
1448
- #if defined(HAS_ARGBTOUVROW_NEON)
1449
- if (TestCpuFlag(kCpuHasNEON)) {
1450
- ARGBToUVRow = ARGBToUVRow_Any_NEON;
1451
- if (IS_ALIGNED(width, 16)) {
1452
- ARGBToUVRow = ARGBToUVRow_NEON;
1453
- }
1454
- }
1455
- #endif
1456
- #if defined(HAS_ARGBTOUVROW_NEON_I8MM)
1457
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
1458
- ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM;
1459
- if (IS_ALIGNED(width, 16)) {
1460
- ARGBToUVRow = ARGBToUVRow_NEON_I8MM;
1461
- }
1462
- }
1463
- #endif
1464
- #if defined(HAS_ARGBTOUVROW_SVE2)
1465
- if (TestCpuFlag(kCpuHasSVE2)) {
1466
- ARGBToUVRow = ARGBToUVRow_Any_SVE2;
1467
- if (IS_ALIGNED(width, 2)) {
1468
- ARGBToUVRow = ARGBToUVRow_SVE2;
1469
- }
1470
- }
1471
- #endif
1472
- #if defined(HAS_ARGBTOUVROW_SME)
1473
- if (TestCpuFlag(kCpuHasSME)) {
1474
- ARGBToUVRow = ARGBToUVRow_Any_SME;
1475
- if (IS_ALIGNED(width, 2)) {
1476
- ARGBToUVRow = ARGBToUVRow_SME;
1477
- }
1478
- }
1479
- #endif
1480
- #if defined(HAS_ARGBTOYROW_LSX)
1481
- if (TestCpuFlag(kCpuHasLSX)) {
1482
- ARGBToYRow = ARGBToYRow_Any_LSX;
1483
- if (IS_ALIGNED(width, 16)) {
1484
- ARGBToYRow = ARGBToYRow_LSX;
1485
- }
1486
- }
1487
- #endif
1488
- #if defined(HAS_ARGBTOYROW_LSX) && defined(HAS_ARGBTOUVROW_LSX)
1489
- if (TestCpuFlag(kCpuHasLSX)) {
1490
- ARGBToYRow = ARGBToYRow_Any_LSX;
1491
- ARGBToUVRow = ARGBToUVRow_Any_LSX;
1492
- if (IS_ALIGNED(width, 16)) {
1493
- ARGBToYRow = ARGBToYRow_LSX;
1494
- ARGBToUVRow = ARGBToUVRow_LSX;
1495
- }
1496
- }
1497
- #endif
1498
- #if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX)
1499
- if (TestCpuFlag(kCpuHasLASX)) {
1500
- ARGBToYRow = ARGBToYRow_Any_LASX;
1501
- ARGBToUVRow = ARGBToUVRow_Any_LASX;
1502
- if (IS_ALIGNED(width, 32)) {
1503
- ARGBToYRow = ARGBToYRow_LASX;
1504
- ARGBToUVRow = ARGBToUVRow_LASX;
1505
- }
1506
- }
1507
- #endif
1508
- #if defined(HAS_ARGBTOYROW_RVV)
1509
- if (TestCpuFlag(kCpuHasRVV)) {
1510
- ARGBToYRow = ARGBToYRow_RVV;
1511
- }
1512
- #endif
1513
- #if defined(HAS_I422TOUYVYROW_SSE2)
1514
- if (TestCpuFlag(kCpuHasSSE2)) {
1515
- I422ToUYVYRow = I422ToUYVYRow_Any_SSE2;
1516
- if (IS_ALIGNED(width, 16)) {
1517
- I422ToUYVYRow = I422ToUYVYRow_SSE2;
1518
- }
1519
- }
1520
- #endif
1521
- #if defined(HAS_I422TOUYVYROW_AVX2)
1522
- if (TestCpuFlag(kCpuHasAVX2)) {
1523
- I422ToUYVYRow = I422ToUYVYRow_Any_AVX2;
1524
- if (IS_ALIGNED(width, 32)) {
1525
- I422ToUYVYRow = I422ToUYVYRow_AVX2;
1526
- }
1527
- }
1528
- #endif
1529
- #if defined(HAS_I422TOUYVYROW_NEON)
1530
- if (TestCpuFlag(kCpuHasNEON)) {
1531
- I422ToUYVYRow = I422ToUYVYRow_Any_NEON;
1532
- if (IS_ALIGNED(width, 16)) {
1533
- I422ToUYVYRow = I422ToUYVYRow_NEON;
1534
- }
1535
- }
1536
- #endif
1537
- #if defined(HAS_I422TOUYVYROW_LSX)
1538
- if (TestCpuFlag(kCpuHasLSX)) {
1539
- I422ToUYVYRow = I422ToUYVYRow_Any_LSX;
1540
- if (IS_ALIGNED(width, 16)) {
1541
- I422ToUYVYRow = I422ToUYVYRow_LSX;
1542
- }
1543
- }
1544
- #endif
1545
- #if defined(HAS_I422TOUYVYROW_LASX)
1546
- if (TestCpuFlag(kCpuHasLASX)) {
1547
- I422ToUYVYRow = I422ToUYVYRow_Any_LASX;
1548
- if (IS_ALIGNED(width, 32)) {
1549
- I422ToUYVYRow = I422ToUYVYRow_LASX;
1550
- }
1551
- }
1552
- #endif
1553
-
1554
- {
1555
- // Allocate a rows of yuv.
1556
- align_buffer_64(row_y, ((width + 63) & ~63) * 2);
1557
- uint8_t* row_u = row_y + ((width + 63) & ~63);
1558
- uint8_t* row_v = row_u + ((width + 63) & ~63) / 2;
1559
- if (!row_y)
1560
- return 1;
1561
-
1562
- for (y = 0; y < height; ++y) {
1563
- ARGBToUVRow(src_argb, 0, row_u, row_v, width);
1564
- ARGBToYRow(src_argb, row_y, width);
1565
- I422ToUYVYRow(row_y, row_u, row_v, dst_uyvy, width);
1566
- src_argb += src_stride_argb;
1567
- dst_uyvy += dst_stride_uyvy;
1568
- }
1569
-
1570
- free_aligned_buffer_64(row_y);
1571
- }
1572
- return 0;
1573
- }
1574
-
1575
- // Convert ARGB to I400.
1576
- LIBYUV_API
1577
- int ARGBToI400(const uint8_t* src_argb,
1578
- int src_stride_argb,
1579
- uint8_t* dst_y,
1580
- int dst_stride_y,
1581
- int width,
1582
- int height) {
1583
- int y;
1584
- void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
1585
- ARGBToYRow_C;
1586
- if (!src_argb || !dst_y || width <= 0 || height == 0) {
1587
- return -1;
1588
- }
1589
- if (height < 0) {
1590
- height = -height;
1591
- src_argb = src_argb + (height - 1) * src_stride_argb;
1592
- src_stride_argb = -src_stride_argb;
1593
- }
1594
- // Coalesce rows.
1595
- if (src_stride_argb == width * 4 && dst_stride_y == width) {
1596
- width *= height;
1597
- height = 1;
1598
- src_stride_argb = dst_stride_y = 0;
1599
- }
1600
- #if defined(HAS_ARGBTOYROW_SSSE3)
1601
- if (TestCpuFlag(kCpuHasSSSE3)) {
1602
- ARGBToYRow = ARGBToYRow_Any_SSSE3;
1603
- if (IS_ALIGNED(width, 16)) {
1604
- ARGBToYRow = ARGBToYRow_SSSE3;
1605
- }
1606
- }
1607
- #endif
1608
- #if defined(HAS_ARGBTOYROW_AVX2)
1609
- if (TestCpuFlag(kCpuHasAVX2)) {
1610
- ARGBToYRow = ARGBToYRow_Any_AVX2;
1611
- if (IS_ALIGNED(width, 32)) {
1612
- ARGBToYRow = ARGBToYRow_AVX2;
1613
- }
1614
- }
1615
- #endif
1616
- #if defined(HAS_ARGBTOYROW_NEON)
1617
- if (TestCpuFlag(kCpuHasNEON)) {
1618
- ARGBToYRow = ARGBToYRow_Any_NEON;
1619
- if (IS_ALIGNED(width, 16)) {
1620
- ARGBToYRow = ARGBToYRow_NEON;
1621
- }
1622
- }
1623
- #endif
1624
- #if defined(HAS_ARGBTOYROW_NEON_DOTPROD)
1625
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
1626
- ARGBToYRow = ARGBToYRow_Any_NEON_DotProd;
1627
- if (IS_ALIGNED(width, 16)) {
1628
- ARGBToYRow = ARGBToYRow_NEON_DotProd;
1629
- }
1630
- }
1631
- #endif
1632
- #if defined(HAS_ARGBTOYROW_LSX)
1633
- if (TestCpuFlag(kCpuHasLSX)) {
1634
- ARGBToYRow = ARGBToYRow_Any_LSX;
1635
- if (IS_ALIGNED(width, 16)) {
1636
- ARGBToYRow = ARGBToYRow_LSX;
1637
- }
1638
- }
1639
- #endif
1640
- #if defined(HAS_ARGBTOYROW_LASX)
1641
- if (TestCpuFlag(kCpuHasLASX)) {
1642
- ARGBToYRow = ARGBToYRow_Any_LASX;
1643
- if (IS_ALIGNED(width, 32)) {
1644
- ARGBToYRow = ARGBToYRow_LASX;
1645
- }
1646
- }
1647
- #endif
1648
- #if defined(HAS_ARGBTOYROW_RVV)
1649
- if (TestCpuFlag(kCpuHasRVV)) {
1650
- ARGBToYRow = ARGBToYRow_RVV;
1651
- }
1652
- #endif
1653
-
1654
- for (y = 0; y < height; ++y) {
1655
- ARGBToYRow(src_argb, dst_y, width);
1656
- src_argb += src_stride_argb;
1657
- dst_y += dst_stride_y;
1658
- }
1659
- return 0;
1660
- }
1661
-
1662
- #ifndef __riscv
1663
- // Shuffle table for converting ARGB to RGBA.
1664
- static const uvec8 kShuffleMaskARGBToRGBA = {
1665
- 3u, 0u, 1u, 2u, 7u, 4u, 5u, 6u, 11u, 8u, 9u, 10u, 15u, 12u, 13u, 14u};
1666
-
1667
- // Convert ARGB to RGBA.
1668
- LIBYUV_API
1669
- int ARGBToRGBA(const uint8_t* src_argb,
1670
- int src_stride_argb,
1671
- uint8_t* dst_rgba,
1672
- int dst_stride_rgba,
1673
- int width,
1674
- int height) {
1675
- return ARGBShuffle(src_argb, src_stride_argb, dst_rgba, dst_stride_rgba,
1676
- (const uint8_t*)(&kShuffleMaskARGBToRGBA), width, height);
1677
- }
1678
- #else
1679
- // Convert ARGB to RGBA.
1680
- LIBYUV_API
1681
- int ARGBToRGBA(const uint8_t* src_argb,
1682
- int src_stride_argb,
1683
- uint8_t* dst_rgba,
1684
- int dst_stride_rgba,
1685
- int width,
1686
- int height) {
1687
- int y;
1688
- void (*ARGBToRGBARow)(const uint8_t* src_argb, uint8_t* dst_rgba, int width) =
1689
- ARGBToRGBARow_C;
1690
- if (!src_argb || !dst_rgba || width <= 0 || height == 0) {
1691
- return -1;
1692
- }
1693
- if (height < 0) {
1694
- height = -height;
1695
- src_argb = src_argb + (height - 1) * src_stride_argb;
1696
- src_stride_argb = -src_stride_argb;
1697
- }
1698
- // Coalesce rows.
1699
- if (src_stride_argb == width * 4 && dst_stride_rgba == width * 4) {
1700
- width *= height;
1701
- height = 1;
1702
- src_stride_argb = dst_stride_rgba = 0;
1703
- }
1704
-
1705
- #if defined(HAS_ARGBTORGBAROW_RVV)
1706
- if (TestCpuFlag(kCpuHasRVV)) {
1707
- ARGBToRGBARow = ARGBToRGBARow_RVV;
1708
- }
1709
- #endif
1710
-
1711
- for (y = 0; y < height; ++y) {
1712
- ARGBToRGBARow(src_argb, dst_rgba, width);
1713
- src_argb += src_stride_argb;
1714
- dst_rgba += dst_stride_rgba;
1715
- }
1716
- return 0;
1717
- }
1718
- #endif
1719
-
1720
- // Convert ARGB To RGB24.
1721
- LIBYUV_API
1722
- int ARGBToRGB24(const uint8_t* src_argb,
1723
- int src_stride_argb,
1724
- uint8_t* dst_rgb24,
1725
- int dst_stride_rgb24,
1726
- int width,
1727
- int height) {
1728
- int y;
1729
- void (*ARGBToRGB24Row)(const uint8_t* src_argb, uint8_t* dst_rgb, int width) =
1730
- ARGBToRGB24Row_C;
1731
- if (!src_argb || !dst_rgb24 || width <= 0 || height == 0) {
1732
- return -1;
1733
- }
1734
- if (height < 0) {
1735
- height = -height;
1736
- src_argb = src_argb + (height - 1) * src_stride_argb;
1737
- src_stride_argb = -src_stride_argb;
1738
- }
1739
- // Coalesce rows.
1740
- if (src_stride_argb == width * 4 && dst_stride_rgb24 == width * 3) {
1741
- width *= height;
1742
- height = 1;
1743
- src_stride_argb = dst_stride_rgb24 = 0;
1744
- }
1745
- #if defined(HAS_ARGBTORGB24ROW_SSSE3)
1746
- if (TestCpuFlag(kCpuHasSSSE3)) {
1747
- ARGBToRGB24Row = ARGBToRGB24Row_Any_SSSE3;
1748
- if (IS_ALIGNED(width, 16)) {
1749
- ARGBToRGB24Row = ARGBToRGB24Row_SSSE3;
1750
- }
1751
- }
1752
- #endif
1753
- #if defined(HAS_ARGBTORGB24ROW_AVX2)
1754
- if (TestCpuFlag(kCpuHasAVX2)) {
1755
- ARGBToRGB24Row = ARGBToRGB24Row_Any_AVX2;
1756
- if (IS_ALIGNED(width, 32)) {
1757
- ARGBToRGB24Row = ARGBToRGB24Row_AVX2;
1758
- }
1759
- }
1760
- #endif
1761
- #if defined(HAS_ARGBTORGB24ROW_AVX512VBMI)
1762
- if (TestCpuFlag(kCpuHasAVX512VBMI)) {
1763
- ARGBToRGB24Row = ARGBToRGB24Row_Any_AVX512VBMI;
1764
- if (IS_ALIGNED(width, 32)) {
1765
- ARGBToRGB24Row = ARGBToRGB24Row_AVX512VBMI;
1766
- }
1767
- }
1768
- #endif
1769
- #if defined(HAS_ARGBTORGB24ROW_NEON)
1770
- if (TestCpuFlag(kCpuHasNEON)) {
1771
- ARGBToRGB24Row = ARGBToRGB24Row_Any_NEON;
1772
- if (IS_ALIGNED(width, 16)) {
1773
- ARGBToRGB24Row = ARGBToRGB24Row_NEON;
1774
- }
1775
- }
1776
- #endif
1777
- #if defined(HAS_ARGBTORGB24ROW_SVE2)
1778
- if (TestCpuFlag(kCpuHasSVE2)) {
1779
- ARGBToRGB24Row = ARGBToRGB24Row_SVE2;
1780
- }
1781
- #endif
1782
- #if defined(HAS_ARGBTORGB24ROW_LSX)
1783
- if (TestCpuFlag(kCpuHasLSX)) {
1784
- ARGBToRGB24Row = ARGBToRGB24Row_Any_LSX;
1785
- if (IS_ALIGNED(width, 16)) {
1786
- ARGBToRGB24Row = ARGBToRGB24Row_LSX;
1787
- }
1788
- }
1789
- #endif
1790
- #if defined(HAS_ARGBTORGB24ROW_LASX)
1791
- if (TestCpuFlag(kCpuHasLASX)) {
1792
- ARGBToRGB24Row = ARGBToRGB24Row_Any_LASX;
1793
- if (IS_ALIGNED(width, 32)) {
1794
- ARGBToRGB24Row = ARGBToRGB24Row_LASX;
1795
- }
1796
- }
1797
- #endif
1798
- #if defined(HAS_ARGBTORGB24ROW_RVV)
1799
- if (TestCpuFlag(kCpuHasRVV)) {
1800
- ARGBToRGB24Row = ARGBToRGB24Row_RVV;
1801
- }
1802
- #endif
1803
-
1804
- for (y = 0; y < height; ++y) {
1805
- ARGBToRGB24Row(src_argb, dst_rgb24, width);
1806
- src_argb += src_stride_argb;
1807
- dst_rgb24 += dst_stride_rgb24;
1808
- }
1809
- return 0;
1810
- }
1811
-
1812
- // Convert ARGB To RAW.
1813
- LIBYUV_API
1814
- int ARGBToRAW(const uint8_t* src_argb,
1815
- int src_stride_argb,
1816
- uint8_t* dst_raw,
1817
- int dst_stride_raw,
1818
- int width,
1819
- int height) {
1820
- int y;
1821
- void (*ARGBToRAWRow)(const uint8_t* src_argb, uint8_t* dst_rgb, int width) =
1822
- ARGBToRAWRow_C;
1823
- if (!src_argb || !dst_raw || width <= 0 || height == 0) {
1824
- return -1;
1825
- }
1826
- if (height < 0) {
1827
- height = -height;
1828
- src_argb = src_argb + (height - 1) * src_stride_argb;
1829
- src_stride_argb = -src_stride_argb;
1830
- }
1831
- // Coalesce rows.
1832
- if (src_stride_argb == width * 4 && dst_stride_raw == width * 3) {
1833
- width *= height;
1834
- height = 1;
1835
- src_stride_argb = dst_stride_raw = 0;
1836
- }
1837
- #if defined(HAS_ARGBTORAWROW_SSSE3)
1838
- if (TestCpuFlag(kCpuHasSSSE3)) {
1839
- ARGBToRAWRow = ARGBToRAWRow_Any_SSSE3;
1840
- if (IS_ALIGNED(width, 16)) {
1841
- ARGBToRAWRow = ARGBToRAWRow_SSSE3;
1842
- }
1843
- }
1844
- #endif
1845
- #if defined(HAS_ARGBTORAWROW_AVX2)
1846
- if (TestCpuFlag(kCpuHasAVX2)) {
1847
- ARGBToRAWRow = ARGBToRAWRow_Any_AVX2;
1848
- if (IS_ALIGNED(width, 32)) {
1849
- ARGBToRAWRow = ARGBToRAWRow_AVX2;
1850
- }
1851
- }
1852
- #endif
1853
- #if defined(HAS_ARGBTORAWROW_NEON)
1854
- if (TestCpuFlag(kCpuHasNEON)) {
1855
- ARGBToRAWRow = ARGBToRAWRow_Any_NEON;
1856
- if (IS_ALIGNED(width, 8)) {
1857
- ARGBToRAWRow = ARGBToRAWRow_NEON;
1858
- }
1859
- }
1860
- #endif
1861
- #if defined(HAS_ARGBTORAWROW_SVE2)
1862
- if (TestCpuFlag(kCpuHasSVE2)) {
1863
- ARGBToRAWRow = ARGBToRAWRow_SVE2;
1864
- }
1865
- #endif
1866
- #if defined(HAS_ARGBTORAWROW_LSX)
1867
- if (TestCpuFlag(kCpuHasLSX)) {
1868
- ARGBToRAWRow = ARGBToRAWRow_Any_LSX;
1869
- if (IS_ALIGNED(width, 16)) {
1870
- ARGBToRAWRow = ARGBToRAWRow_LSX;
1871
- }
1872
- }
1873
- #endif
1874
- #if defined(HAS_ARGBTORAWROW_LASX)
1875
- if (TestCpuFlag(kCpuHasLASX)) {
1876
- ARGBToRAWRow = ARGBToRAWRow_Any_LASX;
1877
- if (IS_ALIGNED(width, 32)) {
1878
- ARGBToRAWRow = ARGBToRAWRow_LASX;
1879
- }
1880
- }
1881
- #endif
1882
- #if defined(HAS_ARGBTORAWROW_RVV)
1883
- if (TestCpuFlag(kCpuHasRVV)) {
1884
- ARGBToRAWRow = ARGBToRAWRow_RVV;
1885
- }
1886
- #endif
1887
-
1888
- for (y = 0; y < height; ++y) {
1889
- ARGBToRAWRow(src_argb, dst_raw, width);
1890
- src_argb += src_stride_argb;
1891
- dst_raw += dst_stride_raw;
1892
- }
1893
- return 0;
1894
- }
1895
-
1896
- // Ordered 8x8 dither for 888 to 565. Values from 0 to 7.
1897
- static const uint8_t kDither565_4x4[16] = {
1898
- 0, 4, 1, 5, 6, 2, 7, 3, 1, 5, 0, 4, 7, 3, 6, 2,
1899
- };
1900
-
1901
- // Convert ARGB To RGB565 with 4x4 dither matrix (16 bytes).
1902
- LIBYUV_API
1903
- int ARGBToRGB565Dither(const uint8_t* src_argb,
1904
- int src_stride_argb,
1905
- uint8_t* dst_rgb565,
1906
- int dst_stride_rgb565,
1907
- const uint8_t* dither4x4,
1908
- int width,
1909
- int height) {
1910
- int y;
1911
- void (*ARGBToRGB565DitherRow)(const uint8_t* src_argb, uint8_t* dst_rgb,
1912
- uint32_t dither4, int width) =
1913
- ARGBToRGB565DitherRow_C;
1914
- if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) {
1915
- return -1;
1916
- }
1917
- if (height < 0) {
1918
- height = -height;
1919
- src_argb = src_argb + (height - 1) * src_stride_argb;
1920
- src_stride_argb = -src_stride_argb;
1921
- }
1922
- if (!dither4x4) {
1923
- dither4x4 = kDither565_4x4;
1924
- }
1925
- #if defined(HAS_ARGBTORGB565DITHERROW_SSE2)
1926
- if (TestCpuFlag(kCpuHasSSE2)) {
1927
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_SSE2;
1928
- if (IS_ALIGNED(width, 4)) {
1929
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_SSE2;
1930
- }
1931
- }
1932
- #endif
1933
- #if defined(HAS_ARGBTORGB565DITHERROW_AVX2)
1934
- if (TestCpuFlag(kCpuHasAVX2)) {
1935
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_AVX2;
1936
- if (IS_ALIGNED(width, 8)) {
1937
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_AVX2;
1938
- }
1939
- }
1940
- #endif
1941
- #if defined(HAS_ARGBTORGB565DITHERROW_NEON)
1942
- if (TestCpuFlag(kCpuHasNEON)) {
1943
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_NEON;
1944
- if (IS_ALIGNED(width, 8)) {
1945
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_NEON;
1946
- }
1947
- }
1948
- #endif
1949
- #if defined(HAS_ARGBTORGB565DITHERROW_SVE2)
1950
- if (TestCpuFlag(kCpuHasSVE2)) {
1951
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_SVE2;
1952
- }
1953
- #endif
1954
- #if defined(HAS_ARGBTORGB565DITHERROW_LSX)
1955
- if (TestCpuFlag(kCpuHasLSX)) {
1956
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LSX;
1957
- if (IS_ALIGNED(width, 8)) {
1958
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LSX;
1959
- }
1960
- }
1961
- #endif
1962
- #if defined(HAS_ARGBTORGB565DITHERROW_LASX)
1963
- if (TestCpuFlag(kCpuHasLASX)) {
1964
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LASX;
1965
- if (IS_ALIGNED(width, 16)) {
1966
- ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LASX;
1967
- }
1968
- }
1969
- #endif
1970
-
1971
- for (y = 0; y < height; ++y) {
1972
- ARGBToRGB565DitherRow(src_argb, dst_rgb565,
1973
- *(const uint32_t*)(dither4x4 + ((y & 3) << 2)),
1974
- width);
1975
- src_argb += src_stride_argb;
1976
- dst_rgb565 += dst_stride_rgb565;
1977
- }
1978
- return 0;
1979
- }
1980
-
1981
- // Convert ARGB To RGB565.
1982
- // TODO(fbarchard): Consider using dither function low level with zeros.
1983
- LIBYUV_API
1984
- int ARGBToRGB565(const uint8_t* src_argb,
1985
- int src_stride_argb,
1986
- uint8_t* dst_rgb565,
1987
- int dst_stride_rgb565,
1988
- int width,
1989
- int height) {
1990
- int y;
1991
- void (*ARGBToRGB565Row)(const uint8_t* src_argb, uint8_t* dst_rgb,
1992
- int width) = ARGBToRGB565Row_C;
1993
- if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) {
1994
- return -1;
1995
- }
1996
- if (height < 0) {
1997
- height = -height;
1998
- src_argb = src_argb + (height - 1) * src_stride_argb;
1999
- src_stride_argb = -src_stride_argb;
2000
- }
2001
- // Coalesce rows.
2002
- if (src_stride_argb == width * 4 && dst_stride_rgb565 == width * 2) {
2003
- width *= height;
2004
- height = 1;
2005
- src_stride_argb = dst_stride_rgb565 = 0;
2006
- }
2007
- #if defined(HAS_ARGBTORGB565ROW_SSE2)
2008
- if (TestCpuFlag(kCpuHasSSE2)) {
2009
- ARGBToRGB565Row = ARGBToRGB565Row_Any_SSE2;
2010
- if (IS_ALIGNED(width, 4)) {
2011
- ARGBToRGB565Row = ARGBToRGB565Row_SSE2;
2012
- }
2013
- }
2014
- #endif
2015
- #if defined(HAS_ARGBTORGB565ROW_AVX2)
2016
- if (TestCpuFlag(kCpuHasAVX2)) {
2017
- ARGBToRGB565Row = ARGBToRGB565Row_Any_AVX2;
2018
- if (IS_ALIGNED(width, 8)) {
2019
- ARGBToRGB565Row = ARGBToRGB565Row_AVX2;
2020
- }
2021
- }
2022
- #endif
2023
- #if defined(HAS_ARGBTORGB565ROW_NEON)
2024
- if (TestCpuFlag(kCpuHasNEON)) {
2025
- ARGBToRGB565Row = ARGBToRGB565Row_Any_NEON;
2026
- if (IS_ALIGNED(width, 8)) {
2027
- ARGBToRGB565Row = ARGBToRGB565Row_NEON;
2028
- }
2029
- }
2030
- #endif
2031
- #if defined(HAS_ARGBTORGB565ROW_SVE2)
2032
- if (TestCpuFlag(kCpuHasSVE2)) {
2033
- ARGBToRGB565Row = ARGBToRGB565Row_SVE2;
2034
- }
2035
- #endif
2036
- #if defined(HAS_ARGBTORGB565ROW_LSX)
2037
- if (TestCpuFlag(kCpuHasLSX)) {
2038
- ARGBToRGB565Row = ARGBToRGB565Row_Any_LSX;
2039
- if (IS_ALIGNED(width, 8)) {
2040
- ARGBToRGB565Row = ARGBToRGB565Row_LSX;
2041
- }
2042
- }
2043
- #endif
2044
-
2045
- #if defined(HAS_ARGBTORGB565ROW_LASX)
2046
- if (TestCpuFlag(kCpuHasLASX)) {
2047
- ARGBToRGB565Row = ARGBToRGB565Row_Any_LASX;
2048
- if (IS_ALIGNED(width, 16)) {
2049
- ARGBToRGB565Row = ARGBToRGB565Row_LASX;
2050
- }
2051
- }
2052
- #endif
2053
-
2054
- for (y = 0; y < height; ++y) {
2055
- ARGBToRGB565Row(src_argb, dst_rgb565, width);
2056
- src_argb += src_stride_argb;
2057
- dst_rgb565 += dst_stride_rgb565;
2058
- }
2059
- return 0;
2060
- }
2061
-
2062
- // Convert ARGB To ARGB1555.
2063
- LIBYUV_API
2064
- int ARGBToARGB1555(const uint8_t* src_argb,
2065
- int src_stride_argb,
2066
- uint8_t* dst_argb1555,
2067
- int dst_stride_argb1555,
2068
- int width,
2069
- int height) {
2070
- int y;
2071
- void (*ARGBToARGB1555Row)(const uint8_t* src_argb, uint8_t* dst_rgb,
2072
- int width) = ARGBToARGB1555Row_C;
2073
- if (!src_argb || !dst_argb1555 || width <= 0 || height == 0) {
2074
- return -1;
2075
- }
2076
- if (height < 0) {
2077
- height = -height;
2078
- src_argb = src_argb + (height - 1) * src_stride_argb;
2079
- src_stride_argb = -src_stride_argb;
2080
- }
2081
- // Coalesce rows.
2082
- if (src_stride_argb == width * 4 && dst_stride_argb1555 == width * 2) {
2083
- width *= height;
2084
- height = 1;
2085
- src_stride_argb = dst_stride_argb1555 = 0;
2086
- }
2087
- #if defined(HAS_ARGBTOARGB1555ROW_SSE2)
2088
- if (TestCpuFlag(kCpuHasSSE2)) {
2089
- ARGBToARGB1555Row = ARGBToARGB1555Row_Any_SSE2;
2090
- if (IS_ALIGNED(width, 4)) {
2091
- ARGBToARGB1555Row = ARGBToARGB1555Row_SSE2;
2092
- }
2093
- }
2094
- #endif
2095
- #if defined(HAS_ARGBTOARGB1555ROW_AVX2)
2096
- if (TestCpuFlag(kCpuHasAVX2)) {
2097
- ARGBToARGB1555Row = ARGBToARGB1555Row_Any_AVX2;
2098
- if (IS_ALIGNED(width, 8)) {
2099
- ARGBToARGB1555Row = ARGBToARGB1555Row_AVX2;
2100
- }
2101
- }
2102
- #endif
2103
- #if defined(HAS_ARGBTOARGB1555ROW_NEON)
2104
- if (TestCpuFlag(kCpuHasNEON)) {
2105
- ARGBToARGB1555Row = ARGBToARGB1555Row_Any_NEON;
2106
- if (IS_ALIGNED(width, 8)) {
2107
- ARGBToARGB1555Row = ARGBToARGB1555Row_NEON;
2108
- }
2109
- }
2110
- #endif
2111
- #if defined(HAS_ARGBTOARGB1555ROW_LSX)
2112
- if (TestCpuFlag(kCpuHasLSX)) {
2113
- ARGBToARGB1555Row = ARGBToARGB1555Row_Any_LSX;
2114
- if (IS_ALIGNED(width, 8)) {
2115
- ARGBToARGB1555Row = ARGBToARGB1555Row_LSX;
2116
- }
2117
- }
2118
- #endif
2119
- #if defined(HAS_ARGBTOARGB1555ROW_LASX)
2120
- if (TestCpuFlag(kCpuHasLASX)) {
2121
- ARGBToARGB1555Row = ARGBToARGB1555Row_Any_LASX;
2122
- if (IS_ALIGNED(width, 16)) {
2123
- ARGBToARGB1555Row = ARGBToARGB1555Row_LASX;
2124
- }
2125
- }
2126
- #endif
2127
-
2128
- for (y = 0; y < height; ++y) {
2129
- ARGBToARGB1555Row(src_argb, dst_argb1555, width);
2130
- src_argb += src_stride_argb;
2131
- dst_argb1555 += dst_stride_argb1555;
2132
- }
2133
- return 0;
2134
- }
2135
-
2136
- // Convert ARGB To ARGB4444.
2137
- LIBYUV_API
2138
- int ARGBToARGB4444(const uint8_t* src_argb,
2139
- int src_stride_argb,
2140
- uint8_t* dst_argb4444,
2141
- int dst_stride_argb4444,
2142
- int width,
2143
- int height) {
2144
- int y;
2145
- void (*ARGBToARGB4444Row)(const uint8_t* src_argb, uint8_t* dst_rgb,
2146
- int width) = ARGBToARGB4444Row_C;
2147
- if (!src_argb || !dst_argb4444 || width <= 0 || height == 0) {
2148
- return -1;
2149
- }
2150
- if (height < 0) {
2151
- height = -height;
2152
- src_argb = src_argb + (height - 1) * src_stride_argb;
2153
- src_stride_argb = -src_stride_argb;
2154
- }
2155
- // Coalesce rows.
2156
- if (src_stride_argb == width * 4 && dst_stride_argb4444 == width * 2) {
2157
- width *= height;
2158
- height = 1;
2159
- src_stride_argb = dst_stride_argb4444 = 0;
2160
- }
2161
- #if defined(HAS_ARGBTOARGB4444ROW_SSE2)
2162
- if (TestCpuFlag(kCpuHasSSE2)) {
2163
- ARGBToARGB4444Row = ARGBToARGB4444Row_Any_SSE2;
2164
- if (IS_ALIGNED(width, 4)) {
2165
- ARGBToARGB4444Row = ARGBToARGB4444Row_SSE2;
2166
- }
2167
- }
2168
- #endif
2169
- #if defined(HAS_ARGBTOARGB4444ROW_AVX2)
2170
- if (TestCpuFlag(kCpuHasAVX2)) {
2171
- ARGBToARGB4444Row = ARGBToARGB4444Row_Any_AVX2;
2172
- if (IS_ALIGNED(width, 8)) {
2173
- ARGBToARGB4444Row = ARGBToARGB4444Row_AVX2;
2174
- }
2175
- }
2176
- #endif
2177
- #if defined(HAS_ARGBTOARGB4444ROW_NEON)
2178
- if (TestCpuFlag(kCpuHasNEON)) {
2179
- ARGBToARGB4444Row = ARGBToARGB4444Row_Any_NEON;
2180
- if (IS_ALIGNED(width, 8)) {
2181
- ARGBToARGB4444Row = ARGBToARGB4444Row_NEON;
2182
- }
2183
- }
2184
- #endif
2185
- #if defined(HAS_ARGBTOARGB4444ROW_LSX)
2186
- if (TestCpuFlag(kCpuHasLSX)) {
2187
- ARGBToARGB4444Row = ARGBToARGB4444Row_Any_LSX;
2188
- if (IS_ALIGNED(width, 8)) {
2189
- ARGBToARGB4444Row = ARGBToARGB4444Row_LSX;
2190
- }
2191
- }
2192
- #endif
2193
- #if defined(HAS_ARGBTOARGB4444ROW_LASX)
2194
- if (TestCpuFlag(kCpuHasLASX)) {
2195
- ARGBToARGB4444Row = ARGBToARGB4444Row_Any_LASX;
2196
- if (IS_ALIGNED(width, 16)) {
2197
- ARGBToARGB4444Row = ARGBToARGB4444Row_LASX;
2198
- }
2199
- }
2200
- #endif
2201
-
2202
- for (y = 0; y < height; ++y) {
2203
- ARGBToARGB4444Row(src_argb, dst_argb4444, width);
2204
- src_argb += src_stride_argb;
2205
- dst_argb4444 += dst_stride_argb4444;
2206
- }
2207
- return 0;
2208
- }
2209
-
2210
- // Convert ABGR To AR30.
2211
- LIBYUV_API
2212
- int ABGRToAR30(const uint8_t* src_abgr,
2213
- int src_stride_abgr,
2214
- uint8_t* dst_ar30,
2215
- int dst_stride_ar30,
2216
- int width,
2217
- int height) {
2218
- int y;
2219
- void (*ABGRToAR30Row)(const uint8_t* src_abgr, uint8_t* dst_rgb, int width) =
2220
- ABGRToAR30Row_C;
2221
- if (!src_abgr || !dst_ar30 || width <= 0 || height == 0) {
2222
- return -1;
2223
- }
2224
- if (height < 0) {
2225
- height = -height;
2226
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
2227
- src_stride_abgr = -src_stride_abgr;
2228
- }
2229
- // Coalesce rows.
2230
- if (src_stride_abgr == width * 4 && dst_stride_ar30 == width * 4) {
2231
- width *= height;
2232
- height = 1;
2233
- src_stride_abgr = dst_stride_ar30 = 0;
2234
- }
2235
- #if defined(HAS_ABGRTOAR30ROW_NEON)
2236
- if (TestCpuFlag(kCpuHasNEON)) {
2237
- ABGRToAR30Row = ABGRToAR30Row_Any_NEON;
2238
- if (IS_ALIGNED(width, 8)) {
2239
- ABGRToAR30Row = ABGRToAR30Row_NEON;
2240
- }
2241
- }
2242
- #endif
2243
- #if defined(HAS_ABGRTOAR30ROW_SSSE3)
2244
- if (TestCpuFlag(kCpuHasSSSE3)) {
2245
- ABGRToAR30Row = ABGRToAR30Row_Any_SSSE3;
2246
- if (IS_ALIGNED(width, 4)) {
2247
- ABGRToAR30Row = ABGRToAR30Row_SSSE3;
2248
- }
2249
- }
2250
- #endif
2251
- #if defined(HAS_ABGRTOAR30ROW_AVX2)
2252
- if (TestCpuFlag(kCpuHasAVX2)) {
2253
- ABGRToAR30Row = ABGRToAR30Row_Any_AVX2;
2254
- if (IS_ALIGNED(width, 8)) {
2255
- ABGRToAR30Row = ABGRToAR30Row_AVX2;
2256
- }
2257
- }
2258
- #endif
2259
- for (y = 0; y < height; ++y) {
2260
- ABGRToAR30Row(src_abgr, dst_ar30, width);
2261
- src_abgr += src_stride_abgr;
2262
- dst_ar30 += dst_stride_ar30;
2263
- }
2264
- return 0;
2265
- }
2266
-
2267
- // Convert ARGB To AR30.
2268
- LIBYUV_API
2269
- int ARGBToAR30(const uint8_t* src_argb,
2270
- int src_stride_argb,
2271
- uint8_t* dst_ar30,
2272
- int dst_stride_ar30,
2273
- int width,
2274
- int height) {
2275
- int y;
2276
- void (*ARGBToAR30Row)(const uint8_t* src_argb, uint8_t* dst_rgb, int width) =
2277
- ARGBToAR30Row_C;
2278
- if (!src_argb || !dst_ar30 || width <= 0 || height == 0) {
2279
- return -1;
2280
- }
2281
- if (height < 0) {
2282
- height = -height;
2283
- src_argb = src_argb + (height - 1) * src_stride_argb;
2284
- src_stride_argb = -src_stride_argb;
2285
- }
2286
- // Coalesce rows.
2287
- if (src_stride_argb == width * 4 && dst_stride_ar30 == width * 4) {
2288
- width *= height;
2289
- height = 1;
2290
- src_stride_argb = dst_stride_ar30 = 0;
2291
- }
2292
- #if defined(HAS_ARGBTOAR30ROW_NEON)
2293
- if (TestCpuFlag(kCpuHasNEON)) {
2294
- ARGBToAR30Row = ARGBToAR30Row_Any_NEON;
2295
- if (IS_ALIGNED(width, 8)) {
2296
- ARGBToAR30Row = ARGBToAR30Row_NEON;
2297
- }
2298
- }
2299
- #endif
2300
- #if defined(HAS_ARGBTOAR30ROW_SSSE3)
2301
- if (TestCpuFlag(kCpuHasSSSE3)) {
2302
- ARGBToAR30Row = ARGBToAR30Row_Any_SSSE3;
2303
- if (IS_ALIGNED(width, 4)) {
2304
- ARGBToAR30Row = ARGBToAR30Row_SSSE3;
2305
- }
2306
- }
2307
- #endif
2308
- #if defined(HAS_ARGBTOAR30ROW_AVX2)
2309
- if (TestCpuFlag(kCpuHasAVX2)) {
2310
- ARGBToAR30Row = ARGBToAR30Row_Any_AVX2;
2311
- if (IS_ALIGNED(width, 8)) {
2312
- ARGBToAR30Row = ARGBToAR30Row_AVX2;
2313
- }
2314
- }
2315
- #endif
2316
- for (y = 0; y < height; ++y) {
2317
- ARGBToAR30Row(src_argb, dst_ar30, width);
2318
- src_argb += src_stride_argb;
2319
- dst_ar30 += dst_stride_ar30;
2320
- }
2321
- return 0;
2322
- }
2323
-
2324
- // ARGB little endian (bgra in memory) to J444
2325
- LIBYUV_API
2326
- int ARGBToJ444(const uint8_t* src_argb,
2327
- int src_stride_argb,
2328
- uint8_t* dst_y,
2329
- int dst_stride_y,
2330
- uint8_t* dst_u,
2331
- int dst_stride_u,
2332
- uint8_t* dst_v,
2333
- int dst_stride_v,
2334
- int width,
2335
- int height) {
2336
- int y;
2337
- void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
2338
- ARGBToYJRow_C;
2339
- void (*ARGBToUVJ444Row)(const uint8_t* src_argb, uint8_t* dst_u,
2340
- uint8_t* dst_v, int width) = ARGBToUVJ444Row_C;
2341
- if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) {
2342
- return -1;
2343
- }
2344
- if (height < 0) {
2345
- height = -height;
2346
- src_argb = src_argb + (height - 1) * src_stride_argb;
2347
- src_stride_argb = -src_stride_argb;
2348
- }
2349
- // Coalesce rows.
2350
- if (src_stride_argb == width * 4 && dst_stride_y == width &&
2351
- dst_stride_u == width && dst_stride_v == width) {
2352
- width *= height;
2353
- height = 1;
2354
- src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0;
2355
- }
2356
- #if defined(HAS_ARGBTOUVJ444ROW_SSSE3)
2357
- if (TestCpuFlag(kCpuHasSSSE3)) {
2358
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_SSSE3;
2359
- if (IS_ALIGNED(width, 16)) {
2360
- ARGBToUVJ444Row = ARGBToUVJ444Row_SSSE3;
2361
- }
2362
- }
2363
- #endif
2364
- #if defined(HAS_ARGBTOUVJ444ROW_AVX2)
2365
- if (TestCpuFlag(kCpuHasAVX2)) {
2366
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_AVX2;
2367
- if (IS_ALIGNED(width, 32)) {
2368
- ARGBToUVJ444Row = ARGBToUVJ444Row_AVX2;
2369
- }
2370
- }
2371
- #endif
2372
- #if defined(HAS_ARGBTOUVJ444ROW_NEON)
2373
- if (TestCpuFlag(kCpuHasNEON)) {
2374
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_NEON;
2375
- if (IS_ALIGNED(width, 8)) {
2376
- ARGBToUVJ444Row = ARGBToUVJ444Row_NEON;
2377
- }
2378
- }
2379
- #endif
2380
- #if defined(HAS_ARGBTOUVJ444ROW_NEON_I8MM)
2381
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
2382
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_NEON_I8MM;
2383
- if (IS_ALIGNED(width, 8)) {
2384
- ARGBToUVJ444Row = ARGBToUVJ444Row_NEON_I8MM;
2385
- }
2386
- }
2387
- #endif
2388
- #if defined(HAS_ARGBTOUVJ444ROW_LSX)
2389
- if (TestCpuFlag(kCpuHasLSX)) {
2390
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_LSX;
2391
- if (IS_ALIGNED(width, 16)) {
2392
- ARGBToUVJ444Row = ARGBToUVJ444Row_LSX;
2393
- }
2394
- }
2395
- #endif
2396
- #if defined(HAS_ARGBTOUVJ444ROW_LASX)
2397
- if (TestCpuFlag(kCpuHasLASX)) {
2398
- ARGBToUVJ444Row = ARGBToUVJ444Row_Any_LASX;
2399
- if (IS_ALIGNED(width, 32)) {
2400
- ARGBToUVJ444Row = ARGBToUVJ444Row_LASX;
2401
- }
2402
- }
2403
- #endif
2404
- #if defined(HAS_ARGBTOYJROW_SSSE3)
2405
- if (TestCpuFlag(kCpuHasSSSE3)) {
2406
- ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
2407
- if (IS_ALIGNED(width, 16)) {
2408
- ARGBToYJRow = ARGBToYJRow_SSSE3;
2409
- }
2410
- }
2411
- #endif
2412
- #if defined(HAS_ARGBTOYJROW_AVX2)
2413
- if (TestCpuFlag(kCpuHasAVX2)) {
2414
- ARGBToYJRow = ARGBToYJRow_Any_AVX2;
2415
- if (IS_ALIGNED(width, 32)) {
2416
- ARGBToYJRow = ARGBToYJRow_AVX2;
2417
- }
2418
- }
2419
- #endif
2420
- #if defined(HAS_ARGBTOYJROW_NEON)
2421
- if (TestCpuFlag(kCpuHasNEON)) {
2422
- ARGBToYJRow = ARGBToYJRow_Any_NEON;
2423
- if (IS_ALIGNED(width, 16)) {
2424
- ARGBToYJRow = ARGBToYJRow_NEON;
2425
- }
2426
- }
2427
- #endif
2428
- #if defined(HAS_ARGBTOYJROW_NEON_DOTPROD)
2429
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2430
- ARGBToYJRow = ARGBToYJRow_Any_NEON_DotProd;
2431
- if (IS_ALIGNED(width, 16)) {
2432
- ARGBToYJRow = ARGBToYJRow_NEON_DotProd;
2433
- }
2434
- }
2435
- #endif
2436
- #if defined(HAS_ARGBTOYJROW_LSX)
2437
- if (TestCpuFlag(kCpuHasLSX)) {
2438
- ARGBToYJRow = ARGBToYJRow_Any_LSX;
2439
- if (IS_ALIGNED(width, 16)) {
2440
- ARGBToYJRow = ARGBToYJRow_LSX;
2441
- }
2442
- }
2443
- #endif
2444
- #if defined(HAS_ARGBTOYJROW_LASX)
2445
- if (TestCpuFlag(kCpuHasLASX)) {
2446
- ARGBToYJRow = ARGBToYJRow_Any_LASX;
2447
- if (IS_ALIGNED(width, 32)) {
2448
- ARGBToYJRow = ARGBToYJRow_LASX;
2449
- }
2450
- }
2451
- #endif
2452
- #if defined(HAS_ARGBTOYJROW_RVV)
2453
- if (TestCpuFlag(kCpuHasRVV)) {
2454
- ARGBToYJRow = ARGBToYJRow_RVV;
2455
- }
2456
- #endif
2457
-
2458
- for (y = 0; y < height; ++y) {
2459
- ARGBToUVJ444Row(src_argb, dst_u, dst_v, width);
2460
- ARGBToYJRow(src_argb, dst_y, width);
2461
- src_argb += src_stride_argb;
2462
- dst_y += dst_stride_y;
2463
- dst_u += dst_stride_u;
2464
- dst_v += dst_stride_v;
2465
- }
2466
- return 0;
2467
- }
2468
-
2469
- // Convert ARGB to J420. (JPeg full range I420).
2470
- LIBYUV_API
2471
- int ARGBToJ420(const uint8_t* src_argb,
2472
- int src_stride_argb,
2473
- uint8_t* dst_yj,
2474
- int dst_stride_yj,
2475
- uint8_t* dst_uj,
2476
- int dst_stride_uj,
2477
- uint8_t* dst_vj,
2478
- int dst_stride_vj,
2479
- int width,
2480
- int height) {
2481
- int y;
2482
- void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb,
2483
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
2484
- ARGBToUVJRow_C;
2485
- void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_yj, int width) =
2486
- ARGBToYJRow_C;
2487
- if (!src_argb || !dst_yj || !dst_uj || !dst_vj || width <= 0 || height == 0) {
2488
- return -1;
2489
- }
2490
- // Negative height means invert the image.
2491
- if (height < 0) {
2492
- height = -height;
2493
- src_argb = src_argb + (height - 1) * src_stride_argb;
2494
- src_stride_argb = -src_stride_argb;
2495
- }
2496
- #if defined(HAS_ARGBTOYJROW_NEON)
2497
- if (TestCpuFlag(kCpuHasNEON)) {
2498
- ARGBToYJRow = ARGBToYJRow_Any_NEON;
2499
- if (IS_ALIGNED(width, 16)) {
2500
- ARGBToYJRow = ARGBToYJRow_NEON;
2501
- }
2502
- }
2503
- #endif
2504
- #if defined(HAS_ARGBTOYJROW_NEON_DOTPROD)
2505
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2506
- ARGBToYJRow = ARGBToYJRow_Any_NEON_DotProd;
2507
- if (IS_ALIGNED(width, 16)) {
2508
- ARGBToYJRow = ARGBToYJRow_NEON_DotProd;
2509
- }
2510
- }
2511
- #endif
2512
- #if defined(HAS_ARGBTOUVJROW_NEON)
2513
- if (TestCpuFlag(kCpuHasNEON)) {
2514
- ARGBToUVJRow = ARGBToUVJRow_Any_NEON;
2515
- if (IS_ALIGNED(width, 16)) {
2516
- ARGBToUVJRow = ARGBToUVJRow_NEON;
2517
- }
2518
- }
2519
- #endif
2520
- #if defined(HAS_ARGBTOUVJROW_NEON_I8MM)
2521
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
2522
- ARGBToUVJRow = ARGBToUVJRow_Any_NEON_I8MM;
2523
- if (IS_ALIGNED(width, 16)) {
2524
- ARGBToUVJRow = ARGBToUVJRow_NEON_I8MM;
2525
- }
2526
- }
2527
- #endif
2528
- #if defined(HAS_ARGBTOUVJROW_SVE2)
2529
- if (TestCpuFlag(kCpuHasSVE2)) {
2530
- ARGBToUVJRow = ARGBToUVJRow_Any_SVE2;
2531
- if (IS_ALIGNED(width, 2)) {
2532
- ARGBToUVJRow = ARGBToUVJRow_SVE2;
2533
- }
2534
- }
2535
- #endif
2536
- #if defined(HAS_ARGBTOUVJROW_SME)
2537
- if (TestCpuFlag(kCpuHasSME)) {
2538
- ARGBToUVJRow = ARGBToUVJRow_Any_SME;
2539
- if (IS_ALIGNED(width, 2)) {
2540
- ARGBToUVJRow = ARGBToUVJRow_SME;
2541
- }
2542
- }
2543
- #endif
2544
- #if defined(HAS_ARGBTOYJROW_SSSE3)
2545
- if (TestCpuFlag(kCpuHasSSSE3)) {
2546
- ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
2547
- if (IS_ALIGNED(width, 16)) {
2548
- ARGBToYJRow = ARGBToYJRow_SSSE3;
2549
- }
2550
- }
2551
- #endif
2552
- #if defined(HAS_ARGBTOUVJROW_SSSE3)
2553
- if (TestCpuFlag(kCpuHasSSSE3)) {
2554
- ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3;
2555
- if (IS_ALIGNED(width, 16)) {
2556
- ARGBToUVJRow = ARGBToUVJRow_SSSE3;
2557
- }
2558
- }
2559
- #endif
2560
- #if defined(HAS_ARGBTOYJROW_AVX2)
2561
- if (TestCpuFlag(kCpuHasAVX2)) {
2562
- ARGBToYJRow = ARGBToYJRow_Any_AVX2;
2563
- if (IS_ALIGNED(width, 32)) {
2564
- ARGBToYJRow = ARGBToYJRow_AVX2;
2565
- }
2566
- }
2567
- #endif
2568
- #if defined(HAS_ARGBTOUVJROW_AVX2)
2569
- if (TestCpuFlag(kCpuHasAVX2)) {
2570
- ARGBToUVJRow = ARGBToUVJRow_Any_AVX2;
2571
- if (IS_ALIGNED(width, 32)) {
2572
- ARGBToUVJRow = ARGBToUVJRow_AVX2;
2573
- }
2574
- }
2575
- #endif
2576
- #if defined(HAS_ARGBTOYJROW_LSX) && defined(HAS_ARGBTOUVJROW_LSX)
2577
- if (TestCpuFlag(kCpuHasLSX)) {
2578
- ARGBToYJRow = ARGBToYJRow_Any_LSX;
2579
- ARGBToUVJRow = ARGBToUVJRow_Any_LSX;
2580
- if (IS_ALIGNED(width, 16)) {
2581
- ARGBToYJRow = ARGBToYJRow_LSX;
2582
- ARGBToUVJRow = ARGBToUVJRow_LSX;
2583
- }
2584
- }
2585
- #endif
2586
- #if defined(HAS_ARGBTOYJROW_LASX) && defined(HAS_ARGBTOUVJROW_LASX)
2587
- if (TestCpuFlag(kCpuHasLASX)) {
2588
- ARGBToYJRow = ARGBToYJRow_Any_LASX;
2589
- ARGBToUVJRow = ARGBToUVJRow_Any_LASX;
2590
- if (IS_ALIGNED(width, 32)) {
2591
- ARGBToYJRow = ARGBToYJRow_LASX;
2592
- ARGBToUVJRow = ARGBToUVJRow_LASX;
2593
- }
2594
- }
2595
- #endif
2596
- #if defined(HAS_ARGBTOYJROW_RVV)
2597
- if (TestCpuFlag(kCpuHasRVV)) {
2598
- ARGBToYJRow = ARGBToYJRow_RVV;
2599
- }
2600
- #endif
2601
-
2602
- for (y = 0; y < height - 1; y += 2) {
2603
- ARGBToUVJRow(src_argb, src_stride_argb, dst_uj, dst_vj, width);
2604
- ARGBToYJRow(src_argb, dst_yj, width);
2605
- ARGBToYJRow(src_argb + src_stride_argb, dst_yj + dst_stride_yj, width);
2606
- src_argb += src_stride_argb * 2;
2607
- dst_yj += dst_stride_yj * 2;
2608
- dst_uj += dst_stride_uj;
2609
- dst_vj += dst_stride_vj;
2610
- }
2611
- if (height & 1) {
2612
- ARGBToUVJRow(src_argb, 0, dst_uj, dst_vj, width);
2613
- ARGBToYJRow(src_argb, dst_yj, width);
2614
- }
2615
- return 0;
2616
- }
2617
-
2618
- // Convert ARGB to J422. (JPeg full range I422).
2619
- LIBYUV_API
2620
- int ARGBToJ422(const uint8_t* src_argb,
2621
- int src_stride_argb,
2622
- uint8_t* dst_yj,
2623
- int dst_stride_yj,
2624
- uint8_t* dst_uj,
2625
- int dst_stride_uj,
2626
- uint8_t* dst_vj,
2627
- int dst_stride_vj,
2628
- int width,
2629
- int height) {
2630
- int y;
2631
- void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb,
2632
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
2633
- ARGBToUVJRow_C;
2634
- void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_yj, int width) =
2635
- ARGBToYJRow_C;
2636
- if (!src_argb || !dst_yj || !dst_uj || !dst_vj || width <= 0 || height == 0) {
2637
- return -1;
2638
- }
2639
- // Negative height means invert the image.
2640
- if (height < 0) {
2641
- height = -height;
2642
- src_argb = src_argb + (height - 1) * src_stride_argb;
2643
- src_stride_argb = -src_stride_argb;
2644
- }
2645
- // Coalesce rows.
2646
- if (src_stride_argb == width * 4 && dst_stride_yj == width &&
2647
- dst_stride_uj * 2 == width && dst_stride_vj * 2 == width) {
2648
- width *= height;
2649
- height = 1;
2650
- src_stride_argb = dst_stride_yj = dst_stride_uj = dst_stride_vj = 0;
2651
- }
2652
- #if defined(HAS_ARGBTOYJROW_SSSE3)
2653
- if (TestCpuFlag(kCpuHasSSSE3)) {
2654
- ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
2655
- if (IS_ALIGNED(width, 16)) {
2656
- ARGBToYJRow = ARGBToYJRow_SSSE3;
2657
- }
2658
- }
2659
- #endif
2660
- #if defined(HAS_ARGBTOUVJROW_SSSE3)
2661
- if (TestCpuFlag(kCpuHasSSSE3)) {
2662
- ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3;
2663
- if (IS_ALIGNED(width, 16)) {
2664
- ARGBToUVJRow = ARGBToUVJRow_SSSE3;
2665
- }
2666
- }
2667
- #endif
2668
- #if defined(HAS_ARGBTOYJROW_AVX2)
2669
- if (TestCpuFlag(kCpuHasAVX2)) {
2670
- ARGBToYJRow = ARGBToYJRow_Any_AVX2;
2671
- if (IS_ALIGNED(width, 32)) {
2672
- ARGBToYJRow = ARGBToYJRow_AVX2;
2673
- }
2674
- }
2675
- #endif
2676
- #if defined(HAS_ARGBTOUVJROW_AVX2)
2677
- if (TestCpuFlag(kCpuHasAVX2)) {
2678
- ARGBToUVJRow = ARGBToUVJRow_Any_AVX2;
2679
- if (IS_ALIGNED(width, 32)) {
2680
- ARGBToUVJRow = ARGBToUVJRow_AVX2;
2681
- }
2682
- }
2683
- #endif
2684
- #if defined(HAS_ARGBTOYJROW_NEON)
2685
- if (TestCpuFlag(kCpuHasNEON)) {
2686
- ARGBToYJRow = ARGBToYJRow_Any_NEON;
2687
- if (IS_ALIGNED(width, 16)) {
2688
- ARGBToYJRow = ARGBToYJRow_NEON;
2689
- }
2690
- }
2691
- #endif
2692
- #if defined(HAS_ARGBTOYJROW_NEON_DOTPROD)
2693
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2694
- ARGBToYJRow = ARGBToYJRow_Any_NEON_DotProd;
2695
- if (IS_ALIGNED(width, 16)) {
2696
- ARGBToYJRow = ARGBToYJRow_NEON_DotProd;
2697
- }
2698
- }
2699
- #endif
2700
- #if defined(HAS_ARGBTOUVJROW_NEON)
2701
- if (TestCpuFlag(kCpuHasNEON)) {
2702
- ARGBToUVJRow = ARGBToUVJRow_Any_NEON;
2703
- if (IS_ALIGNED(width, 16)) {
2704
- ARGBToUVJRow = ARGBToUVJRow_NEON;
2705
- }
2706
- }
2707
- #endif
2708
- #if defined(HAS_ARGBTOUVJROW_NEON_I8MM)
2709
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
2710
- ARGBToUVJRow = ARGBToUVJRow_Any_NEON_I8MM;
2711
- if (IS_ALIGNED(width, 16)) {
2712
- ARGBToUVJRow = ARGBToUVJRow_NEON_I8MM;
2713
- }
2714
- }
2715
- #endif
2716
- #if defined(HAS_ARGBTOUVJROW_SVE2)
2717
- if (TestCpuFlag(kCpuHasSVE2)) {
2718
- ARGBToUVJRow = ARGBToUVJRow_Any_SVE2;
2719
- if (IS_ALIGNED(width, 2)) {
2720
- ARGBToUVJRow = ARGBToUVJRow_SVE2;
2721
- }
2722
- }
2723
- #endif
2724
- #if defined(HAS_ARGBTOUVJROW_SME)
2725
- if (TestCpuFlag(kCpuHasSME)) {
2726
- ARGBToUVJRow = ARGBToUVJRow_Any_SME;
2727
- if (IS_ALIGNED(width, 2)) {
2728
- ARGBToUVJRow = ARGBToUVJRow_SME;
2729
- }
2730
- }
2731
- #endif
2732
- #if defined(HAS_ARGBTOYJROW_LSX) && defined(HAS_ARGBTOUVJROW_LSX)
2733
- if (TestCpuFlag(kCpuHasLSX)) {
2734
- ARGBToYJRow = ARGBToYJRow_Any_LSX;
2735
- ARGBToUVJRow = ARGBToUVJRow_Any_LSX;
2736
- if (IS_ALIGNED(width, 16)) {
2737
- ARGBToYJRow = ARGBToYJRow_LSX;
2738
- ARGBToUVJRow = ARGBToUVJRow_LSX;
2739
- }
2740
- }
2741
- #endif
2742
- #if defined(HAS_ARGBTOYJROW_LASX) && defined(HAS_ARGBTOUVJROW_LASX)
2743
- if (TestCpuFlag(kCpuHasLASX)) {
2744
- ARGBToYJRow = ARGBToYJRow_Any_LASX;
2745
- ARGBToUVJRow = ARGBToUVJRow_Any_LASX;
2746
- if (IS_ALIGNED(width, 32)) {
2747
- ARGBToYJRow = ARGBToYJRow_LASX;
2748
- ARGBToUVJRow = ARGBToUVJRow_LASX;
2749
- }
2750
- }
2751
- #endif
2752
- #if defined(HAS_ARGBTOYJROW_RVV)
2753
- if (TestCpuFlag(kCpuHasRVV)) {
2754
- ARGBToYJRow = ARGBToYJRow_RVV;
2755
- }
2756
- #endif
2757
-
2758
- for (y = 0; y < height; ++y) {
2759
- ARGBToUVJRow(src_argb, 0, dst_uj, dst_vj, width);
2760
- ARGBToYJRow(src_argb, dst_yj, width);
2761
- src_argb += src_stride_argb;
2762
- dst_yj += dst_stride_yj;
2763
- dst_uj += dst_stride_uj;
2764
- dst_vj += dst_stride_vj;
2765
- }
2766
- return 0;
2767
- }
2768
-
2769
- // Convert ARGB to J400.
2770
- LIBYUV_API
2771
- int ARGBToJ400(const uint8_t* src_argb,
2772
- int src_stride_argb,
2773
- uint8_t* dst_yj,
2774
- int dst_stride_yj,
2775
- int width,
2776
- int height) {
2777
- int y;
2778
- void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_yj, int width) =
2779
- ARGBToYJRow_C;
2780
- if (!src_argb || !dst_yj || width <= 0 || height == 0) {
2781
- return -1;
2782
- }
2783
- if (height < 0) {
2784
- height = -height;
2785
- src_argb = src_argb + (height - 1) * src_stride_argb;
2786
- src_stride_argb = -src_stride_argb;
2787
- }
2788
- // Coalesce rows.
2789
- if (src_stride_argb == width * 4 && dst_stride_yj == width) {
2790
- width *= height;
2791
- height = 1;
2792
- src_stride_argb = dst_stride_yj = 0;
2793
- }
2794
- #if defined(HAS_ARGBTOYJROW_SSSE3)
2795
- if (TestCpuFlag(kCpuHasSSSE3)) {
2796
- ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
2797
- if (IS_ALIGNED(width, 16)) {
2798
- ARGBToYJRow = ARGBToYJRow_SSSE3;
2799
- }
2800
- }
2801
- #endif
2802
- #if defined(HAS_ARGBTOYJROW_AVX2)
2803
- if (TestCpuFlag(kCpuHasAVX2)) {
2804
- ARGBToYJRow = ARGBToYJRow_Any_AVX2;
2805
- if (IS_ALIGNED(width, 32)) {
2806
- ARGBToYJRow = ARGBToYJRow_AVX2;
2807
- }
2808
- }
2809
- #endif
2810
- #if defined(HAS_ARGBTOYJROW_NEON)
2811
- if (TestCpuFlag(kCpuHasNEON)) {
2812
- ARGBToYJRow = ARGBToYJRow_Any_NEON;
2813
- if (IS_ALIGNED(width, 16)) {
2814
- ARGBToYJRow = ARGBToYJRow_NEON;
2815
- }
2816
- }
2817
- #endif
2818
- #if defined(HAS_ARGBTOYJROW_NEON_DOTPROD)
2819
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2820
- ARGBToYJRow = ARGBToYJRow_Any_NEON_DotProd;
2821
- if (IS_ALIGNED(width, 16)) {
2822
- ARGBToYJRow = ARGBToYJRow_NEON_DotProd;
2823
- }
2824
- }
2825
- #endif
2826
- #if defined(HAS_ARGBTOYJROW_RVV)
2827
- if (TestCpuFlag(kCpuHasRVV)) {
2828
- ARGBToYJRow = ARGBToYJRow_RVV;
2829
- }
2830
- #endif
2831
-
2832
- for (y = 0; y < height; ++y) {
2833
- ARGBToYJRow(src_argb, dst_yj, width);
2834
- src_argb += src_stride_argb;
2835
- dst_yj += dst_stride_yj;
2836
- }
2837
- return 0;
2838
- }
2839
-
2840
- // Convert RGBA to J400.
2841
- LIBYUV_API
2842
- int RGBAToJ400(const uint8_t* src_rgba,
2843
- int src_stride_rgba,
2844
- uint8_t* dst_yj,
2845
- int dst_stride_yj,
2846
- int width,
2847
- int height) {
2848
- int y;
2849
- void (*RGBAToYJRow)(const uint8_t* src_rgba, uint8_t* dst_yj, int width) =
2850
- RGBAToYJRow_C;
2851
- if (!src_rgba || !dst_yj || width <= 0 || height == 0) {
2852
- return -1;
2853
- }
2854
- if (height < 0) {
2855
- height = -height;
2856
- src_rgba = src_rgba + (height - 1) * src_stride_rgba;
2857
- src_stride_rgba = -src_stride_rgba;
2858
- }
2859
- // Coalesce rows.
2860
- if (src_stride_rgba == width * 4 && dst_stride_yj == width) {
2861
- width *= height;
2862
- height = 1;
2863
- src_stride_rgba = dst_stride_yj = 0;
2864
- }
2865
- #if defined(HAS_RGBATOYJROW_SSSE3)
2866
- if (TestCpuFlag(kCpuHasSSSE3)) {
2867
- RGBAToYJRow = RGBAToYJRow_Any_SSSE3;
2868
- if (IS_ALIGNED(width, 16)) {
2869
- RGBAToYJRow = RGBAToYJRow_SSSE3;
2870
- }
2871
- }
2872
- #endif
2873
- #if defined(HAS_RGBATOYJROW_AVX2)
2874
- if (TestCpuFlag(kCpuHasAVX2)) {
2875
- RGBAToYJRow = RGBAToYJRow_Any_AVX2;
2876
- if (IS_ALIGNED(width, 32)) {
2877
- RGBAToYJRow = RGBAToYJRow_AVX2;
2878
- }
2879
- }
2880
- #endif
2881
- #if defined(HAS_RGBATOYJROW_NEON)
2882
- if (TestCpuFlag(kCpuHasNEON)) {
2883
- RGBAToYJRow = RGBAToYJRow_Any_NEON;
2884
- if (IS_ALIGNED(width, 16)) {
2885
- RGBAToYJRow = RGBAToYJRow_NEON;
2886
- }
2887
- }
2888
- #endif
2889
- #if defined(HAS_RGBATOYJROW_NEON_DOTPROD)
2890
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2891
- RGBAToYJRow = RGBAToYJRow_Any_NEON_DotProd;
2892
- if (IS_ALIGNED(width, 16)) {
2893
- RGBAToYJRow = RGBAToYJRow_NEON_DotProd;
2894
- }
2895
- }
2896
- #endif
2897
- #if defined(HAS_RGBATOYJROW_LSX)
2898
- if (TestCpuFlag(kCpuHasLSX)) {
2899
- RGBAToYJRow = RGBAToYJRow_Any_LSX;
2900
- if (IS_ALIGNED(width, 16)) {
2901
- RGBAToYJRow = RGBAToYJRow_LSX;
2902
- }
2903
- }
2904
- #endif
2905
- #if defined(HAS_RGBATOYJROW_LASX)
2906
- if (TestCpuFlag(kCpuHasLASX)) {
2907
- RGBAToYJRow = RGBAToYJRow_Any_LASX;
2908
- if (IS_ALIGNED(width, 32)) {
2909
- RGBAToYJRow = RGBAToYJRow_LASX;
2910
- }
2911
- }
2912
- #endif
2913
- #if defined(HAS_RGBATOYJROW_RVV)
2914
- if (TestCpuFlag(kCpuHasRVV)) {
2915
- RGBAToYJRow = RGBAToYJRow_RVV;
2916
- }
2917
- #endif
2918
-
2919
- for (y = 0; y < height; ++y) {
2920
- RGBAToYJRow(src_rgba, dst_yj, width);
2921
- src_rgba += src_stride_rgba;
2922
- dst_yj += dst_stride_yj;
2923
- }
2924
- return 0;
2925
- }
2926
-
2927
- // Convert ABGR to J420. (JPeg full range I420).
2928
- LIBYUV_API
2929
- int ABGRToJ420(const uint8_t* src_abgr,
2930
- int src_stride_abgr,
2931
- uint8_t* dst_yj,
2932
- int dst_stride_yj,
2933
- uint8_t* dst_uj,
2934
- int dst_stride_uj,
2935
- uint8_t* dst_vj,
2936
- int dst_stride_vj,
2937
- int width,
2938
- int height) {
2939
- int y;
2940
- void (*ABGRToUVJRow)(const uint8_t* src_abgr0, int src_stride_abgr,
2941
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
2942
- ABGRToUVJRow_C;
2943
- void (*ABGRToYJRow)(const uint8_t* src_abgr, uint8_t* dst_yj, int width) =
2944
- ABGRToYJRow_C;
2945
- if (!src_abgr || !dst_yj || !dst_uj || !dst_vj || width <= 0 || height == 0) {
2946
- return -1;
2947
- }
2948
- // Negative height means invert the image.
2949
- if (height < 0) {
2950
- height = -height;
2951
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
2952
- src_stride_abgr = -src_stride_abgr;
2953
- }
2954
- #if defined(HAS_ABGRTOYJROW_SSSE3)
2955
- if (TestCpuFlag(kCpuHasSSSE3)) {
2956
- ABGRToYJRow = ABGRToYJRow_Any_SSSE3;
2957
- if (IS_ALIGNED(width, 16)) {
2958
- ABGRToYJRow = ABGRToYJRow_SSSE3;
2959
- }
2960
- }
2961
- #endif
2962
- #if defined(HAS_ABGRTOUVJROW_SSSE3)
2963
- if (TestCpuFlag(kCpuHasSSSE3)) {
2964
- ABGRToUVJRow = ABGRToUVJRow_Any_SSSE3;
2965
- if (IS_ALIGNED(width, 16)) {
2966
- ABGRToUVJRow = ABGRToUVJRow_SSSE3;
2967
- }
2968
- }
2969
- #endif
2970
- #if defined(HAS_ABGRTOYJROW_AVX2)
2971
- if (TestCpuFlag(kCpuHasAVX2)) {
2972
- ABGRToYJRow = ABGRToYJRow_Any_AVX2;
2973
- if (IS_ALIGNED(width, 32)) {
2974
- ABGRToYJRow = ABGRToYJRow_AVX2;
2975
- }
2976
- }
2977
- #endif
2978
- #if defined(HAS_ABGRTOUVJROW_AVX2)
2979
- if (TestCpuFlag(kCpuHasAVX2)) {
2980
- ABGRToUVJRow = ABGRToUVJRow_Any_AVX2;
2981
- if (IS_ALIGNED(width, 32)) {
2982
- ABGRToUVJRow = ABGRToUVJRow_AVX2;
2983
- }
2984
- }
2985
- #endif
2986
- #if defined(HAS_ABGRTOYJROW_NEON)
2987
- if (TestCpuFlag(kCpuHasNEON)) {
2988
- ABGRToYJRow = ABGRToYJRow_Any_NEON;
2989
- if (IS_ALIGNED(width, 16)) {
2990
- ABGRToYJRow = ABGRToYJRow_NEON;
2991
- }
2992
- }
2993
- #endif
2994
- #if defined(HAS_ABGRTOYJROW_NEON_DOTPROD)
2995
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
2996
- ABGRToYJRow = ABGRToYJRow_Any_NEON_DotProd;
2997
- if (IS_ALIGNED(width, 16)) {
2998
- ABGRToYJRow = ABGRToYJRow_NEON_DotProd;
2999
- }
3000
- }
3001
- #endif
3002
- #if defined(HAS_ABGRTOUVJROW_NEON)
3003
- if (TestCpuFlag(kCpuHasNEON)) {
3004
- ABGRToUVJRow = ABGRToUVJRow_Any_NEON;
3005
- if (IS_ALIGNED(width, 16)) {
3006
- ABGRToUVJRow = ABGRToUVJRow_NEON;
3007
- }
3008
- }
3009
- #endif
3010
- #if defined(HAS_ABGRTOUVJROW_NEON_I8MM)
3011
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
3012
- ABGRToUVJRow = ABGRToUVJRow_Any_NEON_I8MM;
3013
- if (IS_ALIGNED(width, 16)) {
3014
- ABGRToUVJRow = ABGRToUVJRow_NEON_I8MM;
3015
- }
3016
- }
3017
- #endif
3018
- #if defined(HAS_ABGRTOUVJROW_SVE2)
3019
- if (TestCpuFlag(kCpuHasSVE2)) {
3020
- ABGRToUVJRow = ABGRToUVJRow_Any_SVE2;
3021
- if (IS_ALIGNED(width, 2)) {
3022
- ABGRToUVJRow = ABGRToUVJRow_SVE2;
3023
- }
3024
- }
3025
- #endif
3026
- #if defined(HAS_ABGRTOUVJROW_SME)
3027
- if (TestCpuFlag(kCpuHasSME)) {
3028
- ABGRToUVJRow = ABGRToUVJRow_Any_SME;
3029
- if (IS_ALIGNED(width, 2)) {
3030
- ABGRToUVJRow = ABGRToUVJRow_SME;
3031
- }
3032
- }
3033
- #endif
3034
- #if defined(HAS_ABGRTOYJROW_LSX)
3035
- if (TestCpuFlag(kCpuHasLSX)) {
3036
- ABGRToYJRow = ABGRToYJRow_Any_LSX;
3037
- if (IS_ALIGNED(width, 16)) {
3038
- ABGRToYJRow = ABGRToYJRow_LSX;
3039
- }
3040
- }
3041
- #endif
3042
- #if defined(HAS_ABGRTOYJROW_LASX)
3043
- if (TestCpuFlag(kCpuHasLASX)) {
3044
- ABGRToYJRow = ABGRToYJRow_Any_LASX;
3045
- if (IS_ALIGNED(width, 32)) {
3046
- ABGRToYJRow = ABGRToYJRow_LASX;
3047
- }
3048
- }
3049
- #endif
3050
- #if defined(HAS_ABGRTOYJROW_RVV)
3051
- if (TestCpuFlag(kCpuHasRVV)) {
3052
- ABGRToYJRow = ABGRToYJRow_RVV;
3053
- }
3054
- #endif
3055
-
3056
- for (y = 0; y < height - 1; y += 2) {
3057
- ABGRToUVJRow(src_abgr, src_stride_abgr, dst_uj, dst_vj, width);
3058
- ABGRToYJRow(src_abgr, dst_yj, width);
3059
- ABGRToYJRow(src_abgr + src_stride_abgr, dst_yj + dst_stride_yj, width);
3060
- src_abgr += src_stride_abgr * 2;
3061
- dst_yj += dst_stride_yj * 2;
3062
- dst_uj += dst_stride_uj;
3063
- dst_vj += dst_stride_vj;
3064
- }
3065
- if (height & 1) {
3066
- ABGRToUVJRow(src_abgr, 0, dst_uj, dst_vj, width);
3067
- ABGRToYJRow(src_abgr, dst_yj, width);
3068
- }
3069
- return 0;
3070
- }
3071
-
3072
- // Convert ABGR to J422. (JPeg full range I422).
3073
- LIBYUV_API
3074
- int ABGRToJ422(const uint8_t* src_abgr,
3075
- int src_stride_abgr,
3076
- uint8_t* dst_yj,
3077
- int dst_stride_yj,
3078
- uint8_t* dst_uj,
3079
- int dst_stride_uj,
3080
- uint8_t* dst_vj,
3081
- int dst_stride_vj,
3082
- int width,
3083
- int height) {
3084
- int y;
3085
- void (*ABGRToUVJRow)(const uint8_t* src_abgr0, int src_stride_abgr,
3086
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
3087
- ABGRToUVJRow_C;
3088
- void (*ABGRToYJRow)(const uint8_t* src_abgr, uint8_t* dst_yj, int width) =
3089
- ABGRToYJRow_C;
3090
- if (!src_abgr || !dst_yj || !dst_uj || !dst_vj || width <= 0 || height == 0) {
3091
- return -1;
3092
- }
3093
- // Negative height means invert the image.
3094
- if (height < 0) {
3095
- height = -height;
3096
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
3097
- src_stride_abgr = -src_stride_abgr;
3098
- }
3099
- // Coalesce rows.
3100
- if (src_stride_abgr == width * 4 && dst_stride_yj == width &&
3101
- dst_stride_uj * 2 == width && dst_stride_vj * 2 == width) {
3102
- width *= height;
3103
- height = 1;
3104
- src_stride_abgr = dst_stride_yj = dst_stride_uj = dst_stride_vj = 0;
3105
- }
3106
- #if defined(HAS_ABGRTOYJROW_SSSE3)
3107
- if (TestCpuFlag(kCpuHasSSSE3)) {
3108
- ABGRToYJRow = ABGRToYJRow_Any_SSSE3;
3109
- if (IS_ALIGNED(width, 16)) {
3110
- ABGRToYJRow = ABGRToYJRow_SSSE3;
3111
- }
3112
- }
3113
- #endif
3114
- #if defined(HAS_ABGRTOUVJROW_SSSE3)
3115
- if (TestCpuFlag(kCpuHasSSSE3)) {
3116
- ABGRToUVJRow = ABGRToUVJRow_Any_SSSE3;
3117
- if (IS_ALIGNED(width, 16)) {
3118
- ABGRToUVJRow = ABGRToUVJRow_SSSE3;
3119
- }
3120
- }
3121
- #endif
3122
- #if defined(HAS_ABGRTOYJROW_AVX2)
3123
- if (TestCpuFlag(kCpuHasAVX2)) {
3124
- ABGRToYJRow = ABGRToYJRow_Any_AVX2;
3125
- if (IS_ALIGNED(width, 32)) {
3126
- ABGRToYJRow = ABGRToYJRow_AVX2;
3127
- }
3128
- }
3129
- #endif
3130
- #if defined(HAS_ABGRTOUVJROW_AVX2)
3131
- if (TestCpuFlag(kCpuHasAVX2)) {
3132
- ABGRToUVJRow = ABGRToUVJRow_Any_AVX2;
3133
- if (IS_ALIGNED(width, 32)) {
3134
- ABGRToUVJRow = ABGRToUVJRow_AVX2;
3135
- }
3136
- }
3137
- #endif
3138
- #if defined(HAS_ABGRTOYJROW_NEON)
3139
- if (TestCpuFlag(kCpuHasNEON)) {
3140
- ABGRToYJRow = ABGRToYJRow_Any_NEON;
3141
- if (IS_ALIGNED(width, 16)) {
3142
- ABGRToYJRow = ABGRToYJRow_NEON;
3143
- }
3144
- }
3145
- #endif
3146
- #if defined(HAS_ABGRTOYJROW_NEON_DOTPROD)
3147
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
3148
- ABGRToYJRow = ABGRToYJRow_Any_NEON_DotProd;
3149
- if (IS_ALIGNED(width, 16)) {
3150
- ABGRToYJRow = ABGRToYJRow_NEON_DotProd;
3151
- }
3152
- }
3153
- #endif
3154
- #if defined(HAS_ABGRTOUVJROW_NEON)
3155
- if (TestCpuFlag(kCpuHasNEON)) {
3156
- ABGRToUVJRow = ABGRToUVJRow_Any_NEON;
3157
- if (IS_ALIGNED(width, 16)) {
3158
- ABGRToUVJRow = ABGRToUVJRow_NEON;
3159
- }
3160
- }
3161
- #endif
3162
- #if defined(HAS_ABGRTOUVJROW_NEON_I8MM)
3163
- if (TestCpuFlag(kCpuHasNeonI8MM)) {
3164
- ABGRToUVJRow = ABGRToUVJRow_Any_NEON_I8MM;
3165
- if (IS_ALIGNED(width, 16)) {
3166
- ABGRToUVJRow = ABGRToUVJRow_NEON_I8MM;
3167
- }
3168
- }
3169
- #endif
3170
- #if defined(HAS_ABGRTOUVJROW_SVE2)
3171
- if (TestCpuFlag(kCpuHasSVE2)) {
3172
- ABGRToUVJRow = ABGRToUVJRow_Any_SVE2;
3173
- if (IS_ALIGNED(width, 2)) {
3174
- ABGRToUVJRow = ABGRToUVJRow_SVE2;
3175
- }
3176
- }
3177
- #endif
3178
- #if defined(HAS_ABGRTOUVJROW_SME)
3179
- if (TestCpuFlag(kCpuHasSME)) {
3180
- ABGRToUVJRow = ABGRToUVJRow_Any_SME;
3181
- if (IS_ALIGNED(width, 2)) {
3182
- ABGRToUVJRow = ABGRToUVJRow_SME;
3183
- }
3184
- }
3185
- #endif
3186
- #if defined(HAS_ABGRTOYJROW_LSX)
3187
- if (TestCpuFlag(kCpuHasLSX)) {
3188
- ABGRToYJRow = ABGRToYJRow_Any_LSX;
3189
- if (IS_ALIGNED(width, 16)) {
3190
- ABGRToYJRow = ABGRToYJRow_LSX;
3191
- }
3192
- }
3193
- #endif
3194
- #if defined(HAS_ABGRTOYJROW_LASX)
3195
- if (TestCpuFlag(kCpuHasLASX)) {
3196
- ABGRToYJRow = ABGRToYJRow_Any_LASX;
3197
- if (IS_ALIGNED(width, 32)) {
3198
- ABGRToYJRow = ABGRToYJRow_LASX;
3199
- }
3200
- }
3201
- #endif
3202
- #if defined(HAS_ABGRTOYJROW_RVV)
3203
- if (TestCpuFlag(kCpuHasRVV)) {
3204
- ABGRToYJRow = ABGRToYJRow_RVV;
3205
- }
3206
- #endif
3207
-
3208
- for (y = 0; y < height; ++y) {
3209
- ABGRToUVJRow(src_abgr, 0, dst_uj, dst_vj, width);
3210
- ABGRToYJRow(src_abgr, dst_yj, width);
3211
- src_abgr += src_stride_abgr;
3212
- dst_yj += dst_stride_yj;
3213
- dst_uj += dst_stride_uj;
3214
- dst_vj += dst_stride_vj;
3215
- }
3216
- return 0;
3217
- }
3218
-
3219
- // Convert ABGR to J400.
3220
- LIBYUV_API
3221
- int ABGRToJ400(const uint8_t* src_abgr,
3222
- int src_stride_abgr,
3223
- uint8_t* dst_yj,
3224
- int dst_stride_yj,
3225
- int width,
3226
- int height) {
3227
- int y;
3228
- void (*ABGRToYJRow)(const uint8_t* src_abgr, uint8_t* dst_yj, int width) =
3229
- ABGRToYJRow_C;
3230
- if (!src_abgr || !dst_yj || width <= 0 || height == 0) {
3231
- return -1;
3232
- }
3233
- if (height < 0) {
3234
- height = -height;
3235
- src_abgr = src_abgr + (height - 1) * src_stride_abgr;
3236
- src_stride_abgr = -src_stride_abgr;
3237
- }
3238
- // Coalesce rows.
3239
- if (src_stride_abgr == width * 4 && dst_stride_yj == width) {
3240
- width *= height;
3241
- height = 1;
3242
- src_stride_abgr = dst_stride_yj = 0;
3243
- }
3244
- #if defined(HAS_ABGRTOYJROW_SSSE3)
3245
- if (TestCpuFlag(kCpuHasSSSE3)) {
3246
- ABGRToYJRow = ABGRToYJRow_Any_SSSE3;
3247
- if (IS_ALIGNED(width, 16)) {
3248
- ABGRToYJRow = ABGRToYJRow_SSSE3;
3249
- }
3250
- }
3251
- #endif
3252
- #if defined(HAS_ABGRTOYJROW_AVX2)
3253
- if (TestCpuFlag(kCpuHasAVX2)) {
3254
- ABGRToYJRow = ABGRToYJRow_Any_AVX2;
3255
- if (IS_ALIGNED(width, 32)) {
3256
- ABGRToYJRow = ABGRToYJRow_AVX2;
3257
- }
3258
- }
3259
- #endif
3260
- #if defined(HAS_ABGRTOYJROW_NEON)
3261
- if (TestCpuFlag(kCpuHasNEON)) {
3262
- ABGRToYJRow = ABGRToYJRow_Any_NEON;
3263
- if (IS_ALIGNED(width, 16)) {
3264
- ABGRToYJRow = ABGRToYJRow_NEON;
3265
- }
3266
- }
3267
- #endif
3268
- #if defined(HAS_ABGRTOYJROW_NEON_DOTPROD)
3269
- if (TestCpuFlag(kCpuHasNeonDotProd)) {
3270
- ABGRToYJRow = ABGRToYJRow_Any_NEON_DotProd;
3271
- if (IS_ALIGNED(width, 16)) {
3272
- ABGRToYJRow = ABGRToYJRow_NEON_DotProd;
3273
- }
3274
- }
3275
- #endif
3276
- #if defined(HAS_ABGRTOYJROW_LSX)
3277
- if (TestCpuFlag(kCpuHasLSX)) {
3278
- ABGRToYJRow = ABGRToYJRow_Any_LSX;
3279
- if (IS_ALIGNED(width, 16)) {
3280
- ABGRToYJRow = ABGRToYJRow_LSX;
3281
- }
3282
- }
3283
- #endif
3284
- #if defined(HAS_ABGRTOYJROW_LASX)
3285
- if (TestCpuFlag(kCpuHasLASX)) {
3286
- ABGRToYJRow = ABGRToYJRow_Any_LASX;
3287
- if (IS_ALIGNED(width, 32)) {
3288
- ABGRToYJRow = ABGRToYJRow_LASX;
3289
- }
3290
- }
3291
- #endif
3292
- #if defined(HAS_ABGRTOYJROW_RVV)
3293
- if (TestCpuFlag(kCpuHasRVV)) {
3294
- ABGRToYJRow = ABGRToYJRow_RVV;
3295
- }
3296
- #endif
3297
-
3298
- for (y = 0; y < height; ++y) {
3299
- ABGRToYJRow(src_abgr, dst_yj, width);
3300
- src_abgr += src_stride_abgr;
3301
- dst_yj += dst_stride_yj;
3302
- }
3303
- return 0;
3304
- }
3305
-
3306
- // Convert ARGB to AR64.
3307
- LIBYUV_API
3308
- int ARGBToAR64(const uint8_t* src_argb,
3309
- int src_stride_argb,
3310
- uint16_t* dst_ar64,
3311
- int dst_stride_ar64,
3312
- int width,
3313
- int height) {
3314
- int y;
3315
- void (*ARGBToAR64Row)(const uint8_t* src_argb, uint16_t* dst_ar64,
3316
- int width) = ARGBToAR64Row_C;
3317
- if (!src_argb || !dst_ar64 || width <= 0 || height == 0) {
3318
- return -1;
3319
- }
3320
- // Negative height means invert the image.
3321
- if (height < 0) {
3322
- height = -height;
3323
- src_argb = src_argb + (height - 1) * src_stride_argb;
3324
- src_stride_argb = -src_stride_argb;
3325
- }
3326
- // Coalesce rows.
3327
- if (src_stride_argb == width * 4 && dst_stride_ar64 == width * 4) {
3328
- width *= height;
3329
- height = 1;
3330
- src_stride_argb = dst_stride_ar64 = 0;
3331
- }
3332
- #if defined(HAS_ARGBTOAR64ROW_SSSE3)
3333
- if (TestCpuFlag(kCpuHasSSSE3)) {
3334
- ARGBToAR64Row = ARGBToAR64Row_Any_SSSE3;
3335
- if (IS_ALIGNED(width, 4)) {
3336
- ARGBToAR64Row = ARGBToAR64Row_SSSE3;
3337
- }
3338
- }
3339
- #endif
3340
- #if defined(HAS_ARGBTOAR64ROW_AVX2)
3341
- if (TestCpuFlag(kCpuHasAVX2)) {
3342
- ARGBToAR64Row = ARGBToAR64Row_Any_AVX2;
3343
- if (IS_ALIGNED(width, 8)) {
3344
- ARGBToAR64Row = ARGBToAR64Row_AVX2;
3345
- }
3346
- }
3347
- #endif
3348
- #if defined(HAS_ARGBTOAR64ROW_NEON)
3349
- if (TestCpuFlag(kCpuHasNEON)) {
3350
- ARGBToAR64Row = ARGBToAR64Row_Any_NEON;
3351
- if (IS_ALIGNED(width, 8)) {
3352
- ARGBToAR64Row = ARGBToAR64Row_NEON;
3353
- }
3354
- }
3355
- #endif
3356
- #if defined(HAS_ARGBTOAR64ROW_RVV)
3357
- if (TestCpuFlag(kCpuHasRVV)) {
3358
- ARGBToAR64Row = ARGBToAR64Row_RVV;
3359
- }
3360
- #endif
3361
-
3362
- for (y = 0; y < height; ++y) {
3363
- ARGBToAR64Row(src_argb, dst_ar64, width);
3364
- src_argb += src_stride_argb;
3365
- dst_ar64 += dst_stride_ar64;
3366
- }
3367
- return 0;
3368
- }
3369
-
3370
- // Convert ARGB to AB64.
3371
- LIBYUV_API
3372
- int ARGBToAB64(const uint8_t* src_argb,
3373
- int src_stride_argb,
3374
- uint16_t* dst_ab64,
3375
- int dst_stride_ab64,
3376
- int width,
3377
- int height) {
3378
- int y;
3379
- void (*ARGBToAB64Row)(const uint8_t* src_argb, uint16_t* dst_ar64,
3380
- int width) = ARGBToAB64Row_C;
3381
- if (!src_argb || !dst_ab64 || width <= 0 || height == 0) {
3382
- return -1;
3383
- }
3384
- // Negative height means invert the image.
3385
- if (height < 0) {
3386
- height = -height;
3387
- src_argb = src_argb + (height - 1) * src_stride_argb;
3388
- src_stride_argb = -src_stride_argb;
3389
- }
3390
- // Coalesce rows.
3391
- if (src_stride_argb == width * 4 && dst_stride_ab64 == width * 4) {
3392
- width *= height;
3393
- height = 1;
3394
- src_stride_argb = dst_stride_ab64 = 0;
3395
- }
3396
- #if defined(HAS_ARGBTOAB64ROW_SSSE3)
3397
- if (TestCpuFlag(kCpuHasSSSE3)) {
3398
- ARGBToAB64Row = ARGBToAB64Row_Any_SSSE3;
3399
- if (IS_ALIGNED(width, 4)) {
3400
- ARGBToAB64Row = ARGBToAB64Row_SSSE3;
3401
- }
3402
- }
3403
- #endif
3404
- #if defined(HAS_ARGBTOAB64ROW_AVX2)
3405
- if (TestCpuFlag(kCpuHasAVX2)) {
3406
- ARGBToAB64Row = ARGBToAB64Row_Any_AVX2;
3407
- if (IS_ALIGNED(width, 8)) {
3408
- ARGBToAB64Row = ARGBToAB64Row_AVX2;
3409
- }
3410
- }
3411
- #endif
3412
- #if defined(HAS_ARGBTOAB64ROW_NEON)
3413
- if (TestCpuFlag(kCpuHasNEON)) {
3414
- ARGBToAB64Row = ARGBToAB64Row_Any_NEON;
3415
- if (IS_ALIGNED(width, 8)) {
3416
- ARGBToAB64Row = ARGBToAB64Row_NEON;
3417
- }
3418
- }
3419
- #endif
3420
- #if defined(HAS_ARGBTOAB64ROW_RVV)
3421
- if (TestCpuFlag(kCpuHasRVV)) {
3422
- ARGBToAB64Row = ARGBToAB64Row_RVV;
3423
- }
3424
- #endif
3425
-
3426
- for (y = 0; y < height; ++y) {
3427
- ARGBToAB64Row(src_argb, dst_ab64, width);
3428
- src_argb += src_stride_argb;
3429
- dst_ab64 += dst_stride_ab64;
3430
- }
3431
- return 0;
3432
- }
3433
-
3434
- // Enabled if 1 pass is available
3435
- #if defined(HAS_RAWTOYJROW_NEON) || defined(HAS_RAWTOYJROW_RVV)
3436
- #define HAS_RAWTOYJROW
3437
- #endif
3438
-
3439
- // RAW to JNV21 full range NV21
3440
- LIBYUV_API
3441
- int RAWToJNV21(const uint8_t* src_raw,
3442
- int src_stride_raw,
3443
- uint8_t* dst_y,
3444
- int dst_stride_y,
3445
- uint8_t* dst_vu,
3446
- int dst_stride_vu,
3447
- int width,
3448
- int height) {
3449
- int y;
3450
- int halfwidth = (width + 1) >> 1;
3451
- #if defined(HAS_RAWTOYJROW)
3452
- void (*RAWToUVJRow)(const uint8_t* src_raw, int src_stride_raw,
3453
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
3454
- RAWToUVJRow_C;
3455
- void (*RAWToYJRow)(const uint8_t* src_raw, uint8_t* dst_y, int width) =
3456
- RAWToYJRow_C;
3457
- #else
3458
- void (*RAWToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) =
3459
- RAWToARGBRow_C;
3460
- void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb,
3461
- uint8_t* dst_uj, uint8_t* dst_vj, int width) =
3462
- ARGBToUVJRow_C;
3463
- void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) =
3464
- ARGBToYJRow_C;
3465
- #endif
3466
- void (*MergeUVRow_)(const uint8_t* src_uj, const uint8_t* src_vj,
3467
- uint8_t* dst_vu, int width) = MergeUVRow_C;
3468
- if (!src_raw || !dst_y || !dst_vu || width <= 0 || height == 0) {
3469
- return -1;
3470
- }
3471
- // Negative height means invert the image.
3472
- if (height < 0) {
3473
- height = -height;
3474
- src_raw = src_raw + (height - 1) * src_stride_raw;
3475
- src_stride_raw = -src_stride_raw;
3476
- }
3477
-
3478
- #if defined(HAS_RAWTOYJROW)
3479
-
3480
- // Neon version does direct RAW to YUV.
3481
- #if defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)
3482
- if (TestCpuFlag(kCpuHasNEON)) {
3483
- RAWToUVJRow = RAWToUVJRow_Any_NEON;
3484
- RAWToYJRow = RAWToYJRow_Any_NEON;
3485
- if (IS_ALIGNED(width, 16)) {
3486
- RAWToYJRow = RAWToYJRow_NEON;
3487
- RAWToUVJRow = RAWToUVJRow_NEON;
3488
- }
3489
- }
3490
- #endif
3491
- #if defined(HAS_RAWTOYJROW_LSX)
3492
- if (TestCpuFlag(kCpuHasLSX)) {
3493
- RAWToYJRow = RAWToYJRow_Any_LSX;
3494
- if (IS_ALIGNED(width, 16)) {
3495
- RAWToYJRow = RAWToYJRow_LSX;
3496
- }
3497
- }
3498
- #endif
3499
- #if defined(HAS_RAWTOYJROW_LASX)
3500
- if (TestCpuFlag(kCpuHasLASX)) {
3501
- RAWToYJRow = RAWToYJRow_Any_LASX;
3502
- if (IS_ALIGNED(width, 32)) {
3503
- RAWToYJRow = RAWToYJRow_LASX;
3504
- }
3505
- }
3506
- #endif
3507
- #if defined(HAS_RAWTOYJROW_RVV)
3508
- if (TestCpuFlag(kCpuHasRVV)) {
3509
- RAWToYJRow = RAWToYJRow_RVV;
3510
- }
3511
- #endif
3512
-
3513
- // Other platforms do intermediate conversion from RAW to ARGB.
3514
- #else // HAS_RAWTOYJROW
3515
-
3516
- #if defined(HAS_RAWTOARGBROW_SSSE3)
3517
- if (TestCpuFlag(kCpuHasSSSE3)) {
3518
- RAWToARGBRow = RAWToARGBRow_Any_SSSE3;
3519
- if (IS_ALIGNED(width, 16)) {
3520
- RAWToARGBRow = RAWToARGBRow_SSSE3;
3521
- }
3522
- }
3523
- #endif
3524
- #if defined(HAS_RAWTOARGBROW_AVX2)
3525
- if (TestCpuFlag(kCpuHasAVX2)) {
3526
- RAWToARGBRow = RAWToARGBRow_Any_AVX2;
3527
- if (IS_ALIGNED(width, 32)) {
3528
- RAWToARGBRow = RAWToARGBRow_AVX2;
3529
- }
3530
- }
3531
- #endif
3532
- #if defined(HAS_ARGBTOYJROW_SSSE3)
3533
- if (TestCpuFlag(kCpuHasSSSE3)) {
3534
- ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
3535
- if (IS_ALIGNED(width, 16)) {
3536
- ARGBToYJRow = ARGBToYJRow_SSSE3;
3537
- }
3538
- }
3539
- #endif
3540
- #if defined(HAS_ARGBTOYJROW_AVX2)
3541
- if (TestCpuFlag(kCpuHasAVX2)) {
3542
- ARGBToYJRow = ARGBToYJRow_Any_AVX2;
3543
- if (IS_ALIGNED(width, 32)) {
3544
- ARGBToYJRow = ARGBToYJRow_AVX2;
3545
- }
3546
- }
3547
- #endif
3548
- #if defined(HAS_ARGBTOUVJROW_SSSE3)
3549
- if (TestCpuFlag(kCpuHasSSSE3)) {
3550
- ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3;
3551
- if (IS_ALIGNED(width, 16)) {
3552
- ARGBToUVJRow = ARGBToUVJRow_SSSE3;
3553
- }
3554
- }
3555
- #endif
3556
- #if defined(HAS_ARGBTOUVJROW_AVX2)
3557
- if (TestCpuFlag(kCpuHasAVX2)) {
3558
- ARGBToUVJRow = ARGBToUVJRow_Any_AVX2;
3559
- if (IS_ALIGNED(width, 32)) {
3560
- ARGBToUVJRow = ARGBToUVJRow_AVX2;
3561
- }
3562
- }
3563
- #endif
3564
- #endif // HAS_RAWTOYJROW
3565
- #if defined(HAS_MERGEUVROW_SSE2)
3566
- if (TestCpuFlag(kCpuHasSSE2)) {
3567
- MergeUVRow_ = MergeUVRow_Any_SSE2;
3568
- if (IS_ALIGNED(halfwidth, 16)) {
3569
- MergeUVRow_ = MergeUVRow_SSE2;
3570
- }
3571
- }
3572
- #endif
3573
- #if defined(HAS_MERGEUVROW_AVX2)
3574
- if (TestCpuFlag(kCpuHasAVX2)) {
3575
- MergeUVRow_ = MergeUVRow_Any_AVX2;
3576
- if (IS_ALIGNED(halfwidth, 16)) {
3577
- MergeUVRow_ = MergeUVRow_AVX2;
3578
- }
3579
- }
3580
- #endif
3581
- #if defined(HAS_MERGEUVROW_AVX512BW)
3582
- if (TestCpuFlag(kCpuHasAVX512BW)) {
3583
- MergeUVRow_ = MergeUVRow_Any_AVX512BW;
3584
- if (IS_ALIGNED(halfwidth, 64)) {
3585
- MergeUVRow_ = MergeUVRow_AVX512BW;
3586
- }
3587
- }
3588
- #endif
3589
- #if defined(HAS_MERGEUVROW_NEON)
3590
- if (TestCpuFlag(kCpuHasNEON)) {
3591
- MergeUVRow_ = MergeUVRow_Any_NEON;
3592
- if (IS_ALIGNED(halfwidth, 16)) {
3593
- MergeUVRow_ = MergeUVRow_NEON;
3594
- }
3595
- }
3596
- #endif
3597
- #if defined(HAS_MERGEUVROW_SME)
3598
- if (TestCpuFlag(kCpuHasSME)) {
3599
- MergeUVRow_ = MergeUVRow_SME;
3600
- }
3601
- #endif
3602
- #if defined(HAS_MERGEUVROW_LSX)
3603
- if (TestCpuFlag(kCpuHasLSX)) {
3604
- MergeUVRow_ = MergeUVRow_Any_LSX;
3605
- if (IS_ALIGNED(halfwidth, 16)) {
3606
- MergeUVRow_ = MergeUVRow_LSX;
3607
- }
3608
- }
3609
- #endif
3610
- #if defined(HAS_MERGEUVROW_RVV)
3611
- if (TestCpuFlag(kCpuHasRVV)) {
3612
- MergeUVRow_ = MergeUVRow_RVV;
3613
- }
3614
- #endif
3615
- {
3616
- #if defined(HAS_RAWTOYJROW)
3617
- // Allocate a row of uv.
3618
- const int row_uv_size = ((halfwidth + 31) & ~31);
3619
- align_buffer_64(row_uj, row_uv_size * 2);
3620
- uint8_t* row_vj = row_uj + row_uv_size;
3621
- #else
3622
- // Allocate row of uv and 2 rows of ARGB.
3623
- const int row_size = ((width * 4 + 31) & ~31);
3624
- const int row_uv_size = ((halfwidth + 31) & ~31);
3625
- align_buffer_64(row_uj, row_uv_size * 2 + row_size * 2);
3626
- uint8_t* row_vj = row_uj + row_uv_size;
3627
- uint8_t* row = row_vj + row_uv_size;
3628
- #endif
3629
- if (!row_uj)
3630
- return 1;
3631
-
3632
- for (y = 0; y < height - 1; y += 2) {
3633
- #if defined(HAS_RAWTOYJROW)
3634
- RAWToUVJRow(src_raw, src_stride_raw, row_uj, row_vj, width);
3635
- MergeUVRow_(row_vj, row_uj, dst_vu, halfwidth);
3636
- RAWToYJRow(src_raw, dst_y, width);
3637
- RAWToYJRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width);
3638
- #else
3639
- RAWToARGBRow(src_raw, row, width);
3640
- RAWToARGBRow(src_raw + src_stride_raw, row + row_size, width);
3641
- ARGBToUVJRow(row, row_size, row_uj, row_vj, width);
3642
- MergeUVRow_(row_vj, row_uj, dst_vu, halfwidth);
3643
- ARGBToYJRow(row, dst_y, width);
3644
- ARGBToYJRow(row + row_size, dst_y + dst_stride_y, width);
3645
- #endif
3646
- src_raw += src_stride_raw * 2;
3647
- dst_y += dst_stride_y * 2;
3648
- dst_vu += dst_stride_vu;
3649
- }
3650
- if (height & 1) {
3651
- #if defined(HAS_RAWTOYJROW)
3652
- RAWToUVJRow(src_raw, 0, row_uj, row_vj, width);
3653
- MergeUVRow_(row_vj, row_uj, dst_vu, halfwidth);
3654
- RAWToYJRow(src_raw, dst_y, width);
3655
- #else
3656
- RAWToARGBRow(src_raw, row, width);
3657
- ARGBToUVJRow(row, 0, row_uj, row_vj, width);
3658
- MergeUVRow_(row_vj, row_uj, dst_vu, halfwidth);
3659
- ARGBToYJRow(row, dst_y, width);
3660
- #endif
3661
- }
3662
- free_aligned_buffer_64(row_uj);
3663
- }
3664
- return 0;
3665
- }
3666
- #undef HAS_RAWTOYJROW
3667
-
3668
- #ifdef __cplusplus
3669
- } // extern "C"
3670
- } // namespace libyuv
3671
- #endif