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