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