Home | History | Annotate | Download | only in dsp
      1 // Copyright 2015 Google Inc. All Rights Reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style license
      4 // that can be found in the COPYING file in the root of the source
      5 // tree. An additional intellectual property rights grant can be found
      6 // in the file PATENTS. All contributing project authors may
      7 // be found in the AUTHORS file in the root of the source tree.
      8 // -----------------------------------------------------------------------------
      9 //
     10 // Image transform methods for lossless encoder.
     11 //
     12 // Authors: Vikas Arora (vikaas.arora (at) gmail.com)
     13 //          Jyrki Alakuijala (jyrki (at) google.com)
     14 //          Urvang Joshi (urvang (at) google.com)
     15 
     16 #include "src/dsp/dsp.h"
     17 
     18 #include <assert.h>
     19 #include <math.h>
     20 #include <stdlib.h>
     21 #include "src/dec/vp8li_dec.h"
     22 #include "src/utils/endian_inl_utils.h"
     23 #include "src/dsp/lossless.h"
     24 #include "src/dsp/lossless_common.h"
     25 #include "src/dsp/yuv.h"
     26 
     27 // lookup table for small values of log2(int)
     28 const float kLog2Table[LOG_LOOKUP_IDX_MAX] = {
     29   0.0000000000000000f, 0.0000000000000000f,
     30   1.0000000000000000f, 1.5849625007211560f,
     31   2.0000000000000000f, 2.3219280948873621f,
     32   2.5849625007211560f, 2.8073549220576041f,
     33   3.0000000000000000f, 3.1699250014423121f,
     34   3.3219280948873621f, 3.4594316186372973f,
     35   3.5849625007211560f, 3.7004397181410921f,
     36   3.8073549220576041f, 3.9068905956085187f,
     37   4.0000000000000000f, 4.0874628412503390f,
     38   4.1699250014423121f, 4.2479275134435852f,
     39   4.3219280948873626f, 4.3923174227787606f,
     40   4.4594316186372973f, 4.5235619560570130f,
     41   4.5849625007211560f, 4.6438561897747243f,
     42   4.7004397181410917f, 4.7548875021634682f,
     43   4.8073549220576037f, 4.8579809951275718f,
     44   4.9068905956085187f, 4.9541963103868749f,
     45   5.0000000000000000f, 5.0443941193584533f,
     46   5.0874628412503390f, 5.1292830169449663f,
     47   5.1699250014423121f, 5.2094533656289501f,
     48   5.2479275134435852f, 5.2854022188622487f,
     49   5.3219280948873626f, 5.3575520046180837f,
     50   5.3923174227787606f, 5.4262647547020979f,
     51   5.4594316186372973f, 5.4918530963296747f,
     52   5.5235619560570130f, 5.5545888516776376f,
     53   5.5849625007211560f, 5.6147098441152083f,
     54   5.6438561897747243f, 5.6724253419714951f,
     55   5.7004397181410917f, 5.7279204545631987f,
     56   5.7548875021634682f, 5.7813597135246599f,
     57   5.8073549220576037f, 5.8328900141647412f,
     58   5.8579809951275718f, 5.8826430493618415f,
     59   5.9068905956085187f, 5.9307373375628866f,
     60   5.9541963103868749f, 5.9772799234999167f,
     61   6.0000000000000000f, 6.0223678130284543f,
     62   6.0443941193584533f, 6.0660891904577720f,
     63   6.0874628412503390f, 6.1085244567781691f,
     64   6.1292830169449663f, 6.1497471195046822f,
     65   6.1699250014423121f, 6.1898245588800175f,
     66   6.2094533656289501f, 6.2288186904958804f,
     67   6.2479275134435852f, 6.2667865406949010f,
     68   6.2854022188622487f, 6.3037807481771030f,
     69   6.3219280948873626f, 6.3398500028846243f,
     70   6.3575520046180837f, 6.3750394313469245f,
     71   6.3923174227787606f, 6.4093909361377017f,
     72   6.4262647547020979f, 6.4429434958487279f,
     73   6.4594316186372973f, 6.4757334309663976f,
     74   6.4918530963296747f, 6.5077946401986963f,
     75   6.5235619560570130f, 6.5391588111080309f,
     76   6.5545888516776376f, 6.5698556083309478f,
     77   6.5849625007211560f, 6.5999128421871278f,
     78   6.6147098441152083f, 6.6293566200796094f,
     79   6.6438561897747243f, 6.6582114827517946f,
     80   6.6724253419714951f, 6.6865005271832185f,
     81   6.7004397181410917f, 6.7142455176661224f,
     82   6.7279204545631987f, 6.7414669864011464f,
     83   6.7548875021634682f, 6.7681843247769259f,
     84   6.7813597135246599f, 6.7944158663501061f,
     85   6.8073549220576037f, 6.8201789624151878f,
     86   6.8328900141647412f, 6.8454900509443747f,
     87   6.8579809951275718f, 6.8703647195834047f,
     88   6.8826430493618415f, 6.8948177633079437f,
     89   6.9068905956085187f, 6.9188632372745946f,
     90   6.9307373375628866f, 6.9425145053392398f,
     91   6.9541963103868749f, 6.9657842846620869f,
     92   6.9772799234999167f, 6.9886846867721654f,
     93   7.0000000000000000f, 7.0112272554232539f,
     94   7.0223678130284543f, 7.0334230015374501f,
     95   7.0443941193584533f, 7.0552824355011898f,
     96   7.0660891904577720f, 7.0768155970508308f,
     97   7.0874628412503390f, 7.0980320829605263f,
     98   7.1085244567781691f, 7.1189410727235076f,
     99   7.1292830169449663f, 7.1395513523987936f,
    100   7.1497471195046822f, 7.1598713367783890f,
    101   7.1699250014423121f, 7.1799090900149344f,
    102   7.1898245588800175f, 7.1996723448363644f,
    103   7.2094533656289501f, 7.2191685204621611f,
    104   7.2288186904958804f, 7.2384047393250785f,
    105   7.2479275134435852f, 7.2573878426926521f,
    106   7.2667865406949010f, 7.2761244052742375f,
    107   7.2854022188622487f, 7.2946207488916270f,
    108   7.3037807481771030f, 7.3128829552843557f,
    109   7.3219280948873626f, 7.3309168781146167f,
    110   7.3398500028846243f, 7.3487281542310771f,
    111   7.3575520046180837f, 7.3663222142458160f,
    112   7.3750394313469245f, 7.3837042924740519f,
    113   7.3923174227787606f, 7.4008794362821843f,
    114   7.4093909361377017f, 7.4178525148858982f,
    115   7.4262647547020979f, 7.4346282276367245f,
    116   7.4429434958487279f, 7.4512111118323289f,
    117   7.4594316186372973f, 7.4676055500829976f,
    118   7.4757334309663976f, 7.4838157772642563f,
    119   7.4918530963296747f, 7.4998458870832056f,
    120   7.5077946401986963f, 7.5156998382840427f,
    121   7.5235619560570130f, 7.5313814605163118f,
    122   7.5391588111080309f, 7.5468944598876364f,
    123   7.5545888516776376f, 7.5622424242210728f,
    124   7.5698556083309478f, 7.5774288280357486f,
    125   7.5849625007211560f, 7.5924570372680806f,
    126   7.5999128421871278f, 7.6073303137496104f,
    127   7.6147098441152083f, 7.6220518194563764f,
    128   7.6293566200796094f, 7.6366246205436487f,
    129   7.6438561897747243f, 7.6510516911789281f,
    130   7.6582114827517946f, 7.6653359171851764f,
    131   7.6724253419714951f, 7.6794800995054464f,
    132   7.6865005271832185f, 7.6934869574993252f,
    133   7.7004397181410917f, 7.7073591320808825f,
    134   7.7142455176661224f, 7.7210991887071855f,
    135   7.7279204545631987f, 7.7347096202258383f,
    136   7.7414669864011464f, 7.7481928495894605f,
    137   7.7548875021634682f, 7.7615512324444795f,
    138   7.7681843247769259f, 7.7747870596011736f,
    139   7.7813597135246599f, 7.7879025593914317f,
    140   7.7944158663501061f, 7.8008998999203047f,
    141   7.8073549220576037f, 7.8137811912170374f,
    142   7.8201789624151878f, 7.8265484872909150f,
    143   7.8328900141647412f, 7.8392037880969436f,
    144   7.8454900509443747f, 7.8517490414160571f,
    145   7.8579809951275718f, 7.8641861446542797f,
    146   7.8703647195834047f, 7.8765169465649993f,
    147   7.8826430493618415f, 7.8887432488982591f,
    148   7.8948177633079437f, 7.9008668079807486f,
    149   7.9068905956085187f, 7.9128893362299619f,
    150   7.9188632372745946f, 7.9248125036057812f,
    151   7.9307373375628866f, 7.9366379390025709f,
    152   7.9425145053392398f, 7.9483672315846778f,
    153   7.9541963103868749f, 7.9600019320680805f,
    154   7.9657842846620869f, 7.9715435539507719f,
    155   7.9772799234999167f, 7.9829935746943103f,
    156   7.9886846867721654f, 7.9943534368588577f
    157 };
    158 
    159 const float kSLog2Table[LOG_LOOKUP_IDX_MAX] = {
    160   0.00000000f,    0.00000000f,  2.00000000f,   4.75488750f,
    161   8.00000000f,   11.60964047f,  15.50977500f,  19.65148445f,
    162   24.00000000f,  28.52932501f,  33.21928095f,  38.05374781f,
    163   43.01955001f,  48.10571634f,  53.30296891f,  58.60335893f,
    164   64.00000000f,  69.48686830f,  75.05865003f,  80.71062276f,
    165   86.43856190f,  92.23866588f,  98.10749561f,  104.04192499f,
    166   110.03910002f, 116.09640474f, 122.21143267f, 128.38196256f,
    167   134.60593782f, 140.88144886f, 147.20671787f, 153.58008562f,
    168   160.00000000f, 166.46500594f, 172.97373660f, 179.52490559f,
    169   186.11730005f, 192.74977453f, 199.42124551f, 206.13068654f,
    170   212.87712380f, 219.65963219f, 226.47733176f, 233.32938445f,
    171   240.21499122f, 247.13338933f, 254.08384998f, 261.06567603f,
    172   268.07820003f, 275.12078236f, 282.19280949f, 289.29369244f,
    173   296.42286534f, 303.57978409f, 310.76392512f, 317.97478424f,
    174   325.21187564f, 332.47473081f, 339.76289772f, 347.07593991f,
    175   354.41343574f, 361.77497759f, 369.16017124f, 376.56863518f,
    176   384.00000000f, 391.45390785f, 398.93001188f, 406.42797576f,
    177   413.94747321f, 421.48818752f, 429.04981119f, 436.63204548f,
    178   444.23460010f, 451.85719280f, 459.49954906f, 467.16140179f,
    179   474.84249102f, 482.54256363f, 490.26137307f, 497.99867911f,
    180   505.75424759f, 513.52785023f, 521.31926438f, 529.12827280f,
    181   536.95466351f, 544.79822957f, 552.65876890f, 560.53608414f,
    182   568.42998244f, 576.34027536f, 584.26677867f, 592.20931226f,
    183   600.16769996f, 608.14176943f, 616.13135206f, 624.13628279f,
    184   632.15640007f, 640.19154569f, 648.24156472f, 656.30630539f,
    185   664.38561898f, 672.47935976f, 680.58738488f, 688.70955430f,
    186   696.84573069f, 704.99577935f, 713.15956818f, 721.33696754f,
    187   729.52785023f, 737.73209140f, 745.94956849f, 754.18016116f,
    188   762.42375127f, 770.68022275f, 778.94946161f, 787.23135586f,
    189   795.52579543f, 803.83267219f, 812.15187982f, 820.48331383f,
    190   828.82687147f, 837.18245171f, 845.54995518f, 853.92928416f,
    191   862.32034249f, 870.72303558f, 879.13727036f, 887.56295522f,
    192   896.00000000f, 904.44831595f, 912.90781569f, 921.37841320f,
    193   929.86002376f, 938.35256392f, 946.85595152f, 955.37010560f,
    194   963.89494641f, 972.43039537f, 980.97637504f, 989.53280911f,
    195   998.09962237f, 1006.67674069f, 1015.26409097f, 1023.86160116f,
    196   1032.46920021f, 1041.08681805f, 1049.71438560f, 1058.35183469f,
    197   1066.99909811f, 1075.65610955f, 1084.32280357f, 1092.99911564f,
    198   1101.68498204f, 1110.38033993f, 1119.08512727f, 1127.79928282f,
    199   1136.52274614f, 1145.25545758f, 1153.99735821f, 1162.74838989f,
    200   1171.50849518f, 1180.27761738f, 1189.05570047f, 1197.84268914f,
    201   1206.63852876f, 1215.44316535f, 1224.25654560f, 1233.07861684f,
    202   1241.90932703f, 1250.74862473f, 1259.59645914f, 1268.45278005f,
    203   1277.31753781f, 1286.19068338f, 1295.07216828f, 1303.96194457f,
    204   1312.85996488f, 1321.76618236f, 1330.68055071f, 1339.60302413f,
    205   1348.53355734f, 1357.47210556f, 1366.41862452f, 1375.37307041f,
    206   1384.33539991f, 1393.30557020f, 1402.28353887f, 1411.26926400f,
    207   1420.26270412f, 1429.26381818f, 1438.27256558f, 1447.28890615f,
    208   1456.31280014f, 1465.34420819f, 1474.38309138f, 1483.42941118f,
    209   1492.48312945f, 1501.54420843f, 1510.61261078f, 1519.68829949f,
    210   1528.77123795f, 1537.86138993f, 1546.95871952f, 1556.06319119f,
    211   1565.17476976f, 1574.29342040f, 1583.41910860f, 1592.55180020f,
    212   1601.69146137f, 1610.83805860f, 1619.99155871f, 1629.15192882f,
    213   1638.31913637f, 1647.49314911f, 1656.67393509f, 1665.86146266f,
    214   1675.05570047f, 1684.25661744f, 1693.46418280f, 1702.67836605f,
    215   1711.89913698f, 1721.12646563f, 1730.36032233f, 1739.60067768f,
    216   1748.84750254f, 1758.10076802f, 1767.36044551f, 1776.62650662f,
    217   1785.89892323f, 1795.17766747f, 1804.46271172f, 1813.75402857f,
    218   1823.05159087f, 1832.35537170f, 1841.66534438f, 1850.98148244f,
    219   1860.30375965f, 1869.63214999f, 1878.96662767f, 1888.30716711f,
    220   1897.65374295f, 1907.00633003f, 1916.36490342f, 1925.72943838f,
    221   1935.09991037f, 1944.47629506f, 1953.85856831f, 1963.24670620f,
    222   1972.64068498f, 1982.04048108f, 1991.44607117f, 2000.85743204f,
    223   2010.27454072f, 2019.69737440f, 2029.12591044f, 2038.56012640f
    224 };
    225 
    226 const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX] = {
    227   { 0, 0}, { 0, 0}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 1}, { 4, 1}, { 5, 1},
    228   { 5, 1}, { 6, 2}, { 6, 2}, { 6, 2}, { 6, 2}, { 7, 2}, { 7, 2}, { 7, 2},
    229   { 7, 2}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3},
    230   { 8, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3},
    231   { 9, 3}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
    232   {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
    233   {10, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
    234   {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
    235   {11, 4}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    236   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    237   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    238   {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    239   {12, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    240   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    241   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    242   {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    243   {13, 5}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    244   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    245   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    246   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    247   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    248   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    249   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    250   {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    251   {14, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    252   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    253   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    254   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    255   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    256   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    257   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    258   {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    259   {15, 6}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    260   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    261   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    262   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    263   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    264   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    265   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    266   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    267   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    268   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    269   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    270   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    271   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    272   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    273   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    274   {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    275   {16, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    276   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    277   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    278   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    279   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    280   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    281   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    282   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    283   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    284   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    285   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    286   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    287   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    288   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    289   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    290   {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    291 };
    292 
    293 const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = {
    294    0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,
    295    0,  1,  2,  3,  4,  5,  6,  7,  0,  1,  2,  3,  4,  5,  6,  7,
    296    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    297    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    298    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    299   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    300    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    301   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    302    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    303   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    304   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    305   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    306    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    307   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    308   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    309   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    310    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    311   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    312   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    313   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    314   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    315   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    316   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    317   112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
    318   127,
    319    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    320   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    321   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    322   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    323   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    324   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    325   96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    326   112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
    327 };
    328 
    329 static float FastSLog2Slow_C(uint32_t v) {
    330   assert(v >= LOG_LOOKUP_IDX_MAX);
    331   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
    332     int log_cnt = 0;
    333     uint32_t y = 1;
    334     int correction = 0;
    335     const float v_f = (float)v;
    336     const uint32_t orig_v = v;
    337     do {
    338       ++log_cnt;
    339       v = v >> 1;
    340       y = y << 1;
    341     } while (v >= LOG_LOOKUP_IDX_MAX);
    342     // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
    343     // Xf = floor(Xf) * (1 + (v % y) / v)
    344     // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
    345     // The correction factor: log(1 + d) ~ d; for very small d values, so
    346     // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v
    347     // LOG_2_RECIPROCAL ~ 23/16
    348     correction = (23 * (orig_v & (y - 1))) >> 4;
    349     return v_f * (kLog2Table[v] + log_cnt) + correction;
    350   } else {
    351     return (float)(LOG_2_RECIPROCAL * v * log((double)v));
    352   }
    353 }
    354 
    355 static float FastLog2Slow_C(uint32_t v) {
    356   assert(v >= LOG_LOOKUP_IDX_MAX);
    357   if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
    358     int log_cnt = 0;
    359     uint32_t y = 1;
    360     const uint32_t orig_v = v;
    361     double log_2;
    362     do {
    363       ++log_cnt;
    364       v = v >> 1;
    365       y = y << 1;
    366     } while (v >= LOG_LOOKUP_IDX_MAX);
    367     log_2 = kLog2Table[v] + log_cnt;
    368     if (orig_v >= APPROX_LOG_MAX) {
    369       // Since the division is still expensive, add this correction factor only
    370       // for large values of 'v'.
    371       const int correction = (23 * (orig_v & (y - 1))) >> 4;
    372       log_2 += (double)correction / orig_v;
    373     }
    374     return (float)log_2;
    375   } else {
    376     return (float)(LOG_2_RECIPROCAL * log((double)v));
    377   }
    378 }
    379 
    380 //------------------------------------------------------------------------------
    381 // Methods to calculate Entropy (Shannon).
    382 
    383 // Compute the combined Shanon's entropy for distribution {X} and {X+Y}
    384 static float CombinedShannonEntropy_C(const int X[256], const int Y[256]) {
    385   int i;
    386   double retval = 0.;
    387   int sumX = 0, sumXY = 0;
    388   for (i = 0; i < 256; ++i) {
    389     const int x = X[i];
    390     if (x != 0) {
    391       const int xy = x + Y[i];
    392       sumX += x;
    393       retval -= VP8LFastSLog2(x);
    394       sumXY += xy;
    395       retval -= VP8LFastSLog2(xy);
    396     } else if (Y[i] != 0) {
    397       sumXY += Y[i];
    398       retval -= VP8LFastSLog2(Y[i]);
    399     }
    400   }
    401   retval += VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY);
    402   return (float)retval;
    403 }
    404 
    405 void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
    406   entropy->entropy = 0.;
    407   entropy->sum = 0;
    408   entropy->nonzeros = 0;
    409   entropy->max_val = 0;
    410   entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM;
    411 }
    412 
    413 void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
    414                               VP8LBitEntropy* const entropy) {
    415   int i;
    416 
    417   VP8LBitEntropyInit(entropy);
    418 
    419   for (i = 0; i < n; ++i) {
    420     if (array[i] != 0) {
    421       entropy->sum += array[i];
    422       entropy->nonzero_code = i;
    423       ++entropy->nonzeros;
    424       entropy->entropy -= VP8LFastSLog2(array[i]);
    425       if (entropy->max_val < array[i]) {
    426         entropy->max_val = array[i];
    427       }
    428     }
    429   }
    430   entropy->entropy += VP8LFastSLog2(entropy->sum);
    431 }
    432 
    433 static WEBP_INLINE void GetEntropyUnrefinedHelper(
    434     uint32_t val, int i, uint32_t* const val_prev, int* const i_prev,
    435     VP8LBitEntropy* const bit_entropy, VP8LStreaks* const stats) {
    436   const int streak = i - *i_prev;
    437 
    438   // Gather info for the bit entropy.
    439   if (*val_prev != 0) {
    440     bit_entropy->sum += (*val_prev) * streak;
    441     bit_entropy->nonzeros += streak;
    442     bit_entropy->nonzero_code = *i_prev;
    443     bit_entropy->entropy -= VP8LFastSLog2(*val_prev) * streak;
    444     if (bit_entropy->max_val < *val_prev) {
    445       bit_entropy->max_val = *val_prev;
    446     }
    447   }
    448 
    449   // Gather info for the Huffman cost.
    450   stats->counts[*val_prev != 0] += (streak > 3);
    451   stats->streaks[*val_prev != 0][(streak > 3)] += streak;
    452 
    453   *val_prev = val;
    454   *i_prev = i;
    455 }
    456 
    457 static void GetEntropyUnrefined_C(const uint32_t X[], int length,
    458                                   VP8LBitEntropy* const bit_entropy,
    459                                   VP8LStreaks* const stats) {
    460   int i;
    461   int i_prev = 0;
    462   uint32_t x_prev = X[0];
    463 
    464   memset(stats, 0, sizeof(*stats));
    465   VP8LBitEntropyInit(bit_entropy);
    466 
    467   for (i = 1; i < length; ++i) {
    468     const uint32_t x = X[i];
    469     if (x != x_prev) {
    470       GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats);
    471     }
    472   }
    473   GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats);
    474 
    475   bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
    476 }
    477 
    478 static void GetCombinedEntropyUnrefined_C(const uint32_t X[],
    479                                           const uint32_t Y[],
    480                                           int length,
    481                                           VP8LBitEntropy* const bit_entropy,
    482                                           VP8LStreaks* const stats) {
    483   int i = 1;
    484   int i_prev = 0;
    485   uint32_t xy_prev = X[0] + Y[0];
    486 
    487   memset(stats, 0, sizeof(*stats));
    488   VP8LBitEntropyInit(bit_entropy);
    489 
    490   for (i = 1; i < length; ++i) {
    491     const uint32_t xy = X[i] + Y[i];
    492     if (xy != xy_prev) {
    493       GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats);
    494     }
    495   }
    496   GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats);
    497 
    498   bit_entropy->entropy += VP8LFastSLog2(bit_entropy->sum);
    499 }
    500 
    501 //------------------------------------------------------------------------------
    502 
    503 void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
    504   int i;
    505   for (i = 0; i < num_pixels; ++i) {
    506     const int argb = argb_data[i];
    507     const int green = (argb >> 8) & 0xff;
    508     const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
    509     const uint32_t new_b = (((argb >>  0) & 0xff) - green) & 0xff;
    510     argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b;
    511   }
    512 }
    513 
    514 static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) {
    515   return ((int)color_pred * color) >> 5;
    516 }
    517 
    518 void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data,
    519                           int num_pixels) {
    520   int i;
    521   for (i = 0; i < num_pixels; ++i) {
    522     const uint32_t argb = data[i];
    523     const uint32_t green = argb >> 8;
    524     const uint32_t red = argb >> 16;
    525     int new_red = red & 0xff;
    526     int new_blue = argb & 0xff;
    527     new_red -= ColorTransformDelta(m->green_to_red_, green);
    528     new_red &= 0xff;
    529     new_blue -= ColorTransformDelta(m->green_to_blue_, green);
    530     new_blue -= ColorTransformDelta(m->red_to_blue_, red);
    531     new_blue &= 0xff;
    532     data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
    533   }
    534 }
    535 
    536 static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
    537                                              uint32_t argb) {
    538   const uint32_t green = argb >> 8;
    539   int new_red = argb >> 16;
    540   new_red -= ColorTransformDelta(green_to_red, green);
    541   return (new_red & 0xff);
    542 }
    543 
    544 static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
    545                                               uint8_t red_to_blue,
    546                                               uint32_t argb) {
    547   const uint32_t green = argb >> 8;
    548   const uint32_t red = argb >> 16;
    549   uint8_t new_blue = argb;
    550   new_blue -= ColorTransformDelta(green_to_blue, green);
    551   new_blue -= ColorTransformDelta(red_to_blue, red);
    552   return (new_blue & 0xff);
    553 }
    554 
    555 void VP8LCollectColorRedTransforms_C(const uint32_t* argb, int stride,
    556                                      int tile_width, int tile_height,
    557                                      int green_to_red, int histo[]) {
    558   while (tile_height-- > 0) {
    559     int x;
    560     for (x = 0; x < tile_width; ++x) {
    561       ++histo[TransformColorRed(green_to_red, argb[x])];
    562     }
    563     argb += stride;
    564   }
    565 }
    566 
    567 void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride,
    568                                       int tile_width, int tile_height,
    569                                       int green_to_blue, int red_to_blue,
    570                                       int histo[]) {
    571   while (tile_height-- > 0) {
    572     int x;
    573     for (x = 0; x < tile_width; ++x) {
    574       ++histo[TransformColorBlue(green_to_blue, red_to_blue, argb[x])];
    575     }
    576     argb += stride;
    577   }
    578 }
    579 
    580 //------------------------------------------------------------------------------
    581 
    582 static int VectorMismatch_C(const uint32_t* const array1,
    583                             const uint32_t* const array2, int length) {
    584   int match_len = 0;
    585 
    586   while (match_len < length && array1[match_len] == array2[match_len]) {
    587     ++match_len;
    588   }
    589   return match_len;
    590 }
    591 
    592 // Bundles multiple (1, 2, 4 or 8) pixels into a single pixel.
    593 void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
    594                           uint32_t* dst) {
    595   int x;
    596   if (xbits > 0) {
    597     const int bit_depth = 1 << (3 - xbits);
    598     const int mask = (1 << xbits) - 1;
    599     uint32_t code = 0xff000000;
    600     for (x = 0; x < width; ++x) {
    601       const int xsub = x & mask;
    602       if (xsub == 0) {
    603         code = 0xff000000;
    604       }
    605       code |= row[x] << (8 + bit_depth * xsub);
    606       dst[x >> xbits] = code;
    607     }
    608   } else {
    609     for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8);
    610   }
    611 }
    612 
    613 //------------------------------------------------------------------------------
    614 
    615 static double ExtraCost_C(const uint32_t* population, int length) {
    616   int i;
    617   double cost = 0.;
    618   for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
    619   return cost;
    620 }
    621 
    622 static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
    623                                   int length) {
    624   int i;
    625   double cost = 0.;
    626   for (i = 2; i < length - 2; ++i) {
    627     const int xy = X[i + 2] + Y[i + 2];
    628     cost += (i >> 1) * xy;
    629   }
    630   return cost;
    631 }
    632 
    633 //------------------------------------------------------------------------------
    634 
    635 static void HistogramAdd_C(const VP8LHistogram* const a,
    636                            const VP8LHistogram* const b,
    637                            VP8LHistogram* const out) {
    638   int i;
    639   const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
    640   assert(a->palette_code_bits_ == b->palette_code_bits_);
    641   if (b != out) {
    642     for (i = 0; i < literal_size; ++i) {
    643       out->literal_[i] = a->literal_[i] + b->literal_[i];
    644     }
    645     for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
    646       out->distance_[i] = a->distance_[i] + b->distance_[i];
    647     }
    648     for (i = 0; i < NUM_LITERAL_CODES; ++i) {
    649       out->red_[i] = a->red_[i] + b->red_[i];
    650       out->blue_[i] = a->blue_[i] + b->blue_[i];
    651       out->alpha_[i] = a->alpha_[i] + b->alpha_[i];
    652     }
    653   } else {
    654     for (i = 0; i < literal_size; ++i) {
    655       out->literal_[i] += a->literal_[i];
    656     }
    657     for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
    658       out->distance_[i] += a->distance_[i];
    659     }
    660     for (i = 0; i < NUM_LITERAL_CODES; ++i) {
    661       out->red_[i] += a->red_[i];
    662       out->blue_[i] += a->blue_[i];
    663       out->alpha_[i] += a->alpha_[i];
    664     }
    665   }
    666 }
    667 
    668 //------------------------------------------------------------------------------
    669 // Image transforms.
    670 
    671 static WEBP_INLINE uint32_t Average2(uint32_t a0, uint32_t a1) {
    672   return (((a0 ^ a1) & 0xfefefefeu) >> 1) + (a0 & a1);
    673 }
    674 
    675 static WEBP_INLINE uint32_t Average3(uint32_t a0, uint32_t a1, uint32_t a2) {
    676   return Average2(Average2(a0, a2), a1);
    677 }
    678 
    679 static WEBP_INLINE uint32_t Average4(uint32_t a0, uint32_t a1,
    680                                      uint32_t a2, uint32_t a3) {
    681   return Average2(Average2(a0, a1), Average2(a2, a3));
    682 }
    683 
    684 static WEBP_INLINE uint32_t Clip255(uint32_t a) {
    685   if (a < 256) {
    686     return a;
    687   }
    688   // return 0, when a is a negative integer.
    689   // return 255, when a is positive.
    690   return ~a >> 24;
    691 }
    692 
    693 static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) {
    694   return Clip255(a + b - c);
    695 }
    696 
    697 static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1,
    698                                                    uint32_t c2) {
    699   const int a = AddSubtractComponentFull(c0 >> 24, c1 >> 24, c2 >> 24);
    700   const int r = AddSubtractComponentFull((c0 >> 16) & 0xff,
    701                                          (c1 >> 16) & 0xff,
    702                                          (c2 >> 16) & 0xff);
    703   const int g = AddSubtractComponentFull((c0 >> 8) & 0xff,
    704                                          (c1 >> 8) & 0xff,
    705                                          (c2 >> 8) & 0xff);
    706   const int b = AddSubtractComponentFull(c0 & 0xff, c1 & 0xff, c2 & 0xff);
    707   return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
    708 }
    709 
    710 static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) {
    711   return Clip255(a + (a - b) / 2);
    712 }
    713 
    714 static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,
    715                                                    uint32_t c2) {
    716   const uint32_t ave = Average2(c0, c1);
    717   const int a = AddSubtractComponentHalf(ave >> 24, c2 >> 24);
    718   const int r = AddSubtractComponentHalf((ave >> 16) & 0xff, (c2 >> 16) & 0xff);
    719   const int g = AddSubtractComponentHalf((ave >> 8) & 0xff, (c2 >> 8) & 0xff);
    720   const int b = AddSubtractComponentHalf((ave >> 0) & 0xff, (c2 >> 0) & 0xff);
    721   return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
    722 }
    723 
    724 // gcc-4.9 on ARM generates incorrect code in Select() when Sub3() is inlined.
    725 #if defined(__arm__) && \
    726     (LOCAL_GCC_VERSION == 0x409 || LOCAL_GCC_VERSION == 0x408)
    727 # define LOCAL_INLINE __attribute__ ((noinline))
    728 #else
    729 # define LOCAL_INLINE WEBP_INLINE
    730 #endif
    731 
    732 static LOCAL_INLINE int Sub3(int a, int b, int c) {
    733   const int pb = b - c;
    734   const int pa = a - c;
    735   return abs(pb) - abs(pa);
    736 }
    737 
    738 #undef LOCAL_INLINE
    739 
    740 static WEBP_INLINE uint32_t Select(uint32_t a, uint32_t b, uint32_t c) {
    741   const int pa_minus_pb =
    742       Sub3((a >> 24)       , (b >> 24)       , (c >> 24)       ) +
    743       Sub3((a >> 16) & 0xff, (b >> 16) & 0xff, (c >> 16) & 0xff) +
    744       Sub3((a >>  8) & 0xff, (b >>  8) & 0xff, (c >>  8) & 0xff) +
    745       Sub3((a      ) & 0xff, (b      ) & 0xff, (c      ) & 0xff);
    746   return (pa_minus_pb <= 0) ? a : b;
    747 }
    748 
    749 //------------------------------------------------------------------------------
    750 // Predictors
    751 
    752 static uint32_t Predictor2(uint32_t left, const uint32_t* const top) {
    753   (void)left;
    754   return top[0];
    755 }
    756 static uint32_t Predictor3(uint32_t left, const uint32_t* const top) {
    757   (void)left;
    758   return top[1];
    759 }
    760 static uint32_t Predictor4(uint32_t left, const uint32_t* const top) {
    761   (void)left;
    762   return top[-1];
    763 }
    764 static uint32_t Predictor5(uint32_t left, const uint32_t* const top) {
    765   const uint32_t pred = Average3(left, top[0], top[1]);
    766   return pred;
    767 }
    768 static uint32_t Predictor6(uint32_t left, const uint32_t* const top) {
    769   const uint32_t pred = Average2(left, top[-1]);
    770   return pred;
    771 }
    772 static uint32_t Predictor7(uint32_t left, const uint32_t* const top) {
    773   const uint32_t pred = Average2(left, top[0]);
    774   return pred;
    775 }
    776 static uint32_t Predictor8(uint32_t left, const uint32_t* const top) {
    777   const uint32_t pred = Average2(top[-1], top[0]);
    778   (void)left;
    779   return pred;
    780 }
    781 static uint32_t Predictor9(uint32_t left, const uint32_t* const top) {
    782   const uint32_t pred = Average2(top[0], top[1]);
    783   (void)left;
    784   return pred;
    785 }
    786 static uint32_t Predictor10(uint32_t left, const uint32_t* const top) {
    787   const uint32_t pred = Average4(left, top[-1], top[0], top[1]);
    788   return pred;
    789 }
    790 static uint32_t Predictor11(uint32_t left, const uint32_t* const top) {
    791   const uint32_t pred = Select(top[0], left, top[-1]);
    792   return pred;
    793 }
    794 static uint32_t Predictor12(uint32_t left, const uint32_t* const top) {
    795   const uint32_t pred = ClampedAddSubtractFull(left, top[0], top[-1]);
    796   return pred;
    797 }
    798 static uint32_t Predictor13(uint32_t left, const uint32_t* const top) {
    799   const uint32_t pred = ClampedAddSubtractHalf(left, top[0], top[-1]);
    800   return pred;
    801 }
    802 
    803 //------------------------------------------------------------------------------
    804 
    805 static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
    806                             int num_pixels, uint32_t* out) {
    807   int i;
    808   for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK);
    809   (void)upper;
    810 }
    811 
    812 static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
    813                             int num_pixels, uint32_t* out) {
    814   int i;
    815   for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]);
    816   (void)upper;
    817 }
    818 
    819 GENERATE_PREDICTOR_SUB(Predictor2, PredictorSub2_C)
    820 GENERATE_PREDICTOR_SUB(Predictor3, PredictorSub3_C)
    821 GENERATE_PREDICTOR_SUB(Predictor4, PredictorSub4_C)
    822 GENERATE_PREDICTOR_SUB(Predictor5, PredictorSub5_C)
    823 GENERATE_PREDICTOR_SUB(Predictor6, PredictorSub6_C)
    824 GENERATE_PREDICTOR_SUB(Predictor7, PredictorSub7_C)
    825 GENERATE_PREDICTOR_SUB(Predictor8, PredictorSub8_C)
    826 GENERATE_PREDICTOR_SUB(Predictor9, PredictorSub9_C)
    827 GENERATE_PREDICTOR_SUB(Predictor10, PredictorSub10_C)
    828 GENERATE_PREDICTOR_SUB(Predictor11, PredictorSub11_C)
    829 GENERATE_PREDICTOR_SUB(Predictor12, PredictorSub12_C)
    830 GENERATE_PREDICTOR_SUB(Predictor13, PredictorSub13_C)
    831 
    832 //------------------------------------------------------------------------------
    833 
    834 VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed;
    835 
    836 VP8LTransformColorFunc VP8LTransformColor;
    837 
    838 VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms;
    839 VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms;
    840 
    841 VP8LFastLog2SlowFunc VP8LFastLog2Slow;
    842 VP8LFastLog2SlowFunc VP8LFastSLog2Slow;
    843 
    844 VP8LCostFunc VP8LExtraCost;
    845 VP8LCostCombinedFunc VP8LExtraCostCombined;
    846 VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
    847 
    848 VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
    849 VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
    850 
    851 VP8LHistogramAddFunc VP8LHistogramAdd;
    852 
    853 VP8LVectorMismatchFunc VP8LVectorMismatch;
    854 VP8LBundleColorMapFunc VP8LBundleColorMap;
    855 
    856 VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
    857 VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
    858 
    859 extern void VP8LEncDspInitSSE2(void);
    860 extern void VP8LEncDspInitSSE41(void);
    861 extern void VP8LEncDspInitNEON(void);
    862 extern void VP8LEncDspInitMIPS32(void);
    863 extern void VP8LEncDspInitMIPSdspR2(void);
    864 extern void VP8LEncDspInitMSA(void);
    865 
    866 static volatile VP8CPUInfo lossless_enc_last_cpuinfo_used =
    867     (VP8CPUInfo)&lossless_enc_last_cpuinfo_used;
    868 
    869 WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInit(void) {
    870   if (lossless_enc_last_cpuinfo_used == VP8GetCPUInfo) return;
    871 
    872   VP8LDspInit();
    873 
    874 #if !WEBP_NEON_OMIT_C_CODE
    875   VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
    876 
    877   VP8LTransformColor = VP8LTransformColor_C;
    878 #endif
    879 
    880   VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C;
    881   VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C;
    882 
    883   VP8LFastLog2Slow = FastLog2Slow_C;
    884   VP8LFastSLog2Slow = FastSLog2Slow_C;
    885 
    886   VP8LExtraCost = ExtraCost_C;
    887   VP8LExtraCostCombined = ExtraCostCombined_C;
    888   VP8LCombinedShannonEntropy = CombinedShannonEntropy_C;
    889 
    890   VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
    891   VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
    892 
    893   VP8LHistogramAdd = HistogramAdd_C;
    894 
    895   VP8LVectorMismatch = VectorMismatch_C;
    896   VP8LBundleColorMap = VP8LBundleColorMap_C;
    897 
    898   VP8LPredictorsSub[0] = PredictorSub0_C;
    899   VP8LPredictorsSub[1] = PredictorSub1_C;
    900   VP8LPredictorsSub[2] = PredictorSub2_C;
    901   VP8LPredictorsSub[3] = PredictorSub3_C;
    902   VP8LPredictorsSub[4] = PredictorSub4_C;
    903   VP8LPredictorsSub[5] = PredictorSub5_C;
    904   VP8LPredictorsSub[6] = PredictorSub6_C;
    905   VP8LPredictorsSub[7] = PredictorSub7_C;
    906   VP8LPredictorsSub[8] = PredictorSub8_C;
    907   VP8LPredictorsSub[9] = PredictorSub9_C;
    908   VP8LPredictorsSub[10] = PredictorSub10_C;
    909   VP8LPredictorsSub[11] = PredictorSub11_C;
    910   VP8LPredictorsSub[12] = PredictorSub12_C;
    911   VP8LPredictorsSub[13] = PredictorSub13_C;
    912   VP8LPredictorsSub[14] = PredictorSub0_C;  // <- padding security sentinels
    913   VP8LPredictorsSub[15] = PredictorSub0_C;
    914 
    915   VP8LPredictorsSub_C[0] = PredictorSub0_C;
    916   VP8LPredictorsSub_C[1] = PredictorSub1_C;
    917   VP8LPredictorsSub_C[2] = PredictorSub2_C;
    918   VP8LPredictorsSub_C[3] = PredictorSub3_C;
    919   VP8LPredictorsSub_C[4] = PredictorSub4_C;
    920   VP8LPredictorsSub_C[5] = PredictorSub5_C;
    921   VP8LPredictorsSub_C[6] = PredictorSub6_C;
    922   VP8LPredictorsSub_C[7] = PredictorSub7_C;
    923   VP8LPredictorsSub_C[8] = PredictorSub8_C;
    924   VP8LPredictorsSub_C[9] = PredictorSub9_C;
    925   VP8LPredictorsSub_C[10] = PredictorSub10_C;
    926   VP8LPredictorsSub_C[11] = PredictorSub11_C;
    927   VP8LPredictorsSub_C[12] = PredictorSub12_C;
    928   VP8LPredictorsSub_C[13] = PredictorSub13_C;
    929   VP8LPredictorsSub_C[14] = PredictorSub0_C;  // <- padding security sentinels
    930   VP8LPredictorsSub_C[15] = PredictorSub0_C;
    931 
    932   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
    933   if (VP8GetCPUInfo != NULL) {
    934 #if defined(WEBP_USE_SSE2)
    935     if (VP8GetCPUInfo(kSSE2)) {
    936       VP8LEncDspInitSSE2();
    937 #if defined(WEBP_USE_SSE41)
    938       if (VP8GetCPUInfo(kSSE4_1)) {
    939         VP8LEncDspInitSSE41();
    940       }
    941 #endif
    942     }
    943 #endif
    944 #if defined(WEBP_USE_MIPS32)
    945     if (VP8GetCPUInfo(kMIPS32)) {
    946       VP8LEncDspInitMIPS32();
    947     }
    948 #endif
    949 #if defined(WEBP_USE_MIPS_DSP_R2)
    950     if (VP8GetCPUInfo(kMIPSdspR2)) {
    951       VP8LEncDspInitMIPSdspR2();
    952     }
    953 #endif
    954 #if defined(WEBP_USE_MSA)
    955     if (VP8GetCPUInfo(kMSA)) {
    956       VP8LEncDspInitMSA();
    957     }
    958 #endif
    959   }
    960 
    961 #if defined(WEBP_USE_NEON)
    962   if (WEBP_NEON_OMIT_C_CODE ||
    963       (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
    964     VP8LEncDspInitNEON();
    965   }
    966 #endif
    967 
    968   assert(VP8LSubtractGreenFromBlueAndRed != NULL);
    969   assert(VP8LTransformColor != NULL);
    970   assert(VP8LCollectColorBlueTransforms != NULL);
    971   assert(VP8LCollectColorRedTransforms != NULL);
    972   assert(VP8LFastLog2Slow != NULL);
    973   assert(VP8LFastSLog2Slow != NULL);
    974   assert(VP8LExtraCost != NULL);
    975   assert(VP8LExtraCostCombined != NULL);
    976   assert(VP8LCombinedShannonEntropy != NULL);
    977   assert(VP8LGetEntropyUnrefined != NULL);
    978   assert(VP8LGetCombinedEntropyUnrefined != NULL);
    979   assert(VP8LHistogramAdd != NULL);
    980   assert(VP8LVectorMismatch != NULL);
    981   assert(VP8LBundleColorMap != NULL);
    982   assert(VP8LPredictorsSub[0] != NULL);
    983   assert(VP8LPredictorsSub[1] != NULL);
    984   assert(VP8LPredictorsSub[2] != NULL);
    985   assert(VP8LPredictorsSub[3] != NULL);
    986   assert(VP8LPredictorsSub[4] != NULL);
    987   assert(VP8LPredictorsSub[5] != NULL);
    988   assert(VP8LPredictorsSub[6] != NULL);
    989   assert(VP8LPredictorsSub[7] != NULL);
    990   assert(VP8LPredictorsSub[8] != NULL);
    991   assert(VP8LPredictorsSub[9] != NULL);
    992   assert(VP8LPredictorsSub[10] != NULL);
    993   assert(VP8LPredictorsSub[11] != NULL);
    994   assert(VP8LPredictorsSub[12] != NULL);
    995   assert(VP8LPredictorsSub[13] != NULL);
    996   assert(VP8LPredictorsSub[14] != NULL);
    997   assert(VP8LPredictorsSub[15] != NULL);
    998   assert(VP8LPredictorsSub_C[0] != NULL);
    999   assert(VP8LPredictorsSub_C[1] != NULL);
   1000   assert(VP8LPredictorsSub_C[2] != NULL);
   1001   assert(VP8LPredictorsSub_C[3] != NULL);
   1002   assert(VP8LPredictorsSub_C[4] != NULL);
   1003   assert(VP8LPredictorsSub_C[5] != NULL);
   1004   assert(VP8LPredictorsSub_C[6] != NULL);
   1005   assert(VP8LPredictorsSub_C[7] != NULL);
   1006   assert(VP8LPredictorsSub_C[8] != NULL);
   1007   assert(VP8LPredictorsSub_C[9] != NULL);
   1008   assert(VP8LPredictorsSub_C[10] != NULL);
   1009   assert(VP8LPredictorsSub_C[11] != NULL);
   1010   assert(VP8LPredictorsSub_C[12] != NULL);
   1011   assert(VP8LPredictorsSub_C[13] != NULL);
   1012   assert(VP8LPredictorsSub_C[14] != NULL);
   1013   assert(VP8LPredictorsSub_C[15] != NULL);
   1014 
   1015   lossless_enc_last_cpuinfo_used = VP8GetCPUInfo;
   1016 }
   1017 
   1018 //------------------------------------------------------------------------------
   1019