FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/bgmc.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 67 71 94.4%
Functions: 7 7 100.0%
Branches: 23 26 88.5%

Line Branch Exec Source
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] = {
419 cf_tables_1[0], cf_tables_1[1], cf_tables_1[2], cf_tables_2[0],
420 cf_tables_2[1], cf_tables_2[2], cf_tables_2[3], cf_tables_2[4],
421 cf_tables_2[5], cf_tables_2[6], cf_tables_2[7], cf_tables_3[0],
422 cf_tables_3[1], cf_tables_3[2], cf_tables_3[3], cf_tables_3[4]
423 };
424
425
426 /** Initialize a given lookup table using a given delta */
427 33 static void bgmc_lut_fillp(uint8_t *lut, int *lut_status, int delta)
428 {
429 unsigned int sx, i;
430
431
2/2
✓ Branch 0 taken 528 times.
✓ Branch 1 taken 33 times.
561 for (sx = 0; sx < 16; sx++)
432
2/2
✓ Branch 0 taken 33792 times.
✓ Branch 1 taken 528 times.
34320 for (i = 0; i < LUT_SIZE; i++) {
433 33792 unsigned int target = (i + 1) << (FREQ_BITS - LUT_BITS);
434 33792 unsigned int symbol = 1 << delta;
435
436
2/2
✓ Branch 0 taken 179727 times.
✓ Branch 1 taken 33792 times.
213519 while (cf_table[sx][symbol] > target)
437 179727 symbol += 1 << delta;
438
439 33792 *lut++ = symbol >> delta;
440 }
441
442 33 *lut_status = delta;
443 33 }
444
445
446 /** Retune the index of a suitable lookup table for a given delta */
447 3148 static uint8_t *bgmc_lut_getp(uint8_t *lut, int *lut_status, int delta)
448 {
449 3148 unsigned int i = av_clip(delta, 0, LUT_BUFF - 1);
450
451 3148 lut += (i * LUT_SIZE) << 4;
452
453
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 3115 times.
3148 if (lut_status[i] != delta)
454 33 bgmc_lut_fillp(lut, &lut_status[i], delta);
455
456 3148 return lut;
457 }
458
459
460 /** Initialize the lookup table arrays */
461 4 av_cold int ff_bgmc_init(void *logctx,
462 uint8_t **cf_lut, int **cf_lut_status)
463 {
464 4 *cf_lut = av_malloc(sizeof(**cf_lut) * LUT_BUFF * 16 * LUT_SIZE);
465 4 *cf_lut_status = av_malloc(sizeof(**cf_lut_status) * LUT_BUFF);
466
467
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 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 4 memset(*cf_lut_status, -1, sizeof(**cf_lut_status) * LUT_BUFF);
474 }
475
476 4 return 0;
477 }
478
479
480 /** Release the lookup table arrays */
481 14 av_cold void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status)
482 {
483 14 av_freep(cf_lut);
484 14 av_freep(cf_lut_status);
485 14 }
486
487
488 /** Initialize decoding and reads the first value */
489 1722 int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
490 unsigned int *l, unsigned int *v)
491 {
492
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1722 times.
1722 if (get_bits_left(gb) < VALUE_BITS)
493 return AVERROR_INVALIDDATA;
494
495 1722 *h = TOP_VALUE;
496 1722 *l = 0;
497 1722 *v = get_bits(gb, VALUE_BITS);
498
499 1722 return 0;
500 }
501
502
503 /** Finish decoding */
504 1722 void ff_bgmc_decode_end(GetBitContext *gb)
505 {
506 1722 skip_bits_long(gb, -(VALUE_BITS - 2));
507 1722 }
508
509
510 /** Read and decode a block Gilbert-Moore coded symbol */
511 3148 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 3148 uint8_t *lut = bgmc_lut_getp(cf_lut, cf_lut_status, delta);
518
519 // read current state
520 3148 unsigned int high = *h;
521 3148 unsigned int low = *l;
522 3148 unsigned int value = *v;
523
524 3148 lut += sx * LUT_SIZE;
525
526 // decode num samples
527
2/2
✓ Branch 0 taken 4580858 times.
✓ Branch 1 taken 3148 times.
4584006 for (i = 0; i < num; i++) {
528 4580858 unsigned int range = high - low + 1;
529 4580858 unsigned int target = (((value - low + 1) << FREQ_BITS) - 1) / range;
530 4580858 unsigned int symbol = lut[target >> (FREQ_BITS - LUT_BITS)] << delta;
531
532
2/2
✓ Branch 0 taken 2228540 times.
✓ Branch 1 taken 4580858 times.
6809398 while (cf_table[sx][symbol] > target)
533 2228540 symbol += 1 << delta;
534
535 4580858 symbol = (symbol >> delta) - 1;
536
537 4580858 high = low + ((range * cf_table[sx][(symbol) << delta] - (1 << FREQ_BITS)) >> FREQ_BITS);
538 4580858 low = low + ((range * cf_table[sx][(symbol + 1) << delta]) >> FREQ_BITS);
539
540 while (1) {
541
2/2
✓ Branch 0 taken 18189024 times.
✓ Branch 1 taken 9338050 times.
27527074 if (high >= HALF) {
542
2/2
✓ Branch 0 taken 9362337 times.
✓ Branch 1 taken 8826687 times.
18189024 if (low >= HALF) {
543 9362337 value -= HALF;
544 9362337 low -= HALF;
545 9362337 high -= HALF;
546
4/4
✓ Branch 0 taken 5975776 times.
✓ Branch 1 taken 2850911 times.
✓ Branch 2 taken 4245829 times.
✓ Branch 3 taken 1729947 times.
8826687 } else if (low >= FIRST_QTR && high < THIRD_QTR) {
547 4245829 value -= FIRST_QTR;
548 4245829 low -= FIRST_QTR;
549 4245829 high -= FIRST_QTR;
550 } else
551 break;
552 }
553
554 22946216 low *= 2;
555 22946216 high = 2 * high + 1;
556 22946216 value = 2 * value + get_bits1(gb);
557 }
558
559 4580858 *dst++ = symbol;
560 }
561
562 // save current state
563 3148 *h = high;
564 3148 *l = low;
565 3148 *v = value;
566 3148 }
567