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