1 /*
2 * Block Gilbert-Moore decoder
3 * Copyright (c) 2010 Thilo Borgmann <thilo.borgmann _at_ mail.de>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Block Gilbert-Moore decoder as used by MPEG-4 ALS
25 * @author Thilo Borgmann <thilo.borgmann _at_ mail.de>
26 */
27
31
32 #define FREQ_BITS 14 // bits used by frequency counters
33 #define VALUE_BITS 18 // bits used to represent the values
34 #define TOP_VALUE ((1 << VALUE_BITS) - 1) // maximum value
35 #define FIRST_QTR (TOP_VALUE / 4 + 1) // first quarter of values maximum value
36 #define HALF (2 * FIRST_QTR) // first half of values maximum value
37 #define THIRD_QTR (3 * FIRST_QTR) // third quarter of values maximum value
38
39 #define LUT_BITS (FREQ_BITS - 8) // number of bits used to index lookup tables
40 #define LUT_SIZE (1 << LUT_BITS) // size of the lookup tables
41 #define LUT_BUFF 4 // number of buffered lookup tables
42
43
44 /** Cumulative frequency tables for block Gilbert-Moore coding. */
46 {
47 16384, 16066, 15748, 15431, 15114, 14799, 14485, 14173, 13861, 13552,
48 13243, 12939, 12635, 12336, 12038, 11745, 11452, 11161, 10870, 10586,
49 10303, 10027, 9751, 9483, 9215, 8953, 8692, 8440, 8189, 7946,
50 7704, 7472, 7240, 7008, 6776, 6554, 6333, 6122, 5912, 5711,
51 5512, 5320, 5128, 4947, 4766, 4595, 4425, 4264, 4104, 3946,
52 3788, 3640, 3493, 3355, 3218, 3090, 2963, 2842, 2721, 2609,
53 2498, 2395, 2292, 2196, 2100, 2004, 1908, 1820, 1732, 1651,
54 1570, 1497, 1424, 1355, 1287, 1223, 1161, 1100, 1044, 988,
55 938, 888, 839, 790, 746, 702, 662, 623, 588, 553,
56 520, 488, 459, 431, 405, 380, 357, 334, 311, 288,
57 268, 248, 230, 213, 197, 182, 168, 154, 142, 130,
58 119, 108, 99, 90, 81, 72, 64, 56, 49, 42,
59 36, 30, 25, 20, 15, 11, 7, 3, 0
60 },
61 {
62 16384, 16080, 15776, 15473, 15170, 14868, 14567, 14268, 13970, 13674,
63 13378, 13086, 12794, 12505, 12218, 11936, 11654, 11373, 11092, 10818,
64 10544, 10276, 10008, 9749, 9490, 9236, 8982, 8737, 8492, 8256,
65 8020, 7792, 7564, 7336, 7108, 6888, 6669, 6459, 6249, 6050,
66 5852, 5660, 5468, 5286, 5104, 4931, 4760, 4598, 4436, 4275,
67 4115, 3965, 3816, 3674, 3534, 3403, 3272, 3147, 3023, 2907,
68 2792, 2684, 2577, 2476, 2375, 2274, 2173, 2079, 1986, 1897,
69 1810, 1724, 1645, 1567, 1493, 1419, 1351, 1284, 1222, 1161,
70 1105, 1050, 995, 941, 891, 842, 797, 753, 713, 673,
71 636, 599, 566, 533, 503, 473, 446, 419, 392, 365,
72 340, 316, 294, 272, 253, 234, 216, 199, 184, 169,
73 155, 142, 130, 118, 106, 95, 85, 75, 66, 57,
74 49, 41, 34, 27, 21, 15, 10, 5, 0
75 },
76 {
77 16384, 16092, 15801, 15510, 15219, 14930, 14641, 14355, 14069, 13785,
78 13501, 13219, 12938, 12661, 12384, 12112, 11841, 11571, 11301, 11037,
79 10773, 10514, 10256, 10005, 9754, 9508, 9263, 9025, 8787, 8557,
80 8327, 8103, 7879, 7655, 7431, 7215, 7000, 6792, 6585, 6387,
81 6190, 5998, 5807, 5625, 5445, 5272, 5100, 4937, 4774, 4613,
82 4452, 4301, 4150, 4007, 3865, 3731, 3597, 3469, 3341, 3218,
83 3099, 2981, 2869, 2758, 2652, 2546, 2440, 2334, 2234, 2134,
84 2041, 1949, 1864, 1779, 1699, 1620, 1547, 1474, 1407, 1340,
85 1278, 1217, 1157, 1097, 1043, 989, 940, 891, 846, 801,
86 759, 718, 680, 643, 609, 575, 543, 511, 479, 447,
87 418, 389, 363, 337, 314, 291, 270, 249, 230, 212,
88 195, 179, 164, 149, 135, 121, 108, 96, 85, 74,
89 64, 54, 45, 36, 28, 20, 13, 6, 0
90 }
91 };
92
93
95 {
96 16384, 16104, 15825, 15546, 15268, 14991, 14714, 14439, 14164, 13891,
97 13620, 13350, 13081, 12815, 12549, 12287, 12025, 11765, 11505, 11250,
98 10996, 10746, 10497, 10254, 10011, 9772, 9534, 9303, 9072, 8848,
99 8624, 8406, 8188, 7970, 7752, 7539, 7327, 7123, 6919, 6724,
100 6529, 6339, 6150, 5970, 5790, 5618, 5446, 5282, 5119, 4957,
101 4795, 4642, 4490, 4345, 4201, 4065, 3929, 3798, 3669, 3547,
102 3425, 3310, 3196, 3086, 2976, 2866, 2756, 2650, 2545, 2447,
103 2350, 2260, 2170, 2085, 2000, 1921, 1843, 1770, 1698, 1632,
104 1566, 1501, 1436, 1376, 1316, 1261, 1207, 1157, 1108, 1061,
105 1015, 973, 931, 893, 855, 819, 783, 747, 711, 677,
106 644, 614, 584, 557, 530, 505, 480, 458, 436, 416,
107 396, 378, 360, 343, 326, 310, 295, 281, 267, 255,
108 243, 232, 221, 211, 201, 192, 183, 174, 166, 158,
109 150, 142, 134, 126, 119, 112, 106, 100, 95, 90,
110 85, 80, 76, 72, 69, 66, 63, 60, 57, 54,
111 51, 48, 46, 44, 42, 40, 38, 36, 34, 33,
112 32, 31, 30, 29, 28, 27, 26, 25, 24, 23,
113 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
114 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
115 2, 1, 0
116 },
117 {
118 16384, 16116, 15849, 15582, 15316, 15050, 14785, 14521, 14257, 13995,
119 13734, 13476, 13218, 12963, 12708, 12457, 12206, 11956, 11706, 11460,
120 11215, 10975, 10735, 10500, 10265, 10034, 9803, 9579, 9355, 9136,
121 8917, 8703, 8489, 8275, 8061, 7853, 7645, 7444, 7244, 7051,
122 6858, 6671, 6484, 6305, 6127, 5956, 5785, 5622, 5459, 5298,
123 5137, 4983, 4830, 4684, 4539, 4401, 4263, 4131, 3999, 3874,
124 3750, 3632, 3515, 3401, 3287, 3173, 3059, 2949, 2840, 2737,
125 2635, 2539, 2444, 2354, 2264, 2181, 2098, 2020, 1943, 1872,
126 1801, 1731, 1661, 1596, 1532, 1472, 1412, 1357, 1303, 1251,
127 1200, 1153, 1106, 1063, 1020, 979, 938, 897, 856, 818,
128 780, 746, 712, 681, 650, 621, 592, 566, 540, 517,
129 494, 473, 452, 431, 410, 391, 373, 356, 340, 325,
130 310, 296, 282, 270, 258, 247, 236, 225, 214, 203,
131 192, 182, 172, 162, 153, 144, 136, 128, 121, 114,
132 108, 102, 97, 92, 87, 82, 77, 73, 69, 65,
133 62, 59, 56, 53, 50, 47, 45, 43, 41, 39,
134 37, 35, 33, 31, 29, 27, 26, 25, 24, 23,
135 22, 21, 20, 19, 18, 17, 16, 15, 14, 13,
136 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
137 2, 1, 0
138 },
139 {
140 16384, 16128, 15872, 15617, 15362, 15107, 14853, 14600, 14347, 14096,
141 13846, 13597, 13350, 13105, 12860, 12618, 12376, 12135, 11894, 11657,
142 11421, 11189, 10957, 10730, 10503, 10279, 10056, 9838, 9620, 9407,
143 9195, 8987, 8779, 8571, 8363, 8159, 7955, 7758, 7561, 7371,
144 7182, 6997, 6812, 6635, 6459, 6289, 6120, 5957, 5795, 5634,
145 5473, 5319, 5165, 5018, 4871, 4732, 4593, 4458, 4324, 4197,
146 4071, 3951, 3831, 3714, 3597, 3480, 3363, 3250, 3138, 3032,
147 2927, 2828, 2729, 2635, 2541, 2453, 2366, 2284, 2202, 2126,
148 2050, 1975, 1900, 1830, 1761, 1697, 1633, 1574, 1515, 1459,
149 1403, 1351, 1300, 1252, 1205, 1160, 1115, 1070, 1025, 982,
150 939, 899, 860, 824, 789, 756, 723, 693, 663, 636,
151 609, 584, 559, 535, 511, 489, 467, 447, 427, 409,
152 391, 374, 358, 343, 328, 313, 300, 287, 274, 261,
153 248, 235, 223, 211, 200, 189, 179, 169, 160, 151,
154 143, 135, 128, 121, 115, 109, 103, 97, 92, 87,
155 82, 77, 73, 69, 65, 61, 58, 55, 52, 49,
156 46, 43, 40, 37, 35, 33, 31, 29, 27, 25,
157 23, 21, 20, 19, 18, 17, 16, 15, 14, 13,
158 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
159 2, 1, 0
160 },
161 {
162 16384, 16139, 15894, 15649, 15405, 15162, 14919, 14677, 14435, 14195,
163 13955, 13717, 13479, 13243, 13008, 12775, 12542, 12310, 12079, 11851,
164 11623, 11399, 11176, 10956, 10737, 10521, 10305, 10094, 9883, 9677,
165 9471, 9268, 9065, 8862, 8659, 8459, 8260, 8067, 7874, 7688,
166 7502, 7321, 7140, 6965, 6790, 6621, 6452, 6290, 6128, 5968,
167 5808, 5655, 5503, 5356, 5209, 5069, 4929, 4794, 4660, 4532,
168 4404, 4282, 4160, 4041, 3922, 3803, 3684, 3568, 3452, 3343,
169 3234, 3131, 3029, 2931, 2833, 2741, 2649, 2563, 2477, 2396,
170 2316, 2236, 2157, 2083, 2009, 1940, 1871, 1807, 1743, 1683,
171 1623, 1567, 1511, 1459, 1407, 1357, 1307, 1257, 1207, 1159,
172 1111, 1067, 1023, 983, 943, 905, 868, 834, 800, 769,
173 738, 709, 681, 653, 625, 600, 575, 552, 529, 508,
174 487, 466, 447, 428, 410, 392, 376, 360, 344, 328,
175 313, 298, 283, 268, 255, 242, 230, 218, 207, 196,
176 186, 176, 167, 158, 150, 142, 135, 128, 121, 114,
177 108, 102, 97, 92, 87, 82, 78, 74, 70, 66,
178 62, 58, 54, 50, 47, 44, 41, 38, 35, 32,
179 30, 28, 26, 24, 22, 20, 18, 16, 14, 13,
180 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
181 2, 1, 0
182 },
183 {
184 16384, 16149, 15915, 15681, 15447, 15214, 14981, 14749, 14517, 14286,
185 14055, 13827, 13599, 13373, 13147, 12923, 12699, 12476, 12253, 12034,
186 11815, 11599, 11383, 11171, 10959, 10750, 10541, 10337, 10133, 9933,
187 9733, 9536, 9339, 9142, 8945, 8751, 8557, 8369, 8181, 7998,
188 7816, 7638, 7460, 7288, 7116, 6950, 6785, 6625, 6465, 6306,
189 6147, 5995, 5843, 5697, 5551, 5411, 5271, 5135, 5000, 4871,
190 4742, 4618, 4495, 4374, 4253, 4132, 4011, 3893, 3775, 3663,
191 3552, 3446, 3340, 3239, 3138, 3043, 2948, 2858, 2768, 2684,
192 2600, 2516, 2433, 2355, 2278, 2205, 2133, 2065, 1997, 1932,
193 1867, 1807, 1747, 1690, 1634, 1580, 1526, 1472, 1418, 1366,
194 1314, 1266, 1218, 1174, 1130, 1088, 1047, 1009, 971, 936,
195 901, 868, 836, 804, 772, 743, 714, 685, 658, 631,
196 606, 582, 559, 536, 515, 494, 475, 456, 437, 418,
197 399, 380, 362, 344, 328, 312, 297, 283, 270, 257,
198 245, 233, 222, 211, 201, 191, 181, 172, 163, 155,
199 147, 139, 132, 125, 119, 113, 107, 101, 96, 91,
200 86, 81, 76, 71, 66, 62, 58, 54, 50, 46,
201 43, 40, 37, 34, 31, 28, 26, 24, 22, 20,
202 18, 16, 14, 12, 10, 8, 6, 5, 4, 3,
203 2, 1, 0
204 },
205 {
206 16384, 16159, 15934, 15709, 15485, 15261, 15038, 14816, 14594, 14373,
207 14152, 13933, 13714, 13497, 13280, 13065, 12850, 12636, 12422, 12211,
208 12000, 11791, 11583, 11378, 11173, 10971, 10769, 10571, 10373, 10179,
209 9985, 9793, 9601, 9409, 9217, 9029, 8842, 8658, 8475, 8297,
210 8120, 7946, 7773, 7604, 7435, 7271, 7108, 6950, 6792, 6634,
211 6477, 6326, 6175, 6029, 5883, 5742, 5602, 5466, 5330, 5199,
212 5068, 4943, 4818, 4696, 4574, 4452, 4330, 4211, 4093, 3979,
213 3866, 3759, 3652, 3549, 3446, 3348, 3250, 3157, 3065, 2977,
214 2889, 2802, 2716, 2634, 2553, 2476, 2399, 2326, 2254, 2185,
215 2117, 2052, 1987, 1926, 1866, 1808, 1750, 1692, 1634, 1578,
216 1522, 1470, 1418, 1369, 1321, 1275, 1229, 1187, 1145, 1105,
217 1066, 1027, 991, 955, 919, 883, 850, 817, 786, 756,
218 728, 700, 674, 648, 624, 600, 578, 556, 534, 512,
219 490, 468, 447, 426, 407, 388, 371, 354, 338, 322,
220 307, 293, 280, 267, 255, 243, 231, 219, 209, 199,
221 189, 179, 170, 161, 153, 145, 138, 131, 124, 117,
222 111, 105, 99, 93, 87, 81, 76, 71, 66, 61,
223 57, 53, 49, 45, 42, 39, 36, 33, 30, 27,
224 24, 21, 19, 17, 15, 13, 11, 9, 7, 5,
225 3, 1, 0
226 },
227 {
228 16384, 16169, 15954, 15739, 15524, 15310, 15096, 14883, 14670, 14458,
229 14246, 14035, 13824, 13614, 13405, 13198, 12991, 12785, 12579, 12376,
230 12173, 11972, 11772, 11574, 11377, 11182, 10987, 10795, 10603, 10414,
231 10226, 10040, 9854, 9668, 9482, 9299, 9116, 8937, 8759, 8585,
232 8411, 8241, 8071, 7906, 7741, 7580, 7419, 7263, 7107, 6952,
233 6797, 6647, 6497, 6353, 6209, 6070, 5931, 5796, 5661, 5531,
234 5401, 5275, 5150, 5027, 4904, 4781, 4658, 4538, 4419, 4304,
235 4190, 4081, 3972, 3867, 3762, 3662, 3562, 3467, 3372, 3281,
236 3191, 3101, 3012, 2928, 2844, 2764, 2684, 2608, 2533, 2460,
237 2387, 2318, 2250, 2185, 2121, 2059, 1997, 1935, 1873, 1813,
238 1754, 1698, 1642, 1588, 1535, 1483, 1433, 1384, 1338, 1292,
239 1249, 1206, 1165, 1125, 1085, 1045, 1008, 971, 937, 903,
240 871, 840, 810, 780, 752, 724, 698, 672, 647, 622,
241 597, 572, 548, 524, 502, 480, 460, 440, 421, 403,
242 386, 369, 353, 337, 323, 309, 295, 281, 268, 255,
243 243, 231, 220, 209, 199, 189, 180, 171, 163, 155,
244 147, 139, 131, 123, 116, 109, 102, 95, 89, 83,
245 77, 72, 67, 62, 57, 52, 48, 44, 40, 36,
246 32, 28, 25, 22, 19, 16, 13, 10, 8, 6,
247 4, 2, 0
248 },
249 {
250 16384, 16177, 15970, 15764, 15558, 15353, 15148, 14944, 14740, 14537,
251 14334, 14132, 13930, 13729, 13529, 13330, 13131, 12933, 12735, 12539,
252 12343, 12150, 11957, 11766, 11576, 11388, 11200, 11015, 10830, 10647,
253 10465, 10285, 10105, 9925, 9745, 9568, 9391, 9218, 9045, 8876,
254 8707, 8541, 8375, 8213, 8051, 7894, 7737, 7583, 7429, 7277,
255 7125, 6977, 6830, 6687, 6544, 6406, 6268, 6133, 5998, 5868,
256 5738, 5612, 5487, 5364, 5241, 5118, 4995, 4875, 4755, 4640,
257 4525, 4414, 4304, 4198, 4092, 3990, 3888, 3790, 3693, 3600,
258 3507, 3415, 3323, 3235, 3147, 3064, 2981, 2902, 2823, 2746,
259 2670, 2594, 2522, 2450, 2382, 2314, 2248, 2182, 2116, 2050,
260 1987, 1924, 1864, 1804, 1748, 1692, 1638, 1585, 1534, 1484,
261 1437, 1390, 1346, 1302, 1258, 1215, 1174, 1133, 1095, 1057,
262 1021, 986, 952, 918, 887, 856, 827, 798, 770, 742,
263 714, 686, 659, 632, 607, 582, 559, 536, 514, 492,
264 472, 452, 433, 415, 398, 381, 364, 348, 333, 318,
265 304, 290, 277, 264, 252, 240, 229, 218, 208, 198,
266 188, 178, 168, 158, 149, 140, 132, 124, 116, 108,
267 101, 94, 87, 81, 75, 69, 64, 59, 54, 49,
268 44, 39, 35, 31, 27, 23, 19, 15, 12, 9,
269 6, 3, 0
270 }
271 };
272
273
275 {
276 16384, 16187, 15990, 15793, 15597, 15401, 15205, 15009, 14813, 14618,
277 14423, 14230, 14037, 13845, 13653, 13463, 13273, 13083, 12894, 12706,
278 12518, 12332, 12146, 11962, 11778, 11597, 11416, 11237, 11059, 10882,
279 10706, 10532, 10358, 10184, 10010, 9838, 9666, 9497, 9328, 9163,
280 8999, 8837, 8675, 8517, 8359, 8205, 8051, 7901, 7751, 7602,
281 7453, 7308, 7163, 7022, 6882, 6745, 6609, 6476, 6343, 6214,
282 6085, 5960, 5835, 5712, 5589, 5466, 5343, 5223, 5103, 4987,
283 4872, 4761, 4650, 4542, 4435, 4332, 4229, 4130, 4031, 3936,
284 3841, 3747, 3653, 3563, 3473, 3387, 3302, 3220, 3138, 3059,
285 2980, 2905, 2830, 2759, 2688, 2619, 2550, 2481, 2412, 2345,
286 2278, 2215, 2152, 2092, 2032, 1974, 1917, 1863, 1809, 1758,
287 1707, 1659, 1611, 1564, 1517, 1473, 1429, 1387, 1346, 1307,
288 1268, 1230, 1193, 1158, 1123, 1090, 1058, 1026, 994, 962,
289 930, 899, 869, 841, 813, 786, 760, 735, 710, 687,
290 664, 643, 622, 602, 582, 562, 543, 525, 507, 490,
291 473, 457, 442, 427, 412, 398, 385, 373, 361, 349,
292 337, 325, 313, 301, 290, 279, 269, 259, 249, 240,
293 231, 222, 214, 206, 199, 192, 185, 178, 171, 165,
294 159, 153, 148, 143, 138, 133, 128, 123, 119, 115,
295 111, 107, 103, 99, 95, 91, 87, 83, 80, 77,
296 74, 71, 68, 65, 63, 61, 59, 57, 55, 53,
297 51, 49, 47, 45, 43, 41, 40, 39, 38, 37,
298 36, 35, 34, 33, 32, 31, 30, 29, 28, 27,
299 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
300 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
301 6, 5, 4, 3, 2, 1, 0
302 },
303 {
304 16384, 16195, 16006, 15817, 15629, 15441, 15253, 15065, 14878, 14692,
305 14506, 14321, 14136, 13952, 13768, 13585, 13402, 13219, 13037, 12857,
306 12677, 12499, 12321, 12144, 11967, 11792, 11617, 11444, 11271, 11100,
307 10930, 10762, 10594, 10426, 10258, 10091, 9925, 9761, 9598, 9438,
308 9278, 9120, 8963, 8809, 8655, 8504, 8354, 8207, 8060, 7914,
309 7769, 7627, 7485, 7347, 7209, 7074, 6939, 6807, 6676, 6548,
310 6420, 6296, 6172, 6050, 5928, 5806, 5684, 5564, 5444, 5328,
311 5212, 5100, 4988, 4879, 4771, 4667, 4563, 4462, 4362, 4265,
312 4169, 4073, 3978, 3886, 3795, 3707, 3619, 3535, 3451, 3369,
313 3288, 3210, 3133, 3059, 2985, 2913, 2841, 2769, 2697, 2627,
314 2557, 2490, 2424, 2360, 2297, 2237, 2177, 2119, 2062, 2007,
315 1953, 1901, 1849, 1798, 1748, 1700, 1652, 1607, 1562, 1519,
316 1476, 1435, 1394, 1355, 1317, 1281, 1245, 1210, 1175, 1140,
317 1105, 1071, 1037, 1005, 973, 943, 913, 885, 857, 830,
318 804, 779, 754, 731, 708, 685, 663, 642, 621, 601,
319 581, 563, 545, 528, 511, 495, 479, 463, 448, 433,
320 419, 405, 391, 377, 364, 351, 338, 326, 314, 302,
321 291, 280, 270, 260, 251, 242, 234, 226, 218, 210,
322 202, 195, 188, 181, 174, 168, 162, 156, 150, 144,
323 139, 134, 129, 124, 119, 114, 109, 104, 100, 96,
324 92, 88, 84, 80, 77, 74, 71, 68, 65, 62,
325 59, 56, 54, 52, 50, 48, 46, 44, 42, 40,
326 38, 36, 34, 33, 32, 31, 30, 29, 28, 27,
327 26, 25, 24, 23, 22, 21, 20, 19, 18, 17,
328 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
329 6, 5, 4, 3, 2, 1, 0
330 },
331 {
332 16384, 16203, 16022, 15842, 15662, 15482, 15302, 15122, 14942, 14763,
333 14584, 14406, 14228, 14051, 13874, 13698, 13522, 13347, 13172, 12998,
334 12824, 12652, 12480, 12310, 12140, 11971, 11803, 11637, 11471, 11307,
335 11143, 10980, 10817, 10654, 10491, 10330, 10169, 10011, 9853, 9697,
336 9542, 9389, 9236, 9086, 8936, 8789, 8642, 8498, 8355, 8212,
337 8070, 7931, 7792, 7656, 7520, 7388, 7256, 7126, 6996, 6870,
338 6744, 6621, 6498, 6377, 6256, 6135, 6014, 5895, 5776, 5660,
339 5545, 5433, 5321, 5212, 5104, 4999, 4895, 4793, 4692, 4594,
340 4496, 4400, 4304, 4211, 4118, 4028, 3939, 3853, 3767, 3684,
341 3601, 3521, 3441, 3364, 3287, 3212, 3137, 3062, 2987, 2915,
342 2843, 2773, 2704, 2638, 2572, 2508, 2445, 2384, 2324, 2266,
343 2208, 2153, 2098, 2044, 1990, 1939, 1888, 1839, 1791, 1745,
344 1699, 1655, 1611, 1569, 1527, 1487, 1448, 1409, 1370, 1331,
345 1292, 1255, 1218, 1183, 1148, 1115, 1082, 1051, 1020, 990,
346 960, 932, 904, 878, 852, 826, 801, 777, 753, 731,
347 709, 687, 666, 645, 625, 605, 586, 567, 550, 533,
348 516, 499, 482, 465, 449, 433, 418, 403, 389, 375,
349 362, 349, 337, 325, 314, 303, 293, 283, 273, 263,
350 254, 245, 236, 227, 219, 211, 204, 197, 190, 183,
351 177, 171, 165, 159, 153, 147, 141, 135, 130, 125,
352 120, 115, 110, 105, 101, 97, 93, 89, 85, 81,
353 77, 74, 71, 68, 65, 62, 59, 56, 53, 51,
354 49, 47, 45, 43, 41, 39, 37, 35, 33, 31,
355 29, 27, 25, 23, 22, 21, 20, 19, 18, 17,
356 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
357 6, 5, 4, 3, 2, 1, 0
358 },
359 {
360 16384, 16210, 16036, 15863, 15690, 15517, 15344, 15172, 15000, 14828,
361 14656, 14485, 14314, 14145, 13976, 13808, 13640, 13472, 13304, 13137,
362 12970, 12804, 12639, 12475, 12312, 12149, 11987, 11827, 11667, 11508,
363 11349, 11192, 11035, 10878, 10721, 10565, 10410, 10257, 10104, 9953,
364 9802, 9654, 9506, 9359, 9213, 9070, 8927, 8787, 8647, 8508,
365 8369, 8233, 8097, 7964, 7831, 7700, 7570, 7442, 7315, 7190,
366 7065, 6943, 6821, 6701, 6581, 6461, 6341, 6223, 6105, 5990,
367 5876, 5764, 5653, 5545, 5437, 5331, 5226, 5124, 5022, 4924,
368 4826, 4729, 4632, 4538, 4444, 4353, 4262, 4174, 4087, 4002,
369 3917, 3835, 3753, 3674, 3595, 3518, 3441, 3364, 3287, 3212,
370 3138, 3066, 2995, 2926, 2858, 2792, 2726, 2662, 2599, 2538,
371 2478, 2420, 2362, 2305, 2249, 2195, 2141, 2089, 2037, 1988,
372 1939, 1891, 1844, 1799, 1754, 1711, 1668, 1626, 1584, 1542,
373 1500, 1459, 1418, 1380, 1342, 1305, 1269, 1234, 1199, 1166,
374 1133, 1102, 1071, 1041, 1012, 983, 954, 926, 899, 872,
375 847, 822, 798, 774, 751, 728, 707, 686, 666, 646,
376 627, 608, 589, 570, 552, 534, 517, 500, 484, 468,
377 453, 438, 424, 410, 397, 384, 372, 360, 348, 336,
378 325, 314, 303, 293, 283, 273, 264, 255, 246, 237,
379 229, 221, 213, 205, 197, 189, 181, 174, 167, 160,
380 154, 148, 142, 136, 131, 126, 121, 116, 111, 106,
381 101, 97, 93, 89, 85, 81, 77, 73, 70, 67,
382 64, 61, 58, 55, 52, 49, 46, 43, 40, 37,
383 35, 33, 31, 29, 27, 25, 23, 21, 19, 17,
384 16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
385 6, 5, 4, 3, 2, 1, 0
386 },
387 {
388 16384, 16218, 16052, 15886, 15720, 15554, 15389, 15224, 15059, 14895,
389 14731, 14567, 14403, 14240, 14077, 13915, 13753, 13591, 13429, 13269,
390 13109, 12950, 12791, 12633, 12476, 12320, 12164, 12009, 11854, 11701,
391 11548, 11396, 11244, 11092, 10940, 10790, 10640, 10492, 10344, 10198,
392 10052, 9908, 9764, 9622, 9481, 9342, 9203, 9066, 8929, 8793,
393 8657, 8524, 8391, 8261, 8131, 8003, 7875, 7749, 7624, 7502,
394 7380, 7260, 7140, 7022, 6904, 6786, 6668, 6551, 6435, 6322,
395 6209, 6099, 5989, 5881, 5773, 5668, 5563, 5461, 5359, 5260,
396 5161, 5063, 4965, 4871, 4777, 4686, 4595, 4506, 4417, 4331,
397 4245, 4162, 4079, 3999, 3919, 3841, 3763, 3685, 3607, 3530,
398 3454, 3380, 3307, 3236, 3166, 3097, 3029, 2963, 2897, 2834,
399 2771, 2710, 2650, 2591, 2532, 2475, 2418, 2363, 2309, 2257,
400 2205, 2155, 2105, 2057, 2009, 1963, 1918, 1873, 1828, 1783,
401 1738, 1694, 1650, 1607, 1565, 1524, 1484, 1445, 1407, 1369,
402 1333, 1297, 1263, 1229, 1197, 1165, 1134, 1103, 1073, 1043,
403 1015, 987, 960, 933, 907, 882, 858, 834, 811, 788,
404 766, 744, 722, 700, 679, 658, 638, 618, 599, 581,
405 563, 545, 528, 511, 495, 480, 465, 451, 437, 423,
406 410, 397, 384, 372, 360, 348, 337, 326, 315, 305,
407 295, 285, 275, 265, 255, 245, 236, 227, 219, 211,
408 203, 195, 188, 181, 174, 167, 161, 155, 149, 143,
409 137, 131, 126, 121, 116, 111, 106, 101, 97, 93,
410 89, 85, 81, 77, 73, 69, 65, 61, 58, 55,
411 52, 49, 46, 43, 40, 37, 34, 32, 30, 28,
412 26, 24, 22, 20, 18, 16, 14, 12, 10, 8,
413 6, 5, 4, 3, 2, 1, 0
414 }
415 };
416
417
423 };
424
425
426 /** Initialize a given lookup table using a given delta */
428 {
430
431 for (sx = 0; sx < 16; sx++)
434 unsigned int symbol = 1 <<
delta;
435
436 while (
cf_table[sx][symbol] > target)
437 symbol += 1 <<
delta;
438
439 *lut++ = symbol >>
delta;
440 }
441
443 }
444
445
446 /** Retune the index of a suitable lookup table for a given delta */
448 {
450
452
453 if (lut_status[
i] !=
delta)
455
456 return lut;
457 }
458
459
460 /** Initialize the lookup table arrays */
462 uint8_t **cf_lut, int **cf_lut_status)
463 {
466
467 if (!*cf_lut || !*cf_lut_status) {
471 } else {
472 // initialize lut_status buffer to a value never used to compare against
473 memset(*cf_lut_status, -1,
sizeof(**cf_lut_status) *
LUT_BUFF);
474 }
475
476 return 0;
477 }
478
479
480 /** Release the lookup table arrays */
482 {
485 }
486
487
488 /** Initialize decoding and reads the first value */
490 unsigned int *l, unsigned int *v)
491 {
494
496 *l = 0;
498
499 return 0;
500 }
501
502
503 /** Finish decoding */
505 {
507 }
508
509
510 /** Read and decode a block Gilbert-Moore coded symbol */
512 int delta,
unsigned int sx,
513 unsigned int *
h,
unsigned int *l,
unsigned int *v,
514 uint8_t *cf_lut, int *cf_lut_status)
515 {
518
519 // read current state
520 unsigned int high = *
h;
521 unsigned int low = *l;
522 unsigned int value = *v;
523
525
526 // decode num samples
527 for (
i = 0;
i < num;
i++) {
531
532 while (
cf_table[sx][symbol] > target)
533 symbol += 1 <<
delta;
534
535 symbol = (symbol >>
delta) - 1;
536
539
540 while (1) {
550 } else
551 break;
552 }
553
554 low *= 2;
557 }
558
560 }
561
562 // save current state
564 *l = low;
566 }