1 /* 2 * Copyright (c) 2011 The LibYuv project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef LIBYUV_SOURCE_ROW_H_ 12 #define LIBYUV_SOURCE_ROW_H_ 13 14 #include "third_party/libyuv/include/libyuv/basic_types.h" 15 16 #define kMaxStride (2048 * 4) 17 #define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1))) 18 19 #if defined(COVERAGE_ENABLED) || defined(TARGET_IPHONE_SIMULATOR) 20 #define YUV_DISABLE_ASM 21 #endif 22 23 #if defined(__ARM_NEON__) && !defined(YUV_DISABLE_ASM) 24 #define HAS_FASTCONVERTYUVTOARGBROW_NEON 25 void FastConvertYUVToARGBRow_NEON(const uint8* y_buf, 26 const uint8* u_buf, 27 const uint8* v_buf, 28 uint8* rgb_buf, 29 int width); 30 #define HAS_FASTCONVERTYUVTOBGRAROW_NEON 31 void FastConvertYUVToBGRARow_NEON(const uint8* y_buf, 32 const uint8* u_buf, 33 const uint8* v_buf, 34 uint8* rgb_buf, 35 int width); 36 #define HAS_FASTCONVERTYUVTOABGRROW_NEON 37 void FastConvertYUVToABGRRow_NEON(const uint8* y_buf, 38 const uint8* u_buf, 39 const uint8* v_buf, 40 uint8* rgb_buf, 41 int width); 42 #endif 43 44 // The following are available on all x86 platforms 45 #if (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) && \ 46 !defined(YUV_DISABLE_ASM) 47 #define HAS_ABGRTOARGBROW_SSSE3 48 #define HAS_BGRATOARGBROW_SSSE3 49 #define HAS_BG24TOARGBROW_SSSE3 50 #define HAS_RAWTOARGBROW_SSSE3 51 #define HAS_RGB24TOYROW_SSSE3 52 #define HAS_RAWTOYROW_SSSE3 53 #define HAS_RGB24TOUVROW_SSSE3 54 #define HAS_RAWTOUVROW_SSSE3 55 #define HAS_ARGBTOYROW_SSSE3 56 #define HAS_BGRATOYROW_SSSE3 57 #define HAS_ABGRTOYROW_SSSE3 58 #define HAS_ARGBTOUVROW_SSSE3 59 #define HAS_BGRATOUVROW_SSSE3 60 #define HAS_ABGRTOUVROW_SSSE3 61 #define HAS_I400TOARGBROW_SSE2 62 #define HAS_FASTCONVERTYTOARGBROW_SSE2 63 #define HAS_FASTCONVERTYUVTOARGBROW_SSSE3 64 #define HAS_FASTCONVERTYUVTOBGRAROW_SSSE3 65 #define HAS_FASTCONVERTYUVTOABGRROW_SSSE3 66 #define HAS_FASTCONVERTYUV444TOARGBROW_SSSE3 67 #define HAS_REVERSE_ROW_SSSE3 68 #endif 69 70 // The following are available on Neon platforms 71 #if defined(__ARM_NEON__) && !defined(YUV_DISABLE_ASM) 72 #define HAS_REVERSE_ROW_NEON 73 #endif 74 75 #ifdef __cplusplus 76 namespace libyuv { 77 extern "C" { 78 #endif 79 80 #ifdef HAS_ARGBTOYROW_SSSE3 81 void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); 82 void BGRAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); 83 void ABGRToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); 84 void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 85 uint8* dst_u, uint8* dst_v, int width); 86 void BGRAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 87 uint8* dst_u, uint8* dst_v, int width); 88 void ABGRToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 89 uint8* dst_u, uint8* dst_v, int width); 90 #endif 91 #if defined(HAS_BG24TOARGBROW_SSSE3) && defined(HAS_ARGBTOYROW_SSSE3) 92 #define HASRGB24TOYROW_SSSE3 93 #endif 94 #ifdef HASRGB24TOYROW_SSSE3 95 void RGB24ToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); 96 void RAWToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); 97 void RGB24ToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 98 uint8* dst_u, uint8* dst_v, int width); 99 void RAWToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 100 uint8* dst_u, uint8* dst_v, int width); 101 #endif 102 #ifdef HAS_REVERSE_ROW_SSSE3 103 void ReverseRow_SSSE3(const uint8* src, uint8* dst, int width); 104 #endif 105 #ifdef HAS_REVERSE_ROW_NEON 106 void ReverseRow_NEON(const uint8* src, uint8* dst, int width); 107 #endif 108 void ReverseRow_C(const uint8* src, uint8* dst, int width); 109 110 void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); 111 void BGRAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); 112 void ABGRToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); 113 void RGB24ToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); 114 void RAWToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); 115 void ARGBToUVRow_C(const uint8* src_argb0, int src_stride_argb, 116 uint8* dst_u, uint8* dst_v, int width); 117 void BGRAToUVRow_C(const uint8* src_argb0, int src_stride_argb, 118 uint8* dst_u, uint8* dst_v, int width); 119 void ABGRToUVRow_C(const uint8* src_argb0, int src_stride_argb, 120 uint8* dst_u, uint8* dst_v, int width); 121 void RGB24ToUVRow_C(const uint8* src_argb0, int src_stride_argb, 122 uint8* dst_u, uint8* dst_v, int width); 123 void RAWToUVRow_C(const uint8* src_argb0, int src_stride_argb, 124 uint8* dst_u, uint8* dst_v, int width); 125 126 #ifdef HAS_BG24TOARGBROW_SSSE3 127 void ABGRToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix); 128 void BGRAToARGBRow_SSSE3(const uint8* src_bgra, uint8* dst_argb, int pix); 129 void BG24ToARGBRow_SSSE3(const uint8* src_bg24, uint8* dst_argb, int pix); 130 void RAWToARGBRow_SSSE3(const uint8* src_bg24, uint8* dst_argb, int pix); 131 #endif 132 void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix); 133 void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int pix); 134 void BG24ToARGBRow_C(const uint8* src_bg24, uint8* dst_argb, int pix); 135 void RAWToARGBRow_C(const uint8* src_bg24, uint8* dst_argb, int pix); 136 137 #ifdef HAS_I400TOARGBROW_SSE2 138 void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix); 139 #endif 140 void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int pix); 141 142 #if defined(_MSC_VER) 143 #define SIMD_ALIGNED(var) __declspec(align(16)) var 144 typedef __declspec(align(16)) signed char vec8[16]; 145 typedef __declspec(align(16)) unsigned char uvec8[16]; 146 typedef __declspec(align(16)) signed short vec16[8]; 147 #else // __GNUC__ 148 #define SIMD_ALIGNED(var) var __attribute__((aligned(16))) 149 typedef signed char __attribute__((vector_size(16))) vec8; 150 typedef unsigned char __attribute__((vector_size(16))) uvec8; 151 typedef signed short __attribute__((vector_size(16))) vec16; 152 #endif 153 154 //extern "C" 155 SIMD_ALIGNED(const int16 kCoefficientsRgbY[768][4]); 156 //extern "C" 157 SIMD_ALIGNED(const int16 kCoefficientsBgraY[768][4]); 158 //extern "C" 159 SIMD_ALIGNED(const int16 kCoefficientsAbgrY[768][4]); 160 161 void FastConvertYUVToARGBRow_C(const uint8* y_buf, 162 const uint8* u_buf, 163 const uint8* v_buf, 164 uint8* rgb_buf, 165 int width); 166 167 void FastConvertYUVToBGRARow_C(const uint8* y_buf, 168 const uint8* u_buf, 169 const uint8* v_buf, 170 uint8* rgb_buf, 171 int width); 172 173 void FastConvertYUVToABGRRow_C(const uint8* y_buf, 174 const uint8* u_buf, 175 const uint8* v_buf, 176 uint8* rgb_buf, 177 int width); 178 179 void FastConvertYUV444ToARGBRow_C(const uint8* y_buf, 180 const uint8* u_buf, 181 const uint8* v_buf, 182 uint8* rgb_buf, 183 int width); 184 185 void FastConvertYToARGBRow_C(const uint8* y_buf, 186 uint8* rgb_buf, 187 int width); 188 189 #ifdef HAS_FASTCONVERTYUVTOARGBROW_SSE2 190 void FastConvertYUVToARGBRow_SSE2(const uint8* y_buf, 191 const uint8* u_buf, 192 const uint8* v_buf, 193 uint8* rgb_buf, 194 int width); 195 196 void FastConvertYUVToARGBRow4_SSE2(const uint8* y_buf, 197 const uint8* u_buf, 198 const uint8* v_buf, 199 uint8* rgb_buf, 200 int width); 201 202 void FastConvertYUVToBGRARow_SSE2(const uint8* y_buf, 203 const uint8* u_buf, 204 const uint8* v_buf, 205 uint8* rgb_buf, 206 int width); 207 208 void FastConvertYUVToABGRRow_SSE2(const uint8* y_buf, 209 const uint8* u_buf, 210 const uint8* v_buf, 211 uint8* rgb_buf, 212 int width); 213 214 void FastConvertYUV444ToARGBRow_SSE2(const uint8* y_buf, 215 const uint8* u_buf, 216 const uint8* v_buf, 217 uint8* rgb_buf, 218 int width); 219 220 void FastConvertYToARGBRow_SSE2(const uint8* y_buf, 221 uint8* rgb_buf, 222 int width); 223 #endif 224 225 #ifdef HAS_FASTCONVERTYUVTOARGBROW_SSSE3 226 void FastConvertYUVToARGBRow_SSSE3(const uint8* y_buf, 227 const uint8* u_buf, 228 const uint8* v_buf, 229 uint8* rgb_buf, 230 int width); 231 232 void FastConvertYUVToBGRARow_SSSE3(const uint8* y_buf, 233 const uint8* u_buf, 234 const uint8* v_buf, 235 uint8* rgb_buf, 236 int width); 237 238 void FastConvertYUVToABGRRow_SSSE3(const uint8* y_buf, 239 const uint8* u_buf, 240 const uint8* v_buf, 241 uint8* rgb_buf, 242 int width); 243 244 void FastConvertYUV444ToARGBRow_SSSE3(const uint8* y_buf, 245 const uint8* u_buf, 246 const uint8* v_buf, 247 uint8* rgb_buf, 248 int width); 249 250 #endif 251 252 #ifdef HAS_FASTCONVERTYTOARGBROW_SSE2 253 void FastConvertYToARGBRow_SSE2(const uint8* y_buf, 254 uint8* rgb_buf, 255 int width); 256 257 #endif 258 259 #ifdef __cplusplus 260 } // extern "C" 261 } // namespace libyuv 262 #endif 263 264 #endif // LIBYUV_SOURCE_ROW_H_ 265