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