Coverage Report

Created: 2025-06-16 07:00

/src/libwebp/src/dsp/cost.c
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2014 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
// Author: Skal (pascal.massimino@gmail.com)
11
12
#include <assert.h>
13
#include <stddef.h>
14
#include <stdlib.h>
15
16
#include "src/dsp/cpu.h"
17
#include "src/webp/types.h"
18
#include "src/dsp/dsp.h"
19
#include "src/enc/cost_enc.h"
20
#include "src/enc/vp8i_enc.h"
21
22
//------------------------------------------------------------------------------
23
// Boolean-cost cost table
24
25
const uint16_t VP8EntropyCost[256] = {
26
  1792, 1792, 1792, 1536, 1536, 1408, 1366, 1280, 1280, 1216,
27
  1178, 1152, 1110, 1076, 1061, 1024, 1024,  992,  968,  951,
28
   939,  911,  896,  878,  871,  854,  838,  820,  811,  794,
29
   786,  768,  768,  752,  740,  732,  720,  709,  704,  690,
30
   683,  672,  666,  655,  647,  640,  631,  622,  615,  607,
31
   598,  592,  586,  576,  572,  564,  559,  555,  547,  541,
32
   534,  528,  522,  512,  512,  504,  500,  494,  488,  483,
33
   477,  473,  467,  461,  458,  452,  448,  443,  438,  434,
34
   427,  424,  419,  415,  410,  406,  403,  399,  394,  390,
35
   384,  384,  377,  374,  370,  366,  362,  359,  355,  351,
36
   347,  342,  342,  336,  333,  330,  326,  323,  320,  316,
37
   312,  308,  305,  302,  299,  296,  293,  288,  287,  283,
38
   280,  277,  274,  272,  268,  266,  262,  256,  256,  256,
39
   251,  248,  245,  242,  240,  237,  234,  232,  228,  226,
40
   223,  221,  218,  216,  214,  211,  208,  205,  203,  201,
41
   198,  196,  192,  191,  188,  187,  183,  181,  179,  176,
42
   175,  171,  171,  168,  165,  163,  160,  159,  156,  154,
43
   152,  150,  148,  146,  144,  142,  139,  138,  135,  133,
44
   131,  128,  128,  125,  123,  121,  119,  117,  115,  113,
45
   111,  110,  107,  105,  103,  102,  100,   98,   96,   94,
46
    92,   91,   89,   86,   86,   83,   82,   80,   77,   76,
47
    74,   73,   71,   69,   67,   66,   64,   63,   61,   59,
48
    57,   55,   54,   52,   51,   49,   47,   46,   44,   43,
49
    41,   40,   38,   36,   35,   33,   32,   30,   29,   27,
50
    25,   24,   22,   21,   19,   18,   16,   15,   13,   12,
51
    10,    9,    7,    6,    4,    3
52
};
53
54
//------------------------------------------------------------------------------
55
// Level cost tables
56
57
// fixed costs for coding levels, deduce from the coding tree.
58
// This is only the part that doesn't depend on the probability state.
59
const uint16_t VP8LevelFixedCosts[MAX_LEVEL + 1] = {
60
     0,  256,  256,  256,  256,  432,  618,  630,
61
   731,  640,  640,  828,  901,  948, 1021, 1101,
62
  1174, 1221, 1294, 1042, 1085, 1115, 1158, 1202,
63
  1245, 1275, 1318, 1337, 1380, 1410, 1453, 1497,
64
  1540, 1570, 1613, 1280, 1295, 1317, 1332, 1358,
65
  1373, 1395, 1410, 1454, 1469, 1491, 1506, 1532,
66
  1547, 1569, 1584, 1601, 1616, 1638, 1653, 1679,
67
  1694, 1716, 1731, 1775, 1790, 1812, 1827, 1853,
68
  1868, 1890, 1905, 1727, 1733, 1742, 1748, 1759,
69
  1765, 1774, 1780, 1800, 1806, 1815, 1821, 1832,
70
  1838, 1847, 1853, 1878, 1884, 1893, 1899, 1910,
71
  1916, 1925, 1931, 1951, 1957, 1966, 1972, 1983,
72
  1989, 1998, 2004, 2027, 2033, 2042, 2048, 2059,
73
  2065, 2074, 2080, 2100, 2106, 2115, 2121, 2132,
74
  2138, 2147, 2153, 2178, 2184, 2193, 2199, 2210,
75
  2216, 2225, 2231, 2251, 2257, 2266, 2272, 2283,
76
  2289, 2298, 2304, 2168, 2174, 2183, 2189, 2200,
77
  2206, 2215, 2221, 2241, 2247, 2256, 2262, 2273,
78
  2279, 2288, 2294, 2319, 2325, 2334, 2340, 2351,
79
  2357, 2366, 2372, 2392, 2398, 2407, 2413, 2424,
80
  2430, 2439, 2445, 2468, 2474, 2483, 2489, 2500,
81
  2506, 2515, 2521, 2541, 2547, 2556, 2562, 2573,
82
  2579, 2588, 2594, 2619, 2625, 2634, 2640, 2651,
83
  2657, 2666, 2672, 2692, 2698, 2707, 2713, 2724,
84
  2730, 2739, 2745, 2540, 2546, 2555, 2561, 2572,
85
  2578, 2587, 2593, 2613, 2619, 2628, 2634, 2645,
86
  2651, 2660, 2666, 2691, 2697, 2706, 2712, 2723,
87
  2729, 2738, 2744, 2764, 2770, 2779, 2785, 2796,
88
  2802, 2811, 2817, 2840, 2846, 2855, 2861, 2872,
89
  2878, 2887, 2893, 2913, 2919, 2928, 2934, 2945,
90
  2951, 2960, 2966, 2991, 2997, 3006, 3012, 3023,
91
  3029, 3038, 3044, 3064, 3070, 3079, 3085, 3096,
92
  3102, 3111, 3117, 2981, 2987, 2996, 3002, 3013,
93
  3019, 3028, 3034, 3054, 3060, 3069, 3075, 3086,
94
  3092, 3101, 3107, 3132, 3138, 3147, 3153, 3164,
95
  3170, 3179, 3185, 3205, 3211, 3220, 3226, 3237,
96
  3243, 3252, 3258, 3281, 3287, 3296, 3302, 3313,
97
  3319, 3328, 3334, 3354, 3360, 3369, 3375, 3386,
98
  3392, 3401, 3407, 3432, 3438, 3447, 3453, 3464,
99
  3470, 3479, 3485, 3505, 3511, 3520, 3526, 3537,
100
  3543, 3552, 3558, 2816, 2822, 2831, 2837, 2848,
101
  2854, 2863, 2869, 2889, 2895, 2904, 2910, 2921,
102
  2927, 2936, 2942, 2967, 2973, 2982, 2988, 2999,
103
  3005, 3014, 3020, 3040, 3046, 3055, 3061, 3072,
104
  3078, 3087, 3093, 3116, 3122, 3131, 3137, 3148,
105
  3154, 3163, 3169, 3189, 3195, 3204, 3210, 3221,
106
  3227, 3236, 3242, 3267, 3273, 3282, 3288, 3299,
107
  3305, 3314, 3320, 3340, 3346, 3355, 3361, 3372,
108
  3378, 3387, 3393, 3257, 3263, 3272, 3278, 3289,
109
  3295, 3304, 3310, 3330, 3336, 3345, 3351, 3362,
110
  3368, 3377, 3383, 3408, 3414, 3423, 3429, 3440,
111
  3446, 3455, 3461, 3481, 3487, 3496, 3502, 3513,
112
  3519, 3528, 3534, 3557, 3563, 3572, 3578, 3589,
113
  3595, 3604, 3610, 3630, 3636, 3645, 3651, 3662,
114
  3668, 3677, 3683, 3708, 3714, 3723, 3729, 3740,
115
  3746, 3755, 3761, 3781, 3787, 3796, 3802, 3813,
116
  3819, 3828, 3834, 3629, 3635, 3644, 3650, 3661,
117
  3667, 3676, 3682, 3702, 3708, 3717, 3723, 3734,
118
  3740, 3749, 3755, 3780, 3786, 3795, 3801, 3812,
119
  3818, 3827, 3833, 3853, 3859, 3868, 3874, 3885,
120
  3891, 3900, 3906, 3929, 3935, 3944, 3950, 3961,
121
  3967, 3976, 3982, 4002, 4008, 4017, 4023, 4034,
122
  4040, 4049, 4055, 4080, 4086, 4095, 4101, 4112,
123
  4118, 4127, 4133, 4153, 4159, 4168, 4174, 4185,
124
  4191, 4200, 4206, 4070, 4076, 4085, 4091, 4102,
125
  4108, 4117, 4123, 4143, 4149, 4158, 4164, 4175,
126
  4181, 4190, 4196, 4221, 4227, 4236, 4242, 4253,
127
  4259, 4268, 4274, 4294, 4300, 4309, 4315, 4326,
128
  4332, 4341, 4347, 4370, 4376, 4385, 4391, 4402,
129
  4408, 4417, 4423, 4443, 4449, 4458, 4464, 4475,
130
  4481, 4490, 4496, 4521, 4527, 4536, 4542, 4553,
131
  4559, 4568, 4574, 4594, 4600, 4609, 4615, 4626,
132
  4632, 4641, 4647, 3515, 3521, 3530, 3536, 3547,
133
  3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620,
134
  3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698,
135
  3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771,
136
  3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847,
137
  3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920,
138
  3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998,
139
  4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071,
140
  4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988,
141
  3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061,
142
  4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139,
143
  4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212,
144
  4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288,
145
  4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361,
146
  4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439,
147
  4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512,
148
  4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360,
149
  4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433,
150
  4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511,
151
  4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584,
152
  4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660,
153
  4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733,
154
  4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811,
155
  4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884,
156
  4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801,
157
  4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874,
158
  4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952,
159
  4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025,
160
  5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101,
161
  5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174,
162
  5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252,
163
  5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325,
164
  5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636,
165
  4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709,
166
  4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787,
167
  4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860,
168
  4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936,
169
  4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009,
170
  5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087,
171
  5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160,
172
  5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077,
173
  5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150,
174
  5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228,
175
  5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301,
176
  5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377,
177
  5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450,
178
  5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528,
179
  5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601,
180
  5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449,
181
  5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522,
182
  5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600,
183
  5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673,
184
  5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749,
185
  5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822,
186
  5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900,
187
  5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973,
188
  5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890,
189
  5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963,
190
  5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041,
191
  6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114,
192
  6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190,
193
  6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263,
194
  6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341,
195
  6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414,
196
  6420, 6429, 6435, 3515, 3521, 3530, 3536, 3547,
197
  3553, 3562, 3568, 3588, 3594, 3603, 3609, 3620,
198
  3626, 3635, 3641, 3666, 3672, 3681, 3687, 3698,
199
  3704, 3713, 3719, 3739, 3745, 3754, 3760, 3771,
200
  3777, 3786, 3792, 3815, 3821, 3830, 3836, 3847,
201
  3853, 3862, 3868, 3888, 3894, 3903, 3909, 3920,
202
  3926, 3935, 3941, 3966, 3972, 3981, 3987, 3998,
203
  4004, 4013, 4019, 4039, 4045, 4054, 4060, 4071,
204
  4077, 4086, 4092, 3956, 3962, 3971, 3977, 3988,
205
  3994, 4003, 4009, 4029, 4035, 4044, 4050, 4061,
206
  4067, 4076, 4082, 4107, 4113, 4122, 4128, 4139,
207
  4145, 4154, 4160, 4180, 4186, 4195, 4201, 4212,
208
  4218, 4227, 4233, 4256, 4262, 4271, 4277, 4288,
209
  4294, 4303, 4309, 4329, 4335, 4344, 4350, 4361,
210
  4367, 4376, 4382, 4407, 4413, 4422, 4428, 4439,
211
  4445, 4454, 4460, 4480, 4486, 4495, 4501, 4512,
212
  4518, 4527, 4533, 4328, 4334, 4343, 4349, 4360,
213
  4366, 4375, 4381, 4401, 4407, 4416, 4422, 4433,
214
  4439, 4448, 4454, 4479, 4485, 4494, 4500, 4511,
215
  4517, 4526, 4532, 4552, 4558, 4567, 4573, 4584,
216
  4590, 4599, 4605, 4628, 4634, 4643, 4649, 4660,
217
  4666, 4675, 4681, 4701, 4707, 4716, 4722, 4733,
218
  4739, 4748, 4754, 4779, 4785, 4794, 4800, 4811,
219
  4817, 4826, 4832, 4852, 4858, 4867, 4873, 4884,
220
  4890, 4899, 4905, 4769, 4775, 4784, 4790, 4801,
221
  4807, 4816, 4822, 4842, 4848, 4857, 4863, 4874,
222
  4880, 4889, 4895, 4920, 4926, 4935, 4941, 4952,
223
  4958, 4967, 4973, 4993, 4999, 5008, 5014, 5025,
224
  5031, 5040, 5046, 5069, 5075, 5084, 5090, 5101,
225
  5107, 5116, 5122, 5142, 5148, 5157, 5163, 5174,
226
  5180, 5189, 5195, 5220, 5226, 5235, 5241, 5252,
227
  5258, 5267, 5273, 5293, 5299, 5308, 5314, 5325,
228
  5331, 5340, 5346, 4604, 4610, 4619, 4625, 4636,
229
  4642, 4651, 4657, 4677, 4683, 4692, 4698, 4709,
230
  4715, 4724, 4730, 4755, 4761, 4770, 4776, 4787,
231
  4793, 4802, 4808, 4828, 4834, 4843, 4849, 4860,
232
  4866, 4875, 4881, 4904, 4910, 4919, 4925, 4936,
233
  4942, 4951, 4957, 4977, 4983, 4992, 4998, 5009,
234
  5015, 5024, 5030, 5055, 5061, 5070, 5076, 5087,
235
  5093, 5102, 5108, 5128, 5134, 5143, 5149, 5160,
236
  5166, 5175, 5181, 5045, 5051, 5060, 5066, 5077,
237
  5083, 5092, 5098, 5118, 5124, 5133, 5139, 5150,
238
  5156, 5165, 5171, 5196, 5202, 5211, 5217, 5228,
239
  5234, 5243, 5249, 5269, 5275, 5284, 5290, 5301,
240
  5307, 5316, 5322, 5345, 5351, 5360, 5366, 5377,
241
  5383, 5392, 5398, 5418, 5424, 5433, 5439, 5450,
242
  5456, 5465, 5471, 5496, 5502, 5511, 5517, 5528,
243
  5534, 5543, 5549, 5569, 5575, 5584, 5590, 5601,
244
  5607, 5616, 5622, 5417, 5423, 5432, 5438, 5449,
245
  5455, 5464, 5470, 5490, 5496, 5505, 5511, 5522,
246
  5528, 5537, 5543, 5568, 5574, 5583, 5589, 5600,
247
  5606, 5615, 5621, 5641, 5647, 5656, 5662, 5673,
248
  5679, 5688, 5694, 5717, 5723, 5732, 5738, 5749,
249
  5755, 5764, 5770, 5790, 5796, 5805, 5811, 5822,
250
  5828, 5837, 5843, 5868, 5874, 5883, 5889, 5900,
251
  5906, 5915, 5921, 5941, 5947, 5956, 5962, 5973,
252
  5979, 5988, 5994, 5858, 5864, 5873, 5879, 5890,
253
  5896, 5905, 5911, 5931, 5937, 5946, 5952, 5963,
254
  5969, 5978, 5984, 6009, 6015, 6024, 6030, 6041,
255
  6047, 6056, 6062, 6082, 6088, 6097, 6103, 6114,
256
  6120, 6129, 6135, 6158, 6164, 6173, 6179, 6190,
257
  6196, 6205, 6211, 6231, 6237, 6246, 6252, 6263,
258
  6269, 6278, 6284, 6309, 6315, 6324, 6330, 6341,
259
  6347, 6356, 6362, 6382, 6388, 6397, 6403, 6414,
260
  6420, 6429, 6435, 5303, 5309, 5318, 5324, 5335,
261
  5341, 5350, 5356, 5376, 5382, 5391, 5397, 5408,
262
  5414, 5423, 5429, 5454, 5460, 5469, 5475, 5486,
263
  5492, 5501, 5507, 5527, 5533, 5542, 5548, 5559,
264
  5565, 5574, 5580, 5603, 5609, 5618, 5624, 5635,
265
  5641, 5650, 5656, 5676, 5682, 5691, 5697, 5708,
266
  5714, 5723, 5729, 5754, 5760, 5769, 5775, 5786,
267
  5792, 5801, 5807, 5827, 5833, 5842, 5848, 5859,
268
  5865, 5874, 5880, 5744, 5750, 5759, 5765, 5776,
269
  5782, 5791, 5797, 5817, 5823, 5832, 5838, 5849,
270
  5855, 5864, 5870, 5895, 5901, 5910, 5916, 5927,
271
  5933, 5942, 5948, 5968, 5974, 5983, 5989, 6000,
272
  6006, 6015, 6021, 6044, 6050, 6059, 6065, 6076,
273
  6082, 6091, 6097, 6117, 6123, 6132, 6138, 6149,
274
  6155, 6164, 6170, 6195, 6201, 6210, 6216, 6227,
275
  6233, 6242, 6248, 6268, 6274, 6283, 6289, 6300,
276
  6306, 6315, 6321, 6116, 6122, 6131, 6137, 6148,
277
  6154, 6163, 6169, 6189, 6195, 6204, 6210, 6221,
278
  6227, 6236, 6242, 6267, 6273, 6282, 6288, 6299,
279
  6305, 6314, 6320, 6340, 6346, 6355, 6361, 6372,
280
  6378, 6387, 6393, 6416, 6422, 6431, 6437, 6448,
281
  6454, 6463, 6469, 6489, 6495, 6504, 6510, 6521,
282
  6527, 6536, 6542, 6567, 6573, 6582, 6588, 6599,
283
  6605, 6614, 6620, 6640, 6646, 6655, 6661, 6672,
284
  6678, 6687, 6693, 6557, 6563, 6572, 6578, 6589,
285
  6595, 6604, 6610, 6630, 6636, 6645, 6651, 6662,
286
  6668, 6677, 6683, 6708, 6714, 6723, 6729, 6740,
287
  6746, 6755, 6761, 6781, 6787, 6796, 6802, 6813,
288
  6819, 6828, 6834, 6857, 6863, 6872, 6878, 6889,
289
  6895, 6904, 6910, 6930, 6936, 6945, 6951, 6962,
290
  6968, 6977, 6983, 7008, 7014, 7023, 7029, 7040,
291
  7046, 7055, 7061, 7081, 7087, 7096, 7102, 7113,
292
  7119, 7128, 7134, 6392, 6398, 6407, 6413, 6424,
293
  6430, 6439, 6445, 6465, 6471, 6480, 6486, 6497,
294
  6503, 6512, 6518, 6543, 6549, 6558, 6564, 6575,
295
  6581, 6590, 6596, 6616, 6622, 6631, 6637, 6648,
296
  6654, 6663, 6669, 6692, 6698, 6707, 6713, 6724,
297
  6730, 6739, 6745, 6765, 6771, 6780, 6786, 6797,
298
  6803, 6812, 6818, 6843, 6849, 6858, 6864, 6875,
299
  6881, 6890, 6896, 6916, 6922, 6931, 6937, 6948,
300
  6954, 6963, 6969, 6833, 6839, 6848, 6854, 6865,
301
  6871, 6880, 6886, 6906, 6912, 6921, 6927, 6938,
302
  6944, 6953, 6959, 6984, 6990, 6999, 7005, 7016,
303
  7022, 7031, 7037, 7057, 7063, 7072, 7078, 7089,
304
  7095, 7104, 7110, 7133, 7139, 7148, 7154, 7165,
305
  7171, 7180, 7186, 7206, 7212, 7221, 7227, 7238,
306
  7244, 7253, 7259, 7284, 7290, 7299, 7305, 7316,
307
  7322, 7331, 7337, 7357, 7363, 7372, 7378, 7389,
308
  7395, 7404, 7410, 7205, 7211, 7220, 7226, 7237,
309
  7243, 7252, 7258, 7278, 7284, 7293, 7299, 7310,
310
  7316, 7325, 7331, 7356, 7362, 7371, 7377, 7388,
311
  7394, 7403, 7409, 7429, 7435, 7444, 7450, 7461,
312
  7467, 7476, 7482, 7505, 7511, 7520, 7526, 7537,
313
  7543, 7552, 7558, 7578, 7584, 7593, 7599, 7610,
314
  7616, 7625, 7631, 7656, 7662, 7671, 7677, 7688,
315
  7694, 7703, 7709, 7729, 7735, 7744, 7750, 7761
316
};
317
318
//------------------------------------------------------------------------------
319
// Tables for level coding
320
321
const uint8_t VP8EncBands[16 + 1] = {
322
  0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
323
  0  // sentinel
324
};
325
326
//------------------------------------------------------------------------------
327
// Mode costs
328
329
0
static int GetResidualCost_C(int ctx0, const VP8Residual* const res) {
330
0
  int n = res->first;
331
  // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1
332
0
  const int p0 = res->prob[n][ctx0][0];
333
0
  CostArrayPtr const costs = res->costs;
334
0
  const uint16_t* t = costs[n][ctx0];
335
  // bit_cost(1, p0) is already incorporated in t[] tables, but only if ctx != 0
336
  // (as required by the syntax). For ctx0 == 0, we need to add it here or it'll
337
  // be missing during the loop.
338
0
  int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0;
339
340
0
  if (res->last < 0) {
341
0
    return VP8BitCost(0, p0);
342
0
  }
343
0
  for (; n < res->last; ++n) {
344
0
    const int v = abs(res->coeffs[n]);
345
0
    const int ctx = (v >= 2) ? 2 : v;
346
0
    cost += VP8LevelCost(t, v);
347
0
    t = costs[n + 1][ctx];
348
0
  }
349
  // Last coefficient is always non-zero
350
0
  {
351
0
    const int v = abs(res->coeffs[n]);
352
0
    assert(v != 0);
353
0
    cost += VP8LevelCost(t, v);
354
0
    if (n < 15) {
355
0
      const int b = VP8EncBands[n + 1];
356
0
      const int ctx = (v == 1) ? 1 : 2;
357
0
      const int last_p0 = res->prob[b][ctx][0];
358
0
      cost += VP8BitCost(0, last_p0);
359
0
    }
360
0
  }
361
0
  return cost;
362
0
}
363
364
static void SetResidualCoeffs_C(const int16_t* WEBP_RESTRICT const coeffs,
365
0
                                VP8Residual* WEBP_RESTRICT const res) {
366
0
  int n;
367
0
  res->last = -1;
368
0
  assert(res->first == 0 || coeffs[0] == 0);
369
0
  for (n = 15; n >= 0; --n) {
370
0
    if (coeffs[n]) {
371
0
      res->last = n;
372
0
      break;
373
0
    }
374
0
  }
375
0
  res->coeffs = coeffs;
376
0
}
377
378
//------------------------------------------------------------------------------
379
// init function
380
381
VP8GetResidualCostFunc VP8GetResidualCost;
382
VP8SetResidualCoeffsFunc VP8SetResidualCoeffs;
383
384
extern VP8CPUInfo VP8GetCPUInfo;
385
extern void VP8EncDspCostInitMIPS32(void);
386
extern void VP8EncDspCostInitMIPSdspR2(void);
387
extern void VP8EncDspCostInitSSE2(void);
388
extern void VP8EncDspCostInitNEON(void);
389
390
1
WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) {
391
1
  VP8GetResidualCost = GetResidualCost_C;
392
1
  VP8SetResidualCoeffs = SetResidualCoeffs_C;
393
394
  // If defined, use CPUInfo() to overwrite some pointers with faster versions.
395
1
  if (VP8GetCPUInfo != NULL) {
396
#if defined(WEBP_USE_MIPS32)
397
    if (VP8GetCPUInfo(kMIPS32)) {
398
      VP8EncDspCostInitMIPS32();
399
    }
400
#endif
401
#if defined(WEBP_USE_MIPS_DSP_R2)
402
    if (VP8GetCPUInfo(kMIPSdspR2)) {
403
      VP8EncDspCostInitMIPSdspR2();
404
    }
405
#endif
406
1
#if defined(WEBP_HAVE_SSE2)
407
1
    if (VP8GetCPUInfo(kSSE2)) {
408
1
      VP8EncDspCostInitSSE2();
409
1
    }
410
1
#endif
411
#if defined(WEBP_HAVE_NEON)
412
    if (VP8GetCPUInfo(kNEON)) {
413
      VP8EncDspCostInitNEON();
414
    }
415
#endif
416
1
  }
417
1
}
418
419
//------------------------------------------------------------------------------