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 $
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
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.
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.
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 *****************************************************************************/
32 /* Debugging purpose ONLY !!!! */
34 static int binCount = 0;
38 static const int x264_cabac_context_init_I[399][2] =
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 },
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 },
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 },
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 },
64 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
68 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
69 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
70 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
143 /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
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 },
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 },
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 },
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 }
187 static const int x264_cabac_context_init_PB[3][399][2] =
189 /* i_cabac_init_idc == 0 */
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 },
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 },
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 },
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 },
215 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
216 { -7, 72 }, { 1, 58 },
219 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
220 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
221 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
285 /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
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 },
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 },
327 /* i_cabac_init_idc == 1 */
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 },
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 },
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 },
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 },
353 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
354 { -5, 72 },{ 0, 61 },
357 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
358 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
359 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
423 /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
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 },
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 },
464 /* i_cabac_init_idc == 2 */
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 },
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 },
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 },
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 },
490 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
491 { -7, 50 },{ 1, 60 },
494 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
495 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
496 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
560 /* 276 a bit special (not used, x264_cabac_encode_bypass is used instead) */
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 },
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 },
601 static const int x264_cabac_range_lps[64][4] =
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 },
627 static const int x264_transition_lps[64] =
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
634 static const int x264_transition_mps[64] =
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,
642 #define FIX8(f) ((int)(f*(1<<8)))
643 static int x264_cabac_probability[128] =
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)
678 /* -ln2(probability) */
679 static int x264_cabac_entropy[128] =
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)
718 /*****************************************************************************
720 *****************************************************************************/
721 void x264_cabac_context_init( x264_cabac_t *cb, int i_slice_type, int i_qp, int i_model )
723 const int (*cabac_context_init)[399][2];
726 if( i_slice_type == SLICE_TYPE_I )
728 cabac_context_init = &x264_cabac_context_init_I;
732 cabac_context_init = &x264_cabac_context_init_PB[i_model];
735 for( i = 0; i < 399; i++ )
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 )
742 cb->ctxstate[i].i_state = 63 - i_pre_state;
743 cb->ctxstate[i].i_mps = 0;
747 cb->ctxstate[i].i_state = i_pre_state - 64;
748 cb->ctxstate[i].i_mps = 1;
750 cb->ctxstate[i].i_count = 0;
754 /*****************************************************************************
756 *****************************************************************************/
757 void x264_cabac_decode_init( x264_cabac_t *cb, bs_t *s )
759 cb->i_range = 0x01fe;
760 cb->i_low = bs_read( s, 9 );
764 static inline void x264_cabac_decode_renorm( x264_cabac_t *cb )
766 while( cb->i_range < 0x0100 )
769 cb->i_low = ( cb->i_low << 1 )|bs_read( cb->s, 1 );
773 int x264_cabac_decode_decision( x264_cabac_t *cb, int i_ctx )
775 int i_state = cb->ctxstate[i_ctx].i_state;
776 int i_mps = cb->ctxstate[i_ctx].i_mps;
778 int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03];
782 cb->i_range -= i_range_lps;
784 if( cb->i_low >= cb->i_range )
788 cb->i_low -= cb->i_range;
789 cb->i_range= i_range_lps;
793 cb->ctxstate[i_ctx].i_mps = 1 - i_mps;
795 cb->ctxstate[i_ctx].i_state = x264_transition_lps[i_state];
801 cb->ctxstate[i_ctx].i_state = x264_transition_mps[i_state];
804 x264_cabac_decode_renorm( cb );
808 int x264_cabac_decode_bypass( x264_cabac_t *cb )
810 cb->i_low = (cb->i_low << 1)|bs_read( cb->s, 1 );
812 if( cb->i_low >= cb->i_range )
814 cb->i_low -= cb->i_range;
819 int x264_cabac_decode_terminal( x264_cabac_t *cb )
821 if( cb->i_low >= cb->i_range - 2 )
827 x264_cabac_decode_renorm( cb );
832 /*****************************************************************************
834 *****************************************************************************/
835 void x264_cabac_model_init( x264_cabac_t *cb )
839 for( i = 0; i < 3; i++ )
841 cb->slice[i].i_model = 0;
842 cb->slice[i].i_cost = -1;
846 int x264_cabac_model_get ( x264_cabac_t *cb, int i_slice_type )
848 return cb->slice[i_slice_type].i_model;
851 void x264_cabac_model_update( x264_cabac_t *cb, int i_slice_type, int i_qp )
855 if( i_slice_type == SLICE_TYPE_I )
859 cb->slice[i_slice_type].i_cost = -1;
861 for( i = 0; i < 3; i++ )
866 i_cost = 0; /* fix8 */
868 for( i_ctx = 0; i_ctx < 399; i_ctx++ )
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;
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;
883 if( cb->slice[i_slice_type].i_cost == -1 || cb->slice[i_slice_type].i_cost > i_cost )
885 cb->slice[i_slice_type].i_model= i;
886 cb->slice[i_slice_type].i_cost = i_cost;
891 void x264_cabac_encode_init( x264_cabac_t *cb, bs_t *s )
894 cb->i_range = 0x01FE;
896 cb->i_bits_outstanding = 0;
901 static inline void x264_cabac_putbit( x264_cabac_t *cb, int b )
903 if( cb->b_first_bit )
909 bs_write1( cb->s, b );
912 while( cb->i_bits_outstanding > 0 )
914 bs_write1( cb->s, 1 - b );
915 cb->i_bits_outstanding--;
919 static inline void x264_cabac_encode_renorm( x264_cabac_t *cb )
922 while( cb->i_range < 0x0100 )
924 if( cb->i_low < 0x100 )
926 x264_cabac_putbit( cb, 0 );
930 if( cb->i_low >= 0x200 )
933 x264_cabac_putbit( cb, 1 );
938 cb->i_bits_outstanding++;
947 void x264_cabac_encode_decision( x264_cabac_t *cb, int i_ctx, int b )
949 int i_state = cb->ctxstate[i_ctx].i_state;
950 int i_mps = cb->ctxstate[i_ctx].i_mps;
952 int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03];
957 fprintf( stderr, "%d ctx=%d b=%d\n", binCount, i_ctx, b );
959 fprintf( stderr, "%d 0x%04x %d %d\n", binCount++, cb->i_range, i_state, i_mps );
962 cb->i_range -= i_range_lps;
966 cb->i_low += cb->i_range;
967 cb->i_range = i_range_lps;
971 cb->ctxstate[i_ctx].i_mps = 1 - i_mps;
973 cb->ctxstate[i_ctx].i_state = x264_transition_lps[i_state];
977 cb->ctxstate[i_ctx].i_state = x264_transition_mps[i_state];
979 cb->ctxstate[i_ctx].i_count++;
981 x264_cabac_encode_renorm( cb );
986 void x264_cabac_encode_bypass( x264_cabac_t *cb, int b )
989 fprintf( stderr, "%d 0x%04x\n", binCount++, cb->i_range );
995 cb->i_low += cb->i_range;
998 if( cb->i_low >= 0x400 )
1000 x264_cabac_putbit( cb, 1 );
1005 if( cb->i_low < 0x200 )
1007 x264_cabac_putbit( cb, 0 );
1012 cb->i_bits_outstanding++;
1018 void x264_cabac_encode_terminal( x264_cabac_t *cb, int b )
1021 fprintf( stderr, "%d 0x%04x\n", binCount++, cb->i_range );
1027 cb->i_low += cb->i_range;
1030 x264_cabac_encode_renorm( cb );
1035 void x264_cabac_encode_flush( x264_cabac_t *cb )
1037 x264_cabac_putbit( cb, (cb->i_low >> 9)&0x01 );
1038 bs_write1( cb->s, (cb->i_low >> 8)&0x01 );
1041 bs_write1( cb->s, 0x01 );
1042 bs_align_0( cb->s );