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