OLD | NEW |
(Empty) | |
| 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_SCALE_ROW_H_ // NOLINT |
| 12 #define INCLUDE_LIBYUV_SCALE_ROW_H_ |
| 13 |
| 14 #include "basic_types.h" |
| 15 |
| 16 #ifdef __cplusplus |
| 17 namespace libyuv { |
| 18 extern "C" { |
| 19 #endif |
| 20 |
| 21 #if defined(__pnacl__) || defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \ |
| 22 defined(TARGET_IPHONE_SIMULATOR) |
| 23 #define LIBYUV_DISABLE_X86 |
| 24 #endif |
| 25 |
| 26 // The following are available on all x86 platforms: |
| 27 #if !defined(LIBYUV_DISABLE_X86) && \ |
| 28 (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) |
| 29 #define HAS_SCALEROWDOWN2_SSE2 |
| 30 #define HAS_SCALEROWDOWN4_SSE2 |
| 31 #define HAS_SCALEROWDOWN34_SSSE3 |
| 32 #define HAS_SCALEROWDOWN38_SSSE3 |
| 33 #define HAS_SCALEADDROWS_SSE2 |
| 34 #define HAS_SCALEFILTERCOLS_SSSE3 |
| 35 #define HAS_SCALECOLSUP2_SSE2 |
| 36 #define HAS_SCALEARGBROWDOWN2_SSE2 |
| 37 #define HAS_SCALEARGBROWDOWNEVEN_SSE2 |
| 38 #define HAS_SCALEARGBCOLS_SSE2 |
| 39 #define HAS_SCALEARGBFILTERCOLS_SSSE3 |
| 40 #define HAS_SCALEARGBCOLSUP2_SSE2 |
| 41 #define HAS_FIXEDDIV_X86 |
| 42 #define HAS_FIXEDDIV1_X86 |
| 43 #endif |
| 44 |
| 45 // The following are available on Neon platforms: |
| 46 #if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \ |
| 47 (defined(__ARM_NEON__) || defined(LIBYUV_NEON)) |
| 48 #define HAS_SCALEROWDOWN2_NEON |
| 49 #define HAS_SCALEROWDOWN4_NEON |
| 50 #define HAS_SCALEROWDOWN34_NEON |
| 51 #define HAS_SCALEROWDOWN38_NEON |
| 52 #define HAS_SCALEARGBROWDOWNEVEN_NEON |
| 53 #define HAS_SCALEARGBROWDOWN2_NEON |
| 54 #endif |
| 55 |
| 56 // The following are available on Mips platforms: |
| 57 #if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \ |
| 58 defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2) |
| 59 #define HAS_SCALEROWDOWN2_MIPS_DSPR2 |
| 60 #define HAS_SCALEROWDOWN4_MIPS_DSPR2 |
| 61 #define HAS_SCALEROWDOWN34_MIPS_DSPR2 |
| 62 #define HAS_SCALEROWDOWN38_MIPS_DSPR2 |
| 63 #endif |
| 64 |
| 65 // Scale ARGB vertically with bilinear interpolation. |
| 66 void ScalePlaneVertical(int src_height, |
| 67 int dst_width, int dst_height, |
| 68 int src_stride, int dst_stride, |
| 69 const uint8* src_argb, uint8* dst_argb, |
| 70 int x, int y, int dy, |
| 71 int bpp, enum FilterMode filtering); |
| 72 |
| 73 void ScalePlaneVertical_16(int src_height, |
| 74 int dst_width, int dst_height, |
| 75 int src_stride, int dst_stride, |
| 76 const uint16* src_argb, uint16* dst_argb, |
| 77 int x, int y, int dy, |
| 78 int wpp, enum FilterMode filtering); |
| 79 |
| 80 // Simplify the filtering based on scale factors. |
| 81 enum FilterMode ScaleFilterReduce(int src_width, int src_height, |
| 82 int dst_width, int dst_height, |
| 83 enum FilterMode filtering); |
| 84 |
| 85 // Divide num by div and return as 16.16 fixed point result. |
| 86 int FixedDiv_C(int num, int div); |
| 87 int FixedDiv_X86(int num, int div); |
| 88 // Divide num - 1 by div - 1 and return as 16.16 fixed point result. |
| 89 int FixedDiv1_C(int num, int div); |
| 90 int FixedDiv1_X86(int num, int div); |
| 91 #ifdef HAS_FIXEDDIV_X86 |
| 92 #define FixedDiv FixedDiv_X86 |
| 93 #define FixedDiv1 FixedDiv1_X86 |
| 94 #else |
| 95 #define FixedDiv FixedDiv_C |
| 96 #define FixedDiv1 FixedDiv1_C |
| 97 #endif |
| 98 |
| 99 // Compute slope values for stepping. |
| 100 void ScaleSlope(int src_width, int src_height, |
| 101 int dst_width, int dst_height, |
| 102 enum FilterMode filtering, |
| 103 int* x, int* y, int* dx, int* dy); |
| 104 |
| 105 void ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 106 uint8* dst, int dst_width); |
| 107 void ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 108 uint16* dst, int dst_width); |
| 109 void ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 110 uint8* dst, int dst_width); |
| 111 void ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 112 uint16* dst, int dst_width); |
| 113 void ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 114 uint8* dst, int dst_width); |
| 115 void ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 116 uint16* dst, int dst_width); |
| 117 void ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 118 uint8* dst, int dst_width); |
| 119 void ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 120 uint16* dst, int dst_width); |
| 121 void ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 122 uint8* dst, int dst_width); |
| 123 void ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 124 uint16* dst, int dst_width); |
| 125 void ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 126 uint8* dst, int dst_width); |
| 127 void ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 128 uint16* dst, int dst_width); |
| 129 void ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 130 uint8* d, int dst_width); |
| 131 void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 132 uint16* d, int dst_width); |
| 133 void ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 134 uint8* d, int dst_width); |
| 135 void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 136 uint16* d, int dst_width); |
| 137 void ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr, |
| 138 int dst_width, int x, int dx); |
| 139 void ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr, |
| 140 int dst_width, int x, int dx); |
| 141 void ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr, |
| 142 int dst_width, int, int); |
| 143 void ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr, |
| 144 int dst_width, int, int); |
| 145 void ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr, |
| 146 int dst_width, int x, int dx); |
| 147 void ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr, |
| 148 int dst_width, int x, int dx); |
| 149 void ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr, |
| 150 int dst_width, int x, int dx); |
| 151 void ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr, |
| 152 int dst_width, int x, int dx); |
| 153 void ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 154 uint8* dst, int dst_width); |
| 155 void ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 156 uint16* dst, int dst_width); |
| 157 void ScaleRowDown38_3_Box_C(const uint8* src_ptr, |
| 158 ptrdiff_t src_stride, |
| 159 uint8* dst_ptr, int dst_width); |
| 160 void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr, |
| 161 ptrdiff_t src_stride, |
| 162 uint16* dst_ptr, int dst_width); |
| 163 void ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 164 uint8* dst_ptr, int dst_width); |
| 165 void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 166 uint16* dst_ptr, int dst_width); |
| 167 void ScaleAddRows_C(const uint8* src_ptr, ptrdiff_t src_stride, |
| 168 uint16* dst_ptr, int src_width, int src_height); |
| 169 void ScaleAddRows_16_C(const uint16* src_ptr, ptrdiff_t src_stride, |
| 170 uint32* dst_ptr, int src_width, int src_height); |
| 171 void ScaleARGBRowDown2_C(const uint8* src_argb, |
| 172 ptrdiff_t src_stride, |
| 173 uint8* dst_argb, int dst_width); |
| 174 void ScaleARGBRowDown2Linear_C(const uint8* src_argb, |
| 175 ptrdiff_t src_stride, |
| 176 uint8* dst_argb, int dst_width); |
| 177 void ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride, |
| 178 uint8* dst_argb, int dst_width); |
| 179 void ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride, |
| 180 int src_stepx, |
| 181 uint8* dst_argb, int dst_width); |
| 182 void ScaleARGBRowDownEvenBox_C(const uint8* src_argb, |
| 183 ptrdiff_t src_stride, |
| 184 int src_stepx, |
| 185 uint8* dst_argb, int dst_width); |
| 186 void ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb, |
| 187 int dst_width, int x, int dx); |
| 188 void ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb, |
| 189 int dst_width, int x, int dx); |
| 190 void ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb, |
| 191 int dst_width, int, int); |
| 192 void ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb, |
| 193 int dst_width, int x, int dx); |
| 194 void ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb, |
| 195 int dst_width, int x, int dx); |
| 196 |
| 197 void ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 198 uint8* dst_ptr, int dst_width); |
| 199 void ScaleRowDown2Linear_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 200 uint8* dst_ptr, int dst_width); |
| 201 void ScaleRowDown2Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 202 uint8* dst_ptr, int dst_width); |
| 203 void ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, |
| 204 ptrdiff_t src_stride, |
| 205 uint8* dst_ptr, int dst_width); |
| 206 void ScaleRowDown2Linear_Unaligned_SSE2(const uint8* src_ptr, |
| 207 ptrdiff_t src_stride, |
| 208 uint8* dst_ptr, int dst_width); |
| 209 void ScaleRowDown2Box_Unaligned_SSE2(const uint8* src_ptr, |
| 210 ptrdiff_t src_stride, |
| 211 uint8* dst_ptr, int dst_width); |
| 212 void ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 213 uint8* dst_ptr, int dst_width); |
| 214 void ScaleRowDown4Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 215 uint8* dst_ptr, int dst_width); |
| 216 void ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, |
| 217 uint8* dst_ptr, int dst_width); |
| 218 void ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr, |
| 219 ptrdiff_t src_stride, |
| 220 uint8* dst_ptr, int dst_width); |
| 221 void ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr, |
| 222 ptrdiff_t src_stride, |
| 223 uint8* dst_ptr, int dst_width); |
| 224 void ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, |
| 225 uint8* dst_ptr, int dst_width); |
| 226 void ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr, |
| 227 ptrdiff_t src_stride, |
| 228 uint8* dst_ptr, int dst_width); |
| 229 void ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr, |
| 230 ptrdiff_t src_stride, |
| 231 uint8* dst_ptr, int dst_width); |
| 232 void ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 233 uint16* dst_ptr, int src_width, |
| 234 int src_height); |
| 235 void ScaleFilterCols_SSSE3(uint8* dst_ptr, const uint8* src_ptr, |
| 236 int dst_width, int x, int dx); |
| 237 void ScaleColsUp2_SSE2(uint8* dst_ptr, const uint8* src_ptr, |
| 238 int dst_width, int x, int dx); |
| 239 void ScaleARGBRowDown2_SSE2(const uint8* src_argb, |
| 240 ptrdiff_t src_stride, |
| 241 uint8* dst_argb, int dst_width); |
| 242 void ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb, |
| 243 ptrdiff_t src_stride, |
| 244 uint8* dst_argb, int dst_width); |
| 245 void ScaleARGBRowDown2Box_SSE2(const uint8* src_argb, |
| 246 ptrdiff_t src_stride, |
| 247 uint8* dst_argb, int dst_width); |
| 248 void ScaleARGBRowDownEven_SSE2(const uint8* src_argb, ptrdiff_t src_stride, |
| 249 int src_stepx, |
| 250 uint8* dst_argb, int dst_width); |
| 251 void ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb, |
| 252 ptrdiff_t src_stride, |
| 253 int src_stepx, |
| 254 uint8* dst_argb, int dst_width); |
| 255 void ScaleARGBCols_SSE2(uint8* dst_argb, const uint8* src_argb, |
| 256 int dst_width, int x, int dx); |
| 257 void ScaleARGBFilterCols_SSSE3(uint8* dst_argb, const uint8* src_argb, |
| 258 int dst_width, int x, int dx); |
| 259 void ScaleARGBColsUp2_SSE2(uint8* dst_argb, const uint8* src_argb, |
| 260 int dst_width, int x, int dx); |
| 261 // Row functions. |
| 262 void ScaleARGBRowDownEven_NEON(const uint8* src_argb, int src_stride, |
| 263 int src_stepx, |
| 264 uint8* dst_argb, int dst_width); |
| 265 void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, int src_stride, |
| 266 int src_stepx, |
| 267 uint8* dst_argb, int dst_width); |
| 268 void ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 269 uint8* dst, int dst_width); |
| 270 void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 271 uint8* dst, int dst_width); |
| 272 |
| 273 // ScaleRowDown2Box also used by planar functions |
| 274 // NEON downscalers with interpolation. |
| 275 |
| 276 // Note - not static due to reuse in convert for 444 to 420. |
| 277 void ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 278 uint8* dst, int dst_width); |
| 279 |
| 280 void ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 281 uint8* dst, int dst_width); |
| 282 |
| 283 void ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 284 uint8* dst_ptr, int dst_width); |
| 285 void ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, |
| 286 uint8* dst_ptr, int dst_width); |
| 287 |
| 288 // Down scale from 4 to 3 pixels. Use the neon multilane read/write |
| 289 // to load up the every 4th pixel into a 4 different registers. |
| 290 // Point samples 32 pixels to 24 pixels. |
| 291 void ScaleRowDown34_NEON(const uint8* src_ptr, |
| 292 ptrdiff_t src_stride, |
| 293 uint8* dst_ptr, int dst_width); |
| 294 void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr, |
| 295 ptrdiff_t src_stride, |
| 296 uint8* dst_ptr, int dst_width); |
| 297 void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr, |
| 298 ptrdiff_t src_stride, |
| 299 uint8* dst_ptr, int dst_width); |
| 300 |
| 301 // 32 -> 12 |
| 302 void ScaleRowDown38_NEON(const uint8* src_ptr, |
| 303 ptrdiff_t src_stride, |
| 304 uint8* dst_ptr, int dst_width); |
| 305 // 32x3 -> 12x1 |
| 306 void ScaleRowDown38_3_Box_NEON(const uint8* src_ptr, |
| 307 ptrdiff_t src_stride, |
| 308 uint8* dst_ptr, int dst_width); |
| 309 // 32x2 -> 12x1 |
| 310 void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr, |
| 311 ptrdiff_t src_stride, |
| 312 uint8* dst_ptr, int dst_width); |
| 313 |
| 314 void ScaleRowDown2_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 315 uint8* dst, int dst_width); |
| 316 void ScaleRowDown2Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 317 uint8* dst, int dst_width); |
| 318 void ScaleRowDown4_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 319 uint8* dst, int dst_width); |
| 320 void ScaleRowDown4Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 321 uint8* dst, int dst_width); |
| 322 void ScaleRowDown34_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 323 uint8* dst, int dst_width); |
| 324 void ScaleRowDown34_0_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 325 uint8* d, int dst_width); |
| 326 void ScaleRowDown34_1_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 327 uint8* d, int dst_width); |
| 328 void ScaleRowDown38_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 329 uint8* dst, int dst_width); |
| 330 void ScaleRowDown38_2_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, |
| 331 uint8* dst_ptr, int dst_width); |
| 332 void ScaleRowDown38_3_Box_MIPS_DSPR2(const uint8* src_ptr, |
| 333 ptrdiff_t src_stride, |
| 334 uint8* dst_ptr, int dst_width); |
| 335 |
| 336 #ifdef __cplusplus |
| 337 } // extern "C" |
| 338 } // namespace libyuv |
| 339 #endif |
| 340 |
| 341 #endif // INCLUDE_LIBYUV_SCALE_ROW_H_ NOLINT |
OLD | NEW |