1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2003-2016 x264 project
6 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
7 * Fiona Glaser <fiona@x264.com>
8 * Henrik Gramner <henrik@gramner.com>
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.
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.
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.
24 * This program is also available under a commercial proprietary license.
25 * For more information, contact us at licensing@x264.com.
26 *****************************************************************************/
31 const vlc_t x264_coeff0_token[6] =
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 */
41 /* [nC][i_total_coeff-1][i_trailing] */
42 const vlc_t x264_coeff_token[6][16][4] =
46 { 0x5, 6 }, /* str=000101 */
47 { 0x1, 2 }, /* str=01 */
50 { 0x7, 8 }, /* str=00000111 */
51 { 0x4, 6 }, /* str=000100 */
52 { 0x1, 3 }, /* str=001 */
55 { 0x7, 9 }, /* str=000000111 */
56 { 0x6, 8 }, /* str=00000110 */
57 { 0x5, 7 }, /* str=0000101 */
58 { 0x3, 5 }, /* str=00011 */
61 { 0x7, 10 }, /* str=0000000111 */
62 { 0x6, 9 }, /* str=000000110 */
63 { 0x5, 8 }, /* str=00000101 */
64 { 0x3, 6 }, /* str=000011 */
67 { 0x7, 11 }, /* str=00000000111 */
68 { 0x6, 10 }, /* str=0000000110 */
69 { 0x5, 9 }, /* str=000000101 */
70 { 0x4, 7 }, /* str=0000100 */
73 { 0xf, 13 }, /* str=0000000001111 */
74 { 0x6, 11 }, /* str=00000000110 */
75 { 0x5, 10 }, /* str=0000000101 */
76 { 0x4, 8 }, /* str=00000100 */
79 { 0xb, 13 }, /* str=0000000001011 */
80 { 0xe, 13 }, /* str=0000000001110 */
81 { 0x5, 11 }, /* str=00000000101 */
82 { 0x4, 9 }, /* str=000000100 */
85 { 0x8, 13 }, /* str=0000000001000 */
86 { 0xa, 13 }, /* str=0000000001010 */
87 { 0xd, 13 }, /* str=0000000001101 */
88 { 0x4, 10 }, /* str=0000000100 */
91 { 0xf, 14 }, /* str=00000000001111 */
92 { 0xe, 14 }, /* str=00000000001110 */
93 { 0x9, 13 }, /* str=0000000001001 */
94 { 0x4, 11 }, /* str=00000000100 */
97 { 0xb, 14 }, /* str=00000000001011 */
98 { 0xa, 14 }, /* str=00000000001010 */
99 { 0xd, 14 }, /* str=00000000001101 */
100 { 0xc, 13 }, /* str=0000000001100 */
103 { 0xf, 15 }, /* str=000000000001111 */
104 { 0xe, 15 }, /* str=000000000001110 */
105 { 0x9, 14 }, /* str=00000000001001 */
106 { 0xc, 14 }, /* str=00000000001100 */
109 { 0xb, 15 }, /* str=000000000001011 */
110 { 0xa, 15 }, /* str=000000000001010 */
111 { 0xd, 15 }, /* str=000000000001101 */
112 { 0x8, 14 }, /* str=00000000001000 */
115 { 0xf, 16 }, /* str=0000000000001111 */
116 { 0x1, 15 }, /* str=000000000000001 */
117 { 0x9, 15 }, /* str=000000000001001 */
118 { 0xc, 15 }, /* str=000000000001100 */
121 { 0xb, 16 }, /* str=0000000000001011 */
122 { 0xe, 16 }, /* str=0000000000001110 */
123 { 0xd, 16 }, /* str=0000000000001101 */
124 { 0x8, 15 }, /* str=000000000001000 */
127 { 0x7, 16 }, /* str=0000000000000111 */
128 { 0xa, 16 }, /* str=0000000000001010 */
129 { 0x9, 16 }, /* str=0000000000001001 */
130 { 0xc, 16 }, /* str=0000000000001100 */
133 { 0x4, 16 }, /* str=0000000000000100 */
134 { 0x6, 16 }, /* str=0000000000000110 */
135 { 0x5, 16 }, /* str=0000000000000101 */
136 { 0x8, 16 }, /* str=0000000000001000 */
141 { 0xb, 6 }, /* str=001011 */
142 { 0x2, 2 }, /* str=10 */
145 { 0x7, 6 }, /* str=000111 */
146 { 0x7, 5 }, /* str=00111 */
147 { 0x3, 3 }, /* str=011 */
150 { 0x7, 7 }, /* str=0000111 */
151 { 0xa, 6 }, /* str=001010 */
152 { 0x9, 6 }, /* str=001001 */
153 { 0x5, 4 }, /* str=0101 */
156 { 0x7, 8 }, /* str=00000111 */
157 { 0x6, 6 }, /* str=000110 */
158 { 0x5, 6 }, /* str=000101 */
159 { 0x4, 4 }, /* str=0100 */
162 { 0x4, 8 }, /* str=00000100 */
163 { 0x6, 7 }, /* str=0000110 */
164 { 0x5, 7 }, /* str=0000101 */
165 { 0x6, 5 }, /* str=00110 */
168 { 0x7, 9 }, /* str=000000111 */
169 { 0x6, 8 }, /* str=00000110 */
170 { 0x5, 8 }, /* str=00000101 */
171 { 0x8, 6 }, /* str=001000 */
174 { 0xf, 11 }, /* str=00000001111 */
175 { 0x6, 9 }, /* str=000000110 */
176 { 0x5, 9 }, /* str=000000101 */
177 { 0x4, 6 }, /* str=000100 */
180 { 0xb, 11 }, /* str=00000001011 */
181 { 0xe, 11 }, /* str=00000001110 */
182 { 0xd, 11 }, /* str=00000001101 */
183 { 0x4, 7 }, /* str=0000100 */
186 { 0xf, 12 }, /* str=000000001111 */
187 { 0xa, 11 }, /* str=00000001010 */
188 { 0x9, 11 }, /* str=00000001001 */
189 { 0x4, 9 }, /* str=000000100 */
192 { 0xb, 12 }, /* str=000000001011 */
193 { 0xe, 12 }, /* str=000000001110 */
194 { 0xd, 12 }, /* str=000000001101 */
195 { 0xc, 11 }, /* str=00000001100 */
198 { 0x8, 12 }, /* str=000000001000 */
199 { 0xa, 12 }, /* str=000000001010 */
200 { 0x9, 12 }, /* str=000000001001 */
201 { 0x8, 11 }, /* str=00000001000 */
204 { 0xf, 13 }, /* str=0000000001111 */
205 { 0xe, 13 }, /* str=0000000001110 */
206 { 0xd, 13 }, /* str=0000000001101 */
207 { 0xc, 12 }, /* str=000000001100 */
210 { 0xb, 13 }, /* str=0000000001011 */
211 { 0xa, 13 }, /* str=0000000001010 */
212 { 0x9, 13 }, /* str=0000000001001 */
213 { 0xc, 13 }, /* str=0000000001100 */
216 { 0x7, 13 }, /* str=0000000000111 */
217 { 0xb, 14 }, /* str=00000000001011 */
218 { 0x6, 13 }, /* str=0000000000110 */
219 { 0x8, 13 }, /* str=0000000001000 */
222 { 0x9, 14 }, /* str=00000000001001 */
223 { 0x8, 14 }, /* str=00000000001000 */
224 { 0xa, 14 }, /* str=00000000001010 */
225 { 0x1, 13 }, /* str=0000000000001 */
228 { 0x7, 14 }, /* str=00000000000111 */
229 { 0x6, 14 }, /* str=00000000000110 */
230 { 0x5, 14 }, /* str=00000000000101 */
231 { 0x4, 14 }, /* str=00000000000100 */
236 { 0xf, 6 }, /* str=001111 */
237 { 0xe, 4 }, /* str=1110 */
240 { 0xb, 6 }, /* str=001011 */
241 { 0xf, 5 }, /* str=01111 */
242 { 0xd, 4 }, /* str=1101 */
245 { 0x8, 6 }, /* str=001000 */
246 { 0xc, 5 }, /* str=01100 */
247 { 0xe, 5 }, /* str=01110 */
248 { 0xc, 4 }, /* str=1100 */
251 { 0xf, 7 }, /* str=0001111 */
252 { 0xa, 5 }, /* str=01010 */
253 { 0xb, 5 }, /* str=01011 */
254 { 0xb, 4 }, /* str=1011 */
257 { 0xb, 7 }, /* str=0001011 */
258 { 0x8, 5 }, /* str=01000 */
259 { 0x9, 5 }, /* str=01001 */
260 { 0xa, 4 }, /* str=1010 */
263 { 0x9, 7 }, /* str=0001001 */
264 { 0xe, 6 }, /* str=001110 */
265 { 0xd, 6 }, /* str=001101 */
266 { 0x9, 4 }, /* str=1001 */
269 { 0x8, 7 }, /* str=0001000 */
270 { 0xa, 6 }, /* str=001010 */
271 { 0x9, 6 }, /* str=001001 */
272 { 0x8, 4 }, /* str=1000 */
275 { 0xf, 8 }, /* str=00001111 */
276 { 0xe, 7 }, /* str=0001110 */
277 { 0xd, 7 }, /* str=0001101 */
278 { 0xd, 5 }, /* str=01101 */
281 { 0xb, 8 }, /* str=00001011 */
282 { 0xe, 8 }, /* str=00001110 */
283 { 0xa, 7 }, /* str=0001010 */
284 { 0xc, 6 }, /* str=001100 */
287 { 0xf, 9 }, /* str=000001111 */
288 { 0xa, 8 }, /* str=00001010 */
289 { 0xd, 8 }, /* str=00001101 */
290 { 0xc, 7 }, /* str=0001100 */
293 { 0xb, 9 }, /* str=000001011 */
294 { 0xe, 9 }, /* str=000001110 */
295 { 0x9, 8 }, /* str=00001001 */
296 { 0xc, 8 }, /* str=00001100 */
299 { 0x8, 9 }, /* str=000001000 */
300 { 0xa, 9 }, /* str=000001010 */
301 { 0xd, 9 }, /* str=000001101 */
302 { 0x8, 8 }, /* str=00001000 */
305 { 0xd, 10 }, /* str=0000001101 */
306 { 0x7, 9 }, /* str=000000111 */
307 { 0x9, 9 }, /* str=000001001 */
308 { 0xc, 9 }, /* str=000001100 */
311 { 0x9, 10 }, /* str=0000001001 */
312 { 0xc, 10 }, /* str=0000001100 */
313 { 0xb, 10 }, /* str=0000001011 */
314 { 0xa, 10 }, /* str=0000001010 */
317 { 0x5, 10 }, /* str=0000000101 */
318 { 0x8, 10 }, /* str=0000001000 */
319 { 0x7, 10 }, /* str=0000000111 */
320 { 0x6, 10 }, /* str=0000000110 */
323 { 0x1, 10 }, /* str=0000000001 */
324 { 0x4, 10 }, /* str=0000000100 */
325 { 0x3, 10 }, /* str=0000000011 */
326 { 0x2, 10 }, /* str=0000000010 */
331 { 0x0, 6 }, /* str=000000 */
332 { 0x1, 6 }, /* str=000001 */
335 { 0x4, 6 }, /* str=000100 */
336 { 0x5, 6 }, /* str=000101 */
337 { 0x6, 6 }, /* str=000110 */
340 { 0x8, 6 }, /* str=001000 */
341 { 0x9, 6 }, /* str=001001 */
342 { 0xa, 6 }, /* str=001010 */
343 { 0xb, 6 }, /* str=001011 */
346 { 0xc, 6 }, /* str=001100 */
347 { 0xd, 6 }, /* str=001101 */
348 { 0xe, 6 }, /* str=001110 */
349 { 0xf, 6 }, /* str=001111 */
352 { 0x10, 6 }, /* str=010000 */
353 { 0x11, 6 }, /* str=010001 */
354 { 0x12, 6 }, /* str=010010 */
355 { 0x13, 6 }, /* str=010011 */
358 { 0x14, 6 }, /* str=010100 */
359 { 0x15, 6 }, /* str=010101 */
360 { 0x16, 6 }, /* str=010110 */
361 { 0x17, 6 }, /* str=010111 */
364 { 0x18, 6 }, /* str=011000 */
365 { 0x19, 6 }, /* str=011001 */
366 { 0x1a, 6 }, /* str=011010 */
367 { 0x1b, 6 }, /* str=011011 */
370 { 0x1c, 6 }, /* str=011100 */
371 { 0x1d, 6 }, /* str=011101 */
372 { 0x1e, 6 }, /* str=011110 */
373 { 0x1f, 6 }, /* str=011111 */
376 { 0x20, 6 }, /* str=100000 */
377 { 0x21, 6 }, /* str=100001 */
378 { 0x22, 6 }, /* str=100010 */
379 { 0x23, 6 }, /* str=100011 */
382 { 0x24, 6 }, /* str=100100 */
383 { 0x25, 6 }, /* str=100101 */
384 { 0x26, 6 }, /* str=100110 */
385 { 0x27, 6 }, /* str=100111 */
388 { 0x28, 6 }, /* str=101000 */
389 { 0x29, 6 }, /* str=101001 */
390 { 0x2a, 6 }, /* str=101010 */
391 { 0x2b, 6 }, /* str=101011 */
394 { 0x2c, 6 }, /* str=101100 */
395 { 0x2d, 6 }, /* str=101101 */
396 { 0x2e, 6 }, /* str=101110 */
397 { 0x2f, 6 }, /* str=101111 */
400 { 0x30, 6 }, /* str=110000 */
401 { 0x31, 6 }, /* str=110001 */
402 { 0x32, 6 }, /* str=110010 */
403 { 0x33, 6 }, /* str=110011 */
406 { 0x34, 6 }, /* str=110100 */
407 { 0x35, 6 }, /* str=110101 */
408 { 0x36, 6 }, /* str=110110 */
409 { 0x37, 6 }, /* str=110111 */
412 { 0x38, 6 }, /* str=111000 */
413 { 0x39, 6 }, /* str=111001 */
414 { 0x3a, 6 }, /* str=111010 */
415 { 0x3b, 6 }, /* str=111011 */
418 { 0x3c, 6 }, /* str=111100 */
419 { 0x3d, 6 }, /* str=111101 */
420 { 0x3e, 6 }, /* str=111110 */
421 { 0x3f, 6 }, /* str=111111 */
426 { 0x7, 6 }, /* str=000111 */
427 { 0x1, 1 }, /* str=1 */
430 { 0x4, 6 }, /* str=000100 */
431 { 0x6, 6 }, /* str=000110 */
432 { 0x1, 3 }, /* str=001 */
435 { 0x3, 6 }, /* str=000011 */
436 { 0x3, 7 }, /* str=0000011 */
437 { 0x2, 7 }, /* str=0000010 */
438 { 0x5, 6 }, /* str=000101 */
441 { 0x2, 6 }, /* str=000010 */
442 { 0x3, 8 }, /* str=00000011 */
443 { 0x2, 8 }, /* str=00000010 */
444 { 0x0, 7 }, /* str=0000000 */
449 { 0xf, 7 }, /* str=0001111 */
450 { 0x1, 2 }, /* str=01 */
453 { 0xe, 7 }, /* str=0001110 */
454 { 0xd, 7 }, /* str=0001101 */
455 { 0x1, 3 }, /* str=001 */
458 { 0x7, 9 }, /* str=000000111 */
459 { 0xc, 7 }, /* str=0001100 */
460 { 0xb, 7 }, /* str=0001011 */
461 { 0x1, 5 }, /* str=00001 */
464 { 0x6, 9 }, /* str=000000110 */
465 { 0x5, 9 }, /* str=000000101 */
466 { 0xa, 7 }, /* str=0001010 */
467 { 0x1, 6 }, /* str=000001 */
470 { 0x7, 10 }, /* str=0000000111 */
471 { 0x6, 10 }, /* str=0000000110 */
472 { 0x4, 9 }, /* str=000000100 */
473 { 0x9, 7 }, /* str=0001001 */
476 { 0x7, 11 }, /* str=00000000111 */
477 { 0x6, 11 }, /* str=00000000110 */
478 { 0x5, 10 }, /* str=0000000101 */
479 { 0x8, 7 }, /* str=0001000 */
482 { 0x7, 12 }, /* str=000000000111 */
483 { 0x6, 12 }, /* str=000000000110 */
484 { 0x5, 11 }, /* str=00000000101 */
485 { 0x4, 10 }, /* str=0000000100 */
488 { 0x7, 13 }, /* str=0000000000111 */
489 { 0x5, 12 }, /* str=000000000101 */
490 { 0x4, 12 }, /* str=000000000100 */
491 { 0x4, 11 }, /* str=00000000100 */
496 /* [i_total_coeff-1][i_total_zeros] */
497 const vlc_t x264_total_zeros[15][16] =
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
650 { 0x0, 3 }, /* str=000 */
651 { 0x1, 3 }, /* str=001 */
652 { 0x1, 1 }, /* str=1 */
653 { 0x1, 2 }, /* str=01 */
656 { 0x0, 2 }, /* str=00 */
657 { 0x1, 2 }, /* str=01 */
658 { 0x1, 1 }, /* str=1 */
661 { 0x0, 1 }, /* str=0 */
662 { 0x1, 1 }, /* str=1 */
666 /* [i_total_coeff-1][i_total_zeros] */
667 const vlc_t x264_total_zeros_2x2_dc[3][4] =
670 { 0x1, 1 }, /* str=1 */
671 { 0x1, 2 }, /* str=01 */
672 { 0x1, 3 }, /* str=001 */
673 { 0x0, 3 } /* str=000 */
676 { 0x1, 1 }, /* str=1 */
677 { 0x1, 2 }, /* str=01 */
678 { 0x0, 2 }, /* str=00 */
681 { 0x1, 1 }, /* str=1 */
682 { 0x0, 1 }, /* str=0 */
686 /* [i_total_coeff-1][i_total_zeros] */
687 const vlc_t x264_total_zeros_2x4_dc[7][8] =
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 */
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 */
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 */
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 */
724 { 0x0, 2 }, /* str=00 */
725 { 0x1, 2 }, /* str=01 */
726 { 0x2, 2 }, /* str=10 */
727 { 0x3, 2 }, /* str=11 */
730 { 0x0, 2 }, /* str=00 */
731 { 0x1, 2 }, /* str=01 */
732 { 0x1, 1 }, /* str=1 */
735 { 0x0, 1 }, /* str=0 */
736 { 0x1, 1 }, /* str=1 */
740 /* [MIN( i_zero_left-1, 6 )][run_before] */
741 static const vlc_t run_before[7][16] =
743 { /* i_zero_left 1 */
744 { 0x1, 1 }, /* str=1 */
745 { 0x0, 1 }, /* str=0 */
747 { /* i_zero_left 2 */
748 { 0x1, 1 }, /* str=1 */
749 { 0x1, 2 }, /* str=01 */
750 { 0x0, 2 }, /* str=00 */
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 */
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 */
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 */
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 */
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 */
801 vlc_large_t x264_level_token[7][LEVEL_TABLE_SIZE];
802 uint32_t x264_run_before[1<<16];
804 void x264_cavlc_init( x264_t *h )
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++ )
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];
815 if( ( i_level_code >> i_suffix ) < 14 )
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));
820 else if( i_suffix == 0 && i_level_code < 30 )
823 vlc->i_bits = (1<<4) + (i_level_code - 14);
825 else if( i_suffix > 0 && ( i_level_code >> i_suffix ) == 14 )
827 vlc->i_size = 15 + i_suffix;
828 vlc->i_bits = (1<<i_suffix) + (i_level_code & ((1<<i_suffix)-1));
832 i_level_code -= 15 << i_suffix;
836 vlc->i_bits = (1<<12) + i_level_code;
840 if( abs_level > (3 << (i_next-1)) && i_next < 6 )
842 vlc->i_next = i_next;
845 for( int i = 1; i < (1<<16); i++ )
847 x264_run_level_t runlevel;
848 ALIGNED_ARRAY_16( dctcoef, dct, [16] );
851 for( int j = 0; j < 16; 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++ )
858 int idx = X264_MIN(zeros, 7) - 1;
859 int run = x264_clz( mask );
860 int len = run_before[idx][run].i_size;
863 bits |= run_before[idx][run].i_bits;
867 x264_run_before[i] = (bits << 5) + size;