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