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