]> git.sesse.net Git - x264/blob - common/cabac.c
move os/compiler specific defines to their own header
[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             if( cb->p + cb->i_bytes_outstanding + 1 >= cb->p_end )
869                 return;
870             if( carry )
871             {
872                 // this can't happen on the first byte (buffer underrun),
873                 // because that would correspond to a probability > 1.
874                 // this can't carry beyond the one byte, because any 0xff bytes
875                 // are in bytes_outstanding and thus not written yet.
876                 cb->p[-1]++;
877             }
878             while( cb->i_bytes_outstanding > 0 )
879             {
880                 *(cb->p++) = carry ? 0 : 0xff;
881                 cb->i_bytes_outstanding--;
882             }
883             *(cb->p++) = out;
884         }
885     }
886 }
887
888 static inline void x264_cabac_encode_renorm( x264_cabac_t *cb )
889 {
890     int shift = renorm_shift[cb->i_range>>3];
891     cb->i_range <<= shift;
892     cb->i_low   <<= shift;
893     cb->i_queue  += shift;
894     x264_cabac_putbyte( cb );
895 }
896
897 void x264_cabac_encode_decision( x264_cabac_t *cb, int i_ctx, int b )
898 {
899     int i_state = cb->state[i_ctx];
900     int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03];
901
902     cb->i_range -= i_range_lps;
903
904     if( b != (i_state >> 6) )
905     {
906         cb->i_low += cb->i_range;
907         cb->i_range = i_range_lps;
908     }
909
910     cb->state[i_ctx] = x264_cabac_transition[b][i_state];
911
912     x264_cabac_encode_renorm( cb );
913 }
914
915 void x264_cabac_encode_bypass( x264_cabac_t *cb, int b )
916 {
917     cb->i_low <<= 1;
918     cb->i_low += (((int32_t)b<<31)>>31) & cb->i_range;
919     cb->i_queue += 1;
920     x264_cabac_putbyte( cb );
921 }
922
923 void x264_cabac_encode_terminal( x264_cabac_t *cb, int b )
924 {
925     cb->i_range -= 2;
926     if( b )
927     {
928         cb->i_low += cb->i_range;
929         cb->i_range  = 2<<7;
930         cb->i_low  <<= 7;
931         cb->i_queue += 7;
932         x264_cabac_putbyte( cb );
933     }
934     else
935     {
936         x264_cabac_encode_renorm( cb );
937     }
938 }
939
940 void x264_cabac_encode_flush( x264_cabac_t *cb )
941 {
942     cb->i_low |= 0x80;
943     cb->i_low <<= 10;
944     cb->i_queue += 10;
945     x264_cabac_putbyte( cb );
946     x264_cabac_putbyte( cb );
947     cb->i_queue = 0;
948
949     if( cb->p + cb->i_bytes_outstanding + 1 >= cb->p_end )
950         return; //FIXME throw an error instead of silently truncating the frame
951
952     while( cb->i_bytes_outstanding > 0 )
953     {
954         *(cb->p++) = 0xff;
955         cb->i_bytes_outstanding--;
956     }
957 }
958
959 /*****************************************************************************
960  *
961  *****************************************************************************/
962 void x264_cabac_size_decision( x264_cabac_t *cb, int i_ctx, int b )
963 {
964     int i_state = cb->state[i_ctx];
965     cb->state[i_ctx] = x264_cabac_transition[b][i_state];
966     cb->f8_bits_encoded += x264_cabac_entropy[ b ? 127 - i_state : i_state ];
967 }
968
969 int x264_cabac_size_decision2( uint8_t *state, int b )
970 {
971     int i_state = *state;
972     *state = x264_cabac_transition[b][i_state];
973     return x264_cabac_entropy[ b ? 127 - i_state : i_state ];
974 }
975
976 int x264_cabac_size_decision_noup( uint8_t *state, int b )
977 {
978     return x264_cabac_entropy[ b ? 127 - *state : *state ];
979 }