Coverage Report

Created: 2026-05-16 07:22

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
322M
static uint64_t FastSLog2Slow_C(uint32_t v) {
252
322M
  assert(v >= LOG_LOOKUP_IDX_MAX);
253
322M
  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
254
271M
    const uint64_t orig_v = v;
255
271M
    uint64_t correction;
256
271M
#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
257
    // use clz if available
258
271M
    const uint64_t log_cnt = BitsLog2Floor(v) - 7;
259
271M
    const uint32_t y = 1 << log_cnt;
260
271M
    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
271M
    correction = LOG_2_RECIPROCAL_FIXED * (orig_v & (y - 1));
276
271M
    return orig_v * (kLog2Table[v] + (log_cnt << LOG_2_PRECISION_BITS)) +
277
271M
           correction;
278
271M
  } else {
279
50.8M
    return (uint64_t)(LOG_2_RECIPROCAL_FIXED_DOUBLE * v * log((double)v) + .5);
280
50.8M
  }
281
322M
}
282
283
86.7k
static uint32_t FastLog2Slow_C(uint32_t v) {
284
86.7k
  assert(v >= LOG_LOOKUP_IDX_MAX);
285
86.7k
  if (v < APPROX_LOG_WITH_CORRECTION_MAX) {
286
85.9k
    const uint32_t orig_v = v;
287
85.9k
    uint32_t log_2;
288
85.9k
#if !defined(WEBP_HAVE_SLOW_CLZ_CTZ)
289
    // use clz if available
290
85.9k
    const uint32_t log_cnt = BitsLog2Floor(v) - 7;
291
85.9k
    const uint32_t y = 1 << log_cnt;
292
85.9k
    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
85.9k
    log_2 = kLog2Table[v] + (log_cnt << LOG_2_PRECISION_BITS);
303
85.9k
    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
7.81k
      const uint64_t correction = LOG_2_RECIPROCAL_FIXED * (orig_v & (y - 1));
307
7.81k
      log_2 += (uint32_t)DivRound(correction, orig_v);
308
7.81k
    }
309
85.9k
    return log_2;
310
85.9k
  } else {
311
856
    return (uint32_t)(LOG_2_RECIPROCAL_FIXED_DOUBLE * log((double)v) + .5);
312
856
  }
