• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 const 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.
52 const 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 
314 const 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 
GetResidualCost_C(int ctx0,const VP8Residual * const res)322 static 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 
SetResidualCoeffs_C(const int16_t * const coeffs,VP8Residual * const res)357 static 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 
374 VP8GetResidualCostFunc VP8GetResidualCost;
375 VP8SetResidualCoeffsFunc VP8SetResidualCoeffs;
376 
377 extern void VP8EncDspCostInitMIPS32(void);
378 extern void VP8EncDspCostInitMIPSdspR2(void);
379 extern void VP8EncDspCostInitSSE2(void);
380 extern void VP8EncDspCostInitNEON(void);
381 
WEBP_DSP_INIT_FUNC(VP8EncDspCostInit)382 WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) {
383   VP8GetResidualCost = GetResidualCost_C;
384   VP8SetResidualCoeffs = SetResidualCoeffs_C;
385 
386   // If defined, use CPUInfo() to overwrite some pointers with faster versions.
387   if (VP8GetCPUInfo != NULL) {
388 #if defined(WEBP_USE_MIPS32)
389     if (VP8GetCPUInfo(kMIPS32)) {
390       VP8EncDspCostInitMIPS32();
391     }
392 #endif
393 #if defined(WEBP_USE_MIPS_DSP_R2)
394     if (VP8GetCPUInfo(kMIPSdspR2)) {
395       VP8EncDspCostInitMIPSdspR2();
396     }
397 #endif
398 #if defined(WEBP_HAVE_SSE2)
399     if (VP8GetCPUInfo(kSSE2)) {
400       VP8EncDspCostInitSSE2();
401     }
402 #endif
403 #if defined(WEBP_HAVE_NEON)
404     if (VP8GetCPUInfo(kNEON)) {
405       VP8EncDspCostInitNEON();
406     }
407 #endif
408   }
409 }
410 
411 //------------------------------------------------------------------------------
412