]> git.sesse.net Git - x264/blob - common/cabac.c
shave a couple cycles off cabac functions
[x264] / common / cabac.c
1 /*****************************************************************************
2  * cabac.c: h264 encoder library
3  *****************************************************************************
4  * Copyright (C) 2003 Laurent Aimar
5  * $Id: cabac.c,v 1.1 2004/06/03 19:27:06 fenrir Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #include "common.h"
25
26
27 static const int8_t x264_cabac_context_init_I[460][2] =
28 {
29     /* 0 - 10 */
30     { 20, -15 }, {  2, 54 },  {  3,  74 }, { 20, -15 },
31     {  2,  54 }, {  3, 74 },  { -28,127 }, { -23, 104 },
32     { -6,  53 }, { -1, 54 },  {  7,  51 },
33
34     /* 11 - 23 unused for I */
35     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
36     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
37     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
38     { 0, 0 },
39
40     /* 24- 39 */
41     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
42     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
43     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
44     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
45
46     /* 40 - 53 */
47     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
48     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
49     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
50     { 0, 0 },    { 0, 0 },
51
52     /* 54 - 59 */
53     { 0, 0 },    { 0, 0 },    { 0, 0 },      { 0, 0 },
54     { 0, 0 },    { 0, 0 },
55
56     /* 60 - 69 */
57     { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
58     { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
59     { 13, 41 },  { 3, 62 },
60
61     /* 70 -> 87 */
62     { 0, 11 },   { 1, 55 },   { 0, 69 },     { -17, 127 },
63     { -13, 102 },{ 0, 82 },   { -7, 74 },    { -21, 107 },
64     { -27, 127 },{ -31, 127 },{ -24, 127 },  { -18, 95 },
65     { -27, 127 },{ -21, 114 },{ -30, 127 },  { -17, 123 },
66     { -12, 115 },{ -16, 122 },
67
68     /* 88 -> 104 */
69     { -11, 115 },{ -12, 63 }, { -2, 68 },    { -15, 84 },
70     { -13, 104 },{ -3, 70 },  { -8, 93 },    { -10, 90 },
71     { -30, 127 },{ -1, 74 },  { -6, 97 },    { -7, 91 },
72     { -20, 127 },{ -4, 56 },  { -5, 82 },    { -7, 76 },
73     { -22, 125 },
74
75     /* 105 -> 135 */
76     { -7, 93 },  { -11, 87 }, { -3, 77 },    { -5, 71 },
77     { -4, 63 },  { -4, 68 },  { -12, 84 },   { -7, 62 },
78     { -7, 65 },  { 8, 61 },   { 5, 56 },     { -2, 66 },
79     { 1, 64 },   { 0, 61 },   { -2, 78 },    { 1, 50 },
80     { 7, 52 },   { 10, 35 },  { 0, 44 },     { 11, 38 },
81     { 1, 45 },   { 0, 46 },   { 5, 44 },     { 31, 17 },
82     { 1, 51 },   { 7, 50 },   { 28, 19 },    { 16, 33 },
83     { 14, 62 },  { -13, 108 },{ -15, 100 },
84
85     /* 136 -> 165 */
86     { -13, 101 },{ -13, 91 }, { -12, 94 },   { -10, 88 },
87     { -16, 84 }, { -10, 86 }, { -7, 83 },    { -13, 87 },
88     { -19, 94 }, { 1, 70 },   { 0, 72 },     { -5, 74 },
89     { 18, 59 },  { -8, 102 }, { -15, 100 },  { 0, 95 },
90     { -4, 75 },  { 2, 72 },   { -11, 75 },   { -3, 71 },
91     { 15, 46 },  { -13, 69 }, { 0, 62 },     { 0, 65 },
92     { 21, 37 },  { -15, 72 }, { 9, 57 },     { 16, 54 },
93     { 0, 62 },   { 12, 72 },
94
95     /* 166 -> 196 */
96     { 24, 0 },   { 15, 9 },   { 8, 25 },     { 13, 18 },
97     { 15, 9 },   { 13, 19 },  { 10, 37 },    { 12, 18 },
98     { 6, 29 },   { 20, 33 },  { 15, 30 },    { 4, 45 },
99     { 1, 58 },   { 0, 62 },   { 7, 61 },     { 12, 38 },
100     { 11, 45 },  { 15, 39 },  { 11, 42 },    { 13, 44 },
101     { 16, 45 },  { 12, 41 },  { 10, 49 },    { 30, 34 },
102     { 18, 42 },  { 10, 55 },  { 17, 51 },    { 17, 46 },
103     { 0, 89 },   { 26, -19 }, { 22, -17 },
104
105     /* 197 -> 226 */
106     { 26, -17 }, { 30, -25 }, { 28, -20 },   { 33, -23 },
107     { 37, -27 }, { 33, -23 }, { 40, -28 },   { 38, -17 },
108     { 33, -11 }, { 40, -15 }, { 41, -6 },    { 38, 1 },
109     { 41, 17 },  { 30, -6 },  { 27, 3 },     { 26, 22 },
110     { 37, -16 }, { 35, -4 },  { 38, -8 },    { 38, -3 },
111     { 37, 3 },   { 38, 5 },   { 42, 0 },     { 35, 16 },
112     { 39, 22 },  { 14, 48 },  { 27, 37 },    { 21, 60 },
113     { 12, 68 },  { 2, 97 },
114
115     /* 227 -> 251 */
116     { -3, 71 },  { -6, 42 },  { -5, 50 },    { -3, 54 },
117     { -2, 62 },  { 0, 58 },   { 1, 63 },     { -2, 72 },
118     { -1, 74 },  { -9, 91 },  { -5, 67 },    { -5, 27 },
119     { -3, 39 },  { -2, 44 },  { 0, 46 },     { -16, 64 },
120     { -8, 68 },  { -10, 78 }, { -6, 77 },    { -10, 86 },
121     { -12, 92 }, { -15, 55 }, { -10, 60 },   { -6, 62 },
122     { -4, 65 },
123
124     /* 252 -> 275 */
125     { -12, 73 }, { -8, 76 },  { -7, 80 },    { -9, 88 },
126     { -17, 110 },{ -11, 97 }, { -20, 84 },   { -11, 79 },
127     { -6, 73 },  { -4, 74 },  { -13, 86 },   { -13, 96 },
128     { -11, 97 }, { -19, 117 },{ -8, 78 },    { -5, 33 },
129     { -4, 48 },  { -2, 53 },  { -3, 62 },    { -13, 71 },
130     { -10, 79 }, { -12, 86 }, { -13, 90 },   { -14, 97 },
131
132     /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
133     { 0, 0 },
134
135     /* 277 -> 307 */
136     { -6, 93 },  { -6, 84 },  { -8, 79 },    { 0, 66 },
137     { -1, 71 },  { 0, 62 },   { -2, 60 },    { -2, 59 },
138     { -5, 75 },  { -3, 62 },  { -4, 58 },    { -9, 66 },
139     { -1, 79 },  { 0, 71 },   { 3, 68 },     { 10, 44 },
140     { -7, 62 },  { 15, 36 },  { 14, 40 },    { 16, 27 },
141     { 12, 29 },  { 1, 44 },   { 20, 36 },    { 18, 32 },
142     { 5, 42 },   { 1, 48 },   { 10, 62 },    { 17, 46 },
143     { 9, 64 },   { -12, 104 },{ -11, 97 },
144
145     /* 308 -> 337 */
146     { -16, 96 }, { -7, 88 },  { -8, 85 },    { -7, 85 },
147     { -9, 85 },  { -13, 88 }, { 4, 66 },     { -3, 77 },
148     { -3, 76 },  { -6, 76 },  { 10, 58 },    { -1, 76 },
149     { -1, 83 },  { -7, 99 },  { -14, 95 },   { 2, 95 },
150     { 0, 76 },   { -5, 74 },  { 0, 70 },     { -11, 75 },
151     { 1, 68 },   { 0, 65 },   { -14, 73 },   { 3, 62 },
152     { 4, 62 },   { -1, 68 },  { -13, 75 },   { 11, 55 },
153     { 5, 64 },   { 12, 70 },
154
155     /* 338 -> 368 */
156     { 15, 6 },   { 6, 19 },   { 7, 16 },     { 12, 14 },
157     { 18, 13 },  { 13, 11 },  { 13, 15 },    { 15, 16 },
158     { 12, 23 },  { 13, 23 },  { 15, 20 },    { 14, 26 },
159     { 14, 44 },  { 17, 40 },  { 17, 47 },    { 24, 17 },
160     { 21, 21 },  { 25, 22 },  { 31, 27 },    { 22, 29 },
161     { 19, 35 },  { 14, 50 },  { 10, 57 },    { 7, 63 },
162     { -2, 77 },  { -4, 82 },  { -3, 94 },    { 9, 69 },
163     { -12, 109 },{ 36, -35 }, { 36, -34 },
164
165     /* 369 -> 398 */
166     { 32, -26 }, { 37, -30 }, { 44, -32 },   { 34, -18 },
167     { 34, -15 }, { 40, -15 }, { 33, -7 },    { 35, -5 },
168     { 33, 0 },   { 38, 2 },   { 33, 13 },    { 23, 35 },
169     { 13, 58 },  { 29, -3 },  { 26, 0 },     { 22, 30 },
170     { 31, -7 },  { 35, -15 }, { 34, -3 },    { 34, 3 },
171     { 36, -1 },  { 34, 5 },   { 32, 11 },    { 35, 5 },
172     { 34, 12 },  { 39, 11 },  { 30, 29 },    { 34, 26 },
173     { 29, 39 },  { 19, 66 },
174
175     /* 399 -> 435 */
176     {  31,  21 }, {  31,  31 }, {  25,  50 },
177     { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11,  85 },
178     { -15,  92 }, { -14,  89 }, { -26,  71 }, { -15,  81 },
179     { -14,  80 }, {   0,  68 }, { -14,  70 }, { -24,  56 },
180     { -23,  68 }, { -24,  50 }, { -11,  74 }, {  23, -13 },
181     {  26, -13 }, {  40, -15 }, {  49, -14 }, {  44,   3 },
182     {  45,   6 }, {  44,  34 }, {  33,  54 }, {  19,  82 },
183     {  -3,  75 }, {  -1,  23 }, {   1,  34 }, {   1,  43 },
184     {   0,  54 }, {  -2,  55 }, {   0,  61 }, {   1,  64 },
185     {   0,  68 }, {  -9,  92 },
186
187     /* 436 -> 459 */
188     { -14, 106 }, { -13,  97 }, { -15,  90 }, { -12,  90 },
189     { -18,  88 }, { -10,  73 }, {  -9,  79 }, { -14,  86 },
190     { -10,  73 }, { -10,  70 }, { -10,  69 }, {  -5,  66 },
191     {  -9,  64 }, {  -5,  58 }, {   2,  59 }, {  21, -10 },
192     {  24, -11 }, {  28,  -8 }, {  28,  -1 }, {  29,   3 },
193     {  29,   9 }, {  35,  20 }, {  29,  36 }, {  14,  67 }
194 };
195
196 static const int8_t x264_cabac_context_init_PB[3][460][2] =
197 {
198     /* i_cabac_init_idc == 0 */
199     {
200         /* 0 - 10 */
201         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
202         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
203         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
204
205         /* 11 - 23 */
206         {  23,  33 }, {  23,   2 }, {  21,   0 }, {   1,   9 },
207         {   0,  49 }, { -37, 118 }, {   5,  57 }, { -13,  78 },
208         { -11,  65 }, {   1,  62 }, {  12,  49 }, {  -4,  73 },
209         {  17,  50 },
210
211         /* 24 - 39 */
212         {  18,  64 }, {   9,  43 }, {  29,   0 }, {  26,  67 },
213         {  16,  90 }, {   9, 104 }, { -46, 127 }, { -20, 104 },
214         {   1,  67 }, { -13,  78 }, { -11,  65 }, {   1,  62 },
215         {  -6,  86 }, { -17,  95 }, {  -6,  61 }, {   9,  45 },
216
217         /* 40 - 53 */
218         {  -3,  69 }, {  -6,  81 }, { -11,  96 }, {   6,  55 },
219         {   7,  67 }, {  -5,  86 }, {   2,  88 }, {   0,  58 },
220         {  -3,  76 }, { -10,  94 }, {   5,  54 }, {   4,  69 },
221         {  -3,  81 }, {   0,  88 },
222
223         /* 54 - 59 */
224         {  -7,  67 }, {  -5,  74 }, {  -4,  74 }, {  -5,  80 },
225         {  -7,  72 }, {   1,  58 },
226
227         /* 60 - 69 */
228         {   0,  41 }, {   0,  63 }, {   0,  63 }, { 0, 63 },
229         {  -9,  83 }, {   4,  86 }, {   0,  97 }, { -7, 72 },
230         {  13,  41 }, {   3,  62 },
231
232         /* 70 - 87 */
233         {   0,  45 }, {  -4,  78 }, {  -3,  96 }, { -27,  126 },
234         { -28,  98 }, { -25, 101 }, { -23,  67 }, { -28,  82 },
235         { -20,  94 }, { -16,  83 }, { -22, 110 }, { -21,  91 },
236         { -18, 102 }, { -13,  93 }, { -29, 127 }, {  -7,  92 },
237         {  -5,  89 }, {  -7,  96 }, { -13, 108 }, {  -3,  46 },
238         {  -1,  65 }, {  -1,  57 }, {  -9,  93 }, {  -3,  74 },
239         {  -9,  92 }, {  -8,  87 }, { -23, 126 }, {   5,  54 },
240         {   6,  60 }, {   6,  59 }, {   6,  69 }, {  -1,  48 },
241         {   0,  68 }, {  -4,  69 }, {  -8,  88 },
242
243         /* 105 -> 165 */
244         {  -2,  85 }, {  -6,  78 }, {  -1,  75 }, {  -7,  77 },
245         {   2,  54 }, {   5,  50 }, {  -3,  68 }, {   1,  50 },
246         {   6,  42 }, {  -4,  81 }, {   1,  63 }, {  -4,  70 },
247         {   0,  67 }, {   2,  57 }, {  -2,  76 }, {  11,  35 },
248         {   4,  64 }, {   1,  61 }, {  11,  35 }, {  18,  25 },
249         {  12,  24 }, {  13,  29 }, {  13,  36 }, { -10,  93 },
250         {  -7,  73 }, {  -2,  73 }, {  13,  46 }, {   9,  49 },
251         {  -7, 100 }, {   9,  53 }, {   2,  53 }, {   5,  53 },
252         {  -2,  61 }, {   0,  56 }, {   0,  56 }, { -13,  63 },
253         {  -5,  60 }, {  -1,  62 }, {   4,  57 }, {  -6,  69 },
254         {   4,  57 }, {  14,  39 }, {   4,  51 }, {  13,  68 },
255         {   3,  64 }, {   1,  61 }, {   9,  63 }, {   7,  50 },
256         {  16,  39 }, {   5,  44 }, {   4,  52 }, {  11,  48 },
257         {  -5,  60 }, {  -1,  59 }, {   0,  59 }, {  22,  33 },
258         {   5,  44 }, {  14,  43 }, {  -1,  78 }, {   0,  60 },
259         {   9,  69 },
260
261         /* 166 - 226 */
262         {  11,  28 }, {   2,  40 }, {   3,  44 }, {   0,  49 },
263         {   0,  46 }, {   2,  44 }, {   2,  51 }, {   0,  47 },
264         {   4,  39 }, {   2,  62 }, {   6,  46 }, {   0,  54 },
265         {   3,  54 }, {   2,  58 }, {   4,  63 }, {   6,  51 },
266         {   6,  57 }, {   7,  53 }, {   6,  52 }, {   6,  55 },
267         {  11,  45 }, {  14,  36 }, {   8,  53 }, {  -1,  82 },
268         {   7,  55 }, {  -3,  78 }, {  15,  46 }, {  22,  31 },
269         {  -1,  84 }, {  25,   7 }, {  30,  -7 }, {  28,   3 },
270         {  28,   4 }, {  32,   0 }, {  34,  -1 }, {  30,   6 },
271         {  30,   6 }, {  32,   9 }, {  31,  19 }, {  26,  27 },
272         {  26,  30 }, {  37,  20 }, {  28,  34 }, {  17,  70 },
273         {   1,  67 }, {   5,  59 }, {   9,  67 }, {  16,  30 },
274         {  18,  32 }, {  18,  35 }, {  22,  29 }, {  24,  31 },
275         {  23,  38 }, {  18,  43 }, {  20,  41 }, {  11,  63 },
276         {   9,  59 }, {   9,  64 }, {  -1,  94 }, {  -2,  89 },
277         {  -9, 108 },
278
279         /* 227 - 275 */
280         {  -6,  76 }, {  -2,  44 }, {   0,  45 }, {   0,  52 },
281         {  -3,  64 }, {  -2,  59 }, {  -4,  70 }, {  -4,  75 },
282         {  -8,  82 }, { -17, 102 }, {  -9,  77 }, {   3,  24 },
283         {   0,  42 }, {   0,  48 }, {   0,  55 }, {  -6,  59 },
284         {  -7,  71 }, { -12,  83 }, { -11,  87 }, { -30, 119 },
285         {   1,  58 }, {  -3,  29 }, {  -1,  36 }, {   1,  38 },
286         {   2,  43 }, {  -6,  55 }, {   0,  58 }, {   0,  64 },
287         {  -3,  74 }, { -10,  90 }, {   0,  70 }, {  -4,  29 },
288         {   5,  31 }, {   7,  42 }, {   1,  59 }, {  -2,  58 },
289         {  -3,  72 }, {  -3,  81 }, { -11,  97 }, {   0,  58 },
290         {   8,   5 }, {  10,  14 }, {  14,  18 }, {  13,  27 },
291         {   2,  40 }, {   0,  58 }, {  -3,  70 }, {  -6,  79 },
292         {  -8,  85 },
293
294         /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
295         { 0, 0 },
296
297         /* 277 - 337 */
298         { -13, 106 }, { -16, 106 }, { -10,  87 }, { -21, 114 },
299         { -18, 110 }, { -14,  98 }, { -22, 110 }, { -21, 106 },
300         { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
301         { -10,  96 }, { -12,  95 }, {  -5,  91 }, {  -9,  93 },
302         { -22,  94 }, {  -5,  86 }, {   9,  67 }, {  -4,  80 },
303         { -10,  85 }, {  -1,  70 }, {   7,  60 }, {   9,  58 },
304         {   5,  61 }, {  12,  50 }, {  15,  50 }, {  18,  49 },
305         {  17,  54 }, {  10,  41 }, {   7,  46 }, {  -1,  51 },
306         {   7,  49 }, {   8,  52 }, {   9,  41 }, {   6,  47 },
307         {   2,  55 }, {  13,  41 }, {  10,  44 }, {   6,  50 },
308         {   5,  53 }, {  13,  49 }, {   4,  63 }, {   6,  64 },
309         {  -2,  69 }, {  -2,  59 }, {   6,  70 }, {  10,  44 },
310         {   9,  31 }, {  12,  43 }, {   3,  53 }, {  14,  34 },
311         {  10,  38 }, {  -3,  52 }, {  13,  40 }, {  17,  32 },
312         {   7,  44 }, {   7,  38 }, {  13,  50 }, {  10,  57 },
313         {  26,  43 },
314
315         /* 338 - 398 */
316         {  14,  11 }, {  11,  14 }, {   9,  11 }, {  18,  11 },
317         {  21,   9 }, {  23,  -2 }, {  32, -15 }, {  32, -15 },
318         {  34, -21 }, {  39, -23 }, {  42, -33 }, {  41, -31 },
319         {  46, -28 }, {  38, -12 }, {  21,  29 }, {  45, -24 },
320         {  53, -45 }, {  48, -26 }, {  65, -43 }, {  43, -19 },
321         {  39, -10 }, {  30,   9 }, {  18,  26 }, {  20,  27 },
322         {   0,  57 }, { -14,  82 }, {  -5,  75 }, { -19,  97 },
323         { -35, 125 }, {  27,   0 }, {  28,   0 }, {  31,  -4 },
324         {  27,   6 }, {  34,   8 }, {  30,  10 }, {  24,  22 },
325         {  33,  19 }, {  22,  32 }, {  26,  31 }, {  21,  41 },
326         {  26,  44 }, {  23,  47 }, {  16,  65 }, {  14,  71 },
327         {   8,  60 }, {   6,  63 }, {  17,  65 }, {  21,  24 },
328         {  23,  20 }, {  26,  23 }, {  27,  32 }, {  28,  23 },
329         {  28,  24 }, {  23,  40 }, {  24,  32 }, {  28,  29 },
330         {  23,  42 }, {  19,  57 }, {  22,  53 }, {  22,  61 },
331         {  11,  86 },
332
333         /* 399 -> 435 */
334         {  12,  40 }, {  11,  51 }, {  14,  59 },
335         {  -4,  79 }, {  -7,  71 }, {  -5,  69 }, {  -9,  70 },
336         {  -8,  66 }, { -10,  68 }, { -19,  73 }, { -12,  69 },
337         { -16,  70 }, { -15,  67 }, { -20,  62 }, { -19,  70 },
338         { -16,  66 }, { -22,  65 }, { -20,  63 }, {   9,  -2 },
339         {  26,  -9 }, {  33,  -9 }, {  39,  -7 }, {  41,  -2 },
340         {  45,   3 }, {  49,   9 }, {  45,  27 }, {  36,  59 },
341         {  -6,  66 }, {  -7,  35 }, {  -7,  42 }, {  -8,  45 },
342         {  -5,  48 }, { -12,  56 }, {  -6,  60 }, {  -5,  62 },
343         {  -8,  66 }, {  -8,  76 },
344
345         /* 436 -> 459 */
346         {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
347         { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
348         {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
349         { -14,  66 }, {   0,  59 }, {   2,  59 }, {  21, -13 },
350         {  33, -14 }, {  39,  -7 }, {  46,  -2 }, {  51,   2 },
351         {  60,   6 }, {  61,  17 }, {  55,  34 }, {  42,  62 },
352     },
353
354     /* i_cabac_init_idc == 1 */
355     {
356         /* 0 - 10 */
357         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
358         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
359         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
360
361         /* 11 - 23 */
362         {  22,  25 }, {  34,   0 }, {  16,   0 }, {  -2,   9 },
363         {   4,  41 }, { -29, 118 }, {   2,  65 }, {  -6,  71 },
364         { -13,  79 }, {   5,  52 }, {   9,  50 }, {  -3,  70 },
365         {  10,  54 },
366
367         /* 24 - 39 */
368         {  26,  34 }, {  19,  22 }, {  40,   0 }, {  57,   2 },
369         {  41,  36 }, {  26,  69 }, { -45, 127 }, { -15, 101 },
370         {  -4,  76 }, {  -6,  71 }, { -13,  79 }, {   5,  52 },
371         {   6,  69 }, { -13,  90 }, {   0,  52 }, {   8,  43 },
372
373         /* 40 - 53 */
374         {  -2,  69 },{  -5,  82 },{ -10,  96 },{   2,  59 },
375         {   2,  75 },{  -3,  87 },{  -3,  100 },{   1,  56 },
376         {  -3,  74 },{  -6,  85 },{   0,  59 },{  -3,  81 },
377         {  -7,  86 },{  -5,  95 },
378
379         /* 54 - 59 */
380         {  -1,  66 },{  -1,  77 },{   1,  70 },{  -2,  86 },
381         {  -5,  72 },{   0,  61 },
382
383         /* 60 - 69 */
384         { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
385         { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
386         { 13, 41 },  { 3, 62 },
387
388         /* 70 - 104 */
389         {  13,  15 }, {   7,  51 }, {   2,  80 }, { -39, 127 },
390         { -18,  91 }, { -17,  96 }, { -26,  81 }, { -35,  98 },
391         { -24, 102 }, { -23,  97 }, { -27, 119 }, { -24,  99 },
392         { -21, 110 }, { -18, 102 }, { -36, 127 }, {   0,  80 },
393         {  -5,  89 }, {  -7,  94 }, {  -4,  92 }, {   0,  39 },
394         {   0,  65 }, { -15,  84 }, { -35, 127 }, {  -2,  73 },
395         { -12, 104 }, {  -9,  91 }, { -31, 127 }, {   3,  55 },
396         {   7,  56 }, {   7,  55 }, {   8,  61 }, {  -3,  53 },
397         {   0,  68 }, {  -7,  74 }, {  -9,  88 },
398
399         /* 105 -> 165 */
400         { -13, 103 }, { -13,  91 }, {  -9,  89 }, { -14,  92 },
401         {  -8,  76 }, { -12,  87 }, { -23, 110 }, { -24, 105 },
402         { -10,  78 }, { -20, 112 }, { -17,  99 }, { -78, 127 },
403         { -70, 127 }, { -50, 127 }, { -46, 127 }, {  -4,  66 },
404         {  -5,  78 }, {  -4,  71 }, {  -8,  72 }, {   2,  59 },
405         {  -1,  55 }, {  -7,  70 }, {  -6,  75 }, {  -8,  89 },
406         { -34, 119 }, {  -3,  75 }, {  32,  20 }, {  30,  22 },
407         { -44, 127 }, {   0,  54 }, {  -5,  61 }, {   0,  58 },
408         {  -1,  60 }, {  -3,  61 }, {  -8,  67 }, { -25,  84 },
409         { -14,  74 }, {  -5,  65 }, {   5,  52 }, {   2,  57 },
410         {   0,  61 }, {  -9,  69 }, { -11,  70 }, {  18,  55 },
411         {  -4,  71 }, {   0,  58 }, {   7,  61 }, {   9,  41 },
412         {  18,  25 }, {   9,  32 }, {   5,  43 }, {   9,  47 },
413         {   0,  44 }, {   0,  51 }, {   2,  46 }, {  19,  38 },
414         {  -4,  66 }, {  15,  38 }, {  12,  42 }, {   9,  34 },
415         {   0,  89 },
416
417         /* 166 - 226 */
418         {   4,  45 }, {  10,  28 }, {  10,  31 }, {  33, -11 },
419         {  52, -43 }, {  18,  15 }, {  28,   0 }, {  35, -22 },
420         {  38, -25 }, {  34,   0 }, {  39, -18 }, {  32, -12 },
421         { 102, -94 }, {   0,   0 }, {  56, -15 }, {  33,  -4 },
422         {  29,  10 }, {  37,  -5 }, {  51, -29 }, {  39,  -9 },
423         {  52, -34 }, {  69, -58 }, {  67, -63 }, {  44,  -5 },
424         {  32,   7 }, {  55, -29 }, {  32,   1 }, {   0,   0 },
425         {  27,  36 }, {  33, -25 }, {  34, -30 }, {  36, -28 },
426         {  38, -28 }, {  38, -27 }, {  34, -18 }, {  35, -16 },
427         {  34, -14 }, {  32,  -8 }, {  37,  -6 }, {  35,   0 },
428         {  30,  10 }, {  28,  18 }, {  26,  25 }, {  29,  41 },
429         {   0,  75 }, {   2,  72 }, {   8,  77 }, {  14,  35 },
430         {  18,  31 }, {  17,  35 }, {  21,  30 }, {  17,  45 },
431         {  20,  42 }, {  18,  45 }, {  27,  26 }, {  16,  54 },
432         {   7,  66 }, {  16,  56 }, {  11,  73 }, {  10,  67 },
433         { -10, 116 },
434
435         /* 227 - 275 */
436         { -23, 112 }, { -15,  71 }, {  -7,  61 }, {   0,  53 },
437         {  -5,  66 }, { -11,  77 }, {  -9,  80 }, {  -9,  84 },
438         { -10,  87 }, { -34, 127 }, { -21, 101 }, {  -3,  39 },
439         {  -5,  53 }, {  -7,  61 }, { -11,  75 }, { -15,  77 },
440         { -17,  91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
441         { -11,  76 }, { -10,  44 }, { -10,  52 }, { -10,  57 },
442         {  -9,  58 }, { -16,  72 }, {  -7,  69 }, {  -4,  69 },
443         {  -5,  74 }, {  -9,  86 }, {   2,  66 }, {  -9,  34 },
444         {   1,  32 }, {  11,  31 }, {   5,  52 }, {  -2,  55 },
445         {  -2,  67 }, {   0,  73 }, {  -8,  89 }, {   3,  52 },
446         {   7,   4 }, {  10,   8 }, {  17,   8 }, {  16,  19 },
447         {   3,  37 }, {  -1,  61 }, {  -5,  73 }, {  -1,  70 },
448         {  -4,  78 },
449
450         /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
451         { 0, 0 },
452
453         /* 277 - 337 */
454         { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
455         { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
456         { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
457         { -10,  95 }, { -14, 100 }, {  -8,  95 }, { -17, 111 },
458         { -28, 114 }, {  -6,  89 }, {  -2,  80 }, {  -4,  82 },
459         {  -9,  85 }, {  -8,  81 }, {  -1,  72 }, {   5,  64 },
460         {   1,  67 }, {   9,  56 }, {   0,  69 }, {   1,  69 },
461         {   7,  69 }, {  -7,  69 }, {  -6,  67 }, { -16,  77 },
462         {  -2,  64 }, {   2,  61 }, {  -6,  67 }, {  -3,  64 },
463         {   2,  57 }, {  -3,  65 }, {  -3,  66 }, {   0,  62 },
464         {   9,  51 }, {  -1,  66 }, {  -2,  71 }, {  -2,  75 },
465         {  -1,  70 }, {  -9,  72 }, {  14,  60 }, {  16,  37 },
466         {   0,  47 }, {  18,  35 }, {  11,  37 }, {  12,  41 },
467         {  10,  41 }, {   2,  48 }, {  12,  41 }, {  13,  41 },
468         {   0,  59 }, {   3,  50 }, {  19,  40 }, {   3,  66 },
469         {  18,  50 },
470
471         /* 338 - 398 */
472         {  19,  -6 }, {  18,  -6 }, {  14,   0 }, {  26, -12 },
473         {  31, -16 }, {  33, -25 }, {  33, -22 }, {  37, -28 },
474         {  39, -30 }, {  42, -30 }, {  47, -42 }, {  45, -36 },
475         {  49, -34 }, {  41, -17 }, {  32,   9 }, {  69, -71 },
476         {  63, -63 }, {  66, -64 }, {  77, -74 }, {  54, -39 },
477         {  52, -35 }, {  41, -10 }, {  36,   0 }, {  40,  -1 },
478         {  30,  14 }, {  28,  26 }, {  23,  37 }, {  12,  55 },
479         {  11,  65 }, {  37, -33 }, {  39, -36 }, {  40, -37 },
480         {  38, -30 }, {  46, -33 }, {  42, -30 }, {  40, -24 },
481         {  49, -29 }, {  38, -12 }, {  40, -10 }, {  38,  -3 },
482         {  46,  -5 }, {  31,  20 }, {  29,  30 }, {  25,  44 },
483         {  12,  48 }, {  11,  49 }, {  26,  45 }, {  22,  22 },
484         {  23,  22 }, {  27,  21 }, {  33,  20 }, {  26,  28 },
485         {  30,  24 }, {  27,  34 }, {  18,  42 }, {  25,  39 },
486         {  18,  50 }, {  12,  70 }, {  21,  54 }, {  14,  71 },
487         {  11,  83 },
488
489         /* 399 -> 435 */
490         {  25,  32 }, {  21,  49 }, {  21,  54 },
491         {  -5,  85 }, {  -6,  81 }, { -10,  77 }, {  -7,  81 },
492         { -17,  80 }, { -18,  73 }, {  -4,  74 }, { -10,  83 },
493         {  -9,  71 }, {  -9,  67 }, {  -1,  61 }, {  -8,  66 },
494         { -14,  66 }, {   0,  59 }, {   2,  59 }, {  17, -10 },
495         {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
496         {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
497         {  -5,  71 }, {   0,  24 }, {  -1,  36 }, {  -2,  42 },
498         {  -2,  52 }, {  -9,  57 }, {  -6,  63 }, {  -4,  65 },
499         {  -4,  67 }, {  -7,  82 },
500
501         /* 436 -> 459 */
502         {  -3,  81 }, {  -3,  76 }, {  -7,  72 }, {  -6,  78 },
503         { -12,  72 }, { -14,  68 }, {  -3,  70 }, {  -6,  76 },
504         {  -5,  66 }, {  -5,  62 }, {   0,  57 }, {  -4,  61 },
505         {  -9,  60 }, {   1,  54 }, {   2,  58 }, {  17, -10 },
506         {  32, -13 }, {  42,  -9 }, {  49,  -5 }, {  53,   0 },
507         {  64,   3 }, {  68,  10 }, {  66,  27 }, {  47,  57 },
508     },
509
510     /* i_cabac_init_idc == 2 */
511     {
512         /* 0 - 10 */
513         {  20, -15 }, {   2,  54 }, {   3,  74 }, {  20, -15 },
514         {   2,  54 }, {   3,  74 }, { -28, 127 }, { -23, 104 },
515         {  -6,  53 }, {  -1,  54 }, {   7,  51 },
516
517         /* 11 - 23 */
518         {  29,  16 }, {  25,   0 }, {  14,   0 }, { -10,  51 },
519         {  -3,  62 }, { -27,  99 }, {  26,  16 }, {  -4,  85 },
520         { -24, 102 }, {   5,  57 }, {   6,  57 }, { -17,  73 },
521         {  14,  57 },
522
523         /* 24 - 39 */
524         {  20,  40 }, {  20,  10 }, {  29,   0 }, {  54,   0 },
525         {  37,  42 }, {  12,  97 }, { -32, 127 }, { -22, 117 },
526         {  -2,  74 }, {  -4,  85 }, { -24, 102 }, {   5,  57 },
527         {  -6,  93 }, { -14,  88 }, {  -6,  44 }, {   4,  55 },
528
529         /* 40 - 53 */
530         { -11,  89 },{ -15,  103 },{ -21,  116 },{  19,  57 },
531         {  20,  58 },{   4,  84 },{   6,  96 },{   1,  63 },
532         {  -5,  85 },{ -13,  106 },{   5,  63 },{   6,  75 },
533         {  -3,  90 },{  -1,  101 },
534
535         /* 54 - 59 */
536         {   3,  55 },{  -4,  79 },{  -2,  75 },{ -12,  97 },
537         {  -7,  50 },{   1,  60 },
538
539         /* 60 - 69 */
540         { 0, 41 },   { 0, 63 },   { 0, 63 },     { 0, 63 },
541         { -9, 83 },  { 4, 86 },   { 0, 97 },     { -7, 72 },
542         { 13, 41 },  { 3, 62 },
543
544         /* 70 - 104 */
545         {   7,  34 }, {  -9,  88 }, { -20, 127 }, { -36, 127 },
546         { -17,  91 }, { -14,  95 }, { -25,  84 }, { -25,  86 },
547         { -12,  89 }, { -17,  91 }, { -31, 127 }, { -14,  76 },
548         { -18, 103 }, { -13,  90 }, { -37, 127 }, {  11,  80 },
549         {   5,  76 }, {   2,  84 }, {   5,  78 }, {  -6,  55 },
550         {   4,  61 }, { -14,  83 }, { -37, 127 }, {  -5,  79 },
551         { -11, 104 }, { -11,  91 }, { -30, 127 }, {   0,  65 },
552         {  -2,  79 }, {   0,  72 }, {  -4,  92 }, {  -6,  56 },
553         {   3,  68 }, {  -8,  71 }, { -13,  98 },
554
555         /* 105 -> 165 */
556         {  -4,  86 }, { -12,  88 }, {  -5,  82 }, {  -3,  72 },
557         {  -4,  67 }, {  -8,  72 }, { -16,  89 }, {  -9,  69 },
558         {  -1,  59 }, {   5,  66 }, {   4,  57 }, {  -4,  71 },
559         {  -2,  71 }, {   2,  58 }, {  -1,  74 }, {  -4,  44 },
560         {  -1,  69 }, {   0,  62 }, {  -7,  51 }, {  -4,  47 },
561         {  -6,  42 }, {  -3,  41 }, {  -6,  53 }, {   8,  76 },
562         {  -9,  78 }, { -11,  83 }, {   9,  52 }, {   0,  67 },
563         {  -5,  90 }, {   1,  67 }, { -15,  72 }, {  -5,  75 },
564         {  -8,  80 }, { -21,  83 }, { -21,  64 }, { -13,  31 },
565         { -25,  64 }, { -29,  94 }, {   9,  75 }, {  17,  63 },
566         {  -8,  74 }, {  -5,  35 }, {  -2,  27 }, {  13,  91 },
567         {   3,  65 }, {  -7,  69 }, {   8,  77 }, { -10,  66 },
568         {   3,  62 }, {  -3,  68 }, { -20,  81 }, {   0,  30 },
569         {   1,   7 }, {  -3,  23 }, { -21,  74 }, {  16,  66 },
570         { -23, 124 }, {  17,  37 }, {  44, -18 }, {  50, -34 },
571         { -22, 127 },
572
573         /* 166 - 226 */
574         {   4,  39 }, {   0,  42 }, {   7,  34 }, {  11,  29 },
575         {   8,  31 }, {   6,  37 }, {   7,  42 }, {   3,  40 },
576         {   8,  33 }, {  13,  43 }, {  13,  36 }, {   4,  47 },
577         {   3,  55 }, {   2,  58 }, {   6,  60 }, {   8,  44 },
578         {  11,  44 }, {  14,  42 }, {   7,  48 }, {   4,  56 },
579         {   4,  52 }, {  13,  37 }, {   9,  49 }, {  19,  58 },
580         {  10,  48 }, {  12,  45 }, {   0,  69 }, {  20,  33 },
581         {   8,  63 }, {  35, -18 }, {  33, -25 }, {  28,  -3 },
582         {  24,  10 }, {  27,   0 }, {  34, -14 }, {  52, -44 },
583         {  39, -24 }, {  19,  17 }, {  31,  25 }, {  36,  29 },
584         {  24,  33 }, {  34,  15 }, {  30,  20 }, {  22,  73 },
585         {  20,  34 }, {  19,  31 }, {  27,  44 }, {  19,  16 },
586         {  15,  36 }, {  15,  36 }, {  21,  28 }, {  25,  21 },
587         {  30,  20 }, {  31,  12 }, {  27,  16 }, {  24,  42 },
588         {   0,  93 }, {  14,  56 }, {  15,  57 }, {  26,  38 },
589         { -24, 127 },
590
591         /* 227 - 275 */
592         { -24, 115 }, { -22,  82 }, {  -9,  62 }, {   0,  53 },
593         {   0,  59 }, { -14,  85 }, { -13,  89 }, { -13,  94 },
594         { -11,  92 }, { -29, 127 }, { -21, 100 }, { -14,  57 },
595         { -12,  67 }, { -11,  71 }, { -10,  77 }, { -21,  85 },
596         { -16,  88 }, { -23, 104 }, { -15,  98 }, { -37, 127 },
597         { -10,  82 }, {  -8,  48 }, {  -8,  61 }, {  -8,  66 },
598         {  -7,  70 }, { -14,  75 }, { -10,  79 }, {  -9,  83 },
599         { -12,  92 }, { -18, 108 }, {  -4,  79 }, { -22,  69 },
600         { -16,  75 }, {  -2,  58 }, {   1,  58 }, { -13,  78 },
601         {  -9,  83 }, {  -4,  81 }, { -13,  99 }, { -13,  81 },
602         {  -6,  38 }, { -13,  62 }, {  -6,  58 }, {  -2,  59 },
603         { -16,  73 }, { -10,  76 }, { -13,  86 }, {  -9,  83 },
604         { -10,  87 },
605
606         /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
607         { 0, 0 },
608
609         /* 277 - 337 */
610         { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
611         { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
612         { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
613         { -10,  94 }, { -15, 102 }, { -10,  99 }, { -13, 106 },
614         { -50, 127 }, {  -5,  92 }, {  17,  57 }, {  -5,  86 },
615         { -13,  94 }, { -12,  91 }, {  -2,  77 }, {   0,  71 },
616         {  -1,  73 }, {   4,  64 }, {  -7,  81 }, {   5,  64 },
617         {  15,  57 }, {   1,  67 }, {   0,  68 }, { -10,  67 },
618         {   1,  68 }, {   0,  77 }, {   2,  64 }, {   0,  68 },
619         {  -5,  78 }, {   7,  55 }, {   5,  59 }, {   2,  65 },
620         {  14,  54 }, {  15,  44 }, {   5,  60 }, {   2,  70 },
621         {  -2,  76 }, { -18,  86 }, {  12,  70 }, {   5,  64 },
622         { -12,  70 }, {  11,  55 }, {   5,  56 }, {   0,  69 },
623         {   2,  65 }, {  -6,  74 }, {   5,  54 }, {   7,  54 },
624         {  -6,  76 }, { -11,  82 }, {  -2,  77 }, {  -2,  77 },
625         {  25,  42 },
626
627         /* 338 - 398 */
628         {  17, -13 }, {  16,  -9 }, {  17, -12 }, {  27, -21 },
629         {  37, -30 }, {  41, -40 }, {  42, -41 }, {  48, -47 },
630         {  39, -32 }, {  46, -40 }, {  52, -51 }, {  46, -41 },
631         {  52, -39 }, {  43, -19 }, {  32,  11 }, {  61, -55 },
632         {  56, -46 }, {  62, -50 }, {  81, -67 }, {  45, -20 },
633         {  35,  -2 }, {  28,  15 }, {  34,   1 }, {  39,   1 },
634         {  30,  17 }, {  20,  38 }, {  18,  45 }, {  15,  54 },
635         {   0,  79 }, {  36, -16 }, {  37, -14 }, {  37, -17 },
636         {  32,   1 }, {  34,  15 }, {  29,  15 }, {  24,  25 },
637         {  34,  22 }, {  31,  16 }, {  35,  18 }, {  31,  28 },
638         {  33,  41 }, {  36,  28 }, {  27,  47 }, {  21,  62 },
639         {  18,  31 }, {  19,  26 }, {  36,  24 }, {  24,  23 },
640         {  27,  16 }, {  24,  30 }, {  31,  29 }, {  22,  41 },
641         {  22,  42 }, {  16,  60 }, {  15,  52 }, {  14,  60 },
642         {   3,  78 }, { -16, 123 }, {  21,  53 }, {  22,  56 },
643         {  25,  61 },
644
645         /* 399 -> 435 */
646         {  21,  33 }, {  19,  50 }, {  17,  61 },
647         {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
648         { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
649         { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
650         { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
651         {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
652         {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
653         {  -9,  71 }, {  -7,  37 }, {  -8,  44 }, { -11,  49 },
654         { -10,  56 }, { -12,  59 }, {  -8,  63 }, {  -9,  67 },
655         {  -6,  68 }, { -10,  79 },
656
657         /* 436 -> 459 */
658         {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },
659         { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },
660         { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },
661         { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },
662         {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },
663         {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },
664     }
665 };
666
667 /* FIXME could avoid this duplication by reversing the order of states
668  * with MPS=0, but that would uglify the other tables */
669 static const uint8_t x264_cabac_range_lps[128][4] =
670 {
671     {   2,   2,   2,   2 },
672     {   6,   7,   8,   9 }, {   6,   7,   9,  10 }, {   6,   8,   9,  11 },
673     {   7,   8,  10,  11 }, {   7,   9,  10,  12 }, {   7,   9,  11,  12 },
674     {   8,   9,  11,  13 }, {   8,  10,  12,  14 }, {   9,  11,  12,  14 },
675     {   9,  11,  13,  15 }, {  10,  12,  14,  16 }, {  10,  12,  15,  17 },
676     {  11,  13,  15,  18 }, {  11,  14,  16,  19 }, {  12,  14,  17,  20 },
677     {  12,  15,  18,  21 }, {  13,  16,  19,  22 }, {  14,  17,  20,  23 },
678     {  14,  18,  21,  24 }, {  15,  19,  22,  25 }, {  16,  20,  23,  27 },
679     {  17,  21,  25,  28 }, {  18,  22,  26,  30 }, {  19,  23,  27,  31 },
680     {  20,  24,  29,  33 }, {  21,  26,  30,  35 }, {  22,  27,  32,  37 },
681     {  23,  28,  33,  39 }, {  24,  30,  35,  41 }, {  26,  31,  37,  43 },
682     {  27,  33,  39,  45 }, {  29,  35,  41,  48 }, {  30,  37,  43,  50 },
683     {  32,  39,  46,  53 }, {  33,  41,  48,  56 }, {  35,  43,  51,  59 },
684     {  37,  45,  54,  62 }, {  39,  48,  56,  65 }, {  41,  50,  59,  69 },
685     {  43,  53,  63,  72 }, {  46,  56,  66,  76 }, {  48,  59,  69,  80 },
686     {  51,  62,  73,  85 }, {  53,  65,  77,  89 }, {  56,  69,  81,  94 },
687     {  59,  72,  86,  99 }, {  62,  76,  90, 104 }, {  66,  80,  95, 110 },
688     {  69,  85, 100, 116 }, {  73,  89, 105, 122 }, {  77,  94, 111, 128 },
689     {  81,  99, 117, 135 }, {  85, 104, 123, 142 }, {  90, 110, 130, 150 },
690     {  95, 116, 137, 158 }, { 100, 122, 144, 166 }, { 105, 128, 152, 175 },
691     { 111, 135, 160, 185 }, { 116, 142, 169, 195 }, { 123, 150, 178, 205 },
692     { 128, 158, 187, 216 }, { 128, 167, 197, 227 }, { 128, 176, 208, 240 },
693
694     { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 },
695     { 123, 150, 178, 205 }, { 116, 142, 169, 195 }, { 111, 135, 160, 185 },
696     { 105, 128, 152, 175 }, { 100, 122, 144, 166 }, {  95, 116, 137, 158 },
697     {  90, 110, 130, 150 }, {  85, 104, 123, 142 }, {  81,  99, 117, 135 },
698     {  77,  94, 111, 128 }, {  73,  89, 105, 122 }, {  69,  85, 100, 116 },
699     {  66,  80,  95, 110 }, {  62,  76,  90, 104 }, {  59,  72,  86,  99 },
700     {  56,  69,  81,  94 }, {  53,  65,  77,  89 }, {  51,  62,  73,  85 },
701     {  48,  59,  69,  80 }, {  46,  56,  66,  76 }, {  43,  53,  63,  72 },
702     {  41,  50,  59,  69 }, {  39,  48,  56,  65 }, {  37,  45,  54,  62 },
703     {  35,  43,  51,  59 }, {  33,  41,  48,  56 }, {  32,  39,  46,  53 },
704     {  30,  37,  43,  50 }, {  29,  35,  41,  48 }, {  27,  33,  39,  45 },
705     {  26,  31,  37,  43 }, {  24,  30,  35,  41 }, {  23,  28,  33,  39 },
706     {  22,  27,  32,  37 }, {  21,  26,  30,  35 }, {  20,  24,  29,  33 },
707     {  19,  23,  27,  31 }, {  18,  22,  26,  30 }, {  17,  21,  25,  28 },
708     {  16,  20,  23,  27 }, {  15,  19,  22,  25 }, {  14,  18,  21,  24 },
709     {  14,  17,  20,  23 }, {  13,  16,  19,  22 }, {  12,  15,  18,  21 },
710     {  12,  14,  17,  20 }, {  11,  14,  16,  19 }, {  11,  13,  15,  18 },
711     {  10,  12,  15,  17 }, {  10,  12,  14,  16 }, {   9,  11,  13,  15 },
712     {   9,  11,  12,  14 }, {   8,  10,  12,  14 }, {   8,   9,  11,  13 },
713     {   7,   9,  11,  12 }, {   7,   9,  10,  12 }, {   7,   8,  10,  11 },
714     {   6,   8,   9,  11 }, {   6,   7,   9,  10 }, {   6,   7,   8,   9 },
715     {   2,   2,   2,   2 },
716 };
717
718 static const uint8_t x264_cabac_transition[2][128] =
719 {{
720       0,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
721      15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
722      31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
723      47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
724      63, 64, 65, 66, 66, 68, 68, 69, 70, 71, 72, 73, 73, 75, 75, 76,
725      77, 77, 79, 79, 80, 80, 82, 82, 83, 83, 85, 85, 86, 86, 87, 88,
726      88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 94, 95, 96, 96, 97,
727      97, 97, 98, 98, 99, 99, 99,100,100,100,101,101,101,102,102,127,
728 },{
729       0, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30,
730      30, 31, 31, 32, 33, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39,
731      39, 40, 41, 41, 42, 42, 44, 44, 45, 45, 47, 47, 48, 48, 50, 50,
732      51, 52, 52, 54, 54, 55, 56, 57, 58, 59, 59, 61, 61, 62, 63, 64,
733      65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
734      81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
735      97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,
736     113,114,115,116,117,118,119,120,121,122,123,124,125,126,126,127,
737 }};
738
739 static const uint8_t renorm_shift[64]= {
740  6,5,4,4,3,3,3,3,2,2,2,2,2,2,2,2,
741  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
742  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
743  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
744 };
745
746 static const uint8_t x264_cabac_probability[128] =
747 {
748     FIX8(0.9812), FIX8(0.9802), FIX8(0.9792), FIX8(0.9781),
749     FIX8(0.9769), FIX8(0.9757), FIX8(0.9744), FIX8(0.9730),
750     FIX8(0.9716), FIX8(0.9700), FIX8(0.9684), FIX8(0.9667),
751     FIX8(0.9650), FIX8(0.9631), FIX8(0.9611), FIX8(0.9590),
752     FIX8(0.9568), FIX8(0.9545), FIX8(0.9521), FIX8(0.9495),
753     FIX8(0.9468), FIX8(0.9440), FIX8(0.9410), FIX8(0.9378),
754     FIX8(0.9345), FIX8(0.9310), FIX8(0.9273), FIX8(0.9234),
755     FIX8(0.9193), FIX8(0.9150), FIX8(0.9105), FIX8(0.9057),
756     FIX8(0.9006), FIX8(0.8953), FIX8(0.8897), FIX8(0.8838),
757     FIX8(0.8776), FIX8(0.8710), FIX8(0.8641), FIX8(0.8569),
758     FIX8(0.8492), FIX8(0.8411), FIX8(0.8326), FIX8(0.8237),
759     FIX8(0.8143), FIX8(0.8043), FIX8(0.7938), FIX8(0.7828),
760     FIX8(0.7712), FIX8(0.7590), FIX8(0.7461), FIX8(0.7325),
761     FIX8(0.7182), FIX8(0.7031), FIX8(0.6872), FIX8(0.6705),
762     FIX8(0.6528), FIX8(0.6343), FIX8(0.6147), FIX8(0.5941),
763     FIX8(0.5724), FIX8(0.5495), FIX8(0.5254), FIX8(0.5000),
764     FIX8(0.5000), FIX8(0.4746), FIX8(0.4505), FIX8(0.4276),
765     FIX8(0.4059), FIX8(0.3853), FIX8(0.3657), FIX8(0.3472),
766     FIX8(0.3295), FIX8(0.3128), FIX8(0.2969), FIX8(0.2818),
767     FIX8(0.2675), FIX8(0.2539), FIX8(0.2410), FIX8(0.2288),
768     FIX8(0.2172), FIX8(0.2062), FIX8(0.1957), FIX8(0.1857),
769     FIX8(0.1763), FIX8(0.1674), FIX8(0.1589), FIX8(0.1508),
770     FIX8(0.1431), FIX8(0.1359), FIX8(0.1290), FIX8(0.1224),
771     FIX8(0.1162), FIX8(0.1103), FIX8(0.1047), FIX8(0.0994),
772     FIX8(0.0943), FIX8(0.0895), FIX8(0.0850), FIX8(0.0807),
773     FIX8(0.0766), FIX8(0.0727), FIX8(0.0690), FIX8(0.0655),
774     FIX8(0.0622), FIX8(0.0590), FIX8(0.0560), FIX8(0.0532),
775     FIX8(0.0505), FIX8(0.0479), FIX8(0.0455), FIX8(0.0432),
776     FIX8(0.0410), FIX8(0.0389), FIX8(0.0369), FIX8(0.0350),
777     FIX8(0.0333), FIX8(0.0316), FIX8(0.0300), FIX8(0.0284),
778     FIX8(0.0270), FIX8(0.0256), FIX8(0.0243), FIX8(0.0231),
779     FIX8(0.0219), FIX8(0.0208), FIX8(0.0198), FIX8(0.0187)
780 };
781 /* -ln2(probability) */
782 static const uint16_t x264_cabac_entropy[128] =
783 {
784     FIX8(0.0273), FIX8(0.0288), FIX8(0.0303), FIX8(0.0320),
785     FIX8(0.0337), FIX8(0.0355), FIX8(0.0375), FIX8(0.0395),
786     FIX8(0.0416), FIX8(0.0439), FIX8(0.0463), FIX8(0.0488),
787     FIX8(0.0515), FIX8(0.0543), FIX8(0.0572), FIX8(0.0604),
788     FIX8(0.0637), FIX8(0.0671), FIX8(0.0708), FIX8(0.0747),
789     FIX8(0.0788), FIX8(0.0832), FIX8(0.0878), FIX8(0.0926),
790     FIX8(0.0977), FIX8(0.1032), FIX8(0.1089), FIX8(0.1149),
791     FIX8(0.1214), FIX8(0.1282), FIX8(0.1353), FIX8(0.1429),
792     FIX8(0.1510), FIX8(0.1596), FIX8(0.1686), FIX8(0.1782),
793     FIX8(0.1884), FIX8(0.1992), FIX8(0.2107), FIX8(0.2229),
794     FIX8(0.2358), FIX8(0.2496), FIX8(0.2642), FIX8(0.2798),
795     FIX8(0.2964), FIX8(0.3142), FIX8(0.3331), FIX8(0.3532),
796     FIX8(0.3748), FIX8(0.3979), FIX8(0.4226), FIX8(0.4491),
797     FIX8(0.4776), FIX8(0.5082), FIX8(0.5412), FIX8(0.5768),
798     FIX8(0.6152), FIX8(0.6568), FIX8(0.7020), FIX8(0.7513),
799     FIX8(0.8050), FIX8(0.8638), FIX8(0.9285), FIX8(1.0000),
800     FIX8(1.0000), FIX8(1.0752), FIX8(1.1504), FIX8(1.2256),
801     FIX8(1.3008), FIX8(1.3759), FIX8(1.4511), FIX8(1.5263),
802     FIX8(1.6015), FIX8(1.6767), FIX8(1.7519), FIX8(1.8271),
803     FIX8(1.9023), FIX8(1.9775), FIX8(2.0527), FIX8(2.1278),
804     FIX8(2.2030), FIX8(2.2782), FIX8(2.3534), FIX8(2.4286),
805     FIX8(2.5038), FIX8(2.5790), FIX8(2.6542), FIX8(2.7294),
806     FIX8(2.8046), FIX8(2.8797), FIX8(2.9549), FIX8(3.0301),
807     FIX8(3.1053), FIX8(3.1805), FIX8(3.2557), FIX8(3.3309),
808     FIX8(3.4061), FIX8(3.4813), FIX8(3.5565), FIX8(3.6316),
809     FIX8(3.7068), FIX8(3.7820), FIX8(3.8572), FIX8(3.9324),
810     FIX8(4.0076), FIX8(4.0828), FIX8(4.1580), FIX8(4.2332),
811     FIX8(4.3083), FIX8(4.3836), FIX8(4.4588), FIX8(4.5339),
812     FIX8(4.6091), FIX8(4.6843), FIX8(4.7595), FIX8(4.8347),
813     FIX8(4.9099), FIX8(4.9851), FIX8(5.0602), FIX8(5.1354),
814     FIX8(5.2106), FIX8(5.2859), FIX8(5.3610), FIX8(5.4362),
815     FIX8(5.5114), FIX8(5.5866), FIX8(5.6618), FIX8(5.7370)
816 };
817
818
819 /*****************************************************************************
820  *
821  *****************************************************************************/
822 void x264_cabac_context_init( x264_cabac_t *cb, int i_slice_type, int i_qp, int i_model )
823 {
824     const int8_t (*cabac_context_init)[460][2];
825     int i;
826
827     if( i_slice_type == SLICE_TYPE_I )
828     {
829         cabac_context_init = &x264_cabac_context_init_I;
830     }
831     else
832     {
833         cabac_context_init = &x264_cabac_context_init_PB[i_model];
834     }
835
836     for( i = 0; i < 460; i++ )
837     {
838         cb->state[i] = x264_clip3( (((*cabac_context_init)[i][0] * i_qp) >> 4) + (*cabac_context_init)[i][1], 1, 126 );
839     }
840 }
841
842 void x264_cabac_encode_init( x264_cabac_t *cb, uint8_t *p_data, uint8_t *p_end )
843 {
844     cb->i_low   = 0;
845     cb->i_range = 0x01FE;
846     cb->i_queue = -1; // the first bit will be shifted away and not written
847     cb->i_bytes_outstanding = 0;
848     cb->p_start = p_data;
849     cb->p       = p_data;
850     cb->p_end   = p_end;
851 }
852
853 static inline void x264_cabac_putbyte( x264_cabac_t *cb )
854 {
855     if( cb->i_queue >= 8 )
856     {
857         int out = cb->i_low >> (cb->i_queue+2);
858         cb->i_low &= (4<<cb->i_queue)-1;
859         cb->i_queue -= 8;
860
861         if( (out & 0xff) == 0xff )
862         {
863             cb->i_bytes_outstanding++;
864         }
865         else
866         {
867             int carry = out & 0x100;
868             int bytes_outstanding = cb->i_bytes_outstanding;
869             if( cb->p + bytes_outstanding + 1 >= cb->p_end )
870                 return;
871             if( carry )
872             {
873                 // this can't happen on the first byte (buffer underrun),
874                 // because that would correspond to a probability > 1.
875                 // this can't carry beyond the one byte, because any 0xff bytes
876                 // are in bytes_outstanding and thus not written yet.
877                 cb->p[-1]++;
878             }
879             while( bytes_outstanding > 0 )
880             {
881                 *(cb->p++) = (carry >> 8) - 1;
882                 bytes_outstanding--;
883             }
884             *(cb->p++) = out;
885             cb->i_bytes_outstanding = 0;
886         }
887     }
888 }
889
890 static inline void x264_cabac_encode_renorm( x264_cabac_t *cb )
891 {
892     int shift = renorm_shift[cb->i_range>>3];
893     cb->i_range <<= shift;
894     cb->i_low   <<= shift;
895     cb->i_queue  += shift;
896     x264_cabac_putbyte( cb );
897 }
898
899 void x264_cabac_encode_decision( x264_cabac_t *cb, int i_ctx, int b )
900 {
901     int i_state = cb->state[i_ctx];
902     int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03];
903
904     cb->i_range -= i_range_lps;
905
906     if( b != (i_state >> 6) )
907     {
908         cb->i_low += cb->i_range;
909         cb->i_range = i_range_lps;
910     }
911
912     cb->state[i_ctx] = x264_cabac_transition[b][i_state];
913
914     x264_cabac_encode_renorm( cb );
915 }
916
917 void x264_cabac_encode_bypass( x264_cabac_t *cb, int b )
918 {
919     cb->i_low <<= 1;
920     cb->i_low += -b & cb->i_range;
921     cb->i_queue += 1;
922     x264_cabac_putbyte( cb );
923 }
924
925 void x264_cabac_encode_terminal( x264_cabac_t *cb )
926 {
927     cb->i_range -= 2;
928     x264_cabac_encode_renorm( cb );
929 }
930
931 void x264_cabac_encode_flush( x264_t *h, x264_cabac_t *cb )
932 {
933     cb->i_low += cb->i_range - 2;
934     cb->i_low |= 1;
935     cb->i_low <<= 9;
936     cb->i_queue += 9;
937     x264_cabac_putbyte( cb );
938     x264_cabac_putbyte( cb );
939     cb->i_low <<= 8 - cb->i_queue;
940     cb->i_low |= (0x35a4e4f5 >> (h->i_frame & 31) & 1) << 10;
941     cb->i_queue = 8;
942     x264_cabac_putbyte( cb );
943
944     if( cb->p + cb->i_bytes_outstanding + 1 >= cb->p_end )
945         return; //FIXME throw an error instead of silently truncating the frame
946
947     while( cb->i_bytes_outstanding > 0 )
948     {
949         *(cb->p++) = 0xff;
950         cb->i_bytes_outstanding--;
951     }
952 }
953
954 /*****************************************************************************
955  *
956  *****************************************************************************/
957 void x264_cabac_size_decision( x264_cabac_t *cb, int i_ctx, int b )
958 {
959     int i_state = cb->state[i_ctx];
960     cb->state[i_ctx] = x264_cabac_transition[b][i_state];
961     cb->f8_bits_encoded += x264_cabac_entropy[ b ? 127 - i_state : i_state ];
962 }
963
964 int x264_cabac_size_decision2( uint8_t *state, int b )
965 {
966     int i_state = *state;
967     *state = x264_cabac_transition[b][i_state];
968     return x264_cabac_entropy[ b ? 127 - i_state : i_state ];
969 }
970
971 int x264_cabac_size_decision_noup( uint8_t *state, int b )
972 {
973     return x264_cabac_entropy[ b ? 127 - *state : *state ];
974 }