Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1556)

Side by Side Diff: source/libvpx/third_party/libyuv/source/convert.cc

Issue 1302353004: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « source/libvpx/third_party/libyuv/source/compare_win.cc ('k') | source/libvpx/third_party/libyuv/source/convert_argb.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698