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