313
86.7k
}
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
5.32k
static uint64_t ShannonEntropy_C(const uint32_t* X, int n) {
342
5.32k
  int i;
343
5.32k
  uint64_t retval = 0;
344
5.32k
  uint32_t sumX = 0;
345
1.11M
  for (i = 0; i < n; ++i) {
346
1.10M
    const int x = X[i];
347
1.10M
    if (x != 0) {
348
66.0k
      sumX += x;
349
66.0k
      retval += VP8LFastSLog2(x);
350
66.0k
    }
351
1.10M
  }
352
5.32k
  retval = VP8LFastSLog2(sumX) - retval;
353
5.32k
  return retval;
354
5.32k
}
355
356
50.2M
void VP8LBitEntropyInit(VP8LBitEntropy* const entropy) {
357
50.2M
  entropy->entropy = 0;
358
50.2M
  entropy->sum = 0;
359
50.2M
  entropy->nonzeros = 0;
360
50.2M
  entropy->max_val = 0;
361
50.2M
  entropy->nonzero_code = VP8L_NON_TRIVIAL_SYM;
362
50.2M
}
363
364
void VP8LBitsEntropyUnrefined(const uint32_t* WEBP_RESTRICT const array, int n,
365
22.4k
                              VP8LBitEntropy* WEBP_RESTRICT const entropy) {
366
22.4k
  int i;
367
368
22.4k
  VP8LBitEntropyInit(entropy);
369
370
5.75M
  for (i = 0; i < n; ++i) {
371
5.73M
    if (array[i] != 0) {
372
2.62M
      entropy->sum += array[i];
373
2.62M
      entropy->nonzero_code = i;
374
2.62M
      ++entropy->nonzeros;
375
2.62M
      entropy->entropy += VP8LFastSLog2(array[i]);
376
2.62M
      if (entropy->max_val < array[i]) {
377
89.3k
        entropy->max_val = array[i];
378
89.3k
      }
379
2.62M
    }
380
5.73M
  }
381
22.4k
  entropy->entropy = VP8LFastSLog2(entropy->sum) - entropy->entropy;
382
22.4k
}
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
2.68G
    VP8LStreaks* WEBP_RESTRICT const stats) {
389
2.68G
  const int streak = i - *i_prev;
390
391
  // Gather info for the bit entropy.
392
2.68G
  if (*val_prev != 0) {
393
2.03G
    bit_entropy->sum += (*val_prev) * streak;
394
2.03G
    bit_entropy->nonzeros += streak;
395
2.03G
    bit_entropy->nonzero_code = *i_prev;
396
2.03G
    bit_entropy->entropy += VP8LFastSLog2(*val_prev) * streak;
397
2.03G
    if (bit_entropy->max_val < *val_prev) {
398
143M
      bit_entropy->max_val = *val_prev;
399
143M
    }
400
2.03G
  }
401
402
  // Gather info for the Huffman cost.
403
2.68G
  stats->counts[*val_prev != 0] += (streak > 3);
404
2.68G
  stats->streaks[*val_prev != 0][(streak > 3)] += streak;
405
406
2.68G
  *val_prev = val;
407
2.68G
  *i_prev = i;
408
2.68G
}
409
410
static void GetEntropyUnrefined_C(
411
    const uint32_t X[], int length,
412
    VP8LBitEntropy* WEBP_RESTRICT const bit_entropy,
413
5.21M
    VP8LStreaks* WEBP_RESTRICT const stats) {
414
5.21M
  int i;
415
5.21M
  int i_prev = 0;
416
5.21M
  uint32_t x_prev = X[0];
417
418
5.21M
  memset(stats, 0, sizeof(*stats));
419
5.21M
  VP8LBitEntropyInit(bit_entropy);
420
421
1.20G
  for (i = 1; i < length; ++i) {
422
1.19G
    const uint32_t x = X[i];
423
1.19G
    if (x != x_prev) {
424
32.7M
      GetEntropyUnrefinedHelper(x, i, &x_prev, &i_prev, bit_entropy, stats);
425
32.7M
    }
426
1.19G
  }
427
5.21M
  GetEntropyUnrefinedHelper(0, i, &x_prev, &i_prev, bit_entropy, stats);
428
429
5.21M
  bit_entropy->entropy = VP8LFastSLog2(bit_entropy->sum) - bit_entropy->entropy;
430
5.21M
}
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
45.0M
    VP8LStreaks* WEBP_RESTRICT const stats) {
436
45.0M
  int i = 1;
437
45.0M
  int i_prev = 0;
438
45.0M
  uint32_t xy_prev = X[0] + Y[0];
439
440
45.0M
  memset(stats, 0, sizeof(*stats));
441
45.0M
  VP8LBitEntropyInit(bit_entropy);
442
443
12.3G
  for (i = 1; i < length; ++i) {
444
12.2G
    const uint32_t xy = X[i] + Y[i];
445
12.2G
    if (xy != xy_prev) {
446
2.59G
      GetEntropyUnrefinedHelper(xy, i, &xy_prev, &i_prev, bit_entropy, stats);
447
2.59G
    }
448
12.2G
  }
449
45.0M
  GetEntropyUnrefinedHelper(0, i, &xy_prev, &i_prev, bit_entropy, stats);
450
451
45.0M
  bit_entropy->entropy = VP8LFastSLog2(bit_entropy->sum) - bit_entropy->entropy;
452
45.0M
}
453
454
//------------------------------------------------------------------------------
455
456
55
void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) {
457
55
  int i;
458
172
  for (i = 0; i < num_pixels; ++i) {
459
117
    const int argb = (int)argb_data[i];
460
117
    const int green = (argb >> 8) & 0xff;
461
117
    const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff;
462
117
    const uint32_t new_b = (((argb >> 0) & 0xff) - green) & 0xff;
463
117
    argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b;
464
117
  }
465
55
}
466
467
25.6M
static WEBP_INLINE int ColorTransformDelta(int8_t color_pred, int8_t color) {
468
25.6M
  return ((int)color_pred * color) >> 5;
469
25.6M
}
470
471
25.4M
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
128k
                          uint32_t* WEBP_RESTRICT data, int num_pixels) {
475
128k
  int i;
476
377k
  for (i = 0; i < num_pixels; ++i) {
477
248k
    const uint32_t argb = data[i];
478
248k
    const int8_t green = U32ToS8(argb >> 8);
479
248k
    const int8_t red = U32ToS8(argb >> 16);
480
248k
    int new_red = red & 0xff;
481
248k
    int new_blue = argb & 0xff;
482
248k
    new_red -= ColorTransformDelta((int8_t)m->green_to_red, green);
483
248k
    new_red &= 0xff;
484
248k
    new_blue -= ColorTransformDelta((int8_t)m->green_to_blue, green);
485
248k
    new_blue -= ColorTransformDelta((int8_t)m->red_to_blue, red);
486
248k
    new_blue &= 0xff;
487
248k
    data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue);
488
248k
  }
