]> git.sesse.net Git - ffmpeg/blob - libavcodec/cfhddata.c
Merge commit 'c5fd4b50610f62cbb3baa4f4108139363128dea1'
[ffmpeg] / libavcodec / cfhddata.c
1 /*
2  * Copyright (c) 2015 Kieran Kunhya
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "stdint.h"
22 #include "cfhd.h"
23
24 /* some special codewords, not sure what they all mean */
25 #define TABLE_9_BAND_END1 0x1C7859Eh
26 #define TABLE_9_BAND_END_LEN1 25
27 #define TABLE_9_BAND_END2 0x38F0B3Fh
28 #define TABLE_9_BAND_END_LEN2 26
29 #define TABLE_9_BAND_END3 0x38F0B3Eh
30 #define TABLE_9_BAND_END_LEN3 26
31
32 static const uint8_t table_9_vlc_len[NB_VLC_TABLE_9] = {
33      1,    2,    4,    5,    5,    5,    6,    6,
34      6,    7,    7,    8,    8,    8,    8,    9,
35      9,    9,    9,    9,   10,   10,   11,   11,
36     11,   11,   12,   12,   12,   12,   13,   13,
37     13,   14,   14,   14,   14,   14,   14,   15,
38     15,   15,   15,   16,   16,   16,   16,   17,
39     17,   17,   17,   17,   18,   18,   18,   19,
40     19,   19,   20,   20,   20,   20,   20,   22,
41     23,   23,   23,   23,   24,   24,   24,   25,
42     26,   26,
43 };
44
45 static const uint32_t table_9_vlc_bits[NB_VLC_TABLE_9] = {
46             0,       0x2,       0xc,      0x1a,      0x1d,      0x1e,      0x39,      0x3e,
47          0x37,      0x7e,      0x6c,      0xe2,      0xfe,      0xdb,      0xe0,     0x1c3,
48         0x1c6,     0x1ff,     0x1fe,     0x1b5,     0x369,     0x385,     0x71d,     0x6d0,
49         0x708,     0x71f,     0xe3d,     0xe39,     0xe13,     0xe12,    0x1c71,    0x1b45,
50        0x1b47,    0x3689,    0x38f2,    0x38e1,    0x38e0,    0x38f1,    0x3688,    0x6d1b,
51        0x71e0,    0x6d19,    0x71e7,    0xe3cd,    0xda35,    0xda30,    0xe3c3,   0x1b469,
52       0x1b462,   0x1c798,   0x1b463,   0x1c799,   0x38f08,   0x38f09,   0x38f0a,   0x6d1a0,
53       0x6d1a3,   0x6d1a1,   0xda345,   0xda344,   0xe3c2d,   0xe3c2f,   0xe3c2e,  0x38f0b2,
54      0x71e160,  0x71e162,  0x71e166,  0x71e161,  0xe3c2ce,  0xe3c2c6,  0xe3c2c7, 0x1C7859E,
55     0x38F0B3F, 0x38F0B3E,
56 };
57
58 static const uint16_t table_9_vlc_run[NB_VLC_TABLE_9] = {
59     1,    1,    1,    1,   12,    1,   32,  160,
60     1,    1,    1,  320,    1,    1,   80,  120,
61     1,    1,  100,    1,    1,    1,    1,    1,
62     1,    1,    1,    1,    1,    1,    1,    1,
63     1,    1,    1,    1,    1,    1,    1,    1,
64     1,    1,    1,    1,    1,    1,    1,    1,
65     1,    1,    1,    1,    1,    1,    1,    1,
66     1,    1,    1,    1,    1,    1,    1,    1,
67     1,    1,    1,    1,    1,    1,    1,    1,
68     1,    1
69 };
70
71 static const uint8_t table_9_vlc_level[NB_VLC_TABLE_9] = {
72      0,    1,    2,    3,    0,    4,    0,    0,
73      5,    7,    6,    0,    9,    8,    0,    0,
74     11,   12,    0,   10,   13,   14,   17,   15,
75     16,   18,   22,   21,   20,   19,   25,   23,
76     24,   27,   31,   29,   28,   30,   26,   33,
77     34,   32,   35,   39,   37,   36,   38,   42,
78     40,   43,   41,   44,   45,   46,   47,   48,
79     50,   49,   52,   51,   53,   55,   54,   56,
80     57,   59,   60,   58,   61,   62,   63,   64,
81     64,   64,
82 };
83
84 static const uint32_t table_18_vlc_bits[NB_VLC_TABLE_18] = {
85             0,       0x2,       0x7,      0x19,      0x30,      0x36,      0x6f,      0x63,
86          0x69,      0x6b,      0xd1,      0xd4,      0xdc,     0x189,     0x18a,     0x1a0,
87         0x1ab,     0x377,     0x310,     0x316,     0x343,     0x354,     0x375,     0x623,
88         0x684,     0x685,     0x6ab,     0x6ec,     0xddb,     0xc5c,     0xc5e,     0xc44,
89         0xd55,     0xdd1,     0xdd3,    0x1bb5,    0x188b,    0x18bb,    0x18bf,    0x1aa8,
90        0x1ba0,    0x1ba5,    0x1ba4,    0x3115,    0x3175,    0x317d,    0x3553,    0x3768,
91        0x6e87,    0x6ed3,    0x62e8,    0x62f8,    0x6228,    0x6aa4,    0x6e85,    0xc453,
92        0xc5d3,    0xc5f3,    0xdda4,    0xdd08,    0xdd0c,   0x1bb4b,   0x1bb4a,   0x18ba5,
93       0x18be5,   0x1aa95,   0x1aa97,   0x188a4,   0x1ba13,   0x31748,   0x317c8,   0x35528,
94       0x3552c,   0x37424,   0x37434,   0x37436,   0x62294,   0x62e92,   0x62f92,   0x6aa52,
95       0x6aa5a,   0x6e86a,   0x6e86e,   0x6e84a,   0xc452a,   0xc5d27,   0xc5f26,   0xd54a6,
96       0xd54b6,   0xdd096,   0xdd0d6,   0xdd0de,  0x188a56,  0x18ba4d,  0x18be4e,  0x18be4f,
97      0x1aa96e,  0x1ba12e,  0x1ba12f,  0x1ba1af,  0x1ba1bf,  0x37435d,  0x37437d,  0x317498,
98      0x35529c,  0x35529d,  0x3552de,  0x3552df,  0x62e933,  0x62295d,  0x6aa53d,  0x6aa53f,
99      0x6aa53e,  0x6e86b9,  0x6e86f8,  0xd54a79,  0xc5d265,  0xc452b8,  0xdd0d71,  0xd54a78,
100      0xdd0d70,  0xdd0df2,  0xdd0df3, 0x188a5f6, 0x188a5f5, 0x188a5f4, 0x188a5f3, 0x188a5f2,
101     0x188a5f1, 0x188a5f0, 0x188a5ef, 0x188a5ee, 0x188a5ed, 0x188a5aa, 0x188a5e3, 0x188a5df,
102     0x188a589, 0x188a5dd, 0x188a578, 0x188a5e0, 0x188a588, 0x188a5d6, 0x188a5db, 0x188a5e1,
103     0x188a587, 0x188a59a, 0x188a5c4, 0x188a5ec, 0x188a586, 0x188a573, 0x188a59c, 0x188a5c8,
104     0x188a5fb, 0x188a5a1, 0x188a5eb, 0x188a5a8, 0x188a584, 0x188a5d2, 0x188a599, 0x188a598,
105     0x188a583, 0x18ba4c9, 0x188a5d0, 0x188a594, 0x188a582, 0x188a5cb, 0x188a5d8, 0x188a5e7,
106     0x188a581, 0x188a5ea, 0x188a5a9, 0x188a5a6, 0x188a580, 0x188a5a0, 0x188a59d, 0x188a5c3,
107     0x188a57f, 0x188a5c0, 0x188a5de, 0x188a5d4, 0x188a57e, 0x188a5c2, 0x188a592, 0x188a5cd,
108     0x188a57d, 0x188a5a3, 0x188a5e8, 0x188a5a2, 0x188a57c, 0x188a58e, 0x188a5b3, 0x188a5b2,
109     0x188a5b1, 0x188a5b0, 0x188a5af, 0x188a5ae, 0x188a5ad, 0x188a5ac, 0x188a5ab, 0x188a5da,
110     0x188a5e4, 0x188a5e5, 0x188a5d9, 0x188a5b5, 0x188a5bc, 0x188a5bd, 0x188a5e9, 0x188a5cc,
111     0x188a585, 0x188a5d3, 0x188a5e2, 0x188a595, 0x188a596, 0x188a5b8, 0x188a590, 0x188a5c9,
112     0x188a5a4, 0x188a5e6, 0x188a5a5, 0x188a5ce, 0x188a5bf, 0x188a572, 0x188a59b, 0x188a5be,
113     0x188a5c7, 0x188a5ca, 0x188a5d5, 0x188a57b, 0x188a58d, 0x188a58c, 0x188a58b, 0x188a58a,
114     0x18ba4c8, 0x188a5c5, 0x188a5fa, 0x188a5bb, 0x188a5c1, 0x188a5cf, 0x188a5b9, 0x188a5b6,
115     0x188a597, 0x188a5fe, 0x188a5d7, 0x188a5ba, 0x188a591, 0x188a5c6, 0x188a5dc, 0x188a57a,
116     0x188a59f, 0x188a5f9, 0x188a5b4, 0x188a5a7, 0x188a58f, 0x188a5fd, 0x188a5b7, 0x188a593,
117     0x188a59e, 0x188a5f8, 0x188a5ff, 0x188a5fc, 0x188a579, 0x188a5f7, 0x3114ba2, 0x3114ba3,
118 };
119
120 static const uint8_t table_18_vlc_len[NB_VLC_TABLE_18] = {
121      1,  2,  3,  5,  6,  6,  7,  7,
122      7,  7,  8,  8,  8,  9,  9,  9,
123      9, 10, 10, 10, 10, 10, 10, 11,
124     11, 11, 11, 11, 12, 12, 12, 12,
125     12, 12, 12, 13, 13, 13, 13, 13,
126     13, 13, 13, 14, 14, 14, 14, 14,
127     15, 15, 15, 15, 15, 15, 15, 16,
128     16, 16, 16, 16, 16, 17, 17, 17,
129     17, 17, 17, 17, 17, 18, 18, 18,
130     18, 18, 18, 18, 19, 19, 19, 19,
131     19, 19, 19, 19, 20, 20, 20, 20,
132     20, 20, 20, 20, 21, 21, 21, 21,
133     21, 21, 21, 21, 21, 22, 22, 22,
134     22, 22, 22, 22, 23, 23, 23, 23,
135     23, 23, 23, 24, 24, 24, 24, 24,
136     24, 24, 24, 25, 25, 25, 25, 25,
137     25, 25, 25, 25, 25, 25, 25, 25,
138     25, 25, 25, 25, 25, 25, 25, 25,
139     25, 25, 25, 25, 25, 25, 25, 25,
140     25, 25, 25, 25, 25, 25, 25, 25,
141     25, 25, 25, 25, 25, 25, 25, 25,
142     25, 25, 25, 25, 25, 25, 25, 25,
143     25, 25, 25, 25, 25, 25, 25, 25,
144     25, 25, 25, 25, 25, 25, 25, 25,
145     25, 25, 25, 25, 25, 25, 25, 25,
146     25, 25, 25, 25, 25, 25, 25, 25,
147     25, 25, 25, 25, 25, 25, 25, 25,
148     25, 25, 25, 25, 25, 25, 25, 25,
149     25, 25, 25, 25, 25, 25, 25, 25,
150     25, 25, 25, 25, 25, 25, 25, 25,
151     25, 25, 25, 25, 25, 25, 25, 25,
152     25, 25, 25, 25, 25, 25, 25, 25,
153     25, 25, 25, 25, 25, 25, 26, 26,
154 };
155
156 static const uint16_t table_18_vlc_run[NB_VLC_TABLE_18] = {
157     1,    1,    1,    1,    1,    1,    1,    1,
158    12,    1,   20,    1,    1,    1,   32,    1,
159     1,    1,    1,    1,   60,    1,    1,    1,
160     1,  100,    1,    1,    1,    1,    1,    1,
161     1,    1,    1,    1,    1,    1,  180,    1,
162     1,  320,    1,    1,    1,    1,    1,    1,
163     1,    1,    1,    1,    1,    1,    1,    1,
164     1,    1,    1,    1,    1,    1,    1,    1,
165     1,    1,    1,    1,    1,    1,    1,    1,
166     1,    1,    1,    1,    1,    1,    1,    1,
167     1,    1,    1,    1,    1,    1,    1,    1,
168     1,    1,    1,    1,    1,    1,    1,    1,
169     1,    1,    1,    1,    1,    1,    1,    1,
170     1,    1,    1,    1,    1,    1,    1,    1,
171     1,    1,    1,    1,    1,    1,    1,    1,
172     1,    1,    1,    1,    1,    1,    1,    1,
173     1,    1,    1,    1,    1,    1,    1,    1,
174     1,    1,    1,    1,    1,    1,    1,    1,
175     1,    1,    1,    1,    1,    1,    1,    1,
176     1,    1,    1,    1,    1,    1,    1,    1,
177     1,    1,    1,    1,    1,    1,    1,    1,
178     1,    1,    1,    1,    1,    1,    1,    1,
179     1,    1,    1,    1,    1,    1,    1,    1,
180     1,    1,    1,    1,    1,    1,    1,    1,
181     1,    1,    1,    1,    1,    1,    1,    1,
182     1,    1,    1,    1,    1,    1,    1,    1,
183     1,    1,    1,    1,    1,    1,    1,    1,
184     1,    1,    1,    1,    1,    1,    1,    1,
185     1,    1,    1,    1,    1,    1,    1,    1,
186     1,    1,    1,    1,    1,    1,    1,    1,
187     1,    1,    1,    1,    1,    1,    1,    1,
188     1,    1,    1,    1,    1,    1,    1,    1,
189     1,    1,    1,    1,    1,    1,    1,    2,
190 };
191
192 static const uint8_t table_18_vlc_level[NB_VLC_TABLE_18] = {
193       0,    1,    2,    3,    4,    5,    8,    6,
194       0,    7,    0,    9,   10,   11,    0,   12,
195      13,   18,   14,   15,    0,   16,   17,   19,
196      20,    0,   21,   22,   29,   24,   25,   23,
197      26,   27,   28,   35,   30,   31,    0,   32,
198      33,    0,   34,   36,   37,   38,   39,   40,
199      46,   47,   42,   43,   41,   44,   45,   48,
200      49,   50,   53,   51,   52,   61,   60,   55,
201      56,   57,   58,   54,   59,   62,   63,   64,
202      65,   66,   67,   68,   69,   70,   71,   72,
203      73,   75,   76,   74,   77,   78,   79,   80,
204      81,   82,   83,   84,   85,   86,   87,   88,
205      89,   90,   91,   92,   93,   99,  100,   94,
206      95,   96,   97,   98,  102,  101,  103,  105,
207     104,  106,  107,  111,  109,  108,  113,  110,
208     112,  114,  115,  225,  189,  188,  203,  202,
209     197,  207,  169,  223,  159,  235,  152,  192,
210     179,  201,  172,  149,  178,  120,  219,  150,
211     127,  211,  125,  158,  247,  238,  163,  228,
212     183,  217,  168,  122,  128,  249,  187,  186,
213     136,  181,  255,  230,  135,  233,  222,  145,
214     134,  167,  248,  209,  243,  216,  164,  140,
215     157,  239,  191,  251,  156,  139,  242,  133,
216     162,  213,  165,  212,  227,  198,  236,  234,
217     117,  215,  124,  123,  254,  253,  148,  218,
218     146,  147,  224,  143,  184,  185,  166,  132,
219     129,  250,  151,  119,  193,  176,  245,  229,
220     206,  144,  208,  137,  241,  237,  190,  240,
221     131,  232,  252,  171,  205,  204,  118,  214,
222     180,  126,  182,  175,  141,  138,  177,  153,
223     194,  160,  121,  174,  246,  130,  200,  170,
224     221,  196,  142,  210,  199,  155,  154,  244,
225     220,  195,  161,  231,  173,  226,  116,  255,
226 };
227
228 av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
229 {
230     int i, j, ret = 0;
231     uint32_t new_cfhd_vlc_bits[NB_VLC_TABLE_18 * 2];
232     uint8_t  new_cfhd_vlc_len[NB_VLC_TABLE_18 * 2];
233     uint16_t new_cfhd_vlc_run[NB_VLC_TABLE_18 * 2];
234     int16_t  new_cfhd_vlc_level[NB_VLC_TABLE_18 * 2];
235
236     /** Similar to dv.c, generate signed VLC tables **/
237
238     /* Table 9 */
239     for (i = 0, j = 0; i < NB_VLC_TABLE_9; i++, j++) {
240         new_cfhd_vlc_bits[j]  = table_9_vlc_bits[i];
241         new_cfhd_vlc_len[j]   = table_9_vlc_len[i];
242         new_cfhd_vlc_run[j]   = table_9_vlc_run[i];
243         new_cfhd_vlc_level[j] = table_9_vlc_level[i];
244
245         /* Don't include the zero level nor escape bits */
246         if (table_9_vlc_level[i] &&
247             new_cfhd_vlc_bits[j] != table_9_vlc_bits[NB_VLC_TABLE_9-1]) {
248             new_cfhd_vlc_bits[j] <<= 1;
249             new_cfhd_vlc_len[j]++;
250             j++;
251             new_cfhd_vlc_bits[j]  = (table_9_vlc_bits[i] << 1) | 1;
252             new_cfhd_vlc_len[j]   =  table_9_vlc_len[i] + 1;
253             new_cfhd_vlc_run[j]   =  table_9_vlc_run[i];
254             new_cfhd_vlc_level[j] = -table_9_vlc_level[i];
255         }
256     }
257
258     ret = init_vlc(&s->vlc_9, VLC_BITS, j, new_cfhd_vlc_len,
259                    1, 1, new_cfhd_vlc_bits, 4, 4, 0);
260     if (ret < 0)
261         return ret;
262     for (i = 0; i < s->vlc_9.table_size; i++) {
263         int code = s->vlc_9.table[i][0];
264         int len  = s->vlc_9.table[i][1];
265         int level, run;
266
267         if (len < 0) { // more bits needed
268             run   = 0;
269             level = code;
270         } else {
271             run   = new_cfhd_vlc_run[code];
272             level = new_cfhd_vlc_level[code];
273         }
274         s->table_9_rl_vlc[i].len   = len;
275         s->table_9_rl_vlc[i].level = level;
276         s->table_9_rl_vlc[i].run   = run;
277     }
278
279     /* Table 18 */
280     for (i = 0, j = 0; i < NB_VLC_TABLE_18; i++, j++) {
281         new_cfhd_vlc_bits[j]  = table_18_vlc_bits[i];
282         new_cfhd_vlc_len[j]   = table_18_vlc_len[i];
283         new_cfhd_vlc_run[j]   = table_18_vlc_run[i];
284         new_cfhd_vlc_level[j] = table_18_vlc_level[i];
285
286         /* Don't include the zero level nor escape bits */
287         if (table_18_vlc_level[i] &&
288             new_cfhd_vlc_bits[j] != table_18_vlc_bits[NB_VLC_TABLE_18-1]) {
289             new_cfhd_vlc_bits[j] <<= 1;
290             new_cfhd_vlc_len[j]++;
291             j++;
292             new_cfhd_vlc_bits[j]  = (table_18_vlc_bits[i] << 1) | 1;
293             new_cfhd_vlc_len[j]   =  table_18_vlc_len[i] + 1;
294             new_cfhd_vlc_run[j]   =  table_18_vlc_run[i];
295             new_cfhd_vlc_level[j] = -table_18_vlc_level[i];
296         }
297     }
298
299     ret = init_vlc(&s->vlc_18, VLC_BITS, j, new_cfhd_vlc_len,
300                    1, 1, new_cfhd_vlc_bits, 4, 4, 0);
301     if (ret < 0)
302         return ret;
303     av_assert0(s->vlc_18.table_size == 4572);
304
305     for (i = 0; i < s->vlc_18.table_size; i++) {
306         int code = s->vlc_18.table[i][0];
307         int len  = s->vlc_18.table[i][1];
308         int level, run;
309
310         if (len < 0) { // more bits needed
311             run   = 0;
312             level = code;
313         } else {
314             run   = new_cfhd_vlc_run[code];
315             level = new_cfhd_vlc_level[code];
316         }
317         s->table_18_rl_vlc[i].len   = len;
318         s->table_18_rl_vlc[i].level = level;
319         s->table_18_rl_vlc[i].run   = run;
320     }
321
322     return ret;
323 }