Coverage Report

Created: 2025-11-16 06:41

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