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}
561