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