489
128k
}
490
491
static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red,
492
3.23M
                                             uint32_t argb) {
493
3.23M
  const int8_t green = U32ToS8(argb >> 8);
494
3.23M
  int new_red = argb >> 16;
495
3.23M
  new_red -= ColorTransformDelta((int8_t)green_to_red, green);
496
3.23M
  return (new_red & 0xff);
497
3.23M
}
498
499
static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue,
500
                                              uint8_t red_to_blue,
501
10.8M
                                              uint32_t argb) {
502
10.8M
  const int8_t green = U32ToS8(argb >> 8);
503
10.8M
  const int8_t red = U32ToS8(argb >> 16);
504
10.8M
  int new_blue = argb & 0xff;
505
10.8M
  new_blue -= ColorTransformDelta((int8_t)green_to_blue, green);
506
10.8M
  new_blue -= ColorTransformDelta((int8_t)red_to_blue, red);
507
10.8M
  return (new_blue & 0xff);
508
10.8M
}
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
99.8k
                                     uint32_t histo[]) {
514
1.77M
  while (tile_height-- > 0) {
515
1.67M
    int x;
516
4.90M
    for (x = 0; x < tile_width; ++x) {
517
3.23M
      ++histo[TransformColorRed((uint8_t)green_to_red, argb[x])];
518
3.23M
    }
519
1.67M
    argb += stride;
520
1.67M
  }
521
99.8k
}
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
337k
                                      int red_to_blue, uint32_t histo[]) {
527
5.96M
  while (tile_height-- > 0) {
528
5.62M
    int x;
529
16.4M
    for (x = 0; x < tile_width; ++x) {
530
10.8M
      ++histo[TransformColorBlue((uint8_t)green_to_blue, (uint8_t)red_to_blue,
531
10.8M
                                 argb[x])];
532
10.8M
    }
533
5.62M
    argb += stride;
534
5.62M
  }
535
337k
}
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
714k
                          int xbits, uint32_t* WEBP_RESTRICT dst) {
552
714k
  int x;
553
714k
  if (xbits > 0) {
554
523k
    const int bit_depth = 1 << (3 - xbits);
555
523k
    const int mask = (1 << xbits) - 1;
556
523k
    uint32_t code = 0xff000000;
557
4.29M
    for (x = 0; x < width; ++x) {
558
3.77M
      const int xsub = x & mask;
559
3.77M
      if (xsub == 0) {
560
862k
        code = 0xff000000;
561
862k
      }
562
3.77M
      code |= row[x] << (8 + bit_depth * xsub);
563
3.77M
      dst[x >> xbits] = code;
564
3.77M
    }
565
523k
  } else {
566
1.79M
    for (x = 0; x < width; ++x) dst[x] = 0xff000000 | (row[x] << 8);
567
191k
  }
568
714k
}
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
719k
                            int num_pixels, uint32_t* WEBP_RESTRICT out) {
602
719k
  int i;
603
2.55M
  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], ARGB_BLACK);
604
719k
  (void)upper;
605
719k
}
606
607
static void PredictorSub1_C(const uint32_t* in, const uint32_t* upper,
608
1.00M
                            int num_pixels, uint32_t* WEBP_RESTRICT out) {
609
1.00M
  int i;
610
3.54M
  for (i = 0; i < num_pixels; ++i) out[i] = VP8LSubPixels(in[i], in[i - 1]);
611
1.00M
  (void)upper;
612
1.00M
}
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
15.4M
      uint32_t* WEBP_RESTRICT out) {                             \
620
15.4M
    int x;                                                       \
621
15.4M
    assert(upper != NULL);                                       \
622
44.8M
    for (x = 0; x < num_pixels; ++x) {                           \
623
29.3M
      const uint32_t pred =                                      \
624
29.3M
          VP8LPredictor##PREDICTOR_I##_C(&in[x - 1], upper + x); \
625
29.3M
      out[x] = VP8LSubPixels(in[x], pred);                       \
626
29.3M
    }                                                            \
627
15.4M
  }
