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
33 #include "cabac_functions.h"
39 #include "h264_mvpred.h"
43 #include "x86/h264_i386.h"
49 /* Cabac pre state table */
51 static const int8_t cabac_context_init_I[1024][2] =
54 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
55 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 },
56 { -6, 53 }, { -1, 54 }, { 7, 51 },
58 /* 11 - 23 unsused for I */
59 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
60 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
61 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
65 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
66 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
67 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
68 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
71 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
72 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
73 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
77 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
81 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
82 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
83 { 13, 41 }, { 3, 62 },
86 { 0, 11 }, { 1, 55 }, { 0, 69 }, { -17, 127 },
87 { -13, 102 },{ 0, 82 }, { -7, 74 }, { -21, 107 },
88 { -27, 127 },{ -31, 127 },{ -24, 127 }, { -18, 95 },
89 { -27, 127 },{ -21, 114 },{ -30, 127 }, { -17, 123 },
90 { -12, 115 },{ -16, 122 },
93 { -11, 115 },{ -12, 63 }, { -2, 68 }, { -15, 84 },
94 { -13, 104 },{ -3, 70 }, { -8, 93 }, { -10, 90 },
95 { -30, 127 },{ -1, 74 }, { -6, 97 }, { -7, 91 },
96 { -20, 127 },{ -4, 56 }, { -5, 82 }, { -7, 76 },
100 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
101 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
102 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
103 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
104 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
105 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
106 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
107 { 14, 62 }, { -13, 108 },{ -15, 100 },
110 { -13, 101 },{ -13, 91 }, { -12, 94 }, { -10, 88 },
111 { -16, 84 }, { -10, 86 }, { -7, 83 }, { -13, 87 },
112 { -19, 94 }, { 1, 70 }, { 0, 72 }, { -5, 74 },
113 { 18, 59 }, { -8, 102 }, { -15, 100 }, { 0, 95 },
114 { -4, 75 }, { 2, 72 }, { -11, 75 }, { -3, 71 },
115 { 15, 46 }, { -13, 69 }, { 0, 62 }, { 0, 65 },
116 { 21, 37 }, { -15, 72 }, { 9, 57 }, { 16, 54 },
117 { 0, 62 }, { 12, 72 },
120 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
121 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
122 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
123 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
124 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
125 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
126 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
127 { 0, 89 }, { 26, -19 }, { 22, -17 },
130 { 26, -17 }, { 30, -25 }, { 28, -20 }, { 33, -23 },
131 { 37, -27 }, { 33, -23 }, { 40, -28 }, { 38, -17 },
132 { 33, -11 }, { 40, -15 }, { 41, -6 }, { 38, 1 },
133 { 41, 17 }, { 30, -6 }, { 27, 3 }, { 26, 22 },
134 { 37, -16 }, { 35, -4 }, { 38, -8 }, { 38, -3 },
135 { 37, 3 }, { 38, 5 }, { 42, 0 }, { 35, 16 },
136 { 39, 22 }, { 14, 48 }, { 27, 37 }, { 21, 60 },
137 { 12, 68 }, { 2, 97 },
140 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
141 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
142 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
143 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
144 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
145 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
149 { -12, 73 }, { -8, 76 }, { -7, 80 }, { -9, 88 },
150 { -17, 110 },{ -11, 97 }, { -20, 84 }, { -11, 79 },
151 { -6, 73 }, { -4, 74 }, { -13, 86 }, { -13, 96 },
152 { -11, 97 }, { -19, 117 },{ -8, 78 }, { -5, 33 },
153 { -4, 48 }, { -2, 53 }, { -3, 62 }, { -13, 71 },
154 { -10, 79 }, { -12, 86 }, { -13, 90 }, { -14, 97 },
156 /* 276 a bit special (not used, bypass is used instead) */
160 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
161 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
162 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
163 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
164 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
165 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
166 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
167 { 9, 64 }, { -12, 104 },{ -11, 97 },
170 { -16, 96 }, { -7, 88 }, { -8, 85 }, { -7, 85 },
171 { -9, 85 }, { -13, 88 }, { 4, 66 }, { -3, 77 },
172 { -3, 76 }, { -6, 76 }, { 10, 58 }, { -1, 76 },
173 { -1, 83 }, { -7, 99 }, { -14, 95 }, { 2, 95 },
174 { 0, 76 }, { -5, 74 }, { 0, 70 }, { -11, 75 },
175 { 1, 68 }, { 0, 65 }, { -14, 73 }, { 3, 62 },
176 { 4, 62 }, { -1, 68 }, { -13, 75 }, { 11, 55 },
177 { 5, 64 }, { 12, 70 },
180 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
181 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
182 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
183 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
184 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
185 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
186 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
187 { -12, 109 },{ 36, -35 }, { 36, -34 },
190 { 32, -26 }, { 37, -30 }, { 44, -32 }, { 34, -18 },
191 { 34, -15 }, { 40, -15 }, { 33, -7 }, { 35, -5 },
192 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 },
193 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 },
194 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 },
195 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 },
196 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 },
197 { 29, 39 }, { 19, 66 },
200 { 31, 21 }, { 31, 31 }, { 25, 50 },
201 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
202 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
203 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
204 { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 },
205 { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 },
206 { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 },
207 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
208 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
209 { 0, 68 }, { -9, 92 },
212 { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 },
213 { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 },
214 { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 },
215 { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 },
216 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
217 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
220 { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
221 { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
222 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
223 { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
224 { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
225 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
226 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
227 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
228 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
229 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
230 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
231 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
232 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
233 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
234 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
235 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
236 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
237 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
238 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
239 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
240 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
241 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
242 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
243 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
244 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
245 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
246 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
247 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
248 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
249 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
250 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
251 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
252 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
253 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
254 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
255 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
256 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
257 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
258 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
259 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
260 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
261 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
262 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
263 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
264 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
265 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
266 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
267 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
268 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
269 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
270 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
271 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
272 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
273 { -23, 68 }, { -24, 50 }, { -11, 74 }, { -14, 106 },
274 { -13, 97 }, { -15, 90 }, { -12, 90 }, { -18, 88 },
275 { -10, 73 }, { -9, 79 }, { -14, 86 }, { -10, 73 },
276 { -10, 70 }, { -10, 69 }, { -5, 66 }, { -9, 64 },
277 { -5, 58 }, { 2, 59 }, { 23, -13 }, { 26, -13 },
278 { 40, -15 }, { 49, -14 }, { 44, 3 }, { 45, 6 },
279 { 44, 34 }, { 33, 54 }, { 19, 82 }, { 21, -10 },
280 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
281 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
282 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
283 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
284 { 0, 68 }, { -9, 92 }, { -17, 120 }, { -20, 112 },
285 { -18, 114 }, { -11, 85 }, { -15, 92 }, { -14, 89 },
286 { -26, 71 }, { -15, 81 }, { -14, 80 }, { 0, 68 },
287 { -14, 70 }, { -24, 56 }, { -23, 68 }, { -24, 50 },
288 { -11, 74 }, { -14, 106 }, { -13, 97 }, { -15, 90 },
289 { -12, 90 }, { -18, 88 }, { -10, 73 }, { -9, 79 },
290 { -14, 86 }, { -10, 73 }, { -10, 70 }, { -10, 69 },
291 { -5, 66 }, { -9, 64 }, { -5, 58 }, { 2, 59 },
292 { 23, -13 }, { 26, -13 }, { 40, -15 }, { 49, -14 },
293 { 44, 3 }, { 45, 6 }, { 44, 34 }, { 33, 54 },
294 { 19, 82 }, { 21, -10 }, { 24, -11 }, { 28, -8 },
295 { 28, -1 }, { 29, 3 }, { 29, 9 }, { 35, 20 },
296 { 29, 36 }, { 14, 67 }, { -3, 75 }, { -1, 23 },
297 { 1, 34 }, { 1, 43 }, { 0, 54 }, { -2, 55 },
298 { 0, 61 }, { 1, 64 }, { 0, 68 }, { -9, 92 },
299 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
300 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
301 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
302 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
303 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
304 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
305 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
306 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
307 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
308 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
309 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
310 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
311 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
312 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
313 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
314 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
315 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
316 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
317 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
318 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
319 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
320 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
321 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
322 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
323 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
324 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
325 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
326 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
327 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
328 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
329 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
330 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
331 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
332 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
333 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
334 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
335 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
336 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
337 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
338 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
339 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
340 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
341 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
342 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
343 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
344 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
345 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
346 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
347 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
348 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
349 { -4, 65 }, { -12, 73 }, { -8, 76 }, { -7, 80 },
350 { -9, 88 }, { -17, 110 }, { -3, 71 }, { -6, 42 },
351 { -5, 50 }, { -3, 54 }, { -2, 62 }, { 0, 58 },
352 { 1, 63 }, { -2, 72 }, { -1, 74 }, { -9, 91 },
353 { -5, 67 }, { -5, 27 }, { -3, 39 }, { -2, 44 },
354 { 0, 46 }, { -16, 64 }, { -8, 68 }, { -10, 78 },
355 { -6, 77 }, { -10, 86 }, { -12, 92 }, { -15, 55 },
356 { -10, 60 }, { -6, 62 }, { -4, 65 }, { -12, 73 },
357 { -8, 76 }, { -7, 80 }, { -9, 88 }, { -17, 110 },
358 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
359 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
360 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 }
363 static const int8_t cabac_context_init_PB[3][1024][2] =
365 /* i_cabac_init_idc == 0 */
368 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
369 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
370 { -6, 53 }, { -1, 54 }, { 7, 51 },
373 { 23, 33 }, { 23, 2 }, { 21, 0 }, { 1, 9 },
374 { 0, 49 }, { -37, 118 }, { 5, 57 }, { -13, 78 },
375 { -11, 65 }, { 1, 62 }, { 12, 49 }, { -4, 73 },
379 { 18, 64 }, { 9, 43 }, { 29, 0 }, { 26, 67 },
380 { 16, 90 }, { 9, 104 }, { -46, 127 }, { -20, 104 },
381 { 1, 67 }, { -13, 78 }, { -11, 65 }, { 1, 62 },
382 { -6, 86 }, { -17, 95 }, { -6, 61 }, { 9, 45 },
385 { -3, 69 }, { -6, 81 }, { -11, 96 }, { 6, 55 },
386 { 7, 67 }, { -5, 86 }, { 2, 88 }, { 0, 58 },
387 { -3, 76 }, { -10, 94 }, { 5, 54 }, { 4, 69 },
388 { -3, 81 }, { 0, 88 },
391 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
392 { -7, 72 }, { 1, 58 },
395 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
396 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
397 { 13, 41 }, { 3, 62 },
400 { 0, 45 }, { -4, 78 }, { -3, 96 }, { -27, 126 },
401 { -28, 98 }, { -25, 101 }, { -23, 67 }, { -28, 82 },
402 { -20, 94 }, { -16, 83 }, { -22, 110 }, { -21, 91 },
403 { -18, 102 }, { -13, 93 }, { -29, 127 }, { -7, 92 },
404 { -5, 89 }, { -7, 96 }, { -13, 108 }, { -3, 46 },
405 { -1, 65 }, { -1, 57 }, { -9, 93 }, { -3, 74 },
406 { -9, 92 }, { -8, 87 }, { -23, 126 }, { 5, 54 },
407 { 6, 60 }, { 6, 59 }, { 6, 69 }, { -1, 48 },
408 { 0, 68 }, { -4, 69 }, { -8, 88 },
411 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
412 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
413 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
414 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
415 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
416 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
417 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
418 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
419 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
420 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
421 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
422 { 3, 64 }, { 1, 61 }, { 9, 63 }, { 7, 50 },
423 { 16, 39 }, { 5, 44 }, { 4, 52 }, { 11, 48 },
424 { -5, 60 }, { -1, 59 }, { 0, 59 }, { 22, 33 },
425 { 5, 44 }, { 14, 43 }, { -1, 78 }, { 0, 60 },
429 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
430 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
431 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
432 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
433 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
434 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
435 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
436 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
437 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
438 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
439 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
440 { 1, 67 }, { 5, 59 }, { 9, 67 }, { 16, 30 },
441 { 18, 32 }, { 18, 35 }, { 22, 29 }, { 24, 31 },
442 { 23, 38 }, { 18, 43 }, { 20, 41 }, { 11, 63 },
443 { 9, 59 }, { 9, 64 }, { -1, 94 }, { -2, 89 },
447 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
448 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
449 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
450 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
451 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
452 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
453 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
454 { -3, 74 }, { -10, 90 }, { 0, 70 }, { -4, 29 },
455 { 5, 31 }, { 7, 42 }, { 1, 59 }, { -2, 58 },
456 { -3, 72 }, { -3, 81 }, { -11, 97 }, { 0, 58 },
457 { 8, 5 }, { 10, 14 }, { 14, 18 }, { 13, 27 },
458 { 2, 40 }, { 0, 58 }, { -3, 70 }, { -6, 79 },
461 /* 276 a bit special (not used, bypass is used instead) */
465 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
466 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
467 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
468 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
469 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
470 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
471 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
472 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
473 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
474 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
475 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
476 { -2, 69 }, { -2, 59 }, { 6, 70 }, { 10, 44 },
477 { 9, 31 }, { 12, 43 }, { 3, 53 }, { 14, 34 },
478 { 10, 38 }, { -3, 52 }, { 13, 40 }, { 17, 32 },
479 { 7, 44 }, { 7, 38 }, { 13, 50 }, { 10, 57 },
483 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
484 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
485 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
486 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
487 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
488 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
489 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
490 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
491 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
492 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
493 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
494 { 8, 60 }, { 6, 63 }, { 17, 65 }, { 21, 24 },
495 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 },
496 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 },
497 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 },
501 { 12, 40 }, { 11, 51 }, { 14, 59 },
502 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
503 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
504 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
505 { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 },
506 { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 },
507 { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 },
508 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
509 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
510 { -8, 66 }, { -8, 76 },
513 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
514 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
515 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
516 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 },
517 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
518 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
521 { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
522 { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
523 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
524 { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
525 { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
526 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
527 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
528 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
529 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
530 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
531 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
532 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
533 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
534 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
535 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
536 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
537 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
538 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
539 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
540 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
541 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
542 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
543 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
544 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
545 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
546 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
547 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
548 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
549 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
550 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
551 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
552 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
553 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
554 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
555 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
556 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
557 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
558 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
559 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
560 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
561 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
562 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
563 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
564 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
565 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
566 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
567 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
568 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
569 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
570 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
571 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
572 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
573 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
574 { -16, 66 }, { -22, 65 }, { -20, 63 }, { -5, 85 },
575 { -6, 81 }, { -10, 77 }, { -7, 81 }, { -17, 80 },
576 { -18, 73 }, { -4, 74 }, { -10, 83 }, { -9, 71 },
577 { -9, 67 }, { -1, 61 }, { -8, 66 }, { -14, 66 },
578 { 0, 59 }, { 2, 59 }, { 9, -2 }, { 26, -9 },
579 { 33, -9 }, { 39, -7 }, { 41, -2 }, { 45, 3 },
580 { 49, 9 }, { 45, 27 }, { 36, 59 }, { 21, -13 },
581 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
582 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
583 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
584 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
585 { -8, 66 }, { -8, 76 }, { -4, 79 }, { -7, 71 },
586 { -5, 69 }, { -9, 70 }, { -8, 66 }, { -10, 68 },
587 { -19, 73 }, { -12, 69 }, { -16, 70 }, { -15, 67 },
588 { -20, 62 }, { -19, 70 }, { -16, 66 }, { -22, 65 },
589 { -20, 63 }, { -5, 85 }, { -6, 81 }, { -10, 77 },
590 { -7, 81 }, { -17, 80 }, { -18, 73 }, { -4, 74 },
591 { -10, 83 }, { -9, 71 }, { -9, 67 }, { -1, 61 },
592 { -8, 66 }, { -14, 66 }, { 0, 59 }, { 2, 59 },
593 { 9, -2 }, { 26, -9 }, { 33, -9 }, { 39, -7 },
594 { 41, -2 }, { 45, 3 }, { 49, 9 }, { 45, 27 },
595 { 36, 59 }, { 21, -13 }, { 33, -14 }, { 39, -7 },
596 { 46, -2 }, { 51, 2 }, { 60, 6 }, { 61, 17 },
597 { 55, 34 }, { 42, 62 }, { -6, 66 }, { -7, 35 },
598 { -7, 42 }, { -8, 45 }, { -5, 48 }, { -12, 56 },
599 { -6, 60 }, { -5, 62 }, { -8, 66 }, { -8, 76 },
600 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
601 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
602 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
603 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
604 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
605 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
606 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
607 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
608 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
609 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
610 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
611 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
612 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
613 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
614 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
615 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
616 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
617 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
618 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
619 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
620 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
621 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
622 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
623 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
624 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
625 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
626 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
627 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
628 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
629 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
630 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
631 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
632 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
633 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
634 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
635 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
636 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
637 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
638 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
639 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
640 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
641 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
642 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
643 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
644 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
645 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
646 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
647 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
648 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
649 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
650 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
651 { -3, 74 }, { -10, 90 }, { -6, 76 }, { -2, 44 },
652 { 0, 45 }, { 0, 52 }, { -3, 64 }, { -2, 59 },
653 { -4, 70 }, { -4, 75 }, { -8, 82 }, { -17, 102 },
654 { -9, 77 }, { 3, 24 }, { 0, 42 }, { 0, 48 },
655 { 0, 55 }, { -6, 59 }, { -7, 71 }, { -12, 83 },
656 { -11, 87 }, { -30, 119 }, { 1, 58 }, { -3, 29 },
657 { -1, 36 }, { 1, 38 }, { 2, 43 }, { -6, 55 },
658 { 0, 58 }, { 0, 64 }, { -3, 74 }, { -10, 90 },
659 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
660 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
661 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 }
664 /* i_cabac_init_idc == 1 */
667 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
668 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
669 { -6, 53 }, { -1, 54 }, { 7, 51 },
672 { 22, 25 }, { 34, 0 }, { 16, 0 }, { -2, 9 },
673 { 4, 41 }, { -29, 118 }, { 2, 65 }, { -6, 71 },
674 { -13, 79 }, { 5, 52 }, { 9, 50 }, { -3, 70 },
678 { 26, 34 }, { 19, 22 }, { 40, 0 }, { 57, 2 },
679 { 41, 36 }, { 26, 69 }, { -45, 127 }, { -15, 101 },
680 { -4, 76 }, { -6, 71 }, { -13, 79 }, { 5, 52 },
681 { 6, 69 }, { -13, 90 }, { 0, 52 }, { 8, 43 },
684 { -2, 69 },{ -5, 82 },{ -10, 96 },{ 2, 59 },
685 { 2, 75 },{ -3, 87 },{ -3, 100 },{ 1, 56 },
686 { -3, 74 },{ -6, 85 },{ 0, 59 },{ -3, 81 },
687 { -7, 86 },{ -5, 95 },
690 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
691 { -5, 72 },{ 0, 61 },
694 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
695 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
696 { 13, 41 }, { 3, 62 },
699 { 13, 15 }, { 7, 51 }, { 2, 80 }, { -39, 127 },
700 { -18, 91 }, { -17, 96 }, { -26, 81 }, { -35, 98 },
701 { -24, 102 }, { -23, 97 }, { -27, 119 }, { -24, 99 },
702 { -21, 110 }, { -18, 102 }, { -36, 127 }, { 0, 80 },
703 { -5, 89 }, { -7, 94 }, { -4, 92 }, { 0, 39 },
704 { 0, 65 }, { -15, 84 }, { -35, 127 }, { -2, 73 },
705 { -12, 104 }, { -9, 91 }, { -31, 127 }, { 3, 55 },
706 { 7, 56 }, { 7, 55 }, { 8, 61 }, { -3, 53 },
707 { 0, 68 }, { -7, 74 }, { -9, 88 },
710 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
711 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
712 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
713 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
714 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
715 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
716 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
717 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
718 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
719 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
720 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
721 { -4, 71 }, { 0, 58 }, { 7, 61 }, { 9, 41 },
722 { 18, 25 }, { 9, 32 }, { 5, 43 }, { 9, 47 },
723 { 0, 44 }, { 0, 51 }, { 2, 46 }, { 19, 38 },
724 { -4, 66 }, { 15, 38 }, { 12, 42 }, { 9, 34 },
728 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
729 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
730 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
731 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
732 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
733 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
734 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
735 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
736 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
737 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
738 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
739 { 0, 75 }, { 2, 72 }, { 8, 77 }, { 14, 35 },
740 { 18, 31 }, { 17, 35 }, { 21, 30 }, { 17, 45 },
741 { 20, 42 }, { 18, 45 }, { 27, 26 }, { 16, 54 },
742 { 7, 66 }, { 16, 56 }, { 11, 73 }, { 10, 67 },
746 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
747 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
748 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
749 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
750 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
751 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
752 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
753 { -5, 74 }, { -9, 86 }, { 2, 66 }, { -9, 34 },
754 { 1, 32 }, { 11, 31 }, { 5, 52 }, { -2, 55 },
755 { -2, 67 }, { 0, 73 }, { -8, 89 }, { 3, 52 },
756 { 7, 4 }, { 10, 8 }, { 17, 8 }, { 16, 19 },
757 { 3, 37 }, { -1, 61 }, { -5, 73 }, { -1, 70 },
760 /* 276 a bit special (not used, bypass is used instead) */
764 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
765 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
766 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
767 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
768 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
769 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
770 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
771 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
772 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
773 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
774 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
775 { -1, 70 }, { -9, 72 }, { 14, 60 }, { 16, 37 },
776 { 0, 47 }, { 18, 35 }, { 11, 37 }, { 12, 41 },
777 { 10, 41 }, { 2, 48 }, { 12, 41 }, { 13, 41 },
778 { 0, 59 }, { 3, 50 }, { 19, 40 }, { 3, 66 },
782 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
783 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
784 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
785 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
786 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
787 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
788 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
789 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
790 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
791 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
792 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
793 { 12, 48 }, { 11, 49 }, { 26, 45 }, { 22, 22 },
794 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 },
795 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 },
796 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 },
800 { 25, 32 }, { 21, 49 }, { 21, 54 },
801 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
802 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
803 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
804 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 },
805 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
806 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
807 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
808 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
809 { -4, 67 }, { -7, 82 },
812 { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 },
813 { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 },
814 { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 },
815 { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 },
816 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
817 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
820 { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
821 { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
822 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
823 { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
824 { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
825 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
826 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
827 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
828 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
829 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
830 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
831 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
832 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
833 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
834 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
835 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
836 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
837 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
838 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
839 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
840 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
841 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
842 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
843 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
844 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
845 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
846 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
847 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
848 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
849 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
850 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
851 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
852 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
853 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
854 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
855 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
856 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
857 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
858 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
859 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
860 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
861 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
862 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
863 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
864 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
865 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
866 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
867 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
868 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
869 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
870 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
871 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
872 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
873 { -14, 66 }, { 0, 59 }, { 2, 59 }, { -3, 81 },
874 { -3, 76 }, { -7, 72 }, { -6, 78 }, { -12, 72 },
875 { -14, 68 }, { -3, 70 }, { -6, 76 }, { -5, 66 },
876 { -5, 62 }, { 0, 57 }, { -4, 61 }, { -9, 60 },
877 { 1, 54 }, { 2, 58 }, { 17, -10 }, { 32, -13 },
878 { 42, -9 }, { 49, -5 }, { 53, 0 }, { 64, 3 },
879 { 68, 10 }, { 66, 27 }, { 47, 57 }, { 17, -10 },
880 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
881 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
882 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
883 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
884 { -4, 67 }, { -7, 82 }, { -5, 85 }, { -6, 81 },
885 { -10, 77 }, { -7, 81 }, { -17, 80 }, { -18, 73 },
886 { -4, 74 }, { -10, 83 }, { -9, 71 }, { -9, 67 },
887 { -1, 61 }, { -8, 66 }, { -14, 66 }, { 0, 59 },
888 { 2, 59 }, { -3, 81 }, { -3, 76 }, { -7, 72 },
889 { -6, 78 }, { -12, 72 }, { -14, 68 }, { -3, 70 },
890 { -6, 76 }, { -5, 66 }, { -5, 62 }, { 0, 57 },
891 { -4, 61 }, { -9, 60 }, { 1, 54 }, { 2, 58 },
892 { 17, -10 }, { 32, -13 }, { 42, -9 }, { 49, -5 },
893 { 53, 0 }, { 64, 3 }, { 68, 10 }, { 66, 27 },
894 { 47, 57 }, { 17, -10 }, { 32, -13 }, { 42, -9 },
895 { 49, -5 }, { 53, 0 }, { 64, 3 }, { 68, 10 },
896 { 66, 27 }, { 47, 57 }, { -5, 71 }, { 0, 24 },
897 { -1, 36 }, { -2, 42 }, { -2, 52 }, { -9, 57 },
898 { -6, 63 }, { -4, 65 }, { -4, 67 }, { -7, 82 },
899 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
900 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
901 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
902 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
903 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
904 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
905 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
906 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
907 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
908 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
909 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
910 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
911 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
912 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
913 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
914 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
915 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
916 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
917 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
918 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
919 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
920 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
921 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
922 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
923 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
924 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
925 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
926 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
927 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
928 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
929 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
930 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
931 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
932 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
933 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
934 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
935 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
936 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
937 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
938 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
939 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
940 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
941 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
942 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
943 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
944 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
945 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
946 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
947 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
948 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
949 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
950 { -5, 74 }, { -9, 86 }, { -23, 112 }, { -15, 71 },
951 { -7, 61 }, { 0, 53 }, { -5, 66 }, { -11, 77 },
952 { -9, 80 }, { -9, 84 }, { -10, 87 }, { -34, 127 },
953 { -21, 101 }, { -3, 39 }, { -5, 53 }, { -7, 61 },
954 { -11, 75 }, { -15, 77 }, { -17, 91 }, { -25, 107 },
955 { -25, 111 }, { -28, 122 }, { -11, 76 }, { -10, 44 },
956 { -10, 52 }, { -10, 57 }, { -9, 58 }, { -16, 72 },
957 { -7, 69 }, { -4, 69 }, { -5, 74 }, { -9, 86 },
958 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
959 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
960 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 }
963 /* i_cabac_init_idc == 2 */
966 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
967 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
968 { -6, 53 }, { -1, 54 }, { 7, 51 },
971 { 29, 16 }, { 25, 0 }, { 14, 0 }, { -10, 51 },
972 { -3, 62 }, { -27, 99 }, { 26, 16 }, { -4, 85 },
973 { -24, 102 }, { 5, 57 }, { 6, 57 }, { -17, 73 },
977 { 20, 40 }, { 20, 10 }, { 29, 0 }, { 54, 0 },
978 { 37, 42 }, { 12, 97 }, { -32, 127 }, { -22, 117 },
979 { -2, 74 }, { -4, 85 }, { -24, 102 }, { 5, 57 },
980 { -6, 93 }, { -14, 88 }, { -6, 44 }, { 4, 55 },
983 { -11, 89 },{ -15, 103 },{ -21, 116 },{ 19, 57 },
984 { 20, 58 },{ 4, 84 },{ 6, 96 },{ 1, 63 },
985 { -5, 85 },{ -13, 106 },{ 5, 63 },{ 6, 75 },
986 { -3, 90 },{ -1, 101 },
989 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
990 { -7, 50 },{ 1, 60 },
993 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
994 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
995 { 13, 41 }, { 3, 62 },
998 { 7, 34 }, { -9, 88 }, { -20, 127 }, { -36, 127 },
999 { -17, 91 }, { -14, 95 }, { -25, 84 }, { -25, 86 },
1000 { -12, 89 }, { -17, 91 }, { -31, 127 }, { -14, 76 },
1001 { -18, 103 }, { -13, 90 }, { -37, 127 }, { 11, 80 },
1002 { 5, 76 }, { 2, 84 }, { 5, 78 }, { -6, 55 },
1003 { 4, 61 }, { -14, 83 }, { -37, 127 }, { -5, 79 },
1004 { -11, 104 }, { -11, 91 }, { -30, 127 }, { 0, 65 },
1005 { -2, 79 }, { 0, 72 }, { -4, 92 }, { -6, 56 },
1006 { 3, 68 }, { -8, 71 }, { -13, 98 },
1009 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1010 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1011 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1012 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1013 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1014 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1015 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1016 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1017 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1018 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1019 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1020 { 3, 65 }, { -7, 69 }, { 8, 77 }, { -10, 66 },
1021 { 3, 62 }, { -3, 68 }, { -20, 81 }, { 0, 30 },
1022 { 1, 7 }, { -3, 23 }, { -21, 74 }, { 16, 66 },
1023 { -23, 124 }, { 17, 37 }, { 44, -18 }, { 50, -34 },
1027 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1028 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1029 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1030 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1031 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1032 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1033 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1034 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1035 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1036 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1037 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1038 { 20, 34 }, { 19, 31 }, { 27, 44 }, { 19, 16 },
1039 { 15, 36 }, { 15, 36 }, { 21, 28 }, { 25, 21 },
1040 { 30, 20 }, { 31, 12 }, { 27, 16 }, { 24, 42 },
1041 { 0, 93 }, { 14, 56 }, { 15, 57 }, { 26, 38 },
1045 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1046 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1047 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1048 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1049 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1050 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1051 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1052 { -12, 92 }, { -18, 108 }, { -4, 79 }, { -22, 69 },
1053 { -16, 75 }, { -2, 58 }, { 1, 58 }, { -13, 78 },
1054 { -9, 83 }, { -4, 81 }, { -13, 99 }, { -13, 81 },
1055 { -6, 38 }, { -13, 62 }, { -6, 58 }, { -2, 59 },
1056 { -16, 73 }, { -10, 76 }, { -13, 86 }, { -9, 83 },
1059 /* 276 a bit special (not used, bypass is used instead) */
1063 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1064 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1065 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1066 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1067 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1068 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1069 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1070 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1071 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1072 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1073 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1074 { -2, 76 }, { -18, 86 }, { 12, 70 }, { 5, 64 },
1075 { -12, 70 }, { 11, 55 }, { 5, 56 }, { 0, 69 },
1076 { 2, 65 }, { -6, 74 }, { 5, 54 }, { 7, 54 },
1077 { -6, 76 }, { -11, 82 }, { -2, 77 }, { -2, 77 },
1081 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1082 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1083 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1084 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1085 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1086 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1087 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1088 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1089 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1090 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1091 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1092 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 },
1093 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 },
1094 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 },
1095 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 },
1099 { 21, 33 }, { 19, 50 }, { 17, 61 },
1100 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1101 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1102 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1103 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1104 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1105 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1106 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1107 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1108 { -6, 68 }, { -10, 79 },
1111 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1112 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1113 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1114 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1115 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1116 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1119 { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1120 { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1121 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1122 { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1123 { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1124 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1125 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1126 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1127 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1128 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1129 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1130 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1131 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1132 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1133 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1134 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1135 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1136 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1137 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1138 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1139 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1140 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1141 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1142 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1143 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1144 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1145 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1146 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1147 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1148 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1149 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1150 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1151 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1152 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1153 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1154 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1155 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1156 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1157 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1158 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1159 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1160 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1161 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1162 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1163 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1164 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1165 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1166 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1167 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1168 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1169 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1170 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1171 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1172 { -14, 59 }, { -9, 52 }, { -11, 68 }, { -3, 78 },
1173 { -8, 74 }, { -9, 72 }, { -10, 72 }, { -18, 75 },
1174 { -12, 71 }, { -11, 63 }, { -5, 70 }, { -17, 75 },
1175 { -14, 72 }, { -16, 67 }, { -8, 53 }, { -14, 59 },
1176 { -9, 52 }, { -11, 68 }, { 9, -2 }, { 30, -10 },
1177 { 31, -4 }, { 33, -1 }, { 33, 7 }, { 31, 12 },
1178 { 37, 23 }, { 31, 38 }, { 20, 64 }, { 9, -2 },
1179 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1180 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1181 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1182 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1183 { -6, 68 }, { -10, 79 }, { -3, 78 }, { -8, 74 },
1184 { -9, 72 }, { -10, 72 }, { -18, 75 }, { -12, 71 },
1185 { -11, 63 }, { -5, 70 }, { -17, 75 }, { -14, 72 },
1186 { -16, 67 }, { -8, 53 }, { -14, 59 }, { -9, 52 },
1187 { -11, 68 }, { -3, 78 }, { -8, 74 }, { -9, 72 },
1188 { -10, 72 }, { -18, 75 }, { -12, 71 }, { -11, 63 },
1189 { -5, 70 }, { -17, 75 }, { -14, 72 }, { -16, 67 },
1190 { -8, 53 }, { -14, 59 }, { -9, 52 }, { -11, 68 },
1191 { 9, -2 }, { 30, -10 }, { 31, -4 }, { 33, -1 },
1192 { 33, 7 }, { 31, 12 }, { 37, 23 }, { 31, 38 },
1193 { 20, 64 }, { 9, -2 }, { 30, -10 }, { 31, -4 },
1194 { 33, -1 }, { 33, 7 }, { 31, 12 }, { 37, 23 },
1195 { 31, 38 }, { 20, 64 }, { -9, 71 }, { -7, 37 },
1196 { -8, 44 }, { -11, 49 }, { -10, 56 }, { -12, 59 },
1197 { -8, 63 }, { -9, 67 }, { -6, 68 }, { -10, 79 },
1198 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1199 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1200 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1201 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1202 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1203 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1204 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1205 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1206 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1207 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1208 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1209 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1210 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1211 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1212 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1213 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1214 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1215 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1216 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1217 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1218 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1219 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1220 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1221 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1222 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1223 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1224 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1225 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1226 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1227 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1228 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1229 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1230 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1231 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1232 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1233 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1234 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1235 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1236 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1237 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1238 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1239 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1240 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1241 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1242 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1243 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1244 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1245 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1246 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1247 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1248 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1249 { -12, 92 }, { -18, 108 }, { -24, 115 }, { -22, 82 },
1250 { -9, 62 }, { 0, 53 }, { 0, 59 }, { -14, 85 },
1251 { -13, 89 }, { -13, 94 }, { -11, 92 }, { -29, 127 },
1252 { -21, 100 }, { -14, 57 }, { -12, 67 }, { -11, 71 },
1253 { -10, 77 }, { -21, 85 }, { -16, 88 }, { -23, 104 },
1254 { -15, 98 }, { -37, 127 }, { -10, 82 }, { -8, 48 },
1255 { -8, 61 }, { -8, 66 }, { -7, 70 }, { -14, 75 },
1256 { -10, 79 }, { -9, 83 }, { -12, 92 }, { -18, 108 },
1257 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1258 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1259 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 }
1263 void ff_h264_init_cabac_states(H264Context *h) {
1264 MpegEncContext * const s = &h->s;
1266 const int8_t (*tab)[2];
1267 const int slice_qp = av_clip(s->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
1269 if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I;
1270 else tab = cabac_context_init_PB[h->cabac_init_idc];
1272 /* calculate pre-state */
1273 for( i= 0; i < 1024; i++ ) {
1274 int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1280 h->cabac_state[i] = pre;
1284 static int decode_cabac_field_decoding_flag(H264Context *h) {
1285 MpegEncContext * const s = &h->s;
1286 const long mbb_xy = h->mb_xy - 2L*s->mb_stride;
1288 unsigned long ctx = 0;
1290 ctx += h->mb_field_decoding_flag & !!s->mb_x; //for FMO:(s->current_picture.f.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
1291 ctx += (s->current_picture.f.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
1293 return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
1296 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
1297 uint8_t *state= &h->cabac_state[ctx_base];
1302 if( h->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1304 if( h->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1306 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
1307 return 0; /* I4x4 */
1310 if( get_cabac_noinline( &h->cabac, state ) == 0 )
1311 return 0; /* I4x4 */
1314 if( get_cabac_terminate( &h->cabac ) )
1315 return 25; /* PCM */
1317 mb_type = 1; /* I16x16 */
1318 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
1319 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
1320 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
1321 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
1322 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
1326 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
1327 MpegEncContext * const s = &h->s;
1331 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
1332 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride;
1335 && h->slice_table[mba_xy] == h->slice_num
1336 && MB_FIELD == !!IS_INTERLACED( s->current_picture.f.mb_type[mba_xy] ) )
1337 mba_xy += s->mb_stride;
1339 mbb_xy = mb_xy - s->mb_stride;
1341 && h->slice_table[mbb_xy] == h->slice_num
1342 && IS_INTERLACED( s->current_picture.f.mb_type[mbb_xy] ) )
1343 mbb_xy -= s->mb_stride;
1345 mbb_xy = mb_x + (mb_y-1)*s->mb_stride;
1347 int mb_xy = h->mb_xy;
1349 mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE);
1352 if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mba_xy] ))
1354 if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.f.mb_type[mbb_xy] ))
1357 if( h->slice_type_nos == AV_PICTURE_TYPE_B )
1359 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
1362 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
1365 if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
1368 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
1369 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
1370 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
1372 return mode + ( mode >= pred_mode );
1375 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
1376 const int mba_xy = h->left_mb_xy[0];
1377 const int mbb_xy = h->top_mb_xy;
1381 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1382 if( h->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0 )
1385 if( h->top_type && h->chroma_pred_mode_table[mbb_xy] != 0 )
1388 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
1391 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1393 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1399 static int decode_cabac_mb_cbp_luma( H264Context *h) {
1400 int cbp_b, cbp_a, ctx, cbp = 0;
1402 cbp_a = h->left_cbp;
1405 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1406 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
1407 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1408 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
1409 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1410 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
1411 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1412 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
1415 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
1419 cbp_a = (h->left_cbp>>4)&0x03;
1420 cbp_b = (h-> top_cbp>>4)&0x03;
1423 if( cbp_a > 0 ) ctx++;
1424 if( cbp_b > 0 ) ctx += 2;
1425 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
1429 if( cbp_a == 2 ) ctx++;
1430 if( cbp_b == 2 ) ctx += 2;
1431 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
1434 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
1435 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
1437 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
1439 if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
1443 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
1445 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
1446 return 0; /* B_Direct_8x8 */
1447 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
1448 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1450 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
1451 if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
1452 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1455 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
1456 type += get_cabac( &h->cabac, &h->cabac_state[39] );
1460 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
1461 int refa = h->ref_cache[list][scan8[n] - 1];
1462 int refb = h->ref_cache[list][scan8[n] - 8];
1466 if( h->slice_type_nos == AV_PICTURE_TYPE_B) {
1467 if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1469 if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1478 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
1481 if(ref >= 32 /*h->ref_list[list]*/){
1488 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
1491 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1492 // if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1499 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
1507 while( get_cabac_bypass( &h->cabac ) ) {
1511 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1516 mvd += get_cabac_bypass( &h->cabac )<<k;
1518 *mvda=mvd < 70 ? mvd : 70;
1521 return get_cabac_bypass_sign( &h->cabac, -mvd );
1524 #define DECODE_CABAC_MB_MVD( h, list, n )\
1526 int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
1527 h->mvd_cache[list][scan8[n] - 8][0];\
1528 int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
1529 h->mvd_cache[list][scan8[n] - 8][1];\
1531 mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
1532 my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
1535 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int max_coeff, int is_dc ) {
1538 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1542 idx -= CHROMA_DC_BLOCK_INDEX;
1543 nza = (h->left_cbp>>(6+idx))&0x01;
1544 nzb = (h-> top_cbp>>(6+idx))&0x01;
1546 idx -= LUMA_DC_BLOCK_INDEX;
1547 nza = h->left_cbp&(0x100<<idx);
1548 nzb = h-> top_cbp&(0x100<<idx);
1551 nza = h->non_zero_count_cache[scan8[idx] - 1];
1552 nzb = h->non_zero_count_cache[scan8[idx] - 8];
1561 return base_ctx[cat] + ctx;
1564 static av_always_inline void
1565 decode_cabac_residual_internal(H264Context *h, DCTELEM *block,
1566 int cat, int n, const uint8_t *scantable,
1567 const uint32_t *qmul, int max_coeff,
1568 int is_dc, int chroma422)
1570 static const int significant_coeff_flag_offset[2][14] = {
1571 { 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 },
1572 { 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 }
1574 static const int last_coeff_flag_offset[2][14] = {
1575 { 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 },
1576 { 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 }
1578 static const int coeff_abs_level_m1_offset[14] = {
1579 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
1581 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1582 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1583 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1584 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1585 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1586 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1587 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1588 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1589 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1591 static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1592 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1593 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1594 * map node ctx => cabac ctx for level=1 */
1595 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1596 /* map node ctx => cabac ctx for level>1 */
1597 static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1598 { 5, 5, 5, 5, 6, 7, 8, 9 },
1599 { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1601 static const uint8_t coeff_abs_level_transition[2][8] = {
1602 /* update node ctx after decoding a level=1 */
1603 { 1, 2, 3, 3, 4, 5, 6, 7 },
1604 /* update node ctx after decoding a level>1 */
1605 { 4, 4, 4, 4, 5, 6, 7, 7 }
1611 int coeff_count = 0;
1614 uint8_t *significant_coeff_ctx_base;
1615 uint8_t *last_coeff_ctx_base;
1616 uint8_t *abs_level_m1_ctx_base;
1619 #define CABAC_ON_STACK
1621 #ifdef CABAC_ON_STACK
1624 cc.range = h->cabac.range;
1625 cc.low = h->cabac.low;
1626 cc.bytestream= h->cabac.bytestream;
1628 #define CC &h->cabac
1631 significant_coeff_ctx_base = h->cabac_state
1632 + significant_coeff_flag_offset[MB_FIELD][cat];
1633 last_coeff_ctx_base = h->cabac_state
1634 + last_coeff_flag_offset[MB_FIELD][cat];
1635 abs_level_m1_ctx_base = h->cabac_state
1636 + coeff_abs_level_m1_offset[cat];
1638 if( !is_dc && max_coeff == 64 ) {
1639 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1640 for(last= 0; last < coefs; last++) { \
1641 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1642 if( get_cabac( CC, sig_ctx )) { \
1643 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1644 index[coeff_count++] = last; \
1645 if( get_cabac( CC, last_ctx ) ) { \
1651 if( last == max_coeff -1 ) {\
1652 index[coeff_count++] = last;\
1654 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
1655 #if ARCH_X86 && HAVE_7REGS
1656 coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index,
1657 last_coeff_ctx_base, sig_off);
1659 if (is_dc && chroma422) { // dc 422
1660 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1662 coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index,
1663 last_coeff_ctx_base-significant_coeff_ctx_base);
1666 DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1668 if (is_dc && chroma422) { // dc 422
1669 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1671 DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1675 assert(coeff_count > 0);
1679 h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1681 h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1682 h->non_zero_count_cache[scan8[n]] = coeff_count;
1684 if( max_coeff == 64 )
1685 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1687 assert( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1688 h->non_zero_count_cache[scan8[n]] = coeff_count;
1693 #define STORE_BLOCK(type) \
1695 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1697 int j= scantable[index[--coeff_count]]; \
1699 if( get_cabac( CC, ctx ) == 0 ) { \
1700 node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1702 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1704 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1707 int coeff_abs = 2; \
1708 ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1709 node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1711 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1715 if( coeff_abs >= 15 ) { \
1717 while( get_cabac_bypass( CC ) ) { \
1723 coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1729 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1731 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1734 } while ( coeff_count );
1736 if (h->pixel_shift) {
1737 STORE_BLOCK(int32_t)
1739 STORE_BLOCK(int16_t)
1741 #ifdef CABAC_ON_STACK
1742 h->cabac.range = cc.range ;
1743 h->cabac.low = cc.low ;
1744 h->cabac.bytestream= cc.bytestream;
1749 static void decode_cabac_residual_dc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
1750 decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1753 static void decode_cabac_residual_dc_internal_422(H264Context *h, DCTELEM *block,
1754 int cat, int n, const uint8_t *scantable,
1757 decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1760 static void decode_cabac_residual_nondc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
1761 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1764 /* cat: 0-> DC 16x16 n = 0
1765 * 1-> AC 16x16 n = luma4x4idx
1766 * 2-> Luma4x4 n = luma4x4idx
1767 * 3-> DC Chroma n = iCbCr
1768 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1769 * 5-> Luma8x8 n = 4 * luma8x8idx */
1771 /* Partially inline the CABAC residual decode: inline the coded block flag.
1772 * This has very little impact on binary size and improves performance
1773 * because it allows improved constant propagation into get_cabac_cbf_ctx,
1774 * as well as because most blocks have zero CBFs. */
1776 static av_always_inline void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
1777 /* read coded block flag */
1778 if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 1 ) ] ) == 0 ) {
1779 h->non_zero_count_cache[scan8[n]] = 0;
1782 decode_cabac_residual_dc_internal( h, block, cat, n, scantable, max_coeff );
1785 static av_always_inline void
1786 decode_cabac_residual_dc_422(H264Context *h, DCTELEM *block,
1787 int cat, int n, 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_422(h, block, cat, n, scantable, max_coeff);
1798 static av_always_inline void decode_cabac_residual_nondc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
1799 /* read coded block flag */
1800 if( (cat != 5 || CHROMA444) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 0 ) ] ) == 0 ) {
1801 if( max_coeff == 64 ) {
1802 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1804 h->non_zero_count_cache[scan8[n]] = 0;
1808 decode_cabac_residual_nondc_internal( h, block, cat, n, scantable, qmul, max_coeff );
1811 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 )
1813 static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1814 const uint32_t *qmul;
1816 MpegEncContext * const s = &h->s;
1817 int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
1818 if( IS_INTRA16x16( mb_type ) ) {
1819 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
1820 AV_ZERO128(h->mb_luma_dc[p]+0);
1821 AV_ZERO128(h->mb_luma_dc[p]+8);
1822 AV_ZERO128(h->mb_luma_dc[p]+16);
1823 AV_ZERO128(h->mb_luma_dc[p]+24);
1824 decode_cabac_residual_dc(h, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1827 qmul = h->dequant4_coeff[p][qscale];
1828 for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1829 const int index = 16*p + i4x4;
1830 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", index );
1831 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1834 fill_rectangle(&h->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1837 int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1838 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1839 if( cbp & (1<<i8x8) ) {
1840 if( IS_8x8DCT(mb_type) ) {
1841 const int index = 16*p + 4*i8x8;
1842 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1843 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1845 qmul = h->dequant4_coeff[cqm][qscale];
1846 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1847 const int index = 16*p + 4*i8x8 + i4x4;
1848 //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
1850 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1851 //STOP_TIMER("decode_residual")
1855 fill_rectangle(&h->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1862 * Decode a macroblock.
1863 * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1865 int ff_h264_decode_mb_cabac(H264Context *h) {
1866 MpegEncContext * const s = &h->s;
1868 int mb_type, partition_count, cbp = 0;
1869 int dct8x8_allowed= h->pps.transform_8x8_mode;
1870 int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1871 const int pixel_shift = h->pixel_shift;
1873 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1875 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
1876 if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
1878 /* a skipped mb needs the aff flag from the following mb */
1879 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
1880 skip = h->next_mb_skipped;
1882 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
1883 /* read skip flags */
1885 if( FRAME_MBAFF && (s->mb_y&1)==0 ){
1886 s->current_picture.f.mb_type[mb_xy] = MB_TYPE_SKIP;
1887 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
1888 if(!h->next_mb_skipped)
1889 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1894 h->cbp_table[mb_xy] = 0;
1895 h->chroma_pred_mode_table[mb_xy] = 0;
1896 h->last_qscale_diff = 0;
1903 if( (s->mb_y&1) == 0 )
1905 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1908 h->prev_mb_skipped = 0;
1910 fill_decode_neighbors(h, -(MB_FIELD));
1912 if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
1914 assert(h->slice_type_nos == AV_PICTURE_TYPE_B);
1916 if( !IS_DIRECT( h->left_type[LTOP]-1 ) )
1918 if( !IS_DIRECT( h->top_type-1 ) )
1921 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1922 mb_type= 0; /* B_Direct_16x16 */
1923 }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1924 mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1927 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1928 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1929 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1930 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1932 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1933 }else if( bits == 13 ){
1934 mb_type= decode_cabac_intra_mb_type(h, 32, 0);
1935 goto decode_intra_mb;
1936 }else if( bits == 14 ){
1937 mb_type= 11; /* B_L1_L0_8x16 */
1938 }else if( bits == 15 ){
1939 mb_type= 22; /* B_8x8 */
1941 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1942 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1945 partition_count= b_mb_type_info[mb_type].partition_count;
1946 mb_type= b_mb_type_info[mb_type].type;
1947 } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
1948 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1950 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1951 /* P_L0_D16x16, P_8x8 */
1952 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1954 /* P_L0_D8x16, P_L0_D16x8 */
1955 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1957 partition_count= p_mb_type_info[mb_type].partition_count;
1958 mb_type= p_mb_type_info[mb_type].type;
1960 mb_type= decode_cabac_intra_mb_type(h, 17, 0);
1961 goto decode_intra_mb;
1964 mb_type= decode_cabac_intra_mb_type(h, 3, 1);
1965 if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
1967 assert(h->slice_type_nos == AV_PICTURE_TYPE_I);
1969 partition_count = 0;
1970 cbp= i_mb_type_info[mb_type].cbp;
1971 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
1972 mb_type= i_mb_type_info[mb_type].type;
1975 mb_type |= MB_TYPE_INTERLACED;
1977 h->slice_table[ mb_xy ]= h->slice_num;
1979 if(IS_INTRA_PCM(mb_type)) {
1980 const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
1981 h->sps.bit_depth_luma >> 3;
1984 // We assume these blocks are very rare so we do not optimize it.
1985 // FIXME The two following lines get the bitstream position in the cabac
1986 // decode, I think it should be done by a function in cabac.h (or cabac.c).
1987 ptr= h->cabac.bytestream;
1988 if(h->cabac.low&0x1) ptr--;
1990 if(h->cabac.low&0x1FF) ptr--;
1993 // The pixels are stored in the same order as levels in h->mb array.
1994 if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
1996 memcpy(h->mb, ptr, mb_size); ptr+=mb_size;
1998 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
2000 // All blocks are present
2001 h->cbp_table[mb_xy] = 0xf7ef;
2002 h->chroma_pred_mode_table[mb_xy] = 0;
2003 // In deblocking, the quantizer is 0
2004 s->current_picture.f.qscale_table[mb_xy] = 0;
2005 // All coeffs are present
2006 memset(h->non_zero_count[mb_xy], 16, 48);
2007 s->current_picture.f.mb_type[mb_xy] = mb_type;
2008 h->last_qscale_diff = 0;
2013 h->ref_count[0] <<= 1;
2014 h->ref_count[1] <<= 1;
2017 fill_decode_caches(h, mb_type);
2019 if( IS_INTRA( mb_type ) ) {
2021 if( IS_INTRA4x4( mb_type ) ) {
2022 if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
2023 mb_type |= MB_TYPE_8x8DCT;
2024 for( i = 0; i < 16; i+=4 ) {
2025 int pred = pred_intra_mode( h, i );
2026 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2027 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
2030 for( i = 0; i < 16; i++ ) {
2031 int pred = pred_intra_mode( h, i );
2032 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2034 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
2037 write_back_intra_pred_mode(h);
2038 if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
2040 h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
2041 if( h->intra16x16_pred_mode < 0 ) return -1;
2044 h->chroma_pred_mode_table[mb_xy] =
2045 pred_mode = decode_cabac_mb_chroma_pre_mode( h );
2047 pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
2048 if( pred_mode < 0 ) return -1;
2049 h->chroma_pred_mode= pred_mode;
2051 h->chroma_pred_mode= DC_128_PRED8x8;
2053 } else if( partition_count == 4 ) {
2054 int i, j, sub_partition_count[4], list, ref[2][4];
2056 if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
2057 for( i = 0; i < 4; i++ ) {
2058 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
2059 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2060 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2062 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
2063 h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
2064 ff_h264_pred_direct_motion(h, &mb_type);
2065 h->ref_cache[0][scan8[4]] =
2066 h->ref_cache[1][scan8[4]] =
2067 h->ref_cache[0][scan8[12]] =
2068 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2069 for( i = 0; i < 4; i++ )
2070 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
2073 for( i = 0; i < 4; i++ ) {
2074 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
2075 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2076 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2080 for( list = 0; list < h->list_count; list++ ) {
2081 for( i = 0; i < 4; i++ ) {
2082 if(IS_DIRECT(h->sub_mb_type[i])) continue;
2083 if(IS_DIR(h->sub_mb_type[i], 0, list)){
2084 if( h->ref_count[list] > 1 ){
2085 ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
2086 if(ref[list][i] >= (unsigned)h->ref_count[list]){
2087 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], h->ref_count[list]);
2095 h->ref_cache[list][ scan8[4*i]+1 ]=
2096 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
2101 dct8x8_allowed = get_dct8x8_allowed(h);
2103 for(list=0; list<h->list_count; list++){
2105 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ];
2106 if(IS_DIRECT(h->sub_mb_type[i])){
2107 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2111 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
2112 const int sub_mb_type= h->sub_mb_type[i];
2113 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2114 for(j=0; j<sub_partition_count[i]; j++){
2117 const int index= 4*i + block_width*j;
2118 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
2119 uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2120 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
2121 DECODE_CABAC_MB_MVD( h, list, index)
2122 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2124 if(IS_SUB_8X8(sub_mb_type)){
2126 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2128 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2131 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2133 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2134 }else if(IS_SUB_8X4(sub_mb_type)){
2135 mv_cache[ 1 ][0]= mx;
2136 mv_cache[ 1 ][1]= my;
2138 mvd_cache[ 1 ][0]= mpx;
2139 mvd_cache[ 1 ][1]= mpy;
2140 }else if(IS_SUB_4X8(sub_mb_type)){
2141 mv_cache[ 8 ][0]= mx;
2142 mv_cache[ 8 ][1]= my;
2144 mvd_cache[ 8 ][0]= mpx;
2145 mvd_cache[ 8 ][1]= mpy;
2147 mv_cache[ 0 ][0]= mx;
2148 mv_cache[ 0 ][1]= my;
2150 mvd_cache[ 0 ][0]= mpx;
2151 mvd_cache[ 0 ][1]= mpy;
2154 fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2155 fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2159 } else if( IS_DIRECT(mb_type) ) {
2160 ff_h264_pred_direct_motion(h, &mb_type);
2161 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2162 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2163 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2166 if(IS_16X16(mb_type)){
2167 for(list=0; list<h->list_count; list++){
2168 if(IS_DIR(mb_type, 0, list)){
2170 if(h->ref_count[list] > 1){
2171 ref= decode_cabac_mb_ref(h, list, 0);
2172 if(ref >= (unsigned)h->ref_count[list]){
2173 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
2178 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2181 for(list=0; list<h->list_count; list++){
2182 if(IS_DIR(mb_type, 0, list)){
2184 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
2185 DECODE_CABAC_MB_MVD( h, list, 0)
2186 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2188 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2189 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2193 else if(IS_16X8(mb_type)){
2194 for(list=0; list<h->list_count; list++){
2196 if(IS_DIR(mb_type, i, list)){
2198 if(h->ref_count[list] > 1){
2199 ref= decode_cabac_mb_ref( h, list, 8*i );
2200 if(ref >= (unsigned)h->ref_count[list]){
2201 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
2206 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2208 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2211 for(list=0; list<h->list_count; list++){
2213 if(IS_DIR(mb_type, i, list)){
2215 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2216 DECODE_CABAC_MB_MVD( h, list, 8*i)
2217 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2219 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2220 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2222 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2223 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2228 assert(IS_8X16(mb_type));
2229 for(list=0; list<h->list_count; list++){
2231 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2233 if(h->ref_count[list] > 1){
2234 ref= decode_cabac_mb_ref( h, list, 4*i );
2235 if(ref >= (unsigned)h->ref_count[list]){
2236 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
2241 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2243 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2246 for(list=0; list<h->list_count; list++){
2248 if(IS_DIR(mb_type, i, list)){
2250 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2251 DECODE_CABAC_MB_MVD( h, list, 4*i)
2253 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2254 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2255 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2257 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2258 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2265 if( IS_INTER( mb_type ) ) {
2266 h->chroma_pred_mode_table[mb_xy] = 0;
2267 write_back_motion( h, mb_type );
2270 if( !IS_INTRA16x16( mb_type ) ) {
2271 cbp = decode_cabac_mb_cbp_luma( h );
2273 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2276 h->cbp_table[mb_xy] = h->cbp = cbp;
2278 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2279 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
2282 /* It would be better to do this in fill_decode_caches, but we don't know
2283 * the transform mode of the current macroblock there. */
2284 if (CHROMA444 && IS_8x8DCT(mb_type)){
2286 uint8_t *nnz_cache = h->non_zero_count_cache;
2287 for (i = 0; i < 2; i++){
2288 if (h->left_type[LEFT(i)] && !IS_8x8DCT(h->left_type[LEFT(i)])){
2289 nnz_cache[3+8* 1 + 2*8*i]=
2290 nnz_cache[3+8* 2 + 2*8*i]=
2291 nnz_cache[3+8* 6 + 2*8*i]=
2292 nnz_cache[3+8* 7 + 2*8*i]=
2293 nnz_cache[3+8*11 + 2*8*i]=
2294 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2297 if (h->top_type && !IS_8x8DCT(h->top_type)){
2298 uint32_t top_empty = CABAC && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2299 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2300 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2301 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2304 s->current_picture.f.mb_type[mb_xy] = mb_type;
2306 if( cbp || IS_INTRA16x16( mb_type ) ) {
2307 const uint8_t *scan, *scan8x8;
2308 const uint32_t *qmul;
2310 if(IS_INTERLACED(mb_type)){
2311 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2312 scan= s->qscale ? h->field_scan : h->field_scan_q0;
2314 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2315 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2318 // decode_cabac_mb_dqp
2319 if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2322 const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2324 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2327 if(val > 2*max_qp){ //prevent infinite loop
2328 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
2336 val= -((val + 1)>>1);
2337 h->last_qscale_diff = val;
2339 if(((unsigned)s->qscale) > max_qp){
2340 if(s->qscale<0) s->qscale+= max_qp+1;
2341 else s->qscale-= max_qp+1;
2343 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
2344 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
2346 h->last_qscale_diff=0;
2348 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2350 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2351 decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2352 } else if (CHROMA422) {
2355 for( c = 0; c < 2; c++ ) {
2356 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
2357 decode_cabac_residual_dc_422(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2358 CHROMA_DC_BLOCK_INDEX + c,
2359 chroma422_dc_scan, 8);
2365 for( c = 0; c < 2; c++ ) {
2366 DCTELEM *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2367 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2368 for (i8x8 = 0; i8x8 < 2; i8x8++) {
2369 for (i = 0; i < 4; i++) {
2370 const int index = 16 + 16 * c + 8*i8x8 + i;
2371 //av_log(s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16);
2372 decode_cabac_residual_nondc(h, mb, 4, index, scan + 1, qmul, 15);
2373 mb += 16<<pixel_shift;
2378 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2379 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2381 } else /* yuv420 */ {
2384 for( c = 0; c < 2; c++ ) {
2385 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
2386 decode_cabac_residual_dc(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2392 for( c = 0; c < 2; c++ ) {
2393 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2394 for( i = 0; i < 4; i++ ) {
2395 const int index = 16 + 16 * c + i;
2396 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
2397 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2401 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2402 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2406 fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2407 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2408 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2409 h->last_qscale_diff = 0;
2412 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2413 write_back_non_zero_count(h);
2416 h->ref_count[0] >>= 1;
2417 h->ref_count[1] >>= 1;