1c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com/* 2c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * Copyright 2013 The LibYuv Project Authors. All rights reserved. 3c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * 4c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * Use of this source code is governed by a BSD-style license 5c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * that can be found in the LICENSE file in the root of the source 6c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * tree. An additional intellectual property rights grant can be found 7c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * in the file PATENTS. All contributing project authors may 8c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com * be found in the AUTHORS file in the root of the source tree. 9c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com */ 10c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 115fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#ifndef INCLUDE_LIBYUV_SCALE_ROW_H_ // NOLINT 125fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#define INCLUDE_LIBYUV_SCALE_ROW_H_ 13c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 14c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#include "libyuv/basic_types.h" 15c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 16c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#ifdef __cplusplus 17c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comnamespace libyuv { 18c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comextern "C" { 19c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#endif 20c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 212c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#if defined(__pnacl__) || defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \ 222c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com defined(TARGET_IPHONE_SIMULATOR) 232c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#define LIBYUV_DISABLE_X86 242c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#endif 252c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com 26dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on all x86 platforms: 27dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_X86) && \ 28dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) 29dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_SSE2 30dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_SSE2 31dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_SSSE3 32dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_SSSE3 33dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEADDROWS_SSE2 34dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEFILTERCOLS_SSSE3 35dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALECOLSUP2_SSE2 36dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWN2_SSE2 37dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWNEVEN_SSE2 38dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBCOLS_SSE2 39dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBFILTERCOLS_SSSE3 40dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBCOLSUP2_SSE2 415dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define HAS_FIXEDDIV_X86 425dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define HAS_FIXEDDIV1_X86 43dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif 44dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 45dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on Neon platforms: 46dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \ 47dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com (defined(__ARM_NEON__) || defined(LIBYUV_NEON)) 48dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_NEON 49dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_NEON 50dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_NEON 51dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_NEON 52dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWNEVEN_NEON 53dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWN2_NEON 54dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif 55dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 56dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on Mips platforms: 57dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \ 58b74ed8076a98b6bc2a4064eecfe32e8f80a56c47fbarchard@google.com defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2) 59dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_MIPS_DSPR2 60dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_MIPS_DSPR2 61dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_MIPS_DSPR2 62dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_MIPS_DSPR2 63dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif 64dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 65c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com// Scale ARGB vertically with bilinear interpolation. 66c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comvoid ScalePlaneVertical(int src_height, 67c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com int dst_width, int dst_height, 68c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com int src_stride, int dst_stride, 69c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com const uint8* src_argb, uint8* dst_argb, 70c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com int x, int y, int dy, 715dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com int bpp, enum FilterMode filtering); 72c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 73b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScalePlaneVertical_16(int src_height, 74b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int dst_width, int dst_height, 75b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int src_stride, int dst_stride, 76b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com const uint16* src_argb, uint16* dst_argb, 77b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int x, int y, int dy, 78b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int wpp, enum FilterMode filtering); 79b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com 80980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com// Simplify the filtering based on scale factors. 815dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comenum FilterMode ScaleFilterReduce(int src_width, int src_height, 825dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com int dst_width, int dst_height, 835dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com enum FilterMode filtering); 845dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com 855dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com// Divide num by div and return as 16.16 fixed point result. 865dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv_C(int num, int div); 875dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv_X86(int num, int div); 885dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com// Divide num - 1 by div - 1 and return as 16.16 fixed point result. 895dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv1_C(int num, int div); 905dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv1_X86(int num, int div); 915dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#ifdef HAS_FIXEDDIV_X86 925dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv FixedDiv_X86 935dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv1 FixedDiv1_X86 945dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#else 955dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv FixedDiv_C 965dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv1 FixedDiv1_C 975dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#endif 98980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com 99980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com// Compute slope values for stepping. 100980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.comvoid ScaleSlope(int src_width, int src_height, 101980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com int dst_width, int dst_height, 1025dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com enum FilterMode filtering, 103980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com int* x, int* y, int* dx, int* dy); 104980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com 1051f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride, 106dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 107b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 108b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 109dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride, 110dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 111b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 112b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 113dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 114dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 115b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 116b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 1171f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride, 118dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 119b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 120b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 121dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 122dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 123b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 124b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 1251f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride, 126dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 127b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 128b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 129dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 130dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* d, int dst_width); 131b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 132b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* d, int dst_width); 133dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 134dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* d, int dst_width); 135b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 136b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* d, int dst_width); 137dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr, 138dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 139b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr, 140b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int dst_width, int x, int dx); 141dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr, 142dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int, int); 143b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr, 144b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int dst_width, int, int); 145dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr, 146dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 147b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr, 148b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int dst_width, int x, int dx); 14990a36b29d3ffac9ecaa239191c7106c9993dc093fbarchard@google.comvoid ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr, 15090a36b29d3ffac9ecaa239191c7106c9993dc093fbarchard@google.com int dst_width, int x, int dx); 151b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr, 152b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com int dst_width, int x, int dx); 1531f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride, 154dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 155b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 156b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst, int dst_width); 157dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_C(const uint8* src_ptr, 158dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 159dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 160b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_3_Box_16_C(const uint16* src_ptr, 161b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com ptrdiff_t src_stride, 162b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst_ptr, int dst_width); 163dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride, 164dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 165b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 166b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint16* dst_ptr, int dst_width); 167dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleAddRows_C(const uint8* src_ptr, ptrdiff_t src_stride, 168dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint16* dst_ptr, int src_width, int src_height); 169b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleAddRows_16_C(const uint16* src_ptr, ptrdiff_t src_stride, 170b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com uint32* dst_ptr, int src_width, int src_height); 171dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2_C(const uint8* src_argb, 1721f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 173dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 174dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Linear_C(const uint8* src_argb, 1751f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 176dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 177dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride, 178dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 1791f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride, 180dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 181dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 182dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_C(const uint8* src_argb, 183dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 184dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 185dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 186dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb, 187dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 188909c76e317028a21db491413b2c5d1a05c1fde5bfbarchard@google.comvoid ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb, 189909c76e317028a21db491413b2c5d1a05c1fde5bfbarchard@google.com int dst_width, int x, int dx); 190dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb, 191dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int, int); 192dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb, 193dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 1946dc80ab585de785ea3492ac3f8a66f2252edb9f8fbarchard@google.comvoid ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb, 1956dc80ab585de785ea3492ac3f8a66f2252edb9f8fbarchard@google.com int dst_width, int x, int dx); 196dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 197dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 198dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 199dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Linear_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 200dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 201dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 202dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 203dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr, 204dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 205dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 2061f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2Linear_Unaligned_SSE2(const uint8* src_ptr, 2071f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 208dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 209dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_Unaligned_SSE2(const uint8* src_ptr, 210dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 211dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 212dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 213dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 214dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 215dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 216dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, 217dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 218dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr, 219dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 220dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 221dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr, 222dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 223dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 224dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride, 225dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 226dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr, 227dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 228dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 229dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr, 230dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 231dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 232dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride, 233dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint16* dst_ptr, int src_width, 234dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_height); 235dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleFilterCols_SSSE3(uint8* dst_ptr, const uint8* src_ptr, 236dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 237dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleColsUp2_SSE2(uint8* dst_ptr, const uint8* src_ptr, 2381f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com int dst_width, int x, int dx); 239dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2_SSE2(const uint8* src_argb, 2401f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 241dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 242dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb, 2431f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 244dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 245dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_SSE2(const uint8* src_argb, 246dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 247dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 248dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEven_SSE2(const uint8* src_argb, ptrdiff_t src_stride, 249dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 250dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 251dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb, 252dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 253dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 254dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 255dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBCols_SSE2(uint8* dst_argb, const uint8* src_argb, 256dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 257dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBFilterCols_SSSE3(uint8* dst_argb, const uint8* src_argb, 258dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int dst_width, int x, int dx); 259dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBColsUp2_SSE2(uint8* dst_argb, const uint8* src_argb, 2601f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com int dst_width, int x, int dx); 261dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Row functions. 262dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEven_NEON(const uint8* src_argb, int src_stride, 263dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 264dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 265dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, int src_stride, 266dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com int src_stepx, 267dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_argb, int dst_width); 2681f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 269dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 270dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 271dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 272dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 273dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// ScaleRowDown2Box also used by planar functions 274dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// NEON downscalers with interpolation. 275dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 276dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Note - not static due to reuse in convert for 444 to 420. 2771f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 278dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 279dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 280dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 281dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 282dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 2831f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 284dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 285dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride, 286dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 287dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 288dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Down scale from 4 to 3 pixels. Use the neon multilane read/write 289dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// to load up the every 4th pixel into a 4 different registers. 290dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Point samples 32 pixels to 24 pixels. 291dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_NEON(const uint8* src_ptr, 2921f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 293dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 294dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_NEON(const uint8* src_ptr, 295dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 296dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 297dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_NEON(const uint8* src_ptr, 298dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 299dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 300dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 301dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32 -> 12 302dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_NEON(const uint8* src_ptr, 3031f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com ptrdiff_t src_stride, 304dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 305dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32x3 -> 12x1 306dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_NEON(const uint8* src_ptr, 307dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 308dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 309dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32x2 -> 12x1 310dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_NEON(const uint8* src_ptr, 311dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 312dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 313dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 3141f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 315dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 316dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 317dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 3181f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 319dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 320dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 321dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 3221f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown34_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 323dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 324dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 325dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* d, int dst_width); 326dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 327dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* d, int dst_width); 3281f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown38_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 329dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst, int dst_width); 330dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 331dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 332dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_MIPS_DSPR2(const uint8* src_ptr, 333dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com ptrdiff_t src_stride, 334dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com uint8* dst_ptr, int dst_width); 335dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com 336c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#ifdef __cplusplus 337c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com} // extern "C" 338c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com} // namespace libyuv 339c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#endif 340c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com 3415fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#endif // INCLUDE_LIBYUV_SCALE_ROW_H_ NOLINT 342