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