xref: /aosp_15_r20/external/webp/src/dsp/lossless.h (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
1*b2055c35SXin Li // Copyright 2012 Google Inc. All Rights Reserved.
2*b2055c35SXin Li //
3*b2055c35SXin Li // Use of this source code is governed by a BSD-style license
4*b2055c35SXin Li // that can be found in the COPYING file in the root of the source
5*b2055c35SXin Li // tree. An additional intellectual property rights grant can be found
6*b2055c35SXin Li // in the file PATENTS. All contributing project authors may
7*b2055c35SXin Li // be found in the AUTHORS file in the root of the source tree.
8*b2055c35SXin Li // -----------------------------------------------------------------------------
9*b2055c35SXin Li //
10*b2055c35SXin Li // Image transforms and color space conversion methods for lossless decoder.
11*b2055c35SXin Li //
12*b2055c35SXin Li // Authors: Vikas Arora ([email protected])
13*b2055c35SXin Li //          Jyrki Alakuijala ([email protected])
14*b2055c35SXin Li 
15*b2055c35SXin Li #ifndef WEBP_DSP_LOSSLESS_H_
16*b2055c35SXin Li #define WEBP_DSP_LOSSLESS_H_
17*b2055c35SXin Li 
18*b2055c35SXin Li #include "src/webp/types.h"
19*b2055c35SXin Li #include "src/webp/decode.h"
20*b2055c35SXin Li 
21*b2055c35SXin Li #include "src/enc/histogram_enc.h"
22*b2055c35SXin Li #include "src/utils/utils.h"
23*b2055c35SXin Li 
24*b2055c35SXin Li #ifdef __cplusplus
25*b2055c35SXin Li extern "C" {
26*b2055c35SXin Li #endif
27*b2055c35SXin Li 
28*b2055c35SXin Li //------------------------------------------------------------------------------
29*b2055c35SXin Li // Decoding
30*b2055c35SXin Li 
31*b2055c35SXin Li typedef uint32_t (*VP8LPredictorFunc)(const uint32_t* const left,
32*b2055c35SXin Li                                       const uint32_t* const top);
33*b2055c35SXin Li extern VP8LPredictorFunc VP8LPredictors[16];
34*b2055c35SXin Li 
35*b2055c35SXin Li uint32_t VP8LPredictor0_C(const uint32_t* const left,
36*b2055c35SXin Li                           const uint32_t* const top);
37*b2055c35SXin Li uint32_t VP8LPredictor1_C(const uint32_t* const left,
38*b2055c35SXin Li                           const uint32_t* const top);
39*b2055c35SXin Li uint32_t VP8LPredictor2_C(const uint32_t* const left,
40*b2055c35SXin Li                           const uint32_t* const top);
41*b2055c35SXin Li uint32_t VP8LPredictor3_C(const uint32_t* const left,
42*b2055c35SXin Li                           const uint32_t* const top);
43*b2055c35SXin Li uint32_t VP8LPredictor4_C(const uint32_t* const left,
44*b2055c35SXin Li                           const uint32_t* const top);
45*b2055c35SXin Li uint32_t VP8LPredictor5_C(const uint32_t* const left,
46*b2055c35SXin Li                           const uint32_t* const top);
47*b2055c35SXin Li uint32_t VP8LPredictor6_C(const uint32_t* const left,
48*b2055c35SXin Li                           const uint32_t* const top);
49*b2055c35SXin Li uint32_t VP8LPredictor7_C(const uint32_t* const left,
50*b2055c35SXin Li                           const uint32_t* const top);
51*b2055c35SXin Li uint32_t VP8LPredictor8_C(const uint32_t* const left,
52*b2055c35SXin Li                           const uint32_t* const top);
53*b2055c35SXin Li uint32_t VP8LPredictor9_C(const uint32_t* const left,
54*b2055c35SXin Li                           const uint32_t* const top);
55*b2055c35SXin Li uint32_t VP8LPredictor10_C(const uint32_t* const left,
56*b2055c35SXin Li                            const uint32_t* const top);
57*b2055c35SXin Li uint32_t VP8LPredictor11_C(const uint32_t* const left,
58*b2055c35SXin Li                            const uint32_t* const top);
59*b2055c35SXin Li uint32_t VP8LPredictor12_C(const uint32_t* const left,
60*b2055c35SXin Li                            const uint32_t* const top);
61*b2055c35SXin Li uint32_t VP8LPredictor13_C(const uint32_t* const left,
62*b2055c35SXin Li                            const uint32_t* const top);
63*b2055c35SXin Li 
64*b2055c35SXin Li // These Add/Sub function expects upper[-1] and out[-1] to be readable.
65*b2055c35SXin Li typedef void (*VP8LPredictorAddSubFunc)(const uint32_t* in,
66*b2055c35SXin Li                                         const uint32_t* upper, int num_pixels,
67*b2055c35SXin Li                                         uint32_t* out);
68*b2055c35SXin Li extern VP8LPredictorAddSubFunc VP8LPredictorsAdd[16];
69*b2055c35SXin Li extern VP8LPredictorAddSubFunc VP8LPredictorsAdd_C[16];
70*b2055c35SXin Li 
71*b2055c35SXin Li typedef void (*VP8LProcessDecBlueAndRedFunc)(const uint32_t* src,
72*b2055c35SXin Li                                              int num_pixels, uint32_t* dst);
73*b2055c35SXin Li extern VP8LProcessDecBlueAndRedFunc VP8LAddGreenToBlueAndRed;
74*b2055c35SXin Li 
75*b2055c35SXin Li typedef struct {
76*b2055c35SXin Li   // Note: the members are uint8_t, so that any negative values are
77*b2055c35SXin Li   // automatically converted to "mod 256" values.
78*b2055c35SXin Li   uint8_t green_to_red_;
79*b2055c35SXin Li   uint8_t green_to_blue_;
80*b2055c35SXin Li   uint8_t red_to_blue_;
81*b2055c35SXin Li } VP8LMultipliers;
82*b2055c35SXin Li typedef void (*VP8LTransformColorInverseFunc)(const VP8LMultipliers* const m,
83*b2055c35SXin Li                                               const uint32_t* src,
84*b2055c35SXin Li                                               int num_pixels, uint32_t* dst);
85*b2055c35SXin Li extern VP8LTransformColorInverseFunc VP8LTransformColorInverse;
86*b2055c35SXin Li 
87*b2055c35SXin Li struct VP8LTransform;  // Defined in dec/vp8li.h.
88*b2055c35SXin Li 
89*b2055c35SXin Li // Performs inverse transform of data given transform information, start and end
90*b2055c35SXin Li // rows. Transform will be applied to rows [row_start, row_end[.
91*b2055c35SXin Li // The *in and *out pointers refer to source and destination data respectively
92*b2055c35SXin Li // corresponding to the intermediate row (row_start).
93*b2055c35SXin Li void VP8LInverseTransform(const struct VP8LTransform* const transform,
94*b2055c35SXin Li                           int row_start, int row_end,
95*b2055c35SXin Li                           const uint32_t* const in, uint32_t* const out);
96*b2055c35SXin Li 
97*b2055c35SXin Li // Color space conversion.
98*b2055c35SXin Li typedef void (*VP8LConvertFunc)(const uint32_t* src, int num_pixels,
99*b2055c35SXin Li                                 uint8_t* dst);
100*b2055c35SXin Li extern VP8LConvertFunc VP8LConvertBGRAToRGB;
101*b2055c35SXin Li extern VP8LConvertFunc VP8LConvertBGRAToRGBA;
102*b2055c35SXin Li extern VP8LConvertFunc VP8LConvertBGRAToRGBA4444;
103*b2055c35SXin Li extern VP8LConvertFunc VP8LConvertBGRAToRGB565;
104*b2055c35SXin Li extern VP8LConvertFunc VP8LConvertBGRAToBGR;
105*b2055c35SXin Li 
106*b2055c35SXin Li // Converts from BGRA to other color spaces.
107*b2055c35SXin Li void VP8LConvertFromBGRA(const uint32_t* const in_data, int num_pixels,
108*b2055c35SXin Li                          WEBP_CSP_MODE out_colorspace, uint8_t* const rgba);
109*b2055c35SXin Li 
110*b2055c35SXin Li typedef void (*VP8LMapARGBFunc)(const uint32_t* src,
111*b2055c35SXin Li                                 const uint32_t* const color_map,
112*b2055c35SXin Li                                 uint32_t* dst, int y_start,
113*b2055c35SXin Li                                 int y_end, int width);
114*b2055c35SXin Li typedef void (*VP8LMapAlphaFunc)(const uint8_t* src,
115*b2055c35SXin Li                                  const uint32_t* const color_map,
116*b2055c35SXin Li                                  uint8_t* dst, int y_start,
117*b2055c35SXin Li                                  int y_end, int width);
118*b2055c35SXin Li 
119*b2055c35SXin Li extern VP8LMapARGBFunc VP8LMapColor32b;
120*b2055c35SXin Li extern VP8LMapAlphaFunc VP8LMapColor8b;
121*b2055c35SXin Li 
122*b2055c35SXin Li // Similar to the static method ColorIndexInverseTransform() that is part of
123*b2055c35SXin Li // lossless.c, but used only for alpha decoding. It takes uint8_t (rather than
124*b2055c35SXin Li // uint32_t) arguments for 'src' and 'dst'.
125*b2055c35SXin Li void VP8LColorIndexInverseTransformAlpha(
126*b2055c35SXin Li     const struct VP8LTransform* const transform, int y_start, int y_end,
127*b2055c35SXin Li     const uint8_t* src, uint8_t* dst);
128*b2055c35SXin Li 
129*b2055c35SXin Li // Expose some C-only fallback functions
130*b2055c35SXin Li void VP8LTransformColorInverse_C(const VP8LMultipliers* const m,
131*b2055c35SXin Li                                  const uint32_t* src, int num_pixels,
132*b2055c35SXin Li                                  uint32_t* dst);
133*b2055c35SXin Li 
134*b2055c35SXin Li void VP8LConvertBGRAToRGB_C(const uint32_t* src, int num_pixels, uint8_t* dst);
135*b2055c35SXin Li void VP8LConvertBGRAToRGBA_C(const uint32_t* src, int num_pixels, uint8_t* dst);
136*b2055c35SXin Li void VP8LConvertBGRAToRGBA4444_C(const uint32_t* src,
137*b2055c35SXin Li                                  int num_pixels, uint8_t* dst);
138*b2055c35SXin Li void VP8LConvertBGRAToRGB565_C(const uint32_t* src,
139*b2055c35SXin Li                                int num_pixels, uint8_t* dst);
140*b2055c35SXin Li void VP8LConvertBGRAToBGR_C(const uint32_t* src, int num_pixels, uint8_t* dst);
141*b2055c35SXin Li void VP8LAddGreenToBlueAndRed_C(const uint32_t* src, int num_pixels,
142*b2055c35SXin Li                                 uint32_t* dst);
143*b2055c35SXin Li 
144*b2055c35SXin Li // Must be called before calling any of the above methods.
145*b2055c35SXin Li void VP8LDspInit(void);
146*b2055c35SXin Li 
147*b2055c35SXin Li //------------------------------------------------------------------------------
148*b2055c35SXin Li // Encoding
149*b2055c35SXin Li 
150*b2055c35SXin Li typedef void (*VP8LProcessEncBlueAndRedFunc)(uint32_t* dst, int num_pixels);
151*b2055c35SXin Li extern VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed;
152*b2055c35SXin Li typedef void (*VP8LTransformColorFunc)(const VP8LMultipliers* const m,
153*b2055c35SXin Li                                        uint32_t* dst, int num_pixels);
154*b2055c35SXin Li extern VP8LTransformColorFunc VP8LTransformColor;
155*b2055c35SXin Li typedef void (*VP8LCollectColorBlueTransformsFunc)(
156*b2055c35SXin Li     const uint32_t* argb, int stride,
157*b2055c35SXin Li     int tile_width, int tile_height,
158*b2055c35SXin Li     int green_to_blue, int red_to_blue, int histo[]);
159*b2055c35SXin Li extern VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms;
160*b2055c35SXin Li 
161*b2055c35SXin Li typedef void (*VP8LCollectColorRedTransformsFunc)(
162*b2055c35SXin Li     const uint32_t* argb, int stride,
163*b2055c35SXin Li     int tile_width, int tile_height,
164*b2055c35SXin Li     int green_to_red, int histo[]);
165*b2055c35SXin Li extern VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms;
166*b2055c35SXin Li 
167*b2055c35SXin Li // Expose some C-only fallback functions
168*b2055c35SXin Li void VP8LTransformColor_C(const VP8LMultipliers* const m,
169*b2055c35SXin Li                           uint32_t* data, int num_pixels);
170*b2055c35SXin Li void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels);
171*b2055c35SXin Li void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride,
172*b2055c35SXin Li                                      int tile_width, int tile_height,
173*b2055c35SXin Li                                      int green_to_red, int histo[]);
174*b2055c35SXin Li void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride,
175*b2055c35SXin Li                                       int tile_width, int tile_height,
176*b2055c35SXin Li                                       int green_to_blue, int red_to_blue,
177*b2055c35SXin Li                                       int histo[]);
178*b2055c35SXin Li 
179*b2055c35SXin Li extern VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
180*b2055c35SXin Li extern VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
181*b2055c35SXin Li 
182*b2055c35SXin Li // -----------------------------------------------------------------------------
183*b2055c35SXin Li // Huffman-cost related functions.
184*b2055c35SXin Li 
185*b2055c35SXin Li typedef uint32_t (*VP8LCostFunc)(const uint32_t* population, int length);
186*b2055c35SXin Li typedef uint32_t (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
187*b2055c35SXin Li                                          int length);
188*b2055c35SXin Li typedef float (*VP8LCombinedShannonEntropyFunc)(const int X[256],
189*b2055c35SXin Li                                                 const int Y[256]);
190*b2055c35SXin Li 
191*b2055c35SXin Li extern VP8LCostFunc VP8LExtraCost;
192*b2055c35SXin Li extern VP8LCostCombinedFunc VP8LExtraCostCombined;
193*b2055c35SXin Li extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
194*b2055c35SXin Li 
195*b2055c35SXin Li typedef struct {        // small struct to hold counters
196*b2055c35SXin Li   int counts[2];        // index: 0=zero streak, 1=non-zero streak
197*b2055c35SXin Li   int streaks[2][2];    // [zero/non-zero][streak<3 / streak>=3]
198*b2055c35SXin Li } VP8LStreaks;
199*b2055c35SXin Li 
200*b2055c35SXin Li typedef struct {            // small struct to hold bit entropy results
201*b2055c35SXin Li   float entropy;            // entropy
202*b2055c35SXin Li   uint32_t sum;             // sum of the population
203*b2055c35SXin Li   int nonzeros;             // number of non-zero elements in the population
204*b2055c35SXin Li   uint32_t max_val;         // maximum value in the population
205*b2055c35SXin Li   uint32_t nonzero_code;    // index of the last non-zero in the population
206*b2055c35SXin Li } VP8LBitEntropy;
207*b2055c35SXin Li 
208*b2055c35SXin Li void VP8LBitEntropyInit(VP8LBitEntropy* const entropy);
209*b2055c35SXin Li 
210*b2055c35SXin Li // Get the combined symbol bit entropy and Huffman cost stats for the
211*b2055c35SXin Li // distributions 'X' and 'Y'. Those results can then be refined according to
212*b2055c35SXin Li // codec specific heuristics.
213*b2055c35SXin Li typedef void (*VP8LGetCombinedEntropyUnrefinedFunc)(
214*b2055c35SXin Li     const uint32_t X[], const uint32_t Y[], int length,
215*b2055c35SXin Li     VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats);
216*b2055c35SXin Li extern VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
217*b2055c35SXin Li 
218*b2055c35SXin Li // Get the entropy for the distribution 'X'.
219*b2055c35SXin Li typedef void (*VP8LGetEntropyUnrefinedFunc)(const uint32_t X[], int length,
220*b2055c35SXin Li                                             VP8LBitEntropy* const bit_entropy,
221*b2055c35SXin Li                                             VP8LStreaks* const stats);
222*b2055c35SXin Li extern VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
223*b2055c35SXin Li 
224*b2055c35SXin Li void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
225*b2055c35SXin Li                               VP8LBitEntropy* const entropy);
226*b2055c35SXin Li 
227*b2055c35SXin Li typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b,
228*b2055c35SXin Li                                   uint32_t* out, int size);
229*b2055c35SXin Li extern VP8LAddVectorFunc VP8LAddVector;
230*b2055c35SXin Li typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size);
231*b2055c35SXin Li extern VP8LAddVectorEqFunc VP8LAddVectorEq;
232*b2055c35SXin Li void VP8LHistogramAdd(const VP8LHistogram* const a,
233*b2055c35SXin Li                       const VP8LHistogram* const b,
234*b2055c35SXin Li                       VP8LHistogram* const out);
235*b2055c35SXin Li 
236*b2055c35SXin Li // -----------------------------------------------------------------------------
237*b2055c35SXin Li // PrefixEncode()
238*b2055c35SXin Li 
239*b2055c35SXin Li typedef int (*VP8LVectorMismatchFunc)(const uint32_t* const array1,
240*b2055c35SXin Li                                       const uint32_t* const array2, int length);
241*b2055c35SXin Li // Returns the first index where array1 and array2 are different.
242*b2055c35SXin Li extern VP8LVectorMismatchFunc VP8LVectorMismatch;
243*b2055c35SXin Li 
244*b2055c35SXin Li typedef void (*VP8LBundleColorMapFunc)(const uint8_t* const row, int width,
245*b2055c35SXin Li                                        int xbits, uint32_t* dst);
246*b2055c35SXin Li extern VP8LBundleColorMapFunc VP8LBundleColorMap;
247*b2055c35SXin Li void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
248*b2055c35SXin Li                           uint32_t* dst);
249*b2055c35SXin Li 
250*b2055c35SXin Li // Must be called before calling any of the above methods.
251*b2055c35SXin Li void VP8LEncDspInit(void);
252*b2055c35SXin Li 
253*b2055c35SXin Li //------------------------------------------------------------------------------
254*b2055c35SXin Li 
255*b2055c35SXin Li #ifdef __cplusplus
256*b2055c35SXin Li }    // extern "C"
257*b2055c35SXin Li #endif
258*b2055c35SXin Li 
259*b2055c35SXin Li #endif  // WEBP_DSP_LOSSLESS_H_
260