628
629
7.39M
GENERATE_PREDICTOR_SUB(2)
630
734k
GENERATE_PREDICTOR_SUB(3)
631
757k
GENERATE_PREDICTOR_SUB(4)
632
766k
GENERATE_PREDICTOR_SUB(5)
633
723k
GENERATE_PREDICTOR_SUB(6)
634
709k
GENERATE_PREDICTOR_SUB(7)
635
716k
GENERATE_PREDICTOR_SUB(8)
636
727k
GENERATE_PREDICTOR_SUB(9)
637
743k
GENERATE_PREDICTOR_SUB(10)
638
744k
GENERATE_PREDICTOR_SUB(11)
639
745k
GENERATE_PREDICTOR_SUB(12)
640
713k
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
1
WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
686
1
  VP8LDspInit();
687
688
1
#if !WEBP_NEON_OMIT_C_CODE
689
1
  VP8LSubtractGreenFromBlueAndRed = VP8LSubtractGreenFromBlueAndRed_C;
690
691
1
  VP8LTransformColor = VP8LTransformColor_C;
692
1
#endif
693
694
1
  VP8LCollectColorBlueTransforms = VP8LCollectColorBlueTransforms_C;
695
1
  VP8LCollectColorRedTransforms = VP8LCollectColorRedTransforms_C;
696
697
1
  VP8LFastLog2Slow = FastLog2Slow_C;
698
1
  VP8LFastSLog2Slow = FastSLog2Slow_C;
699
700
1
  VP8LExtraCost = ExtraCost_C;
701
1
  VP8LCombinedShannonEntropy = CombinedShannonEntropy_C;
702
1
  VP8LShannonEntropy = ShannonEntropy_C;
703
704
1
  VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
705
1
  VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
706
707
1
  VP8LAddVector = AddVector_C;
708
1
  VP8LAddVectorEq = AddVectorEq_C;
709
710
1
  VP8LVectorMismatch = VectorMismatch_C;
711
1
  VP8LBundleColorMap = VP8LBundleColorMap_C;
712
713
1
  VP8LPredictorsSub[0] = PredictorSub0_C;
714
1
  VP8LPredictorsSub[1] = PredictorSub1_C;
715
1
  VP8LPredictorsSub[2] = PredictorSub2_C;
716
1
  VP8LPredictorsSub[3] = PredictorSub3_C;
717
1
  VP8LPredictorsSub[4] = PredictorSub4_C;
718
1
  VP8LPredictorsSub[5] = PredictorSub5_C;
719
1
  VP8LPredictorsSub[6] = PredictorSub6_C;
720
1
  VP8LPredictorsSub[7] = PredictorSub7_C;
721
1
  VP8LPredictorsSub[8] = PredictorSub8_C;
722
1
  VP8LPredictorsSub[9] = PredictorSub9_C;
723
1
  VP8LPredictorsSub[10] = PredictorSub10_C;
724
1
  VP8LPredictorsSub[11] = PredictorSub11_C;
725
1
  VP8LPredictorsSub[12] = PredictorSub12_C;
726
1
  VP8LPredictorsSub[13] = PredictorSub13_C;
727
1
  VP8LPredictorsSub[14] = PredictorSub0_C;  // <- padding security sentinels
728
1
  VP8LPredictorsSub[15] = PredictorSub0_C;
729
730
1
  VP8LPredictorsSub_C[0] = PredictorSub0_C;
731
1
  VP8LPredictorsSub_C[1] = PredictorSub1_C;
732
1
  VP8LPredictorsSub_C[2] = PredictorSub2_C;
733
1
  VP8LPredictorsSub_C[3] = PredictorSub3_C;
734
1
  VP8LPredictorsSub_C[4] = PredictorSub4_C;
735
1
  VP8LPredictorsSub_C[5] = PredictorSub5_C;
736
1
  VP8LPredictorsSub_C[6] = PredictorSub6_C;
737
1
  VP8LPredictorsSub_C[7] = PredictorSub7_C;
738
1
  VP8LPredictorsSub_C[8] = PredictorSub8_C;
739
1
  VP8LPredictorsSub_C[9] = PredictorSub9_C;
740
1
  VP8LPredictorsSub_C[10] = PredictorSub10_C;
741
1
  VP8LPredictorsSub_C[11] = PredictorSub11_C;
742
1
  VP8LPredictorsSub_C[12] = PredictorSub12_C;
743
1
  VP8LPredictorsSub_C[13] = PredictorSub13_C;
