FFmpeg
cfhddata.c
Go to the documentation of this file.
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 
38 static 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 
60 static 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 
73 static 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 
86 static 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 
99 static 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 
168 static 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 
204 static 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 
240 static 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 
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 }
level
uint8_t level
Definition: svq3.c:206
init_vlc
#define init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:43
table_9_vlc_run
static const uint16_t table_9_vlc_run[NB_VLC_TABLE_9]
Definition: cfhddata.c:73
NB_VLC_TABLE_9
#define NB_VLC_TABLE_9
Definition: cfhddata.c:35
cfhd.h
table_18_vlc_len
static const uint8_t table_18_vlc_len[NB_VLC_TABLE_18]
Definition: cfhddata.c:168
av_cold
#define av_cold
Definition: attributes.h:90
s
#define s(width, name)
Definition: cbs_vp9.c:256
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
run
uint8_t run
Definition: svq3.c:205
VLC_BITS
#define VLC_BITS
Definition: cfhd.h:96
attributes.h
ff_cfhd_init_vlcs
av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
Definition: cfhddata.c:276
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
CFHDContext
Definition: cfhd.h:140
table_18_vlc_run
static const uint16_t table_18_vlc_run[NB_VLC_TABLE_18]
Definition: cfhddata.c:204
len
int len
Definition: vorbis_enc_data.h:426
ret
ret
Definition: filter_design.txt:187
table_18_vlc_bits
static const uint32_t table_18_vlc_bits[NB_VLC_TABLE_18]
Definition: cfhddata.c:99
table_9_vlc_level
static const uint8_t table_9_vlc_level[NB_VLC_TABLE_9]
Definition: cfhddata.c:86
table_9_vlc_len
static const uint8_t table_9_vlc_len[NB_VLC_TABLE_9]
Definition: cfhddata.c:60
table_9_vlc_bits
static const uint32_t table_9_vlc_bits[NB_VLC_TABLE_9]
Definition: cfhddata.c:38
NB_VLC_TABLE_18
#define NB_VLC_TABLE_18
Definition: cfhddata.c:36
table_18_vlc_level
static const uint8_t table_18_vlc_level[NB_VLC_TABLE_18]
Definition: cfhddata.c:240