]> git.sesse.net Git - x264/blob - common/vlc.c
Add support for arbitrary user SEIs
[x264] / common / vlc.c
1 /*****************************************************************************
2  * vlc.c : vlc tables
3  *****************************************************************************
4  * Copyright (C) 2003-2010 x264 project
5  *
6  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
7  *          Fiona Glaser <fiona@x264.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22  *
23  * This program is also available under a commercial proprietary license.
24  * For more information, contact us at licensing@x264.com.
25  *****************************************************************************/
26
27 #include "common.h"
28
29 const vlc_t x264_coeff0_token[5] =
30 {
31     { 0x1, 1 }, /* str=1 */
32     { 0x3, 2 }, /* str=11 */
33     { 0xf, 4 }, /* str=1111 */
34     { 0x3, 6 }, /* str=000011 */
35     { 0x1, 2 }, /* str=01 */
36 };
37
38 const vlc_t x264_coeff_token[5][16][4] =
39 {
40     { /* table 0 */
41         { /* i_total 1 */
42             { 0x5, 6 }, /* str=000101 */
43             { 0x1, 2 }, /* str=01 */
44         },
45         { /* i_total 2 */
46             { 0x7, 8 }, /* str=00000111 */
47             { 0x4, 6 }, /* str=000100 */
48             { 0x1, 3 }, /* str=001 */
49         },
50         { /* i_total 3 */
51             { 0x7, 9 }, /* str=000000111 */
52             { 0x6, 8 }, /* str=00000110 */
53             { 0x5, 7 }, /* str=0000101 */
54             { 0x3, 5 }, /* str=00011 */
55         },
56         { /* i_total 4 */
57             { 0x7, 10 }, /* str=0000000111 */
58             { 0x6, 9 },  /* str=000000110 */
59             { 0x5, 8 },  /* str=00000101 */
60             { 0x3, 6 },  /* str=000011 */
61         },
62         { /* i_total 5 */
63             { 0x7, 11 }, /* str=00000000111 */
64             { 0x6, 10 }, /* str=0000000110 */
65             { 0x5, 9 },  /* str=000000101 */
66             { 0x4, 7 },  /* str=0000100 */
67         },
68         { /* i_total 6 */
69             { 0xf, 13 }, /* str=0000000001111 */
70             { 0x6, 11 }, /* str=00000000110 */
71             { 0x5, 10 }, /* str=0000000101 */
72             { 0x4, 8 },  /* str=00000100 */
73         },
74         { /* i_total 7 */
75             { 0xb, 13 }, /* str=0000000001011 */
76             { 0xe, 13 }, /* str=0000000001110 */
77             { 0x5, 11 }, /* str=00000000101 */
78             { 0x4, 9 },  /* str=000000100 */
79         },
80         { /* i_total 8 */
81             { 0x8, 13 }, /* str=0000000001000 */
82             { 0xa, 13 }, /* str=0000000001010 */
83             { 0xd, 13 }, /* str=0000000001101 */
84             { 0x4, 10 }, /* str=0000000100 */
85         },
86         { /* i_total 9 */
87             { 0xf, 14 }, /* str=00000000001111 */
88             { 0xe, 14 }, /* str=00000000001110 */
89             { 0x9, 13 }, /* str=0000000001001 */
90             { 0x4, 11 }, /* str=00000000100 */
91         },
92         { /* i_total 10 */
93             { 0xb, 14 }, /* str=00000000001011 */
94             { 0xa, 14 }, /* str=00000000001010 */
95             { 0xd, 14 }, /* str=00000000001101 */
96             { 0xc, 13 }, /* str=0000000001100 */
97         },
98         { /* i_total 14 */
99             { 0xf, 15 }, /* str=000000000001111 */
100             { 0xe, 15 }, /* str=000000000001110 */
101             { 0x9, 14 }, /* str=00000000001001 */
102             { 0xc, 14 }, /* str=00000000001100 */
103         },
104         { /* i_total 12 */
105             { 0xb, 15 }, /* str=000000000001011 */
106             { 0xa, 15 }, /* str=000000000001010 */
107             { 0xd, 15 }, /* str=000000000001101 */
108             { 0x8, 14 }, /* str=00000000001000 */
109         },
110         { /* i_total 13 */
111             { 0xf, 16 }, /* str=0000000000001111 */
112             { 0x1, 15 }, /* str=000000000000001 */
113             { 0x9, 15 }, /* str=000000000001001 */
114             { 0xc, 15 }, /* str=000000000001100 */
115         },
116         { /* i_total 14 */
117             { 0xb, 16 }, /* str=0000000000001011 */
118             { 0xe, 16 }, /* str=0000000000001110 */
119             { 0xd, 16 }, /* str=0000000000001101 */
120             { 0x8, 15 }, /* str=000000000001000 */
121         },
122         { /* i_total 15 */
123             { 0x7, 16 }, /* str=0000000000000111 */
124             { 0xa, 16 }, /* str=0000000000001010 */
125             { 0x9, 16 }, /* str=0000000000001001 */
126             { 0xc, 16 }, /* str=0000000000001100 */
127         },
128         { /* i_total 16 */
129             { 0x4, 16 }, /* str=0000000000000100 */
130             { 0x6, 16 }, /* str=0000000000000110 */
131             { 0x5, 16 }, /* str=0000000000000101 */
132             { 0x8, 16 }, /* str=0000000000001000 */
133         },
134     },
135     { /* table 1 */
136         { /* i_total 1 */
137             { 0xb, 6 }, /* str=001011 */
138             { 0x2, 2 }, /* str=10 */
139         },
140         { /* i_total 2 */
141             { 0x7, 6 }, /* str=000111 */
142             { 0x7, 5 }, /* str=00111 */
143             { 0x3, 3 }, /* str=011 */
144         },
145         { /* i_total 3 */
146             { 0x7, 7 }, /* str=0000111 */
147             { 0xa, 6 }, /* str=001010 */
148             { 0x9, 6 }, /* str=001001 */
149             { 0x5, 4 }, /* str=0101 */
150         },
151         { /* i_total 4 */
152             { 0x7, 8 }, /* str=00000111 */
153             { 0x6, 6 }, /* str=000110 */
154             { 0x5, 6 }, /* str=000101 */
155             { 0x4, 4 }, /* str=0100 */
156         },
157         { /* i_total 5 */
158             { 0x4, 8 }, /* str=00000100 */
159             { 0x6, 7 }, /* str=0000110 */
160             { 0x5, 7 }, /* str=0000101 */
161             { 0x6, 5 }, /* str=00110 */
162         },
163         { /* i_total 6 */
164             { 0x7, 9 }, /* str=000000111 */
165             { 0x6, 8 }, /* str=00000110 */
166             { 0x5, 8 }, /* str=00000101 */
167             { 0x8, 6 }, /* str=001000 */
168         },
169         { /* i_total 7 */
170             { 0xf, 11 }, /* str=00000001111 */
171             { 0x6, 9 },  /* str=000000110 */
172             { 0x5, 9 },  /* str=000000101 */
173             { 0x4, 6 },  /* str=000100 */
174         },
175         { /* i_total 8 */
176             { 0xb, 11 }, /* str=00000001011 */
177             { 0xe, 11 }, /* str=00000001110 */
178             { 0xd, 11 }, /* str=00000001101 */
179             { 0x4, 7 },  /* str=0000100 */
180         },
181         { /* i_total 9 */
182             { 0xf, 12 }, /* str=000000001111 */
183             { 0xa, 11 }, /* str=00000001010 */
184             { 0x9, 11 }, /* str=00000001001 */
185             { 0x4, 9 },  /* str=000000100 */
186         },
187         { /* i_total 10 */
188             { 0xb, 12 }, /* str=000000001011 */
189             { 0xe, 12 }, /* str=000000001110 */
190             { 0xd, 12 }, /* str=000000001101 */
191             { 0xc, 11 }, /* str=00000001100 */
192         },
193         { /* i_total 11 */
194             { 0x8, 12 }, /* str=000000001000 */
195             { 0xa, 12 }, /* str=000000001010 */
196             { 0x9, 12 }, /* str=000000001001 */
197             { 0x8, 11 }, /* str=00000001000 */
198         },
199         { /* i_total 12 */
200             { 0xf, 13 }, /* str=0000000001111 */
201             { 0xe, 13 }, /* str=0000000001110 */
202             { 0xd, 13 }, /* str=0000000001101 */
203             { 0xc, 12 }, /* str=000000001100 */
204         },
205         { /* i_total 13 */
206             { 0xb, 13 }, /* str=0000000001011 */
207             { 0xa, 13 }, /* str=0000000001010 */
208             { 0x9, 13 }, /* str=0000000001001 */
209             { 0xc, 13 }, /* str=0000000001100 */
210         },
211         { /* i_total 14 */
212             { 0x7, 13 }, /* str=0000000000111 */
213             { 0xb, 14 }, /* str=00000000001011 */
214             { 0x6, 13 }, /* str=0000000000110 */
215             { 0x8, 13 }, /* str=0000000001000 */
216         },
217         { /* i_total 15 */
218             { 0x9, 14 }, /* str=00000000001001 */
219             { 0x8, 14 }, /* str=00000000001000 */
220             { 0xa, 14 }, /* str=00000000001010 */
221             { 0x1, 13 }, /* str=0000000000001 */
222         },
223         { /* i_total 16 */
224             { 0x7, 14 }, /* str=00000000000111 */
225             { 0x6, 14 }, /* str=00000000000110 */
226             { 0x5, 14 }, /* str=00000000000101 */
227             { 0x4, 14 }, /* str=00000000000100 */
228         },
229     },
230     { /* table 2 */
231         { /* i_total 1 */
232             { 0xf, 6 }, /* str=001111 */
233             { 0xe, 4 }, /* str=1110 */
234         },
235         { /* i_total 2 */
236             { 0xb, 6 }, /* str=001011 */
237             { 0xf, 5 }, /* str=01111 */
238             { 0xd, 4 }, /* str=1101 */
239         },
240         { /* i_total 3 */
241             { 0x8, 6 }, /* str=001000 */
242             { 0xc, 5 }, /* str=01100 */
243             { 0xe, 5 }, /* str=01110 */
244             { 0xc, 4 }, /* str=1100 */
245         },
246         { /* i_total 4 */
247             { 0xf, 7 }, /* str=0001111 */
248             { 0xa, 5 }, /* str=01010 */
249             { 0xb, 5 }, /* str=01011 */
250             { 0xb, 4 }, /* str=1011 */
251         },
252         { /* i_total 5 */
253             { 0xb, 7 }, /* str=0001011 */
254             { 0x8, 5 }, /* str=01000 */
255             { 0x9, 5 }, /* str=01001 */
256             { 0xa, 4 }, /* str=1010 */
257         },
258         { /* i_total 6 */
259             { 0x9, 7 }, /* str=0001001 */
260             { 0xe, 6 }, /* str=001110 */
261             { 0xd, 6 }, /* str=001101 */
262             { 0x9, 4 }, /* str=1001 */
263         },
264         { /* i_total 7 */
265             { 0x8, 7 }, /* str=0001000 */
266             { 0xa, 6 }, /* str=001010 */
267             { 0x9, 6 }, /* str=001001 */
268             { 0x8, 4 }, /* str=1000 */
269         },
270         { /* i_total 8 */
271             { 0xf, 8 }, /* str=00001111 */
272             { 0xe, 7 }, /* str=0001110 */
273             { 0xd, 7 }, /* str=0001101 */
274             { 0xd, 5 }, /* str=01101 */
275         },
276         { /* i_total 9 */
277             { 0xb, 8 }, /* str=00001011 */
278             { 0xe, 8 }, /* str=00001110 */
279             { 0xa, 7 }, /* str=0001010 */
280             { 0xc, 6 }, /* str=001100 */
281         },
282         { /* i_total 10 */
283             { 0xf, 9 }, /* str=000001111 */
284             { 0xa, 8 }, /* str=00001010 */
285             { 0xd, 8 }, /* str=00001101 */
286             { 0xc, 7 }, /* str=0001100 */
287         },
288         { /* i_total 11 */
289             { 0xb, 9 }, /* str=000001011 */
290             { 0xe, 9 }, /* str=000001110 */
291             { 0x9, 8 }, /* str=00001001 */
292             { 0xc, 8 }, /* str=00001100 */
293         },
294         { /* i_total 12 */
295             { 0x8, 9 }, /* str=000001000 */
296             { 0xa, 9 }, /* str=000001010 */
297             { 0xd, 9 }, /* str=000001101 */
298             { 0x8, 8 }, /* str=00001000 */
299         },
300         { /* i_total 13 */
301             { 0xd, 10 }, /* str=0000001101 */
302             { 0x7, 9 },  /* str=000000111 */
303             { 0x9, 9 },  /* str=000001001 */
304             { 0xc, 9 },  /* str=000001100 */
305         },
306         { /* i_total 14 */
307             { 0x9, 10 }, /* str=0000001001 */
308             { 0xc, 10 }, /* str=0000001100 */
309             { 0xb, 10 }, /* str=0000001011 */
310             { 0xa, 10 }, /* str=0000001010 */
311         },
312         { /* i_total 15 */
313             { 0x5, 10 }, /* str=0000000101 */
314             { 0x8, 10 }, /* str=0000001000 */
315             { 0x7, 10 }, /* str=0000000111 */
316             { 0x6, 10 }, /* str=0000000110 */
317         },
318         { /* i_total 16 */
319             { 0x1, 10 }, /* str=0000000001 */
320             { 0x4, 10 }, /* str=0000000100 */
321             { 0x3, 10 }, /* str=0000000011 */
322             { 0x2, 10 }, /* str=0000000010 */
323         },
324     },
325     { /* table 3 */
326         { /* i_total 1 */
327             { 0x0, 6 }, /* str=000000 */
328             { 0x1, 6 }, /* str=000001 */
329         },
330         { /* i_total 2 */
331             { 0x4, 6 }, /* str=000100 */
332             { 0x5, 6 }, /* str=000101 */
333             { 0x6, 6 }, /* str=000110 */
334         },
335         { /* i_total 3 */
336             { 0x8, 6 }, /* str=001000 */
337             { 0x9, 6 }, /* str=001001 */
338             { 0xa, 6 }, /* str=001010 */
339             { 0xb, 6 }, /* str=001011 */
340         },
341         { /* i_total 4 */
342             { 0xc, 6 }, /* str=001100 */
343             { 0xd, 6 }, /* str=001101 */
344             { 0xe, 6 }, /* str=001110 */
345             { 0xf, 6 }, /* str=001111 */
346         },
347         { /* i_total 5 */
348             { 0x10, 6 }, /* str=010000 */
349             { 0x11, 6 }, /* str=010001 */
350             { 0x12, 6 }, /* str=010010 */
351             { 0x13, 6 }, /* str=010011 */
352         },
353         { /* i_total 6 */
354             { 0x14, 6 }, /* str=010100 */
355             { 0x15, 6 }, /* str=010101 */
356             { 0x16, 6 }, /* str=010110 */
357             { 0x17, 6 }, /* str=010111 */
358         },
359         { /* i_total 7 */
360             { 0x18, 6 }, /* str=011000 */
361             { 0x19, 6 }, /* str=011001 */
362             { 0x1a, 6 }, /* str=011010 */
363             { 0x1b, 6 }, /* str=011011 */
364         },
365         { /* i_total 8 */
366             { 0x1c, 6 }, /* str=011100 */
367             { 0x1d, 6 }, /* str=011101 */
368             { 0x1e, 6 }, /* str=011110 */
369             { 0x1f, 6 }, /* str=011111 */
370         },
371         { /* i_total 9 */
372             { 0x20, 6 }, /* str=100000 */
373             { 0x21, 6 }, /* str=100001 */
374             { 0x22, 6 }, /* str=100010 */
375             { 0x23, 6 }, /* str=100011 */
376         },
377         { /* i_total 10 */
378             { 0x24, 6 }, /* str=100100 */
379             { 0x25, 6 }, /* str=100101 */
380             { 0x26, 6 }, /* str=100110 */
381             { 0x27, 6 }, /* str=100111 */
382         },
383         { /* i_total 11 */
384             { 0x28, 6 }, /* str=101000 */
385             { 0x29, 6 }, /* str=101001 */
386             { 0x2a, 6 }, /* str=101010 */
387             { 0x2b, 6 }, /* str=101011 */
388         },
389         { /* i_total 12 */
390             { 0x2c, 6 }, /* str=101100 */
391             { 0x2d, 6 }, /* str=101101 */
392             { 0x2e, 6 }, /* str=101110 */
393             { 0x2f, 6 }, /* str=101111 */
394         },
395         { /* i_total 13 */
396             { 0x30, 6 }, /* str=110000 */
397             { 0x31, 6 }, /* str=110001 */
398             { 0x32, 6 }, /* str=110010 */
399             { 0x33, 6 }, /* str=110011 */
400         },
401         { /* i_total 14 */
402             { 0x34, 6 }, /* str=110100 */
403             { 0x35, 6 }, /* str=110101 */
404             { 0x36, 6 }, /* str=110110 */
405             { 0x37, 6 }, /* str=110111 */
406         },
407         { /* i_total 15 */
408             { 0x38, 6 }, /* str=111000 */
409             { 0x39, 6 }, /* str=111001 */
410             { 0x3a, 6 }, /* str=111010 */
411             { 0x3b, 6 }, /* str=111011 */
412         },
413         { /* i_total 16 */
414             { 0x3c, 6 }, /* str=111100 */
415             { 0x3d, 6 }, /* str=111101 */
416             { 0x3e, 6 }, /* str=111110 */
417             { 0x3f, 6 }, /* str=111111 */
418         },
419     },
420     { /* table 4 */
421         { /* i_total 1 */
422             { 0x7, 6 }, /* str=000111 */
423             { 0x1, 1 }, /* str=1 */
424         },
425         { /* i_total 2 */
426             { 0x4, 6 }, /* str=000100 */
427             { 0x6, 6 }, /* str=000110 */
428             { 0x1, 3 }, /* str=001 */
429         },
430         { /* i_total 3 */
431             { 0x3, 6 }, /* str=000011 */
432             { 0x3, 7 }, /* str=0000011 */
433             { 0x2, 7 }, /* str=0000010 */
434             { 0x5, 6 }, /* str=000101 */
435         },
436         { /* i_total 4 */
437             { 0x2, 6 }, /* str=000010 */
438             { 0x3, 8 }, /* str=00000011 */
439             { 0x2, 8 }, /* str=00000010 */
440             { 0x0, 7 }, /* str=0000000 */
441         },
442     },
443 };
444
445 /* [i_total_coeff-1][i_total_zeros] */
446 const vlc_t x264_total_zeros[15][16] =
447 {
448     { /* i_total 1 */
449         { 0x1, 1 }, /* str=1 */
450         { 0x3, 3 }, /* str=011 */
451         { 0x2, 3 }, /* str=010 */
452         { 0x3, 4 }, /* str=0011 */
453         { 0x2, 4 }, /* str=0010 */
454         { 0x3, 5 }, /* str=00011 */
455         { 0x2, 5 }, /* str=00010 */
456         { 0x3, 6 }, /* str=000011 */
457         { 0x2, 6 }, /* str=000010 */
458         { 0x3, 7 }, /* str=0000011 */
459         { 0x2, 7 }, /* str=0000010 */
460         { 0x3, 8 }, /* str=00000011 */
461         { 0x2, 8 }, /* str=00000010 */
462         { 0x3, 9 }, /* str=000000011 */
463         { 0x2, 9 }, /* str=000000010 */
464         { 0x1, 9 }, /* str=000000001 */
465     },
466     { /* i_total 2 */
467         { 0x7, 3 }, /* str=111 */
468         { 0x6, 3 }, /* str=110 */
469         { 0x5, 3 }, /* str=101 */
470         { 0x4, 3 }, /* str=100 */
471         { 0x3, 3 }, /* str=011 */
472         { 0x5, 4 }, /* str=0101 */
473         { 0x4, 4 }, /* str=0100 */
474         { 0x3, 4 }, /* str=0011 */
475         { 0x2, 4 }, /* str=0010 */
476         { 0x3, 5 }, /* str=00011 */
477         { 0x2, 5 }, /* str=00010 */
478         { 0x3, 6 }, /* str=000011 */
479         { 0x2, 6 }, /* str=000010 */
480         { 0x1, 6 }, /* str=000001 */
481         { 0x0, 6 }, /* str=000000 */
482     },
483     { /* i_total 3 */
484         { 0x5, 4 }, /* str=0101 */
485         { 0x7, 3 }, /* str=111 */
486         { 0x6, 3 }, /* str=110 */
487         { 0x5, 3 }, /* str=101 */
488         { 0x4, 4 }, /* str=0100 */
489         { 0x3, 4 }, /* str=0011 */
490         { 0x4, 3 }, /* str=100 */
491         { 0x3, 3 }, /* str=011 */
492         { 0x2, 4 }, /* str=0010 */
493         { 0x3, 5 }, /* str=00011 */
494         { 0x2, 5 }, /* str=00010 */
495         { 0x1, 6 }, /* str=000001 */
496         { 0x1, 5 }, /* str=00001 */
497         { 0x0, 6 }, /* str=000000 */
498     },
499     { /* i_total 4 */
500         { 0x3, 5 }, /* str=00011 */
501         { 0x7, 3 }, /* str=111 */
502         { 0x5, 4 }, /* str=0101 */
503         { 0x4, 4 }, /* str=0100 */
504         { 0x6, 3 }, /* str=110 */
505         { 0x5, 3 }, /* str=101 */
506         { 0x4, 3 }, /* str=100 */
507         { 0x3, 4 }, /* str=0011 */
508         { 0x3, 3 }, /* str=011 */
509         { 0x2, 4 }, /* str=0010 */
510         { 0x2, 5 }, /* str=00010 */
511         { 0x1, 5 }, /* str=00001 */
512         { 0x0, 5 }, /* str=00000 */
513     },
514     { /* i_total 5 */
515         { 0x5, 4 }, /* str=0101 */
516         { 0x4, 4 }, /* str=0100 */
517         { 0x3, 4 }, /* str=0011 */
518         { 0x7, 3 }, /* str=111 */
519         { 0x6, 3 }, /* str=110 */
520         { 0x5, 3 }, /* str=101 */
521         { 0x4, 3 }, /* str=100 */
522         { 0x3, 3 }, /* str=011 */
523         { 0x2, 4 }, /* str=0010 */
524         { 0x1, 5 }, /* str=00001 */
525         { 0x1, 4 }, /* str=0001 */
526         { 0x0, 5 }, /* str=00000 */
527     },
528     { /* i_total 6 */
529         { 0x1, 6 }, /* str=000001 */
530         { 0x1, 5 }, /* str=00001 */
531         { 0x7, 3 }, /* str=111 */
532         { 0x6, 3 }, /* str=110 */
533         { 0x5, 3 }, /* str=101 */
534         { 0x4, 3 }, /* str=100 */
535         { 0x3, 3 }, /* str=011 */
536         { 0x2, 3 }, /* str=010 */
537         { 0x1, 4 }, /* str=0001 */
538         { 0x1, 3 }, /* str=001 */
539         { 0x0, 6 }, /* str=000000 */
540     },
541     { /* i_total 7 */
542         { 0x1, 6 }, /* str=000001 */
543         { 0x1, 5 }, /* str=00001 */
544         { 0x5, 3 }, /* str=101 */
545         { 0x4, 3 }, /* str=100 */
546         { 0x3, 3 }, /* str=011 */
547         { 0x3, 2 }, /* str=11 */
548         { 0x2, 3 }, /* str=010 */
549         { 0x1, 4 }, /* str=0001 */
550         { 0x1, 3 }, /* str=001 */
551         { 0x0, 6 }, /* str=000000 */
552     },
553     { /* i_total 8 */
554         { 0x1, 6 }, /* str=000001 */
555         { 0x1, 4 }, /* str=0001 */
556         { 0x1, 5 }, /* str=00001 */
557         { 0x3, 3 }, /* str=011 */
558         { 0x3, 2 }, /* str=11 */
559         { 0x2, 2 }, /* str=10 */
560         { 0x2, 3 }, /* str=010 */
561         { 0x1, 3 }, /* str=001 */
562         { 0x0, 6 }, /* str=000000 */
563     },
564     { /* i_total 9 */
565         { 0x1, 6 }, /* str=000001 */
566         { 0x0, 6 }, /* str=000000 */
567         { 0x1, 4 }, /* str=0001 */
568         { 0x3, 2 }, /* str=11 */
569         { 0x2, 2 }, /* str=10 */
570         { 0x1, 3 }, /* str=001 */
571         { 0x1, 2 }, /* str=01 */
572         { 0x1, 5 }, /* str=00001 */
573     },
574     { /* i_total 10 */
575         { 0x1, 5 }, /* str=00001 */
576         { 0x0, 5 }, /* str=00000 */
577         { 0x1, 3 }, /* str=001 */
578         { 0x3, 2 }, /* str=11 */
579         { 0x2, 2 }, /* str=10 */
580         { 0x1, 2 }, /* str=01 */
581         { 0x1, 4 }, /* str=0001 */
582     },
583     { /* i_total 11 */
584         { 0x0, 4 }, /* str=0000 */
585         { 0x1, 4 }, /* str=0001 */
586         { 0x1, 3 }, /* str=001 */
587         { 0x2, 3 }, /* str=010 */
588         { 0x1, 1 }, /* str=1 */
589         { 0x3, 3 }, /* str=011 */
590     },
591     { /* i_total 12 */
592         { 0x0, 4 }, /* str=0000 */
593         { 0x1, 4 }, /* str=0001 */
594         { 0x1, 2 }, /* str=01 */
595         { 0x1, 1 }, /* str=1 */
596         { 0x1, 3 }, /* str=001 */
597     },
598     { /* i_total 13 */
599         { 0x0, 3 }, /* str=000 */
600         { 0x1, 3 }, /* str=001 */
601         { 0x1, 1 }, /* str=1 */
602         { 0x1, 2 }, /* str=01 */
603     },
604     { /* i_total 14 */
605         { 0x0, 2 }, /* str=00 */
606         { 0x1, 2 }, /* str=01 */
607         { 0x1, 1 }, /* str=1 */
608     },
609     { /* i_total 15 */
610         { 0x0, 1 }, /* str=0 */
611         { 0x1, 1 }, /* str=1 */
612     },
613 };
614
615 /* [i_total_coeff-1][i_total_zeros] */
616 const vlc_t x264_total_zeros_dc[3][4] =
617 {
618     { /* i_total 1 */
619         { 0x1, 1 }, /* str=1 */
620         { 0x1, 2 }, /* str=01 */
621         { 0x1, 3 }, /* str=001 */
622         { 0x0, 3 }  /* str=000 */
623     },
624     { /* i_total 2 */
625         { 0x1, 1 }, /* str=1 */
626         { 0x1, 2 }, /* str=01 */
627         { 0x0, 2 }, /* str=00 */
628     },
629     { /* i_total 3 */
630         { 0x1, 1 }, /* str=1 */
631         { 0x0, 1 }, /* str=0 */
632     },
633 };
634
635 /* x264_run_before[__MIN( i_zero_left -1, 6 )][run_before] */
636 const vlc_t x264_run_before[7][16] =
637 {
638     { /* i_zero_left 1 */
639         { 0x1, 1 }, /* str=1 */
640         { 0x0, 1 }, /* str=0 */
641     },
642     { /* i_zero_left 2 */
643         { 0x1, 1 }, /* str=1 */
644         { 0x1, 2 }, /* str=01 */
645         { 0x0, 2 }, /* str=00 */
646     },
647     { /* i_zero_left 3 */
648         { 0x3, 2 }, /* str=11 */
649         { 0x2, 2 }, /* str=10 */
650         { 0x1, 2 }, /* str=01 */
651         { 0x0, 2 }, /* str=00 */
652     },
653     { /* i_zero_left 4 */
654         { 0x3, 2 }, /* str=11 */
655         { 0x2, 2 }, /* str=10 */
656         { 0x1, 2 }, /* str=01 */
657         { 0x1, 3 }, /* str=001 */
658         { 0x0, 3 }, /* str=000 */
659     },
660     { /* i_zero_left 5 */
661         { 0x3, 2 }, /* str=11 */
662         { 0x2, 2 }, /* str=10 */
663         { 0x3, 3 }, /* str=011 */
664         { 0x2, 3 }, /* str=010 */
665         { 0x1, 3 }, /* str=001 */
666         { 0x0, 3 }, /* str=000 */
667     },
668     { /* i_zero_left 6 */
669         { 0x3, 2 }, /* str=11 */
670         { 0x0, 3 }, /* str=000 */
671         { 0x1, 3 }, /* str=001 */
672         { 0x3, 3 }, /* str=011 */
673         { 0x2, 3 }, /* str=010 */
674         { 0x5, 3 }, /* str=101 */
675         { 0x4, 3 }, /* str=100 */
676     },
677     { /* i_zero_left 7 */
678         { 0x7, 3 }, /* str=111 */
679         { 0x6, 3 }, /* str=110 */
680         { 0x5, 3 }, /* str=101 */
681         { 0x4, 3 }, /* str=100 */
682         { 0x3, 3 }, /* str=011 */
683         { 0x2, 3 }, /* str=010 */
684         { 0x1, 3 }, /* str=001 */
685         { 0x1, 4 }, /* str=0001 */
686         { 0x1, 5 }, /* str=00001 */
687         { 0x1, 6 }, /* str=000001 */
688         { 0x1, 7 }, /* str=0000001 */
689         { 0x1, 8 }, /* str=00000001 */
690         { 0x1, 9 }, /* str=000000001 */
691         { 0x1, 10 }, /* str=0000000001 */
692         { 0x1, 11 }, /* str=00000000001 */
693     },
694 };
695
696 vlc_large_t x264_level_token[7][LEVEL_TABLE_SIZE];
697
698 void x264_init_vlc_tables()
699 {
700     for( int i_suffix = 0; i_suffix < 7; i_suffix++ )
701         for( int16_t level = -LEVEL_TABLE_SIZE/2; level < LEVEL_TABLE_SIZE/2; level++ )
702         {
703             int mask = level >> 15;
704             int abs_level = (level^mask)-mask;
705             int i_level_code = abs_level*2-mask-2;
706             int i_next = i_suffix;
707             vlc_large_t *vlc = &x264_level_token[i_suffix][level+LEVEL_TABLE_SIZE/2];
708
709             if( ( i_level_code >> i_suffix ) < 14 )
710             {
711                 vlc->i_size = (i_level_code >> i_suffix) + 1 + i_suffix;
712                 vlc->i_bits = (1<<i_suffix) + (i_level_code & ((1<<i_suffix)-1));
713             }
714             else if( i_suffix == 0 && i_level_code < 30 )
715             {
716                 vlc->i_size = 19;
717                 vlc->i_bits = (1<<4) + (i_level_code - 14);
718             }
719             else if( i_suffix > 0 && ( i_level_code >> i_suffix ) == 14 )
720             {
721                 vlc->i_size = 15 + i_suffix;
722                 vlc->i_bits = (1<<i_suffix) + (i_level_code & ((1<<i_suffix)-1));
723             }
724             else
725             {
726                 i_level_code -= 15 << i_suffix;
727                 if( i_suffix == 0 )
728                     i_level_code -= 15;
729                 vlc->i_size = 28;
730                 vlc->i_bits = (1<<12) + i_level_code;
731             }
732             if( i_next == 0 )
733                 i_next++;
734             if( abs_level > (3 << (i_next-1)) && i_next < 6 )
735                 i_next++;
736             vlc->i_next = i_next;
737         }
738 }