xref: /third_party/ffmpeg/libavcodec/bgmc.c (revision cabdff1a)
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 */
488int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
489                         unsigned int *l, unsigned int *v)
490{
491    if (get_bits_left(gb) < VALUE_BITS)
492        return AVERROR_INVALIDDATA;
493
494    *h = TOP_VALUE;
495    *l = 0;
496    *v = get_bits(gb, VALUE_BITS);
497
498    return 0;
499}
500
501
502/** Finish decoding */
503void ff_bgmc_decode_end(GetBitContext *gb)
504{
505    skip_bits_long(gb, -(VALUE_BITS - 2));
506}
507
508
509/** Read and decode a block Gilbert-Moore coded symbol */
510void ff_bgmc_decode(GetBitContext *gb, unsigned int num, int32_t *dst,
511                    int delta, unsigned int sx,
512                    unsigned int *h, unsigned int *l, unsigned int *v,
513                    uint8_t *cf_lut, int *cf_lut_status)
514{
515    unsigned int i;
516    uint8_t *lut = bgmc_lut_getp(cf_lut, cf_lut_status, delta);
517
518    // read current state
519    unsigned int high  = *h;
520    unsigned int low   = *l;
521    unsigned int value = *v;
522
523    lut += sx * LUT_SIZE;
524
525    // decode num samples
526    for (i = 0; i < num; i++) {
527        unsigned int range  = high - low + 1;
528        unsigned int target = (((value - low + 1) << FREQ_BITS) - 1) / range;
529        unsigned int symbol = lut[target >> (FREQ_BITS - LUT_BITS)] << delta;
530
531        while (cf_table[sx][symbol] > target)
532            symbol += 1 << delta;
533
534        symbol = (symbol >> delta) - 1;
535
536        high = low + ((range * cf_table[sx][(symbol)     << delta] - (1 << FREQ_BITS)) >> FREQ_BITS);
537        low  = low + ((range * cf_table[sx][(symbol + 1) << delta])                    >> FREQ_BITS);
538
539        while (1) {
540            if (high >= HALF) {
541                if (low >= HALF) {
542                    value -= HALF;
543                    low   -= HALF;
544                    high  -= HALF;
545                } else if (low >= FIRST_QTR && high < THIRD_QTR) {
546                    value -= FIRST_QTR;
547                    low   -= FIRST_QTR;
548                    high  -= FIRST_QTR;
549                } else
550                    break;
551            }
552
553            low  *= 2;
554            high  = 2 * high + 1;
555            value = 2 * value + get_bits1(gb);
556        }
557
558        *dst++ = symbol;
559    }
560
561    // save current state
562    *h = high;
563    *l = low;
564    *v = value;
565}
566