744
1
  VP8LPredictorsSub_C[14] = PredictorSub0_C;  // <- padding security sentinels
745
1
  VP8LPredictorsSub_C[15] = PredictorSub0_C;
746
747
  // If defined, use CPUInfo() to overwrite some pointers with faster versions.
748
1
  if (VP8GetCPUInfo != NULL) {
749
1
#if defined(WEBP_HAVE_SSE2)
750
1
    if (VP8GetCPUInfo(kSSE2)) {
751
1
      VP8LEncDspInitSSE2();
752
1
#if defined(WEBP_HAVE_SSE41)
753
1
      if (VP8GetCPUInfo(kSSE4_1)) {
754
1
        VP8LEncDspInitSSE41();
755
#if defined(WEBP_HAVE_AVX2)
756
        if (VP8GetCPUInfo(kAVX2)) {
757
          VP8LEncDspInitAVX2();
758
        }
759
#endif
760
1
      }
761
1
#endif
762
1
    }
763
1
#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
1
  }
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
1
  assert(VP8LSubtractGreenFromBlueAndRed != NULL);
789
1
  assert(VP8LTransformColor != NULL);
790
1
  assert(VP8LCollectColorBlueTransforms != NULL);
791
1
  assert(VP8LCollectColorRedTransforms != NULL);
792
1
  assert(VP8LFastLog2Slow != NULL);
793
1
  assert(VP8LFastSLog2Slow != NULL);
794
1
  assert(VP8LExtraCost != NULL);
795
1
  assert(VP8LCombinedShannonEntropy != NULL);
796
1
  assert(VP8LShannonEntropy != NULL);
797
1
  assert(VP8LGetEntropyUnrefined != NULL);
798
1
  assert(VP8LGetCombinedEntropyUnrefined != NULL);
799
1
  assert(VP8LAddVector != NULL);
800
1
  assert(VP8LAddVectorEq != NULL);
801
1
  assert(VP8LVectorMismatch != NULL);
802
1
  assert(VP8LBundleColorMap != NULL);
803
1
  assert(VP8LPredictorsSub[0] != NULL);
804
1
  assert(VP8LPredictorsSub[1] != NULL);
805
1
  assert(VP8LPredictorsSub[2] != NULL);
806
1
  assert(VP8LPredictorsSub[3] != NULL);
807
1
  assert(VP8LPredictorsSub[4] != NULL);
808
1
  assert(VP8LPredictorsSub[5] != NULL);
809
1
  assert(VP8LPredictorsSub[6] != NULL);
810
1
  assert(VP8LPredictorsSub[7] != NULL);
811
1
  assert(VP8LPredictorsSub[8] != NULL);
812
1
  assert(VP8LPredictorsSub[9] != NULL);
813
1
  assert(VP8LPredictorsSub[10] != NULL);
814
1
  assert(VP8LPredictorsSub[11] != NULL);
815
1
  assert(VP8LPredictorsSub[12] != NULL);
816
1
  assert(VP8LPredictorsSub[13] != NULL);
817
1
  assert(VP8LPredictorsSub[14] != NULL);
818
1
  assert(VP8LPredictorsSub[15] != NULL);
819
1
  assert(VP8LPredictorsSub_C[0] != NULL);
820
1
  assert(VP8LPredictorsSub_C[1] != NULL);
821
1
  assert(VP8LPredictorsSub_C[2] != NULL);
822
1
  assert(VP8LPredictorsSub_C[3] != NULL);
823
1
  assert(VP8LPredictorsSub_C[4] != NULL);
824
1
  assert(VP8LPredictorsSub_C[5] != NULL);
825
1
  assert(VP8LPredictorsSub_C[6] != NULL);
826
1
  assert(VP8LPredictorsSub_C[7] != NULL);
827
1
  assert(VP8LPredictorsSub_C[8] != NULL);
828
1
  assert(VP8LPredictorsSub_C[9] != NULL);
829
1
  assert(VP8LPredictorsSub_C[10] != NULL);
830
1
  assert(VP8LPredictorsSub_C[11] != NULL);
831
1
  assert(VP8LPredictorsSub_C[12] != NULL);
832
1
  assert(VP8LPredictorsSub_C[13] != NULL);
833
1
  assert(VP8LPredictorsSub_C[14] != NULL);
834
  assert(VP8LPredictorsSub_C[15] != NULL);
835
1
}
836
837
//------------------------------------------------------------------------------