Home | History | Annotate | Download | only in libyuv
      1 /*
      2  *  Copyright 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 INCLUDE_LIBYUV_ROW_H_  // NOLINT
     12 #define INCLUDE_LIBYUV_ROW_H_
     13 
     14 #include "libyuv/basic_types.h"
     15 
     16 #ifdef __cplusplus
     17 namespace libyuv {
     18 extern "C" {
     19 #endif
     20 
     21 // TODO(fbarchard): Remove kMaxStride
     22 #define kMaxStride (2880 * 4)
     23 #define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
     24 
     25 #if defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \
     26     defined(TARGET_IPHONE_SIMULATOR)
     27 #define YUV_DISABLE_ASM
     28 #endif
     29 // True if compiling for SSSE3 as a requirement.
     30 #if defined(__SSSE3__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 3))
     31 #define LIBYUV_SSSE3_ONLY
     32 #endif
     33 
     34 // The following are available on all x86 platforms:
     35 #if !defined(YUV_DISABLE_ASM) && \
     36     (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
     37 // Conversions.
     38 #define HAS_ABGRTOARGBROW_SSSE3
     39 #define HAS_ABGRTOUVROW_SSSE3
     40 #define HAS_ABGRTOYROW_SSSE3
     41 #define HAS_ARGB1555TOARGBROW_SSE2
     42 #define HAS_ARGB4444TOARGBROW_SSE2
     43 #define HAS_ARGBTOARGB1555ROW_SSE2
     44 #define HAS_ARGBTOARGB4444ROW_SSE2
     45 #define HAS_ARGBTORAWROW_SSSE3
     46 #define HAS_ARGBTORGB24ROW_SSSE3
     47 #define HAS_ARGBTORGB565ROW_SSE2
     48 #define HAS_ARGBTORGBAROW_SSSE3
     49 #define HAS_ARGBTOUVROW_SSSE3
     50 #define HAS_ARGBTOYROW_SSSE3
     51 #define HAS_BGRATOARGBROW_SSSE3
     52 #define HAS_BGRATOUVROW_SSSE3
     53 #define HAS_BGRATOYROW_SSSE3
     54 #define HAS_COPYROW_SSE2
     55 #define HAS_COPYROW_X86
     56 #define HAS_I400TOARGBROW_SSE2
     57 #define HAS_I411TOARGBROW_SSSE3
     58 #define HAS_I422TOABGRROW_SSSE3
     59 #define HAS_I422TOARGBROW_SSSE3
     60 #define HAS_I422TOBGRAROW_SSSE3
     61 #define HAS_I444TOARGBROW_SSSE3
     62 #define HAS_MIRRORROW_SSSE3
     63 #define HAS_MIRRORROWUV_SSSE3
     64 #define HAS_NV12TOARGBROW_SSSE3
     65 #define HAS_NV21TOARGBROW_SSSE3
     66 #define HAS_RAWTOARGBROW_SSSE3
     67 #define HAS_RGB24TOARGBROW_SSSE3
     68 #define HAS_RGB565TOARGBROW_SSE2
     69 #define HAS_SETROW_X86
     70 #define HAS_SPLITUV_SSE2
     71 #define HAS_UYVYTOUV422ROW_SSE2
     72 #define HAS_UYVYTOUVROW_SSE2
     73 #define HAS_UYVYTOYROW_SSE2
     74 #define HAS_YTOARGBROW_SSE2
     75 #define HAS_YUY2TOUV422ROW_SSE2
     76 #define HAS_YUY2TOUVROW_SSE2
     77 #define HAS_YUY2TOYROW_SSE2
     78 
     79 // Effects
     80 #define HAS_ARGBAFFINEROW_SSE2
     81 #define HAS_ARGBATTENUATEROW_SSSE3
     82 #define HAS_ARGBBLENDROW_SSSE3
     83 #define HAS_ARGBCOLORMATRIXROW_SSSE3
     84 #define HAS_ARGBGRAYROW_SSSE3
     85 #define HAS_ARGBINTERPOLATEROW_SSSE3
     86 #define HAS_ARGBMIRRORROW_SSSE3
     87 #define HAS_ARGBQUANTIZEROW_SSE2
     88 #define HAS_ARGBSEPIAROW_SSSE3
     89 #define HAS_ARGBSHADE_SSE2
     90 #define HAS_ARGBUNATTENUATEROW_SSE2
     91 #define HAS_COMPUTECUMULATIVESUMROW_SSE2
     92 #define HAS_CUMULATIVESUMTOAVERAGE_SSE2
     93 #endif
     94 
     95 // The following are Windows only:
     96 #if !defined(YUV_DISABLE_ASM) && defined(_M_IX86)
     97 #define HAS_ABGRTOARGBROW_SSSE3
     98 #define HAS_ARGBCOLORTABLEROW_X86
     99 #define HAS_I422TORGBAROW_SSSE3
    100 #define HAS_RGBATOARGBROW_SSSE3
    101 #define HAS_RGBATOUVROW_SSSE3
    102 #define HAS_RGBATOYROW_SSSE3
    103 #endif
    104 
    105 // The following are disabled when SSSE3 is available:
    106 #if !defined(YUV_DISABLE_ASM) && \
    107     (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) && \
    108     !defined(LIBYUV_SSSE3_ONLY)
    109 #define HAS_ARGBATTENUATE_SSE2
    110 #define HAS_ARGBBLENDROW_SSE2
    111 #define HAS_MIRRORROW_SSE2
    112 #endif
    113 
    114 // The following are available on Neon platforms
    115 #if !defined(YUV_DISABLE_ASM) && (defined(__ARM_NEON__) || defined(LIBYUV_NEON))
    116 #define HAS_COPYROW_NEON
    117 #define HAS_I422TOABGRROW_NEON
    118 #define HAS_I422TOARGBROW_NEON
    119 #define HAS_I422TOBGRAROW_NEON
    120 #define HAS_I422TORAWROW_NEON
    121 #define HAS_I422TORGB24ROW_NEON
    122 #define HAS_I422TORGBAROW_NEON
    123 #define HAS_MIRRORROW_NEON
    124 #define HAS_MIRRORROWUV_NEON
    125 #define HAS_SETROW_NEON
    126 #define HAS_SPLITUV_NEON
    127 #define HAS_UYVYTOUV422ROW_NEON
    128 #define HAS_UYVYTOUVROW_NEON
    129 #define HAS_UYVYTOYROW_NEON
    130 #define HAS_YUY2TOUV422ROW_NEON
    131 #define HAS_YUY2TOUVROW_NEON
    132 #define HAS_YUY2TOYROW_NEON
    133 
    134 // TODO(fbarchard): Hook these up to calling functions.
    135 #define HAS_ABGRTOARGBROW_NEON
    136 #define HAS_ARGBTORAWROW_NEON
    137 #define HAS_ARGBTORGB24ROW_NEON
    138 #define HAS_ARGBTORGBAROW_NEON
    139 #define HAS_BGRATOARGBROW_NEON
    140 #define HAS_NV12TOARGBROW_NEON
    141 #define HAS_NV21TOARGBROW_NEON
    142 #define HAS_RAWTOARGBROW_NEON
    143 #define HAS_RGB24TOARGBROW_NEON
    144 #define HAS_RGBATOARGBROW_NEON
    145 #endif
    146 
    147 #if defined(_MSC_VER) && !defined(__CLR_VER)
    148 #define SIMD_ALIGNED(var) __declspec(align(16)) var
    149 typedef __declspec(align(16)) int8 vec8[16];
    150 typedef __declspec(align(16)) uint8 uvec8[16];
    151 typedef __declspec(align(16)) int16 vec16[8];
    152 typedef __declspec(align(16)) uint16 uvec16[8];
    153 typedef __declspec(align(16)) int32 vec32[4];
    154 typedef __declspec(align(16)) uint32 uvec32[4];
    155 #elif defined(__GNUC__)
    156 #define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
    157 typedef int8 __attribute__((vector_size(16))) vec8;
    158 typedef uint8 __attribute__((vector_size(16))) uvec8;
    159 typedef int16 __attribute__((vector_size(16))) vec16;
    160 typedef uint16 __attribute__((vector_size(16))) uvec16;
    161 typedef int32 __attribute__((vector_size(16))) vec32;
    162 typedef uint32 __attribute__((vector_size(16))) uvec32;
    163 #else
    164 #define SIMD_ALIGNED(var) var
    165 typedef int8 vec8[16];
    166 typedef uint8 uvec8[16];
    167 typedef int16 vec16[8];
    168 typedef uint16 uvec16[8];
    169 typedef int32 vec32[4];
    170 typedef uint32 uvec32[4];
    171 #endif
    172 
    173 #if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__)
    174 #define OMITFP
    175 #else
    176 #define OMITFP __attribute__((optimize("omit-frame-pointer")))
    177 #endif
    178 
    179 void I422ToARGBRow_NEON(const uint8* y_buf,
    180                         const uint8* u_buf,
    181                         const uint8* v_buf,
    182                         uint8* rgb_buf,
    183                         int width);
    184 void I422ToBGRARow_NEON(const uint8* y_buf,
    185                         const uint8* u_buf,
    186                         const uint8* v_buf,
    187                         uint8* rgb_buf,
    188                         int width);
    189 void I422ToABGRRow_NEON(const uint8* y_buf,
    190                         const uint8* u_buf,
    191                         const uint8* v_buf,
    192                         uint8* rgb_buf,
    193                         int width);
    194 void I422ToRGBARow_NEON(const uint8* y_buf,
    195                         const uint8* u_buf,
    196                         const uint8* v_buf,
    197                         uint8* rgb_buf,
    198                         int width);
    199 void I422ToRGB24Row_NEON(const uint8* y_buf,
    200                          const uint8* u_buf,
    201                          const uint8* v_buf,
    202                          uint8* rgb_buf,
    203                          int width);
    204 void I422ToRAWRow_NEON(const uint8* y_buf,
    205                        const uint8* u_buf,
    206                        const uint8* v_buf,
    207                        uint8* rgb_buf,
    208                        int width);
    209 void NV12ToARGBRow_NEON(const uint8* y_buf,
    210                         const uint8* uv_buf,
    211                         uint8* rgb_buf,
    212                         int width);
    213 void NV21ToARGBRow_NEON(const uint8* y_buf,
    214                         const uint8* uv_buf,
    215                         uint8* rgb_buf,
    216                         int width);
    217 
    218 void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    219 void BGRAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    220 void ABGRToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    221 void RGBAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    222 void ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    223 void BGRAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    224 void ABGRToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    225 void RGBAToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    226 
    227 void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
    228                        uint8* dst_u, uint8* dst_v, int width);
    229 void BGRAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
    230                        uint8* dst_u, uint8* dst_v, int width);
    231 void ABGRToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
    232                        uint8* dst_u, uint8* dst_v, int width);
    233 void RGBAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb,
    234                        uint8* dst_u, uint8* dst_v, int width);
    235 void ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
    236                                  uint8* dst_u, uint8* dst_v, int width);
    237 void BGRAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
    238                                  uint8* dst_u, uint8* dst_v, int width);
    239 void ABGRToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
    240                                  uint8* dst_u, uint8* dst_v, int width);
    241 void RGBAToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb,
    242                                  uint8* dst_u, uint8* dst_v, int width);
    243 
    244 void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width);
    245 void MirrorRow_SSE2(const uint8* src, uint8* dst, int width);
    246 void MirrorRow_NEON(const uint8* src, uint8* dst, int width);
    247 void MirrorRow_C(const uint8* src, uint8* dst, int width);
    248 
    249 void MirrorRowUV_SSSE3(const uint8* src, uint8* dst_u, uint8* dst_v, int width);
    250 void MirrorRowUV_NEON(const uint8* src, uint8* dst_u, uint8* dst_v, int width);
    251 void MirrorRowUV_C(const uint8* src, uint8* dst_u, uint8* dst_v, int width);
    252 
    253 void ARGBMirrorRow_SSSE3(const uint8* src, uint8* dst, int width);
    254 void ARGBMirrorRow_C(const uint8* src, uint8* dst, int width);
    255 
    256 void SplitUV_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix);
    257 void SplitUV_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix);
    258 void SplitUV_C(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix);
    259 
    260 void CopyRow_SSE2(const uint8* src, uint8* dst, int count);
    261 void CopyRow_X86(const uint8* src, uint8* dst, int count);
    262 void CopyRow_NEON(const uint8* src, uint8* dst, int count);
    263 void CopyRow_C(const uint8* src, uint8* dst, int count);
    264 
    265 void SetRow8_X86(uint8* dst, uint32 v32, int count);
    266 void SetRows32_X86(uint8* dst, uint32 v32, int width,
    267                    int dst_stride, int height);
    268 void SetRow8_NEON(uint8* dst, uint32 v32, int count);
    269 void SetRows32_NEON(uint8* dst, uint32 v32, int width,
    270                     int dst_stride, int height);
    271 void SetRow8_C(uint8* dst, uint32 v32, int count);
    272 void SetRows32_C(uint8* dst, uint32 v32, int width, int dst_stride, int height);
    273 
    274 void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int pix);
    275 void BGRAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix);
    276 void ABGRToYRow_C(const uint8* src_argb, uint8* dst_y, int pix);
    277 void RGBAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix);
    278 
    279 void ARGBToUVRow_C(const uint8* src_argb0, int src_stride_argb,
    280                    uint8* dst_u, uint8* dst_v, int width);
    281 void BGRAToUVRow_C(const uint8* src_argb0, int src_stride_argb,
    282                    uint8* dst_u, uint8* dst_v, int width);
    283 void ABGRToUVRow_C(const uint8* src_argb0, int src_stride_argb,
    284                    uint8* dst_u, uint8* dst_v, int width);
    285 void RGBAToUVRow_C(const uint8* src_argb0, int src_stride_argb,
    286                    uint8* dst_u, uint8* dst_v, int width);
    287 
    288 void BGRAToARGBRow_SSSE3(const uint8* src_bgra, uint8* dst_argb, int pix);
    289 void ABGRToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix);
    290 void RGBAToARGBRow_SSSE3(const uint8* src_rgba, uint8* dst_argb, int pix);
    291 void RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix);
    292 void RAWToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix);
    293 void ARGB1555ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix);
    294 void RGB565ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix);
    295 void ARGB4444ToARGBRow_SSE2(const uint8* src_argb, uint8* dst_argb, int pix);
    296 
    297 void BGRAToARGBRow_NEON(const uint8* src_bgra, uint8* dst_argb, int pix);
    298 void ABGRToARGBRow_NEON(const uint8* src_abgr, uint8* dst_argb, int pix);
    299 void RGBAToARGBRow_NEON(const uint8* src_rgba, uint8* dst_argb, int pix);
    300 void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix);
    301 void RAWToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix);
    302 
    303 void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int pix);
    304 void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix);
    305 void RGBAToARGBRow_C(const uint8* src_rgba, uint8* dst_argb, int pix);
    306 void RGB24ToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int pix);
    307 void RAWToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int pix);
    308 void RGB565ToARGBRow_C(const uint8* src_rgb, uint8* dst_argb, int pix);
    309 void ARGB1555ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int pix);
    310 void ARGB4444ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int pix);
    311 
    312 void ARGBToRGBARow_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix);
    313 void ARGBToRGB24Row_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix);
    314 void ARGBToRAWRow_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix);
    315 void ARGBToRGB565Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    316 void ARGBToARGB1555Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    317 void ARGBToARGB4444Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    318 
    319 void ARGBToRGBARow_NEON(const uint8* src_argb, uint8* dst_rgb, int pix);
    320 void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb, int pix);
    321 void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_rgb, int pix);
    322 
    323 void ARGBToRGBARow_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    324 void ARGBToRGB24Row_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    325 void ARGBToRAWRow_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    326 void ARGBToRGB565Row_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    327 void ARGBToARGB1555Row_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    328 void ARGBToARGB4444Row_C(const uint8* src_argb, uint8* dst_rgb, int pix);
    329 
    330 void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix);
    331 void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int pix);
    332 
    333 void I444ToARGBRow_C(const uint8* y_buf,
    334                      const uint8* u_buf,
    335                      const uint8* v_buf,
    336                      uint8* argb_buf,
    337                      int width);
    338 
    339 void I422ToARGBRow_C(const uint8* y_buf,
    340                      const uint8* u_buf,
    341                      const uint8* v_buf,
    342                      uint8* argb_buf,
    343                      int width);
    344 
    345 void I411ToARGBRow_C(const uint8* y_buf,
    346                      const uint8* u_buf,
    347                      const uint8* v_buf,
    348                      uint8* rgb_buf,
    349                      int width);
    350 
    351 void NV12ToARGBRow_C(const uint8* y_buf,
    352                      const uint8* uv_buf,
    353                      uint8* argb_buf,
    354                      int width);
    355 
    356 void NV21ToARGBRow_C(const uint8* y_buf,
    357                      const uint8* vu_buf,
    358                      uint8* argb_buf,
    359                      int width);
    360 
    361 void I422ToBGRARow_C(const uint8* y_buf,
    362                      const uint8* u_buf,
    363                      const uint8* v_buf,
    364                      uint8* bgra_buf,
    365                      int width);
    366 
    367 void I422ToABGRRow_C(const uint8* y_buf,
    368                      const uint8* u_buf,
    369                      const uint8* v_buf,
    370                      uint8* abgr_buf,
    371                      int width);
    372 
    373 void I422ToRGBARow_C(const uint8* y_buf,
    374                      const uint8* u_buf,
    375                      const uint8* v_buf,
    376                      uint8* rgba_buf,
    377                      int width);
    378 void I422ToRGB24Row_C(const uint8* y_buf,
    379                       const uint8* u_buf,
    380                       const uint8* v_buf,
    381                       uint8* rgb24_buf,
    382                       int width);
    383 void I422ToRAWRow_C(const uint8* y_buf,
    384                     const uint8* u_buf,
    385                     const uint8* v_buf,
    386                     uint8* raw_buf,
    387                     int width);
    388 
    389 void YToARGBRow_C(const uint8* y_buf,
    390                   uint8* rgb_buf,
    391                   int width);
    392 
    393 void I444ToARGBRow_SSSE3(const uint8* y_buf,
    394                          const uint8* u_buf,
    395                          const uint8* v_buf,
    396                          uint8* argb_buf,
    397                          int width);
    398 
    399 void I422ToARGBRow_SSSE3(const uint8* y_buf,
    400                          const uint8* u_buf,
    401                          const uint8* v_buf,
    402                          uint8* argb_buf,
    403                          int width);
    404 
    405 void I411ToARGBRow_SSSE3(const uint8* y_buf,
    406                          const uint8* u_buf,
    407                          const uint8* v_buf,
    408                          uint8* rgb_buf,
    409                          int width);
    410 
    411 void NV12ToARGBRow_SSSE3(const uint8* y_buf,
    412                          const uint8* uv_buf,
    413                          uint8* argb_buf,
    414                          int width);
    415 
    416 void NV21ToARGBRow_SSSE3(const uint8* y_buf,
    417                          const uint8* vu_buf,
    418                          uint8* argb_buf,
    419                          int width);
    420 
    421 void I422ToBGRARow_SSSE3(const uint8* y_buf,
    422                          const uint8* u_buf,
    423                          const uint8* v_buf,
    424                          uint8* bgra_buf,
    425                          int width);
    426 
    427 void I422ToABGRRow_SSSE3(const uint8* y_buf,
    428                          const uint8* u_buf,
    429                          const uint8* v_buf,
    430                          uint8* abgr_buf,
    431                          int width);
    432 
    433 void I422ToRGBARow_SSSE3(const uint8* y_buf,
    434                          const uint8* u_buf,
    435                          const uint8* v_buf,
    436                          uint8* rgba_buf,
    437                          int width);
    438 
    439 void I444ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
    440                                    const uint8* u_buf,
    441                                    const uint8* v_buf,
    442                                    uint8* argb_buf,
    443                                    int width);
    444 
    445 void I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
    446                                    const uint8* u_buf,
    447                                    const uint8* v_buf,
    448                                    uint8* argb_buf,
    449                                    int width);
    450 
    451 void I411ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
    452                                    const uint8* u_buf,
    453                                    const uint8* v_buf,
    454                                    uint8* rgb_buf,
    455                                    int width);
    456 
    457 void NV12ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
    458                                    const uint8* uv_buf,
    459                                    uint8* argb_buf,
    460                                    int width);
    461 
    462 void NV21ToARGBRow_Unaligned_SSSE3(const uint8* y_buf,
    463                                    const uint8* vu_buf,
    464                                    uint8* argb_buf,
    465                                    int width);
    466 
    467 void I422ToBGRARow_Unaligned_SSSE3(const uint8* y_buf,
    468                                    const uint8* u_buf,
    469                                    const uint8* v_buf,
    470                                    uint8* bgra_buf,
    471                                    int width);
    472 
    473 void I422ToABGRRow_Unaligned_SSSE3(const uint8* y_buf,
    474                                    const uint8* u_buf,
    475                                    const uint8* v_buf,
    476                                    uint8* abgr_buf,
    477                                    int width);
    478 
    479 void I422ToRGBARow_Unaligned_SSSE3(const uint8* y_buf,
    480                                    const uint8* u_buf,
    481                                    const uint8* v_buf,
    482                                    uint8* rgba_buf,
    483                                    int width);
    484 
    485 void I444ToARGBRow_Any_SSSE3(const uint8* y_buf,
    486                              const uint8* u_buf,
    487                              const uint8* v_buf,
    488                              uint8* argb_buf,
    489                              int width);
    490 
    491 void I422ToARGBRow_Any_SSSE3(const uint8* y_buf,
    492                              const uint8* u_buf,
    493                              const uint8* v_buf,
    494                              uint8* argb_buf,
    495                              int width);
    496 
    497 void I411ToARGBRow_Any_SSSE3(const uint8* y_buf,
    498                              const uint8* u_buf,
    499                              const uint8* v_buf,
    500                              uint8* rgb_buf,
    501                              int width);
    502 
    503 void NV12ToARGBRow_Any_SSSE3(const uint8* y_buf,
    504                              const uint8* uv_buf,
    505                              uint8* argb_buf,
    506                              int width);
    507 
    508 void NV21ToARGBRow_Any_SSSE3(const uint8* y_buf,
    509                              const uint8* vu_buf,
    510                              uint8* argb_buf,
    511                              int width);
    512 
    513 void I422ToBGRARow_Any_SSSE3(const uint8* y_buf,
    514                              const uint8* u_buf,
    515                              const uint8* v_buf,
    516                              uint8* bgra_buf,
    517                              int width);
    518 
    519 void I422ToABGRRow_Any_SSSE3(const uint8* y_buf,
    520                              const uint8* u_buf,
    521                              const uint8* v_buf,
    522                              uint8* abgr_buf,
    523                              int width);
    524 
    525 void I422ToRGBARow_Any_SSSE3(const uint8* y_buf,
    526                              const uint8* u_buf,
    527                              const uint8* v_buf,
    528                              uint8* rgba_buf,
    529                              int width);
    530 
    531 void YToARGBRow_SSE2(const uint8* y_buf,
    532                      uint8* argb_buf,
    533                      int width);
    534 
    535 // ARGB preattenuated alpha blend.
    536 void ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1,
    537                         uint8* dst_argb, int width);
    538 void ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1,
    539                        uint8* dst_argb, int width);
    540 void ARGBBlendRow_C(const uint8* src_argb0, const uint8* src_argb1,
    541                     uint8* dst_argb, int width);
    542 
    543 void ARGBToRGB24Row_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix);
    544 void ARGBToRAWRow_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int pix);
    545 void ARGBToRGB565Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    546 void ARGBToARGB1555Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    547 void ARGBToARGB4444Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int pix);
    548 
    549 void ARGBToRGB24Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int pix);
    550 void ARGBToRAWRow_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int pix);
    551 
    552 void ARGBToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    553 void BGRAToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    554 void ABGRToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    555 void RGBAToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int pix);
    556 void ARGBToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb,
    557                            uint8* dst_u, uint8* dst_v, int width);
    558 void BGRAToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb,
    559                            uint8* dst_u, uint8* dst_v, int width);
    560 void ABGRToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb,
    561                            uint8* dst_u, uint8* dst_v, int width);
    562 void RGBAToUVRow_Any_SSSE3(const uint8* src_argb0, int src_stride_argb,
    563                            uint8* dst_u, uint8* dst_v, int width);
    564 void I422ToARGBRow_Any_NEON(const uint8* y_buf,
    565                             const uint8* u_buf,
    566                             const uint8* v_buf,
    567                             uint8* rgb_buf,
    568                             int width);
    569 void I422ToBGRARow_Any_NEON(const uint8* y_buf,
    570                             const uint8* u_buf,
    571                             const uint8* v_buf,
    572                             uint8* rgb_buf,
    573                             int width);
    574 void I422ToABGRRow_Any_NEON(const uint8* y_buf,
    575                             const uint8* u_buf,
    576                             const uint8* v_buf,
    577                             uint8* rgb_buf,
    578                             int width);
    579 void I422ToRGBARow_Any_NEON(const uint8* y_buf,
    580                             const uint8* u_buf,
    581                             const uint8* v_buf,
    582                             uint8* rgb_buf,
    583                             int width);
    584 void I422ToRGB24Row_Any_NEON(const uint8* y_buf,
    585                              const uint8* u_buf,
    586                              const uint8* v_buf,
    587                              uint8* rgb_buf,
    588                              int width);
    589 void I422ToRAWRow_Any_NEON(const uint8* y_buf,
    590                            const uint8* u_buf,
    591                            const uint8* v_buf,
    592                            uint8* rgb_buf,
    593                            int width);
    594 void NV12ToARGBRow_Any_NEON(const uint8* y_buf,
    595                             const uint8* uv_buf,
    596                             uint8* argb_buf,
    597                             int width);
    598 void NV21ToARGBRow_Any_NEON(const uint8* y_buf,
    599                             const uint8* uv_buf,
    600                             uint8* argb_buf,
    601                             int width);
    602 
    603 void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix);
    604 void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2,
    605                       uint8* dst_u, uint8* dst_v, int pix);
    606 void YUY2ToUV422Row_SSE2(const uint8* src_yuy2,
    607                          uint8* dst_u, uint8* dst_v, int pix);
    608 void YUY2ToYRow_Unaligned_SSE2(const uint8* src_yuy2,
    609                                uint8* dst_y, int pix);
    610 void YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2, int stride_yuy2,
    611                                 uint8* dst_u, uint8* dst_v, int pix);
    612 void YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2,
    613                                    uint8* dst_u, uint8* dst_v, int pix);
    614 void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int pix);
    615 void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2,
    616                       uint8* dst_u, uint8* dst_v, int pix);
    617 void YUY2ToUV422Row_NEON(const uint8* src_yuy2,
    618                          uint8* dst_u, uint8* dst_v, int pix);
    619 void YUY2ToYRow_C(const uint8* src_yuy2, uint8* dst_y, int pix);
    620 void YUY2ToUVRow_C(const uint8* src_yuy2, int stride_yuy2,
    621                    uint8* dst_u, uint8* dst_v, int pix);
    622 void YUY2ToUV422Row_C(const uint8* src_yuy2,
    623                       uint8* dst_u, uint8* dst_v, int pix);
    624 void YUY2ToYRow_Any_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix);
    625 void YUY2ToUVRow_Any_SSE2(const uint8* src_yuy2, int stride_yuy2,
    626                           uint8* dst_u, uint8* dst_v, int pix);
    627 void YUY2ToUV422Row_Any_SSE2(const uint8* src_yuy2,
    628                              uint8* dst_u, uint8* dst_v, int pix);
    629 void YUY2ToYRow_Any_NEON(const uint8* src_yuy2, uint8* dst_y, int pix);
    630 void YUY2ToUVRow_Any_NEON(const uint8* src_yuy2, int stride_yuy2,
    631                           uint8* dst_u, uint8* dst_v, int pix);
    632 void YUY2ToUV422Row_Any_NEON(const uint8* src_yuy2,
    633                              uint8* dst_u, uint8* dst_v, int pix);
    634 
    635 void UYVYToYRow_SSE2(const uint8* src_uyvy, uint8* dst_y, int pix);
    636 void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
    637                       uint8* dst_u, uint8* dst_v, int pix);
    638 void UYVYToUV422Row_SSE2(const uint8* src_uyvy,
    639                          uint8* dst_u, uint8* dst_v, int pix);
    640 void UYVYToYRow_Unaligned_SSE2(const uint8* src_uyvy,
    641                                uint8* dst_y, int pix);
    642 void UYVYToUVRow_Unaligned_SSE2(const uint8* src_uyvy, int stride_uyvy,
    643                                 uint8* dst_u, uint8* dst_v, int pix);
    644 void UYVYToUV422Row_Unaligned_SSE2(const uint8* src_uyvy,
    645                                    uint8* dst_u, uint8* dst_v, int pix);
    646 void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int pix);
    647 void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
    648                       uint8* dst_u, uint8* dst_v, int pix);
    649 void UYVYToUV422Row_NEON(const uint8* src_uyvy,
    650                          uint8* dst_u, uint8* dst_v, int pix);
    651 
    652 void UYVYToYRow_C(const uint8* src_uyvy, uint8* dst_y, int pix);
    653 void UYVYToUVRow_C(const uint8* src_uyvy, int stride_uyvy,
    654                    uint8* dst_u, uint8* dst_v, int pix);
    655 void UYVYToUV422Row_C(const uint8* src_uyvy,
    656                       uint8* dst_u, uint8* dst_v, int pix);
    657 void UYVYToYRow_Any_SSE2(const uint8* src_uyvy, uint8* dst_y, int pix);
    658 void UYVYToUVRow_Any_SSE2(const uint8* src_uyvy, int stride_uyvy,
    659                           uint8* dst_u, uint8* dst_v, int pix);
    660 void UYVYToUV422Row_Any_SSE2(const uint8* src_uyvy,
    661                              uint8* dst_u, uint8* dst_v, int pix);
    662 void UYVYToYRow_Any_NEON(const uint8* src_uyvy, uint8* dst_y, int pix);
    663 void UYVYToUVRow_Any_NEON(const uint8* src_uyvy, int stride_uyvy,
    664                           uint8* dst_u, uint8* dst_v, int pix);
    665 void UYVYToUV422Row_Any_NEON(const uint8* src_uyvy,
    666                              uint8* dst_u, uint8* dst_v, int pix);
    667 
    668 void ARGBAttenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width);
    669 void ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width);
    670 void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width);
    671 
    672 // Inverse table for unattenuate, shared by C and SSE2.
    673 extern uint32 fixed_invtbl8[256];
    674 void ARGBUnattenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width);
    675 void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width);
    676 
    677 void ARGBGrayRow_C(const uint8* src_argb, uint8* dst_argb, int width);
    678 void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width);
    679 
    680 void ARGBSepiaRow_C(uint8* dst_argb, int width);
    681 void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width);
    682 
    683 void ARGBColorMatrixRow_C(uint8* dst_argb, const int8* matrix_argb, int width);
    684 void ARGBColorMatrixRow_SSSE3(uint8* dst_argb, const int8* matrix_argb,
    685                               int width);
    686 
    687 void ARGBColorTableRow_C(uint8* dst_argb, const uint8* table_argb, int width);
    688 void ARGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width);
    689 
    690 void ARGBQuantizeRow_C(uint8* dst_argb, int scale, int interval_size,
    691                        int interval_offset, int width);
    692 void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
    693                           int interval_offset, int width);
    694 
    695 // Used for blur.
    696 void CumulativeSumToAverage_SSE2(const int32* topleft, const int32* botleft,
    697                                  int width, int area, uint8* dst, int count);
    698 void ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum,
    699                                   const int32* previous_cumsum, int width);
    700 
    701 void CumulativeSumToAverage_C(const int32* topleft, const int32* botleft,
    702                               int width, int area, uint8* dst, int count);
    703 void ComputeCumulativeSumRow_C(const uint8* row, int32* cumsum,
    704                                const int32* previous_cumsum, int width);
    705 
    706 void ARGBShadeRow_C(const uint8* src_argb, uint8* dst_argb, int width,
    707                     uint32 value);
    708 void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
    709                        uint32 value);
    710 
    711 LIBYUV_API
    712 void ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride,
    713                      uint8* dst_argb, const float* uv_dudv, int width);
    714 LIBYUV_API
    715 void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
    716                         uint8* dst_argb, const float* uv_dudv, int width);
    717 
    718 void ARGBInterpolateRow_C(uint8* dst_ptr, const uint8* src_ptr,
    719                           ptrdiff_t src_stride,
    720                           int dst_width, int source_y_fraction);
    721 void ARGBInterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
    722                               ptrdiff_t src_stride, int dst_width,
    723                               int source_y_fraction);
    724 
    725 #ifdef __cplusplus
    726 }  // extern "C"
    727 }  // namespace libyuv
    728 #endif
    729 
    730 #endif  // INCLUDE_LIBYUV_ROW_H_  NOLINT
    731 
    732