1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2011 Google Inc. All Rights Reserved. 2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license 40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source 50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found 60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may 70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree. 8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// ----------------------------------------------------------------------------- 9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Speed-critical functions. 11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 12a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Author: Skal (pascal.massimino@gmail.com) 13a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifndef WEBP_DSP_DSP_H_ 15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_DSP_DSP_H_ 16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 17af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#ifdef HAVE_CONFIG_H 18af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#include "config.h" 19af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 20af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "webp/types.h" 22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 238b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus 24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern "C" { 25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// CPU detection 29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 30af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__GNUC__) 31af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora# define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__) 32af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora# define LOCAL_GCC_PREREQ(maj, min) \ 33af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora (LOCAL_GCC_VERSION >= (((maj) << 8) | (min))) 34af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#else 35af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora# define LOCAL_GCC_PREREQ(maj, min) 0 36af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 37af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 388b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#if defined(_MSC_VER) && _MSC_VER > 1310 && \ 398b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora (defined(_M_X64) || defined(_M_IX86)) 40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_MSC_SSE2 // Visual C++ SSE2 targets 41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 43af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// WEBP_HAVE_* are used to indicate the presence of the instruction set in dsp 44af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// files without intrinsics, allowing the corresponding Init() to be called. 45af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Files containing intrinsics will need to be built targeting the instruction 46af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// set so should succeed on one of the earlier tests. 47af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__SSE2__) || defined(WEBP_MSC_SSE2) || defined(WEBP_HAVE_SSE2) 48a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_USE_SSE2 49a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 50a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 51af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__AVX2__) || defined(WEBP_HAVE_AVX2) 52af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#define WEBP_USE_AVX2 53af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 54af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 551e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#if defined(__ANDROID__) && defined(__ARM_ARCH_7A__) 561e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#define WEBP_ANDROID_NEON // Android targets that might support NEON 571e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#endif 58a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 59af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__ARM_NEON__) || defined(__aarch64__) 60a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_USE_NEON 61a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 62a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 63af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#if defined(__mips__) && !defined(__mips64) 64af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#define WEBP_USE_MIPS32 65af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora#endif 66af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 67a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef enum { 68a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora kSSE2, 69a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora kSSE3, 70af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora kAVX, 71af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora kAVX2, 72af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora kNEON, 73af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora kMIPS32 74a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} CPUFeature; 75a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// returns true if the CPU supports the feature. 76a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef int (*VP8CPUInfo)(CPUFeature feature); 77a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8CPUInfo VP8GetCPUInfo; 78a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 79a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 80a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Encoding 81a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 82a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Transforms 83a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// VP8Idct: Does one of two inverse transforms. If do_two is set, the transforms 84a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// will be done for (ref, in, dst) and (ref + 4, in + 16, dst + 4). 85a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8Idct)(const uint8_t* ref, const int16_t* in, uint8_t* dst, 86a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int do_two); 87a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8Fdct)(const uint8_t* src, const uint8_t* ref, int16_t* out); 88a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8WHT)(const int16_t* in, int16_t* out); 89a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8Idct VP8ITransform; 90a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8Fdct VP8FTransform; 91a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8WHT VP8FTransformWHT; 92a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Predictions 93a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// *dst is the destination block. *top and *left can be NULL. 94a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8IntraPreds)(uint8_t *dst, const uint8_t* left, 95a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* top); 96a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8Intra4Preds)(uint8_t *dst, const uint8_t* top); 97a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8Intra4Preds VP8EncPredLuma4; 98a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8IntraPreds VP8EncPredLuma16; 99a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8IntraPreds VP8EncPredChroma8; 100a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 101a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef int (*VP8Metric)(const uint8_t* pix, const uint8_t* ref); 102a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8Metric VP8SSE16x16, VP8SSE16x8, VP8SSE8x8, VP8SSE4x4; 103a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef int (*VP8WMetric)(const uint8_t* pix, const uint8_t* ref, 104a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint16_t* const weights); 105a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8WMetric VP8TDisto4x4, VP8TDisto16x16; 106a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 107a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8BlockCopy)(const uint8_t* src, uint8_t* dst); 108a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8BlockCopy VP8Copy4x4; 109a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Quantization 110a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arorastruct VP8Matrix; // forward declaration 111a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef int (*VP8QuantizeBlock)(int16_t in[16], int16_t out[16], 112af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const struct VP8Matrix* const mtx); 113a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8QuantizeBlock VP8EncQuantizeBlock; 114a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 1158b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// specific to 2nd transform: 1168b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroratypedef int (*VP8QuantizeBlockWHT)(int16_t in[16], int16_t out[16], 1178b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const struct VP8Matrix* const mtx); 1188b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraextern VP8QuantizeBlockWHT VP8EncQuantizeBlockWHT; 1198b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1201e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Collect histogram for susceptibility calculation and accumulate in histo[]. 1211e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastruct VP8Histogram; 1221e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroratypedef void (*VP8CHisto)(const uint8_t* ref, const uint8_t* pred, 1231e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora int start_block, int end_block, 1241e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora struct VP8Histogram* const histo); 125a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern const int VP8DspScan[16 + 4 + 4]; 126a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8CHisto VP8CollectHistogram; 127a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 128a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8EncDspInit(void); // must be called before using any of the above 129a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 130a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 131a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Decoding 132a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 133a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8DecIdct)(const int16_t* coeffs, uint8_t* dst); 134a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// when doing two transforms, coeffs is actually int16_t[2][16]. 135a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8DecIdct2)(const int16_t* coeffs, uint8_t* dst, int do_two); 136a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8DecIdct2 VP8Transform; 1378b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraextern VP8DecIdct VP8TransformAC3; 138a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8DecIdct VP8TransformUV; 139a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8DecIdct VP8TransformDC; 140a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8DecIdct VP8TransformDCUV; 1411e7bf8805bd030c19924a5306837ecd72c295751Vikas Aroraextern VP8WHT VP8TransformWHT; 142a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 143a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// *dst is the destination block, with stride BPS. Boundary samples are 144a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// assumed accessible when needed. 145a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8PredFunc)(uint8_t* dst); 146a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern const VP8PredFunc VP8PredLuma16[/* NUM_B_DC_MODES */]; 147a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern const VP8PredFunc VP8PredChroma8[/* NUM_B_DC_MODES */]; 148a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern const VP8PredFunc VP8PredLuma4[/* NUM_BMODES */]; 149a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 150af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// clipping tables (for filtering) 151af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const int8_t* const VP8ksclip1; // clips [-1020, 1020] to [-128, 127] 152af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const int8_t* const VP8ksclip2; // clips [-112, 112] to [-16, 15] 153af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const uint8_t* const VP8kclip1; // clips [-255,511] to [0,255] 154af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern const uint8_t* const VP8kabs0; // abs(x) for x in [-255,255] 155af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid VP8InitClipTables(void); // must be called first 156af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 157a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// simple filter (only for luma) 158a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8SimpleFilterFunc)(uint8_t* p, int stride, int thresh); 159a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8SimpleFilterFunc VP8SimpleVFilter16; 160a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8SimpleFilterFunc VP8SimpleHFilter16; 161a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8SimpleFilterFunc VP8SimpleVFilter16i; // filter 3 inner edges 162a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8SimpleFilterFunc VP8SimpleHFilter16i; 163a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 164a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// regular filter (on both macroblock edges and inner edges) 165a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8LumaFilterFunc)(uint8_t* luma, int stride, 166a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int thresh, int ithresh, int hev_t); 167a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*VP8ChromaFilterFunc)(uint8_t* u, uint8_t* v, int stride, 168a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora int thresh, int ithresh, int hev_t); 169a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// on outer edge 170a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8LumaFilterFunc VP8VFilter16; 171a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8LumaFilterFunc VP8HFilter16; 172a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8ChromaFilterFunc VP8VFilter8; 173a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8ChromaFilterFunc VP8HFilter8; 174a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 175a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// on inner edge 176a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8LumaFilterFunc VP8VFilter16i; // filtering 3 inner edges altogether 177a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8LumaFilterFunc VP8HFilter16i; 178a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8ChromaFilterFunc VP8VFilter8i; // filtering u and v altogether 179a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern VP8ChromaFilterFunc VP8HFilter8i; 180a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 181a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// must be called before anything using the above 182a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8DspInit(void); 183a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 184a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 185a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// WebP I/O 186a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 187a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define FANCY_UPSAMPLING // undefined to remove fancy upsampling support 188a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 1898b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Convert a pair of y/u/v lines together to the output rgb/a colorspace. 1908b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// bottom_y can be NULL if only one line of output is needed (at top/bottom). 191a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*WebPUpsampleLinePairFunc)( 192a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* top_y, const uint8_t* bottom_y, 193a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* top_u, const uint8_t* top_v, 194a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* cur_u, const uint8_t* cur_v, 195a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* top_dst, uint8_t* bottom_dst, int len); 196a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 197a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifdef FANCY_UPSAMPLING 198a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 199a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Fancy upsampling functions to convert YUV to RGB(A) modes 200a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */]; 201a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 202a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif // FANCY_UPSAMPLING 203a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 204af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Per-row point-sampling methods. 205af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroratypedef void (*WebPSamplerRowFunc)(const uint8_t* y, 206af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const uint8_t* u, const uint8_t* v, 207af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora uint8_t* dst, int len); 208af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Generic function to apply 'WebPSamplerRowFunc' to the whole plane: 209af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPSamplerProcessPlane(const uint8_t* y, int y_stride, 210af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const uint8_t* u, const uint8_t* v, int uv_stride, 211af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora uint8_t* dst, int dst_stride, 212af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora int width, int height, WebPSamplerRowFunc func); 213a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 214af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Sampling functions to convert rows of YUV to RGB(A) 215af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern WebPSamplerRowFunc WebPSamplers[/* MODE_LAST */]; 216a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 217a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// General function for converting two lines of ARGB or RGBA. 218a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// 'alpha_is_last' should be true if 0xff000000 is stored in memory as 219a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// as 0x00, 0x00, 0x00, 0xff (little endian). 220a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraWebPUpsampleLinePairFunc WebPGetLinePairConverter(int alpha_is_last); 221a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 222a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// YUV444->RGB converters 223a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef void (*WebPYUV444Converter)(const uint8_t* y, 224a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora const uint8_t* u, const uint8_t* v, 225a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* dst, int len); 226a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 227a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern const WebPYUV444Converter WebPYUV444Converters[/* MODE_LAST */]; 228a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 229af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Must be called before using the WebPUpsamplers[] (and for premultiplied 230af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// colorspaces like rgbA, rgbA4444, etc) 231a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid WebPInitUpsamplers(void); 232af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Must be called before using WebPSamplers[] 233af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPInitSamplers(void); 234a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 235a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------ 236af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Utilities for processing transparent channel. 237a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 238a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Apply alpha pre-multiply on an rgba, bgra or argb plane of size w * h. 239a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// alpha_first should be 0 for argb, 1 for rgba or bgra (where alpha is last). 240a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern void (*WebPApplyAlphaMultiply)( 241a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* rgba, int alpha_first, int w, int h, int stride); 242a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 243a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Same, buf specifically for RGBA4444 format 244a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern void (*WebPApplyAlphaMultiply4444)( 245a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora uint8_t* rgba4444, int w, int h, int stride); 246a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 247af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Pre-Multiply operation transforms x into x * A / 255 (where x=Y,R,G or B). 248af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Un-Multiply operation transforms x into x * 255 / A. 249a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 250af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Pre-Multiply or Un-Multiply (if 'inverse' is true) argb values in a row. 251af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern void (*WebPMultARGBRow)(uint32_t* const ptr, int width, int inverse); 252a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 253af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Same a WebPMultARGBRow(), but for several rows. 254af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows, 255af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora int inverse); 256af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 257af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Same for a row of single values, with side alpha values. 258af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroraextern void (*WebPMultRow)(uint8_t* const ptr, const uint8_t* const alpha, 259af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora int width, int inverse); 260af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 261af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// Same a WebPMultRow(), but for several 'num_rows' rows. 262af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPMultRows(uint8_t* ptr, int stride, 263af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora const uint8_t* alpha, int alpha_stride, 264af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora int width, int num_rows, int inverse); 265af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora 266af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Arora// To be called first before using the above. 267af51b94a435132e9014c324e25fb686b3d07a8c8Vikas Aroravoid WebPInitAlphaProcessing(void); 268a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 2698b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus 270a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} // extern "C" 271a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif 272a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora 273a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif /* WEBP_DSP_DSP_H_ */ 274