go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

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 //------------------------------------------------------------------------------