FFmpeg
bgmc.c
Go to the documentation of this file.
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 "libavutil/mem.h"
30 #include "bgmc.h"
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 static const uint16_t cf_tables_1[3][129] = {
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 
94 static const uint16_t cf_tables_2[8][193] = {
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 
274 static const uint16_t cf_tables_3[5][257] = {
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 
418 static const uint16_t *const cf_table[16] = {
423 };
424 
425 
426 /** Initialize a given lookup table using a given delta */
427 static void bgmc_lut_fillp(uint8_t *lut, int *lut_status, int delta)
428 {
429  unsigned int sx, i;
430 
431  for (sx = 0; sx < 16; sx++)
432  for (i = 0; i < LUT_SIZE; i++) {
433  unsigned int target = (i + 1) << (FREQ_BITS - LUT_BITS);
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 
442  *lut_status = delta;
443 }
444 
445 
446 /** Retune the index of a suitable lookup table for a given delta */
447 static uint8_t *bgmc_lut_getp(uint8_t *lut, int *lut_status, int delta)
448 {
449  unsigned int i = av_clip(delta, 0, LUT_BUFF - 1);
450 
451  lut += (i * LUT_SIZE) << 4;
452 
453  if (lut_status[i] != delta)
454  bgmc_lut_fillp(lut, &lut_status[i], delta);
455 
456  return lut;
457 }
458 
459 
460 /** Initialize the lookup table arrays */
461 av_cold int ff_bgmc_init(void *logctx,
462  uint8_t **cf_lut, int **cf_lut_status)
463 {
464  *cf_lut = av_malloc(sizeof(**cf_lut) * LUT_BUFF * 16 * LUT_SIZE);
465  *cf_lut_status = av_malloc(sizeof(**cf_lut_status) * LUT_BUFF);
466 
467  if (!*cf_lut || !*cf_lut_status) {
468  ff_bgmc_end(cf_lut, cf_lut_status);
469  av_log(logctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
470  return AVERROR(ENOMEM);
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 */
481 av_cold void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status)
482 {
483  av_freep(cf_lut);
484  av_freep(cf_lut_status);
485 }
486 
487 
488 /** Initialize decoding and reads the first value */
489 int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
490  unsigned int *l, unsigned int *v)
491 {
492  if (get_bits_left(gb) < VALUE_BITS)
493  return AVERROR_INVALIDDATA;
494 
495  *h = TOP_VALUE;
496  *l = 0;
497  *v = get_bits(gb, VALUE_BITS);
498 
499  return 0;
500 }
501 
502 
503 /** Finish decoding */
505 {
506  skip_bits_long(gb, -(VALUE_BITS - 2));
507 }
508 
509 
510 /** Read and decode a block Gilbert-Moore coded symbol */
511 void ff_bgmc_decode(GetBitContext *gb, unsigned int num, int32_t *dst,
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 {
516  unsigned int i;
517  uint8_t *lut = bgmc_lut_getp(cf_lut, cf_lut_status, delta);
518 
519  // read current state
520  unsigned int high = *h;
521  unsigned int low = *l;
522  unsigned int value = *v;
523 
524  lut += sx * LUT_SIZE;
525 
526  // decode num samples
527  for (i = 0; i < num; i++) {
528  unsigned int range = high - low + 1;
529  unsigned int target = (((value - low + 1) << FREQ_BITS) - 1) / range;
530  unsigned int symbol = lut[target >> (FREQ_BITS - LUT_BITS)] << delta;
531 
532  while (cf_table[sx][symbol] > target)
533  symbol += 1 << delta;
534 
535  symbol = (symbol >> delta) - 1;
536 
537  high = low + ((range * cf_table[sx][(symbol) << delta] - (1 << FREQ_BITS)) >> FREQ_BITS);
538  low = low + ((range * cf_table[sx][(symbol + 1) << delta]) >> FREQ_BITS);
539 
540  while (1) {
541  if (high >= HALF) {
542  if (low >= HALF) {
543  value -= HALF;
544  low -= HALF;
545  high -= HALF;
546  } else if (low >= FIRST_QTR && high < THIRD_QTR) {
547  value -= FIRST_QTR;
548  low -= FIRST_QTR;
549  high -= FIRST_QTR;
550  } else
551  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 }
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:278
av_clip
#define av_clip
Definition: common.h:100
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
ff_bgmc_decode_init
int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h, unsigned int *l, unsigned int *v)
Initialize decoding and reads the first value.
Definition: bgmc.c:489
VALUE_BITS
#define VALUE_BITS
Definition: bgmc.c:33
high
int high
Definition: dovi_rpuenc.c:38
TOP_VALUE
#define TOP_VALUE
Definition: bgmc.c:34
bgmc_lut_getp
static uint8_t * bgmc_lut_getp(uint8_t *lut, int *lut_status, int delta)
Retune the index of a suitable lookup table for a given delta.
Definition: bgmc.c:447
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
ff_bgmc_end
av_cold void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status)
Release the lookup table arrays.
Definition: bgmc.c:481
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
LUT_BITS
#define LUT_BITS
Definition: bgmc.c:39
GetBitContext
Definition: get_bits.h:108
LUT_BUFF
#define LUT_BUFF
Definition: bgmc.c:41
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
av_cold
#define av_cold
Definition: attributes.h:90
ff_bgmc_decode
void ff_bgmc_decode(GetBitContext *gb, unsigned int num, int32_t *dst, int delta, unsigned int sx, unsigned int *h, unsigned int *l, unsigned int *v, uint8_t *cf_lut, int *cf_lut_status)
Read and decode a block Gilbert-Moore coded symbol.
Definition: bgmc.c:511
FREQ_BITS
#define FREQ_BITS
Definition: bgmc.c:32
cf_tables_2
static const uint16_t cf_tables_2[8][193]
Definition: bgmc.c:94
HALF
#define HALF
Definition: bgmc.c:36
cf_tables_1
static const uint16_t cf_tables_1[3][129]
Cumulative frequency tables for block Gilbert-Moore coding.
Definition: bgmc.c:45
THIRD_QTR
#define THIRD_QTR
Definition: bgmc.c:37
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
ff_bgmc_init
av_cold int ff_bgmc_init(void *logctx, uint8_t **cf_lut, int **cf_lut_status)
Initialize the lookup table arrays.
Definition: bgmc.c:461
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2464
FIRST_QTR
#define FIRST_QTR
Definition: bgmc.c:35
attributes.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
bgmc.h
LUT_SIZE
#define LUT_SIZE
Definition: bgmc.c:40
delta
float delta
Definition: vorbis_enc_data.h:430
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
cf_tables_3
static const uint16_t cf_tables_3[5][257]
Definition: bgmc.c:274
bgmc_lut_fillp
static void bgmc_lut_fillp(uint8_t *lut, int *lut_status, int delta)
Initialize a given lookup table using a given delta.
Definition: bgmc.c:427
mem.h
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
int32_t
int32_t
Definition: audioconvert.c:56
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_bgmc_decode_end
void ff_bgmc_decode_end(GetBitContext *gb)
Finish decoding.
Definition: bgmc.c:504
cf_table
static const uint16_t *const cf_table[16]
Definition: bgmc.c:418
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2070