tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

lossless_enc.c (35457B)


      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@gmail.com)
     13 //          Jyrki Alakuijala (jyrki@google.com)
     14 //          Urvang Joshi (urvang@google.com)
     15 
     16 #include <assert.h>
     17 #include <math.h>
     18 #include <stdlib.h>
     19 #include <string.h>
     20 
     21 #include "src/dsp/cpu.h"
     22 #include "src/dsp/dsp.h"
     23 #include "src/dsp/lossless.h"
     24 #include "src/dsp/lossless_common.h"
     25 #include "src/enc/histogram_enc.h"
     26 #include "src/utils/utils.h"
     27 #include "src/webp/format_constants.h"
     28 #include "src/webp/types.h"
     29 
     30 // lookup table for small values of log2(int) * (1 << LOG_2_PRECISION_BITS).
     31 // Obtained in Python with:
     32 // a = [ str(round((1<<23)*math.log2(i))) if i else "0" for i in range(256)]
     33 // print(',\n'.join(['  '+','.join(v)
     34 //       for v in batched([i.rjust(9) for i in a],7)]))
     35 const uint32_t kLog2Table[LOG_LOOKUP_IDX_MAX] = {
     36         0,        0,  8388608, 13295629, 16777216, 19477745, 21684237,
     37  23549800, 25165824, 26591258, 27866353, 29019816, 30072845, 31041538,
     38  31938408, 32773374, 33554432, 34288123, 34979866, 35634199, 36254961,
     39  36845429, 37408424, 37946388, 38461453, 38955489, 39430146, 39886887,
     40  40327016, 40751698, 41161982, 41558811, 41943040, 42315445, 42676731,
     41  43027545, 43368474, 43700062, 44022807, 44337167, 44643569, 44942404,
     42  45234037, 45518808, 45797032, 46069003, 46334996, 46595268, 46850061,
     43  47099600, 47344097, 47583753, 47818754, 48049279, 48275495, 48497560,
     44  48715624, 48929828, 49140306, 49347187, 49550590, 49750631, 49947419,
     45  50141058, 50331648, 50519283, 50704053, 50886044, 51065339, 51242017,
     46  51416153, 51587818, 51757082, 51924012, 52088670, 52251118, 52411415,
     47  52569616, 52725775, 52879946, 53032177, 53182516, 53331012, 53477707,
     48  53622645, 53765868, 53907416, 54047327, 54185640, 54322389, 54457611,
     49  54591338, 54723604, 54854440, 54983876, 55111943, 55238669, 55364082,
     50  55488208, 55611074, 55732705, 55853126, 55972361, 56090432, 56207362,
     51  56323174, 56437887, 56551524, 56664103, 56775645, 56886168, 56995691,
     52  57104232, 57211808, 57318436, 57424133, 57528914, 57632796, 57735795,
     53  57837923, 57939198, 58039632, 58139239, 58238033, 58336027, 58433234,
     54  58529666, 58625336, 58720256, 58814437, 58907891, 59000628, 59092661,
     55  59183999, 59274652, 59364632, 59453947, 59542609, 59630625, 59718006,
     56  59804761, 59890898, 59976426, 60061354, 60145690, 60229443, 60312620,
     57  60395229, 60477278, 60558775, 60639726, 60720140, 60800023, 60879382,
     58  60958224, 61036555, 61114383, 61191714, 61268554, 61344908, 61420785,
     59  61496188, 61571124, 61645600, 61719620, 61793189, 61866315, 61939001,
     60  62011253, 62083076, 62154476, 62225457, 62296024, 62366182, 62435935,
     61  62505289, 62574248, 62642816, 62710997, 62778797, 62846219, 62913267,
     62  62979946, 63046260, 63112212, 63177807, 63243048, 63307939, 63372484,
     63  63436687, 63500551, 63564080, 63627277, 63690146, 63752690, 63814912,
     64  63876816, 63938405, 63999682, 64060650, 64121313, 64181673, 64241734,
     65  64301498, 64360969, 64420148, 64479040, 64537646, 64595970, 64654014,
     66  64711782, 64769274, 64826495, 64883447, 64940132, 64996553, 65052711,
     67  65108611, 65164253, 65219641, 65274776, 65329662, 65384299, 65438691,
     68  65492840, 65546747, 65600416, 65653847, 65707044, 65760008, 65812741,
     69  65865245, 65917522, 65969575, 66021404, 66073013, 66124403, 66175575,
     70  66226531, 66277275, 66327806, 66378127, 66428240, 66478146, 66527847,
     71  66577345, 66626641, 66675737, 66724635, 66773336, 66821842, 66870154,
     72  66918274, 66966204, 67013944, 67061497
     73 };
     74 
     75 // lookup table for small values of int*log2(int) * (1 << LOG_2_PRECISION_BITS).
     76 // Obtained in Python with:
     77 // a=[ "%d"%i if i<(1<<32) else "%dull"%i
     78 //     for i in [ round((1<<LOG_2_PRECISION_BITS)*math.log2(i)*i) if i
     79 //     else 0 for i in range(256)]]
     80 // print(',\n '.join([','.join(v) for v in batched([i.rjust(15)
     81 //                      for i in a],4)]))
     82 const uint64_t kSLog2Table[LOG_LOOKUP_IDX_MAX] = {
     83               0,              0,       16777216,       39886887,
     84        67108864,       97388723,      130105423,      164848600,
     85       201326592,      239321324,      278663526,      319217973,
     86       360874141,      403539997,      447137711,      491600606,
     87       536870912,      582898099,      629637592,      677049776,
     88       725099212,      773754010,      822985323,      872766924,
     89       923074875,      973887230,     1025183802,     1076945958,
     90      1129156447,     1181799249,     1234859451,     1288323135,
     91      1342177280,     1396409681,     1451008871,     1505964059,
     92      1561265072,     1616902301,     1672866655,     1729149526,
     93      1785742744,     1842638548,     1899829557,     1957308741,
     94      2015069397,     2073105127,     2131409817,  2189977618ull,
     95   2248802933ull,  2307880396ull,  2367204859ull,  2426771383ull,
     96   2486575220ull,  2546611805ull,  2606876748ull,  2667365819ull,
     97   2728074942ull,  2789000187ull,  2850137762ull,  2911484006ull,
     98   2973035382ull,  3034788471ull,  3096739966ull,  3158886666ull,
     99   3221225472ull,  3283753383ull,  3346467489ull,  3409364969ull,
    100   3472443085ull,  3535699182ull,  3599130679ull,  3662735070ull,
    101   3726509920ull,  3790452862ull,  3854561593ull,  3918833872ull,
    102   3983267519ull,  4047860410ull,  4112610476ull,  4177515704ull,
    103   4242574127ull,  4307783833ull,  4373142952ull,  4438649662ull,
    104   4504302186ull,  4570098787ull,  4636037770ull,  4702117480ull,
    105   4768336298ull,  4834692645ull,  4901184974ull,  4967811774ull,
    106   5034571569ull,  5101462912ull,  5168484389ull,  5235634615ull,
    107   5302912235ull,  5370315922ull,  5437844376ull,  5505496324ull,
    108   5573270518ull,  5641165737ull,  5709180782ull,  5777314477ull,
    109   5845565671ull,  5913933235ull,  5982416059ull,  6051013057ull,
    110   6119723161ull,  6188545324ull,  6257478518ull,  6326521733ull,
    111   6395673979ull,  6464934282ull,  6534301685ull,  6603775250ull,
    112   6673354052ull,  6743037185ull,  6812823756ull,  6882712890ull,
    113   6952703725ull,  7022795412ull,  7092987118ull,  7163278025ull,
    114   7233667324ull,  7304154222ull,  7374737939ull,  7445417707ull,
    115   7516192768ull,  7587062379ull,  7658025806ull,  7729082328ull,
    116   7800231234ull,  7871471825ull,  7942803410ull,  8014225311ull,
    117   8085736859ull,  8157337394ull,  8229026267ull,  8300802839ull,
    118   8372666477ull,  8444616560ull,  8516652476ull,  8588773618ull,
    119   8660979393ull,  8733269211ull,  8805642493ull,  8878098667ull,
    120   8950637170ull,  9023257446ull,  9095958945ull,  9168741125ull,
    121   9241603454ull,  9314545403ull,  9387566451ull,  9460666086ull,
    122   9533843800ull,  9607099093ull,  9680431471ull,  9753840445ull,
    123   9827325535ull,  9900886263ull,  9974522161ull, 10048232765ull,
    124  10122017615ull, 10195876260ull, 10269808253ull, 10343813150ull,
    125  10417890516ull, 10492039919ull, 10566260934ull, 10640553138ull,
    126  10714916116ull, 10789349456ull, 10863852751ull, 10938425600ull,
    127  11013067604ull, 11087778372ull, 11162557513ull, 11237404645ull,
    128  11312319387ull, 11387301364ull, 11462350205ull, 11537465541ull,
    129  11612647010ull, 11687894253ull, 11763206912ull, 11838584638ull,
    130  11914027082ull, 11989533899ull, 12065104750ull, 12140739296ull,
    131  12216437206ull, 12292198148ull, 12368021795ull, 12443907826ull,
    132  12519855920ull, 12595865759ull, 12671937032ull, 12748069427ull,
    133  12824262637ull, 12900516358ull, 12976830290ull, 13053204134ull,
    134  13129637595ull, 13206130381ull, 13282682202ull, 13359292772ull,
    135  13435961806ull, 13512689025ull, 13589474149ull, 13666316903ull,
    136  13743217014ull, 13820174211ull, 13897188225ull, 13974258793ull,
    137  14051385649ull, 14128568535ull, 14205807192ull, 14283101363ull,
    138  14360450796ull, 14437855239ull, 14515314443ull, 14592828162ull,
    139  14670396151ull, 14748018167ull, 14825693972ull, 14903423326ull,
    140  14981205995ull, 15059041743ull, 15136930339ull, 15214871554ull,
    141  15292865160ull, 15370910930ull, 15449008641ull, 15527158071ull,
    142  15605359001ull, 15683611210ull, 15761914485ull, 15840268608ull,
    143  15918673369ull, 15997128556ull, 16075633960ull, 16154189373ull,
    144  16232794589ull, 16311449405ull, 16390153617ull, 16468907026ull,
    145  16547709431ull, 16626560636ull, 16705460444ull, 16784408661ull,
    146  16863405094ull, 16942449552ull, 17021541845ull, 17100681785ull
    147 };
    148 
    149 const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX] = {
    150  { 0, 0}, { 0, 0}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 1}, { 4, 1}, { 5, 1},
    151  { 5, 1}, { 6, 2}, { 6, 2}, { 6, 2}, { 6, 2}, { 7, 2}, { 7, 2}, { 7, 2},
    152  { 7, 2}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3}, { 8, 3},
    153  { 8, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3}, { 9, 3},
    154  { 9, 3}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
    155  {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4}, {10, 4},
    156  {10, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
    157  {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4}, {11, 4},
    158  {11, 4}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    159  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    160  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    161  {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
    162  {12, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    163  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    164  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    165  {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5}, {13, 5},
    166  {13, 5}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    167  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    168  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    169  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    170  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    171  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    172  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    173  {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6}, {14, 6},
    174  {14, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    175  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    176  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    177  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    178  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    179  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    180  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    181  {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6}, {15, 6},
    182  {15, 6}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    183  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    184  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    185  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    186  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    187  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    188  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    189  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    190  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    191  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    192  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    193  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    194  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    195  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    196  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    197  {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7}, {16, 7},
    198  {16, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    199  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    200  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    201  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    202  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    203  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    204  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    205  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    206  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    207  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    208  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    209  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    210  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    211  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    212  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    213  {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
    214 };
    215 
    216 const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX] = {
    217   0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  2,  3,  0,  1,  2,  3,
    218   0,  1,  2,  3,  4,  5,  6,  7,  0,  1,  2,  3,  4,  5,  6,  7,
    219   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    220   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    221   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    222  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    223   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    224  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    225   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    226  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    227  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    228  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    229   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    230  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    231  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    232  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    233   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    234  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    235  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    236  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    237  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    238  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    239  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    240  112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
    241  127,
    242   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    243  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    244  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    245  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    246  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    247  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    248  96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
    249  112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
    250 };
    251 
    252 static uint64_t FastSLog2Slow_C(uint32_t v) {
    253  assert(v >= LOG_LOOKUP_IDX_MAX);
    254  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
    255    const uint64_t orig_v = v;
    256    uint64_t correction;
    257 #if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
    258    // use clz if available
    259    const uint64_t log_cnt = BitsLog2Floor(v) - 7;
    260    const uint32_t y = 1 << log_cnt;
    261    v >>= log_cnt;
    262 #else
    263    uint64_t log_cnt = 0;
    264    uint32_t y = 1;
    265    do {
    266      ++log_cnt;
    267      v = v >> 1;
    268      y = y << 1;
    269    } while (v >= LOG_LOOKUP_IDX_MAX);
    270 #endif
    271    // vf = (2^log_cnt) * Xf; where y = 2^log_cnt and Xf < 256
    272    // Xf = floor(Xf) * (1 + (v % y) / v)
    273    // log2(Xf) = log2(floor(Xf)) + log2(1 + (v % y) / v)
    274    // The correction factor: log(1 + d) ~ d; for very small d values, so
    275    // log2(1 + (v % y) / v) ~ LOG_2_RECIPROCAL * (v % y)/v
    276    correction = LOG_2_RECIPROCAL_FIXED * (orig_v & (y - 1));
    277    return orig_v * (kLog2Table[v] + (log_cnt << LOG_2_PRECISION_BITS)) +
    278           correction;
    279  } else {
    280    return (uint64_t)(LOG_2_RECIPROCAL_FIXED_DOUBLE * v * log((double)v) + .5);
    281  }
    282 }
    283 
    284 static uint32_t FastLog2Slow_C(uint32_t v) {
    285  assert(v >= LOG_LOOKUP_IDX_MAX);
    286  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
    287    const uint32_t orig_v = v;
    288    uint32_t log_2;
    289 #if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
    290    // use clz if available
    291    const uint32_t log_cnt = BitsLog2Floor(v) - 7;
    292    const uint32_t y = 1 << log_cnt;
    293    v >>= log_cnt;
    294 #else
    295    uint32_t log_cnt = 0;
    296    uint32_t y = 1;
    297    do {
    298      ++log_cnt;
    299      v = v >> 1;
    300      y = y << 1;
    301    } while (v >= LOG_LOOKUP_IDX_MAX);
    302 #endif
    303    log_2 = kLog2Table[v] + (log_cnt << LOG_2_PRECISION_BITS);
    304    if (orig_v >= APPROX_LOG_MAX) {
    305      // Since the division is still expensive, add this correction factor only
    306      // for large values of 'v'.
    307      const uint64_t correction = LOG_2_RECIPROCAL_FIXED * (orig_v & (y - 1));
    308      log_2 += (uint32_t)DivRound(correction, orig_v);
    309    }
    310    return log_2;
    311  } else {
    312    return (uint32_t)(LOG_2_RECIPROCAL_FIXED_DOUBLE * log((double)v) + .5);
    313  }
    314 }
    315 
    316 //------------------------------------------------------------------------------
    317 // Methods to calculate Entropy (Shannon).
    318 
    319 // Compute the combined Shanon's entropy for distribution {X} and {X+Y}
    320 static uint64_t CombinedShannonEntropy_C(const uint32_t X[256],
    321                                         const uint32_t Y[256]) {
    322  int i;
    323  uint64_t retval = 0;
    324  uint32_t sumX = 0, sumXY = 0;
    325  for (i = 0; i < 256; ++i) {
    326    const uint32_t x = X[i];
    327    if (x != 0) {
    328      const uint32_t xy = x + Y[i];
    329      sumX += x;
    330      retval += VP8LFastSLog2(x);
    331      sumXY += xy;
    332      retval += VP8LFastSLog2(xy);
    333    } else if (Y[i] != 0) {
    334      sumXY += Y[i];
    335      retval += VP8LFastSLog2(Y[i]);
    336    }
    337  }
    338  retval = VP8LFastSLog2(sumX) + VP8LFastSLog2(sumXY) - retval;
    339  return retval;
    340 }
    341 
    342 static uint64_t ShannonEntropy_C(const uint32_t* X, int n) {
    343  int i;
    344  uint64_t retval = 0;
    345  uint32_t sumX = 0;
    346  for (i = 0; i < n; ++i) {
    347    const int x = X[i];
    348    if (x != 0) {
    349      sumX += x;
    350      retval += VP8LFastSLog2(x);
    351    }
    352  }
    353  retval = VP8LFastSLog2(sumX) - retval;
    354  return retval;
    355 }
    356 
    357 void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
    358  entropy->entropy = 0;
    359  entropy->sum = 0;
    360  entropy->nonzeros = 0;
    361  entropy->max_val = 0;
    362  entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM;
    363 }
    364 
    365 void VP8LBitsEntropyUnrefined(const uint32_t* WEBP_RESTRICT const array, int n,
    366                              VP8LBitEntropy* WEBP_RESTRICT const entropy) {
    367  int i;
    368 
    369  VP8LBitEntropyInit(entropy);
    370 
    371  for (i = 0; i < n; ++i) {
    372    if (array[i] != 0) {
    373      entropy->sum += array[i];
    374      entropy->nonzero_code = i;
    375      ++entropy->nonzeros;
    376      entropy->entropy += VP8LFastSLog2(array[i]);
    377      if (entropy->max_val < array[i]) {
    378        entropy->max_val = array[i];
    379      }
    380    }
    381  }
    382  entropy->entropy = VP8LFastSLog2(entropy->sum) - entropy->entropy;
    383 }
    384 
    385 static WEBP_INLINE void GetEntropyUnrefinedHelper(
    386    uint32_t val, int i, uint32_t* WEBP_RESTRICT const val_prev,
    387    int* WEBP_RESTRICT const i_prev,
    388    VP8LBitEntropy* WEBP_RESTRICT const bit_entropy,
    389    VP8LStreaks* WEBP_RESTRICT const stats) {
    390  const int streak = i - *i_prev;
    391 
    392  // Gather info for the bit entropy.
    393  if (*val_prev != 0) {
    394    bit_entropy->sum += (*val_prev) * streak;
    395    bit_entropy->nonzeros += streak;
    396    bit_entropy->nonzero_code = *i_prev;
    397    bit_entropy->entropy += VP8LFastSLog2(*val_prev) * streak;
    398    if (bit_entropy->max_val < *val_prev) {
    399      bit_entropy->max_val = *val_prev;
    400    }
    401  }
    402 
    403  // Gather info for the Huffman cost.
    404  stats->counts[*val_prev != 0] += (streak > 3);
    405  stats->streaks[*val_prev != 0][(streak > 3)] += streak;
    406 
    407  *val_prev = val;
    408  *i_prev = i;
    409 }
    410 
    411 static void GetEntropyUnrefined_C(
    412    const uint32_t X[], int length,
    413    VP8LBitEntropy* WEBP_RESTRICT const bit_entropy,
    414    VP8LStreaks* WEBP_RESTRICT const stats) {
    415  int i;
    416  int i_prev = 0;
    417  uint32_t x_prev = X[0];
    418 
    419  memset(stats, 0, sizeof(*stats));
    420  VP8LBitEntropyInit(bit_entropy);
    421 
    422  for (i = 1; i < length; ++i) {
    423    const uint32_t x = X[i];
    424    if (x != x_prev) {
    425      GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats);
    426    }
    427  }
    428  GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats);
    429 
    430  bit_entropy->entropy = VP8LFastSLog2(bit_entropy->sum) - bit_entropy->entropy;
    431 }
    432 
    433 static void GetCombinedEntropyUnrefined_C(
    434    const uint32_t X[], const uint32_t Y[], int length,
    435    VP8LBitEntropy* WEBP_RESTRICT const bit_entropy,
    436    VP8LStreaks* WEBP_RESTRICT const stats) {
    437  int i = 1;
    438  int i_prev = 0;
    439  uint32_t xy_prev = X[0] + Y[0];
    440 
    441  memset(stats, 0, sizeof(*stats));
    442  VP8LBitEntropyInit(bit_entropy);
    443 
    444  for (i = 1; i < length; ++i) {
    445    const uint32_t xy = X[i] + Y[i];
    446    if (xy != xy_prev) {
    447      GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats);
    448    }
    449  }
    450  GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats);
    451 
    452  bit_entropy->entropy = VP8LFastSLog2(bit_entropy->sum) - bit_entropy->entropy;
    453 }
    454 
    455 //------------------------------------------------------------------------------
    456 
    457 void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
    458  int i;
    459  for (i = 0; i < num_pixels; ++i) {
    460    const int argb = (int)argb_data[i];
    461    const int green = (argb >> 8) & 0xff;
    462    const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
    463    const uint32_t new_b = (((argb >>  0) & 0xff) - green) & 0xff;
    464    argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b;
    465  }
    466 }
    467 
    468 static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) {
    469  return ((int)color_pred * color) >> 5;
    470 }
    471 
    472 static WEBP_INLINE int8_t U32ToS8(uint32_t v) {
    473  return (int8_t)(v & 0xff);
    474 }
    475 
    476 void VP8LTransformColor_C(const VP8LMultipliers* WEBP_RESTRICT const m,
    477                          uint32_t* WEBP_RESTRICT data, int num_pixels) {
    478  int i;
    479  for (i = 0; i < num_pixels; ++i) {
    480    const uint32_t argb = data[i];
    481    const int8_t green = U32ToS8(argb >>  8);
    482    const int8_t red   = U32ToS8(argb >> 16);
    483    int new_red = red & 0xff;
    484    int new_blue = argb & 0xff;
    485    new_red -= ColorTransformDelta((int8_t)m->green_to_red, green);
    486    new_red &= 0xff;
    487    new_blue -= ColorTransformDelta((int8_t)m->green_to_blue, green);
    488    new_blue -= ColorTransformDelta((int8_t)m->red_to_blue, red);
    489    new_blue &= 0xff;
    490    data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
    491  }
    492 }
    493 
    494 static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
    495                                             uint32_t argb) {
    496  const int8_t green = U32ToS8(argb >> 8);
    497  int new_red = argb >> 16;
    498  new_red -= ColorTransformDelta((int8_t)green_to_red, green);
    499  return (new_red & 0xff);
    500 }
    501 
    502 static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
    503                                              uint8_t red_to_blue,
    504                                              uint32_t argb) {
    505  const int8_t green = U32ToS8(argb >>  8);
    506  const int8_t red   = U32ToS8(argb >> 16);
    507  int new_blue = argb & 0xff;
    508  new_blue -= ColorTransformDelta((int8_t)green_to_blue, green);
    509  new_blue -= ColorTransformDelta((int8_t)red_to_blue, red);
    510  return (new_blue & 0xff);
    511 }
    512 
    513 void VP8LCollectColorRedTransforms_C(const uint32_t* WEBP_RESTRICT argb,
    514                                     int stride,
    515                                     int tile_width, int tile_height,
    516                                     int green_to_red, uint32_t histo[]) {
    517  while (tile_height-- > 0) {
    518    int x;
    519    for (x = 0; x < tile_width; ++x) {
    520      ++histo[TransformColorRed((uint8_t)green_to_red, argb[x])];
    521    }
    522    argb += stride;
    523  }
    524 }
    525 
    526 void VP8LCollectColorBlueTransforms_C(const uint32_t* WEBP_RESTRICT argb,
    527                                      int stride,
    528                                      int tile_width, int tile_height,
    529                                      int green_to_blue, int red_to_blue,
    530                                      uint32_t histo[]) {
    531  while (tile_height-- > 0) {
    532    int x;
    533    for (x = 0; x < tile_width; ++x) {
    534      ++histo[TransformColorBlue((uint8_t)green_to_blue, (uint8_t)red_to_blue,
    535                                 argb[x])];
    536    }
    537    argb += stride;
    538  }
    539 }
    540 
    541 //------------------------------------------------------------------------------
    542 
    543 static int VectorMismatch_C(const uint32_t* const array1,
    544                            const uint32_t* const array2, int length) {
    545  int match_len = 0;
    546 
    547  while (match_len < length && array1[match_len] == array2[match_len]) {
    548    ++match_len;
    549  }
    550  return match_len;
    551 }
    552 
    553 // Bundles multiple (1, 2, 4 or 8) pixels into a single pixel.
    554 void VP8LBundleColorMap_C(const uint8_t* WEBP_RESTRICT const row,
    555                          int width, int xbits, uint32_t* WEBP_RESTRICT dst) {
    556  int x;
    557  if (xbits > 0) {
    558    const int bit_depth = 1 << (3 - xbits);
    559    const int mask = (1 << xbits) - 1;
    560    uint32_t code = 0xff000000;
    561    for (x = 0; x < width; ++x) {
    562      const int xsub = x & mask;
    563      if (xsub == 0) {
    564        code = 0xff000000;
    565      }
    566      code |= row[x] << (8 + bit_depth * xsub);
    567      dst[x >> xbits] = code;
    568    }
    569  } else {
    570    for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8);
    571  }
    572 }
    573 
    574 //------------------------------------------------------------------------------
    575 
    576 static uint32_t ExtraCost_C(const uint32_t* population, int length) {
    577  int i;
    578  uint32_t cost = population[4] + population[5];
    579  assert(length % 2 == 0);
    580  for (i = 2; i < length / 2 - 1; ++i) {
    581    cost += i * (population[2 * i + 2] + population[2 * i + 3]);
    582  }
    583  return cost;
    584 }
    585 
    586 //------------------------------------------------------------------------------
    587 
    588 static void AddVector_C(const uint32_t* WEBP_RESTRICT a,
    589                        const uint32_t* WEBP_RESTRICT b,
    590                        uint32_t* WEBP_RESTRICT out, int size) {
    591  int i;
    592  for (i = 0; i < size; ++i) out[i] = a[i] + b[i];
    593 }
    594 
    595 static void AddVectorEq_C(const uint32_t* WEBP_RESTRICT a,
    596                          uint32_t* WEBP_RESTRICT out, int size) {
    597  int i;
    598  for (i = 0; i < size; ++i) out[i] += a[i];
    599 }
    600 
    601 //------------------------------------------------------------------------------
    602 // Image transforms.
    603 
    604 static void PredictorSub0_C(const uint32_t* in, const uint32_t* upper,
    605                            int num_pixels, uint32_t* WEBP_RESTRICT out) {
    606  int i;
    607  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK);
    608  (void)upper;
    609 }
    610 
    611 static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
    612                            int num_pixels, uint32_t* WEBP_RESTRICT out) {
    613  int i;
    614  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]);
    615  (void)upper;
    616 }
    617 
    618 // It subtracts the prediction from the input pixel and stores the residual
    619 // in the output pixel.
    620 #define GENERATE_PREDICTOR_SUB(PREDICTOR_I)                                \
    621 static void PredictorSub##PREDICTOR_I##_C(const uint32_t* in,              \
    622                                          const uint32_t* upper,           \
    623                                          int num_pixels,                  \
    624                                          uint32_t* WEBP_RESTRICT out) {   \
    625  int x;                                                                   \
    626  assert(upper != NULL);                                                   \
    627  for (x = 0; x < num_pixels; ++x) {                                       \
    628    const uint32_t pred =                                                  \
    629        VP8LPredictor##PREDICTOR_I##_C(&in[x - 1], upper + x);             \
    630    out[x] = VP8LSubPixels(in[x], pred);                                   \
    631  }                                                                        \
    632 }
    633 
    634 GENERATE_PREDICTOR_SUB(2)
    635 GENERATE_PREDICTOR_SUB(3)
    636 GENERATE_PREDICTOR_SUB(4)
    637 GENERATE_PREDICTOR_SUB(5)
    638 GENERATE_PREDICTOR_SUB(6)
    639 GENERATE_PREDICTOR_SUB(7)
    640 GENERATE_PREDICTOR_SUB(8)
    641 GENERATE_PREDICTOR_SUB(9)
    642 GENERATE_PREDICTOR_SUB(10)
    643 GENERATE_PREDICTOR_SUB(11)
    644 GENERATE_PREDICTOR_SUB(12)
    645 GENERATE_PREDICTOR_SUB(13)
    646 
    647 //------------------------------------------------------------------------------
    648 
    649 VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed;
    650 VP8LProcessEncBlueAndRedFunc VP8LSubtractGreenFromBlueAndRed_SSE;
    651 
    652 VP8LTransformColorFunc VP8LTransformColor;
    653 VP8LTransformColorFunc VP8LTransformColor_SSE;
    654 
    655 VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms;
    656 VP8LCollectColorBlueTransformsFunc VP8LCollectColorBlueTransforms_SSE;
    657 VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms;
    658 VP8LCollectColorRedTransformsFunc VP8LCollectColorRedTransforms_SSE;
    659 
    660 VP8LFastLog2SlowFunc VP8LFastLog2Slow;
    661 VP8LFastSLog2SlowFunc VP8LFastSLog2Slow;
    662 
    663 VP8LCostFunc VP8LExtraCost;
    664 VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
    665 VP8LShannonEntropyFunc VP8LShannonEntropy;
    666 
    667 VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
    668 VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
    669 
    670 VP8LAddVectorFunc VP8LAddVector;
    671 VP8LAddVectorEqFunc VP8LAddVectorEq;
    672 
    673 VP8LVectorMismatchFunc VP8LVectorMismatch;
    674 VP8LBundleColorMapFunc VP8LBundleColorMap;
    675 VP8LBundleColorMapFunc VP8LBundleColorMap_SSE;
    676 
    677 VP8LPredictorAddSubFunc VP8LPredictorsSub[16];
    678 VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
    679 VP8LPredictorAddSubFunc VP8LPredictorsSub_SSE[16];
    680 
    681 extern VP8CPUInfo VP8GetCPUInfo;
    682 extern void VP8LEncDspInitSSE2(void);
    683 extern void VP8LEncDspInitSSE41(void);
    684 extern void VP8LEncDspInitAVX2(void);
    685 extern void VP8LEncDspInitNEON(void);
    686 extern void VP8LEncDspInitMIPS32(void);
    687 extern void VP8LEncDspInitMIPSdspR2(void);
    688 extern void VP8LEncDspInitMSA(void);
    689 
    690 WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
    691  VP8LDspInit();
    692 
    693 #if !WEBP_NEON_OMIT_C_CODE
    694  VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
    695 
    696  VP8LTransformColor = VP8LTransformColor_C;
    697 #endif
    698 
    699  VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C;
    700  VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C;
    701 
    702  VP8LFastLog2Slow = FastLog2Slow_C;
    703  VP8LFastSLog2Slow = FastSLog2Slow_C;
    704 
    705  VP8LExtraCost = ExtraCost_C;
    706  VP8LCombinedShannonEntropy = CombinedShannonEntropy_C;
    707  VP8LShannonEntropy = ShannonEntropy_C;
    708 
    709  VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
    710  VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
    711 
    712  VP8LAddVector = AddVector_C;
    713  VP8LAddVectorEq = AddVectorEq_C;
    714 
    715  VP8LVectorMismatch = VectorMismatch_C;
    716  VP8LBundleColorMap = VP8LBundleColorMap_C;
    717 
    718  VP8LPredictorsSub[0] = PredictorSub0_C;
    719  VP8LPredictorsSub[1] = PredictorSub1_C;
    720  VP8LPredictorsSub[2] = PredictorSub2_C;
    721  VP8LPredictorsSub[3] = PredictorSub3_C;
    722  VP8LPredictorsSub[4] = PredictorSub4_C;
    723  VP8LPredictorsSub[5] = PredictorSub5_C;
    724  VP8LPredictorsSub[6] = PredictorSub6_C;
    725  VP8LPredictorsSub[7] = PredictorSub7_C;
    726  VP8LPredictorsSub[8] = PredictorSub8_C;
    727  VP8LPredictorsSub[9] = PredictorSub9_C;
    728  VP8LPredictorsSub[10] = PredictorSub10_C;
    729  VP8LPredictorsSub[11] = PredictorSub11_C;
    730  VP8LPredictorsSub[12] = PredictorSub12_C;
    731  VP8LPredictorsSub[13] = PredictorSub13_C;
    732  VP8LPredictorsSub[14] = PredictorSub0_C;  // <- padding security sentinels
    733  VP8LPredictorsSub[15] = PredictorSub0_C;
    734 
    735  VP8LPredictorsSub_C[0] = PredictorSub0_C;
    736  VP8LPredictorsSub_C[1] = PredictorSub1_C;
    737  VP8LPredictorsSub_C[2] = PredictorSub2_C;
    738  VP8LPredictorsSub_C[3] = PredictorSub3_C;
    739  VP8LPredictorsSub_C[4] = PredictorSub4_C;
    740  VP8LPredictorsSub_C[5] = PredictorSub5_C;
    741  VP8LPredictorsSub_C[6] = PredictorSub6_C;
    742  VP8LPredictorsSub_C[7] = PredictorSub7_C;
    743  VP8LPredictorsSub_C[8] = PredictorSub8_C;
    744  VP8LPredictorsSub_C[9] = PredictorSub9_C;
    745  VP8LPredictorsSub_C[10] = PredictorSub10_C;
    746  VP8LPredictorsSub_C[11] = PredictorSub11_C;
    747  VP8LPredictorsSub_C[12] = PredictorSub12_C;
    748  VP8LPredictorsSub_C[13] = PredictorSub13_C;
    749  VP8LPredictorsSub_C[14] = PredictorSub0_C;  // <- padding security sentinels
    750  VP8LPredictorsSub_C[15] = PredictorSub0_C;
    751 
    752  // If defined, use CPUInfo() to overwrite some pointers with faster versions.
    753  if (VP8GetCPUInfo != NULL) {
    754 #if defined(WEBP_HAVE_SSE2)
    755    if (VP8GetCPUInfo(kSSE2)) {
    756      VP8LEncDspInitSSE2();
    757 #if defined(WEBP_HAVE_SSE41)
    758      if (VP8GetCPUInfo(kSSE4_1)) {
    759        VP8LEncDspInitSSE41();
    760 #if defined(WEBP_HAVE_AVX2)
    761        if (VP8GetCPUInfo(kAVX2)) {
    762          VP8LEncDspInitAVX2();
    763        }
    764 #endif
    765      }
    766 #endif
    767    }
    768 #endif
    769 #if defined(WEBP_USE_MIPS32)
    770    if (VP8GetCPUInfo(kMIPS32)) {
    771      VP8LEncDspInitMIPS32();
    772    }
    773 #endif
    774 #if defined(WEBP_USE_MIPS_DSP_R2)
    775    if (VP8GetCPUInfo(kMIPSdspR2)) {
    776      VP8LEncDspInitMIPSdspR2();
    777    }
    778 #endif
    779 #if defined(WEBP_USE_MSA)
    780    if (VP8GetCPUInfo(kMSA)) {
    781      VP8LEncDspInitMSA();
    782    }
    783 #endif
    784  }
    785 
    786 #if defined(WEBP_HAVE_NEON)
    787  if (WEBP_NEON_OMIT_C_CODE ||
    788      (VP8GetCPUInfo != NULL && VP8GetCPUInfo(kNEON))) {
    789    VP8LEncDspInitNEON();
    790  }
    791 #endif
    792 
    793  assert(VP8LSubtractGreenFromBlueAndRed != NULL);
    794  assert(VP8LTransformColor != NULL);
    795  assert(VP8LCollectColorBlueTransforms != NULL);
    796  assert(VP8LCollectColorRedTransforms != NULL);
    797  assert(VP8LFastLog2Slow != NULL);
    798  assert(VP8LFastSLog2Slow != NULL);
    799  assert(VP8LExtraCost != NULL);
    800  assert(VP8LCombinedShannonEntropy != NULL);
    801  assert(VP8LShannonEntropy != NULL);
    802  assert(VP8LGetEntropyUnrefined != NULL);
    803  assert(VP8LGetCombinedEntropyUnrefined != NULL);
    804  assert(VP8LAddVector != NULL);
    805  assert(VP8LAddVectorEq != NULL);
    806  assert(VP8LVectorMismatch != NULL);
    807  assert(VP8LBundleColorMap != NULL);
    808  assert(VP8LPredictorsSub[0] != NULL);
    809  assert(VP8LPredictorsSub[1] != NULL);
    810  assert(VP8LPredictorsSub[2] != NULL);
    811  assert(VP8LPredictorsSub[3] != NULL);
    812  assert(VP8LPredictorsSub[4] != NULL);
    813  assert(VP8LPredictorsSub[5] != NULL);
    814  assert(VP8LPredictorsSub[6] != NULL);
    815  assert(VP8LPredictorsSub[7] != NULL);
    816  assert(VP8LPredictorsSub[8] != NULL);
    817  assert(VP8LPredictorsSub[9] != NULL);
    818  assert(VP8LPredictorsSub[10] != NULL);
    819  assert(VP8LPredictorsSub[11] != NULL);
    820  assert(VP8LPredictorsSub[12] != NULL);
    821  assert(VP8LPredictorsSub[13] != NULL);
    822  assert(VP8LPredictorsSub[14] != NULL);
    823  assert(VP8LPredictorsSub[15] != NULL);
    824  assert(VP8LPredictorsSub_C[0] != NULL);
    825  assert(VP8LPredictorsSub_C[1] != NULL);
    826  assert(VP8LPredictorsSub_C[2] != NULL);
    827  assert(VP8LPredictorsSub_C[3] != NULL);
    828  assert(VP8LPredictorsSub_C[4] != NULL);
    829  assert(VP8LPredictorsSub_C[5] != NULL);
    830  assert(VP8LPredictorsSub_C[6] != NULL);
    831  assert(VP8LPredictorsSub_C[7] != NULL);
    832  assert(VP8LPredictorsSub_C[8] != NULL);
    833  assert(VP8LPredictorsSub_C[9] != NULL);
    834  assert(VP8LPredictorsSub_C[10] != NULL);
    835  assert(VP8LPredictorsSub_C[11] != NULL);
    836  assert(VP8LPredictorsSub_C[12] != NULL);
    837  assert(VP8LPredictorsSub_C[13] != NULL);
    838  assert(VP8LPredictorsSub_C[14] != NULL);
    839  assert(VP8LPredictorsSub_C[15] != NULL);
    840 }
    841 
    842 //------------------------------------------------------------------------------