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