1 /*
2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * H.264 / AVC / MPEG-4 part10 cabac decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28 #define CABAC(h) 1
29 #define UNCHECKED_BITSTREAM_READER 1
30 #define INT_BIT (CHAR_BIT * sizeof(int))
31
32 #include "libavutil/attributes.h"
33 #include "libavutil/avassert.h"
34 #include "config.h"
35 #include "cabac.h"
36 #include "cabac_functions.h"
37 #include "internal.h"
38 #include "avcodec.h"
39 #include "h264dec.h"
40 #include "h264data.h"
41 #include "h264_mvpred.h"
42 #include "mpegutils.h"
43
44 #if ARCH_X86
45 #include "x86/h264_cabac.c"
46 #endif
47
48 /* Cabac pre state table */
49
50 static const int8_t cabac_context_init_I[1024][2] =
51 {
52 /* 0 - 10 */
53 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
54 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 },
55 { -6, 53 }, { -1, 54 }, { 7, 51 },
56
57 /* 11 - 23 unused for I */
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 },
62
63 /* 24- 39 */
64 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
65 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
66 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
67 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
68
69 /* 40 - 53 */
70 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
71 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
72 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
73 { 0, 0 }, { 0, 0 },
74
75 /* 54 - 59 */
76 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
77 { 0, 0 }, { 0, 0 },
78
79 /* 60 - 69 */
80 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
81 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
82 { 13, 41 }, { 3, 62 },
83
84 /* 70 -> 87 */
85 { 0, 11 }, { 1, 55 }, { 0, 69 }, { -17, 127 },
86 { -13, 102 },{ 0, 82 }, { -7, 74 }, { -21, 107 },
87 { -27, 127 },{ -31, 127 },{ -24, 127 }, { -18, 95 },
88 { -27, 127 },{ -21, 114 },{ -30, 127 }, { -17, 123 },
89 { -12, 115 },{ -16, 122 },
90
91 /* 88 -> 104 */
92 { -11, 115 },{ -12, 63 }, { -2, 68 }, { -15, 84 },
93 { -13, 104 },{ -3, 70 }, { -8, 93 }, { -10, 90 },
94 { -30, 127 },{ -1, 74 }, { -6, 97 }, { -7, 91 },
95 { -20, 127 },{ -4, 56 }, { -5, 82 }, { -7, 76 },
96 { -22, 125 },
97
98 /* 105 -> 135 */
99 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
100 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
101 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
102 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
103 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
104 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
105 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
106 { 14, 62 }, { -13, 108 },{ -15, 100 },
107
108 /* 136 -> 165 */
109 { -13, 101 },{ -13, 91 }, { -12, 94 }, { -10, 88 },
110 { -16, 84 }, { -10, 86 }, { -7, 83 }, { -13, 87 },
111 { -19, 94 }, { 1, 70 }, { 0, 72 }, { -5, 74 },
112 { 18, 59 }, { -8, 102 }, { -15, 100 }, { 0, 95 },
113 { -4, 75 }, { 2, 72 }, { -11, 75 }, { -3, 71 },
114 { 15, 46 }, { -13, 69 }, { 0, 62 }, { 0, 65 },
115 { 21, 37 }, { -15, 72 }, { 9, 57 }, { 16, 54 },
116 { 0, 62 }, { 12, 72 },
117
118 /* 166 -> 196 */
119 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
120 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
121 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
122 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
123 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
124 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
125 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
126 { 0, 89 }, { 26, -19 }, { 22, -17 },
127
128 /* 197 -> 226 */
129 { 26, -17 }, { 30, -25 }, { 28, -20 }, { 33, -23 },
130 { 37, -27 }, { 33, -23 }, { 40, -28 }, { 38, -17 },
131 { 33, -11 }, { 40, -15 }, { 41, -6 }, { 38, 1 },
132 { 41, 17 }, { 30, -6 }, { 27, 3 }, { 26, 22 },
133 { 37, -16 }, { 35, -4 }, { 38, -8 }, { 38, -3 },
134 { 37, 3 }, { 38, 5 }, { 42, 0 }, { 35, 16 },
135 { 39, 22 }, { 14, 48 }, { 27, 37 }, { 21, 60 },
136 { 12, 68 }, { 2, 97 },
137
138 /* 227 -> 251 */
139 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
140 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
141 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
142 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
143 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
144 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
145 { -4, 65 },
146
147 /* 252 -> 275 */
148 { -12, 73 }, { -8, 76 }, { -7, 80 }, { -9, 88 },
149 { -17, 110 },{ -11, 97 }, { -20, 84 }, { -11, 79 },
150 { -6, 73 }, { -4, 74 }, { -13, 86 }, { -13, 96 },
151 { -11, 97 }, { -19, 117 },{ -8, 78 }, { -5, 33 },
152 { -4, 48 }, { -2, 53 }, { -3, 62 }, { -13, 71 },
153 { -10, 79 }, { -12, 86 }, { -13, 90 }, { -14, 97 },
154
155 /* 276 a bit special (not used, bypass is used instead) */
156 { 0, 0 },
157
158 /* 277 -> 307 */
159 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
160 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
161 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
162 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
163 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
164 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
165 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
166 { 9, 64 }, { -12, 104 },{ -11, 97 },
167
168 /* 308 -> 337 */
169 { -16, 96 }, { -7, 88 }, { -8, 85 }, { -7, 85 },
170 { -9, 85 }, { -13, 88 }, { 4, 66 }, { -3, 77 },
171 { -3, 76 }, { -6, 76 }, { 10, 58 }, { -1, 76 },
172 { -1, 83 }, { -7, 99 }, { -14, 95 }, { 2, 95 },
173 { 0, 76 }, { -5, 74 }, { 0, 70 }, { -11, 75 },
174 { 1, 68 }, { 0, 65 }, { -14, 73 }, { 3, 62 },
175 { 4, 62 }, { -1, 68 }, { -13, 75 }, { 11, 55 },
176 { 5, 64 }, { 12, 70 },
177
178 /* 338 -> 368 */
179 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
180 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
181 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
182 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
183 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
184 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
185 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
186 { -12, 109 },{ 36, -35 }, { 36, -34 },
187
188 /* 369 -> 398 */
189 { 32, -26 }, { 37, -30 }, { 44, -32 }, { 34, -18 },
190 { 34, -15 }, { 40, -15 }, { 33, -7 }, { 35, -5 },
191 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 },
192 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 },
193 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 },
194 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 },
195 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 },
196 { 29, 39 }, { 19, 66 },
197
198 /* 399 -> 435 */
199 { 31, 21 }, { 31, 31 }, { 25, 50 },
200 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
201 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
202 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
203 { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 },
204 { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 },
205 { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 },
206 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
207 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
208 { 0, 68 }, { -9, 92 },
209
210 /* 436 -> 459 */
211 { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 },
212 { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 },
213 { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 },
214 { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 },
215 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
216 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
217
218 /* 460 -> 1024 */
219 { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
220 { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
221 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
222 { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
223 { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
224 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
225 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
226 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
227 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
228 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
229 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
230 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
231 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
232 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
233 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
234 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
235 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
236 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
237 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
238 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
239 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
240 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
241 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
242 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
243 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
244 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
245 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
246 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
247 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
248 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
249 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
250 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
251 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
252 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
253 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
254 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
255 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
256 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
257 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
258 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
259 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
260 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
261 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
262 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
263 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
264 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
265 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
266 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
267 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
268 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
269 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
270 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
271 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
272 { -23, 68 }, { -24, 50 }, { -11, 74 }, { -14, 106 },
273 { -13, 97 }, { -15, 90 }, { -12, 90 }, { -18, 88 },
274 { -10, 73 }, { -9, 79 }, { -14, 86 }, { -10, 73 },
275 { -10, 70 }, { -10, 69 }, { -5, 66 }, { -9, 64 },
276 { -5, 58 }, { 2, 59 }, { 23, -13 }, { 26, -13 },
277 { 40, -15 }, { 49, -14 }, { 44, 3 }, { 45, 6 },
278 { 44, 34 }, { 33, 54 }, { 19, 82 }, { 21, -10 },
279 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
280 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
281 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
282 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
283 { 0, 68 }, { -9, 92 }, { -17, 120 }, { -20, 112 },
284 { -18, 114 }, { -11, 85 }, { -15, 92 }, { -14, 89 },
285 { -26, 71 }, { -15, 81 }, { -14, 80 }, { 0, 68 },
286 { -14, 70 }, { -24, 56 }, { -23, 68 }, { -24, 50 },
287 { -11, 74 }, { -14, 106 }, { -13, 97 }, { -15, 90 },
288 { -12, 90 }, { -18, 88 }, { -10, 73 }, { -9, 79 },
289 { -14, 86 }, { -10, 73 }, { -10, 70 }, { -10, 69 },
290 { -5, 66 }, { -9, 64 }, { -5, 58 }, { 2, 59 },
291 { 23, -13 }, { 26, -13 }, { 40, -15 }, { 49, -14 },
292 { 44, 3 }, { 45, 6 }, { 44, 34 }, { 33, 54 },
293 { 19, 82 }, { 21, -10 }, { 24, -11 }, { 28, -8 },
294 { 28, -1 }, { 29, 3 }, { 29, 9 }, { 35, 20 },
295 { 29, 36 }, { 14, 67 }, { -3, 75 }, { -1, 23 },
296 { 1, 34 }, { 1, 43 }, { 0, 54 }, { -2, 55 },
297 { 0, 61 }, { 1, 64 }, { 0, 68 }, { -9, 92 },
298 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
299 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
300 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
301 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
302 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
303 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
304 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
305 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
306 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
307 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
308 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
309 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
310 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
311 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
312 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
313 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
314 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
315 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
316 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
317 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
318 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
319 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
320 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
321 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
322 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
323 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
324 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
325 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
326 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
327 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
328 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
329 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
330 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
331 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
332 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
333 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
334 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
335 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
336 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
337 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
338 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
339 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
340 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
341 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
342 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
343 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
344 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
345 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
346 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
347 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
348 { -4, 65 }, { -12, 73 }, { -8, 76 }, { -7, 80 },
349 { -9, 88 }, { -17, 110 }, { -3, 71 }, { -6, 42 },
350 { -5, 50 }, { -3, 54 }, { -2, 62 }, { 0, 58 },
351 { 1, 63 }, { -2, 72 }, { -1, 74 }, { -9, 91 },
352 { -5, 67 }, { -5, 27 }, { -3, 39 }, { -2, 44 },
353 { 0, 46 }, { -16, 64 }, { -8, 68 }, { -10, 78 },
354 { -6, 77 }, { -10, 86 }, { -12, 92 }, { -15, 55 },
355 { -10, 60 }, { -6, 62 }, { -4, 65 }, { -12, 73 },
356 { -8, 76 }, { -7, 80 }, { -9, 88 }, { -17, 110 },
357 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
358 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
359 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 }
360 };
361
362 static const int8_t cabac_context_init_PB[3][1024][2] =
363 {
364 /* i_cabac_init_idc == 0 */
365 {
366 /* 0 - 10 */
367 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
368 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
369 { -6, 53 }, { -1, 54 }, { 7, 51 },
370
371 /* 11 - 23 */
372 { 23, 33 }, { 23, 2 }, { 21, 0 }, { 1, 9 },
373 { 0, 49 }, { -37, 118 }, { 5, 57 }, { -13, 78 },
374 { -11, 65 }, { 1, 62 }, { 12, 49 }, { -4, 73 },
375 { 17, 50 },
376
377 /* 24 - 39 */
378 { 18, 64 }, { 9, 43 }, { 29, 0 }, { 26, 67 },
379 { 16, 90 }, { 9, 104 }, { -46, 127 }, { -20, 104 },
380 { 1, 67 }, { -13, 78 }, { -11, 65 }, { 1, 62 },
381 { -6, 86 }, { -17, 95 }, { -6, 61 }, { 9, 45 },
382
383 /* 40 - 53 */
384 { -3, 69 }, { -6, 81 }, { -11, 96 }, { 6, 55 },
385 { 7, 67 }, { -5, 86 }, { 2, 88 }, { 0, 58 },
386 { -3, 76 }, { -10, 94 }, { 5, 54 }, { 4, 69 },
387 { -3, 81 }, { 0, 88 },
388
389 /* 54 - 59 */
390 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
391 { -7, 72 }, { 1, 58 },
392
393 /* 60 - 69 */
394 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
395 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
396 { 13, 41 }, { 3, 62 },
397
398 /* 70 - 87 */
399 { 0, 45 }, { -4, 78 }, { -3, 96 }, { -27, 126 },
400 { -28, 98 }, { -25, 101 }, { -23, 67 }, { -28, 82 },
401 { -20, 94 }, { -16, 83 }, { -22, 110 }, { -21, 91 },
402 { -18, 102 }, { -13, 93 }, { -29, 127 }, { -7, 92 },
403 { -5, 89 }, { -7, 96 }, { -13, 108 }, { -3, 46 },
404 { -1, 65 }, { -1, 57 }, { -9, 93 }, { -3, 74 },
405 { -9, 92 }, { -8, 87 }, { -23, 126 }, { 5, 54 },
406 { 6, 60 }, { 6, 59 }, { 6, 69 }, { -1, 48 },
407 { 0, 68 }, { -4, 69 }, { -8, 88 },
408
409 /* 105 -> 165 */
410 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
411 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
412 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
413 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
414 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
415 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
416 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
417 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
418 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
419 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
420 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
421 { 3, 64 }, { 1, 61 }, { 9, 63 }, { 7, 50 },
422 { 16, 39 }, { 5, 44 }, { 4, 52 }, { 11, 48 },
423 { -5, 60 }, { -1, 59 }, { 0, 59 }, { 22, 33 },
424 { 5, 44 }, { 14, 43 }, { -1, 78 }, { 0, 60 },
425 { 9, 69 },
426
427 /* 166 - 226 */
428 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
429 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
430 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
431 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
432 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
433 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
434 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
435 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
436 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
437 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
438 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
439 { 1, 67 }, { 5, 59 }, { 9, 67 }, { 16, 30 },
440 { 18, 32 }, { 18, 35 }, { 22, 29 }, { 24, 31 },
441 { 23, 38 }, { 18, 43 }, { 20, 41 }, { 11, 63 },
442 { 9, 59 }, { 9, 64 }, { -1, 94 }, { -2, 89 },
443 { -9, 108 },
444
445 /* 227 - 275 */
446 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
447 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
448 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
449 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
450 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
451 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
452 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
453 { -3, 74 }, { -10, 90 }, { 0, 70 }, { -4, 29 },
454 { 5, 31 }, { 7, 42 }, { 1, 59 }, { -2, 58 },
455 { -3, 72 }, { -3, 81 }, { -11, 97 }, { 0, 58 },
456 { 8, 5 }, { 10, 14 }, { 14, 18 }, { 13, 27 },
457 { 2, 40 }, { 0, 58 }, { -3, 70 }, { -6, 79 },
458 { -8, 85 },
459
460 /* 276 a bit special (not used, bypass is used instead) */
461 { 0, 0 },
462
463 /* 277 - 337 */
464 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
465 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
466 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
467 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
468 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
469 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
470 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
471 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
472 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
473 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
474 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
475 { -2, 69 }, { -2, 59 }, { 6, 70 }, { 10, 44 },
476 { 9, 31 }, { 12, 43 }, { 3, 53 }, { 14, 34 },
477 { 10, 38 }, { -3, 52 }, { 13, 40 }, { 17, 32 },
478 { 7, 44 }, { 7, 38 }, { 13, 50 }, { 10, 57 },
479 { 26, 43 },
480
481 /* 338 - 398 */
482 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
483 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
484 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
485 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
486 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
487 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
488 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
489 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
490 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
491 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
492 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
493 { 8, 60 }, { 6, 63 }, { 17, 65 }, { 21, 24 },
494 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 },
495 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 },
496 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 },
497 { 11, 86 },
498
499 /* 399 - 435 */
500 { 12, 40 }, { 11, 51 }, { 14, 59 },
501 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
502 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
503 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
504 { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 },
505 { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 },
506 { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 },
507 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
508 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
509 { -8, 66 }, { -8, 76 },
510
511 /* 436 - 459 */
512 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
513 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
514 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
515 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 },
516 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
517 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
518
519 /* 460 - 1024 */
520 { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
521 { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
522 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
523 { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
524 { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
525 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
526 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
527 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
528 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
529 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
530 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
531 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
532 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
533 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
534 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
535 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
536 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
537 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
538 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
539 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
540 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
541 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
542 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
543 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
544 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
545 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
546 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
547 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
548 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
549 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
550 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
551 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
552 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
553 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
554 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
555 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
556 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
557 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
558 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
559 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
560 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
561 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
562 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
563 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
564 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
565 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
566 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
567 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
568 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
569 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
570 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
571 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
572 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
573 { -16, 66 }, { -22, 65 }, { -20, 63 }, { -5, 85 },
574 { -6, 81 }, { -10, 77 }, { -7, 81 }, { -17, 80 },
575 { -18, 73 }, { -4, 74 }, { -10, 83 }, { -9, 71 },
576 { -9, 67 }, { -1, 61 }, { -8, 66 }, { -14, 66 },
577 { 0, 59 }, { 2, 59 }, { 9, -2 }, { 26, -9 },
578 { 33, -9 }, { 39, -7 }, { 41, -2 }, { 45, 3 },
579 { 49, 9 }, { 45, 27 }, { 36, 59 }, { 21, -13 },
580 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
581 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
582 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
583 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
584 { -8, 66 }, { -8, 76 }, { -4, 79 }, { -7, 71 },
585 { -5, 69 }, { -9, 70 }, { -8, 66 }, { -10, 68 },
586 { -19, 73 }, { -12, 69 }, { -16, 70 }, { -15, 67 },
587 { -20, 62 }, { -19, 70 }, { -16, 66 }, { -22, 65 },
588 { -20, 63 }, { -5, 85 }, { -6, 81 }, { -10, 77 },
589 { -7, 81 }, { -17, 80 }, { -18, 73 }, { -4, 74 },
590 { -10, 83 }, { -9, 71 }, { -9, 67 }, { -1, 61 },
591 { -8, 66 }, { -14, 66 }, { 0, 59 }, { 2, 59 },
592 { 9, -2 }, { 26, -9 }, { 33, -9 }, { 39, -7 },
593 { 41, -2 }, { 45, 3 }, { 49, 9 }, { 45, 27 },
594 { 36, 59 }, { 21, -13 }, { 33, -14 }, { 39, -7 },
595 { 46, -2 }, { 51, 2 }, { 60, 6 }, { 61, 17 },
596 { 55, 34 }, { 42, 62 }, { -6, 66 }, { -7, 35 },
597 { -7, 42 }, { -8, 45 }, { -5, 48 }, { -12, 56 },
598 { -6, 60 }, { -5, 62 }, { -8, 66 }, { -8, 76 },
599 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
600 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
601 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
602 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
603 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
604 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
605 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
606 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
607 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
608 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
609 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
610 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
611 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
612 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
613 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
614 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
615 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
616 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
617 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
618 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
619 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
620 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
621 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
622 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
623 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
624 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
625 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
626 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
627 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
628 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
629 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
630 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
631 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
632 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
633 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
634 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
635 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
636 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
637 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
638 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
639 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
640 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
641 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
642 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
643 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
644 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
645 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
646 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
647 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
648 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
649 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
650 { -3, 74 }, { -10, 90 }, { -6, 76 }, { -2, 44 },
651 { 0, 45 }, { 0, 52 }, { -3, 64 }, { -2, 59 },
652 { -4, 70 }, { -4, 75 }, { -8, 82 }, { -17, 102 },
653 { -9, 77 }, { 3, 24 }, { 0, 42 }, { 0, 48 },
654 { 0, 55 }, { -6, 59 }, { -7, 71 }, { -12, 83 },
655 { -11, 87 }, { -30, 119 }, { 1, 58 }, { -3, 29 },
656 { -1, 36 }, { 1, 38 }, { 2, 43 }, { -6, 55 },
657 { 0, 58 }, { 0, 64 }, { -3, 74 }, { -10, 90 },
658 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
659 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
660 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 }
661 },
662
663 /* i_cabac_init_idc == 1 */
664 {
665 /* 0 - 10 */
666 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
667 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
668 { -6, 53 }, { -1, 54 }, { 7, 51 },
669
670 /* 11 - 23 */
671 { 22, 25 }, { 34, 0 }, { 16, 0 }, { -2, 9 },
672 { 4, 41 }, { -29, 118 }, { 2, 65 }, { -6, 71 },
673 { -13, 79 }, { 5, 52 }, { 9, 50 }, { -3, 70 },
674 { 10, 54 },
675
676 /* 24 - 39 */
677 { 26, 34 }, { 19, 22 }, { 40, 0 }, { 57, 2 },
678 { 41, 36 }, { 26, 69 }, { -45, 127 }, { -15, 101 },
679 { -4, 76 }, { -6, 71 }, { -13, 79 }, { 5, 52 },
680 { 6, 69 }, { -13, 90 }, { 0, 52 }, { 8, 43 },
681
682 /* 40 - 53 */
683 { -2, 69 },{ -5, 82 },{ -10, 96 },{ 2, 59 },
684 { 2, 75 },{ -3, 87 },{ -3, 100 },{ 1, 56 },
685 { -3, 74 },{ -6, 85 },{ 0, 59 },{ -3, 81 },
686 { -7, 86 },{ -5, 95 },
687
688 /* 54 - 59 */
689 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
690 { -5, 72 },{ 0, 61 },
691
692 /* 60 - 69 */
693 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
694 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
695 { 13, 41 }, { 3, 62 },
696
697 /* 70 - 104 */
698 { 13, 15 }, { 7, 51 }, { 2, 80 }, { -39, 127 },
699 { -18, 91 }, { -17, 96 }, { -26, 81 }, { -35, 98 },
700 { -24, 102 }, { -23, 97 }, { -27, 119 }, { -24, 99 },
701 { -21, 110 }, { -18, 102 }, { -36, 127 }, { 0, 80 },
702 { -5, 89 }, { -7, 94 }, { -4, 92 }, { 0, 39 },
703 { 0, 65 }, { -15, 84 }, { -35, 127 }, { -2, 73 },
704 { -12, 104 }, { -9, 91 }, { -31, 127 }, { 3, 55 },
705 { 7, 56 }, { 7, 55 }, { 8, 61 }, { -3, 53 },
706 { 0, 68 }, { -7, 74 }, { -9, 88 },
707
708 /* 105 -> 165 */
709 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
710 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
711 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
712 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
713 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
714 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
715 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
716 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
717 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
718 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
719 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
720 { -4, 71 }, { 0, 58 }, { 7, 61 }, { 9, 41 },
721 { 18, 25 }, { 9, 32 }, { 5, 43 }, { 9, 47 },
722 { 0, 44 }, { 0, 51 }, { 2, 46 }, { 19, 38 },
723 { -4, 66 }, { 15, 38 }, { 12, 42 }, { 9, 34 },
724 { 0, 89 },
725
726 /* 166 - 226 */
727 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
728 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
729 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
730 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
731 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
732 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
733 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
734 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
735 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
736 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
737 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
738 { 0, 75 }, { 2, 72 }, { 8, 77 }, { 14, 35 },
739 { 18, 31 }, { 17, 35 }, { 21, 30 }, { 17, 45 },
740 { 20, 42 }, { 18, 45 }, { 27, 26 }, { 16, 54 },
741 { 7, 66 }, { 16, 56 }, { 11, 73 }, { 10, 67 },
742 { -10, 116 },
743
744 /* 227 - 275 */
745 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
746 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
747 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
748 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
749 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
750 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
751 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
752 { -5, 74 }, { -9, 86 }, { 2, 66 }, { -9, 34 },
753 { 1, 32 }, { 11, 31 }, { 5, 52 }, { -2, 55 },
754 { -2, 67 }, { 0, 73 }, { -8, 89 }, { 3, 52 },
755 { 7, 4 }, { 10, 8 }, { 17, 8 }, { 16, 19 },
756 { 3, 37 }, { -1, 61 }, { -5, 73 }, { -1, 70 },
757 { -4, 78 },
758
759 /* 276 a bit special (not used, bypass is used instead) */
760 { 0, 0 },
761
762 /* 277 - 337 */
763 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
764 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
765 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
766 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
767 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
768 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
769 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
770 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
771 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
772 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
773 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
774 { -1, 70 }, { -9, 72 }, { 14, 60 }, { 16, 37 },
775 { 0, 47 }, { 18, 35 }, { 11, 37 }, { 12, 41 },
776 { 10, 41 }, { 2, 48 }, { 12, 41 }, { 13, 41 },
777 { 0, 59 }, { 3, 50 }, { 19, 40 }, { 3, 66 },
778 { 18, 50 },
779
780 /* 338 - 398 */
781 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
782 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
783 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
784 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
785 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
786 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
787 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
788 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
789 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
790 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
791 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
792 { 12, 48 }, { 11, 49 }, { 26, 45 }, { 22, 22 },
793 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 },
794 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 },
795 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 },
796 { 11, 83 },
797
798 /* 399 - 435 */
799 { 25, 32 }, { 21, 49 }, { 21, 54 },
800 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
801 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
802 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
803 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 },
804 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
805 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
806 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
807 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
808 { -4, 67 }, { -7, 82 },
809
810 /* 436 - 459 */
811 { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 },
812 { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 },
813 { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 },
814 { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 },
815 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
816 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
817
818 /* 460 - 1024 */
819 { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
820 { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
821 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
822 { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
823 { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
824 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
825 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
826 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
827 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
828 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
829 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
830 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
831 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
832 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
833 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
834 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
835 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
836 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
837 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
838 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
839 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
840 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
841 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
842 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
843 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
844 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
845 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
846 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
847 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
848 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
849 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
850 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
851 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
852 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
853 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
854 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
855 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
856 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
857 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
858 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
859 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
860 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
861 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
862 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
863 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
864 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
865 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
866 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
867 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
868 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
869 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
870 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
871 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
872 { -14, 66 }, { 0, 59 }, { 2, 59 }, { -3, 81 },
873 { -3, 76 }, { -7, 72 }, { -6, 78 }, { -12, 72 },
874 { -14, 68 }, { -3, 70 }, { -6, 76 }, { -5, 66 },
875 { -5, 62 }, { 0, 57 }, { -4, 61 }, { -9, 60 },
876 { 1, 54 }, { 2, 58 }, { 17, -10 }, { 32, -13 },
877 { 42, -9 }, { 49, -5 }, { 53, 0 }, { 64, 3 },
878 { 68, 10 }, { 66, 27 }, { 47, 57 }, { 17, -10 },
879 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
880 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
881 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
882 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
883 { -4, 67 }, { -7, 82 }, { -5, 85 }, { -6, 81 },
884 { -10, 77 }, { -7, 81 }, { -17, 80 }, { -18, 73 },
885 { -4, 74 }, { -10, 83 }, { -9, 71 }, { -9, 67 },
886 { -1, 61 }, { -8, 66 }, { -14, 66 }, { 0, 59 },
887 { 2, 59 }, { -3, 81 }, { -3, 76 }, { -7, 72 },
888 { -6, 78 }, { -12, 72 }, { -14, 68 }, { -3, 70 },
889 { -6, 76 }, { -5, 66 }, { -5, 62 }, { 0, 57 },
890 { -4, 61 }, { -9, 60 }, { 1, 54 }, { 2, 58 },
891 { 17, -10 }, { 32, -13 }, { 42, -9 }, { 49, -5 },
892 { 53, 0 }, { 64, 3 }, { 68, 10 }, { 66, 27 },
893 { 47, 57 }, { 17, -10 }, { 32, -13 }, { 42, -9 },
894 { 49, -5 }, { 53, 0 }, { 64, 3 }, { 68, 10 },
895 { 66, 27 }, { 47, 57 }, { -5, 71 }, { 0, 24 },
896 { -1, 36 }, { -2, 42 }, { -2, 52 }, { -9, 57 },
897 { -6, 63 }, { -4, 65 }, { -4, 67 }, { -7, 82 },
898 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
899 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
900 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
901 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
902 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
903 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
904 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
905 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
906 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
907 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
908 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
909 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
910 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
911 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
912 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
913 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
914 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
915 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
916 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
917 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
918 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
919 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
920 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
921 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
922 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
923 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
924 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
925 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
926 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
927 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
928 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
929 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
930 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
931 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
932 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
933 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
934 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
935 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
936 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
937 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
938 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
939 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
940 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
941 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
942 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
943 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
944 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
945 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
946 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
947 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
948 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
949 { -5, 74 }, { -9, 86 }, { -23, 112 }, { -15, 71 },
950 { -7, 61 }, { 0, 53 }, { -5, 66 }, { -11, 77 },
951 { -9, 80 }, { -9, 84 }, { -10, 87 }, { -34, 127 },
952 { -21, 101 }, { -3, 39 }, { -5, 53 }, { -7, 61 },
953 { -11, 75 }, { -15, 77 }, { -17, 91 }, { -25, 107 },
954 { -25, 111 }, { -28, 122 }, { -11, 76 }, { -10, 44 },
955 { -10, 52 }, { -10, 57 }, { -9, 58 }, { -16, 72 },
956 { -7, 69 }, { -4, 69 }, { -5, 74 }, { -9, 86 },
957 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
958 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
959 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 }
960 },
961
962 /* i_cabac_init_idc == 2 */
963 {
964 /* 0 - 10 */
965 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
966 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
967 { -6, 53 }, { -1, 54 }, { 7, 51 },
968
969 /* 11 - 23 */
970 { 29, 16 }, { 25, 0 }, { 14, 0 }, { -10, 51 },
971 { -3, 62 }, { -27, 99 }, { 26, 16 }, { -4, 85 },
972 { -24, 102 }, { 5, 57 }, { 6, 57 }, { -17, 73 },
973 { 14, 57 },
974
975 /* 24 - 39 */
976 { 20, 40 }, { 20, 10 }, { 29, 0 }, { 54, 0 },
977 { 37, 42 }, { 12, 97 }, { -32, 127 }, { -22, 117 },
978 { -2, 74 }, { -4, 85 }, { -24, 102 }, { 5, 57 },
979 { -6, 93 }, { -14, 88 }, { -6, 44 }, { 4, 55 },
980
981 /* 40 - 53 */
982 { -11, 89 },{ -15, 103 },{ -21, 116 },{ 19, 57 },
983 { 20, 58 },{ 4, 84 },{ 6, 96 },{ 1, 63 },
984 { -5, 85 },{ -13, 106 },{ 5, 63 },{ 6, 75 },
985 { -3, 90 },{ -1, 101 },
986
987 /* 54 - 59 */
988 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
989 { -7, 50 },{ 1, 60 },
990
991 /* 60 - 69 */
992 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
993 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
994 { 13, 41 }, { 3, 62 },
995
996 /* 70 - 104 */
997 { 7, 34 }, { -9, 88 }, { -20, 127 }, { -36, 127 },
998 { -17, 91 }, { -14, 95 }, { -25, 84 }, { -25, 86 },
999 { -12, 89 }, { -17, 91 }, { -31, 127 }, { -14, 76 },
1000 { -18, 103 }, { -13, 90 }, { -37, 127 }, { 11, 80 },
1001 { 5, 76 }, { 2, 84 }, { 5, 78 }, { -6, 55 },
1002 { 4, 61 }, { -14, 83 }, { -37, 127 }, { -5, 79 },
1003 { -11, 104 }, { -11, 91 }, { -30, 127 }, { 0, 65 },
1004 { -2, 79 }, { 0, 72 }, { -4, 92 }, { -6, 56 },
1005 { 3, 68 }, { -8, 71 }, { -13, 98 },
1006
1007 /* 105 -> 165 */
1008 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1009 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1010 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1011 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1012 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1013 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1014 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1015 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1016 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1017 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1018 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1019 { 3, 65 }, { -7, 69 }, { 8, 77 }, { -10, 66 },
1020 { 3, 62 }, { -3, 68 }, { -20, 81 }, { 0, 30 },
1021 { 1, 7 }, { -3, 23 }, { -21, 74 }, { 16, 66 },
1022 { -23, 124 }, { 17, 37 }, { 44, -18 }, { 50, -34 },
1023 { -22, 127 },
1024
1025 /* 166 - 226 */
1026 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1027 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1028 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1029 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1030 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1031 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1032 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1033 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1034 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1035 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1036 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1037 { 20, 34 }, { 19, 31 }, { 27, 44 }, { 19, 16 },
1038 { 15, 36 }, { 15, 36 }, { 21, 28 }, { 25, 21 },
1039 { 30, 20 }, { 31, 12 }, { 27, 16 }, { 24, 42 },
1040 { 0, 93 }, { 14, 56 }, { 15, 57 }, { 26, 38 },
1041 { -24, 127 },
1042
1043 /* 227 - 275 */
1044 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1045 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1046 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1047 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1048 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1049 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1050 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1051 { -12, 92 }, { -18, 108 }, { -4, 79 }, { -22, 69 },
1052 { -16, 75 }, { -2, 58 }, { 1, 58 }, { -13, 78 },
1053 { -9, 83 }, { -4, 81 }, { -13, 99 }, { -13, 81 },
1054 { -6, 38 }, { -13, 62 }, { -6, 58 }, { -2, 59 },
1055 { -16, 73 }, { -10, 76 }, { -13, 86 }, { -9, 83 },
1056 { -10, 87 },
1057
1058 /* 276 a bit special (not used, bypass is used instead) */
1059 { 0, 0 },
1060
1061 /* 277 - 337 */
1062 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1063 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1064 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1065 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1066 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1067 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1068 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1069 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1070 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1071 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1072 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1073 { -2, 76 }, { -18, 86 }, { 12, 70 }, { 5, 64 },
1074 { -12, 70 }, { 11, 55 }, { 5, 56 }, { 0, 69 },
1075 { 2, 65 }, { -6, 74 }, { 5, 54 }, { 7, 54 },
1076 { -6, 76 }, { -11, 82 }, { -2, 77 }, { -2, 77 },
1077 { 25, 42 },
1078
1079 /* 338 - 398 */
1080 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1081 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1082 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1083 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1084 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1085 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1086 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1087 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1088 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1089 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1090 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1091 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 },
1092 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 },
1093 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 },
1094 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 },
1095 { 25, 61 },
1096
1097 /* 399 - 435 */
1098 { 21, 33 }, { 19, 50 }, { 17, 61 },
1099 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1100 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1101 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1102 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1103 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1104 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1105 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1106 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1107 { -6, 68 }, { -10, 79 },
1108
1109 /* 436 - 459 */
1110 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1111 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1112 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1113 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1114 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1115 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1116
1117 /* 460 - 1024 */
1118 { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1119 { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1120 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1121 { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1122 { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1123 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1124 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1125 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1126 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1127 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1128 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1129 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1130 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1131 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1132 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1133 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1134 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1135 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1136 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1137 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1138 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1139 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1140 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1141 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1142 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1143 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1144 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1145 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1146 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1147 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1148 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1149 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1150 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1151 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1152 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1153 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1154 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1155 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1156 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1157 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1158 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1159 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1160 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1161 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1162 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1163 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1164 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1165 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1166 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1167 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1168 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1169 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1170 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1171 { -14, 59 }, { -9, 52 }, { -11, 68 }, { -3, 78 },
1172 { -8, 74 }, { -9, 72 }, { -10, 72 }, { -18, 75 },
1173 { -12, 71 }, { -11, 63 }, { -5, 70 }, { -17, 75 },
1174 { -14, 72 }, { -16, 67 }, { -8, 53 }, { -14, 59 },
1175 { -9, 52 }, { -11, 68 }, { 9, -2 }, { 30, -10 },
1176 { 31, -4 }, { 33, -1 }, { 33, 7 }, { 31, 12 },
1177 { 37, 23 }, { 31, 38 }, { 20, 64 }, { 9, -2 },
1178 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1179 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1180 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1181 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1182 { -6, 68 }, { -10, 79 }, { -3, 78 }, { -8, 74 },
1183 { -9, 72 }, { -10, 72 }, { -18, 75 }, { -12, 71 },
1184 { -11, 63 }, { -5, 70 }, { -17, 75 }, { -14, 72 },
1185 { -16, 67 }, { -8, 53 }, { -14, 59 }, { -9, 52 },
1186 { -11, 68 }, { -3, 78 }, { -8, 74 }, { -9, 72 },
1187 { -10, 72 }, { -18, 75 }, { -12, 71 }, { -11, 63 },
1188 { -5, 70 }, { -17, 75 }, { -14, 72 }, { -16, 67 },
1189 { -8, 53 }, { -14, 59 }, { -9, 52 }, { -11, 68 },
1190 { 9, -2 }, { 30, -10 }, { 31, -4 }, { 33, -1 },
1191 { 33, 7 }, { 31, 12 }, { 37, 23 }, { 31, 38 },
1192 { 20, 64 }, { 9, -2 }, { 30, -10 }, { 31, -4 },
1193 { 33, -1 }, { 33, 7 }, { 31, 12 }, { 37, 23 },
1194 { 31, 38 }, { 20, 64 }, { -9, 71 }, { -7, 37 },
1195 { -8, 44 }, { -11, 49 }, { -10, 56 }, { -12, 59 },
1196 { -8, 63 }, { -9, 67 }, { -6, 68 }, { -10, 79 },
1197 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1198 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1199 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1200 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1201 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1202 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1203 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1204 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1205 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1206 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1207 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1208 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1209 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1210 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1211 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1212 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1213 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1214 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1215 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1216 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1217 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1218 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1219 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1220 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1221 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1222 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1223 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1224 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1225 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1226 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1227 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1228 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1229 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1230 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1231 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1232 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1233 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1234 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1235 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1236 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1237 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1238 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1239 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1240 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1241 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1242 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1243 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1244 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1245 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1246 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1247 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1248 { -12, 92 }, { -18, 108 }, { -24, 115 }, { -22, 82 },
1249 { -9, 62 }, { 0, 53 }, { 0, 59 }, { -14, 85 },
1250 { -13, 89 }, { -13, 94 }, { -11, 92 }, { -29, 127 },
1251 { -21, 100 }, { -14, 57 }, { -12, 67 }, { -11, 71 },
1252 { -10, 77 }, { -21, 85 }, { -16, 88 }, { -23, 104 },
1253 { -15, 98 }, { -37, 127 }, { -10, 82 }, { -8, 48 },
1254 { -8, 61 }, { -8, 66 }, { -7, 70 }, { -14, 75 },
1255 { -10, 79 }, { -9, 83 }, { -12, 92 }, { -18, 108 },
1256 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1257 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1258 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 }
1259 }
1260 };
1261
ff_h264_init_cabac_states(const H264Context * h,H264SliceContext * sl)1262 void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl)
1263 {
1264 int i;
1265 const int8_t (*tab)[2];
1266 const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);
1267
1268 if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1269 else tab = cabac_context_init_PB[sl->cabac_init_idc];
1270
1271 /* calculate pre-state */
1272 for( i= 0; i < 1024; i++ ) {
1273 int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1274
1275 pre^= pre>>31;
1276 if(pre > 124)
1277 pre= 124 + (pre&1);
1278
1279 sl->cabac_state[i] = pre;
1280 }
1281 }
1282
decode_cabac_field_decoding_flag(const H264Context * h,H264SliceContext * sl)1283 static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1284 {
1285 const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1286
1287 unsigned long ctx = 0;
1288
1289 ctx += sl->mb_field_decoding_flag & !!sl->mb_x; //for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
1290 ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1291
1292 return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1293 }
1294
decode_cabac_intra_mb_type(H264SliceContext * sl,int ctx_base,int intra_slice)1295 static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1296 int ctx_base, int intra_slice)
1297 {
1298 uint8_t *state= &sl->cabac_state[ctx_base];
1299 int mb_type;
1300
1301 if(intra_slice){
1302 int ctx=0;
1303 if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1304 ctx++;
1305 if (sl->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1306 ctx++;
1307 if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1308 return 0; /* I4x4 */
1309 state += 2;
1310 }else{
1311 if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1312 return 0; /* I4x4 */
1313 }
1314
1315 if( get_cabac_terminate( &sl->cabac ) )
1316 return 25; /* PCM */
1317
1318 mb_type = 1; /* I16x16 */
1319 mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1320 if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1321 mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1322 mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1323 mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1324 return mb_type;
1325 }
1326
decode_cabac_mb_skip(const H264Context * h,H264SliceContext * sl,int mb_x,int mb_y)1327 static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1328 int mb_x, int mb_y)
1329 {
1330 int mba_xy, mbb_xy;
1331 int ctx = 0;
1332
1333 if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1334 int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1335 mba_xy = mb_xy - 1;
1336 if( (mb_y&1)
1337 && h->slice_table[mba_xy] == sl->slice_num
1338 && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1339 mba_xy += h->mb_stride;
1340 if (MB_FIELD(sl)) {
1341 mbb_xy = mb_xy - h->mb_stride;
1342 if( !(mb_y&1)
1343 && h->slice_table[mbb_xy] == sl->slice_num
1344 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1345 mbb_xy -= h->mb_stride;
1346 }else
1347 mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1348 }else{
1349 int mb_xy = sl->mb_xy;
1350 mba_xy = mb_xy - 1;
1351 mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1352 }
1353
1354 if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1355 ctx++;
1356 if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1357 ctx++;
1358
1359 if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1360 ctx += 13;
1361 return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1362 }
1363
decode_cabac_mb_intra4x4_pred_mode(H264SliceContext * sl,int pred_mode)1364 static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1365 {
1366 int mode = 0;
1367
1368 if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1369 return pred_mode;
1370
1371 mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1372 mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1373 mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1374
1375 return mode + ( mode >= pred_mode );
1376 }
1377
decode_cabac_mb_chroma_pre_mode(const H264Context * h,H264SliceContext * sl)1378 static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1379 {
1380 const int mba_xy = sl->left_mb_xy[0];
1381 const int mbb_xy = sl->top_mb_xy;
1382
1383 int ctx = 0;
1384
1385 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1386 if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1387 ctx++;
1388
1389 if (sl->top_type && h->chroma_pred_mode_table[mbb_xy] != 0)
1390 ctx++;
1391
1392 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1393 return 0;
1394
1395 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1396 return 1;
1397 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1398 return 2;
1399 else
1400 return 3;
1401 }
1402
decode_cabac_mb_cbp_luma(H264SliceContext * sl)1403 static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1404 {
1405 int cbp_b, cbp_a, ctx, cbp = 0;
1406
1407 cbp_a = sl->left_cbp;
1408 cbp_b = sl->top_cbp;
1409
1410 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1411 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1412 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1413 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1414 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1415 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1416 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1417 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1418 return cbp;
1419 }
decode_cabac_mb_cbp_chroma(H264SliceContext * sl)1420 static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1421 {
1422 int ctx;
1423 int cbp_a, cbp_b;
1424
1425 cbp_a = (sl->left_cbp>>4)&0x03;
1426 cbp_b = (sl-> top_cbp>>4)&0x03;
1427
1428 ctx = 0;
1429 if( cbp_a > 0 ) ctx++;
1430 if( cbp_b > 0 ) ctx += 2;
1431 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1432 return 0;
1433
1434 ctx = 4;
1435 if( cbp_a == 2 ) ctx++;
1436 if( cbp_b == 2 ) ctx += 2;
1437 return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1438 }
1439
decode_cabac_p_mb_sub_type(H264SliceContext * sl)1440 static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1441 {
1442 if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1443 return 0; /* 8x8 */
1444 if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1445 return 1; /* 8x4 */
1446 if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1447 return 2; /* 4x8 */
1448 return 3; /* 4x4 */
1449 }
decode_cabac_b_mb_sub_type(H264SliceContext * sl)1450 static int decode_cabac_b_mb_sub_type(H264SliceContext *sl)
1451 {
1452 int type;
1453 if( !get_cabac( &sl->cabac, &sl->cabac_state[36] ) )
1454 return 0; /* B_Direct_8x8 */
1455 if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1456 return 1 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1457 type = 3;
1458 if( get_cabac( &sl->cabac, &sl->cabac_state[38] ) ) {
1459 if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1460 return 11 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1461 type += 4;
1462 }
1463 type += 2*get_cabac( &sl->cabac, &sl->cabac_state[39] );
1464 type += get_cabac( &sl->cabac, &sl->cabac_state[39] );
1465 return type;
1466 }
1467
decode_cabac_mb_ref(H264SliceContext * sl,int list,int n)1468 static int decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)
1469 {
1470 int refa = sl->ref_cache[list][scan8[n] - 1];
1471 int refb = sl->ref_cache[list][scan8[n] - 8];
1472 int ref = 0;
1473 int ctx = 0;
1474
1475 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1476 if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1477 ctx++;
1478 if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1479 ctx += 2;
1480 } else {
1481 if( refa > 0 )
1482 ctx++;
1483 if( refb > 0 )
1484 ctx += 2;
1485 }
1486
1487 while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1488 ref++;
1489 ctx = (ctx>>2)+4;
1490 if(ref >= 32 /*h->ref_list[list]*/){
1491 return -1;
1492 }
1493 }
1494 return ref;
1495 }
1496
decode_cabac_mb_mvd(H264SliceContext * sl,int ctxbase,int amvd,int * mvda)1497 static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1498 {
1499 int mvd;
1500
1501 if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1502 // if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1503 *mvda= 0;
1504 return 0;
1505 }
1506
1507 mvd= 1;
1508 ctxbase+= 3;
1509 while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1510 if( mvd < 4 )
1511 ctxbase++;
1512 mvd++;
1513 }
1514
1515 if( mvd >= 9 ) {
1516 int k = 3;
1517 while( get_cabac_bypass( &sl->cabac ) ) {
1518 mvd += 1 << k;
1519 k++;
1520 if(k>24){
1521 av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1522 return INT_MIN;
1523 }
1524 }
1525 while( k-- ) {
1526 mvd += get_cabac_bypass( &sl->cabac )<<k;
1527 }
1528 *mvda=mvd < 70 ? mvd : 70;
1529 }else
1530 *mvda=mvd;
1531 return get_cabac_bypass_sign( &sl->cabac, -mvd );
1532 }
1533
1534 #define DECODE_CABAC_MB_MVD(sl, list, n )\
1535 {\
1536 int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1537 sl->mvd_cache[list][scan8[n] - 8][0];\
1538 int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1539 sl->mvd_cache[list][scan8[n] - 8][1];\
1540 \
1541 int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1542 int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1543 if (mxd == INT_MIN || myd == INT_MIN) \
1544 return AVERROR_INVALIDDATA; \
1545 mx += mxd;\
1546 my += myd;\
1547 }
1548
get_cabac_cbf_ctx(H264SliceContext * sl,int cat,int idx,int max_coeff,int is_dc)1549 static av_always_inline int get_cabac_cbf_ctx(H264SliceContext *sl,
1550 int cat, int idx, int max_coeff,
1551 int is_dc)
1552 {
1553 int nza, nzb;
1554 int ctx = 0;
1555 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1556
1557 if( is_dc ) {
1558 if( cat == 3 ) {
1559 idx -= CHROMA_DC_BLOCK_INDEX;
1560 nza = (sl->left_cbp>>(6+idx))&0x01;
1561 nzb = (sl-> top_cbp>>(6+idx))&0x01;
1562 } else {
1563 idx -= LUMA_DC_BLOCK_INDEX;
1564 nza = sl->left_cbp&(0x100<<idx);
1565 nzb = sl-> top_cbp&(0x100<<idx);
1566 }
1567 } else {
1568 nza = sl->non_zero_count_cache[scan8[idx] - 1];
1569 nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1570 }
1571
1572 if( nza > 0 )
1573 ctx++;
1574
1575 if( nzb > 0 )
1576 ctx += 2;
1577
1578 return base_ctx[cat] + ctx;
1579 }
1580
1581 static av_always_inline void
decode_cabac_residual_internal(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,const uint32_t * qmul,int max_coeff,int is_dc,int chroma422)1582 decode_cabac_residual_internal(const H264Context *h, H264SliceContext *sl,
1583 int16_t *block,
1584 int cat, int n, const uint8_t *scantable,
1585 const uint32_t *qmul, int max_coeff,
1586 int is_dc, int chroma422)
1587 {
1588 static const int significant_coeff_flag_offset[2][14] = {
1589 { 105+0, 105+15, 105+29, 105+44, 105+47, 402, 484+0, 484+15, 484+29, 660, 528+0, 528+15, 528+29, 718 },
1590 { 277+0, 277+15, 277+29, 277+44, 277+47, 436, 776+0, 776+15, 776+29, 675, 820+0, 820+15, 820+29, 733 }
1591 };
1592 static const int last_coeff_flag_offset[2][14] = {
1593 { 166+0, 166+15, 166+29, 166+44, 166+47, 417, 572+0, 572+15, 572+29, 690, 616+0, 616+15, 616+29, 748 },
1594 { 338+0, 338+15, 338+29, 338+44, 338+47, 451, 864+0, 864+15, 864+29, 699, 908+0, 908+15, 908+29, 757 }
1595 };
1596 static const int coeff_abs_level_m1_offset[14] = {
1597 227+0, 227+10, 227+20, 227+30, 227+39, 426, 952+0, 952+10, 952+20, 708, 982+0, 982+10, 982+20, 766
1598 };
1599 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1600 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1601 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1602 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1603 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1604 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1605 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1606 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1607 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1608 };
1609 static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1610 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1611 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1612 * map node ctx => cabac ctx for level=1 */
1613 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1614 /* map node ctx => cabac ctx for level>1 */
1615 static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1616 { 5, 5, 5, 5, 6, 7, 8, 9 },
1617 { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1618 };
1619 static const uint8_t coeff_abs_level_transition[2][8] = {
1620 /* update node ctx after decoding a level=1 */
1621 { 1, 2, 3, 3, 4, 5, 6, 7 },
1622 /* update node ctx after decoding a level>1 */
1623 { 4, 4, 4, 4, 5, 6, 7, 7 }
1624 };
1625
1626 int index[64];
1627
1628 int last;
1629 int coeff_count = 0;
1630 int node_ctx = 0;
1631
1632 uint8_t *significant_coeff_ctx_base;
1633 uint8_t *last_coeff_ctx_base;
1634 uint8_t *abs_level_m1_ctx_base;
1635
1636 #if !ARCH_X86
1637 #define CABAC_ON_STACK
1638 #endif
1639 #ifdef CABAC_ON_STACK
1640 #define CC &cc
1641 CABACContext cc;
1642 cc.range = sl->cabac.range;
1643 cc.low = sl->cabac.low;
1644 cc.bytestream= sl->cabac.bytestream;
1645 #if !UNCHECKED_BITSTREAM_READER || ARCH_AARCH64
1646 cc.bytestream_end = sl->cabac.bytestream_end;
1647 #endif
1648 #else
1649 #define CC &sl->cabac
1650 #endif
1651
1652 significant_coeff_ctx_base = sl->cabac_state
1653 + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1654 last_coeff_ctx_base = sl->cabac_state
1655 + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1656 abs_level_m1_ctx_base = sl->cabac_state
1657 + coeff_abs_level_m1_offset[cat];
1658
1659 if( !is_dc && max_coeff == 64 ) {
1660 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1661 for(last= 0; last < coefs; last++) { \
1662 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1663 if( get_cabac( CC, sig_ctx )) { \
1664 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1665 index[coeff_count++] = last; \
1666 if( get_cabac( CC, last_ctx ) ) { \
1667 last= max_coeff; \
1668 break; \
1669 } \
1670 } \
1671 }\
1672 if( last == max_coeff -1 ) {\
1673 index[coeff_count++] = last;\
1674 }
1675 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(sl)];
1676 #ifdef decode_significance
1677 coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1678 last_coeff_ctx_base, sig_off);
1679 } else {
1680 if (is_dc && chroma422) { // dc 422
1681 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1682 } else {
1683 coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1684 last_coeff_ctx_base-significant_coeff_ctx_base);
1685 }
1686 #else
1687 DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1688 } else {
1689 if (is_dc && chroma422) { // dc 422
1690 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1691 } else {
1692 DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1693 }
1694 #endif
1695 }
1696 av_assert2(coeff_count > 0);
1697
1698 if( is_dc ) {
1699 if( cat == 3 )
1700 h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1701 else
1702 h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1703 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1704 } else {
1705 if( max_coeff == 64 )
1706 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1707 else {
1708 av_assert2( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1709 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1710 }
1711 }
1712
1713 #define STORE_BLOCK(type) \
1714 do { \
1715 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1716 \
1717 int j= scantable[index[--coeff_count]]; \
1718 \
1719 if( get_cabac( CC, ctx ) == 0 ) { \
1720 node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1721 if( is_dc ) { \
1722 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1723 }else{ \
1724 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1725 } \
1726 } else { \
1727 unsigned coeff_abs = 2; \
1728 ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1729 node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1730 \
1731 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1732 coeff_abs++; \
1733 } \
1734 \
1735 if( coeff_abs >= 15 ) { \
1736 int j = 0; \
1737 while (get_cabac_bypass(CC) && j < 16+7) { \
1738 j++; \
1739 } \
1740 \
1741 coeff_abs=1; \
1742 while( j-- ) { \
1743 coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1744 } \
1745 coeff_abs+= 14U; \
1746 } \
1747 \
1748 if( is_dc ) { \
1749 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1750 }else{ \
1751 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1752 } \
1753 } \
1754 } while ( coeff_count );
1755
1756 if (h->pixel_shift) {
1757 STORE_BLOCK(int32_t)
1758 } else {
1759 STORE_BLOCK(int16_t)
1760 }
1761 #ifdef CABAC_ON_STACK
1762 sl->cabac.range = cc.range ;
1763 sl->cabac.low = cc.low ;
1764 sl->cabac.bytestream= cc.bytestream;
1765 #endif
1766
1767 }
1768
decode_cabac_residual_dc_internal(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,int max_coeff)1769 static av_noinline void decode_cabac_residual_dc_internal(const H264Context *h,
1770 H264SliceContext *sl,
1771 int16_t *block,
1772 int cat, int n,
1773 const uint8_t *scantable,
1774 int max_coeff)
1775 {
1776 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1777 }
1778
decode_cabac_residual_dc_internal_422(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,int max_coeff)1779 static av_noinline void decode_cabac_residual_dc_internal_422(const H264Context *h,
1780 H264SliceContext *sl,
1781 int16_t *block,
1782 int cat, int n,
1783 const uint8_t *scantable,
1784 int max_coeff)
1785 {
1786 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1787 }
1788
decode_cabac_residual_nondc_internal(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,const uint32_t * qmul,int max_coeff)1789 static av_noinline void decode_cabac_residual_nondc_internal(const H264Context *h,
1790 H264SliceContext *sl,
1791 int16_t *block,
1792 int cat, int n,
1793 const uint8_t *scantable,
1794 const uint32_t *qmul,
1795 int max_coeff)
1796 {
1797 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1798 }
1799
1800 /* cat: 0-> DC 16x16 n = 0
1801 * 1-> AC 16x16 n = luma4x4idx
1802 * 2-> Luma4x4 n = luma4x4idx
1803 * 3-> DC Chroma n = iCbCr
1804 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1805 * 5-> Luma8x8 n = 4 * luma8x8idx */
1806
1807 /* Partially inline the CABAC residual decode: inline the coded block flag.
1808 * This has very little impact on binary size and improves performance
1809 * because it allows improved constant propagation into get_cabac_cbf_ctx,
1810 * as well as because most blocks have zero CBFs. */
1811
decode_cabac_residual_dc(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,int max_coeff)1812 static av_always_inline void decode_cabac_residual_dc(const H264Context *h,
1813 H264SliceContext *sl,
1814 int16_t *block,
1815 int cat, int n,
1816 const uint8_t *scantable,
1817 int max_coeff)
1818 {
1819 /* read coded block flag */
1820 if( get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0 ) {
1821 sl->non_zero_count_cache[scan8[n]] = 0;
1822 return;
1823 }
1824 decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1825 }
1826
1827 static av_always_inline void
decode_cabac_residual_dc_422(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,int max_coeff)1828 decode_cabac_residual_dc_422(const H264Context *h, H264SliceContext *sl,
1829 int16_t *block,
1830 int cat, int n, const uint8_t *scantable,
1831 int max_coeff)
1832 {
1833 /* read coded block flag */
1834 if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1835 sl->non_zero_count_cache[scan8[n]] = 0;
1836 return;
1837 }
1838 decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1839 }
1840
decode_cabac_residual_nondc(const H264Context * h,H264SliceContext * sl,int16_t * block,int cat,int n,const uint8_t * scantable,const uint32_t * qmul,int max_coeff)1841 static av_always_inline void decode_cabac_residual_nondc(const H264Context *h,
1842 H264SliceContext *sl,
1843 int16_t *block,
1844 int cat, int n,
1845 const uint8_t *scantable,
1846 const uint32_t *qmul,
1847 int max_coeff)
1848 {
1849 /* read coded block flag */
1850 if( (cat != 5 || CHROMA444(h)) && get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 0)]) == 0) {
1851 if( max_coeff == 64 ) {
1852 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1853 } else {
1854 sl->non_zero_count_cache[scan8[n]] = 0;
1855 }
1856 return;
1857 }
1858 decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1859 }
1860
decode_cabac_luma_residual(const H264Context * h,H264SliceContext * sl,const uint8_t * scan,const uint8_t * scan8x8,int pixel_shift,int mb_type,int cbp,int p)1861 static av_always_inline void decode_cabac_luma_residual(const H264Context *h, H264SliceContext *sl,
1862 const uint8_t *scan, const uint8_t *scan8x8,
1863 int pixel_shift, int mb_type, int cbp, int p)
1864 {
1865 static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1866 const uint32_t *qmul;
1867 int i8x8, i4x4;
1868 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1869 if( IS_INTRA16x16( mb_type ) ) {
1870 AV_ZERO128(sl->mb_luma_dc[p]+0);
1871 AV_ZERO128(sl->mb_luma_dc[p]+8);
1872 AV_ZERO128(sl->mb_luma_dc[p]+16);
1873 AV_ZERO128(sl->mb_luma_dc[p]+24);
1874 decode_cabac_residual_dc(h, sl, sl->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1875
1876 if( cbp&15 ) {
1877 qmul = h->ps.pps->dequant4_coeff[p][qscale];
1878 for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1879 const int index = 16*p + i4x4;
1880 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1881 }
1882 } else {
1883 fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1884 }
1885 } else {
1886 int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1887 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1888 if( cbp & (1<<i8x8) ) {
1889 if( IS_8x8DCT(mb_type) ) {
1890 const int index = 16*p + 4*i8x8;
1891 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1892 scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1893 } else {
1894 qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1895 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1896 const int index = 16*p + 4*i8x8 + i4x4;
1897 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1898 }
1899 }
1900 } else {
1901 fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1902 }
1903 }
1904 }
1905 }
1906
1907 /**
1908 * Decode a macroblock.
1909 * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1910 */
ff_h264_decode_mb_cabac(const H264Context * h,H264SliceContext * sl)1911 int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
1912 {
1913 const SPS *sps = h->ps.sps;
1914 int mb_xy;
1915 int mb_type, partition_count, cbp = 0;
1916 int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
1917 const int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1918 const int pixel_shift = h->pixel_shift;
1919
1920 mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1921
1922 ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1923 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1924 int skip;
1925 /* a skipped mb needs the aff flag from the following mb */
1926 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1927 skip = sl->next_mb_skipped;
1928 else
1929 skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1930 /* read skip flags */
1931 if( skip ) {
1932 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1933 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1934 sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1935 if(!sl->next_mb_skipped)
1936 sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1937 }
1938
1939 decode_mb_skip(h, sl);
1940
1941 h->cbp_table[mb_xy] = 0;
1942 h->chroma_pred_mode_table[mb_xy] = 0;
1943 sl->last_qscale_diff = 0;
1944
1945 return 0;
1946
1947 }
1948 }
1949 if (FRAME_MBAFF(h)) {
1950 if ((sl->mb_y & 1) == 0)
1951 sl->mb_mbaff =
1952 sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1953 }
1954
1955 sl->prev_mb_skipped = 0;
1956
1957 fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1958
1959 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1960 int ctx = 0;
1961 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1962
1963 if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1964 ctx++;
1965 if (!IS_DIRECT(sl->top_type - 1))
1966 ctx++;
1967
1968 if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1969 mb_type= 0; /* B_Direct_16x16 */
1970 }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1971 mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1972 }else{
1973 int bits;
1974 bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1975 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1976 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1977 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1978 if( bits < 8 ){
1979 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1980 }else if( bits == 13 ){
1981 mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1982 goto decode_intra_mb;
1983 }else if( bits == 14 ){
1984 mb_type= 11; /* B_L1_L0_8x16 */
1985 }else if( bits == 15 ){
1986 mb_type= 22; /* B_8x8 */
1987 }else{
1988 bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1989 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1990 }
1991 }
1992 partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
1993 mb_type = ff_h264_b_mb_type_info[mb_type].type;
1994 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
1995 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
1996 /* P-type */
1997 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
1998 /* P_L0_D16x16, P_8x8 */
1999 mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2000 } else {
2001 /* P_L0_D8x16, P_L0_D16x8 */
2002 mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2003 }
2004 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2005 mb_type = ff_h264_p_mb_type_info[mb_type].type;
2006 } else {
2007 mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2008 goto decode_intra_mb;
2009 }
2010 } else {
2011 mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2012 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2013 mb_type--;
2014 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2015 decode_intra_mb:
2016 partition_count = 0;
2017 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
2018 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2019 mb_type = ff_h264_i_mb_type_info[mb_type].type;
2020 }
2021 if (MB_FIELD(sl))
2022 mb_type |= MB_TYPE_INTERLACED;
2023
2024 h->slice_table[mb_xy] = sl->slice_num;
2025
2026 if(IS_INTRA_PCM(mb_type)) {
2027 const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2028 sps->bit_depth_luma >> 3;
2029 const uint8_t *ptr;
2030 int ret;
2031
2032 // We assume these blocks are very rare so we do not optimize it.
2033 // FIXME The two following lines get the bitstream position in the cabac
2034 // decode, I think it should be done by a function in cabac.h (or cabac.c).
2035 ptr= sl->cabac.bytestream;
2036 if(sl->cabac.low&0x1) ptr--;
2037 if(CABAC_BITS==16){
2038 if(sl->cabac.low&0x1FF) ptr--;
2039 }
2040
2041 // The pixels are stored in the same order as levels in h->mb array.
2042 if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2043 return -1;
2044 sl->intra_pcm_ptr = ptr;
2045 ptr += mb_size;
2046
2047 ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2048 if (ret < 0)
2049 return ret;
2050
2051 // All blocks are present
2052 h->cbp_table[mb_xy] = 0xf7ef;
2053 h->chroma_pred_mode_table[mb_xy] = 0;
2054 // In deblocking, the quantizer is 0
2055 h->cur_pic.qscale_table[mb_xy] = 0;
2056 // All coeffs are present
2057 memset(h->non_zero_count[mb_xy], 16, 48);
2058 h->cur_pic.mb_type[mb_xy] = mb_type;
2059 sl->last_qscale_diff = 0;
2060 return 0;
2061 }
2062
2063 fill_decode_caches(h, sl, mb_type);
2064
2065 if( IS_INTRA( mb_type ) ) {
2066 int i, pred_mode;
2067 if( IS_INTRA4x4( mb_type ) ) {
2068 if (dct8x8_allowed && get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size])) {
2069 mb_type |= MB_TYPE_8x8DCT;
2070 for( i = 0; i < 16; i+=4 ) {
2071 int pred = pred_intra_mode(h, sl, i);
2072 int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2073 fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2074 }
2075 } else {
2076 for( i = 0; i < 16; i++ ) {
2077 int pred = pred_intra_mode(h, sl, i);
2078 sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2079
2080 ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2081 sl->intra4x4_pred_mode_cache[scan8[i]]);
2082 }
2083 }
2084 write_back_intra_pred_mode(h, sl);
2085 if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2086 sl->top_samples_available, sl->left_samples_available) < 0 )
2087 return -1;
2088 } else {
2089 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2090 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2091 if (sl->intra16x16_pred_mode < 0) return -1;
2092 }
2093 if(decode_chroma){
2094 h->chroma_pred_mode_table[mb_xy] =
2095 pred_mode = decode_cabac_mb_chroma_pre_mode(h, sl);
2096
2097 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2098 sl->left_samples_available, pred_mode, 1 );
2099 if( pred_mode < 0 ) return -1;
2100 sl->chroma_pred_mode = pred_mode;
2101 } else {
2102 sl->chroma_pred_mode = DC_128_PRED8x8;
2103 }
2104 } else if( partition_count == 4 ) {
2105 int i, j, sub_partition_count[4], list, ref[2][4];
2106
2107 if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2108 for( i = 0; i < 4; i++ ) {
2109 sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
2110 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2111 sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2112 }
2113 if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2114 sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2115 ff_h264_pred_direct_motion(h, sl, &mb_type);
2116 sl->ref_cache[0][scan8[4]] =
2117 sl->ref_cache[1][scan8[4]] =
2118 sl->ref_cache[0][scan8[12]] =
2119 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2120 for( i = 0; i < 4; i++ )
2121 fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2122 }
2123 } else {
2124 for( i = 0; i < 4; i++ ) {
2125 sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2126 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2127 sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2128 }
2129 }
2130
2131 for( list = 0; list < sl->list_count; list++ ) {
2132 for( i = 0; i < 4; i++ ) {
2133 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2134 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2135 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2136 if (rc > 1) {
2137 ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2138 if (ref[list][i] >= rc) {
2139 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2140 return -1;
2141 }
2142 }else
2143 ref[list][i] = 0;
2144 } else {
2145 ref[list][i] = -1;
2146 }
2147 sl->ref_cache[list][scan8[4 * i] + 1] =
2148 sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2149 }
2150 }
2151
2152 if(dct8x8_allowed)
2153 dct8x8_allowed = get_dct8x8_allowed(h, sl);
2154
2155 for (list = 0; list < sl->list_count; list++) {
2156 for(i=0; i<4; i++){
2157 sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2158 if(IS_DIRECT(sl->sub_mb_type[i])){
2159 fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2160 continue;
2161 }
2162
2163 if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2164 const int sub_mb_type= sl->sub_mb_type[i];
2165 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2166 for(j=0; j<sub_partition_count[i]; j++){
2167 int mpx, mpy;
2168 int mx, my;
2169 const int index= 4*i + block_width*j;
2170 int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2171 uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2172 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2173 DECODE_CABAC_MB_MVD(sl, list, index)
2174 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2175
2176 if(IS_SUB_8X8(sub_mb_type)){
2177 mv_cache[ 1 ][0]=
2178 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2179 mv_cache[ 1 ][1]=
2180 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2181
2182 mvd_cache[ 1 ][0]=
2183 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2184 mvd_cache[ 1 ][1]=
2185 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2186 }else if(IS_SUB_8X4(sub_mb_type)){
2187 mv_cache[ 1 ][0]= mx;
2188 mv_cache[ 1 ][1]= my;
2189
2190 mvd_cache[ 1 ][0]= mpx;
2191 mvd_cache[ 1 ][1]= mpy;
2192 }else if(IS_SUB_4X8(sub_mb_type)){
2193 mv_cache[ 8 ][0]= mx;
2194 mv_cache[ 8 ][1]= my;
2195
2196 mvd_cache[ 8 ][0]= mpx;
2197 mvd_cache[ 8 ][1]= mpy;
2198 }
2199 mv_cache[ 0 ][0]= mx;
2200 mv_cache[ 0 ][1]= my;
2201
2202 mvd_cache[ 0 ][0]= mpx;
2203 mvd_cache[ 0 ][1]= mpy;
2204 }
2205 }else{
2206 fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2207 fill_rectangle(sl->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2208 }
2209 }
2210 }
2211 } else if( IS_DIRECT(mb_type) ) {
2212 ff_h264_pred_direct_motion(h, sl, &mb_type);
2213 fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2214 fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2215 dct8x8_allowed &= sps->direct_8x8_inference_flag;
2216 } else {
2217 int list, i;
2218 if(IS_16X16(mb_type)){
2219 for (list = 0; list < sl->list_count; list++) {
2220 if(IS_DIR(mb_type, 0, list)){
2221 int ref;
2222 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2223 if (rc > 1) {
2224 ref= decode_cabac_mb_ref(sl, list, 0);
2225 if (ref >= rc) {
2226 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2227 return -1;
2228 }
2229 }else
2230 ref=0;
2231 fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2232 }
2233 }
2234 for (list = 0; list < sl->list_count; list++) {
2235 if(IS_DIR(mb_type, 0, list)){
2236 int mx,my,mpx,mpy;
2237 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2238 DECODE_CABAC_MB_MVD(sl, list, 0)
2239 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2240
2241 fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2242 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2243 }
2244 }
2245 }
2246 else if(IS_16X8(mb_type)){
2247 for (list = 0; list < sl->list_count; list++) {
2248 for(i=0; i<2; i++){
2249 if(IS_DIR(mb_type, i, list)){
2250 int ref;
2251 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2252 if (rc > 1) {
2253 ref= decode_cabac_mb_ref(sl, list, 8 * i);
2254 if (ref >= rc) {
2255 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2256 return -1;
2257 }
2258 }else
2259 ref=0;
2260 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2261 }else
2262 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2263 }
2264 }
2265 for (list = 0; list < sl->list_count; list++) {
2266 for(i=0; i<2; i++){
2267 if(IS_DIR(mb_type, i, list)){
2268 int mx,my,mpx,mpy;
2269 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2270 DECODE_CABAC_MB_MVD(sl, list, 8*i)
2271 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2272
2273 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2274 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2275 }else{
2276 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2277 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2278 }
2279 }
2280 }
2281 }else{
2282 av_assert2(IS_8X16(mb_type));
2283 for (list = 0; list < sl->list_count; list++) {
2284 for(i=0; i<2; i++){
2285 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2286 int ref;
2287 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2288 if (rc > 1) {
2289 ref = decode_cabac_mb_ref(sl, list, 4 * i);
2290 if (ref >= rc) {
2291 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2292 return -1;
2293 }
2294 }else
2295 ref=0;
2296 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2297 }else
2298 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2299 }
2300 }
2301 for (list = 0; list < sl->list_count; list++) {
2302 for(i=0; i<2; i++){
2303 if(IS_DIR(mb_type, i, list)){
2304 int mx,my,mpx,mpy;
2305 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2306 DECODE_CABAC_MB_MVD(sl, list, 4*i)
2307
2308 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2309 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2310 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2311 }else{
2312 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2313 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2314 }
2315 }
2316 }
2317 }
2318 }
2319
2320 if( IS_INTER( mb_type ) ) {
2321 h->chroma_pred_mode_table[mb_xy] = 0;
2322 write_back_motion(h, sl, mb_type);
2323 }
2324
2325 if( !IS_INTRA16x16( mb_type ) ) {
2326 cbp = decode_cabac_mb_cbp_luma(sl);
2327 if(decode_chroma)
2328 cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2329 } else {
2330 if (!decode_chroma && cbp>15) {
2331 av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2332 return AVERROR_INVALIDDATA;
2333 }
2334 }
2335
2336 h->cbp_table[mb_xy] = sl->cbp = cbp;
2337
2338 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2339 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2340 }
2341
2342 /* It would be better to do this in fill_decode_caches, but we don't know
2343 * the transform mode of the current macroblock there. */
2344 if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2345 int i;
2346 uint8_t *nnz_cache = sl->non_zero_count_cache;
2347 if (h->x264_build < 151U) {
2348 for (i = 0; i < 2; i++){
2349 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2350 nnz_cache[3+8* 1 + 2*8*i]=
2351 nnz_cache[3+8* 2 + 2*8*i]=
2352 nnz_cache[3+8* 6 + 2*8*i]=
2353 nnz_cache[3+8* 7 + 2*8*i]=
2354 nnz_cache[3+8*11 + 2*8*i]=
2355 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2356 }
2357 }
2358 if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2359 uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2360 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2361 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2362 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2363 }
2364 } else {
2365 for (i = 0; i < 2; i++){
2366 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2367 nnz_cache[3+8* 1 + 2*8*i]=
2368 nnz_cache[3+8* 2 + 2*8*i]=
2369 nnz_cache[3+8* 6 + 2*8*i]=
2370 nnz_cache[3+8* 7 + 2*8*i]=
2371 nnz_cache[3+8*11 + 2*8*i]=
2372 nnz_cache[3+8*12 + 2*8*i]= !IS_INTRA_PCM(sl->left_type[LEFT(i)]) ? 0 : 64;
2373 }
2374 }
2375 if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2376 uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 0x40404040;
2377 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2378 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2379 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2380 }
2381 }
2382 }
2383 h->cur_pic.mb_type[mb_xy] = mb_type;
2384
2385 if( cbp || IS_INTRA16x16( mb_type ) ) {
2386 const uint8_t *scan, *scan8x8;
2387 const uint32_t *qmul;
2388
2389 // decode_cabac_mb_dqp
2390 if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2391 int val = 1;
2392 int ctx= 2;
2393 const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2394
2395 while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2396 ctx= 3;
2397 val++;
2398 if(val > 2*max_qp){ //prevent infinite loop
2399 av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", sl->mb_x, sl->mb_y);
2400 return -1;
2401 }
2402 }
2403
2404 if( val&0x01 )
2405 val= (val + 1)>>1 ;
2406 else
2407 val= -((val + 1)>>1);
2408 sl->last_qscale_diff = val;
2409 sl->qscale += val;
2410 if (((unsigned)sl->qscale) > max_qp){
2411 if (sl->qscale < 0) sl->qscale += max_qp + 1;
2412 else sl->qscale -= max_qp + 1;
2413 }
2414 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2415 sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2416 }else
2417 sl->last_qscale_diff=0;
2418
2419 if(IS_INTERLACED(mb_type)){
2420 scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2421 scan = sl->qscale ? h->field_scan : h->field_scan_q0;
2422 }else{
2423 scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2424 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2425 }
2426
2427 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2428 if (CHROMA444(h)) {
2429 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2430 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2431 } else if (CHROMA422(h)) {
2432 if( cbp&0x30 ){
2433 int c;
2434 for (c = 0; c < 2; c++)
2435 decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2436 CHROMA_DC_BLOCK_INDEX + c,
2437 ff_h264_chroma422_dc_scan, 8);
2438 }
2439
2440 if( cbp&0x20 ) {
2441 int c, i, i8x8;
2442 for( c = 0; c < 2; c++ ) {
2443 int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2444 qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2445 for (i8x8 = 0; i8x8 < 2; i8x8++) {
2446 for (i = 0; i < 4; i++) {
2447 const int index = 16 + 16 * c + 8*i8x8 + i;
2448 decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2449 mb += 16<<pixel_shift;
2450 }
2451 }
2452 }
2453 } else {
2454 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2455 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2456 }
2457 } else /* yuv420 */ {
2458 if( cbp&0x30 ){
2459 int c;
2460 for (c = 0; c < 2; c++)
2461 decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2462 3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2463 }
2464
2465 if( cbp&0x20 ) {
2466 int c, i;
2467 for( c = 0; c < 2; c++ ) {
2468 qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2469 for( i = 0; i < 4; i++ ) {
2470 const int index = 16 + 16 * c + i;
2471 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2472 }
2473 }
2474 } else {
2475 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2476 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2477 }
2478 }
2479 } else {
2480 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2481 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2482 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2483 sl->last_qscale_diff = 0;
2484 }
2485
2486 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2487 write_back_non_zero_count(h, sl);
2488
2489 return 0;
2490 }
2491