cost.c (18460B)
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 static int GetResidualCost_C(int ctx0, const VP8Residual* const res) { 330 int n = res->first; 331 // should be prob[VP8EncBands[n]], but it's equivalent for n=0 or 1 332 const int p0 = res->prob[n][ctx0][0]; 333 CostArrayPtr const costs = res->costs; 334 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 int cost = (ctx0 == 0) ? VP8BitCost(1, p0) : 0; 339 340 if (res->last < 0) { 341 return VP8BitCost(0, p0); 342 } 343 for (; n < res->last; ++n) { 344 const int v = abs(res->coeffs[n]); 345 const int ctx = (v >= 2) ? 2 : v; 346 cost += VP8LevelCost(t, v); 347 t = costs[n + 1][ctx]; 348 } 349 // Last coefficient is always non-zero 350 { 351 const int v = abs(res->coeffs[n]); 352 assert(v != 0); 353 cost += VP8LevelCost(t, v); 354 if (n < 15) { 355 const int b = VP8EncBands[n + 1]; 356 const int ctx = (v == 1) ? 1 : 2; 357 const int last_p0 = res->prob[b][ctx][0]; 358 cost += VP8BitCost(0, last_p0); 359 } 360 } 361 return cost; 362 } 363 364 static void SetResidualCoeffs_C(const int16_t* WEBP_RESTRICT const coeffs, 365 VP8Residual* WEBP_RESTRICT const res) { 366 int n; 367 res->last = -1; 368 assert(res->first == 0 || coeffs[0] == 0); 369 for (n = 15; n >= 0; --n) { 370 if (coeffs[n]) { 371 res->last = n; 372 break; 373 } 374 } 375 res->coeffs = coeffs; 376 } 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 WEBP_DSP_INIT_FUNC(VP8EncDspCostInit) { 391 VP8GetResidualCost = GetResidualCost_C; 392 VP8SetResidualCoeffs = SetResidualCoeffs_C; 393 394 // If defined, use CPUInfo() to overwrite some pointers with faster versions. 395 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 #if defined(WEBP_HAVE_SSE2) 407 if (VP8GetCPUInfo(kSSE2)) { 408 VP8EncDspCostInitSSE2(); 409 } 410 #endif 411 #if defined(WEBP_HAVE_NEON) 412 if (VP8GetCPUInfo(kNEON)) { 413 VP8EncDspCostInitNEON(); 414 } 415 #endif 416 } 417 } 418 419 //------------------------------------------------------------------------------