00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00029 #include "bgmc.h"
00030
00031
00032 #define FREQ_BITS 14 // bits used by frequency counters
00033 #define VALUE_BITS 18 // bits used to represent the values
00034 #define TOP_VALUE ((1 << VALUE_BITS) - 1) // maximum value
00035 #define FIRST_QTR (TOP_VALUE / 4 + 1) // first quarter of values maximum value
00036 #define HALF (2 * FIRST_QTR) // first half of values maximum value
00037 #define THIRD_QTR (3 * FIRST_QTR) // third quarter of values maximum value
00038
00039 #define LUT_BITS (FREQ_BITS - 8) // number of bits used to index lookup tables
00040 #define LUT_SIZE (1 << LUT_BITS) // size of the lookup tables
00041 #define LUT_BUFF 4 // number of buffered lookup tables
00042
00043
00046 static const uint16_t cf_tables_1[3][129] = {
00047 {
00048 16384, 16066, 15748, 15431, 15114, 14799, 14485, 14173, 13861, 13552,
00049 13243, 12939, 12635, 12336, 12038, 11745, 11452, 11161, 10870, 10586,
00050 10303, 10027, 9751, 9483, 9215, 8953, 8692, 8440, 8189, 7946,
00051 7704, 7472, 7240, 7008, 6776, 6554, 6333, 6122, 5912, 5711,
00052 5512, 5320, 5128, 4947, 4766, 4595, 4425, 4264, 4104, 3946,
00053 3788, 3640, 3493, 3355, 3218, 3090, 2963, 2842, 2721, 2609,
00054 2498, 2395, 2292, 2196, 2100, 2004, 1908, 1820, 1732, 1651,
00055 1570, 1497, 1424, 1355, 1287, 1223, 1161, 1100, 1044, 988,
00056 938, 888, 839, 790, 746, 702, 662, 623, 588, 553,
00057 520, 488, 459, 431, 405, 380, 357, 334, 311, 288,
00058 268, 248, 230, 213, 197, 182, 168, 154, 142, 130,
00059 119, 108, 99, 90, 81, 72, 64, 56, 49, 42,
00060 36, 30, 25, 20, 15, 11, 7, 3, 0
00061 },
00062 {
00063 16384, 16080, 15776, 15473, 15170, 14868, 14567, 14268, 13970, 13674,
00064 13378, 13086, 12794, 12505, 12218, 11936, 11654, 11373, 11092, 10818,
00065 10544, 10276, 10008, 9749, 9490, 9236, 8982, 8737, 8492, 8256,
00066 8020, 7792, 7564, 7336, 7108, 6888, 6669, 6459, 6249, 6050,
00067 5852, 5660, 5468, 5286, 5104, 4931, 4760, 4598, 4436, 4275,
00068 4115, 3965, 3816, 3674, 3534, 3403, 3272, 3147, 3023, 2907,
00069 2792, 2684, 2577, 2476, 2375, 2274, 2173, 2079, 1986, 1897,
00070 1810, 1724, 1645, 1567, 1493, 1419, 1351, 1284, 1222, 1161,
00071 1105, 1050, 995, 941, 891, 842, 797, 753, 713, 673,
00072 636, 599, 566, 533, 503, 473, 446, 419, 392, 365,
00073 340, 316, 294, 272, 253, 234, 216, 199, 184, 169,
00074 155, 142, 130, 118, 106, 95, 85, 75, 66, 57,
00075 49, 41, 34, 27, 21, 15, 10, 5, 0
00076 },
00077 {
00078 16384, 16092, 15801, 15510, 15219, 14930, 14641, 14355, 14069, 13785,
00079 13501, 13219, 12938, 12661, 12384, 12112, 11841, 11571, 11301, 11037,
00080 10773, 10514, 10256, 10005, 9754, 9508, 9263, 9025, 8787, 8557,
00081 8327, 8103, 7879, 7655, 7431, 7215, 7000, 6792, 6585, 6387,
00082 6190, 5998, 5807, 5625, 5445, 5272, 5100, 4937, 4774, 4613,
00083 4452, 4301, 4150, 4007, 3865, 3731, 3597, 3469, 3341, 3218,
00084 3099, 2981, 2869, 2758, 2652, 2546, 2440, 2334, 2234, 2134,
00085 2041, 1949, 1864, 1779, 1699, 1620, 1547, 1474, 1407, 1340,
00086 1278, 1217, 1157, 1097, 1043, 989, 940, 891, 846, 801,
00087 759, 718, 680, 643, 609, 575, 543, 511, 479, 447,
00088 418, 389, 363, 337, 314, 291, 270, 249, 230, 212,
00089 195, 179, 164, 149, 135, 121, 108, 96, 85, 74,
00090 64, 54, 45, 36, 28, 20, 13, 6, 0
00091 }
00092 };
00093
00094
00095 static const uint16_t cf_tables_2[8][193] = {
00096 {
00097 16384, 16104, 15825, 15546, 15268, 14991, 14714, 14439, 14164, 13891,
00098 13620, 13350, 13081, 12815, 12549, 12287, 12025, 11765, 11505, 11250,
00099 10996, 10746, 10497, 10254, 10011, 9772, 9534, 9303, 9072, 8848,
00100 8624, 8406, 8188, 7970, 7752, 7539, 7327, 7123, 6919, 6724,
00101 6529, 6339, 6150, 5970, 5790, 5618, 5446, 5282, 5119, 4957,
00102 4795, 4642, 4490, 4345, 4201, 4065, 3929, 3798, 3669, 3547,
00103 3425, 3310, 3196, 3086, 2976, 2866, 2756, 2650, 2545, 2447,
00104 2350, 2260, 2170, 2085, 2000, 1921, 1843, 1770, 1698, 1632,
00105 1566, 1501, 1436, 1376, 1316, 1261, 1207, 1157, 1108, 1061,
00106 1015, 973, 931, 893, 855, 819, 783, 747, 711, 677,
00107 644, 614, 584, 557, 530, 505, 480, 458, 436, 416,
00108 396, 378, 360, 343, 326, 310, 295, 281, 267, 255,
00109 243, 232, 221, 211, 201, 192, 183, 174, 166, 158,
00110 150, 142, 134, 126, 119, 112, 106, 100, 95, 90,
00111 85, 80, 76, 72, 69, 66, 63, 60, 57, 54,
00112 51, 48, 46, 44, 42, 40, 38, 36, 34, 33,
00113 32, 31, 30, 29, 28, 27, 26, 25, 24, 23,
00114 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
00115 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
00116 2, 1, 0
00117 },
00118 {
00119 16384, 16116, 15849, 15582, 15316, 15050, 14785, 14521, 14257, 13995,
00120 13734, 13476, 13218, 12963, 12708, 12457, 12206, 11956, 11706, 11460,
00121 11215, 10975, 10735, 10500, 10265, 10034, 9803, 9579, 9355, 9136,
00122 8917, 8703, 8489, 8275, 8061, 7853, 7645, 7444, 7244, 7051,
00123 6858, 6671, 6484, 6305, 6127, 5956, 5785, 5622, 5459, 5298,
00124 5137, 4983, 4830, 4684, 4539, 4401, 4263, 4131, 3999, 3874,
00125 3750, 3632, 3515, 3401, 3287, 3173, 3059, 2949, 2840, 2737,
00126 2635, 2539, 2444, 2354, 2264, 2181, 2098, 2020, 1943, 1872,
00127 1801, 1731, 1661, 1596, 1532, 1472, 1412, 1357, 1303, 1251,
00128 1200, 1153, 1106, 1063, 1020, 979, 938, 897, 856, 818,
00129 780, 746, 712, 681, 650, 621, 592, 566, 540, 517,
00130 494, 473, 452, 431, 410, 391, 373, 356, 340, 325,
00131 310, 296, 282, 270, 258, 247, 236, 225, 214, 203,
00132 192, 182, 172, 162, 153, 144, 136, 128, 121, 114,
00133 108, 102, 97, 92, 87, 82, 77, 73, 69, 65,
00134 62, 59, 56, 53, 50, 47, 45, 43, 41, 39,
00135 37, 35, 33, 31, 29, 27, 26, 25, 24, 23,
00136 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
00137 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
00138 2, 1, 0
00139 },
00140 {
00141 16384, 16128, 15872, 15617, 15362, 15107, 14853, 14600, 14347, 14096,
00142 13846, 13597, 13350, 13105, 12860, 12618, 12376, 12135, 11894, 11657,
00143 11421, 11189, 10957, 10730, 10503, 10279, 10056, 9838, 9620, 9407,
00144 9195, 8987, 8779, 8571, 8363, 8159, 7955, 7758, 7561, 7371,
00145 7182, 6997, 6812, 6635, 6459, 6289, 6120, 5957, 5795, 5634,
00146 5473, 5319, 5165, 5018, 4871, 4732, 4593, 4458, 4324, 4197,
00147 4071, 3951, 3831, 3714, 3597, 3480, 3363, 3250, 3138, 3032,
00148 2927, 2828, 2729, 2635, 2541, 2453, 2366, 2284, 2202, 2126,
00149 2050, 1975, 1900, 1830, 1761, 1697, 1633, 1574, 1515, 1459,
00150 1403, 1351, 1300, 1252, 1205, 1160, 1115, 1070, 1025, 982,
00151 939, 899, 860, 824, 789, 756, 723, 693, 663, 636,
00152 609, 584, 559, 535, 511, 489, 467, 447, 427, 409,
00153 391, 374, 358, 343, 328, 313, 300, 287, 274, 261,
00154 248, 235, 223, 211, 200, 189, 179, 169, 160, 151,
00155 143, 135, 128, 121, 115, 109, 103, 97, 92, 87,
00156 82, 77, 73, 69, 65, 61, 58, 55, 52, 49,
00157 46, 43, 40, 37, 35, 33, 31, 29, 27, 25,
00158 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
00159 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
00160 2, 1, 0
00161 },
00162 {
00163 16384, 16139, 15894, 15649, 15405, 15162, 14919, 14677, 14435, 14195,
00164 13955, 13717, 13479, 13243, 13008, 12775, 12542, 12310, 12079, 11851,
00165 11623, 11399, 11176, 10956, 10737, 10521, 10305, 10094, 9883, 9677,
00166 9471, 9268, 9065, 8862, 8659, 8459, 8260, 8067, 7874, 7688,
00167 7502, 7321, 7140, 6965, 6790, 6621, 6452, 6290, 6128, 5968,
00168 5808, 5655, 5503, 5356, 5209, 5069, 4929, 4794, 4660, 4532,
00169 4404, 4282, 4160, 4041, 3922, 3803, 3684, 3568, 3452, 3343,
00170 3234, 3131, 3029, 2931, 2833, 2741, 2649, 2563, 2477, 2396,
00171 2316, 2236, 2157, 2083, 2009, 1940, 1871, 1807, 1743, 1683,
00172 1623, 1567, 1511, 1459, 1407, 1357, 1307, 1257, 1207, 1159,
00173 1111, 1067, 1023, 983, 943, 905, 868, 834, 800, 769,
00174 738, 709, 681, 653, 625, 600, 575, 552, 529, 508,
00175 487, 466, 447, 428, 410, 392, 376, 360, 344, 328,
00176 313, 298, 283, 268, 255, 242, 230, 218, 207, 196,
00177 186, 176, 167, 158, 150, 142, 135, 128, 121, 114,
00178 108, 102, 97, 92, 87, 82, 78, 74, 70, 66,
00179 62, 58, 54, 50, 47, 44, 41, 38, 35, 32,
00180 30, 28, 26, 24, 22, 20, 18, 16, 14, 13,
00181 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
00182 2, 1, 0
00183 },
00184 {
00185 16384, 16149, 15915, 15681, 15447, 15214, 14981, 14749, 14517, 14286,
00186 14055, 13827, 13599, 13373, 13147, 12923, 12699, 12476, 12253, 12034,
00187 11815, 11599, 11383, 11171, 10959, 10750, 10541, 10337, 10133, 9933,
00188 9733, 9536, 9339, 9142, 8945, 8751, 8557, 8369, 8181, 7998,
00189 7816, 7638, 7460, 7288, 7116, 6950, 6785, 6625, 6465, 6306,
00190 6147, 5995, 5843, 5697, 5551, 5411, 5271, 5135, 5000, 4871,
00191 4742, 4618, 4495, 4374, 4253, 4132, 4011, 3893, 3775, 3663,
00192 3552, 3446, 3340, 3239, 3138, 3043, 2948, 2858, 2768, 2684,
00193 2600, 2516, 2433, 2355, 2278, 2205, 2133, 2065, 1997, 1932,
00194 1867, 1807, 1747, 1690, 1634, 1580, 1526, 1472, 1418, 1366,
00195 1314, 1266, 1218, 1174, 1130, 1088, 1047, 1009, 971, 936,
00196 901, 868, 836, 804, 772, 743, 714, 685, 658, 631,
00197 606, 582, 559, 536, 515, 494, 475, 456, 437, 418,
00198 399, 380, 362, 344, 328, 312, 297, 283, 270, 257,
00199 245, 233, 222, 211, 201, 191, 181, 172, 163, 155,
00200 147, 139, 132, 125, 119, 113, 107, 101, 96, 91,
00201 86, 81, 76, 71, 66, 62, 58, 54, 50, 46,
00202 43, 40, 37, 34, 31, 28, 26, 24, 22, 20,
00203 18, 16, 14, 12, 10, 8, 6, 5, 4, 3,
00204 2, 1, 0
00205 },
00206 {
00207 16384, 16159, 15934, 15709, 15485, 15261, 15038, 14816, 14594, 14373,
00208 14152, 13933, 13714, 13497, 13280, 13065, 12850, 12636, 12422, 12211,
00209 12000, 11791, 11583, 11378, 11173, 10971, 10769, 10571, 10373, 10179,
00210 9985, 9793, 9601, 9409, 9217, 9029, 8842, 8658, 8475, 8297,
00211 8120, 7946, 7773, 7604, 7435, 7271, 7108, 6950, 6792, 6634,
00212 6477, 6326, 6175, 6029, 5883, 5742, 5602, 5466, 5330, 5199,
00213 5068, 4943, 4818, 4696, 4574, 4452, 4330, 4211, 4093, 3979,
00214 3866, 3759, 3652, 3549, 3446, 3348, 3250, 3157, 3065, 2977,
00215 2889, 2802, 2716, 2634, 2553, 2476, 2399, 2326, 2254, 2185,
00216 2117, 2052, 1987, 1926, 1866, 1808, 1750, 1692, 1634, 1578,
00217 1522, 1470, 1418, 1369, 1321, 1275, 1229, 1187, 1145, 1105,
00218 1066, 1027, 991, 955, 919, 883, 850, 817, 786, 756,
00219 728, 700, 674, 648, 624, 600, 578, 556, 534, 512,
00220 490, 468, 447, 426, 407, 388, 371, 354, 338, 322,
00221 307, 293, 280, 267, 255, 243, 231, 219, 209, 199,
00222 189, 179, 170, 161, 153, 145, 138, 131, 124, 117,
00223 111, 105, 99, 93, 87, 81, 76, 71, 66, 61,
00224 57, 53, 49, 45, 42, 39, 36, 33, 30, 27,
00225 24, 21, 19, 17, 15, 13, 11, 9, 7, 5,
00226 3, 1, 0
00227 },
00228 {
00229 16384, 16169, 15954, 15739, 15524, 15310, 15096, 14883, 14670, 14458,
00230 14246, 14035, 13824, 13614, 13405, 13198, 12991, 12785, 12579, 12376,
00231 12173, 11972, 11772, 11574, 11377, 11182, 10987, 10795, 10603, 10414,
00232 10226, 10040, 9854, 9668, 9482, 9299, 9116, 8937, 8759, 8585,
00233 8411, 8241, 8071, 7906, 7741, 7580, 7419, 7263, 7107, 6952,
00234 6797, 6647, 6497, 6353, 6209, 6070, 5931, 5796, 5661, 5531,
00235 5401, 5275, 5150, 5027, 4904, 4781, 4658, 4538, 4419, 4304,
00236 4190, 4081, 3972, 3867, 3762, 3662, 3562, 3467, 3372, 3281,
00237 3191, 3101, 3012, 2928, 2844, 2764, 2684, 2608, 2533, 2460,
00238 2387, 2318, 2250, 2185, 2121, 2059, 1997, 1935, 1873, 1813,
00239 1754, 1698, 1642, 1588, 1535, 1483, 1433, 1384, 1338, 1292,
00240 1249, 1206, 1165, 1125, 1085, 1045, 1008, 971, 937, 903,
00241 871, 840, 810, 780, 752, 724, 698, 672, 647, 622,
00242 597, 572, 548, 524, 502, 480, 460, 440, 421, 403,
00243 386, 369, 353, 337, 323, 309, 295, 281, 268, 255,
00244 243, 231, 220, 209, 199, 189, 180, 171, 163, 155,
00245 147, 139, 131, 123, 116, 109, 102, 95, 89, 83,
00246 77, 72, 67, 62, 57, 52, 48, 44, 40, 36,
00247 32, 28, 25, 22, 19, 16, 13, 10, 8, 6,
00248 4, 2, 0
00249 },
00250 {
00251 16384, 16177, 15970, 15764, 15558, 15353, 15148, 14944, 14740, 14537,
00252 14334, 14132, 13930, 13729, 13529, 13330, 13131, 12933, 12735, 12539,
00253 12343, 12150, 11957, 11766, 11576, 11388, 11200, 11015, 10830, 10647,
00254 10465, 10285, 10105, 9925, 9745, 9568, 9391, 9218, 9045, 8876,
00255 8707, 8541, 8375, 8213, 8051, 7894, 7737, 7583, 7429, 7277,
00256 7125, 6977, 6830, 6687, 6544, 6406, 6268, 6133, 5998, 5868,
00257 5738, 5612, 5487, 5364, 5241, 5118, 4995, 4875, 4755, 4640,
00258 4525, 4414, 4304, 4198, 4092, 3990, 3888, 3790, 3693, 3600,
00259 3507, 3415, 3323, 3235, 3147, 3064, 2981, 2902, 2823, 2746,
00260 2670, 2594, 2522, 2450, 2382, 2314, 2248, 2182, 2116, 2050,
00261 1987, 1924, 1864, 1804, 1748, 1692, 1638, 1585, 1534, 1484,
00262 1437, 1390, 1346, 1302, 1258, 1215, 1174, 1133, 1095, 1057,
00263 1021, 986, 952, 918, 887, 856, 827, 798, 770, 742,
00264 714, 686, 659, 632, 607, 582, 559, 536, 514, 492,
00265 472, 452, 433, 415, 398, 381, 364, 348, 333, 318,
00266 304, 290, 277, 264, 252, 240, 229, 218, 208, 198,
00267 188, 178, 168, 158, 149, 140, 132, 124, 116, 108,
00268 101, 94, 87, 81, 75, 69, 64, 59, 54, 49,
00269 44, 39, 35, 31, 27, 23, 19, 15, 12, 9,
00270 6, 3, 0
00271 }
00272 };
00273
00274
00275 static const uint16_t cf_tables_3[5][257] = {
00276 {
00277 16384, 16187, 15990, 15793, 15597, 15401, 15205, 15009, 14813, 14618,
00278 14423, 14230, 14037, 13845, 13653, 13463, 13273, 13083, 12894, 12706,
00279 12518, 12332, 12146, 11962, 11778, 11597, 11416, 11237, 11059, 10882,
00280 10706, 10532, 10358, 10184, 10010, 9838, 9666, 9497, 9328, 9163,
00281 8999, 8837, 8675, 8517, 8359, 8205, 8051, 7901, 7751, 7602,
00282 7453, 7308, 7163, 7022, 6882, 6745, 6609, 6476, 6343, 6214,
00283 6085, 5960, 5835, 5712, 5589, 5466, 5343, 5223, 5103, 4987,
00284 4872, 4761, 4650, 4542, 4435, 4332, 4229, 4130, 4031, 3936,
00285 3841, 3747, 3653, 3563, 3473, 3387, 3302, 3220, 3138, 3059,
00286 2980, 2905, 2830, 2759, 2688, 2619, 2550, 2481, 2412, 2345,
00287 2278, 2215, 2152, 2092, 2032, 1974, 1917, 1863, 1809, 1758,
00288 1707, 1659, 1611, 1564, 1517, 1473, 1429, 1387, 1346, 1307,
00289 1268, 1230, 1193, 1158, 1123, 1090, 1058, 1026, 994, 962,
00290 930, 899, 869, 841, 813, 786, 760, 735, 710, 687,
00291 664, 643, 622, 602, 582, 562, 543, 525, 507, 490,
00292 473, 457, 442, 427, 412, 398, 385, 373, 361, 349,
00293 337, 325, 313, 301, 290, 279, 269, 259, 249, 240,
00294 231, 222, 214, 206, 199, 192, 185, 178, 171, 165,
00295 159, 153, 148, 143, 138, 133, 128, 123, 119, 115,
00296 111, 107, 103, 99, 95, 91, 87, 83, 80, 77,
00297 74, 71, 68, 65, 63, 61, 59, 57, 55, 53,
00298 51, 49, 47, 45, 43, 41, 40, 39, 38, 37,
00299 36, 35, 34, 33, 32, 31, 30, 29, 28, 27,
00300 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
00301 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
00302 6, 5, 4, 3, 2, 1, 0
00303 },
00304 {
00305 16384, 16195, 16006, 15817, 15629, 15441, 15253, 15065, 14878, 14692,
00306 14506, 14321, 14136, 13952, 13768, 13585, 13402, 13219, 13037, 12857,
00307 12677, 12499, 12321, 12144, 11967, 11792, 11617, 11444, 11271, 11100,
00308 10930, 10762, 10594, 10426, 10258, 10091, 9925, 9761, 9598, 9438,
00309 9278, 9120, 8963, 8809, 8655, 8504, 8354, 8207, 8060, 7914,
00310 7769, 7627, 7485, 7347, 7209, 7074, 6939, 6807, 6676, 6548,
00311 6420, 6296, 6172, 6050, 5928, 5806, 5684, 5564, 5444, 5328,
00312 5212, 5100, 4988, 4879, 4771, 4667, 4563, 4462, 4362, 4265,
00313 4169, 4073, 3978, 3886, 3795, 3707, 3619, 3535, 3451, 3369,
00314 3288, 3210, 3133, 3059, 2985, 2913, 2841, 2769, 2697, 2627,
00315 2557, 2490, 2424, 2360, 2297, 2237, 2177, 2119, 2062, 2007,
00316 1953, 1901, 1849, 1798, 1748, 1700, 1652, 1607, 1562, 1519,
00317 1476, 1435, 1394, 1355, 1317, 1281, 1245, 1210, 1175, 1140,
00318 1105, 1071, 1037, 1005, 973, 943, 913, 885, 857, 830,
00319 804, 779, 754, 731, 708, 685, 663, 642, 621, 601,
00320 581, 563, 545, 528, 511, 495, 479, 463, 448, 433,
00321 419, 405, 391, 377, 364, 351, 338, 326, 314, 302,
00322 291, 280, 270, 260, 251, 242, 234, 226, 218, 210,
00323 202, 195, 188, 181, 174, 168, 162, 156, 150, 144,
00324 139, 134, 129, 124, 119, 114, 109, 104, 100, 96,
00325 92, 88, 84, 80, 77, 74, 71, 68, 65, 62,
00326 59, 56, 54, 52, 50, 48, 46, 44, 42, 40,
00327 38, 36, 34, 33, 32, 31, 30, 29, 28, 27,
00328 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
00329 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
00330 6, 5, 4, 3, 2, 1, 0
00331 },
00332 {
00333 16384, 16203, 16022, 15842, 15662, 15482, 15302, 15122, 14942, 14763,
00334 14584, 14406, 14228, 14051, 13874, 13698, 13522, 13347, 13172, 12998,
00335 12824, 12652, 12480, 12310, 12140, 11971, 11803, 11637, 11471, 11307,
00336 11143, 10980, 10817, 10654, 10491, 10330, 10169, 10011, 9853, 9697,
00337 9542, 9389, 9236, 9086, 8936, 8789, 8642, 8498, 8355, 8212,
00338 8070, 7931, 7792, 7656, 7520, 7388, 7256, 7126, 6996, 6870,
00339 6744, 6621, 6498, 6377, 6256, 6135, 6014, 5895, 5776, 5660,
00340 5545, 5433, 5321, 5212, 5104, 4999, 4895, 4793, 4692, 4594,
00341 4496, 4400, 4304, 4211, 4118, 4028, 3939, 3853, 3767, 3684,
00342 3601, 3521, 3441, 3364, 3287, 3212, 3137, 3062, 2987, 2915,
00343 2843, 2773, 2704, 2638, 2572, 2508, 2445, 2384, 2324, 2266,
00344 2208, 2153, 2098, 2044, 1990, 1939, 1888, 1839, 1791, 1745,
00345 1699, 1655, 1611, 1569, 1527, 1487, 1448, 1409, 1370, 1331,
00346 1292, 1255, 1218, 1183, 1148, 1115, 1082, 1051, 1020, 990,
00347 960, 932, 904, 878, 852, 826, 801, 777, 753, 731,
00348 709, 687, 666, 645, 625, 605, 586, 567, 550, 533,
00349 516, 499, 482, 465, 449, 433, 418, 403, 389, 375,
00350 362, 349, 337, 325, 314, 303, 293, 283, 273, 263,
00351 254, 245, 236, 227, 219, 211, 204, 197, 190, 183,
00352 177, 171, 165, 159, 153, 147, 141, 135, 130, 125,
00353 120, 115, 110, 105, 101, 97, 93, 89, 85, 81,
00354 77, 74, 71, 68, 65, 62, 59, 56, 53, 51,
00355 49, 47, 45, 43, 41, 39, 37, 35, 33, 31,
00356 29, 27, 25, 23, 22, 21, 20, 19, 18, 17,
00357 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
00358 6, 5, 4, 3, 2, 1, 0
00359 },
00360 {
00361 16384, 16210, 16036, 15863, 15690, 15517, 15344, 15172, 15000, 14828,
00362 14656, 14485, 14314, 14145, 13976, 13808, 13640, 13472, 13304, 13137,
00363 12970, 12804, 12639, 12475, 12312, 12149, 11987, 11827, 11667, 11508,
00364 11349, 11192, 11035, 10878, 10721, 10565, 10410, 10257, 10104, 9953,
00365 9802, 9654, 9506, 9359, 9213, 9070, 8927, 8787, 8647, 8508,
00366 8369, 8233, 8097, 7964, 7831, 7700, 7570, 7442, 7315, 7190,
00367 7065, 6943, 6821, 6701, 6581, 6461, 6341, 6223, 6105, 5990,
00368 5876, 5764, 5653, 5545, 5437, 5331, 5226, 5124, 5022, 4924,
00369 4826, 4729, 4632, 4538, 4444, 4353, 4262, 4174, 4087, 4002,
00370 3917, 3835, 3753, 3674, 3595, 3518, 3441, 3364, 3287, 3212,
00371 3138, 3066, 2995, 2926, 2858, 2792, 2726, 2662, 2599, 2538,
00372 2478, 2420, 2362, 2305, 2249, 2195, 2141, 2089, 2037, 1988,
00373 1939, 1891, 1844, 1799, 1754, 1711, 1668, 1626, 1584, 1542,
00374 1500, 1459, 1418, 1380, 1342, 1305, 1269, 1234, 1199, 1166,
00375 1133, 1102, 1071, 1041, 1012, 983, 954, 926, 899, 872,
00376 847, 822, 798, 774, 751, 728, 707, 686, 666, 646,
00377 627, 608, 589, 570, 552, 534, 517, 500, 484, 468,
00378 453, 438, 424, 410, 397, 384, 372, 360, 348, 336,
00379 325, 314, 303, 293, 283, 273, 264, 255, 246, 237,
00380 229, 221, 213, 205, 197, 189, 181, 174, 167, 160,
00381 154, 148, 142, 136, 131, 126, 121, 116, 111, 106,
00382 101, 97, 93, 89, 85, 81, 77, 73, 70, 67,
00383 64, 61, 58, 55, 52, 49, 46, 43, 40, 37,
00384 35, 33, 31, 29, 27, 25, 23, 21, 19, 17,
00385 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
00386 6, 5, 4, 3, 2, 1, 0
00387 },
00388 {
00389 16384, 16218, 16052, 15886, 15720, 15554, 15389, 15224, 15059, 14895,
00390 14731, 14567, 14403, 14240, 14077, 13915, 13753, 13591, 13429, 13269,
00391 13109, 12950, 12791, 12633, 12476, 12320, 12164, 12009, 11854, 11701,
00392 11548, 11396, 11244, 11092, 10940, 10790, 10640, 10492, 10344, 10198,
00393 10052, 9908, 9764, 9622, 9481, 9342, 9203, 9066, 8929, 8793,
00394 8657, 8524, 8391, 8261, 8131, 8003, 7875, 7749, 7624, 7502,
00395 7380, 7260, 7140, 7022, 6904, 6786, 6668, 6551, 6435, 6322,
00396 6209, 6099, 5989, 5881, 5773, 5668, 5563, 5461, 5359, 5260,
00397 5161, 5063, 4965, 4871, 4777, 4686, 4595, 4506, 4417, 4331,
00398 4245, 4162, 4079, 3999, 3919, 3841, 3763, 3685, 3607, 3530,
00399 3454, 3380, 3307, 3236, 3166, 3097, 3029, 2963, 2897, 2834,
00400 2771, 2710, 2650, 2591, 2532, 2475, 2418, 2363, 2309, 2257,
00401 2205, 2155, 2105, 2057, 2009, 1963, 1918, 1873, 1828, 1783,
00402 1738, 1694, 1650, 1607, 1565, 1524, 1484, 1445, 1407, 1369,
00403 1333, 1297, 1263, 1229, 1197, 1165, 1134, 1103, 1073, 1043,
00404 1015, 987, 960, 933, 907, 882, 858, 834, 811, 788,
00405 766, 744, 722, 700, 679, 658, 638, 618, 599, 581,
00406 563, 545, 528, 511, 495, 480, 465, 451, 437, 423,
00407 410, 397, 384, 372, 360, 348, 337, 326, 315, 305,
00408 295, 285, 275, 265, 255, 245, 236, 227, 219, 211,
00409 203, 195, 188, 181, 174, 167, 161, 155, 149, 143,
00410 137, 131, 126, 121, 116, 111, 106, 101, 97, 93,
00411 89, 85, 81, 77, 73, 69, 65, 61, 58, 55,
00412 52, 49, 46, 43, 40, 37, 34, 32, 30, 28,
00413 26, 24, 22, 20, 18, 16, 14, 12, 10, 8,
00414 6, 5, 4, 3, 2, 1, 0
00415 }
00416 };
00417
00418
00419 static const uint16_t * const cf_table[16] = {
00420 cf_tables_1[0], cf_tables_1[1], cf_tables_1[2], cf_tables_2[0],
00421 cf_tables_2[1], cf_tables_2[2], cf_tables_2[3], cf_tables_2[4],
00422 cf_tables_2[5], cf_tables_2[6], cf_tables_2[7], cf_tables_3[0],
00423 cf_tables_3[1], cf_tables_3[2], cf_tables_3[3], cf_tables_3[4]
00424 };
00425
00426
00429 static void bgmc_lut_fillp(uint8_t *lut, int *lut_status,
00430 int delta)
00431 {
00432 unsigned int sx, i;
00433
00434 for (sx = 0; sx < 16; sx++)
00435 for (i = 0; i < LUT_SIZE; i++) {
00436 unsigned int target = (i + 1) << (FREQ_BITS - LUT_BITS);
00437 unsigned int symbol = 1 << delta;
00438
00439 while (cf_table[sx][symbol] > target)
00440 symbol += 1 << delta;
00441
00442 *lut++ = symbol >> delta;
00443 }
00444
00445 *lut_status = delta;
00446 }
00447
00448
00451 static uint8_t* bgmc_lut_getp(uint8_t *lut, int *lut_status,
00452 int delta)
00453 {
00454 unsigned int i = av_clip(delta, 0, LUT_BUFF - 1);
00455
00456 lut += (i * LUT_SIZE) << 4;
00457
00458 if (lut_status[i] != delta)
00459 bgmc_lut_fillp(lut, &lut_status[i], delta);
00460
00461 return lut;
00462 }
00463
00464
00467 int ff_bgmc_init(AVCodecContext *avctx, uint8_t **cf_lut, int **cf_lut_status)
00468 {
00469 *cf_lut = av_malloc(sizeof(*cf_lut ) * LUT_BUFF * 16 * LUT_SIZE);
00470 *cf_lut_status = av_malloc(sizeof(*cf_lut_status) * LUT_BUFF);
00471
00472 if (!cf_lut || !cf_lut_status) {
00473 ff_bgmc_end(cf_lut, cf_lut_status);
00474 av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
00475 return AVERROR(ENOMEM);
00476 } else {
00477
00478
00479 memset(*cf_lut_status, -1, sizeof(*cf_lut_status) * LUT_BUFF);
00480 }
00481
00482 return 0;
00483 }
00484
00485
00488 void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status)
00489 {
00490 av_freep(cf_lut);
00491 av_freep(cf_lut_status);
00492 }
00493
00494
00497 void ff_bgmc_decode_init(GetBitContext *gb,
00498 unsigned int *h, unsigned int *l, unsigned int *v)
00499 {
00500 *h = TOP_VALUE;
00501 *l = 0;
00502 *v = get_bits_long(gb, VALUE_BITS);
00503 }
00504
00505
00508 void ff_bgmc_decode_end(GetBitContext *gb)
00509 {
00510 skip_bits_long(gb, -(VALUE_BITS - 2));
00511 }
00512
00513
00516 void ff_bgmc_decode(GetBitContext *gb, unsigned int num, int32_t *dst,
00517 int delta, unsigned int sx,
00518 unsigned int *h, unsigned int *l, unsigned int *v,
00519 uint8_t *cf_lut, int *cf_lut_status)
00520 {
00521 unsigned int i;
00522 uint8_t *lut = bgmc_lut_getp(cf_lut, cf_lut_status, delta);
00523
00524
00525 unsigned int high = *h;
00526 unsigned int low = *l;
00527 unsigned int value = *v;
00528
00529 lut += sx * LUT_SIZE;
00530
00531
00532 for (i = 0; i < num; i++) {
00533 unsigned int range = high - low + 1;
00534 unsigned int target = (((value - low + 1) << FREQ_BITS) - 1) / range;
00535 unsigned int symbol = lut[target >> (FREQ_BITS - LUT_BITS)] << delta;
00536
00537 while (cf_table[sx][symbol] > target)
00538 symbol += 1 << delta;
00539
00540 symbol = (symbol >> delta) - 1;
00541
00542 high = low + ((range * cf_table[sx][(symbol ) << delta] - (1 << FREQ_BITS)) >> FREQ_BITS);
00543 low = low + ((range * cf_table[sx][(symbol + 1) << delta] ) >> FREQ_BITS);
00544
00545 while (1) {
00546 if (high >= HALF) {
00547 if (low >= HALF) {
00548 value -= HALF;
00549 low -= HALF;
00550 high -= HALF;
00551 } else if (low >= FIRST_QTR && high < THIRD_QTR) {
00552 value -= FIRST_QTR;
00553 low -= FIRST_QTR;
00554 high -= FIRST_QTR;
00555 } else break;
00556 }
00557
00558 low *= 2;
00559 high = 2 * high + 1;
00560 value = 2 * value + get_bits1(gb);
00561 }
00562
00563 *dst++ = symbol;
00564 }
00565
00566
00567 *h = high;
00568 *l = low;
00569 *v = value;
00570 }