go-libwebp

Experimental translation from libwebp to Go source.
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 //------------------------------------------------------------------------------