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