OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. | 2 * Copyright 2011 The LibYuv Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 width <= 0 || height == 0) { | 810 width <= 0 || height == 0) { |
811 return -1; | 811 return -1; |
812 } | 812 } |
813 // Negative height means invert the image. | 813 // Negative height means invert the image. |
814 if (height < 0) { | 814 if (height < 0) { |
815 height = -height; | 815 height = -height; |
816 src_rgb24 = src_rgb24 + (height - 1) * src_stride_rgb24; | 816 src_rgb24 = src_rgb24 + (height - 1) * src_stride_rgb24; |
817 src_stride_rgb24 = -src_stride_rgb24; | 817 src_stride_rgb24 = -src_stride_rgb24; |
818 } | 818 } |
819 | 819 |
| 820 // Neon version does direct RGB24 to YUV. |
820 #if defined(HAS_RGB24TOYROW_NEON) | 821 #if defined(HAS_RGB24TOYROW_NEON) |
821 if (TestCpuFlag(kCpuHasNEON)) { | 822 if (TestCpuFlag(kCpuHasNEON)) { |
| 823 RGB24ToUVRow = RGB24ToUVRow_Any_NEON; |
822 RGB24ToYRow = RGB24ToYRow_Any_NEON; | 824 RGB24ToYRow = RGB24ToYRow_Any_NEON; |
823 if (IS_ALIGNED(width, 8)) { | 825 if (IS_ALIGNED(width, 8)) { |
824 RGB24ToYRow = RGB24ToYRow_NEON; | 826 RGB24ToYRow = RGB24ToYRow_NEON; |
| 827 if (IS_ALIGNED(width, 16)) { |
| 828 RGB24ToUVRow = RGB24ToUVRow_NEON; |
| 829 } |
825 } | 830 } |
826 } | 831 } |
827 #endif | 832 // Other platforms do intermediate conversion from RGB24 to ARGB. |
828 #if defined(HAS_RGB24TOUVROW_NEON) | 833 #else |
829 if (TestCpuFlag(kCpuHasNEON)) { | |
830 RGB24ToUVRow = RGB24ToUVRow_Any_NEON; | |
831 if (IS_ALIGNED(width, 16)) { | |
832 RGB24ToUVRow = RGB24ToUVRow_NEON; | |
833 } | |
834 } | |
835 #endif | |
836 #if defined(HAS_RGB24TOARGBROW_SSSE3) | 834 #if defined(HAS_RGB24TOARGBROW_SSSE3) |
837 if (TestCpuFlag(kCpuHasSSSE3)) { | 835 if (TestCpuFlag(kCpuHasSSSE3)) { |
838 RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3; | 836 RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3; |
839 if (IS_ALIGNED(width, 16)) { | 837 if (IS_ALIGNED(width, 16)) { |
840 RGB24ToARGBRow = RGB24ToARGBRow_SSSE3; | 838 RGB24ToARGBRow = RGB24ToARGBRow_SSSE3; |
841 } | 839 } |
842 } | 840 } |
843 #endif | 841 #endif |
844 #if defined(HAS_ARGBTOUVROW_SSSE3) | 842 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
845 if (TestCpuFlag(kCpuHasSSSE3)) { | 843 if (TestCpuFlag(kCpuHasSSSE3)) { |
846 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; | 844 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
| 845 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
847 if (IS_ALIGNED(width, 16)) { | 846 if (IS_ALIGNED(width, 16)) { |
848 ARGBToUVRow = ARGBToUVRow_SSSE3; | 847 ARGBToUVRow = ARGBToUVRow_SSSE3; |
| 848 ARGBToYRow = ARGBToYRow_SSSE3; |
849 } | 849 } |
850 } | 850 } |
851 #endif | 851 #endif |
852 #if defined(HAS_ARGBTOUVROW_SSSE3) | 852 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
853 if (TestCpuFlag(kCpuHasSSSE3)) { | 853 if (TestCpuFlag(kCpuHasAVX2)) { |
854 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 854 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
855 if (IS_ALIGNED(width, 16)) { | 855 ARGBToYRow = ARGBToYRow_Any_AVX2; |
856 ARGBToYRow = ARGBToYRow_SSSE3; | 856 if (IS_ALIGNED(width, 32)) { |
| 857 ARGBToUVRow = ARGBToUVRow_AVX2; |
| 858 ARGBToYRow = ARGBToYRow_AVX2; |
857 } | 859 } |
858 } | 860 } |
859 #endif // HAS_ARGBTOUVROW_SSSE3 | 861 #endif |
860 | |
861 { | 862 { |
862 #if !defined(HAS_RGB24TOYROW_NEON) | |
863 // Allocate 2 rows of ARGB. | 863 // Allocate 2 rows of ARGB. |
864 const int kRowSize = (width * 4 + 15) & ~15; | 864 const int kRowSize = (width * 4 + 31) & ~31; |
865 align_buffer_64(row, kRowSize * 2); | 865 align_buffer_64(row, kRowSize * 2); |
866 #endif | 866 #endif |
867 | 867 |
868 for (y = 0; y < height - 1; y += 2) { | 868 for (y = 0; y < height - 1; y += 2) { |
869 #if defined(HAS_RGB24TOYROW_NEON) | 869 #if defined(HAS_RGB24TOYROW_NEON) |
870 RGB24ToUVRow(src_rgb24, src_stride_rgb24, dst_u, dst_v, width); | 870 RGB24ToUVRow(src_rgb24, src_stride_rgb24, dst_u, dst_v, width); |
871 RGB24ToYRow(src_rgb24, dst_y, width); | 871 RGB24ToYRow(src_rgb24, dst_y, width); |
872 RGB24ToYRow(src_rgb24 + src_stride_rgb24, dst_y + dst_stride_y, width); | 872 RGB24ToYRow(src_rgb24 + src_stride_rgb24, dst_y + dst_stride_y, width); |
873 #else | 873 #else |
874 RGB24ToARGBRow(src_rgb24, row, width); | 874 RGB24ToARGBRow(src_rgb24, row, width); |
(...skipping 12 matching lines...) Expand all Loading... |
887 RGB24ToUVRow(src_rgb24, 0, dst_u, dst_v, width); | 887 RGB24ToUVRow(src_rgb24, 0, dst_u, dst_v, width); |
888 RGB24ToYRow(src_rgb24, dst_y, width); | 888 RGB24ToYRow(src_rgb24, dst_y, width); |
889 #else | 889 #else |
890 RGB24ToARGBRow(src_rgb24, row, width); | 890 RGB24ToARGBRow(src_rgb24, row, width); |
891 ARGBToUVRow(row, 0, dst_u, dst_v, width); | 891 ARGBToUVRow(row, 0, dst_u, dst_v, width); |
892 ARGBToYRow(row, dst_y, width); | 892 ARGBToYRow(row, dst_y, width); |
893 #endif | 893 #endif |
894 } | 894 } |
895 #if !defined(HAS_RGB24TOYROW_NEON) | 895 #if !defined(HAS_RGB24TOYROW_NEON) |
896 free_aligned_buffer_64(row); | 896 free_aligned_buffer_64(row); |
| 897 } |
897 #endif | 898 #endif |
898 } | |
899 return 0; | 899 return 0; |
900 } | 900 } |
901 | 901 |
902 // Convert RAW to I420. | 902 // Convert RAW to I420. |
903 LIBYUV_API | 903 LIBYUV_API |
904 int RAWToI420(const uint8* src_raw, int src_stride_raw, | 904 int RAWToI420(const uint8* src_raw, int src_stride_raw, |
905 uint8* dst_y, int dst_stride_y, | 905 uint8* dst_y, int dst_stride_y, |
906 uint8* dst_u, int dst_stride_u, | 906 uint8* dst_u, int dst_stride_u, |
907 uint8* dst_v, int dst_stride_v, | 907 uint8* dst_v, int dst_stride_v, |
908 int width, int height) { | 908 int width, int height) { |
(...skipping 15 matching lines...) Expand all Loading... |
924 width <= 0 || height == 0) { | 924 width <= 0 || height == 0) { |
925 return -1; | 925 return -1; |
926 } | 926 } |
927 // Negative height means invert the image. | 927 // Negative height means invert the image. |
928 if (height < 0) { | 928 if (height < 0) { |
929 height = -height; | 929 height = -height; |
930 src_raw = src_raw + (height - 1) * src_stride_raw; | 930 src_raw = src_raw + (height - 1) * src_stride_raw; |
931 src_stride_raw = -src_stride_raw; | 931 src_stride_raw = -src_stride_raw; |
932 } | 932 } |
933 | 933 |
| 934 // Neon version does direct RAW to YUV. |
934 #if defined(HAS_RAWTOYROW_NEON) | 935 #if defined(HAS_RAWTOYROW_NEON) |
935 if (TestCpuFlag(kCpuHasNEON)) { | 936 if (TestCpuFlag(kCpuHasNEON)) { |
| 937 RAWToUVRow = RAWToUVRow_Any_NEON; |
936 RAWToYRow = RAWToYRow_Any_NEON; | 938 RAWToYRow = RAWToYRow_Any_NEON; |
937 if (IS_ALIGNED(width, 8)) { | 939 if (IS_ALIGNED(width, 8)) { |
938 RAWToYRow = RAWToYRow_NEON; | 940 RAWToYRow = RAWToYRow_NEON; |
| 941 if (IS_ALIGNED(width, 16)) { |
| 942 RAWToUVRow = RAWToUVRow_NEON; |
| 943 } |
939 } | 944 } |
940 } | 945 } |
941 #endif | 946 // Other platforms do intermediate conversion from RAW to ARGB. |
942 #if defined(HAS_RAWTOUVROW_NEON) | 947 #else |
943 if (TestCpuFlag(kCpuHasNEON)) { | |
944 RAWToUVRow = RAWToUVRow_Any_NEON; | |
945 if (IS_ALIGNED(width, 16)) { | |
946 RAWToUVRow = RAWToUVRow_NEON; | |
947 } | |
948 } | |
949 #endif | |
950 #if defined(HAS_RAWTOARGBROW_SSSE3) | 948 #if defined(HAS_RAWTOARGBROW_SSSE3) |
951 if (TestCpuFlag(kCpuHasSSSE3)) { | 949 if (TestCpuFlag(kCpuHasSSSE3)) { |
952 RAWToARGBRow = RAWToARGBRow_Any_SSSE3; | 950 RAWToARGBRow = RAWToARGBRow_Any_SSSE3; |
953 if (IS_ALIGNED(width, 16)) { | 951 if (IS_ALIGNED(width, 16)) { |
954 RAWToARGBRow = RAWToARGBRow_SSSE3; | 952 RAWToARGBRow = RAWToARGBRow_SSSE3; |
955 } | 953 } |
956 } | 954 } |
957 #endif | 955 #endif |
958 #if defined(HAS_ARGBTOUVROW_SSSE3) | 956 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
959 if (TestCpuFlag(kCpuHasSSSE3)) { | 957 if (TestCpuFlag(kCpuHasSSSE3)) { |
960 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; | 958 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
| 959 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
961 if (IS_ALIGNED(width, 16)) { | 960 if (IS_ALIGNED(width, 16)) { |
962 ARGBToUVRow = ARGBToUVRow_SSSE3; | 961 ARGBToUVRow = ARGBToUVRow_SSSE3; |
| 962 ARGBToYRow = ARGBToYRow_SSSE3; |
963 } | 963 } |
964 } | 964 } |
965 #endif | 965 #endif |
966 #if defined(HAS_ARGBTOUVROW_SSSE3) | 966 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
967 if (TestCpuFlag(kCpuHasSSSE3)) { | 967 if (TestCpuFlag(kCpuHasAVX2)) { |
968 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 968 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
969 if (IS_ALIGNED(width, 16)) { | 969 ARGBToYRow = ARGBToYRow_Any_AVX2; |
970 ARGBToYRow = ARGBToYRow_SSSE3; | 970 if (IS_ALIGNED(width, 32)) { |
| 971 ARGBToUVRow = ARGBToUVRow_AVX2; |
| 972 ARGBToYRow = ARGBToYRow_AVX2; |
971 } | 973 } |
972 } | 974 } |
973 #endif // HAS_ARGBTOUVROW_SSSE3 | 975 #endif |
974 | |
975 { | 976 { |
976 // Allocate 2 rows of ARGB. | 977 // Allocate 2 rows of ARGB. |
977 const int kRowSize = (width * 4 + 15) & ~15; | 978 const int kRowSize = (width * 4 + 31) & ~31; |
978 align_buffer_64(row, kRowSize * 2); | 979 align_buffer_64(row, kRowSize * 2); |
| 980 #endif |
979 | 981 |
980 for (y = 0; y < height - 1; y += 2) { | 982 for (y = 0; y < height - 1; y += 2) { |
981 #if defined(HAS_RAWTOYROW_NEON) | 983 #if defined(HAS_RAWTOYROW_NEON) |
982 RAWToUVRow(src_raw, src_stride_raw, dst_u, dst_v, width); | 984 RAWToUVRow(src_raw, src_stride_raw, dst_u, dst_v, width); |
983 RAWToYRow(src_raw, dst_y, width); | 985 RAWToYRow(src_raw, dst_y, width); |
984 RAWToYRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width); | 986 RAWToYRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width); |
985 #else | 987 #else |
986 RAWToARGBRow(src_raw, row, width); | 988 RAWToARGBRow(src_raw, row, width); |
987 RAWToARGBRow(src_raw + src_stride_raw, row + kRowSize, width); | 989 RAWToARGBRow(src_raw + src_stride_raw, row + kRowSize, width); |
988 ARGBToUVRow(row, kRowSize, dst_u, dst_v, width); | 990 ARGBToUVRow(row, kRowSize, dst_u, dst_v, width); |
989 ARGBToYRow(row, dst_y, width); | 991 ARGBToYRow(row, dst_y, width); |
990 ARGBToYRow(row + kRowSize, dst_y + dst_stride_y, width); | 992 ARGBToYRow(row + kRowSize, dst_y + dst_stride_y, width); |
991 #endif | 993 #endif |
992 src_raw += src_stride_raw * 2; | 994 src_raw += src_stride_raw * 2; |
993 dst_y += dst_stride_y * 2; | 995 dst_y += dst_stride_y * 2; |
994 dst_u += dst_stride_u; | 996 dst_u += dst_stride_u; |
995 dst_v += dst_stride_v; | 997 dst_v += dst_stride_v; |
996 } | 998 } |
997 if (height & 1) { | 999 if (height & 1) { |
998 #if defined(HAS_RAWTOYROW_NEON) | 1000 #if defined(HAS_RAWTOYROW_NEON) |
999 RAWToUVRow(src_raw, 0, dst_u, dst_v, width); | 1001 RAWToUVRow(src_raw, 0, dst_u, dst_v, width); |
1000 RAWToYRow(src_raw, dst_y, width); | 1002 RAWToYRow(src_raw, dst_y, width); |
1001 #else | 1003 #else |
1002 RAWToARGBRow(src_raw, row, width); | 1004 RAWToARGBRow(src_raw, row, width); |
1003 ARGBToUVRow(row, 0, dst_u, dst_v, width); | 1005 ARGBToUVRow(row, 0, dst_u, dst_v, width); |
1004 ARGBToYRow(row, dst_y, width); | 1006 ARGBToYRow(row, dst_y, width); |
1005 #endif | 1007 #endif |
1006 } | 1008 } |
1007 #if !defined(HAS_RAWTOYROW_NEON) | 1009 #if !defined(HAS_RAWTOYROW_NEON) |
1008 free_aligned_buffer_64(row); | 1010 free_aligned_buffer_64(row); |
1009 #endif | |
1010 } | 1011 } |
| 1012 #endif |
1011 return 0; | 1013 return 0; |
1012 } | 1014 } |
1013 | 1015 |
1014 // Convert RGB565 to I420. | 1016 // Convert RGB565 to I420. |
1015 LIBYUV_API | 1017 LIBYUV_API |
1016 int RGB565ToI420(const uint8* src_rgb565, int src_stride_rgb565, | 1018 int RGB565ToI420(const uint8* src_rgb565, int src_stride_rgb565, |
1017 uint8* dst_y, int dst_stride_y, | 1019 uint8* dst_y, int dst_stride_y, |
1018 uint8* dst_u, int dst_stride_u, | 1020 uint8* dst_u, int dst_stride_u, |
1019 uint8* dst_v, int dst_stride_v, | 1021 uint8* dst_v, int dst_stride_v, |
1020 int width, int height) { | 1022 int width, int height) { |
(...skipping 15 matching lines...) Expand all Loading... |
1036 width <= 0 || height == 0) { | 1038 width <= 0 || height == 0) { |
1037 return -1; | 1039 return -1; |
1038 } | 1040 } |
1039 // Negative height means invert the image. | 1041 // Negative height means invert the image. |
1040 if (height < 0) { | 1042 if (height < 0) { |
1041 height = -height; | 1043 height = -height; |
1042 src_rgb565 = src_rgb565 + (height - 1) * src_stride_rgb565; | 1044 src_rgb565 = src_rgb565 + (height - 1) * src_stride_rgb565; |
1043 src_stride_rgb565 = -src_stride_rgb565; | 1045 src_stride_rgb565 = -src_stride_rgb565; |
1044 } | 1046 } |
1045 | 1047 |
| 1048 // Neon version does direct RGB565 to YUV. |
1046 #if defined(HAS_RGB565TOYROW_NEON) | 1049 #if defined(HAS_RGB565TOYROW_NEON) |
1047 if (TestCpuFlag(kCpuHasNEON)) { | 1050 if (TestCpuFlag(kCpuHasNEON)) { |
| 1051 RGB565ToUVRow = RGB565ToUVRow_Any_NEON; |
1048 RGB565ToYRow = RGB565ToYRow_Any_NEON; | 1052 RGB565ToYRow = RGB565ToYRow_Any_NEON; |
1049 if (IS_ALIGNED(width, 8)) { | 1053 if (IS_ALIGNED(width, 8)) { |
1050 RGB565ToYRow = RGB565ToYRow_NEON; | 1054 RGB565ToYRow = RGB565ToYRow_NEON; |
1051 } | 1055 if (IS_ALIGNED(width, 16)) { |
1052 RGB565ToUVRow = RGB565ToUVRow_Any_NEON; | 1056 RGB565ToUVRow = RGB565ToUVRow_NEON; |
1053 if (IS_ALIGNED(width, 16)) { | 1057 } |
1054 RGB565ToUVRow = RGB565ToUVRow_NEON; | |
1055 } | 1058 } |
1056 } | 1059 } |
1057 #else // HAS_RGB565TOYROW_NEON | 1060 // Other platforms do intermediate conversion from RGB565 to ARGB. |
1058 | 1061 #else |
1059 #if defined(HAS_RGB565TOARGBROW_SSE2) | 1062 #if defined(HAS_RGB565TOARGBROW_SSE2) |
1060 if (TestCpuFlag(kCpuHasSSE2)) { | 1063 if (TestCpuFlag(kCpuHasSSE2)) { |
1061 RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2; | 1064 RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2; |
1062 if (IS_ALIGNED(width, 8)) { | 1065 if (IS_ALIGNED(width, 8)) { |
1063 RGB565ToARGBRow = RGB565ToARGBRow_SSE2; | 1066 RGB565ToARGBRow = RGB565ToARGBRow_SSE2; |
1064 } | 1067 } |
1065 } | 1068 } |
1066 #endif | 1069 #endif |
1067 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1070 #if defined(HAS_RGB565TOARGBROW_AVX2) |
1068 if (TestCpuFlag(kCpuHasSSSE3)) { | 1071 if (TestCpuFlag(kCpuHasAVX2)) { |
1069 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; | 1072 RGB565ToARGBRow = RGB565ToARGBRow_Any_AVX2; |
1070 if (IS_ALIGNED(width, 16)) { | 1073 if (IS_ALIGNED(width, 16)) { |
1071 ARGBToUVRow = ARGBToUVRow_SSSE3; | 1074 RGB565ToARGBRow = RGB565ToARGBRow_AVX2; |
1072 } | 1075 } |
1073 } | 1076 } |
1074 #endif | 1077 #endif |
1075 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1078 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
1076 if (TestCpuFlag(kCpuHasSSSE3)) { | 1079 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1080 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
1077 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 1081 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
1078 if (IS_ALIGNED(width, 16)) { | 1082 if (IS_ALIGNED(width, 16)) { |
| 1083 ARGBToUVRow = ARGBToUVRow_SSSE3; |
1079 ARGBToYRow = ARGBToYRow_SSSE3; | 1084 ARGBToYRow = ARGBToYRow_SSSE3; |
1080 } | 1085 } |
1081 } | 1086 } |
1082 #endif // HAS_ARGBTOUVROW_SSSE3 | 1087 #endif |
1083 #endif // HAS_RGB565TOYROW_NEON | 1088 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
1084 | 1089 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1090 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
| 1091 ARGBToYRow = ARGBToYRow_Any_AVX2; |
| 1092 if (IS_ALIGNED(width, 32)) { |
| 1093 ARGBToUVRow = ARGBToUVRow_AVX2; |
| 1094 ARGBToYRow = ARGBToYRow_AVX2; |
| 1095 } |
| 1096 } |
| 1097 #endif |
1085 { | 1098 { |
1086 #if !defined(HAS_RGB565TOYROW_NEON) | |
1087 // Allocate 2 rows of ARGB. | 1099 // Allocate 2 rows of ARGB. |
1088 const int kRowSize = (width * 4 + 15) & ~15; | 1100 const int kRowSize = (width * 4 + 31) & ~31; |
1089 align_buffer_64(row, kRowSize * 2); | 1101 align_buffer_64(row, kRowSize * 2); |
1090 #endif | 1102 #endif |
1091 | 1103 |
1092 for (y = 0; y < height - 1; y += 2) { | 1104 for (y = 0; y < height - 1; y += 2) { |
1093 #if defined(HAS_RGB565TOYROW_NEON) | 1105 #if defined(HAS_RGB565TOYROW_NEON) |
1094 RGB565ToUVRow(src_rgb565, src_stride_rgb565, dst_u, dst_v, width); | 1106 RGB565ToUVRow(src_rgb565, src_stride_rgb565, dst_u, dst_v, width); |
1095 RGB565ToYRow(src_rgb565, dst_y, width); | 1107 RGB565ToYRow(src_rgb565, dst_y, width); |
1096 RGB565ToYRow(src_rgb565 + src_stride_rgb565, dst_y + dst_stride_y, width); | 1108 RGB565ToYRow(src_rgb565 + src_stride_rgb565, dst_y + dst_stride_y, width); |
1097 #else | 1109 #else |
1098 RGB565ToARGBRow(src_rgb565, row, width); | 1110 RGB565ToARGBRow(src_rgb565, row, width); |
(...skipping 12 matching lines...) Expand all Loading... |
1111 RGB565ToUVRow(src_rgb565, 0, dst_u, dst_v, width); | 1123 RGB565ToUVRow(src_rgb565, 0, dst_u, dst_v, width); |
1112 RGB565ToYRow(src_rgb565, dst_y, width); | 1124 RGB565ToYRow(src_rgb565, dst_y, width); |
1113 #else | 1125 #else |
1114 RGB565ToARGBRow(src_rgb565, row, width); | 1126 RGB565ToARGBRow(src_rgb565, row, width); |
1115 ARGBToUVRow(row, 0, dst_u, dst_v, width); | 1127 ARGBToUVRow(row, 0, dst_u, dst_v, width); |
1116 ARGBToYRow(row, dst_y, width); | 1128 ARGBToYRow(row, dst_y, width); |
1117 #endif | 1129 #endif |
1118 } | 1130 } |
1119 #if !defined(HAS_RGB565TOYROW_NEON) | 1131 #if !defined(HAS_RGB565TOYROW_NEON) |
1120 free_aligned_buffer_64(row); | 1132 free_aligned_buffer_64(row); |
| 1133 } |
1121 #endif | 1134 #endif |
1122 } | |
1123 return 0; | 1135 return 0; |
1124 } | 1136 } |
1125 | 1137 |
1126 // Convert ARGB1555 to I420. | 1138 // Convert ARGB1555 to I420. |
1127 LIBYUV_API | 1139 LIBYUV_API |
1128 int ARGB1555ToI420(const uint8* src_argb1555, int src_stride_argb1555, | 1140 int ARGB1555ToI420(const uint8* src_argb1555, int src_stride_argb1555, |
1129 uint8* dst_y, int dst_stride_y, | 1141 uint8* dst_y, int dst_stride_y, |
1130 uint8* dst_u, int dst_stride_u, | 1142 uint8* dst_u, int dst_stride_u, |
1131 uint8* dst_v, int dst_stride_v, | 1143 uint8* dst_v, int dst_stride_v, |
1132 int width, int height) { | 1144 int width, int height) { |
(...skipping 15 matching lines...) Expand all Loading... |
1148 width <= 0 || height == 0) { | 1160 width <= 0 || height == 0) { |
1149 return -1; | 1161 return -1; |
1150 } | 1162 } |
1151 // Negative height means invert the image. | 1163 // Negative height means invert the image. |
1152 if (height < 0) { | 1164 if (height < 0) { |
1153 height = -height; | 1165 height = -height; |
1154 src_argb1555 = src_argb1555 + (height - 1) * src_stride_argb1555; | 1166 src_argb1555 = src_argb1555 + (height - 1) * src_stride_argb1555; |
1155 src_stride_argb1555 = -src_stride_argb1555; | 1167 src_stride_argb1555 = -src_stride_argb1555; |
1156 } | 1168 } |
1157 | 1169 |
| 1170 // Neon version does direct ARGB1555 to YUV. |
1158 #if defined(HAS_ARGB1555TOYROW_NEON) | 1171 #if defined(HAS_ARGB1555TOYROW_NEON) |
1159 if (TestCpuFlag(kCpuHasNEON)) { | 1172 if (TestCpuFlag(kCpuHasNEON)) { |
| 1173 ARGB1555ToUVRow = ARGB1555ToUVRow_Any_NEON; |
1160 ARGB1555ToYRow = ARGB1555ToYRow_Any_NEON; | 1174 ARGB1555ToYRow = ARGB1555ToYRow_Any_NEON; |
1161 if (IS_ALIGNED(width, 8)) { | 1175 if (IS_ALIGNED(width, 8)) { |
1162 ARGB1555ToYRow = ARGB1555ToYRow_NEON; | 1176 ARGB1555ToYRow = ARGB1555ToYRow_NEON; |
1163 } | 1177 if (IS_ALIGNED(width, 16)) { |
1164 ARGB1555ToUVRow = ARGB1555ToUVRow_Any_NEON; | 1178 ARGB1555ToUVRow = ARGB1555ToUVRow_NEON; |
1165 if (IS_ALIGNED(width, 16)) { | 1179 } |
1166 ARGB1555ToUVRow = ARGB1555ToUVRow_NEON; | |
1167 } | 1180 } |
1168 } | 1181 } |
1169 #else // HAS_ARGB1555TOYROW_NEON | 1182 // Other platforms do intermediate conversion from ARGB1555 to ARGB. |
1170 | 1183 #else |
1171 #if defined(HAS_ARGB1555TOARGBROW_SSE2) | 1184 #if defined(HAS_ARGB1555TOARGBROW_SSE2) |
1172 if (TestCpuFlag(kCpuHasSSE2)) { | 1185 if (TestCpuFlag(kCpuHasSSE2)) { |
1173 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2; | 1186 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2; |
1174 if (IS_ALIGNED(width, 8)) { | 1187 if (IS_ALIGNED(width, 8)) { |
1175 ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2; | 1188 ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2; |
1176 } | 1189 } |
1177 } | 1190 } |
1178 #endif | 1191 #endif |
1179 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1192 #if defined(HAS_ARGB1555TOARGBROW_AVX2) |
1180 if (TestCpuFlag(kCpuHasSSSE3)) { | 1193 if (TestCpuFlag(kCpuHasAVX2)) { |
1181 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; | 1194 ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_AVX2; |
1182 if (IS_ALIGNED(width, 16)) { | 1195 if (IS_ALIGNED(width, 16)) { |
1183 ARGBToUVRow = ARGBToUVRow_SSSE3; | 1196 ARGB1555ToARGBRow = ARGB1555ToARGBRow_AVX2; |
1184 } | 1197 } |
1185 } | 1198 } |
1186 #endif | 1199 #endif |
1187 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1200 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
1188 if (TestCpuFlag(kCpuHasSSSE3)) { | 1201 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1202 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
1189 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 1203 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
1190 if (IS_ALIGNED(width, 16)) { | 1204 if (IS_ALIGNED(width, 16)) { |
| 1205 ARGBToUVRow = ARGBToUVRow_SSSE3; |
1191 ARGBToYRow = ARGBToYRow_SSSE3; | 1206 ARGBToYRow = ARGBToYRow_SSSE3; |
1192 } | 1207 } |
1193 } | 1208 } |
1194 #endif // HAS_ARGBTOUVROW_SSSE3 | 1209 #endif |
1195 #endif // HAS_ARGB1555TOYROW_NEON | 1210 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
1196 | 1211 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1212 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
| 1213 ARGBToYRow = ARGBToYRow_Any_AVX2; |
| 1214 if (IS_ALIGNED(width, 32)) { |
| 1215 ARGBToUVRow = ARGBToUVRow_AVX2; |
| 1216 ARGBToYRow = ARGBToYRow_AVX2; |
| 1217 } |
| 1218 } |
| 1219 #endif |
1197 { | 1220 { |
1198 #if !defined(HAS_ARGB1555TOYROW_NEON) | |
1199 // Allocate 2 rows of ARGB. | 1221 // Allocate 2 rows of ARGB. |
1200 const int kRowSize = (width * 4 + 15) & ~15; | 1222 const int kRowSize = (width * 4 + 31) & ~31; |
1201 align_buffer_64(row, kRowSize * 2); | 1223 align_buffer_64(row, kRowSize * 2); |
1202 #endif | 1224 #endif |
| 1225 |
1203 for (y = 0; y < height - 1; y += 2) { | 1226 for (y = 0; y < height - 1; y += 2) { |
1204 #if defined(HAS_ARGB1555TOYROW_NEON) | 1227 #if defined(HAS_ARGB1555TOYROW_NEON) |
1205 ARGB1555ToUVRow(src_argb1555, src_stride_argb1555, dst_u, dst_v, width); | 1228 ARGB1555ToUVRow(src_argb1555, src_stride_argb1555, dst_u, dst_v, width); |
1206 ARGB1555ToYRow(src_argb1555, dst_y, width); | 1229 ARGB1555ToYRow(src_argb1555, dst_y, width); |
1207 ARGB1555ToYRow(src_argb1555 + src_stride_argb1555, dst_y + dst_stride_y, | 1230 ARGB1555ToYRow(src_argb1555 + src_stride_argb1555, dst_y + dst_stride_y, |
1208 width); | 1231 width); |
1209 #else | 1232 #else |
1210 ARGB1555ToARGBRow(src_argb1555, row, width); | 1233 ARGB1555ToARGBRow(src_argb1555, row, width); |
1211 ARGB1555ToARGBRow(src_argb1555 + src_stride_argb1555, row + kRowSize, | 1234 ARGB1555ToARGBRow(src_argb1555 + src_stride_argb1555, row + kRowSize, |
1212 width); | 1235 width); |
(...skipping 10 matching lines...) Expand all Loading... |
1223 #if defined(HAS_ARGB1555TOYROW_NEON) | 1246 #if defined(HAS_ARGB1555TOYROW_NEON) |
1224 ARGB1555ToUVRow(src_argb1555, 0, dst_u, dst_v, width); | 1247 ARGB1555ToUVRow(src_argb1555, 0, dst_u, dst_v, width); |
1225 ARGB1555ToYRow(src_argb1555, dst_y, width); | 1248 ARGB1555ToYRow(src_argb1555, dst_y, width); |
1226 #else | 1249 #else |
1227 ARGB1555ToARGBRow(src_argb1555, row, width); | 1250 ARGB1555ToARGBRow(src_argb1555, row, width); |
1228 ARGBToUVRow(row, 0, dst_u, dst_v, width); | 1251 ARGBToUVRow(row, 0, dst_u, dst_v, width); |
1229 ARGBToYRow(row, dst_y, width); | 1252 ARGBToYRow(row, dst_y, width); |
1230 #endif | 1253 #endif |
1231 } | 1254 } |
1232 #if !defined(HAS_ARGB1555TOYROW_NEON) | 1255 #if !defined(HAS_ARGB1555TOYROW_NEON) |
1233 free_aligned_buffer_64(row); | 1256 free_aligned_buffer_64(row); |
| 1257 } |
1234 #endif | 1258 #endif |
1235 } | |
1236 return 0; | 1259 return 0; |
1237 } | 1260 } |
1238 | 1261 |
1239 // Convert ARGB4444 to I420. | 1262 // Convert ARGB4444 to I420. |
1240 LIBYUV_API | 1263 LIBYUV_API |
1241 int ARGB4444ToI420(const uint8* src_argb4444, int src_stride_argb4444, | 1264 int ARGB4444ToI420(const uint8* src_argb4444, int src_stride_argb4444, |
1242 uint8* dst_y, int dst_stride_y, | 1265 uint8* dst_y, int dst_stride_y, |
1243 uint8* dst_u, int dst_stride_u, | 1266 uint8* dst_u, int dst_stride_u, |
1244 uint8* dst_v, int dst_stride_v, | 1267 uint8* dst_v, int dst_stride_v, |
1245 int width, int height) { | 1268 int width, int height) { |
(...skipping 15 matching lines...) Expand all Loading... |
1261 width <= 0 || height == 0) { | 1284 width <= 0 || height == 0) { |
1262 return -1; | 1285 return -1; |
1263 } | 1286 } |
1264 // Negative height means invert the image. | 1287 // Negative height means invert the image. |
1265 if (height < 0) { | 1288 if (height < 0) { |
1266 height = -height; | 1289 height = -height; |
1267 src_argb4444 = src_argb4444 + (height - 1) * src_stride_argb4444; | 1290 src_argb4444 = src_argb4444 + (height - 1) * src_stride_argb4444; |
1268 src_stride_argb4444 = -src_stride_argb4444; | 1291 src_stride_argb4444 = -src_stride_argb4444; |
1269 } | 1292 } |
1270 | 1293 |
| 1294 // Neon version does direct ARGB4444 to YUV. |
1271 #if defined(HAS_ARGB4444TOYROW_NEON) | 1295 #if defined(HAS_ARGB4444TOYROW_NEON) |
1272 if (TestCpuFlag(kCpuHasNEON)) { | 1296 if (TestCpuFlag(kCpuHasNEON)) { |
| 1297 ARGB4444ToUVRow = ARGB4444ToUVRow_Any_NEON; |
1273 ARGB4444ToYRow = ARGB4444ToYRow_Any_NEON; | 1298 ARGB4444ToYRow = ARGB4444ToYRow_Any_NEON; |
1274 if (IS_ALIGNED(width, 8)) { | 1299 if (IS_ALIGNED(width, 8)) { |
1275 ARGB4444ToYRow = ARGB4444ToYRow_NEON; | 1300 ARGB4444ToYRow = ARGB4444ToYRow_NEON; |
1276 } | 1301 if (IS_ALIGNED(width, 16)) { |
1277 ARGB4444ToUVRow = ARGB4444ToUVRow_Any_NEON; | 1302 ARGB4444ToUVRow = ARGB4444ToUVRow_NEON; |
1278 if (IS_ALIGNED(width, 16)) { | 1303 } |
1279 ARGB4444ToUVRow = ARGB4444ToUVRow_NEON; | |
1280 } | 1304 } |
1281 } | 1305 } |
1282 #else // HAS_ARGB4444TOYROW_NEON | 1306 // Other platforms do intermediate conversion from ARGB4444 to ARGB. |
1283 | 1307 #else |
1284 #if defined(HAS_ARGB4444TOARGBROW_SSE2) | 1308 #if defined(HAS_ARGB4444TOARGBROW_SSE2) |
1285 if (TestCpuFlag(kCpuHasSSE2)) { | 1309 if (TestCpuFlag(kCpuHasSSE2)) { |
1286 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2; | 1310 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2; |
1287 if (IS_ALIGNED(width, 8)) { | 1311 if (IS_ALIGNED(width, 8)) { |
1288 ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2; | 1312 ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2; |
1289 } | 1313 } |
1290 } | 1314 } |
1291 #endif | 1315 #endif |
1292 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1316 #if defined(HAS_ARGB4444TOARGBROW_AVX2) |
1293 if (TestCpuFlag(kCpuHasSSSE3)) { | 1317 if (TestCpuFlag(kCpuHasAVX2)) { |
1294 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; | 1318 ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_AVX2; |
1295 if (IS_ALIGNED(width, 16)) { | 1319 if (IS_ALIGNED(width, 16)) { |
1296 ARGBToUVRow = ARGBToUVRow_SSSE3; | 1320 ARGB4444ToARGBRow = ARGB4444ToARGBRow_AVX2; |
1297 } | 1321 } |
1298 } | 1322 } |
1299 #endif | 1323 #endif |
1300 #if defined(HAS_ARGBTOUVROW_SSSE3) | 1324 #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
1301 if (TestCpuFlag(kCpuHasSSSE3)) { | 1325 if (TestCpuFlag(kCpuHasSSSE3)) { |
| 1326 ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
1302 ARGBToYRow = ARGBToYRow_Any_SSSE3; | 1327 ARGBToYRow = ARGBToYRow_Any_SSSE3; |
1303 if (IS_ALIGNED(width, 16)) { | 1328 if (IS_ALIGNED(width, 16)) { |
| 1329 ARGBToUVRow = ARGBToUVRow_SSSE3; |
1304 ARGBToYRow = ARGBToYRow_SSSE3; | 1330 ARGBToYRow = ARGBToYRow_SSSE3; |
1305 } | 1331 } |
1306 } | 1332 } |
1307 #endif // HAS_ARGBTOUVROW_SSSE3 | 1333 #endif |
1308 #endif // HAS_ARGB4444TOYROW_NEON | 1334 #if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
1309 | 1335 if (TestCpuFlag(kCpuHasAVX2)) { |
| 1336 ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
| 1337 ARGBToYRow = ARGBToYRow_Any_AVX2; |
| 1338 if (IS_ALIGNED(width, 32)) { |
| 1339 ARGBToUVRow = ARGBToUVRow_AVX2; |
| 1340 ARGBToYRow = ARGBToYRow_AVX2; |
| 1341 } |
| 1342 } |
| 1343 #endif |
1310 { | 1344 { |
1311 #if !defined(HAS_ARGB4444TOYROW_NEON) | |
1312 // Allocate 2 rows of ARGB. | 1345 // Allocate 2 rows of ARGB. |
1313 const int kRowSize = (width * 4 + 15) & ~15; | 1346 const int kRowSize = (width * 4 + 31) & ~31; |
1314 align_buffer_64(row, kRowSize * 2); | 1347 align_buffer_64(row, kRowSize * 2); |
1315 #endif | 1348 #endif |
1316 | 1349 |
1317 for (y = 0; y < height - 1; y += 2) { | 1350 for (y = 0; y < height - 1; y += 2) { |
1318 #if defined(HAS_ARGB4444TOYROW_NEON) | 1351 #if defined(HAS_ARGB4444TOYROW_NEON) |
1319 ARGB4444ToUVRow(src_argb4444, src_stride_argb4444, dst_u, dst_v, width); | 1352 ARGB4444ToUVRow(src_argb4444, src_stride_argb4444, dst_u, dst_v, width); |
1320 ARGB4444ToYRow(src_argb4444, dst_y, width); | 1353 ARGB4444ToYRow(src_argb4444, dst_y, width); |
1321 ARGB4444ToYRow(src_argb4444 + src_stride_argb4444, dst_y + dst_stride_y, | 1354 ARGB4444ToYRow(src_argb4444 + src_stride_argb4444, dst_y + dst_stride_y, |
1322 width); | 1355 width); |
1323 #else | 1356 #else |
(...skipping 14 matching lines...) Expand all Loading... |
1338 ARGB4444ToUVRow(src_argb4444, 0, dst_u, dst_v, width); | 1371 ARGB4444ToUVRow(src_argb4444, 0, dst_u, dst_v, width); |
1339 ARGB4444ToYRow(src_argb4444, dst_y, width); | 1372 ARGB4444ToYRow(src_argb4444, dst_y, width); |
1340 #else | 1373 #else |
1341 ARGB4444ToARGBRow(src_argb4444, row, width); | 1374 ARGB4444ToARGBRow(src_argb4444, row, width); |
1342 ARGBToUVRow(row, 0, dst_u, dst_v, width); | 1375 ARGBToUVRow(row, 0, dst_u, dst_v, width); |
1343 ARGBToYRow(row, dst_y, width); | 1376 ARGBToYRow(row, dst_y, width); |
1344 #endif | 1377 #endif |
1345 } | 1378 } |
1346 #if !defined(HAS_ARGB4444TOYROW_NEON) | 1379 #if !defined(HAS_ARGB4444TOYROW_NEON) |
1347 free_aligned_buffer_64(row); | 1380 free_aligned_buffer_64(row); |
| 1381 } |
1348 #endif | 1382 #endif |
1349 } | |
1350 return 0; | 1383 return 0; |
1351 } | 1384 } |
1352 | 1385 |
1353 #ifdef __cplusplus | 1386 #ifdef __cplusplus |
1354 } // extern "C" | 1387 } // extern "C" |
1355 } // namespace libyuv | 1388 } // namespace libyuv |
1356 #endif | 1389 #endif |
OLD | NEW |