comparison bgmc.c @ 11148:2d2780630361 libavcodec

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