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