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

Side by Side Diff: source/row_common.cc

Issue 1363503002: yuvconstants for all YUV to RGB conversion functions. (Closed) Base URL: https://chromium.googlesource.com/libyuv/libyuv@master
Patch Set: mips dspr2 add constants parameter Created 5 years, 2 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
« no previous file with comments | « source/row_any.cc ('k') | source/row_gcc.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 996 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 #define UB -128 /* max(-128, round(-2.018 * 64)) */ 1007 #define UB -128 /* max(-128, round(-2.018 * 64)) */
1008 #define UG 25 /* round(0.391 * 64) */ 1008 #define UG 25 /* round(0.391 * 64) */
1009 #define VG 52 /* round(0.813 * 64) */ 1009 #define VG 52 /* round(0.813 * 64) */
1010 #define VR -102 /* round(-1.596 * 64) */ 1010 #define VR -102 /* round(-1.596 * 64) */
1011 1011
1012 // Bias values to subtract 16 from Y and 128 from U and V. 1012 // Bias values to subtract 16 from Y and 128 from U and V.
1013 #define BB (UB * 128 + YGB) 1013 #define BB (UB * 128 + YGB)
1014 #define BG (UG * 128 + VG * 128 + YGB) 1014 #define BG (UG * 128 + VG * 128 + YGB)
1015 #define BR (VR * 128 + YGB) 1015 #define BR (VR * 128 + YGB)
1016 1016
1017 #if defined(__arm__) || defined(__aarch64__)
1018 YuvConstants SIMD_ALIGNED(kYuvConstants) = {
1019 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 },
1020 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 },
1021 { BB, BG, BR, 0, 0, 0, 0, 0 },
1022 { 0x0101 * YG, 0, 0, 0 }
1023 };
1024
1025 YuvConstants SIMD_ALIGNED(kYvuConstants) = {
1026 { -VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0 },
1027 { VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0 },
1028 { BB, BG, BR, 0, 0, 0, 0, 0 },
1029 { 0x0101 * YG, 0, 0, 0 }
1030 };
1031
1032 #else
1017 // BT601 constants for YUV to RGB. 1033 // BT601 constants for YUV to RGB.
1018 YuvConstants SIMD_ALIGNED(kYuvConstants) = { 1034 YuvConstants SIMD_ALIGNED(kYuvConstants) = {
1019 { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, 1035 { UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0,
1020 UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 }, 1036 UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0 },
1021 { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, 1037 { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG,
1022 UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, 1038 UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG },
1023 { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 1039 { 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR,
1024 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR }, 1040 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR },
1025 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, 1041 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB },
1026 { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, 1042 { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG },
1027 { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, 1043 { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR },
1028 { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } 1044 { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG }
1029 }; 1045 };
1030 1046
1031 // BT601 constants for NV21 where chroma plane is VU instead of UV. 1047 // BT601 constants for NV21 where chroma plane is VU instead of UV.
1032 YuvConstants SIMD_ALIGNED(kYvuConstants) = { 1048 YuvConstants SIMD_ALIGNED(kYvuConstants) = {
1033 { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 1049 { 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB,
1034 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB }, 1050 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB },
1035 { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, 1051 { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG,
1036 VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG }, 1052 VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG },
1037 { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, 1053 { VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0,
1038 VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 }, 1054 VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0 },
1039 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB }, 1055 { BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB },
1040 { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG }, 1056 { BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG },
1041 { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR }, 1057 { BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR },
1042 { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG } 1058 { YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG }
1043 }; 1059 };
1044 1060 #endif
1045 YuvConstantsNEON SIMD_ALIGNED(kYuvConstantsNEON) = {
1046 { -UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0 },
1047 { UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0 },
1048 { BB, BG, BR, 0, 0, 0, 0, 0 },
1049 { 0x0101 * YG, 0, 0, 0 }
1050 };
1051
1052 // C reference code that mimics the YUV assembly.
1053 static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
1054 uint8* b, uint8* g, uint8* r) {
1055 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16;
1056 *b = Clamp((int32)(-(u * UB) + y1 + BB) >> 6);
1057 *g = Clamp((int32)(-(v * VG + u * UG) + y1 + BG) >> 6);
1058 *r = Clamp((int32)(-(v * VR)+ y1 + BR) >> 6);
1059 }
1060 1061
1061 // C reference code that mimics the YUV assembly. 1062 // C reference code that mimics the YUV assembly.
1062 static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) { 1063 static __inline void YPixel(uint8 y, uint8* b, uint8* g, uint8* r) {
1063 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16; 1064 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16;
1064 *b = Clamp((int32)(y1 + YGB) >> 6); 1065 *b = Clamp((int32)(y1 + YGB) >> 6);
1065 *g = Clamp((int32)(y1 + YGB) >> 6); 1066 *g = Clamp((int32)(y1 + YGB) >> 6);
1066 *r = Clamp((int32)(y1 + YGB) >> 6); 1067 *r = Clamp((int32)(y1 + YGB) >> 6);
1067 } 1068 }
1068 #undef YG 1069
1070 #undef BB
1071 #undef BG
1072 #undef BR
1069 #undef YGB 1073 #undef YGB
1070 #undef UB 1074 #undef UB
1071 #undef UG 1075 #undef UG
1072 #undef VG 1076 #undef VG
1073 #undef VR 1077 #undef VR
1074 #undef BB 1078 #undef YG
1075 #undef BG 1079
1076 #undef BR 1080 // C reference code that mimics the YUV assembly.
1081 static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
1082 uint8* b, uint8* g, uint8* r,
1083 struct YuvConstants* yuvconstants) {
1084 #if defined(__arm__) || defined(__aarch64__)
1085
1086 int UB = -yuvconstants->kUVToRB[0];
1087 int VB = 0;
1088 int UG = yuvconstants->kUVToG[0];
1089 int VG = yuvconstants->kUVToG[4];
1090 int UR = 0;
1091 int VR = -yuvconstants->kUVToRB[4];
1092 int BB = yuvconstants->kUVBiasBGR[0];
1093 int BG = yuvconstants->kUVBiasBGR[1];
1094 int BR = yuvconstants->kUVBiasBGR[2];
1095 int YG = yuvconstants->kYToRgb[0];
1096 #else
1097 int UB = yuvconstants->kUVToB[0];
1098 int VB = yuvconstants->kUVToB[1]; // usually 0
1099 int UG = yuvconstants->kUVToG[0];
1100 int VG = yuvconstants->kUVToG[1];
1101 int UR = yuvconstants->kUVToR[0]; // usually 0
1102 int VR = yuvconstants->kUVToR[1];
1103 int BB = yuvconstants->kUVBiasB[0];
1104 int BG = yuvconstants->kUVBiasG[0];
1105 int BR = yuvconstants->kUVBiasR[0];
1106 int YG = yuvconstants->kYToRgb[0];
1107 #endif
1108 uint32 y1 = (uint32)(y * 0x0101 * YG) >> 16;
1109 *b = Clamp((int32)(-(u * UB + v * VB) + y1 + BB) >> 6);
1110 *g = Clamp((int32)(-(u * UG + v * VG) + y1 + BG) >> 6);
1111 *r = Clamp((int32)(-(u * UR + v * VR) + y1 + BR) >> 6);
1112 }
1077 1113
1078 // JPEG YUV to RGB reference 1114 // JPEG YUV to RGB reference
1079 // * R = Y - V * -1.40200 1115 // * R = Y - V * -1.40200
1080 // * G = Y - U * 0.34414 - V * 0.71414 1116 // * G = Y - U * 0.34414 - V * 0.71414
1081 // * B = Y - U * -1.77200 1117 // * B = Y - U * -1.77200
1082 1118
1083 // Y contribution to R,G,B. Scale and bias. 1119 // Y contribution to R,G,B. Scale and bias.
1084 #define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ 1120 #define YGJ 16320 /* round(1.000 * 64 * 256 * 256 / 257) */
1085 #define YGBJ 32 /* 64 / 2 */ 1121 #define YGBJ 32 /* 64 / 2 */
1086 1122
1087 // U and V contributions to R,G,B. 1123 // U and V contributions to R,G,B.
1088 #define UBJ -113 /* round(-1.77200 * 64) */ 1124 #define UBJ -113 /* round(-1.77200 * 64) */
1089 #define UGJ 22 /* round(0.34414 * 64) */ 1125 #define UGJ 22 /* round(0.34414 * 64) */
1090 #define VGJ 46 /* round(0.71414 * 64) */ 1126 #define VGJ 46 /* round(0.71414 * 64) */
1091 #define VRJ -90 /* round(-1.40200 * 64) */ 1127 #define VRJ -90 /* round(-1.40200 * 64) */
1092 1128
1093 // Bias values to round, and subtract 128 from U and V. 1129 // Bias values to round, and subtract 128 from U and V.
1094 #define BBJ (UBJ * 128 + YGBJ) 1130 #define BBJ (UBJ * 128 + YGBJ)
1095 #define BGJ (UGJ * 128 + VGJ * 128 + YGBJ) 1131 #define BGJ (UGJ * 128 + VGJ * 128 + YGBJ)
1096 #define BRJ (VRJ * 128 + YGBJ) 1132 #define BRJ (VRJ * 128 + YGBJ)
1097 1133
1134 #if defined(__arm__) || defined(__aarch64__)
1135 // JPEG constants for YUV to RGB.
1136 YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
1137 { -UBJ, -UBJ, -UBJ, -UBJ, -VRJ, -VRJ, -VRJ, -VRJ, 0, 0, 0, 0, 0, 0, 0, 0 },
1138 { UGJ, UGJ, UGJ, UGJ, VGJ, VGJ, VGJ, VGJ, 0, 0, 0, 0, 0, 0, 0, 0 },
1139 { BBJ, BGJ, BRJ, 0, 0, 0, 0, 0 },
1140 { 0x0101 * YGJ, 0, 0, 0 }
1141 };
1142 #else
1098 // JPEG constants for YUV to RGB. 1143 // JPEG constants for YUV to RGB.
1099 YuvConstants SIMD_ALIGNED(kYuvJConstants) = { 1144 YuvConstants SIMD_ALIGNED(kYuvJConstants) = {
1100 { UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, 1145 { UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0,
1101 UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0 }, 1146 UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0, UBJ, 0 },
1102 { UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, 1147 { UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ,
1103 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, 1148 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ,
1104 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, 1149 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ,
1105 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ }, 1150 UGJ, VGJ, UGJ, VGJ, UGJ, VGJ, UGJ, VGJ },
1106 { 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 1151 { 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ,
1107 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ }, 1152 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ, 0, VRJ },
1108 { BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, 1153 { BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ,
1109 BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ }, 1154 BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ, BBJ },
1110 { BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, 1155 { BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ,
1111 BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ }, 1156 BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ, BGJ },
1112 { BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, 1157 { BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ,
1113 BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ }, 1158 BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ, BRJ },
1114 { YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, 1159 { YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ,
1115 YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ } 1160 YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ, YGJ }
1116 }; 1161 };
1117 1162 #endif
1118 // JPEG constants for YUV to RGB.
1119 YuvConstantsNEON SIMD_ALIGNED(kYuvJConstantsNEON) = {
1120 { -UBJ, -UBJ, -UBJ, -UBJ, -VRJ, -VRJ, -VRJ, -VRJ, 0, 0, 0, 0, 0, 0, 0, 0 },
1121 { UGJ, UGJ, UGJ, UGJ, VGJ, VGJ, VGJ, VGJ, 0, 0, 0, 0, 0, 0, 0, 0 },
1122 { BBJ, BGJ, BRJ, 0, 0, 0, 0, 0 },
1123 { 0x0101 * YGJ, 0, 0, 0 }
1124 };
1125
1126 // C reference code that mimics the YUV assembly.
1127 static __inline void YuvJPixel(uint8 y, uint8 u, uint8 v,
1128 uint8* b, uint8* g, uint8* r) {
1129 uint32 y1 = (uint32)(y * 0x0101 * YGJ) >> 16;
1130 *b = Clamp((int32)(-(u * UBJ) + y1 + BBJ) >> 6);
1131 *g = Clamp((int32)(-(v * VGJ + u * UGJ) + y1 + BGJ) >> 6);
1132 *r = Clamp((int32)(-(v * VRJ) + y1 + BRJ) >> 6);
1133 }
1134 1163
1135 #undef YGJ 1164 #undef YGJ
1136 #undef YGBJ 1165 #undef YGBJ
1137 #undef UBJ 1166 #undef UBJ
1138 #undef UGJ 1167 #undef UGJ
1139 #undef VGJ 1168 #undef VGJ
1140 #undef VRJ 1169 #undef VRJ
1141 #undef BBJ 1170 #undef BBJ
1142 #undef BGJ 1171 #undef BGJ
1143 #undef BRJ 1172 #undef BRJ
(...skipping 11 matching lines...) Expand all
1155 #define UBH -128 /* max(-128, round(-2.12798 * 64)) */ 1184 #define UBH -128 /* max(-128, round(-2.12798 * 64)) */
1156 #define UGH 14 /* round(0.21482 * 64) */ 1185 #define UGH 14 /* round(0.21482 * 64) */
1157 #define VGH 24 /* round(0.38059 * 64) */ 1186 #define VGH 24 /* round(0.38059 * 64) */
1158 #define VRH -82 /* round(-1.28033 * 64) */ 1187 #define VRH -82 /* round(-1.28033 * 64) */
1159 1188
1160 // Bias values to round, and subtract 128 from U and V. 1189 // Bias values to round, and subtract 128 from U and V.
1161 #define BBH (UBH * 128 + YGBH) 1190 #define BBH (UBH * 128 + YGBH)
1162 #define BGH (UGH * 128 + VGH * 128 + YGBH) 1191 #define BGH (UGH * 128 + VGH * 128 + YGBH)
1163 #define BRH (VRH * 128 + YGBH) 1192 #define BRH (VRH * 128 + YGBH)
1164 1193
1194 #if defined(__arm__) || defined(__aarch64__)
1195 // BT.709 constants for YUV to RGB.
1196 YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
1197 { -UBH, -UBH, -UBH, -UBH, -VRH, -VRH, -VRH, -VRH, 0, 0, 0, 0, 0, 0, 0, 0 },
1198 { UGH, UGH, UGH, UGH, VGH, VGH, VGH, VGH, 0, 0, 0, 0, 0, 0, 0, 0 },
1199 { BBH, BGH, BRH, 0, 0, 0, 0, 0 },
1200 { 0x0101 * YGH, 0, 0, 0 }
1201 };
1202 #else
1165 // BT.709 constants for YUV to RGB. 1203 // BT.709 constants for YUV to RGB.
1166 YuvConstants SIMD_ALIGNED(kYuvHConstants) = { 1204 YuvConstants SIMD_ALIGNED(kYuvHConstants) = {
1167 { UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, 1205 { UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0,
1168 UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0 }, 1206 UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0, UBH, 0 },
1169 { UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, 1207 { UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH,
1170 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, 1208 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH,
1171 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH, 1209 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH,
1172 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH }, 1210 UGH, VGH, UGH, VGH, UGH, VGH, UGH, VGH },
1173 { 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 1211 { 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH,
1174 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH }, 1212 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH, 0, VRH },
1175 { BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH, 1213 { BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH,
1176 BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH }, 1214 BBH, BBH, BBH, BBH, BBH, BBH, BBH, BBH },
1177 { BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH, 1215 { BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH,
1178 BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH }, 1216 BGH, BGH, BGH, BGH, BGH, BGH, BGH, BGH },
1179 { BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH, 1217 { BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH,
1180 BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH }, 1218 BRH, BRH, BRH, BRH, BRH, BRH, BRH, BRH },
1181 { YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH, 1219 { YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH,
1182 YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH } 1220 YGH, YGH, YGH, YGH, YGH, YGH, YGH, YGH }
1183 }; 1221 };
1184 1222 #endif
1185 // BT.709 constants for YUV to RGB.
1186 YuvConstantsNEON SIMD_ALIGNED(kYuvHConstantsNEON) = {
1187 { -UBH, -UBH, -UBH, -UBH, -VRH, -VRH, -VRH, -VRH, 0, 0, 0, 0, 0, 0, 0, 0 },
1188 { UGH, UGH, UGH, UGH, VGH, VGH, VGH, VGH, 0, 0, 0, 0, 0, 0, 0, 0 },
1189 { BBH, BGH, BRH, 0, 0, 0, 0, 0 },
1190 { 0x0101 * YGH, 0, 0, 0 }
1191 };
1192
1193 // C reference code that mimics the YUV assembly.
1194 static __inline void YuvHPixel(uint8 y, uint8 u, uint8 v,
1195 uint8* b, uint8* g, uint8* r) {
1196 uint32 y1 = (uint32)(y * 0x0101 * YGH) >> 16;
1197 *b = Clamp((int32)(-(u * UBH) + y1 + BBH) >> 6);
1198 *g = Clamp((int32)(-(v * VGH + u * UGH) + y1 + BGH) >> 6);
1199 *r = Clamp((int32)(-(v * VRH) + y1 + BRH) >> 6);
1200 }
1201 1223
1202 #undef YGH 1224 #undef YGH
1203 #undef YGBH 1225 #undef YGBH
1204 #undef UBH 1226 #undef UBH
1205 #undef UGH 1227 #undef UGH
1206 #undef VGH 1228 #undef VGH
1207 #undef VRH 1229 #undef VRH
1208 #undef BBH 1230 #undef BBH
1209 #undef BGH 1231 #undef BGH
1210 #undef BRH 1232 #undef BRH
1211 1233
1212 #if !defined(LIBYUV_DISABLE_NEON) && \ 1234 #if !defined(LIBYUV_DISABLE_NEON) && \
1213 (defined(__ARM_NEON__) || defined(__aarch64__) || defined(LIBYUV_NEON)) 1235 (defined(__ARM_NEON__) || defined(__aarch64__) || defined(LIBYUV_NEON))
1214 // C mimic assembly. 1236 // C mimic assembly.
1215 // TODO(fbarchard): Remove subsampling from Neon. 1237 // TODO(fbarchard): Remove subsampling from Neon.
1216 void I444ToARGBRow_C(const uint8* src_y, 1238 void I444ToARGBRow_C(const uint8* src_y,
1217 const uint8* src_u, 1239 const uint8* src_u,
1218 const uint8* src_v, 1240 const uint8* src_v,
1219 uint8* rgb_buf, 1241 uint8* rgb_buf,
1242 struct YuvConstants* yuvconstants,
1220 int width) { 1243 int width) {
1221 int x; 1244 int x;
1222 for (x = 0; x < width - 1; x += 2) { 1245 for (x = 0; x < width - 1; x += 2) {
1223 uint8 u = (src_u[0] + src_u[1] + 1) >> 1; 1246 uint8 u = (src_u[0] + src_u[1] + 1) >> 1;
1224 uint8 v = (src_v[0] + src_v[1] + 1) >> 1; 1247 uint8 v = (src_v[0] + src_v[1] + 1) >> 1;
1225 YuvPixel(src_y[0], u, v, rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1248 YuvPixel(src_y[0], u, v, rgb_buf + 0, rgb_buf + 1, rgb_buf + 2,
1249 yuvconstants);
1226 rgb_buf[3] = 255; 1250 rgb_buf[3] = 255;
1227 YuvPixel(src_y[1], u, v, rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1251 YuvPixel(src_y[1], u, v, rgb_buf + 4, rgb_buf + 5, rgb_buf + 6,
1252 yuvconstants);
1228 rgb_buf[7] = 255; 1253 rgb_buf[7] = 255;
1229 src_y += 2; 1254 src_y += 2;
1230 src_u += 2; 1255 src_u += 2;
1231 src_v += 2; 1256 src_v += 2;
1232 rgb_buf += 8; // Advance 2 pixels. 1257 rgb_buf += 8; // Advance 2 pixels.
1233 } 1258 }
1234 if (width & 1) { 1259 if (width & 1) {
1235 YuvPixel(src_y[0], src_u[0], src_v[0], 1260 YuvPixel(src_y[0], src_u[0], src_v[0],
1236 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1261 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1237 } 1262 }
1238 } 1263 }
1239 1264
1240 void I444ToABGRRow_C(const uint8* src_y, 1265 void I444ToABGRRow_C(const uint8* src_y,
1241 const uint8* src_u, 1266 const uint8* src_u,
1242 const uint8* src_v, 1267 const uint8* src_v,
1243 uint8* rgb_buf, 1268 uint8* rgb_buf,
1269 struct YuvConstants* yuvconstants,
1244 int width) { 1270 int width) {
1245 int x; 1271 int x;
1246 for (x = 0; x < width - 1; x += 2) { 1272 for (x = 0; x < width - 1; x += 2) {
1247 uint8 u = (src_u[0] + src_u[1] + 1) >> 1; 1273 uint8 u = (src_u[0] + src_u[1] + 1) >> 1;
1248 uint8 v = (src_v[0] + src_v[1] + 1) >> 1; 1274 uint8 v = (src_v[0] + src_v[1] + 1) >> 1;
1249 YuvPixel(src_y[0], u, v, rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1275 YuvPixel(src_y[0], u, v, rgb_buf + 2, rgb_buf + 1, rgb_buf + 0,
1276 yuvconstants);
1250 rgb_buf[3] = 255; 1277 rgb_buf[3] = 255;
1251 YuvPixel(src_y[1], u, v, rgb_buf + 6, rgb_buf + 5, rgb_buf + 4); 1278 YuvPixel(src_y[1], u, v, rgb_buf + 6, rgb_buf + 5, rgb_buf + 4,
1279 yuvconstants);
1252 rgb_buf[7] = 255; 1280 rgb_buf[7] = 255;
1253 src_y += 2; 1281 src_y += 2;
1254 src_u += 2; 1282 src_u += 2;
1255 src_v += 2; 1283 src_v += 2;
1256 rgb_buf += 8; // Advance 2 pixels. 1284 rgb_buf += 8; // Advance 2 pixels.
1257 } 1285 }
1258 if (width & 1) { 1286 if (width & 1) {
1259 YuvPixel(src_y[0], src_u[0], src_v[0], 1287 YuvPixel(src_y[0], src_u[0], src_v[0],
1260 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1288 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1261 } 1289 }
1262 } 1290 }
1263 #else 1291 #else
1264 void I444ToARGBRow_C(const uint8* src_y, 1292 void I444ToARGBRow_C(const uint8* src_y,
1265 const uint8* src_u, 1293 const uint8* src_u,
1266 const uint8* src_v, 1294 const uint8* src_v,
1267 uint8* rgb_buf, 1295 uint8* rgb_buf,
1296 struct YuvConstants* yuvconstants,
1268 int width) { 1297 int width) {
1269 int x; 1298 int x;
1270 for (x = 0; x < width; ++x) { 1299 for (x = 0; x < width; ++x) {
1271 YuvPixel(src_y[0], src_u[0], src_v[0], 1300 YuvPixel(src_y[0], src_u[0], src_v[0],
1272 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1301 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1273 rgb_buf[3] = 255; 1302 rgb_buf[3] = 255;
1274 src_y += 1; 1303 src_y += 1;
1275 src_u += 1; 1304 src_u += 1;
1276 src_v += 1; 1305 src_v += 1;
1277 rgb_buf += 4; // Advance 1 pixel. 1306 rgb_buf += 4; // Advance 1 pixel.
1278 } 1307 }
1279 } 1308 }
1280 1309
1281 void I444ToABGRRow_C(const uint8* src_y, 1310 void I444ToABGRRow_C(const uint8* src_y,
1282 const uint8* src_u, 1311 const uint8* src_u,
1283 const uint8* src_v, 1312 const uint8* src_v,
1284 uint8* rgb_buf, 1313 uint8* rgb_buf,
1314 struct YuvConstants* yuvconstants,
1285 int width) { 1315 int width) {
1286 int x; 1316 int x;
1287 for (x = 0; x < width; ++x) { 1317 for (x = 0; x < width; ++x) {
1288 YuvPixel(src_y[0], src_u[0], src_v[0], 1318 YuvPixel(src_y[0], src_u[0], src_v[0],
1289 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1319 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1290 rgb_buf[3] = 255; 1320 rgb_buf[3] = 255;
1291 src_y += 1; 1321 src_y += 1;
1292 src_u += 1; 1322 src_u += 1;
1293 src_v += 1; 1323 src_v += 1;
1294 rgb_buf += 4; // Advance 1 pixel. 1324 rgb_buf += 4; // Advance 1 pixel.
1295 } 1325 }
1296 } 1326 }
1297 #endif 1327 #endif
1298 1328
1299 // Also used for 420 1329 // Also used for 420
1300 void I422ToARGBRow_C(const uint8* src_y, 1330 void I422ToARGBRow_C(const uint8* src_y,
1301 const uint8* src_u, 1331 const uint8* src_u,
1302 const uint8* src_v, 1332 const uint8* src_v,
1303 uint8* rgb_buf, 1333 uint8* rgb_buf,
1334 struct YuvConstants* yuvconstants,
1304 int width) { 1335 int width) {
1305 int x; 1336 int x;
1306 for (x = 0; x < width - 1; x += 2) { 1337 for (x = 0; x < width - 1; x += 2) {
1307 YuvPixel(src_y[0], src_u[0], src_v[0], 1338 YuvPixel(src_y[0], src_u[0], src_v[0],
1308 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1339 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1309 rgb_buf[3] = 255; 1340 rgb_buf[3] = 255;
1310 YuvPixel(src_y[1], src_u[0], src_v[0], 1341 YuvPixel(src_y[1], src_u[0], src_v[0],
1311 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1342 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1312 rgb_buf[7] = 255; 1343 rgb_buf[7] = 255;
1313 src_y += 2; 1344 src_y += 2;
1314 src_u += 1; 1345 src_u += 1;
1315 src_v += 1; 1346 src_v += 1;
1316 rgb_buf += 8; // Advance 2 pixels. 1347 rgb_buf += 8; // Advance 2 pixels.
1317 } 1348 }
1318 if (width & 1) { 1349 if (width & 1) {
1319 YuvPixel(src_y[0], src_u[0], src_v[0], 1350 YuvPixel(src_y[0], src_u[0], src_v[0],
1320 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1351 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1321 rgb_buf[3] = 255; 1352 rgb_buf[3] = 255;
1322 } 1353 }
1323 } 1354 }
1324 1355
1325 void J422ToARGBRow_C(const uint8* src_y,
1326 const uint8* src_u,
1327 const uint8* src_v,
1328 uint8* rgb_buf,
1329 int width) {
1330 int x;
1331 for (x = 0; x < width - 1; x += 2) {
1332 YuvJPixel(src_y[0], src_u[0], src_v[0],
1333 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1334 rgb_buf[3] = 255;
1335 YuvJPixel(src_y[1], src_u[0], src_v[0],
1336 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6);
1337 rgb_buf[7] = 255;
1338 src_y += 2;
1339 src_u += 1;
1340 src_v += 1;
1341 rgb_buf += 8; // Advance 2 pixels.
1342 }
1343 if (width & 1) {
1344 YuvJPixel(src_y[0], src_u[0], src_v[0],
1345 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1346 rgb_buf[3] = 255;
1347 }
1348 }
1349
1350 void J422ToABGRRow_C(const uint8* src_y,
1351 const uint8* src_u,
1352 const uint8* src_v,
1353 uint8* rgb_buf,
1354 int width) {
1355 int x;
1356 for (x = 0; x < width - 1; x += 2) {
1357 YuvJPixel(src_y[0], src_u[0], src_v[0],
1358 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0);
1359 rgb_buf[3] = 255;
1360 YuvJPixel(src_y[1], src_u[0], src_v[0],
1361 rgb_buf + 6, rgb_buf + 5, rgb_buf + 4);
1362 rgb_buf[7] = 255;
1363 src_y += 2;
1364 src_u += 1;
1365 src_v += 1;
1366 rgb_buf += 8; // Advance 2 pixels.
1367 }
1368 if (width & 1) {
1369 YuvJPixel(src_y[0], src_u[0], src_v[0],
1370 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0);
1371 rgb_buf[3] = 255;
1372 }
1373 }
1374
1375 // TODO(fbarchard): replace with common matrix function.
1376 void H422ToARGBRow_C(const uint8* src_y,
1377 const uint8* src_u,
1378 const uint8* src_v,
1379 uint8* rgb_buf,
1380 int width) {
1381 int x;
1382 for (x = 0; x < width - 1; x += 2) {
1383 YuvHPixel(src_y[0], src_u[0], src_v[0],
1384 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1385 rgb_buf[3] = 255;
1386 YuvHPixel(src_y[1], src_u[0], src_v[0],
1387 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6);
1388 rgb_buf[7] = 255;
1389 src_y += 2;
1390 src_u += 1;
1391 src_v += 1;
1392 rgb_buf += 8; // Advance 2 pixels.
1393 }
1394 if (width & 1) {
1395 YuvHPixel(src_y[0], src_u[0], src_v[0],
1396 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1397 rgb_buf[3] = 255;
1398 }
1399 }
1400
1401 void H422ToABGRRow_C(const uint8* src_y,
1402 const uint8* src_u,
1403 const uint8* src_v,
1404 uint8* rgb_buf,
1405 int width) {
1406 int x;
1407 for (x = 0; x < width - 1; x += 2) {
1408 YuvHPixel(src_y[0], src_u[0], src_v[0],
1409 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0);
1410 rgb_buf[3] = 255;
1411 YuvHPixel(src_y[1], src_u[0], src_v[0],
1412 rgb_buf + 6, rgb_buf + 5, rgb_buf + 4);
1413 rgb_buf[7] = 255;
1414 src_y += 2;
1415 src_u += 1;
1416 src_v += 1;
1417 rgb_buf += 8; // Advance 2 pixels.
1418 }
1419 if (width & 1) {
1420 YuvHPixel(src_y[0], src_u[0], src_v[0],
1421 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0);
1422 rgb_buf[3] = 255;
1423 }
1424 }
1425
1426
1427 void I422ToRGB24Row_C(const uint8* src_y, 1356 void I422ToRGB24Row_C(const uint8* src_y,
1428 const uint8* src_u, 1357 const uint8* src_u,
1429 const uint8* src_v, 1358 const uint8* src_v,
1430 uint8* rgb_buf, 1359 uint8* rgb_buf,
1360 struct YuvConstants* yuvconstants,
1431 int width) { 1361 int width) {
1432 int x; 1362 int x;
1433 for (x = 0; x < width - 1; x += 2) { 1363 for (x = 0; x < width - 1; x += 2) {
1434 YuvPixel(src_y[0], src_u[0], src_v[0], 1364 YuvPixel(src_y[0], src_u[0], src_v[0],
1435 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1365 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1436 YuvPixel(src_y[1], src_u[0], src_v[0], 1366 YuvPixel(src_y[1], src_u[0], src_v[0],
1437 rgb_buf + 3, rgb_buf + 4, rgb_buf + 5); 1367 rgb_buf + 3, rgb_buf + 4, rgb_buf + 5, yuvconstants);
1438 src_y += 2; 1368 src_y += 2;
1439 src_u += 1; 1369 src_u += 1;
1440 src_v += 1; 1370 src_v += 1;
1441 rgb_buf += 6; // Advance 2 pixels. 1371 rgb_buf += 6; // Advance 2 pixels.
1442 } 1372 }
1443 if (width & 1) { 1373 if (width & 1) {
1444 YuvPixel(src_y[0], src_u[0], src_v[0], 1374 YuvPixel(src_y[0], src_u[0], src_v[0],
1445 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1375 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1446 } 1376 }
1447 } 1377 }
1448 1378
1449 void I422ToRAWRow_C(const uint8* src_y, 1379 void I422ToRAWRow_C(const uint8* src_y,
1450 const uint8* src_u, 1380 const uint8* src_u,
1451 const uint8* src_v, 1381 const uint8* src_v,
1452 uint8* rgb_buf, 1382 uint8* rgb_buf,
1383 struct YuvConstants* yuvconstants,
1453 int width) { 1384 int width) {
1454 int x; 1385 int x;
1455 for (x = 0; x < width - 1; x += 2) { 1386 for (x = 0; x < width - 1; x += 2) {
1456 YuvPixel(src_y[0], src_u[0], src_v[0], 1387 YuvPixel(src_y[0], src_u[0], src_v[0],
1457 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1388 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1458 YuvPixel(src_y[1], src_u[0], src_v[0], 1389 YuvPixel(src_y[1], src_u[0], src_v[0],
1459 rgb_buf + 5, rgb_buf + 4, rgb_buf + 3); 1390 rgb_buf + 5, rgb_buf + 4, rgb_buf + 3, yuvconstants);
1460 src_y += 2; 1391 src_y += 2;
1461 src_u += 1; 1392 src_u += 1;
1462 src_v += 1; 1393 src_v += 1;
1463 rgb_buf += 6; // Advance 2 pixels. 1394 rgb_buf += 6; // Advance 2 pixels.
1464 } 1395 }
1465 if (width & 1) { 1396 if (width & 1) {
1466 YuvPixel(src_y[0], src_u[0], src_v[0], 1397 YuvPixel(src_y[0], src_u[0], src_v[0],
1467 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1398 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1468 } 1399 }
1469 } 1400 }
1470 1401
1471 void I422ToARGB4444Row_C(const uint8* src_y, 1402 void I422ToARGB4444Row_C(const uint8* src_y,
1472 const uint8* src_u, 1403 const uint8* src_u,
1473 const uint8* src_v, 1404 const uint8* src_v,
1474 uint8* dst_argb4444, 1405 uint8* dst_argb4444,
1406 struct YuvConstants* yuvconstants,
1475 int width) { 1407 int width) {
1476 uint8 b0; 1408 uint8 b0;
1477 uint8 g0; 1409 uint8 g0;
1478 uint8 r0; 1410 uint8 r0;
1479 uint8 b1; 1411 uint8 b1;
1480 uint8 g1; 1412 uint8 g1;
1481 uint8 r1; 1413 uint8 r1;
1482 int x; 1414 int x;
1483 for (x = 0; x < width - 1; x += 2) { 1415 for (x = 0; x < width - 1; x += 2) {
1484 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1416 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1485 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1); 1417 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
1486 b0 = b0 >> 4; 1418 b0 = b0 >> 4;
1487 g0 = g0 >> 4; 1419 g0 = g0 >> 4;
1488 r0 = r0 >> 4; 1420 r0 = r0 >> 4;
1489 b1 = b1 >> 4; 1421 b1 = b1 >> 4;
1490 g1 = g1 >> 4; 1422 g1 = g1 >> 4;
1491 r1 = r1 >> 4; 1423 r1 = r1 >> 4;
1492 *(uint32*)(dst_argb4444) = b0 | (g0 << 4) | (r0 << 8) | 1424 *(uint32*)(dst_argb4444) = b0 | (g0 << 4) | (r0 << 8) |
1493 (b1 << 16) | (g1 << 20) | (r1 << 24) | 0xf000f000; 1425 (b1 << 16) | (g1 << 20) | (r1 << 24) | 0xf000f000;
1494 src_y += 2; 1426 src_y += 2;
1495 src_u += 1; 1427 src_u += 1;
1496 src_v += 1; 1428 src_v += 1;
1497 dst_argb4444 += 4; // Advance 2 pixels. 1429 dst_argb4444 += 4; // Advance 2 pixels.
1498 } 1430 }
1499 if (width & 1) { 1431 if (width & 1) {
1500 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1432 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1501 b0 = b0 >> 4; 1433 b0 = b0 >> 4;
1502 g0 = g0 >> 4; 1434 g0 = g0 >> 4;
1503 r0 = r0 >> 4; 1435 r0 = r0 >> 4;
1504 *(uint16*)(dst_argb4444) = b0 | (g0 << 4) | (r0 << 8) | 1436 *(uint16*)(dst_argb4444) = b0 | (g0 << 4) | (r0 << 8) |
1505 0xf000; 1437 0xf000;
1506 } 1438 }
1507 } 1439 }
1508 1440
1509 void I422ToARGB1555Row_C(const uint8* src_y, 1441 void I422ToARGB1555Row_C(const uint8* src_y,
1510 const uint8* src_u, 1442 const uint8* src_u,
1511 const uint8* src_v, 1443 const uint8* src_v,
1512 uint8* dst_argb1555, 1444 uint8* dst_argb1555,
1445 struct YuvConstants* yuvconstants,
1513 int width) { 1446 int width) {
1514 uint8 b0; 1447 uint8 b0;
1515 uint8 g0; 1448 uint8 g0;
1516 uint8 r0; 1449 uint8 r0;
1517 uint8 b1; 1450 uint8 b1;
1518 uint8 g1; 1451 uint8 g1;
1519 uint8 r1; 1452 uint8 r1;
1520 int x; 1453 int x;
1521 for (x = 0; x < width - 1; x += 2) { 1454 for (x = 0; x < width - 1; x += 2) {
1522 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1455 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1523 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1); 1456 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
1524 b0 = b0 >> 3; 1457 b0 = b0 >> 3;
1525 g0 = g0 >> 3; 1458 g0 = g0 >> 3;
1526 r0 = r0 >> 3; 1459 r0 = r0 >> 3;
1527 b1 = b1 >> 3; 1460 b1 = b1 >> 3;
1528 g1 = g1 >> 3; 1461 g1 = g1 >> 3;
1529 r1 = r1 >> 3; 1462 r1 = r1 >> 3;
1530 *(uint32*)(dst_argb1555) = b0 | (g0 << 5) | (r0 << 10) | 1463 *(uint32*)(dst_argb1555) = b0 | (g0 << 5) | (r0 << 10) |
1531 (b1 << 16) | (g1 << 21) | (r1 << 26) | 0x80008000; 1464 (b1 << 16) | (g1 << 21) | (r1 << 26) | 0x80008000;
1532 src_y += 2; 1465 src_y += 2;
1533 src_u += 1; 1466 src_u += 1;
1534 src_v += 1; 1467 src_v += 1;
1535 dst_argb1555 += 4; // Advance 2 pixels. 1468 dst_argb1555 += 4; // Advance 2 pixels.
1536 } 1469 }
1537 if (width & 1) { 1470 if (width & 1) {
1538 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1471 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1539 b0 = b0 >> 3; 1472 b0 = b0 >> 3;
1540 g0 = g0 >> 3; 1473 g0 = g0 >> 3;
1541 r0 = r0 >> 3; 1474 r0 = r0 >> 3;
1542 *(uint16*)(dst_argb1555) = b0 | (g0 << 5) | (r0 << 10) | 1475 *(uint16*)(dst_argb1555) = b0 | (g0 << 5) | (r0 << 10) |
1543 0x8000; 1476 0x8000;
1544 } 1477 }
1545 } 1478 }
1546 1479
1547 void I422ToRGB565Row_C(const uint8* src_y, 1480 void I422ToRGB565Row_C(const uint8* src_y,
1548 const uint8* src_u, 1481 const uint8* src_u,
1549 const uint8* src_v, 1482 const uint8* src_v,
1550 uint8* dst_rgb565, 1483 uint8* dst_rgb565,
1484 struct YuvConstants* yuvconstants,
1551 int width) { 1485 int width) {
1552 uint8 b0; 1486 uint8 b0;
1553 uint8 g0; 1487 uint8 g0;
1554 uint8 r0; 1488 uint8 r0;
1555 uint8 b1; 1489 uint8 b1;
1556 uint8 g1; 1490 uint8 g1;
1557 uint8 r1; 1491 uint8 r1;
1558 int x; 1492 int x;
1559 for (x = 0; x < width - 1; x += 2) { 1493 for (x = 0; x < width - 1; x += 2) {
1560 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1494 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1561 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1); 1495 YuvPixel(src_y[1], src_u[0], src_v[0], &b1, &g1, &r1, yuvconstants);
1562 b0 = b0 >> 3; 1496 b0 = b0 >> 3;
1563 g0 = g0 >> 2; 1497 g0 = g0 >> 2;
1564 r0 = r0 >> 3; 1498 r0 = r0 >> 3;
1565 b1 = b1 >> 3; 1499 b1 = b1 >> 3;
1566 g1 = g1 >> 2; 1500 g1 = g1 >> 2;
1567 r1 = r1 >> 3; 1501 r1 = r1 >> 3;
1568 *(uint32*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11) | 1502 *(uint32*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11) |
1569 (b1 << 16) | (g1 << 21) | (r1 << 27); 1503 (b1 << 16) | (g1 << 21) | (r1 << 27);
1570 src_y += 2; 1504 src_y += 2;
1571 src_u += 1; 1505 src_u += 1;
1572 src_v += 1; 1506 src_v += 1;
1573 dst_rgb565 += 4; // Advance 2 pixels. 1507 dst_rgb565 += 4; // Advance 2 pixels.
1574 } 1508 }
1575 if (width & 1) { 1509 if (width & 1) {
1576 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0); 1510 YuvPixel(src_y[0], src_u[0], src_v[0], &b0, &g0, &r0, yuvconstants);
1577 b0 = b0 >> 3; 1511 b0 = b0 >> 3;
1578 g0 = g0 >> 2; 1512 g0 = g0 >> 2;
1579 r0 = r0 >> 3; 1513 r0 = r0 >> 3;
1580 *(uint16*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11); 1514 *(uint16*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11);
1581 } 1515 }
1582 } 1516 }
1583 1517
1584 void I411ToARGBRow_C(const uint8* src_y, 1518 void I411ToARGBRow_C(const uint8* src_y,
1585 const uint8* src_u, 1519 const uint8* src_u,
1586 const uint8* src_v, 1520 const uint8* src_v,
1587 uint8* rgb_buf, 1521 uint8* rgb_buf,
1522 struct YuvConstants* yuvconstants,
1588 int width) { 1523 int width) {
1589 int x; 1524 int x;
1590 for (x = 0; x < width - 3; x += 4) { 1525 for (x = 0; x < width - 3; x += 4) {
1591 YuvPixel(src_y[0], src_u[0], src_v[0], 1526 YuvPixel(src_y[0], src_u[0], src_v[0],
1592 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1527 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1593 rgb_buf[3] = 255; 1528 rgb_buf[3] = 255;
1594 YuvPixel(src_y[1], src_u[0], src_v[0], 1529 YuvPixel(src_y[1], src_u[0], src_v[0],
1595 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1530 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1596 rgb_buf[7] = 255; 1531 rgb_buf[7] = 255;
1597 YuvPixel(src_y[2], src_u[0], src_v[0], 1532 YuvPixel(src_y[2], src_u[0], src_v[0],
1598 rgb_buf + 8, rgb_buf + 9, rgb_buf + 10); 1533 rgb_buf + 8, rgb_buf + 9, rgb_buf + 10, yuvconstants);
1599 rgb_buf[11] = 255; 1534 rgb_buf[11] = 255;
1600 YuvPixel(src_y[3], src_u[0], src_v[0], 1535 YuvPixel(src_y[3], src_u[0], src_v[0],
1601 rgb_buf + 12, rgb_buf + 13, rgb_buf + 14); 1536 rgb_buf + 12, rgb_buf + 13, rgb_buf + 14, yuvconstants);
1602 rgb_buf[15] = 255; 1537 rgb_buf[15] = 255;
1603 src_y += 4; 1538 src_y += 4;
1604 src_u += 1; 1539 src_u += 1;
1605 src_v += 1; 1540 src_v += 1;
1606 rgb_buf += 16; // Advance 4 pixels. 1541 rgb_buf += 16; // Advance 4 pixels.
1607 } 1542 }
1608 if (width & 2) { 1543 if (width & 2) {
1609 YuvPixel(src_y[0], src_u[0], src_v[0], 1544 YuvPixel(src_y[0], src_u[0], src_v[0],
1610 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1545 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1611 rgb_buf[3] = 255; 1546 rgb_buf[3] = 255;
1612 YuvPixel(src_y[1], src_u[0], src_v[0], 1547 YuvPixel(src_y[1], src_u[0], src_v[0],
1613 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1548 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1614 rgb_buf[7] = 255; 1549 rgb_buf[7] = 255;
1615 src_y += 2; 1550 src_y += 2;
1616 rgb_buf += 8; // Advance 2 pixels. 1551 rgb_buf += 8; // Advance 2 pixels.
1617 } 1552 }
1618 if (width & 1) { 1553 if (width & 1) {
1619 YuvPixel(src_y[0], src_u[0], src_v[0], 1554 YuvPixel(src_y[0], src_u[0], src_v[0],
1620 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1555 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1621 rgb_buf[3] = 255; 1556 rgb_buf[3] = 255;
1622 } 1557 }
1623 } 1558 }
1624 1559
1625 void NV12ToARGBRow_C(const uint8* src_y, 1560 void NV12ToARGBRow_C(const uint8* src_y,
1626 const uint8* src_uv, 1561 const uint8* src_uv,
1627 uint8* rgb_buf, 1562 uint8* rgb_buf,
1563 struct YuvConstants* yuvconstants,
1628 int width) { 1564 int width) {
1629 int x; 1565 int x;
1630 for (x = 0; x < width - 1; x += 2) { 1566 for (x = 0; x < width - 1; x += 2) {
1631 YuvPixel(src_y[0], src_uv[0], src_uv[1], 1567 YuvPixel(src_y[0], src_uv[0], src_uv[1],
1632 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1568 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1633 rgb_buf[3] = 255; 1569 rgb_buf[3] = 255;
1634 YuvPixel(src_y[1], src_uv[0], src_uv[1], 1570 YuvPixel(src_y[1], src_uv[0], src_uv[1],
1635 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1571 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1636 rgb_buf[7] = 255; 1572 rgb_buf[7] = 255;
1637 src_y += 2; 1573 src_y += 2;
1638 src_uv += 2; 1574 src_uv += 2;
1639 rgb_buf += 8; // Advance 2 pixels. 1575 rgb_buf += 8; // Advance 2 pixels.
1640 } 1576 }
1641 if (width & 1) { 1577 if (width & 1) {
1642 YuvPixel(src_y[0], src_uv[0], src_uv[1], 1578 YuvPixel(src_y[0], src_uv[0], src_uv[1],
1643 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1579 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1644 rgb_buf[3] = 255; 1580 rgb_buf[3] = 255;
1645 } 1581 }
1646 } 1582 }
1647
1648 void NV21ToARGBRow_C(const uint8* src_y,
1649 const uint8* src_vu,
1650 uint8* rgb_buf,
1651 int width) {
1652 int x;
1653 for (x = 0; x < width - 1; x += 2) {
1654 YuvPixel(src_y[0], src_vu[1], src_vu[0],
1655 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1656 rgb_buf[3] = 255;
1657
1658 YuvPixel(src_y[1], src_vu[1], src_vu[0],
1659 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6);
1660 rgb_buf[7] = 255;
1661
1662 src_y += 2;
1663 src_vu += 2;
1664 rgb_buf += 8; // Advance 2 pixels.
1665 }
1666 if (width & 1) {
1667 YuvPixel(src_y[0], src_vu[1], src_vu[0],
1668 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1669 rgb_buf[3] = 255;
1670 }
1671 }
1672 1583
1673 void NV12ToRGB565Row_C(const uint8* src_y, 1584 void NV12ToRGB565Row_C(const uint8* src_y,
1674 const uint8* src_uv, 1585 const uint8* src_uv,
1675 uint8* dst_rgb565, 1586 uint8* dst_rgb565,
1587 struct YuvConstants* yuvconstants,
1676 int width) { 1588 int width) {
1677 uint8 b0; 1589 uint8 b0;
1678 uint8 g0; 1590 uint8 g0;
1679 uint8 r0; 1591 uint8 r0;
1680 uint8 b1; 1592 uint8 b1;
1681 uint8 g1; 1593 uint8 g1;
1682 uint8 r1; 1594 uint8 r1;
1683 int x; 1595 int x;
1684 for (x = 0; x < width - 1; x += 2) { 1596 for (x = 0; x < width - 1; x += 2) {
1685 YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0); 1597 YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0, yuvconstants);
1686 YuvPixel(src_y[1], src_uv[0], src_uv[1], &b1, &g1, &r1); 1598 YuvPixel(src_y[1], src_uv[0], src_uv[1], &b1, &g1, &r1, yuvconstants);
1687 b0 = b0 >> 3; 1599 b0 = b0 >> 3;
1688 g0 = g0 >> 2; 1600 g0 = g0 >> 2;
1689 r0 = r0 >> 3; 1601 r0 = r0 >> 3;
1690 b1 = b1 >> 3; 1602 b1 = b1 >> 3;
1691 g1 = g1 >> 2; 1603 g1 = g1 >> 2;
1692 r1 = r1 >> 3; 1604 r1 = r1 >> 3;
1693 *(uint32*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11) | 1605 *(uint32*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11) |
1694 (b1 << 16) | (g1 << 21) | (r1 << 27); 1606 (b1 << 16) | (g1 << 21) | (r1 << 27);
1695 src_y += 2; 1607 src_y += 2;
1696 src_uv += 2; 1608 src_uv += 2;
1697 dst_rgb565 += 4; // Advance 2 pixels. 1609 dst_rgb565 += 4; // Advance 2 pixels.
1698 } 1610 }
1699 if (width & 1) { 1611 if (width & 1) {
1700 YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0); 1612 YuvPixel(src_y[0], src_uv[0], src_uv[1], &b0, &g0, &r0, yuvconstants);
1701 b0 = b0 >> 3; 1613 b0 = b0 >> 3;
1702 g0 = g0 >> 2; 1614 g0 = g0 >> 2;
1703 r0 = r0 >> 3; 1615 r0 = r0 >> 3;
1704 *(uint16*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11);
1705 }
1706 }
1707
1708 void NV21ToRGB565Row_C(const uint8* src_y,
1709 const uint8* vsrc_u,
1710 uint8* dst_rgb565,
1711 int width) {
1712 uint8 b0;
1713 uint8 g0;
1714 uint8 r0;
1715 uint8 b1;
1716 uint8 g1;
1717 uint8 r1;
1718 int x;
1719 for (x = 0; x < width - 1; x += 2) {
1720 YuvPixel(src_y[0], vsrc_u[1], vsrc_u[0], &b0, &g0, &r0);
1721 YuvPixel(src_y[1], vsrc_u[1], vsrc_u[0], &b1, &g1, &r1);
1722 b0 = b0 >> 3;
1723 g0 = g0 >> 2;
1724 r0 = r0 >> 3;
1725 b1 = b1 >> 3;
1726 g1 = g1 >> 2;
1727 r1 = r1 >> 3;
1728 *(uint32*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11) |
1729 (b1 << 16) | (g1 << 21) | (r1 << 27);
1730 src_y += 2;
1731 vsrc_u += 2;
1732 dst_rgb565 += 4; // Advance 2 pixels.
1733 }
1734 if (width & 1) {
1735 YuvPixel(src_y[0], vsrc_u[1], vsrc_u[0], &b0, &g0, &r0);
1736 b0 = b0 >> 3;
1737 g0 = g0 >> 2;
1738 r0 = r0 >> 3;
1739 *(uint16*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11); 1616 *(uint16*)(dst_rgb565) = b0 | (g0 << 5) | (r0 << 11);
1740 } 1617 }
1741 } 1618 }
1742 1619
1743 void YUY2ToARGBRow_C(const uint8* src_yuy2, 1620 void YUY2ToARGBRow_C(const uint8* src_yuy2,
1744 uint8* rgb_buf, 1621 uint8* rgb_buf,
1622 struct YuvConstants* yuvconstants,
1745 int width) { 1623 int width) {
1746 int x; 1624 int x;
1747 for (x = 0; x < width - 1; x += 2) { 1625 for (x = 0; x < width - 1; x += 2) {
1748 YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3], 1626 YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3],
1749 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1627 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1750 rgb_buf[3] = 255; 1628 rgb_buf[3] = 255;
1751 YuvPixel(src_yuy2[2], src_yuy2[1], src_yuy2[3], 1629 YuvPixel(src_yuy2[2], src_yuy2[1], src_yuy2[3],
1752 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1630 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1753 rgb_buf[7] = 255; 1631 rgb_buf[7] = 255;
1754 src_yuy2 += 4; 1632 src_yuy2 += 4;
1755 rgb_buf += 8; // Advance 2 pixels. 1633 rgb_buf += 8; // Advance 2 pixels.
1756 } 1634 }
1757 if (width & 1) { 1635 if (width & 1) {
1758 YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3], 1636 YuvPixel(src_yuy2[0], src_yuy2[1], src_yuy2[3],
1759 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1637 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1760 rgb_buf[3] = 255; 1638 rgb_buf[3] = 255;
1761 } 1639 }
1762 } 1640 }
1763 1641
1764 void UYVYToARGBRow_C(const uint8* src_uyvy, 1642 void UYVYToARGBRow_C(const uint8* src_uyvy,
1765 uint8* rgb_buf, 1643 uint8* rgb_buf,
1644 struct YuvConstants* yuvconstants,
1766 int width) { 1645 int width) {
1767 int x; 1646 int x;
1768 for (x = 0; x < width - 1; x += 2) { 1647 for (x = 0; x < width - 1; x += 2) {
1769 YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2], 1648 YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2],
1770 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1649 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1771 rgb_buf[3] = 255; 1650 rgb_buf[3] = 255;
1772 YuvPixel(src_uyvy[3], src_uyvy[0], src_uyvy[2], 1651 YuvPixel(src_uyvy[3], src_uyvy[0], src_uyvy[2],
1773 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1652 rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, yuvconstants);
1774 rgb_buf[7] = 255; 1653 rgb_buf[7] = 255;
1775 src_uyvy += 4; 1654 src_uyvy += 4;
1776 rgb_buf += 8; // Advance 2 pixels. 1655 rgb_buf += 8; // Advance 2 pixels.
1777 } 1656 }
1778 if (width & 1) { 1657 if (width & 1) {
1779 YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2], 1658 YuvPixel(src_uyvy[1], src_uyvy[0], src_uyvy[2],
1780 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1659 rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, yuvconstants);
1781 rgb_buf[3] = 255; 1660 rgb_buf[3] = 255;
1782 } 1661 }
1783 } 1662 }
1784 1663
1785 void I422ToBGRARow_C(const uint8* src_y, 1664 void I422ToBGRARow_C(const uint8* src_y,
1786 const uint8* src_u, 1665 const uint8* src_u,
1787 const uint8* src_v, 1666 const uint8* src_v,
1788 uint8* rgb_buf, 1667 uint8* rgb_buf,
1668 struct YuvConstants* yuvconstants,
1789 int width) { 1669 int width) {
1790 int x; 1670 int x;
1791 for (x = 0; x < width - 1; x += 2) { 1671 for (x = 0; x < width - 1; x += 2) {
1792 YuvPixel(src_y[0], src_u[0], src_v[0], 1672 YuvPixel(src_y[0], src_u[0], src_v[0],
1793 rgb_buf + 3, rgb_buf + 2, rgb_buf + 1); 1673 rgb_buf + 3, rgb_buf + 2, rgb_buf + 1, yuvconstants);
1794 rgb_buf[0] = 255; 1674 rgb_buf[0] = 255;
1795 YuvPixel(src_y[1], src_u[0], src_v[0], 1675 YuvPixel(src_y[1], src_u[0], src_v[0],
1796 rgb_buf + 7, rgb_buf + 6, rgb_buf + 5); 1676 rgb_buf + 7, rgb_buf + 6, rgb_buf + 5, yuvconstants);
1797 rgb_buf[4] = 255; 1677 rgb_buf[4] = 255;
1798 src_y += 2; 1678 src_y += 2;
1799 src_u += 1; 1679 src_u += 1;
1800 src_v += 1; 1680 src_v += 1;
1801 rgb_buf += 8; // Advance 2 pixels. 1681 rgb_buf += 8; // Advance 2 pixels.
1802 } 1682 }
1803 if (width & 1) { 1683 if (width & 1) {
1804 YuvPixel(src_y[0], src_u[0], src_v[0], 1684 YuvPixel(src_y[0], src_u[0], src_v[0],
1805 rgb_buf + 3, rgb_buf + 2, rgb_buf + 1); 1685 rgb_buf + 3, rgb_buf + 2, rgb_buf + 1, yuvconstants);
1806 rgb_buf[0] = 255; 1686 rgb_buf[0] = 255;
1807 } 1687 }
1808 } 1688 }
1809 1689
1810 void I422ToABGRRow_C(const uint8* src_y, 1690 void I422ToABGRRow_C(const uint8* src_y,
1811 const uint8* src_u, 1691 const uint8* src_u,
1812 const uint8* src_v, 1692 const uint8* src_v,
1813 uint8* rgb_buf, 1693 uint8* rgb_buf,
1694 struct YuvConstants* yuvconstants,
1814 int width) { 1695 int width) {
1815 int x; 1696 int x;
1816 for (x = 0; x < width - 1; x += 2) { 1697 for (x = 0; x < width - 1; x += 2) {
1817 YuvPixel(src_y[0], src_u[0], src_v[0], 1698 YuvPixel(src_y[0], src_u[0], src_v[0],
1818 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1699 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1819 rgb_buf[3] = 255; 1700 rgb_buf[3] = 255;
1820 YuvPixel(src_y[1], src_u[0], src_v[0], 1701 YuvPixel(src_y[1], src_u[0], src_v[0],
1821 rgb_buf + 6, rgb_buf + 5, rgb_buf + 4); 1702 rgb_buf + 6, rgb_buf + 5, rgb_buf + 4, yuvconstants);
1822 rgb_buf[7] = 255; 1703 rgb_buf[7] = 255;
1823 src_y += 2; 1704 src_y += 2;
1824 src_u += 1; 1705 src_u += 1;
1825 src_v += 1; 1706 src_v += 1;
1826 rgb_buf += 8; // Advance 2 pixels. 1707 rgb_buf += 8; // Advance 2 pixels.
1827 } 1708 }
1828 if (width & 1) { 1709 if (width & 1) {
1829 YuvPixel(src_y[0], src_u[0], src_v[0], 1710 YuvPixel(src_y[0], src_u[0], src_v[0],
1830 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0); 1711 rgb_buf + 2, rgb_buf + 1, rgb_buf + 0, yuvconstants);
1831 rgb_buf[3] = 255; 1712 rgb_buf[3] = 255;
1832 } 1713 }
1833 } 1714 }
1834 1715
1835 void I422ToRGBARow_C(const uint8* src_y, 1716 void I422ToRGBARow_C(const uint8* src_y,
1836 const uint8* src_u, 1717 const uint8* src_u,
1837 const uint8* src_v, 1718 const uint8* src_v,
1838 uint8* rgb_buf, 1719 uint8* rgb_buf,
1720 struct YuvConstants* yuvconstants,
1839 int width) { 1721 int width) {
1840 int x; 1722 int x;
1841 for (x = 0; x < width - 1; x += 2) { 1723 for (x = 0; x < width - 1; x += 2) {
1842 YuvPixel(src_y[0], src_u[0], src_v[0], 1724 YuvPixel(src_y[0], src_u[0], src_v[0],
1843 rgb_buf + 1, rgb_buf + 2, rgb_buf + 3); 1725 rgb_buf + 1, rgb_buf + 2, rgb_buf + 3, yuvconstants);
1844 rgb_buf[0] = 255; 1726 rgb_buf[0] = 255;
1845 YuvPixel(src_y[1], src_u[0], src_v[0], 1727 YuvPixel(src_y[1], src_u[0], src_v[0],
1846 rgb_buf + 5, rgb_buf + 6, rgb_buf + 7); 1728 rgb_buf + 5, rgb_buf + 6, rgb_buf + 7, yuvconstants);
1847 rgb_buf[4] = 255; 1729 rgb_buf[4] = 255;
1848 src_y += 2; 1730 src_y += 2;
1849 src_u += 1; 1731 src_u += 1;
1850 src_v += 1; 1732 src_v += 1;
1851 rgb_buf += 8; // Advance 2 pixels. 1733 rgb_buf += 8; // Advance 2 pixels.
1852 } 1734 }
1853 if (width & 1) { 1735 if (width & 1) {
1854 YuvPixel(src_y[0], src_u[0], src_v[0], 1736 YuvPixel(src_y[0], src_u[0], src_v[0],
1855 rgb_buf + 1, rgb_buf + 2, rgb_buf + 3); 1737 rgb_buf + 1, rgb_buf + 2, rgb_buf + 3, yuvconstants);
1856 rgb_buf[0] = 255; 1738 rgb_buf[0] = 255;
1857 } 1739 }
1858 } 1740 }
1859 1741
1860 void I400ToARGBRow_C(const uint8* src_y, uint8* rgb_buf, int width) { 1742 void I400ToARGBRow_C(const uint8* src_y, uint8* rgb_buf, int width) {
1861 int x; 1743 int x;
1862 for (x = 0; x < width - 1; x += 2) { 1744 for (x = 0; x < width - 1; x += 2) {
1863 YPixel(src_y[0], rgb_buf + 0, rgb_buf + 1, rgb_buf + 2); 1745 YPixel(src_y[0], rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
1864 rgb_buf[3] = 255; 1746 rgb_buf[3] = 255;
1865 YPixel(src_y[1], rgb_buf + 4, rgb_buf + 5, rgb_buf + 6); 1747 YPixel(src_y[1], rgb_buf + 4, rgb_buf + 5, rgb_buf + 6);
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 src_v += 1; 2276 src_v += 1;
2395 } 2277 }
2396 if (width & 1) { 2278 if (width & 1) {
2397 dst_frame[0] = src_u[0]; 2279 dst_frame[0] = src_u[0];
2398 dst_frame[1] = src_y[0]; 2280 dst_frame[1] = src_y[0];
2399 dst_frame[2] = src_v[0]; 2281 dst_frame[2] = src_v[0];
2400 dst_frame[3] = 0; 2282 dst_frame[3] = 0;
2401 } 2283 }
2402 } 2284 }
2403 2285
2404 #define ANYYUV(NAMEANY, ANY_SIMD, YUVCONSTANTS) \
2405 void NAMEANY(const uint8* y_buf, \
2406 const uint8* u_buf, \
2407 const uint8* v_buf, \
2408 uint8* dst_argb, \
2409 int width) { \
2410 ANY_SIMD(y_buf, u_buf, v_buf, dst_argb, &YUVCONSTANTS, width); \
2411 }
2412 2286
2413 #ifdef HAS_I422TOARGBMATRIXROW_NEON 2287 void ARGBPolynomialRow_C(const uint8* src_argb,
2414 ANYYUV(I422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvConstantsNEON) 2288 uint8* dst_argb,
2415 ANYYUV(J422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvJConstantsNEON) 2289 const float* poly,
2416 ANYYUV(H422ToARGBRow_NEON, I422ToARGBMatrixRow_NEON, kYuvHConstantsNEON) 2290 int width) {
2417 #endif 2291 int i;
2418 #ifdef HAS_I422TOABGRMATRIXROW_NEON 2292 for (i = 0; i < width; ++i) {
2419 ANYYUV(I422ToABGRRow_NEON, I422ToABGRMatrixRow_NEON, kYuvConstantsNEON) 2293 float b = (float)(src_argb[0]);
2420 ANYYUV(J422ToABGRRow_NEON, I422ToABGRMatrixRow_NEON, kYuvJConstantsNEON) 2294 float g = (float)(src_argb[1]);
2421 ANYYUV(H422ToABGRRow_NEON, I422ToABGRMatrixRow_NEON, kYuvHConstantsNEON) 2295 float r = (float)(src_argb[2]);
2422 #endif 2296 float a = (float)(src_argb[3]);
2423 #ifdef HAS_I422TOARGBMATRIXROW_SSSE3 2297 float b2 = b * b;
2424 ANYYUV(I422ToARGBRow_SSSE3, I422ToARGBMatrixRow_SSSE3, kYuvConstants) 2298 float g2 = g * g;
2425 ANYYUV(J422ToARGBRow_SSSE3, I422ToARGBMatrixRow_SSSE3, kYuvJConstants) 2299 float r2 = r * r;
2426 ANYYUV(H422ToARGBRow_SSSE3, I422ToARGBMatrixRow_SSSE3, kYuvHConstants) 2300 float a2 = a * a;
2427 #endif 2301 float db = poly[0] + poly[4] * b;
2428 #ifdef HAS_I422TOARGBMATRIXROW_AVX2 2302 float dg = poly[1] + poly[5] * g;
2429 ANYYUV(I422ToARGBRow_AVX2, I422ToARGBMatrixRow_AVX2, kYuvConstants) 2303 float dr = poly[2] + poly[6] * r;
2430 ANYYUV(J422ToARGBRow_AVX2, I422ToARGBMatrixRow_AVX2, kYuvJConstants) 2304 float da = poly[3] + poly[7] * a;
2431 ANYYUV(H422ToARGBRow_AVX2, I422ToARGBMatrixRow_AVX2, kYuvHConstants) 2305 float b3 = b2 * b;
2432 #endif 2306 float g3 = g2 * g;
2433 #ifdef HAS_I422TOABGRMATRIXROW_SSSE3 2307 float r3 = r2 * r;
2434 ANYYUV(I422ToABGRRow_SSSE3, I422ToABGRMatrixRow_SSSE3, kYuvConstants) 2308 float a3 = a2 * a;
2435 ANYYUV(J422ToABGRRow_SSSE3, I422ToABGRMatrixRow_SSSE3, kYuvJConstants) 2309 db += poly[8] * b2;
2436 ANYYUV(H422ToABGRRow_SSSE3, I422ToABGRMatrixRow_SSSE3, kYuvHConstants) 2310 dg += poly[9] * g2;
2437 #endif 2311 dr += poly[10] * r2;
2438 #ifdef HAS_I422TOABGRMATRIXROW_AVX2 2312 da += poly[11] * a2;
2439 ANYYUV(I422ToABGRRow_AVX2, I422ToABGRMatrixRow_AVX2, kYuvConstants) 2313 db += poly[12] * b3;
2440 ANYYUV(J422ToABGRRow_AVX2, I422ToABGRMatrixRow_AVX2, kYuvJConstants) 2314 dg += poly[13] * g3;
2441 ANYYUV(H422ToABGRRow_AVX2, I422ToABGRMatrixRow_AVX2, kYuvHConstants) 2315 dr += poly[14] * r3;
2442 #endif 2316 da += poly[15] * a3;
2443 // TODO(fbarchard): Neon, J444, H444 versions. 2317
2444 #ifdef HAS_I444TOARGBMATRIXROW_SSSE3 2318 dst_argb[0] = Clamp((int32)(db));
2445 ANYYUV(I444ToARGBRow_SSSE3, I444ToARGBMatrixRow_SSSE3, kYuvConstants) 2319 dst_argb[1] = Clamp((int32)(dg));
2446 #endif 2320 dst_argb[2] = Clamp((int32)(dr));
2447 #ifdef HAS_I444TOARGBMATRIXROW_AVX2 2321 dst_argb[3] = Clamp((int32)(da));
2448 ANYYUV(I444ToARGBRow_AVX2, I444ToARGBMatrixRow_AVX2, kYuvConstants) 2322 src_argb += 4;
2449 #endif 2323 dst_argb += 4;
2450 #ifdef HAS_I444TOABGRMATRIXROW_SSSE3 2324 }
2451 ANYYUV(I444ToABGRRow_SSSE3, I444ToABGRMatrixRow_SSSE3, kYuvConstants) 2325 }
2452 #endif 2326
2453 #ifdef HAS_I444TOABGRMATRIXROW_AVX2 2327 void ARGBLumaColorTableRow_C(const uint8* src_argb, uint8* dst_argb, int width,
2454 ANYYUV(I444ToABGRRow_AVX2, I444ToABGRMatrixRow_AVX2, kYuvConstants) 2328 const uint8* luma, uint32 lumacoeff) {
2455 #endif 2329 uint32 bc = lumacoeff & 0xff;
2330 uint32 gc = (lumacoeff >> 8) & 0xff;
2331 uint32 rc = (lumacoeff >> 16) & 0xff;
2332
2333 int i;
2334 for (i = 0; i < width - 1; i += 2) {
2335 // Luminance in rows, color values in columns.
2336 const uint8* luma0 = ((src_argb[0] * bc + src_argb[1] * gc +
2337 src_argb[2] * rc) & 0x7F00u) + luma;
2338 const uint8* luma1;
2339 dst_argb[0] = luma0[src_argb[0]];
2340 dst_argb[1] = luma0[src_argb[1]];
2341 dst_argb[2] = luma0[src_argb[2]];
2342 dst_argb[3] = src_argb[3];
2343 luma1 = ((src_argb[4] * bc + src_argb[5] * gc +
2344 src_argb[6] * rc) & 0x7F00u) + luma;
2345 dst_argb[4] = luma1[src_argb[4]];
2346 dst_argb[5] = luma1[src_argb[5]];
2347 dst_argb[6] = luma1[src_argb[6]];
2348 dst_argb[7] = src_argb[7];
2349 src_argb += 8;
2350 dst_argb += 8;
2351 }
2352 if (width & 1) {
2353 // Luminance in rows, color values in columns.
2354 const uint8* luma0 = ((src_argb[0] * bc + src_argb[1] * gc +
2355 src_argb[2] * rc) & 0x7F00u) + luma;
2356 dst_argb[0] = luma0[src_argb[0]];
2357 dst_argb[1] = luma0[src_argb[1]];
2358 dst_argb[2] = luma0[src_argb[2]];
2359 dst_argb[3] = src_argb[3];
2360 }
2361 }
2362
2363 void ARGBCopyAlphaRow_C(const uint8* src, uint8* dst, int width) {
2364 int i;
2365 for (i = 0; i < width - 1; i += 2) {
2366 dst[3] = src[3];
2367 dst[7] = src[7];
2368 dst += 8;
2369 src += 8;
2370 }
2371 if (width & 1) {
2372 dst[3] = src[3];
2373 }
2374 }
2375
2376 void ARGBCopyYToAlphaRow_C(const uint8* src, uint8* dst, int width) {
2377 int i;
2378 for (i = 0; i < width - 1; i += 2) {
2379 dst[3] = src[0];
2380 dst[7] = src[1];
2381 dst += 8;
2382 src += 2;
2383 }
2384 if (width & 1) {
2385 dst[3] = src[0];
2386 }
2387 }
2456 2388
2457 // Maximum temporary width for wrappers to process at a time, in pixels. 2389 // Maximum temporary width for wrappers to process at a time, in pixels.
2458 #define MAXTWIDTH 2048 2390 #define MAXTWIDTH 2048
2459 2391
2460 #if !(defined(_MSC_VER) && defined(_M_IX86)) && \ 2392 #if !(defined(_MSC_VER) && defined(_M_IX86)) && \
2461 defined(HAS_I422TORGB565ROW_SSSE3) 2393 defined(HAS_I422TORGB565ROW_SSSE3)
2462 // row_win.cc has asm version, but GCC uses 2 step wrapper. 2394 // row_win.cc has asm version, but GCC uses 2 step wrapper.
2463 void I422ToRGB565Row_SSSE3(const uint8* src_y, 2395 void I422ToRGB565Row_SSSE3(const uint8* src_y,
2464 const uint8* src_u, 2396 const uint8* src_u,
2465 const uint8* src_v, 2397 const uint8* src_v,
2466 uint8* dst_rgb565, 2398 uint8* dst_rgb565,
2399 struct YuvConstants* yuvconstants,
2467 int width) { 2400 int width) {
2468 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]); 2401 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
2469 while (width > 0) { 2402 while (width > 0) {
2470 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2403 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2471 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, twidth); 2404 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
2472 ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth); 2405 ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
2473 src_y += twidth; 2406 src_y += twidth;
2474 src_u += twidth / 2; 2407 src_u += twidth / 2;
2475 src_v += twidth / 2; 2408 src_v += twidth / 2;
2476 dst_rgb565 += twidth * 2; 2409 dst_rgb565 += twidth * 2;
2477 width -= twidth; 2410 width -= twidth;
2478 } 2411 }
2479 } 2412 }
2480 #endif 2413 #endif
2481 2414
2482 #if defined(HAS_I422TOARGB1555ROW_SSSE3) 2415 #if defined(HAS_I422TOARGB1555ROW_SSSE3)
2483 void I422ToARGB1555Row_SSSE3(const uint8* src_y, 2416 void I422ToARGB1555Row_SSSE3(const uint8* src_y,
2484 const uint8* src_u, 2417 const uint8* src_u,
2485 const uint8* src_v, 2418 const uint8* src_v,
2486 uint8* dst_argb1555, 2419 uint8* dst_argb1555,
2420 struct YuvConstants* yuvconstants,
2487 int width) { 2421 int width) {
2488 // Row buffer for intermediate ARGB pixels. 2422 // Row buffer for intermediate ARGB pixels.
2489 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]); 2423 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
2490 while (width > 0) { 2424 while (width > 0) {
2491 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2425 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2492 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, twidth); 2426 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
2493 ARGBToARGB1555Row_SSE2(row, dst_argb1555, twidth); 2427 ARGBToARGB1555Row_SSE2(row, dst_argb1555, twidth);
2494 src_y += twidth; 2428 src_y += twidth;
2495 src_u += twidth / 2; 2429 src_u += twidth / 2;
2496 src_v += twidth / 2; 2430 src_v += twidth / 2;
2497 dst_argb1555 += twidth * 2; 2431 dst_argb1555 += twidth * 2;
2498 width -= twidth; 2432 width -= twidth;
2499 } 2433 }
2500 } 2434 }
2501 #endif 2435 #endif
2502 2436
2503 #if defined(HAS_I422TOARGB4444ROW_SSSE3) 2437 #if defined(HAS_I422TOARGB4444ROW_SSSE3)
2504 void I422ToARGB4444Row_SSSE3(const uint8* src_y, 2438 void I422ToARGB4444Row_SSSE3(const uint8* src_y,
2505 const uint8* src_u, 2439 const uint8* src_u,
2506 const uint8* src_v, 2440 const uint8* src_v,
2507 uint8* dst_argb4444, 2441 uint8* dst_argb4444,
2442 struct YuvConstants* yuvconstants,
2508 int width) { 2443 int width) {
2509 // Row buffer for intermediate ARGB pixels. 2444 // Row buffer for intermediate ARGB pixels.
2510 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]); 2445 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
2511 while (width > 0) { 2446 while (width > 0) {
2512 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2447 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2513 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, twidth); 2448 I422ToARGBRow_SSSE3(src_y, src_u, src_v, row, yuvconstants, twidth);
2514 ARGBToARGB4444Row_SSE2(row, dst_argb4444, twidth); 2449 ARGBToARGB4444Row_SSE2(row, dst_argb4444, twidth);
2515 src_y += twidth; 2450 src_y += twidth;
2516 src_u += twidth / 2; 2451 src_u += twidth / 2;
2517 src_v += twidth / 2; 2452 src_v += twidth / 2;
2518 dst_argb4444 += twidth * 2; 2453 dst_argb4444 += twidth * 2;
2519 width -= twidth; 2454 width -= twidth;
2520 } 2455 }
2521 } 2456 }
2522 #endif 2457 #endif
2523 2458
2524 #if defined(HAS_NV12TORGB565ROW_SSSE3) 2459 #if defined(HAS_NV12TORGB565ROW_SSSE3)
2525 void NV12ToRGB565Row_SSSE3(const uint8* src_y, const uint8* src_uv, 2460 void NV12ToRGB565Row_SSSE3(const uint8* src_y,
2526 uint8* dst_rgb565, int width) { 2461 const uint8* src_uv,
2462 uint8* dst_rgb565,
2463 struct YuvConstants* yuvconstants,
2464 int width) {
2527 // Row buffer for intermediate ARGB pixels. 2465 // Row buffer for intermediate ARGB pixels.
2528 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]); 2466 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
2529 while (width > 0) { 2467 while (width > 0) {
2530 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2468 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2531 NV12ToARGBRow_SSSE3(src_y, src_uv, row, twidth); 2469 NV12ToARGBRow_SSSE3(src_y, src_uv, row, yuvconstants, twidth);
2532 ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth); 2470 ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
2533 src_y += twidth; 2471 src_y += twidth;
2534 src_uv += twidth; 2472 src_uv += twidth;
2535 dst_rgb565 += twidth * 2; 2473 dst_rgb565 += twidth * 2;
2536 width -= twidth; 2474 width -= twidth;
2537 } 2475 }
2538 } 2476 }
2539 #endif 2477 #endif
2540 2478
2541 #if defined(HAS_NV21TORGB565ROW_SSSE3)
2542 void NV21ToRGB565Row_SSSE3(const uint8* src_y, const uint8* src_vu,
2543 uint8* dst_rgb565, int width) {
2544 // Row buffer for intermediate ARGB pixels.
2545 SIMD_ALIGNED(uint8 row[MAXTWIDTH * 4]);
2546 while (width > 0) {
2547 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2548 NV21ToARGBRow_SSSE3(src_y, src_vu, row, twidth);
2549 ARGBToRGB565Row_SSE2(row, dst_rgb565, twidth);
2550 src_y += twidth;
2551 src_vu += twidth;
2552 dst_rgb565 += twidth * 2;
2553 width -= twidth;
2554 }
2555 }
2556 #endif
2557
2558 #if defined(HAS_YUY2TOARGBROW_SSSE3) 2479 #if defined(HAS_YUY2TOARGBROW_SSSE3)
2559 void YUY2ToARGBRow_SSSE3(const uint8* src_yuy2, uint8* dst_argb, int width) { 2480 void YUY2ToARGBRow_SSSE3(const uint8* src_yuy2,
2481 uint8* dst_argb,
2482 struct YuvConstants* yuvconstants,
2483 int width) {
2560 // Row buffers for intermediate YUV pixels. 2484 // Row buffers for intermediate YUV pixels.
2561 SIMD_ALIGNED(uint8 row_y[MAXTWIDTH]); 2485 SIMD_ALIGNED(uint8 row_y[MAXTWIDTH]);
2562 SIMD_ALIGNED(uint8 row_u[MAXTWIDTH / 2]); 2486 SIMD_ALIGNED(uint8 row_u[MAXTWIDTH / 2]);
2563 SIMD_ALIGNED(uint8 row_v[MAXTWIDTH / 2]); 2487 SIMD_ALIGNED(uint8 row_v[MAXTWIDTH / 2]);
2564 while (width > 0) { 2488 while (width > 0) {
2565 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2489 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2566 YUY2ToUV422Row_SSE2(src_yuy2, row_u, row_v, twidth); 2490 YUY2ToUV422Row_SSE2(src_yuy2, row_u, row_v, twidth);
2567 YUY2ToYRow_SSE2(src_yuy2, row_y, twidth); 2491 YUY2ToYRow_SSE2(src_yuy2, row_y, twidth);
2568 I422ToARGBRow_SSSE3(row_y, row_u, row_v, dst_argb, twidth); 2492 I422ToARGBRow_SSSE3(row_y, row_u, row_v, dst_argb, yuvconstants, twidth);
2569 src_yuy2 += twidth * 2; 2493 src_yuy2 += twidth * 2;
2570 dst_argb += twidth * 4; 2494 dst_argb += twidth * 4;
2571 width -= twidth; 2495 width -= twidth;
2572 } 2496 }
2573 } 2497 }
2574 #endif 2498 #endif
2575 2499
2576 #if defined(HAS_UYVYTOARGBROW_SSSE3) 2500 #if defined(HAS_UYVYTOARGBROW_SSSE3)
2577 void UYVYToARGBRow_SSSE3(const uint8* src_uyvy, uint8* dst_argb, int width) { 2501 void UYVYToARGBRow_SSSE3(const uint8* src_uyvy,
2502 uint8* dst_argb,
2503 struct YuvConstants* yuvconstants,
2504 int width) {
2578 // Row buffers for intermediate YUV pixels. 2505 // Row buffers for intermediate YUV pixels.
2579 SIMD_ALIGNED(uint8 row_y[MAXTWIDTH]); 2506 SIMD_ALIGNED(uint8 row_y[MAXTWIDTH]);
2580 SIMD_ALIGNED(uint8 row_u[MAXTWIDTH / 2]); 2507 SIMD_ALIGNED(uint8 row_u[MAXTWIDTH / 2]);
2581 SIMD_ALIGNED(uint8 row_v[MAXTWIDTH / 2]); 2508 SIMD_ALIGNED(uint8 row_v[MAXTWIDTH / 2]);
2582 while (width > 0) { 2509 while (width > 0) {
2583 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2510 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2584 UYVYToUV422Row_SSE2(src_uyvy, row_u, row_v, twidth); 2511 UYVYToUV422Row_SSE2(src_uyvy, row_u, row_v, twidth);
2585 UYVYToYRow_SSE2(src_uyvy, row_y, twidth); 2512 UYVYToYRow_SSE2(src_uyvy, row_y, twidth);
2586 I422ToARGBRow_SSSE3(row_y, row_u, row_v, dst_argb, twidth); 2513 I422ToARGBRow_SSSE3(row_y, row_u, row_v, dst_argb, yuvconstants, twidth);
2587 src_uyvy += twidth * 2; 2514 src_uyvy += twidth * 2;
2588 dst_argb += twidth * 4; 2515 dst_argb += twidth * 4;
2589 width -= twidth; 2516 width -= twidth;
2590 } 2517 }
2591 } 2518 }
2592 #endif // !defined(LIBYUV_DISABLE_X86) 2519 #endif // !defined(LIBYUV_DISABLE_X86)
2593 2520
2594 #if defined(HAS_I422TORGB565ROW_AVX2) 2521 #if defined(HAS_I422TORGB565ROW_AVX2)
2595 void I422ToRGB565Row_AVX2(const uint8* src_y, 2522 void I422ToRGB565Row_AVX2(const uint8* src_y,
2596 const uint8* src_u, 2523 const uint8* src_u,
2597 const uint8* src_v, 2524 const uint8* src_v,
2598 uint8* dst_rgb565, 2525 uint8* dst_rgb565,
2526 struct YuvConstants* yuvconstants,
2599 int width) { 2527 int width) {
2600 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2528 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2601 while (width > 0) { 2529 while (width > 0) {
2602 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2530 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2603 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, twidth); 2531 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
2604 ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth); 2532 ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth);
2605 src_y += twidth; 2533 src_y += twidth;
2606 src_u += twidth / 2; 2534 src_u += twidth / 2;
2607 src_v += twidth / 2; 2535 src_v += twidth / 2;
2608 dst_rgb565 += twidth * 2; 2536 dst_rgb565 += twidth * 2;
2609 width -= twidth; 2537 width -= twidth;
2610 } 2538 }
2611 } 2539 }
2612 #endif 2540 #endif
2613 2541
2614 #if defined(HAS_I422TOARGB1555ROW_AVX2) 2542 #if defined(HAS_I422TOARGB1555ROW_AVX2)
2615 void I422ToARGB1555Row_AVX2(const uint8* src_y, 2543 void I422ToARGB1555Row_AVX2(const uint8* src_y,
2616 const uint8* src_u, 2544 const uint8* src_u,
2617 const uint8* src_v, 2545 const uint8* src_v,
2618 uint8* dst_argb1555, 2546 uint8* dst_argb1555,
2547 struct YuvConstants* yuvconstants,
2619 int width) { 2548 int width) {
2620 // Row buffer for intermediate ARGB pixels. 2549 // Row buffer for intermediate ARGB pixels.
2621 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2550 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2622 while (width > 0) { 2551 while (width > 0) {
2623 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2552 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2624 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, twidth); 2553 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
2625 ARGBToARGB1555Row_AVX2(row, dst_argb1555, twidth); 2554 ARGBToARGB1555Row_AVX2(row, dst_argb1555, twidth);
2626 src_y += twidth; 2555 src_y += twidth;
2627 src_u += twidth / 2; 2556 src_u += twidth / 2;
2628 src_v += twidth / 2; 2557 src_v += twidth / 2;
2629 dst_argb1555 += twidth * 2; 2558 dst_argb1555 += twidth * 2;
2630 width -= twidth; 2559 width -= twidth;
2631 } 2560 }
2632 } 2561 }
2633 #endif 2562 #endif
2634 2563
2635 #if defined(HAS_I422TOARGB4444ROW_AVX2) 2564 #if defined(HAS_I422TOARGB4444ROW_AVX2)
2636 void I422ToARGB4444Row_AVX2(const uint8* src_y, 2565 void I422ToARGB4444Row_AVX2(const uint8* src_y,
2637 const uint8* src_u, 2566 const uint8* src_u,
2638 const uint8* src_v, 2567 const uint8* src_v,
2639 uint8* dst_argb4444, 2568 uint8* dst_argb4444,
2569 struct YuvConstants* yuvconstants,
2640 int width) { 2570 int width) {
2641 // Row buffer for intermediate ARGB pixels. 2571 // Row buffer for intermediate ARGB pixels.
2642 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2572 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2643 while (width > 0) { 2573 while (width > 0) {
2644 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2574 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2645 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, twidth); 2575 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
2646 ARGBToARGB4444Row_AVX2(row, dst_argb4444, twidth); 2576 ARGBToARGB4444Row_AVX2(row, dst_argb4444, twidth);
2647 src_y += twidth; 2577 src_y += twidth;
2648 src_u += twidth / 2; 2578 src_u += twidth / 2;
2649 src_v += twidth / 2; 2579 src_v += twidth / 2;
2650 dst_argb4444 += twidth * 2; 2580 dst_argb4444 += twidth * 2;
2651 width -= twidth; 2581 width -= twidth;
2652 } 2582 }
2653 } 2583 }
2654 #endif 2584 #endif
2655 2585
2656 #if defined(HAS_I422TORGB24ROW_AVX2) 2586 #if defined(HAS_I422TORGB24ROW_AVX2)
2657 void I422ToRGB24Row_AVX2(const uint8* src_y, 2587 void I422ToRGB24Row_AVX2(const uint8* src_y,
2658 const uint8* src_u, 2588 const uint8* src_u,
2659 const uint8* src_v, 2589 const uint8* src_v,
2660 uint8* dst_rgb24, 2590 uint8* dst_rgb24,
2591 struct YuvConstants* yuvconstants,
2661 int width) { 2592 int width) {
2662 // Row buffer for intermediate ARGB pixels. 2593 // Row buffer for intermediate ARGB pixels.
2663 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2594 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2664 while (width > 0) { 2595 while (width > 0) {
2665 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2596 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2666 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, twidth); 2597 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
2667 // TODO(fbarchard): ARGBToRGB24Row_AVX2 2598 // TODO(fbarchard): ARGBToRGB24Row_AVX2
2668 ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth); 2599 ARGBToRGB24Row_SSSE3(row, dst_rgb24, twidth);
2669 src_y += twidth; 2600 src_y += twidth;
2670 src_u += twidth / 2; 2601 src_u += twidth / 2;
2671 src_v += twidth / 2; 2602 src_v += twidth / 2;
2672 dst_rgb24 += twidth * 3; 2603 dst_rgb24 += twidth * 3;
2673 width -= twidth; 2604 width -= twidth;
2674 } 2605 }
2675 } 2606 }
2676 #endif 2607 #endif
2677 2608
2678 #if defined(HAS_I422TORAWROW_AVX2) 2609 #if defined(HAS_I422TORAWROW_AVX2)
2679 void I422ToRAWRow_AVX2(const uint8* src_y, 2610 void I422ToRAWRow_AVX2(const uint8* src_y,
2680 const uint8* src_u, 2611 const uint8* src_u,
2681 const uint8* src_v, 2612 const uint8* src_v,
2682 uint8* dst_raw, 2613 uint8* dst_raw,
2614 struct YuvConstants* yuvconstants,
2683 int width) { 2615 int width) {
2684 // Row buffer for intermediate ARGB pixels. 2616 // Row buffer for intermediate ARGB pixels.
2685 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2617 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2686 while (width > 0) { 2618 while (width > 0) {
2687 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2619 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2688 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, twidth); 2620 I422ToARGBRow_AVX2(src_y, src_u, src_v, row, yuvconstants, twidth);
2689 // TODO(fbarchard): ARGBToRAWRow_AVX2 2621 // TODO(fbarchard): ARGBToRAWRow_AVX2
2690 ARGBToRAWRow_SSSE3(row, dst_raw, twidth); 2622 ARGBToRAWRow_SSSE3(row, dst_raw, twidth);
2691 src_y += twidth; 2623 src_y += twidth;
2692 src_u += twidth / 2; 2624 src_u += twidth / 2;
2693 src_v += twidth / 2; 2625 src_v += twidth / 2;
2694 dst_raw += twidth * 3; 2626 dst_raw += twidth * 3;
2695 width -= twidth; 2627 width -= twidth;
2696 } 2628 }
2697 } 2629 }
2698 #endif 2630 #endif
2699 2631
2700 #if defined(HAS_NV12TORGB565ROW_AVX2) 2632 #if defined(HAS_NV12TORGB565ROW_AVX2)
2701 void NV12ToRGB565Row_AVX2(const uint8* src_y, const uint8* src_uv, 2633 void NV12ToRGB565Row_AVX2(const uint8* src_y,
2702 uint8* dst_rgb565, int width) { 2634 const uint8* src_uv,
2635 uint8* dst_rgb565,
2636 struct YuvConstants* yuvconstants,
2637 int width) {
2703 // Row buffer for intermediate ARGB pixels. 2638 // Row buffer for intermediate ARGB pixels.
2704 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]); 2639 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2705 while (width > 0) { 2640 while (width > 0) {
2706 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2641 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2707 NV12ToARGBRow_AVX2(src_y, src_uv, row, twidth); 2642 NV12ToARGBRow_AVX2(src_y, src_uv, row, yuvconstants, twidth);
2708 ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth); 2643 ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth);
2709 src_y += twidth; 2644 src_y += twidth;
2710 src_uv += twidth; 2645 src_uv += twidth;
2711 dst_rgb565 += twidth * 2; 2646 dst_rgb565 += twidth * 2;
2712 width -= twidth; 2647 width -= twidth;
2713 } 2648 }
2714 } 2649 }
2715 #endif 2650 #endif
2716 2651
2717 #if defined(HAS_NV21TORGB565ROW_AVX2)
2718 void NV21ToRGB565Row_AVX2(const uint8* src_y, const uint8* src_vu,
2719 uint8* dst_rgb565, int width) {
2720 // Row buffer for intermediate ARGB pixels.
2721 SIMD_ALIGNED32(uint8 row[MAXTWIDTH * 4]);
2722 while (width > 0) {
2723 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2724 NV21ToARGBRow_AVX2(src_y, src_vu, row, twidth);
2725 ARGBToRGB565Row_AVX2(row, dst_rgb565, twidth);
2726 src_y += twidth;
2727 src_vu += twidth;
2728 dst_rgb565 += twidth * 2;
2729 width -= twidth;
2730 }
2731 }
2732 #endif
2733
2734 #if defined(HAS_YUY2TOARGBROW_AVX2) 2652 #if defined(HAS_YUY2TOARGBROW_AVX2)
2735 void YUY2ToARGBRow_AVX2(const uint8* src_yuy2, uint8* dst_argb, int width) { 2653 void YUY2ToARGBRow_AVX2(const uint8* src_yuy2,
2654 uint8* dst_argb,
2655 struct YuvConstants* yuvconstants,
2656 int width) {
2736 // Row buffers for intermediate YUV pixels. 2657 // Row buffers for intermediate YUV pixels.
2737 SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]); 2658 SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]);
2738 SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]); 2659 SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]);
2739 SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]); 2660 SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]);
2740 while (width > 0) { 2661 while (width > 0) {
2741 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2662 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2742 YUY2ToUV422Row_AVX2(src_yuy2, row_u, row_v, twidth); 2663 YUY2ToUV422Row_AVX2(src_yuy2, row_u, row_v, twidth);
2743 YUY2ToYRow_AVX2(src_yuy2, row_y, twidth); 2664 YUY2ToYRow_AVX2(src_yuy2, row_y, twidth);
2744 I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, twidth); 2665 I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, yuvconstants, twidth);
2745 src_yuy2 += twidth * 2; 2666 src_yuy2 += twidth * 2;
2746 dst_argb += twidth * 4; 2667 dst_argb += twidth * 4;
2747 width -= twidth; 2668 width -= twidth;
2748 } 2669 }
2749 } 2670 }
2750 #endif 2671 #endif
2751 2672
2752 #if defined(HAS_UYVYTOARGBROW_AVX2) 2673 #if defined(HAS_UYVYTOARGBROW_AVX2)
2753 void UYVYToARGBRow_AVX2(const uint8* src_uyvy, uint8* dst_argb, int width) { 2674 void UYVYToARGBRow_AVX2(const uint8* src_uyvy,
2675 uint8* dst_argb,
2676 struct YuvConstants* yuvconstants,
2677 int width) {
2754 // Row buffers for intermediate YUV pixels. 2678 // Row buffers for intermediate YUV pixels.
2755 SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]); 2679 SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]);
2756 SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]); 2680 SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]);
2757 SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]); 2681 SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]);
2758 while (width > 0) { 2682 while (width > 0) {
2759 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width; 2683 int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
2760 UYVYToUV422Row_AVX2(src_uyvy, row_u, row_v, twidth); 2684 UYVYToUV422Row_AVX2(src_uyvy, row_u, row_v, twidth);
2761 UYVYToYRow_AVX2(src_uyvy, row_y, twidth); 2685 UYVYToYRow_AVX2(src_uyvy, row_y, twidth);
2762 I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, twidth); 2686 I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, yuvconstants, twidth);
2763 src_uyvy += twidth * 2; 2687 src_uyvy += twidth * 2;
2764 dst_argb += twidth * 4; 2688 dst_argb += twidth * 4;
2765 width -= twidth; 2689 width -= twidth;
2766 } 2690 }
2767 } 2691 }
2768 #endif // !defined(LIBYUV_DISABLE_X86) 2692 #endif // !defined(LIBYUV_DISABLE_X86)
2769 2693
2770 void ARGBPolynomialRow_C(const uint8* src_argb,
2771 uint8* dst_argb, const float* poly,
2772 int width) {
2773 int i;
2774 for (i = 0; i < width; ++i) {
2775 float b = (float)(src_argb[0]);
2776 float g = (float)(src_argb[1]);
2777 float r = (float)(src_argb[2]);
2778 float a = (float)(src_argb[3]);
2779 float b2 = b * b;
2780 float g2 = g * g;
2781 float r2 = r * r;
2782 float a2 = a * a;
2783 float db = poly[0] + poly[4] * b;
2784 float dg = poly[1] + poly[5] * g;
2785 float dr = poly[2] + poly[6] * r;
2786 float da = poly[3] + poly[7] * a;
2787 float b3 = b2 * b;
2788 float g3 = g2 * g;
2789 float r3 = r2 * r;
2790 float a3 = a2 * a;
2791 db += poly[8] * b2;
2792 dg += poly[9] * g2;
2793 dr += poly[10] * r2;
2794 da += poly[11] * a2;
2795 db += poly[12] * b3;
2796 dg += poly[13] * g3;
2797 dr += poly[14] * r3;
2798 da += poly[15] * a3;
2799
2800 dst_argb[0] = Clamp((int32)(db));
2801 dst_argb[1] = Clamp((int32)(dg));
2802 dst_argb[2] = Clamp((int32)(dr));
2803 dst_argb[3] = Clamp((int32)(da));
2804 src_argb += 4;
2805 dst_argb += 4;
2806 }
2807 }
2808
2809 void ARGBLumaColorTableRow_C(const uint8* src_argb, uint8* dst_argb, int width,
2810 const uint8* luma, uint32 lumacoeff) {
2811 uint32 bc = lumacoeff & 0xff;
2812 uint32 gc = (lumacoeff >> 8) & 0xff;
2813 uint32 rc = (lumacoeff >> 16) & 0xff;
2814
2815 int i;
2816 for (i = 0; i < width - 1; i += 2) {
2817 // Luminance in rows, color values in columns.
2818 const uint8* luma0 = ((src_argb[0] * bc + src_argb[1] * gc +
2819 src_argb[2] * rc) & 0x7F00u) + luma;
2820 const uint8* luma1;
2821 dst_argb[0] = luma0[src_argb[0]];
2822 dst_argb[1] = luma0[src_argb[1]];
2823 dst_argb[2] = luma0[src_argb[2]];
2824 dst_argb[3] = src_argb[3];
2825 luma1 = ((src_argb[4] * bc + src_argb[5] * gc +
2826 src_argb[6] * rc) & 0x7F00u) + luma;
2827 dst_argb[4] = luma1[src_argb[4]];
2828 dst_argb[5] = luma1[src_argb[5]];
2829 dst_argb[6] = luma1[src_argb[6]];
2830 dst_argb[7] = src_argb[7];
2831 src_argb += 8;
2832 dst_argb += 8;
2833 }
2834 if (width & 1) {
2835 // Luminance in rows, color values in columns.
2836 const uint8* luma0 = ((src_argb[0] * bc + src_argb[1] * gc +
2837 src_argb[2] * rc) & 0x7F00u) + luma;
2838 dst_argb[0] = luma0[src_argb[0]];
2839 dst_argb[1] = luma0[src_argb[1]];
2840 dst_argb[2] = luma0[src_argb[2]];
2841 dst_argb[3] = src_argb[3];
2842 }
2843 }
2844
2845 void ARGBCopyAlphaRow_C(const uint8* src, uint8* dst, int width) {
2846 int i;
2847 for (i = 0; i < width - 1; i += 2) {
2848 dst[3] = src[3];
2849 dst[7] = src[7];
2850 dst += 8;
2851 src += 8;
2852 }
2853 if (width & 1) {
2854 dst[3] = src[3];
2855 }
2856 }
2857
2858 void ARGBCopyYToAlphaRow_C(const uint8* src, uint8* dst, int width) {
2859 int i;
2860 for (i = 0; i < width - 1; i += 2) {
2861 dst[3] = src[0];
2862 dst[7] = src[1];
2863 dst += 8;
2864 src += 2;
2865 }
2866 if (width & 1) {
2867 dst[3] = src[0];
2868 }
2869 }
2870
2871 #ifdef __cplusplus 2694 #ifdef __cplusplus
2872 } // extern "C" 2695 } // extern "C"
2873 } // namespace libyuv 2696 } // namespace libyuv
2874 #endif 2697 #endif
OLDNEW
« no previous file with comments | « source/row_any.cc ('k') | source/row_gcc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698