1 /* 2 * Copyright 2013 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 INCLUDE_LIBYUV_ROTATE_ROW_H_ 12 #define INCLUDE_LIBYUV_ROTATE_ROW_H_ 13 14 #include "libyuv/basic_types.h" 15 16 #ifdef __cplusplus 17 namespace libyuv { 18 extern "C" { 19 #endif 20 21 #if defined(__pnacl__) || defined(__CLR_VER) || \ 22 (defined(__i386__) && !defined(__SSE2__)) 23 #define LIBYUV_DISABLE_X86 24 #endif 25 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 26 #if defined(__has_feature) 27 #if __has_feature(memory_sanitizer) 28 #define LIBYUV_DISABLE_X86 29 #endif 30 #endif 31 // The following are available for Visual C and clangcl 32 bit: 32 #if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) 33 #define HAS_TRANSPOSEWX8_SSSE3 34 #define HAS_TRANSPOSEUVWX8_SSE2 35 #endif 36 37 // The following are available for GCC 32 or 64 bit but not NaCL for 64 bit: 38 #if !defined(LIBYUV_DISABLE_X86) && \ 39 (defined(__i386__) || \ 40 (defined(__x86_64__) && !defined(__native_client__))) 41 #define HAS_TRANSPOSEWX8_SSSE3 42 #endif 43 44 // The following are available for 64 bit GCC but not NaCL: 45 #if !defined(LIBYUV_DISABLE_X86) && !defined(__native_client__) && \ 46 defined(__x86_64__) 47 #define HAS_TRANSPOSEWX8_FAST_SSSE3 48 #define HAS_TRANSPOSEUVWX8_SSE2 49 #endif 50 51 #if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \ 52 (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__)) 53 #define HAS_TRANSPOSEWX8_NEON 54 #define HAS_TRANSPOSEUVWX8_NEON 55 #endif 56 57 #if !defined(LIBYUV_DISABLE_DSPR2) && !defined(__native_client__) && \ 58 defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2) 59 #define HAS_TRANSPOSEWX8_DSPR2 60 #define HAS_TRANSPOSEUVWX8_DSPR2 61 #endif // defined(__mips__) 62 63 #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) 64 #define HAS_TRANSPOSEWX16_MSA 65 #define HAS_TRANSPOSEUVWX16_MSA 66 #endif 67 68 void TransposeWxH_C(const uint8* src, 69 int src_stride, 70 uint8* dst, 71 int dst_stride, 72 int width, 73 int height); 74 75 void TransposeWx8_C(const uint8* src, 76 int src_stride, 77 uint8* dst, 78 int dst_stride, 79 int width); 80 void TransposeWx16_C(const uint8* src, 81 int src_stride, 82 uint8* dst, 83 int dst_stride, 84 int width); 85 void TransposeWx8_NEON(const uint8* src, 86 int src_stride, 87 uint8* dst, 88 int dst_stride, 89 int width); 90 void TransposeWx8_SSSE3(const uint8* src, 91 int src_stride, 92 uint8* dst, 93 int dst_stride, 94 int width); 95 void TransposeWx8_Fast_SSSE3(const uint8* src, 96 int src_stride, 97 uint8* dst, 98 int dst_stride, 99 int width); 100 void TransposeWx8_DSPR2(const uint8* src, 101 int src_stride, 102 uint8* dst, 103 int dst_stride, 104 int width); 105 void TransposeWx8_Fast_DSPR2(const uint8* src, 106 int src_stride, 107 uint8* dst, 108 int dst_stride, 109 int width); 110 void TransposeWx16_MSA(const uint8* src, 111 int src_stride, 112 uint8* dst, 113 int dst_stride, 114 int width); 115 116 void TransposeWx8_Any_NEON(const uint8* src, 117 int src_stride, 118 uint8* dst, 119 int dst_stride, 120 int width); 121 void TransposeWx8_Any_SSSE3(const uint8* src, 122 int src_stride, 123 uint8* dst, 124 int dst_stride, 125 int width); 126 void TransposeWx8_Fast_Any_SSSE3(const uint8* src, 127 int src_stride, 128 uint8* dst, 129 int dst_stride, 130 int width); 131 void TransposeWx8_Any_DSPR2(const uint8* src, 132 int src_stride, 133 uint8* dst, 134 int dst_stride, 135 int width); 136 void TransposeWx16_Any_MSA(const uint8* src, 137 int src_stride, 138 uint8* dst, 139 int dst_stride, 140 int width); 141 142 void TransposeUVWxH_C(const uint8* src, 143 int src_stride, 144 uint8* dst_a, 145 int dst_stride_a, 146 uint8* dst_b, 147 int dst_stride_b, 148 int width, 149 int height); 150 151 void TransposeUVWx8_C(const uint8* src, 152 int src_stride, 153 uint8* dst_a, 154 int dst_stride_a, 155 uint8* dst_b, 156 int dst_stride_b, 157 int width); 158 void TransposeUVWx16_C(const uint8* src, 159 int src_stride, 160 uint8* dst_a, 161 int dst_stride_a, 162 uint8* dst_b, 163 int dst_stride_b, 164 int width); 165 void TransposeUVWx8_SSE2(const uint8* src, 166 int src_stride, 167 uint8* dst_a, 168 int dst_stride_a, 169 uint8* dst_b, 170 int dst_stride_b, 171 int width); 172 void TransposeUVWx8_NEON(const uint8* src, 173 int src_stride, 174 uint8* dst_a, 175 int dst_stride_a, 176 uint8* dst_b, 177 int dst_stride_b, 178 int width); 179 void TransposeUVWx8_DSPR2(const uint8* src, 180 int src_stride, 181 uint8* dst_a, 182 int dst_stride_a, 183 uint8* dst_b, 184 int dst_stride_b, 185 int width); 186 void TransposeUVWx16_MSA(const uint8* src, 187 int src_stride, 188 uint8* dst_a, 189 int dst_stride_a, 190 uint8* dst_b, 191 int dst_stride_b, 192 int width); 193 194 void TransposeUVWx8_Any_SSE2(const uint8* src, 195 int src_stride, 196 uint8* dst_a, 197 int dst_stride_a, 198 uint8* dst_b, 199 int dst_stride_b, 200 int width); 201 void TransposeUVWx8_Any_NEON(const uint8* src, 202 int src_stride, 203 uint8* dst_a, 204 int dst_stride_a, 205 uint8* dst_b, 206 int dst_stride_b, 207 int width); 208 void TransposeUVWx8_Any_DSPR2(const uint8* src, 209 int src_stride, 210 uint8* dst_a, 211 int dst_stride_a, 212 uint8* dst_b, 213 int dst_stride_b, 214 int width); 215 void TransposeUVWx16_Any_MSA(const uint8* src, 216 int src_stride, 217 uint8* dst_a, 218 int dst_stride_a, 219 uint8* dst_b, 220 int dst_stride_b, 221 int width); 222 223 #ifdef __cplusplus 224 } // extern "C" 225 } // namespace libyuv 226 #endif 227 228 #endif // INCLUDE_LIBYUV_ROTATE_ROW_H_ 229