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