summaryrefslogtreecommitdiff
path: root/libavcodec/cfhddata.c (plain)
blob: 9330d3464550c5e193e0396b1c644804662b565d
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
32static 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
45static 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
58static 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
71static 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
84static 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
120static 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
156static 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
192static 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
228av_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}
324