2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
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.
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.
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
24 * H.264 / AVC / MPEG4 part10 cabac decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
29 #define UNCHECKED_BITSTREAM_READER 1
31 #include "libavutil/attributes.h"
34 #include "cabac_functions.h"
39 #include "h264_mvpred.h"
41 #include "libavutil/avassert.h"
44 #include "x86/h264_i386.h"
47 /* Cabac pre state table */
49 static const int8_t cabac_context_init_I[1024][2] =
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 },
56 /* 11 - 23 unsused 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 },
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 },
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 },
75 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
79 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
80 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
81 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
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 },
154 /* 276 a bit special (not used, bypass is used instead) */
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 },
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 },
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 },
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 },
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 },
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 },
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 }
361 static const int8_t cabac_context_init_PB[3][1024][2] =
363 /* i_cabac_init_idc == 0 */
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 },
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 },
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 },
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 },
389 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
390 { -7, 72 }, { 1, 58 },
393 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
394 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
395 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
459 /* 276 a bit special (not used, bypass is used instead) */
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 },
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 },
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 },
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 },
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 }
662 /* i_cabac_init_idc == 1 */
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 },
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 },
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 },
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 },
688 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
689 { -5, 72 },{ 0, 61 },
692 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
693 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
694 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
758 /* 276 a bit special (not used, bypass is used instead) */
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 },
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 },
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 },
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 },
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 }
961 /* i_cabac_init_idc == 2 */
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 },
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 },
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 },
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 },
987 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
988 { -7, 50 },{ 1, 60 },
991 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
992 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
993 { 13, 41 }, { 3, 62 },
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 },
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 },
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 },
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 },
1057 /* 276 a bit special (not used, bypass is used instead) */
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 },
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 },
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 },
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 },
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 }
1261 void ff_h264_init_cabac_states(H264Context *h) {
1263 const int8_t (*tab)[2];
1264 const int slice_qp = av_clip(h->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
1266 if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I;
1267 else tab = cabac_context_init_PB[h->cabac_init_idc];
1269 /* calculate pre-state */
1270 for( i= 0; i < 1024; i++ ) {
1271 int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1277 h->cabac_state[i] = pre;
1281 static int decode_cabac_field_decoding_flag(H264Context *h) {
1282 const long mbb_xy = h->mb_xy - 2L*h->mb_stride;
1284 unsigned long ctx = 0;
1286 ctx += h->mb_field_decoding_flag & !!h->mb_x; //for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
1287 ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
1289 return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
1292 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
1293 uint8_t *state= &h->cabac_state[ctx_base];
1298 if( h->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1300 if( h->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1302 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
1303 return 0; /* I4x4 */
1306 if( get_cabac_noinline( &h->cabac, state ) == 0 )
1307 return 0; /* I4x4 */
1310 if( get_cabac_terminate( &h->cabac ) )
1311 return 25; /* PCM */
1313 mb_type = 1; /* I16x16 */
1314 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
1315 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
1316 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
1317 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
1318 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
1322 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
1326 if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1327 int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1330 && h->slice_table[mba_xy] == h->slice_num
1331 && MB_FIELD(h) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1332 mba_xy += h->mb_stride;
1334 mbb_xy = mb_xy - h->mb_stride;
1336 && h->slice_table[mbb_xy] == h->slice_num
1337 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1338 mbb_xy -= h->mb_stride;
1340 mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1342 int mb_xy = h->mb_xy;
1344 mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1347 if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1349 if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1352 if( h->slice_type_nos == AV_PICTURE_TYPE_B )
1354 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
1357 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
1360 if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
1363 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
1364 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
1365 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
1367 return mode + ( mode >= pred_mode );
1370 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
1371 const int mba_xy = h->left_mb_xy[0];
1372 const int mbb_xy = h->top_mb_xy;
1376 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1377 if( h->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0 )
1380 if( h->top_type && h->chroma_pred_mode_table[mbb_xy] != 0 )
1383 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
1386 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1388 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1394 static int decode_cabac_mb_cbp_luma( H264Context *h) {
1395 int cbp_b, cbp_a, ctx, cbp = 0;
1397 cbp_a = h->left_cbp;
1400 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1401 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
1402 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1403 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
1404 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1405 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
1406 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1407 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
1410 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
1414 cbp_a = (h->left_cbp>>4)&0x03;
1415 cbp_b = (h-> top_cbp>>4)&0x03;
1418 if( cbp_a > 0 ) ctx++;
1419 if( cbp_b > 0 ) ctx += 2;
1420 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
1424 if( cbp_a == 2 ) ctx++;
1425 if( cbp_b == 2 ) ctx += 2;
1426 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
1429 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
1430 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
1432 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
1434 if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
1438 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
1440 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
1441 return 0; /* B_Direct_8x8 */
1442 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
1443 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1445 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
1446 if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
1447 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1450 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
1451 type += get_cabac( &h->cabac, &h->cabac_state[39] );
1455 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
1456 int refa = h->ref_cache[list][scan8[n] - 1];
1457 int refb = h->ref_cache[list][scan8[n] - 8];
1461 if( h->slice_type_nos == AV_PICTURE_TYPE_B) {
1462 if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1464 if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1473 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
1476 if(ref >= 32 /*h->ref_list[list]*/){
1483 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
1486 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1487 // if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1494 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
1502 while( get_cabac_bypass( &h->cabac ) ) {
1506 av_log(h->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1511 mvd += get_cabac_bypass( &h->cabac )<<k;
1513 *mvda=mvd < 70 ? mvd : 70;
1516 return get_cabac_bypass_sign( &h->cabac, -mvd );
1519 #define DECODE_CABAC_MB_MVD( h, list, n )\
1521 int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
1522 h->mvd_cache[list][scan8[n] - 8][0];\
1523 int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
1524 h->mvd_cache[list][scan8[n] - 8][1];\
1526 mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
1527 my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
1530 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int max_coeff, int is_dc ) {
1533 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1537 idx -= CHROMA_DC_BLOCK_INDEX;
1538 nza = (h->left_cbp>>(6+idx))&0x01;
1539 nzb = (h-> top_cbp>>(6+idx))&0x01;
1541 idx -= LUMA_DC_BLOCK_INDEX;
1542 nza = h->left_cbp&(0x100<<idx);
1543 nzb = h-> top_cbp&(0x100<<idx);
1546 nza = h->non_zero_count_cache[scan8[idx] - 1];
1547 nzb = h->non_zero_count_cache[scan8[idx] - 8];
1556 return base_ctx[cat] + ctx;
1559 static av_always_inline void
1560 decode_cabac_residual_internal(H264Context *h, int16_t *block,
1561 int cat, int n, const uint8_t *scantable,
1562 const uint32_t *qmul, int max_coeff,
1563 int is_dc, int chroma422)
1565 static const int significant_coeff_flag_offset[2][14] = {
1566 { 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 },
1567 { 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 }
1569 static const int last_coeff_flag_offset[2][14] = {
1570 { 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 },
1571 { 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 }
1573 static const int coeff_abs_level_m1_offset[14] = {
1574 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
1576 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1577 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1578 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1579 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1580 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1581 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1582 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1583 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1584 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1586 static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1587 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1588 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1589 * map node ctx => cabac ctx for level=1 */
1590 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1591 /* map node ctx => cabac ctx for level>1 */
1592 static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1593 { 5, 5, 5, 5, 6, 7, 8, 9 },
1594 { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1596 static const uint8_t coeff_abs_level_transition[2][8] = {
1597 /* update node ctx after decoding a level=1 */
1598 { 1, 2, 3, 3, 4, 5, 6, 7 },
1599 /* update node ctx after decoding a level>1 */
1600 { 4, 4, 4, 4, 5, 6, 7, 7 }
1606 int coeff_count = 0;
1609 uint8_t *significant_coeff_ctx_base;
1610 uint8_t *last_coeff_ctx_base;
1611 uint8_t *abs_level_m1_ctx_base;
1614 #define CABAC_ON_STACK
1616 #ifdef CABAC_ON_STACK
1619 cc.range = h->cabac.range;
1620 cc.low = h->cabac.low;
1621 cc.bytestream= h->cabac.bytestream;
1623 #define CC &h->cabac
1626 significant_coeff_ctx_base = h->cabac_state
1627 + significant_coeff_flag_offset[MB_FIELD(h)][cat];
1628 last_coeff_ctx_base = h->cabac_state
1629 + last_coeff_flag_offset[MB_FIELD(h)][cat];
1630 abs_level_m1_ctx_base = h->cabac_state
1631 + coeff_abs_level_m1_offset[cat];
1633 if( !is_dc && max_coeff == 64 ) {
1634 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1635 for(last= 0; last < coefs; last++) { \
1636 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1637 if( get_cabac( CC, sig_ctx )) { \
1638 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1639 index[coeff_count++] = last; \
1640 if( get_cabac( CC, last_ctx ) ) { \
1646 if( last == max_coeff -1 ) {\
1647 index[coeff_count++] = last;\
1649 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(h)];
1650 #ifdef decode_significance
1651 coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1652 last_coeff_ctx_base, sig_off);
1654 if (is_dc && chroma422) { // dc 422
1655 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1657 coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1658 last_coeff_ctx_base-significant_coeff_ctx_base);
1661 DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1663 if (is_dc && chroma422) { // dc 422
1664 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1666 DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1670 av_assert2(coeff_count > 0);
1674 h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1676 h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1677 h->non_zero_count_cache[scan8[n]] = coeff_count;
1679 if( max_coeff == 64 )
1680 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1682 av_assert2( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1683 h->non_zero_count_cache[scan8[n]] = coeff_count;
1688 #define STORE_BLOCK(type) \
1690 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1692 int j= scantable[index[--coeff_count]]; \
1694 if( get_cabac( CC, ctx ) == 0 ) { \
1695 node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1697 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1699 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1702 int coeff_abs = 2; \
1703 ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1704 node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1706 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1710 if( coeff_abs >= 15 ) { \
1712 while(get_cabac_bypass( CC ) && j<30) { \
1718 coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1724 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1726 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1729 } while ( coeff_count );
1731 if (h->pixel_shift) {
1732 STORE_BLOCK(int32_t)
1734 STORE_BLOCK(int16_t)
1736 #ifdef CABAC_ON_STACK
1737 h->cabac.range = cc.range ;
1738 h->cabac.low = cc.low ;
1739 h->cabac.bytestream= cc.bytestream;
1744 static av_noinline void decode_cabac_residual_dc_internal(H264Context *h,
1747 const uint8_t *scantable,
1750 decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1753 static av_noinline void decode_cabac_residual_dc_internal_422(H264Context *h,
1756 const uint8_t *scantable,
1759 decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1762 static av_noinline void decode_cabac_residual_nondc_internal(H264Context *h,
1765 const uint8_t *scantable,
1766 const uint32_t *qmul,
1769 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1772 /* cat: 0-> DC 16x16 n = 0
1773 * 1-> AC 16x16 n = luma4x4idx
1774 * 2-> Luma4x4 n = luma4x4idx
1775 * 3-> DC Chroma n = iCbCr
1776 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1777 * 5-> Luma8x8 n = 4 * luma8x8idx */
1779 /* Partially inline the CABAC residual decode: inline the coded block flag.
1780 * This has very little impact on binary size and improves performance
1781 * because it allows improved constant propagation into get_cabac_cbf_ctx,
1782 * as well as because most blocks have zero CBFs. */
1784 static av_always_inline void decode_cabac_residual_dc(H264Context *h,
1787 const uint8_t *scantable,
1790 /* read coded block flag */
1791 if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 1 ) ] ) == 0 ) {
1792 h->non_zero_count_cache[scan8[n]] = 0;
1795 decode_cabac_residual_dc_internal( h, block, cat, n, scantable, max_coeff );
1798 static av_always_inline void
1799 decode_cabac_residual_dc_422(H264Context *h, int16_t *block,
1800 int cat, int n, const uint8_t *scantable,
1803 /* read coded block flag */
1804 if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, cat, n, max_coeff, 1)]) == 0) {
1805 h->non_zero_count_cache[scan8[n]] = 0;
1808 decode_cabac_residual_dc_internal_422(h, block, cat, n, scantable, max_coeff);
1811 static av_always_inline void decode_cabac_residual_nondc(H264Context *h,
1814 const uint8_t *scantable,
1815 const uint32_t *qmul,
1818 /* read coded block flag */
1819 if( (cat != 5 || CHROMA444(h)) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 0 ) ] ) == 0 ) {
1820 if( max_coeff == 64 ) {
1821 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1823 h->non_zero_count_cache[scan8[n]] = 0;
1827 decode_cabac_residual_nondc_internal( h, block, cat, n, scantable, qmul, max_coeff );
1830 static av_always_inline void decode_cabac_luma_residual( H264Context *h, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p )
1832 static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1833 const uint32_t *qmul;
1835 int qscale = p == 0 ? h->qscale : h->chroma_qp[p-1];
1836 if( IS_INTRA16x16( mb_type ) ) {
1837 AV_ZERO128(h->mb_luma_dc[p]+0);
1838 AV_ZERO128(h->mb_luma_dc[p]+8);
1839 AV_ZERO128(h->mb_luma_dc[p]+16);
1840 AV_ZERO128(h->mb_luma_dc[p]+24);
1841 decode_cabac_residual_dc(h, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1844 qmul = h->dequant4_coeff[p][qscale];
1845 for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1846 const int index = 16*p + i4x4;
1847 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1850 fill_rectangle(&h->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1853 int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1854 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1855 if( cbp & (1<<i8x8) ) {
1856 if( IS_8x8DCT(mb_type) ) {
1857 const int index = 16*p + 4*i8x8;
1858 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1859 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1861 qmul = h->dequant4_coeff[cqm][qscale];
1862 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1863 const int index = 16*p + 4*i8x8 + i4x4;
1865 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1866 //STOP_TIMER("decode_residual")
1870 fill_rectangle(&h->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1877 * Decode a macroblock.
1878 * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1880 int ff_h264_decode_mb_cabac(H264Context *h) {
1882 int mb_type, partition_count, cbp = 0;
1883 int dct8x8_allowed= h->pps.transform_8x8_mode;
1884 int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1885 const int pixel_shift = h->pixel_shift;
1886 unsigned local_ref_count[2];
1888 mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
1890 tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
1891 if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
1893 /* a skipped mb needs the aff flag from the following mb */
1894 if (FRAME_MBAFF(h) && (h->mb_y & 1) == 1 && h->prev_mb_skipped)
1895 skip = h->next_mb_skipped;
1897 skip = decode_cabac_mb_skip( h, h->mb_x, h->mb_y );
1898 /* read skip flags */
1900 if (FRAME_MBAFF(h) && (h->mb_y & 1) == 0) {
1901 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1902 h->next_mb_skipped = decode_cabac_mb_skip( h, h->mb_x, h->mb_y+1 );
1903 if(!h->next_mb_skipped)
1904 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1909 h->cbp_table[mb_xy] = 0;
1910 h->chroma_pred_mode_table[mb_xy] = 0;
1911 h->last_qscale_diff = 0;
1917 if (FRAME_MBAFF(h)) {
1918 if( (h->mb_y&1) == 0 )
1920 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1923 h->prev_mb_skipped = 0;
1925 fill_decode_neighbors(h, -(MB_FIELD(h)));
1927 if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
1929 av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_B);
1931 if( !IS_DIRECT( h->left_type[LTOP]-1 ) )
1933 if( !IS_DIRECT( h->top_type-1 ) )
1936 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1937 mb_type= 0; /* B_Direct_16x16 */
1938 }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1939 mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1942 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1943 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1944 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1945 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1947 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1948 }else if( bits == 13 ){
1949 mb_type= decode_cabac_intra_mb_type(h, 32, 0);
1950 goto decode_intra_mb;
1951 }else if( bits == 14 ){
1952 mb_type= 11; /* B_L1_L0_8x16 */
1953 }else if( bits == 15 ){
1954 mb_type= 22; /* B_8x8 */
1956 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1957 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1960 partition_count= b_mb_type_info[mb_type].partition_count;
1961 mb_type= b_mb_type_info[mb_type].type;
1962 } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
1963 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1965 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1966 /* P_L0_D16x16, P_8x8 */
1967 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1969 /* P_L0_D8x16, P_L0_D16x8 */
1970 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1972 partition_count= p_mb_type_info[mb_type].partition_count;
1973 mb_type= p_mb_type_info[mb_type].type;
1975 mb_type= decode_cabac_intra_mb_type(h, 17, 0);
1976 goto decode_intra_mb;
1979 mb_type= decode_cabac_intra_mb_type(h, 3, 1);
1980 if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
1982 av_assert2(h->slice_type_nos == AV_PICTURE_TYPE_I);
1984 partition_count = 0;
1985 cbp= i_mb_type_info[mb_type].cbp;
1986 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
1987 mb_type= i_mb_type_info[mb_type].type;
1990 mb_type |= MB_TYPE_INTERLACED;
1992 h->slice_table[ mb_xy ]= h->slice_num;
1994 if(IS_INTRA_PCM(mb_type)) {
1995 const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
1996 h->sps.bit_depth_luma >> 3;
1999 // We assume these blocks are very rare so we do not optimize it.
2000 // FIXME The two following lines get the bitstream position in the cabac
2001 // decode, I think it should be done by a function in cabac.h (or cabac.c).
2002 ptr= h->cabac.bytestream;
2003 if(h->cabac.low&0x1) ptr--;
2005 if(h->cabac.low&0x1FF) ptr--;
2008 // The pixels are stored in the same order as levels in h->mb array.
2009 if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
2011 h->intra_pcm_ptr = ptr;
2014 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
2016 // All blocks are present
2017 h->cbp_table[mb_xy] = 0xf7ef;
2018 h->chroma_pred_mode_table[mb_xy] = 0;
2019 // In deblocking, the quantizer is 0
2020 h->cur_pic.qscale_table[mb_xy] = 0;
2021 // All coeffs are present
2022 memset(h->non_zero_count[mb_xy], 16, 48);
2023 h->cur_pic.mb_type[mb_xy] = mb_type;
2024 h->last_qscale_diff = 0;
2028 local_ref_count[0] = h->ref_count[0] << MB_MBAFF(h);
2029 local_ref_count[1] = h->ref_count[1] << MB_MBAFF(h);
2031 fill_decode_caches(h, mb_type);
2033 if( IS_INTRA( mb_type ) ) {
2035 if( IS_INTRA4x4( mb_type ) ) {
2036 if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
2037 mb_type |= MB_TYPE_8x8DCT;
2038 for( i = 0; i < 16; i+=4 ) {
2039 int pred = pred_intra_mode( h, i );
2040 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2041 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
2044 for( i = 0; i < 16; i++ ) {
2045 int pred = pred_intra_mode( h, i );
2046 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2048 av_dlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2049 h->intra4x4_pred_mode_cache[scan8[i]]);
2052 write_back_intra_pred_mode(h);
2053 if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
2055 h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
2056 if( h->intra16x16_pred_mode < 0 ) return -1;
2059 h->chroma_pred_mode_table[mb_xy] =
2060 pred_mode = decode_cabac_mb_chroma_pre_mode( h );
2062 pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
2063 if( pred_mode < 0 ) return -1;
2064 h->chroma_pred_mode= pred_mode;
2066 h->chroma_pred_mode= DC_128_PRED8x8;
2068 } else if( partition_count == 4 ) {
2069 int i, j, sub_partition_count[4], list, ref[2][4];
2071 if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
2072 for( i = 0; i < 4; i++ ) {
2073 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
2074 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2075 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2077 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
2078 h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
2079 ff_h264_pred_direct_motion(h, &mb_type);
2080 h->ref_cache[0][scan8[4]] =
2081 h->ref_cache[1][scan8[4]] =
2082 h->ref_cache[0][scan8[12]] =
2083 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2084 for( i = 0; i < 4; i++ )
2085 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
2088 for( i = 0; i < 4; i++ ) {
2089 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
2090 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2091 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2095 for( list = 0; list < h->list_count; list++ ) {
2096 for( i = 0; i < 4; i++ ) {
2097 if(IS_DIRECT(h->sub_mb_type[i])) continue;
2098 if(IS_DIR(h->sub_mb_type[i], 0, list)){
2099 if (local_ref_count[list] > 1) {
2100 ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
2101 if (ref[list][i] >= (unsigned)local_ref_count[list]) {
2102 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]);
2110 h->ref_cache[list][ scan8[4*i]+1 ]=
2111 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
2116 dct8x8_allowed = get_dct8x8_allowed(h);
2118 for(list=0; list<h->list_count; list++){
2120 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ];
2121 if(IS_DIRECT(h->sub_mb_type[i])){
2122 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2126 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
2127 const int sub_mb_type= h->sub_mb_type[i];
2128 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2129 for(j=0; j<sub_partition_count[i]; j++){
2132 const int index= 4*i + block_width*j;
2133 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
2134 uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2135 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
2136 DECODE_CABAC_MB_MVD( h, list, index)
2137 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2139 if(IS_SUB_8X8(sub_mb_type)){
2141 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2143 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2146 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2148 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2149 }else if(IS_SUB_8X4(sub_mb_type)){
2150 mv_cache[ 1 ][0]= mx;
2151 mv_cache[ 1 ][1]= my;
2153 mvd_cache[ 1 ][0]= mpx;
2154 mvd_cache[ 1 ][1]= mpy;
2155 }else if(IS_SUB_4X8(sub_mb_type)){
2156 mv_cache[ 8 ][0]= mx;
2157 mv_cache[ 8 ][1]= my;
2159 mvd_cache[ 8 ][0]= mpx;
2160 mvd_cache[ 8 ][1]= mpy;
2162 mv_cache[ 0 ][0]= mx;
2163 mv_cache[ 0 ][1]= my;
2165 mvd_cache[ 0 ][0]= mpx;
2166 mvd_cache[ 0 ][1]= mpy;
2169 fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2170 fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2174 } else if( IS_DIRECT(mb_type) ) {
2175 ff_h264_pred_direct_motion(h, &mb_type);
2176 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2177 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2178 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2181 if(IS_16X16(mb_type)){
2182 for(list=0; list<h->list_count; list++){
2183 if(IS_DIR(mb_type, 0, list)){
2185 if (local_ref_count[list] > 1) {
2186 ref= decode_cabac_mb_ref(h, list, 0);
2187 if (ref >= (unsigned)local_ref_count[list]) {
2188 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2193 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2196 for(list=0; list<h->list_count; list++){
2197 if(IS_DIR(mb_type, 0, list)){
2199 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
2200 DECODE_CABAC_MB_MVD( h, list, 0)
2201 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2203 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2204 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2208 else if(IS_16X8(mb_type)){
2209 for(list=0; list<h->list_count; list++){
2211 if(IS_DIR(mb_type, i, list)){
2213 if (local_ref_count[list] > 1) {
2214 ref= decode_cabac_mb_ref( h, list, 8*i );
2215 if (ref >= (unsigned)local_ref_count[list]) {
2216 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2221 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2223 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2226 for(list=0; list<h->list_count; list++){
2228 if(IS_DIR(mb_type, i, list)){
2230 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2231 DECODE_CABAC_MB_MVD( h, list, 8*i)
2232 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2234 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2235 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2237 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2238 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2243 av_assert2(IS_8X16(mb_type));
2244 for(list=0; list<h->list_count; list++){
2246 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2248 if (local_ref_count[list] > 1) {
2249 ref= decode_cabac_mb_ref( h, list, 4*i );
2250 if (ref >= (unsigned)local_ref_count[list]) {
2251 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2256 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2258 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2261 for(list=0; list<h->list_count; list++){
2263 if(IS_DIR(mb_type, i, list)){
2265 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2266 DECODE_CABAC_MB_MVD( h, list, 4*i)
2268 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2269 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2270 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2272 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2273 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2280 if( IS_INTER( mb_type ) ) {
2281 h->chroma_pred_mode_table[mb_xy] = 0;
2282 write_back_motion( h, mb_type );
2285 if( !IS_INTRA16x16( mb_type ) ) {
2286 cbp = decode_cabac_mb_cbp_luma( h );
2288 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2290 if (!decode_chroma && cbp>15) {
2291 av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2292 return AVERROR_INVALIDDATA;
2296 h->cbp_table[mb_xy] = h->cbp = cbp;
2298 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2299 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
2302 /* It would be better to do this in fill_decode_caches, but we don't know
2303 * the transform mode of the current macroblock there. */
2304 if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2306 uint8_t *nnz_cache = h->non_zero_count_cache;
2307 for (i = 0; i < 2; i++){
2308 if (h->left_type[LEFT(i)] && !IS_8x8DCT(h->left_type[LEFT(i)])){
2309 nnz_cache[3+8* 1 + 2*8*i]=
2310 nnz_cache[3+8* 2 + 2*8*i]=
2311 nnz_cache[3+8* 6 + 2*8*i]=
2312 nnz_cache[3+8* 7 + 2*8*i]=
2313 nnz_cache[3+8*11 + 2*8*i]=
2314 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2317 if (h->top_type && !IS_8x8DCT(h->top_type)){
2318 uint32_t top_empty = CABAC(h) && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2319 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2320 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2321 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2324 h->cur_pic.mb_type[mb_xy] = mb_type;
2326 if( cbp || IS_INTRA16x16( mb_type ) ) {
2327 const uint8_t *scan, *scan8x8;
2328 const uint32_t *qmul;
2330 if(IS_INTERLACED(mb_type)){
2331 scan8x8= h->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2332 scan= h->qscale ? h->field_scan : h->field_scan_q0;
2334 scan8x8= h->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2335 scan= h->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2338 // decode_cabac_mb_dqp
2339 if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2342 const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2344 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2347 if(val > 2*max_qp){ //prevent infinite loop
2348 av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", h->mb_x, h->mb_y);
2356 val= -((val + 1)>>1);
2357 h->last_qscale_diff = val;
2359 if(((unsigned)h->qscale) > max_qp){
2360 if(h->qscale<0) h->qscale+= max_qp+1;
2361 else h->qscale-= max_qp+1;
2363 h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
2364 h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
2366 h->last_qscale_diff=0;
2368 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2370 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2371 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2372 } else if (CHROMA422(h)) {
2375 for (c = 0; c < 2; c++)
2376 decode_cabac_residual_dc_422(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2377 CHROMA_DC_BLOCK_INDEX + c,
2378 chroma422_dc_scan, 8);
2383 for( c = 0; c < 2; c++ ) {
2384 int16_t *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2385 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2386 for (i8x8 = 0; i8x8 < 2; i8x8++) {
2387 for (i = 0; i < 4; i++) {
2388 const int index = 16 + 16 * c + 8*i8x8 + i;
2389 decode_cabac_residual_nondc(h, mb, 4, index, scan + 1, qmul, 15);
2390 mb += 16<<pixel_shift;
2395 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2396 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2398 } else /* yuv420 */ {
2401 for (c = 0; c < 2; c++)
2402 decode_cabac_residual_dc(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2407 for( c = 0; c < 2; c++ ) {
2408 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2409 for( i = 0; i < 4; i++ ) {
2410 const int index = 16 + 16 * c + i;
2411 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2415 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2416 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2420 fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2421 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2422 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2423 h->last_qscale_diff = 0;
2426 h->cur_pic.qscale_table[mb_xy] = h->qscale;
2427 write_back_non_zero_count(h);