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
30 #define INT_BIT (CHAR_BIT * sizeof(int))
32 #include "libavutil/attributes.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/timer.h"
37 #include "cabac_functions.h"
42 #include "h264_mvpred.h"
44 #include "mpegutils.h"
47 #include "x86/h264_i386.h"
50 /* Cabac pre state table */
52 static const int8_t cabac_context_init_I[1024][2] =
55 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
56 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 },
57 { -6, 53 }, { -1, 54 }, { 7, 51 },
59 /* 11 - 23 unsused for I */
60 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
61 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
62 { 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 },
69 { 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 },
74 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
78 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
82 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
83 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
84 { 13, 41 }, { 3, 62 },
87 { 0, 11 }, { 1, 55 }, { 0, 69 }, { -17, 127 },
88 { -13, 102 },{ 0, 82 }, { -7, 74 }, { -21, 107 },
89 { -27, 127 },{ -31, 127 },{ -24, 127 }, { -18, 95 },
90 { -27, 127 },{ -21, 114 },{ -30, 127 }, { -17, 123 },
91 { -12, 115 },{ -16, 122 },
94 { -11, 115 },{ -12, 63 }, { -2, 68 }, { -15, 84 },
95 { -13, 104 },{ -3, 70 }, { -8, 93 }, { -10, 90 },
96 { -30, 127 },{ -1, 74 }, { -6, 97 }, { -7, 91 },
97 { -20, 127 },{ -4, 56 }, { -5, 82 }, { -7, 76 },
101 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
102 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
103 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
104 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
105 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
106 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
107 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
108 { 14, 62 }, { -13, 108 },{ -15, 100 },
111 { -13, 101 },{ -13, 91 }, { -12, 94 }, { -10, 88 },
112 { -16, 84 }, { -10, 86 }, { -7, 83 }, { -13, 87 },
113 { -19, 94 }, { 1, 70 }, { 0, 72 }, { -5, 74 },
114 { 18, 59 }, { -8, 102 }, { -15, 100 }, { 0, 95 },
115 { -4, 75 }, { 2, 72 }, { -11, 75 }, { -3, 71 },
116 { 15, 46 }, { -13, 69 }, { 0, 62 }, { 0, 65 },
117 { 21, 37 }, { -15, 72 }, { 9, 57 }, { 16, 54 },
118 { 0, 62 }, { 12, 72 },
121 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
122 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
123 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
124 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
125 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
126 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
127 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
128 { 0, 89 }, { 26, -19 }, { 22, -17 },
131 { 26, -17 }, { 30, -25 }, { 28, -20 }, { 33, -23 },
132 { 37, -27 }, { 33, -23 }, { 40, -28 }, { 38, -17 },
133 { 33, -11 }, { 40, -15 }, { 41, -6 }, { 38, 1 },
134 { 41, 17 }, { 30, -6 }, { 27, 3 }, { 26, 22 },
135 { 37, -16 }, { 35, -4 }, { 38, -8 }, { 38, -3 },
136 { 37, 3 }, { 38, 5 }, { 42, 0 }, { 35, 16 },
137 { 39, 22 }, { 14, 48 }, { 27, 37 }, { 21, 60 },
138 { 12, 68 }, { 2, 97 },
141 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
142 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
143 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
144 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
145 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
146 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
150 { -12, 73 }, { -8, 76 }, { -7, 80 }, { -9, 88 },
151 { -17, 110 },{ -11, 97 }, { -20, 84 }, { -11, 79 },
152 { -6, 73 }, { -4, 74 }, { -13, 86 }, { -13, 96 },
153 { -11, 97 }, { -19, 117 },{ -8, 78 }, { -5, 33 },
154 { -4, 48 }, { -2, 53 }, { -3, 62 }, { -13, 71 },
155 { -10, 79 }, { -12, 86 }, { -13, 90 }, { -14, 97 },
157 /* 276 a bit special (not used, bypass is used instead) */
161 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
162 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
163 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
164 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
165 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
166 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
167 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
168 { 9, 64 }, { -12, 104 },{ -11, 97 },
171 { -16, 96 }, { -7, 88 }, { -8, 85 }, { -7, 85 },
172 { -9, 85 }, { -13, 88 }, { 4, 66 }, { -3, 77 },
173 { -3, 76 }, { -6, 76 }, { 10, 58 }, { -1, 76 },
174 { -1, 83 }, { -7, 99 }, { -14, 95 }, { 2, 95 },
175 { 0, 76 }, { -5, 74 }, { 0, 70 }, { -11, 75 },
176 { 1, 68 }, { 0, 65 }, { -14, 73 }, { 3, 62 },
177 { 4, 62 }, { -1, 68 }, { -13, 75 }, { 11, 55 },
178 { 5, 64 }, { 12, 70 },
181 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
182 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
183 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
184 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
185 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
186 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
187 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
188 { -12, 109 },{ 36, -35 }, { 36, -34 },
191 { 32, -26 }, { 37, -30 }, { 44, -32 }, { 34, -18 },
192 { 34, -15 }, { 40, -15 }, { 33, -7 }, { 35, -5 },
193 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 },
194 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 },
195 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 },
196 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 },
197 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 },
198 { 29, 39 }, { 19, 66 },
201 { 31, 21 }, { 31, 31 }, { 25, 50 },
202 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
203 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
204 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
205 { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 },
206 { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 },
207 { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 },
208 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
209 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
210 { 0, 68 }, { -9, 92 },
213 { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 },
214 { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 },
215 { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 },
216 { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 },
217 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
218 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
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 { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
225 { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
226 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
227 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
228 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
229 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
230 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
231 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
232 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
233 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
234 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
235 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
236 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
237 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
238 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
239 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
240 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
241 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
242 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
243 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
244 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
245 { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
246 { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
247 { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
248 { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
249 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
250 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
251 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
252 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
253 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
254 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
255 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
256 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
257 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
258 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
259 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
260 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
261 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
262 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
263 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
264 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
265 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
266 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
267 { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
268 { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
269 { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
270 { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
271 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
272 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
273 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
274 { -23, 68 }, { -24, 50 }, { -11, 74 }, { -14, 106 },
275 { -13, 97 }, { -15, 90 }, { -12, 90 }, { -18, 88 },
276 { -10, 73 }, { -9, 79 }, { -14, 86 }, { -10, 73 },
277 { -10, 70 }, { -10, 69 }, { -5, 66 }, { -9, 64 },
278 { -5, 58 }, { 2, 59 }, { 23, -13 }, { 26, -13 },
279 { 40, -15 }, { 49, -14 }, { 44, 3 }, { 45, 6 },
280 { 44, 34 }, { 33, 54 }, { 19, 82 }, { 21, -10 },
281 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
282 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
283 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
284 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
285 { 0, 68 }, { -9, 92 }, { -17, 120 }, { -20, 112 },
286 { -18, 114 }, { -11, 85 }, { -15, 92 }, { -14, 89 },
287 { -26, 71 }, { -15, 81 }, { -14, 80 }, { 0, 68 },
288 { -14, 70 }, { -24, 56 }, { -23, 68 }, { -24, 50 },
289 { -11, 74 }, { -14, 106 }, { -13, 97 }, { -15, 90 },
290 { -12, 90 }, { -18, 88 }, { -10, 73 }, { -9, 79 },
291 { -14, 86 }, { -10, 73 }, { -10, 70 }, { -10, 69 },
292 { -5, 66 }, { -9, 64 }, { -5, 58 }, { 2, 59 },
293 { 23, -13 }, { 26, -13 }, { 40, -15 }, { 49, -14 },
294 { 44, 3 }, { 45, 6 }, { 44, 34 }, { 33, 54 },
295 { 19, 82 }, { 21, -10 }, { 24, -11 }, { 28, -8 },
296 { 28, -1 }, { 29, 3 }, { 29, 9 }, { 35, 20 },
297 { 29, 36 }, { 14, 67 }, { -3, 75 }, { -1, 23 },
298 { 1, 34 }, { 1, 43 }, { 0, 54 }, { -2, 55 },
299 { 0, 61 }, { 1, 64 }, { 0, 68 }, { -9, 92 },
300 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
301 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
302 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
303 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
304 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
305 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
306 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
307 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
308 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
309 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
310 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
311 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
312 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
313 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
314 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
315 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
316 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
317 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
318 { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
319 { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
320 { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
321 { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
322 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
323 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
324 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
325 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
326 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
327 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
328 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
329 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
330 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
331 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
332 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
333 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
334 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
335 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
336 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
337 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
338 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
339 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
340 { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
341 { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
342 { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
343 { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
344 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
345 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
346 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
347 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
348 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
349 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
350 { -4, 65 }, { -12, 73 }, { -8, 76 }, { -7, 80 },
351 { -9, 88 }, { -17, 110 }, { -3, 71 }, { -6, 42 },
352 { -5, 50 }, { -3, 54 }, { -2, 62 }, { 0, 58 },
353 { 1, 63 }, { -2, 72 }, { -1, 74 }, { -9, 91 },
354 { -5, 67 }, { -5, 27 }, { -3, 39 }, { -2, 44 },
355 { 0, 46 }, { -16, 64 }, { -8, 68 }, { -10, 78 },
356 { -6, 77 }, { -10, 86 }, { -12, 92 }, { -15, 55 },
357 { -10, 60 }, { -6, 62 }, { -4, 65 }, { -12, 73 },
358 { -8, 76 }, { -7, 80 }, { -9, 88 }, { -17, 110 },
359 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
360 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
361 { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 }
364 static const int8_t cabac_context_init_PB[3][1024][2] =
366 /* i_cabac_init_idc == 0 */
369 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
370 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
371 { -6, 53 }, { -1, 54 }, { 7, 51 },
374 { 23, 33 }, { 23, 2 }, { 21, 0 }, { 1, 9 },
375 { 0, 49 }, { -37, 118 }, { 5, 57 }, { -13, 78 },
376 { -11, 65 }, { 1, 62 }, { 12, 49 }, { -4, 73 },
380 { 18, 64 }, { 9, 43 }, { 29, 0 }, { 26, 67 },
381 { 16, 90 }, { 9, 104 }, { -46, 127 }, { -20, 104 },
382 { 1, 67 }, { -13, 78 }, { -11, 65 }, { 1, 62 },
383 { -6, 86 }, { -17, 95 }, { -6, 61 }, { 9, 45 },
386 { -3, 69 }, { -6, 81 }, { -11, 96 }, { 6, 55 },
387 { 7, 67 }, { -5, 86 }, { 2, 88 }, { 0, 58 },
388 { -3, 76 }, { -10, 94 }, { 5, 54 }, { 4, 69 },
389 { -3, 81 }, { 0, 88 },
392 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
393 { -7, 72 }, { 1, 58 },
396 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
397 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
398 { 13, 41 }, { 3, 62 },
401 { 0, 45 }, { -4, 78 }, { -3, 96 }, { -27, 126 },
402 { -28, 98 }, { -25, 101 }, { -23, 67 }, { -28, 82 },
403 { -20, 94 }, { -16, 83 }, { -22, 110 }, { -21, 91 },
404 { -18, 102 }, { -13, 93 }, { -29, 127 }, { -7, 92 },
405 { -5, 89 }, { -7, 96 }, { -13, 108 }, { -3, 46 },
406 { -1, 65 }, { -1, 57 }, { -9, 93 }, { -3, 74 },
407 { -9, 92 }, { -8, 87 }, { -23, 126 }, { 5, 54 },
408 { 6, 60 }, { 6, 59 }, { 6, 69 }, { -1, 48 },
409 { 0, 68 }, { -4, 69 }, { -8, 88 },
412 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
413 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
414 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
415 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
416 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
417 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
418 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
419 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
420 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
421 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
422 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
423 { 3, 64 }, { 1, 61 }, { 9, 63 }, { 7, 50 },
424 { 16, 39 }, { 5, 44 }, { 4, 52 }, { 11, 48 },
425 { -5, 60 }, { -1, 59 }, { 0, 59 }, { 22, 33 },
426 { 5, 44 }, { 14, 43 }, { -1, 78 }, { 0, 60 },
430 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
431 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
432 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
433 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
434 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
435 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
436 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
437 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
438 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
439 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
440 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
441 { 1, 67 }, { 5, 59 }, { 9, 67 }, { 16, 30 },
442 { 18, 32 }, { 18, 35 }, { 22, 29 }, { 24, 31 },
443 { 23, 38 }, { 18, 43 }, { 20, 41 }, { 11, 63 },
444 { 9, 59 }, { 9, 64 }, { -1, 94 }, { -2, 89 },
448 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
449 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
450 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
451 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
452 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
453 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
454 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
455 { -3, 74 }, { -10, 90 }, { 0, 70 }, { -4, 29 },
456 { 5, 31 }, { 7, 42 }, { 1, 59 }, { -2, 58 },
457 { -3, 72 }, { -3, 81 }, { -11, 97 }, { 0, 58 },
458 { 8, 5 }, { 10, 14 }, { 14, 18 }, { 13, 27 },
459 { 2, 40 }, { 0, 58 }, { -3, 70 }, { -6, 79 },
462 /* 276 a bit special (not used, bypass is used instead) */
466 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
467 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
468 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
469 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
470 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
471 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
472 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
473 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
474 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
475 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
476 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
477 { -2, 69 }, { -2, 59 }, { 6, 70 }, { 10, 44 },
478 { 9, 31 }, { 12, 43 }, { 3, 53 }, { 14, 34 },
479 { 10, 38 }, { -3, 52 }, { 13, 40 }, { 17, 32 },
480 { 7, 44 }, { 7, 38 }, { 13, 50 }, { 10, 57 },
484 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
485 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
486 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
487 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
488 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
489 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
490 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
491 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
492 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
493 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
494 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
495 { 8, 60 }, { 6, 63 }, { 17, 65 }, { 21, 24 },
496 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 },
497 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 },
498 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 },
502 { 12, 40 }, { 11, 51 }, { 14, 59 },
503 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
504 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
505 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
506 { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 },
507 { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 },
508 { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 },
509 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
510 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
511 { -8, 66 }, { -8, 76 },
514 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
515 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
516 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
517 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 },
518 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
519 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
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 { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
526 { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
527 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
528 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
529 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
530 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
531 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
532 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
533 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
534 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
535 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
536 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
537 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
538 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
539 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
540 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
541 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
542 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
543 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
544 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
545 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
546 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
547 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
548 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
549 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
550 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
551 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
552 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
553 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
554 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
555 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
556 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
557 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
558 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
559 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
560 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
561 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
562 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
563 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
564 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
565 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
566 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
567 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
568 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
569 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
570 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
571 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
572 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
573 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
574 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
575 { -16, 66 }, { -22, 65 }, { -20, 63 }, { -5, 85 },
576 { -6, 81 }, { -10, 77 }, { -7, 81 }, { -17, 80 },
577 { -18, 73 }, { -4, 74 }, { -10, 83 }, { -9, 71 },
578 { -9, 67 }, { -1, 61 }, { -8, 66 }, { -14, 66 },
579 { 0, 59 }, { 2, 59 }, { 9, -2 }, { 26, -9 },
580 { 33, -9 }, { 39, -7 }, { 41, -2 }, { 45, 3 },
581 { 49, 9 }, { 45, 27 }, { 36, 59 }, { 21, -13 },
582 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
583 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
584 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
585 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
586 { -8, 66 }, { -8, 76 }, { -4, 79 }, { -7, 71 },
587 { -5, 69 }, { -9, 70 }, { -8, 66 }, { -10, 68 },
588 { -19, 73 }, { -12, 69 }, { -16, 70 }, { -15, 67 },
589 { -20, 62 }, { -19, 70 }, { -16, 66 }, { -22, 65 },
590 { -20, 63 }, { -5, 85 }, { -6, 81 }, { -10, 77 },
591 { -7, 81 }, { -17, 80 }, { -18, 73 }, { -4, 74 },
592 { -10, 83 }, { -9, 71 }, { -9, 67 }, { -1, 61 },
593 { -8, 66 }, { -14, 66 }, { 0, 59 }, { 2, 59 },
594 { 9, -2 }, { 26, -9 }, { 33, -9 }, { 39, -7 },
595 { 41, -2 }, { 45, 3 }, { 49, 9 }, { 45, 27 },
596 { 36, 59 }, { 21, -13 }, { 33, -14 }, { 39, -7 },
597 { 46, -2 }, { 51, 2 }, { 60, 6 }, { 61, 17 },
598 { 55, 34 }, { 42, 62 }, { -6, 66 }, { -7, 35 },
599 { -7, 42 }, { -8, 45 }, { -5, 48 }, { -12, 56 },
600 { -6, 60 }, { -5, 62 }, { -8, 66 }, { -8, 76 },
601 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
602 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
603 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
604 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
605 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
606 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
607 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
608 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
609 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
610 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
611 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
612 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
613 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
614 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
615 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
616 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
617 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
618 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
619 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
620 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
621 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
622 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
623 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
624 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
625 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
626 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
627 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
628 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
629 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
630 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
631 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
632 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
633 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
634 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
635 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
636 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
637 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
638 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
639 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
640 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
641 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
642 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
643 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
644 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
645 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
646 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
647 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
648 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
649 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
650 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
651 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
652 { -3, 74 }, { -10, 90 }, { -6, 76 }, { -2, 44 },
653 { 0, 45 }, { 0, 52 }, { -3, 64 }, { -2, 59 },
654 { -4, 70 }, { -4, 75 }, { -8, 82 }, { -17, 102 },
655 { -9, 77 }, { 3, 24 }, { 0, 42 }, { 0, 48 },
656 { 0, 55 }, { -6, 59 }, { -7, 71 }, { -12, 83 },
657 { -11, 87 }, { -30, 119 }, { 1, 58 }, { -3, 29 },
658 { -1, 36 }, { 1, 38 }, { 2, 43 }, { -6, 55 },
659 { 0, 58 }, { 0, 64 }, { -3, 74 }, { -10, 90 },
660 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
661 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
662 { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 }
665 /* i_cabac_init_idc == 1 */
668 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
669 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
670 { -6, 53 }, { -1, 54 }, { 7, 51 },
673 { 22, 25 }, { 34, 0 }, { 16, 0 }, { -2, 9 },
674 { 4, 41 }, { -29, 118 }, { 2, 65 }, { -6, 71 },
675 { -13, 79 }, { 5, 52 }, { 9, 50 }, { -3, 70 },
679 { 26, 34 }, { 19, 22 }, { 40, 0 }, { 57, 2 },
680 { 41, 36 }, { 26, 69 }, { -45, 127 }, { -15, 101 },
681 { -4, 76 }, { -6, 71 }, { -13, 79 }, { 5, 52 },
682 { 6, 69 }, { -13, 90 }, { 0, 52 }, { 8, 43 },
685 { -2, 69 },{ -5, 82 },{ -10, 96 },{ 2, 59 },
686 { 2, 75 },{ -3, 87 },{ -3, 100 },{ 1, 56 },
687 { -3, 74 },{ -6, 85 },{ 0, 59 },{ -3, 81 },
688 { -7, 86 },{ -5, 95 },
691 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
692 { -5, 72 },{ 0, 61 },
695 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
696 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
697 { 13, 41 }, { 3, 62 },
700 { 13, 15 }, { 7, 51 }, { 2, 80 }, { -39, 127 },
701 { -18, 91 }, { -17, 96 }, { -26, 81 }, { -35, 98 },
702 { -24, 102 }, { -23, 97 }, { -27, 119 }, { -24, 99 },
703 { -21, 110 }, { -18, 102 }, { -36, 127 }, { 0, 80 },
704 { -5, 89 }, { -7, 94 }, { -4, 92 }, { 0, 39 },
705 { 0, 65 }, { -15, 84 }, { -35, 127 }, { -2, 73 },
706 { -12, 104 }, { -9, 91 }, { -31, 127 }, { 3, 55 },
707 { 7, 56 }, { 7, 55 }, { 8, 61 }, { -3, 53 },
708 { 0, 68 }, { -7, 74 }, { -9, 88 },
711 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
712 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
713 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
714 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
715 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
716 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
717 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
718 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
719 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
720 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
721 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
722 { -4, 71 }, { 0, 58 }, { 7, 61 }, { 9, 41 },
723 { 18, 25 }, { 9, 32 }, { 5, 43 }, { 9, 47 },
724 { 0, 44 }, { 0, 51 }, { 2, 46 }, { 19, 38 },
725 { -4, 66 }, { 15, 38 }, { 12, 42 }, { 9, 34 },
729 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
730 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
731 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
732 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
733 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
734 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
735 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
736 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
737 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
738 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
739 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
740 { 0, 75 }, { 2, 72 }, { 8, 77 }, { 14, 35 },
741 { 18, 31 }, { 17, 35 }, { 21, 30 }, { 17, 45 },
742 { 20, 42 }, { 18, 45 }, { 27, 26 }, { 16, 54 },
743 { 7, 66 }, { 16, 56 }, { 11, 73 }, { 10, 67 },
747 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
748 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
749 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
750 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
751 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
752 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
753 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
754 { -5, 74 }, { -9, 86 }, { 2, 66 }, { -9, 34 },
755 { 1, 32 }, { 11, 31 }, { 5, 52 }, { -2, 55 },
756 { -2, 67 }, { 0, 73 }, { -8, 89 }, { 3, 52 },
757 { 7, 4 }, { 10, 8 }, { 17, 8 }, { 16, 19 },
758 { 3, 37 }, { -1, 61 }, { -5, 73 }, { -1, 70 },
761 /* 276 a bit special (not used, bypass is used instead) */
765 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
766 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
767 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
768 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
769 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
770 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
771 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
772 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
773 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
774 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
775 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
776 { -1, 70 }, { -9, 72 }, { 14, 60 }, { 16, 37 },
777 { 0, 47 }, { 18, 35 }, { 11, 37 }, { 12, 41 },
778 { 10, 41 }, { 2, 48 }, { 12, 41 }, { 13, 41 },
779 { 0, 59 }, { 3, 50 }, { 19, 40 }, { 3, 66 },
783 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
784 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
785 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
786 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
787 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
788 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
789 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
790 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
791 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
792 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
793 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
794 { 12, 48 }, { 11, 49 }, { 26, 45 }, { 22, 22 },
795 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 },
796 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 },
797 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 },
801 { 25, 32 }, { 21, 49 }, { 21, 54 },
802 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
803 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
804 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
805 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 },
806 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
807 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
808 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
809 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
810 { -4, 67 }, { -7, 82 },
813 { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 },
814 { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 },
815 { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 },
816 { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 },
817 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
818 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
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 { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
825 { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
826 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
827 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
828 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
829 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
830 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
831 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
832 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
833 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
834 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
835 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
836 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
837 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
838 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
839 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
840 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
841 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
842 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
843 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
844 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
845 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
846 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
847 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
848 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
849 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
850 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
851 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
852 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
853 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
854 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
855 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
856 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
857 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
858 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
859 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
860 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
861 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
862 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
863 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
864 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
865 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
866 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
867 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
868 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
869 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
870 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
871 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
872 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
873 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
874 { -14, 66 }, { 0, 59 }, { 2, 59 }, { -3, 81 },
875 { -3, 76 }, { -7, 72 }, { -6, 78 }, { -12, 72 },
876 { -14, 68 }, { -3, 70 }, { -6, 76 }, { -5, 66 },
877 { -5, 62 }, { 0, 57 }, { -4, 61 }, { -9, 60 },
878 { 1, 54 }, { 2, 58 }, { 17, -10 }, { 32, -13 },
879 { 42, -9 }, { 49, -5 }, { 53, 0 }, { 64, 3 },
880 { 68, 10 }, { 66, 27 }, { 47, 57 }, { 17, -10 },
881 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
882 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
883 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
884 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
885 { -4, 67 }, { -7, 82 }, { -5, 85 }, { -6, 81 },
886 { -10, 77 }, { -7, 81 }, { -17, 80 }, { -18, 73 },
887 { -4, 74 }, { -10, 83 }, { -9, 71 }, { -9, 67 },
888 { -1, 61 }, { -8, 66 }, { -14, 66 }, { 0, 59 },
889 { 2, 59 }, { -3, 81 }, { -3, 76 }, { -7, 72 },
890 { -6, 78 }, { -12, 72 }, { -14, 68 }, { -3, 70 },
891 { -6, 76 }, { -5, 66 }, { -5, 62 }, { 0, 57 },
892 { -4, 61 }, { -9, 60 }, { 1, 54 }, { 2, 58 },
893 { 17, -10 }, { 32, -13 }, { 42, -9 }, { 49, -5 },
894 { 53, 0 }, { 64, 3 }, { 68, 10 }, { 66, 27 },
895 { 47, 57 }, { 17, -10 }, { 32, -13 }, { 42, -9 },
896 { 49, -5 }, { 53, 0 }, { 64, 3 }, { 68, 10 },
897 { 66, 27 }, { 47, 57 }, { -5, 71 }, { 0, 24 },
898 { -1, 36 }, { -2, 42 }, { -2, 52 }, { -9, 57 },
899 { -6, 63 }, { -4, 65 }, { -4, 67 }, { -7, 82 },
900 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
901 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
902 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
903 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
904 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
905 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
906 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
907 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
908 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
909 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
910 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
911 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
912 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
913 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
914 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
915 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
916 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
917 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
918 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
919 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
920 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
921 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
922 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
923 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
924 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
925 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
926 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
927 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
928 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
929 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
930 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
931 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
932 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
933 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
934 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
935 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
936 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
937 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
938 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
939 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
940 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
941 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
942 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
943 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
944 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
945 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
946 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
947 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
948 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
949 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
950 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
951 { -5, 74 }, { -9, 86 }, { -23, 112 }, { -15, 71 },
952 { -7, 61 }, { 0, 53 }, { -5, 66 }, { -11, 77 },
953 { -9, 80 }, { -9, 84 }, { -10, 87 }, { -34, 127 },
954 { -21, 101 }, { -3, 39 }, { -5, 53 }, { -7, 61 },
955 { -11, 75 }, { -15, 77 }, { -17, 91 }, { -25, 107 },
956 { -25, 111 }, { -28, 122 }, { -11, 76 }, { -10, 44 },
957 { -10, 52 }, { -10, 57 }, { -9, 58 }, { -16, 72 },
958 { -7, 69 }, { -4, 69 }, { -5, 74 }, { -9, 86 },
959 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
960 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
961 { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 }
964 /* i_cabac_init_idc == 2 */
967 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
968 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
969 { -6, 53 }, { -1, 54 }, { 7, 51 },
972 { 29, 16 }, { 25, 0 }, { 14, 0 }, { -10, 51 },
973 { -3, 62 }, { -27, 99 }, { 26, 16 }, { -4, 85 },
974 { -24, 102 }, { 5, 57 }, { 6, 57 }, { -17, 73 },
978 { 20, 40 }, { 20, 10 }, { 29, 0 }, { 54, 0 },
979 { 37, 42 }, { 12, 97 }, { -32, 127 }, { -22, 117 },
980 { -2, 74 }, { -4, 85 }, { -24, 102 }, { 5, 57 },
981 { -6, 93 }, { -14, 88 }, { -6, 44 }, { 4, 55 },
984 { -11, 89 },{ -15, 103 },{ -21, 116 },{ 19, 57 },
985 { 20, 58 },{ 4, 84 },{ 6, 96 },{ 1, 63 },
986 { -5, 85 },{ -13, 106 },{ 5, 63 },{ 6, 75 },
987 { -3, 90 },{ -1, 101 },
990 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
991 { -7, 50 },{ 1, 60 },
994 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
995 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
996 { 13, 41 }, { 3, 62 },
999 { 7, 34 }, { -9, 88 }, { -20, 127 }, { -36, 127 },
1000 { -17, 91 }, { -14, 95 }, { -25, 84 }, { -25, 86 },
1001 { -12, 89 }, { -17, 91 }, { -31, 127 }, { -14, 76 },
1002 { -18, 103 }, { -13, 90 }, { -37, 127 }, { 11, 80 },
1003 { 5, 76 }, { 2, 84 }, { 5, 78 }, { -6, 55 },
1004 { 4, 61 }, { -14, 83 }, { -37, 127 }, { -5, 79 },
1005 { -11, 104 }, { -11, 91 }, { -30, 127 }, { 0, 65 },
1006 { -2, 79 }, { 0, 72 }, { -4, 92 }, { -6, 56 },
1007 { 3, 68 }, { -8, 71 }, { -13, 98 },
1010 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1011 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1012 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1013 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1014 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1015 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1016 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1017 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1018 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1019 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1020 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1021 { 3, 65 }, { -7, 69 }, { 8, 77 }, { -10, 66 },
1022 { 3, 62 }, { -3, 68 }, { -20, 81 }, { 0, 30 },
1023 { 1, 7 }, { -3, 23 }, { -21, 74 }, { 16, 66 },
1024 { -23, 124 }, { 17, 37 }, { 44, -18 }, { 50, -34 },
1028 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1029 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1030 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1031 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1032 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1033 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1034 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1035 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1036 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1037 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1038 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1039 { 20, 34 }, { 19, 31 }, { 27, 44 }, { 19, 16 },
1040 { 15, 36 }, { 15, 36 }, { 21, 28 }, { 25, 21 },
1041 { 30, 20 }, { 31, 12 }, { 27, 16 }, { 24, 42 },
1042 { 0, 93 }, { 14, 56 }, { 15, 57 }, { 26, 38 },
1046 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1047 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1048 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1049 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1050 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1051 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1052 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1053 { -12, 92 }, { -18, 108 }, { -4, 79 }, { -22, 69 },
1054 { -16, 75 }, { -2, 58 }, { 1, 58 }, { -13, 78 },
1055 { -9, 83 }, { -4, 81 }, { -13, 99 }, { -13, 81 },
1056 { -6, 38 }, { -13, 62 }, { -6, 58 }, { -2, 59 },
1057 { -16, 73 }, { -10, 76 }, { -13, 86 }, { -9, 83 },
1060 /* 276 a bit special (not used, bypass is used instead) */
1064 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1065 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1066 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1067 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1068 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1069 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1070 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1071 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1072 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1073 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1074 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1075 { -2, 76 }, { -18, 86 }, { 12, 70 }, { 5, 64 },
1076 { -12, 70 }, { 11, 55 }, { 5, 56 }, { 0, 69 },
1077 { 2, 65 }, { -6, 74 }, { 5, 54 }, { 7, 54 },
1078 { -6, 76 }, { -11, 82 }, { -2, 77 }, { -2, 77 },
1082 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1083 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1084 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1085 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1086 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1087 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1088 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1089 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1090 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1091 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1092 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1093 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 },
1094 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 },
1095 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 },
1096 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 },
1100 { 21, 33 }, { 19, 50 }, { 17, 61 },
1101 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1102 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1103 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1104 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1105 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1106 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1107 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1108 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1109 { -6, 68 }, { -10, 79 },
1112 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1113 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1114 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1115 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1116 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1117 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
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 { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1124 { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1125 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1126 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1127 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1128 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1129 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1130 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1131 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1132 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1133 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1134 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1135 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1136 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1137 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1138 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1139 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1140 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1141 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1142 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1143 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1144 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1145 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1146 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1147 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1148 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1149 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1150 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1151 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1152 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1153 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1154 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1155 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1156 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1157 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1158 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1159 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1160 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1161 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1162 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1163 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1164 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1165 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1166 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1167 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1168 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1169 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1170 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1171 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1172 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1173 { -14, 59 }, { -9, 52 }, { -11, 68 }, { -3, 78 },
1174 { -8, 74 }, { -9, 72 }, { -10, 72 }, { -18, 75 },
1175 { -12, 71 }, { -11, 63 }, { -5, 70 }, { -17, 75 },
1176 { -14, 72 }, { -16, 67 }, { -8, 53 }, { -14, 59 },
1177 { -9, 52 }, { -11, 68 }, { 9, -2 }, { 30, -10 },
1178 { 31, -4 }, { 33, -1 }, { 33, 7 }, { 31, 12 },
1179 { 37, 23 }, { 31, 38 }, { 20, 64 }, { 9, -2 },
1180 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1181 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1182 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1183 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1184 { -6, 68 }, { -10, 79 }, { -3, 78 }, { -8, 74 },
1185 { -9, 72 }, { -10, 72 }, { -18, 75 }, { -12, 71 },
1186 { -11, 63 }, { -5, 70 }, { -17, 75 }, { -14, 72 },
1187 { -16, 67 }, { -8, 53 }, { -14, 59 }, { -9, 52 },
1188 { -11, 68 }, { -3, 78 }, { -8, 74 }, { -9, 72 },
1189 { -10, 72 }, { -18, 75 }, { -12, 71 }, { -11, 63 },
1190 { -5, 70 }, { -17, 75 }, { -14, 72 }, { -16, 67 },
1191 { -8, 53 }, { -14, 59 }, { -9, 52 }, { -11, 68 },
1192 { 9, -2 }, { 30, -10 }, { 31, -4 }, { 33, -1 },
1193 { 33, 7 }, { 31, 12 }, { 37, 23 }, { 31, 38 },
1194 { 20, 64 }, { 9, -2 }, { 30, -10 }, { 31, -4 },
1195 { 33, -1 }, { 33, 7 }, { 31, 12 }, { 37, 23 },
1196 { 31, 38 }, { 20, 64 }, { -9, 71 }, { -7, 37 },
1197 { -8, 44 }, { -11, 49 }, { -10, 56 }, { -12, 59 },
1198 { -8, 63 }, { -9, 67 }, { -6, 68 }, { -10, 79 },
1199 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1200 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1201 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1202 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1203 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1204 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1205 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1206 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1207 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1208 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1209 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1210 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1211 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1212 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1213 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1214 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1215 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1216 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1217 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1218 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1219 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1220 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1221 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1222 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1223 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1224 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1225 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1226 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1227 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1228 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1229 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1230 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1231 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1232 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1233 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1234 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1235 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1236 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1237 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1238 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1239 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1240 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1241 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1242 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1243 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1244 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1245 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1246 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1247 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1248 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1249 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1250 { -12, 92 }, { -18, 108 }, { -24, 115 }, { -22, 82 },
1251 { -9, 62 }, { 0, 53 }, { 0, 59 }, { -14, 85 },
1252 { -13, 89 }, { -13, 94 }, { -11, 92 }, { -29, 127 },
1253 { -21, 100 }, { -14, 57 }, { -12, 67 }, { -11, 71 },
1254 { -10, 77 }, { -21, 85 }, { -16, 88 }, { -23, 104 },
1255 { -15, 98 }, { -37, 127 }, { -10, 82 }, { -8, 48 },
1256 { -8, 61 }, { -8, 66 }, { -7, 70 }, { -14, 75 },
1257 { -10, 79 }, { -9, 83 }, { -12, 92 }, { -18, 108 },
1258 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1259 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1260 { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 }
1264 void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl)
1267 const int8_t (*tab)[2];
1268 const int slice_qp = av_clip(sl->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
1270 if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1271 else tab = cabac_context_init_PB[h->cabac_init_idc];
1273 /* calculate pre-state */
1274 for( i= 0; i < 1024; i++ ) {
1275 int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1281 h->cabac_state[i] = pre;
1285 static int decode_cabac_field_decoding_flag(H264Context *h, H264SliceContext *sl)
1287 const int mbb_xy = h->mb_xy - 2*h->mb_stride;
1289 unsigned long ctx = 0;
1291 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);
1292 ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1294 return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
1297 static int decode_cabac_intra_mb_type(H264Context *h, H264SliceContext *sl,
1298 int ctx_base, int intra_slice)
1300 uint8_t *state= &h->cabac_state[ctx_base];
1305 if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1307 if (sl->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1309 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
1310 return 0; /* I4x4 */
1313 if( get_cabac_noinline( &h->cabac, state ) == 0 )
1314 return 0; /* I4x4 */
1317 if( get_cabac_terminate( &h->cabac ) )
1318 return 25; /* PCM */
1320 mb_type = 1; /* I16x16 */
1321 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
1322 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
1323 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
1324 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
1325 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
1329 static int decode_cabac_mb_skip(H264Context *h, H264SliceContext *sl,
1335 if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1336 int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1339 && h->slice_table[mba_xy] == sl->slice_num
1340 && MB_FIELD(h) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1341 mba_xy += h->mb_stride;
1343 mbb_xy = mb_xy - h->mb_stride;
1345 && h->slice_table[mbb_xy] == sl->slice_num
1346 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1347 mbb_xy -= h->mb_stride;
1349 mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1351 int mb_xy = h->mb_xy;
1353 mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1356 if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1358 if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1361 if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1363 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
1366 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
1369 if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
1372 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
1373 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
1374 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
1376 return mode + ( mode >= pred_mode );
1379 static int decode_cabac_mb_chroma_pre_mode(H264Context *h, H264SliceContext *sl)
1381 const int mba_xy = sl->left_mb_xy[0];
1382 const int mbb_xy = sl->top_mb_xy;
1386 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1387 if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1390 if (sl->top_type && h->chroma_pred_mode_table[mbb_xy] != 0)
1393 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
1396 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1398 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1404 static int decode_cabac_mb_cbp_luma( H264Context *h) {
1405 int cbp_b, cbp_a, ctx, cbp = 0;
1407 cbp_a = h->left_cbp;
1410 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1411 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
1412 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1413 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
1414 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1415 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
1416 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1417 cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
1420 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
1424 cbp_a = (h->left_cbp>>4)&0x03;
1425 cbp_b = (h-> top_cbp>>4)&0x03;
1428 if( cbp_a > 0 ) ctx++;
1429 if( cbp_b > 0 ) ctx += 2;
1430 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
1434 if( cbp_a == 2 ) ctx++;
1435 if( cbp_b == 2 ) ctx += 2;
1436 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
1439 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
1440 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
1442 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
1444 if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
1448 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
1450 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
1451 return 0; /* B_Direct_8x8 */
1452 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
1453 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1455 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
1456 if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
1457 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1460 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
1461 type += get_cabac( &h->cabac, &h->cabac_state[39] );
1465 static int decode_cabac_mb_ref(H264Context *h, H264SliceContext *sl, int list, int n)
1467 int refa = sl->ref_cache[list][scan8[n] - 1];
1468 int refb = sl->ref_cache[list][scan8[n] - 8];
1472 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1473 if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1475 if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1484 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
1487 if(ref >= 32 /*h->ref_list[list]*/){
1494 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
1497 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1498 // if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1505 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
1513 while( get_cabac_bypass( &h->cabac ) ) {
1517 av_log(h->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1522 mvd += get_cabac_bypass( &h->cabac )<<k;
1524 *mvda=mvd < 70 ? mvd : 70;
1527 return get_cabac_bypass_sign( &h->cabac, -mvd );
1530 #define DECODE_CABAC_MB_MVD( h, list, n )\
1532 int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
1533 h->mvd_cache[list][scan8[n] - 8][0];\
1534 int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
1535 h->mvd_cache[list][scan8[n] - 8][1];\
1537 mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
1538 my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
1541 static av_always_inline int get_cabac_cbf_ctx(H264Context *h, H264SliceContext *sl,
1542 int cat, int idx, int max_coeff,
1547 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1551 idx -= CHROMA_DC_BLOCK_INDEX;
1552 nza = (h->left_cbp>>(6+idx))&0x01;
1553 nzb = (h-> top_cbp>>(6+idx))&0x01;
1555 idx -= LUMA_DC_BLOCK_INDEX;
1556 nza = h->left_cbp&(0x100<<idx);
1557 nzb = h-> top_cbp&(0x100<<idx);
1560 nza = sl->non_zero_count_cache[scan8[idx] - 1];
1561 nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1570 return base_ctx[cat] + ctx;
1573 static av_always_inline void
1574 decode_cabac_residual_internal(H264Context *h, H264SliceContext *sl,
1576 int cat, int n, const uint8_t *scantable,
1577 const uint32_t *qmul, int max_coeff,
1578 int is_dc, int chroma422)
1580 static const int significant_coeff_flag_offset[2][14] = {
1581 { 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 },
1582 { 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 }
1584 static const int last_coeff_flag_offset[2][14] = {
1585 { 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 },
1586 { 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 }
1588 static const int coeff_abs_level_m1_offset[14] = {
1589 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
1591 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1592 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1593 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1594 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1595 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1596 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1597 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1598 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1599 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1601 static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1602 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1603 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1604 * map node ctx => cabac ctx for level=1 */
1605 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1606 /* map node ctx => cabac ctx for level>1 */
1607 static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1608 { 5, 5, 5, 5, 6, 7, 8, 9 },
1609 { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1611 static const uint8_t coeff_abs_level_transition[2][8] = {
1612 /* update node ctx after decoding a level=1 */
1613 { 1, 2, 3, 3, 4, 5, 6, 7 },
1614 /* update node ctx after decoding a level>1 */
1615 { 4, 4, 4, 4, 5, 6, 7, 7 }
1621 int coeff_count = 0;
1624 uint8_t *significant_coeff_ctx_base;
1625 uint8_t *last_coeff_ctx_base;
1626 uint8_t *abs_level_m1_ctx_base;
1629 #define CABAC_ON_STACK
1631 #ifdef CABAC_ON_STACK
1634 cc.range = h->cabac.range;
1635 cc.low = h->cabac.low;
1636 cc.bytestream= h->cabac.bytestream;
1637 #if !UNCHECKED_BITSTREAM_READER || ARCH_AARCH64
1638 cc.bytestream_end = h->cabac.bytestream_end;
1641 #define CC &h->cabac
1644 significant_coeff_ctx_base = h->cabac_state
1645 + significant_coeff_flag_offset[MB_FIELD(h)][cat];
1646 last_coeff_ctx_base = h->cabac_state
1647 + last_coeff_flag_offset[MB_FIELD(h)][cat];
1648 abs_level_m1_ctx_base = h->cabac_state
1649 + coeff_abs_level_m1_offset[cat];
1651 if( !is_dc && max_coeff == 64 ) {
1652 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1653 for(last= 0; last < coefs; last++) { \
1654 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1655 if( get_cabac( CC, sig_ctx )) { \
1656 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1657 index[coeff_count++] = last; \
1658 if( get_cabac( CC, last_ctx ) ) { \
1664 if( last == max_coeff -1 ) {\
1665 index[coeff_count++] = last;\
1667 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(h)];
1668 #ifdef decode_significance
1669 coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1670 last_coeff_ctx_base, sig_off);
1672 if (is_dc && chroma422) { // dc 422
1673 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1675 coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1676 last_coeff_ctx_base-significant_coeff_ctx_base);
1679 DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1681 if (is_dc && chroma422) { // dc 422
1682 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1684 DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1688 av_assert2(coeff_count > 0);
1692 h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1694 h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1695 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1697 if( max_coeff == 64 )
1698 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1700 av_assert2( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1701 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1705 #define STORE_BLOCK(type) \
1707 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1709 int j= scantable[index[--coeff_count]]; \
1711 if( get_cabac( CC, ctx ) == 0 ) { \
1712 node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1714 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1716 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1719 int coeff_abs = 2; \
1720 ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1721 node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1723 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1727 if( coeff_abs >= 15 ) { \
1729 while (get_cabac_bypass(CC) && j < 30) { \
1735 coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1741 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1743 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1746 } while ( coeff_count );
1748 if (h->pixel_shift) {
1749 STORE_BLOCK(int32_t)
1751 STORE_BLOCK(int16_t)
1753 #ifdef CABAC_ON_STACK
1754 h->cabac.range = cc.range ;
1755 h->cabac.low = cc.low ;
1756 h->cabac.bytestream= cc.bytestream;
1761 static av_noinline void decode_cabac_residual_dc_internal(H264Context *h,
1762 H264SliceContext *sl,
1765 const uint8_t *scantable,
1768 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1771 static av_noinline void decode_cabac_residual_dc_internal_422(H264Context *h,
1772 H264SliceContext *sl,
1775 const uint8_t *scantable,
1778 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1781 static av_noinline void decode_cabac_residual_nondc_internal(H264Context *h,
1782 H264SliceContext *sl,
1785 const uint8_t *scantable,
1786 const uint32_t *qmul,
1789 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1792 /* cat: 0-> DC 16x16 n = 0
1793 * 1-> AC 16x16 n = luma4x4idx
1794 * 2-> Luma4x4 n = luma4x4idx
1795 * 3-> DC Chroma n = iCbCr
1796 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1797 * 5-> Luma8x8 n = 4 * luma8x8idx */
1799 /* Partially inline the CABAC residual decode: inline the coded block flag.
1800 * This has very little impact on binary size and improves performance
1801 * because it allows improved constant propagation into get_cabac_cbf_ctx,
1802 * as well as because most blocks have zero CBFs. */
1804 static av_always_inline void decode_cabac_residual_dc(H264Context *h,
1805 H264SliceContext *sl,
1808 const uint8_t *scantable,
1811 /* read coded block flag */
1812 if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 1)]) == 0 ) {
1813 sl->non_zero_count_cache[scan8[n]] = 0;
1816 decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1819 static av_always_inline void
1820 decode_cabac_residual_dc_422(H264Context *h, H264SliceContext *sl,
1822 int cat, int n, const uint8_t *scantable,
1825 /* read coded block flag */
1826 if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 1)]) == 0) {
1827 sl->non_zero_count_cache[scan8[n]] = 0;
1830 decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1833 static av_always_inline void decode_cabac_residual_nondc(H264Context *h,
1834 H264SliceContext *sl,
1837 const uint8_t *scantable,
1838 const uint32_t *qmul,
1841 /* read coded block flag */
1842 if( (cat != 5 || CHROMA444(h)) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 0)]) == 0) {
1843 if( max_coeff == 64 ) {
1844 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1846 sl->non_zero_count_cache[scan8[n]] = 0;
1850 decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1853 static av_always_inline void decode_cabac_luma_residual(H264Context *h, H264SliceContext *sl,
1854 const uint8_t *scan, const uint8_t *scan8x8,
1855 int pixel_shift, int mb_type, int cbp, int p)
1857 static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1858 const uint32_t *qmul;
1860 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1861 if( IS_INTRA16x16( mb_type ) ) {
1862 AV_ZERO128(h->mb_luma_dc[p]+0);
1863 AV_ZERO128(h->mb_luma_dc[p]+8);
1864 AV_ZERO128(h->mb_luma_dc[p]+16);
1865 AV_ZERO128(h->mb_luma_dc[p]+24);
1866 decode_cabac_residual_dc(h, sl, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1869 qmul = h->dequant4_coeff[p][qscale];
1870 for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1871 const int index = 16*p + i4x4;
1872 decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1875 fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1878 int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1879 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1880 if( cbp & (1<<i8x8) ) {
1881 if( IS_8x8DCT(mb_type) ) {
1882 const int index = 16*p + 4*i8x8;
1883 decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1884 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1886 qmul = h->dequant4_coeff[cqm][qscale];
1887 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1888 const int index = 16*p + 4*i8x8 + i4x4;
1890 decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1891 //STOP_TIMER("decode_residual")
1895 fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1902 * Decode a macroblock.
1903 * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1905 int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
1908 int mb_type, partition_count, cbp = 0;
1909 int dct8x8_allowed= h->pps.transform_8x8_mode;
1910 int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1911 const int pixel_shift = h->pixel_shift;
1912 unsigned local_ref_count[2];
1914 mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
1916 tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
1917 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1919 /* a skipped mb needs the aff flag from the following mb */
1920 if (FRAME_MBAFF(h) && (h->mb_y & 1) == 1 && sl->prev_mb_skipped)
1921 skip = sl->next_mb_skipped;
1923 skip = decode_cabac_mb_skip(h, sl, h->mb_x, h->mb_y );
1924 /* read skip flags */
1926 if (FRAME_MBAFF(h) && (h->mb_y & 1) == 0) {
1927 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1928 sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, h->mb_x, h->mb_y+1 );
1929 if(!sl->next_mb_skipped)
1930 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1933 decode_mb_skip(h, sl);
1935 h->cbp_table[mb_xy] = 0;
1936 h->chroma_pred_mode_table[mb_xy] = 0;
1937 h->last_qscale_diff = 0;
1943 if (FRAME_MBAFF(h)) {
1944 if( (h->mb_y&1) == 0 )
1946 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1949 sl->prev_mb_skipped = 0;
1951 fill_decode_neighbors(h, sl, -(MB_FIELD(h)));
1953 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1955 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1957 if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1959 if (!IS_DIRECT(sl->top_type - 1))
1962 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1963 mb_type= 0; /* B_Direct_16x16 */
1964 }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1965 mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1968 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1969 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1970 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1971 bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1973 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1974 }else if( bits == 13 ){
1975 mb_type = decode_cabac_intra_mb_type(h, sl, 32, 0);
1976 goto decode_intra_mb;
1977 }else if( bits == 14 ){
1978 mb_type= 11; /* B_L1_L0_8x16 */
1979 }else if( bits == 15 ){
1980 mb_type= 22; /* B_8x8 */
1982 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1983 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1986 partition_count= b_mb_type_info[mb_type].partition_count;
1987 mb_type= b_mb_type_info[mb_type].type;
1988 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
1989 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1991 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1992 /* P_L0_D16x16, P_8x8 */
1993 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1995 /* P_L0_D8x16, P_L0_D16x8 */
1996 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1998 partition_count= p_mb_type_info[mb_type].partition_count;
1999 mb_type= p_mb_type_info[mb_type].type;
2001 mb_type = decode_cabac_intra_mb_type(h, sl, 17, 0);
2002 goto decode_intra_mb;
2005 mb_type = decode_cabac_intra_mb_type(h, sl, 3, 1);
2006 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2008 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2010 partition_count = 0;
2011 cbp= i_mb_type_info[mb_type].cbp;
2012 sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode;
2013 mb_type= i_mb_type_info[mb_type].type;
2016 mb_type |= MB_TYPE_INTERLACED;
2018 h->slice_table[mb_xy] = sl->slice_num;
2020 if(IS_INTRA_PCM(mb_type)) {
2021 const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
2022 h->sps.bit_depth_luma >> 3;
2025 // We assume these blocks are very rare so we do not optimize it.
2026 // FIXME The two following lines get the bitstream position in the cabac
2027 // decode, I think it should be done by a function in cabac.h (or cabac.c).
2028 ptr= h->cabac.bytestream;
2029 if(h->cabac.low&0x1) ptr--;
2031 if(h->cabac.low&0x1FF) ptr--;
2034 // The pixels are stored in the same order as levels in h->mb array.
2035 if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
2037 h->intra_pcm_ptr = ptr;
2040 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
2042 // All blocks are present
2043 h->cbp_table[mb_xy] = 0xf7ef;
2044 h->chroma_pred_mode_table[mb_xy] = 0;
2045 // In deblocking, the quantizer is 0
2046 h->cur_pic.qscale_table[mb_xy] = 0;
2047 // All coeffs are present
2048 memset(h->non_zero_count[mb_xy], 16, 48);
2049 h->cur_pic.mb_type[mb_xy] = mb_type;
2050 h->last_qscale_diff = 0;
2054 local_ref_count[0] = h->ref_count[0] << MB_MBAFF(h);
2055 local_ref_count[1] = h->ref_count[1] << MB_MBAFF(h);
2057 fill_decode_caches(h, sl, mb_type);
2059 if( IS_INTRA( mb_type ) ) {
2061 if( IS_INTRA4x4( mb_type ) ) {
2062 if (dct8x8_allowed && get_cabac_noinline(&h->cabac, &h->cabac_state[399 + sl->neighbor_transform_size])) {
2063 mb_type |= MB_TYPE_8x8DCT;
2064 for( i = 0; i < 16; i+=4 ) {
2065 int pred = pred_intra_mode(h, sl, i);
2066 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2067 fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2070 for( i = 0; i < 16; i++ ) {
2071 int pred = pred_intra_mode(h, sl, i);
2072 sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(h, pred);
2074 av_dlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2075 sl->intra4x4_pred_mode_cache[scan8[i]]);
2078 write_back_intra_pred_mode(h, sl);
2079 if (ff_h264_check_intra4x4_pred_mode(h, sl) < 0 ) return -1;
2081 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl, sl->intra16x16_pred_mode, 0);
2082 if (sl->intra16x16_pred_mode < 0) return -1;
2085 h->chroma_pred_mode_table[mb_xy] =
2086 pred_mode = decode_cabac_mb_chroma_pre_mode(h, sl);
2088 pred_mode= ff_h264_check_intra_pred_mode(h, sl, pred_mode, 1 );
2089 if( pred_mode < 0 ) return -1;
2090 sl->chroma_pred_mode = pred_mode;
2092 sl->chroma_pred_mode = DC_128_PRED8x8;
2094 } else if( partition_count == 4 ) {
2095 int i, j, sub_partition_count[4], list, ref[2][4];
2097 if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2098 for( i = 0; i < 4; i++ ) {
2099 sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
2100 sub_partition_count[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2101 sl->sub_mb_type[i] = b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2103 if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2104 sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2105 ff_h264_pred_direct_motion(h, sl, &mb_type);
2106 sl->ref_cache[0][scan8[4]] =
2107 sl->ref_cache[1][scan8[4]] =
2108 sl->ref_cache[0][scan8[12]] =
2109 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2110 for( i = 0; i < 4; i++ )
2111 fill_rectangle(&h->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2114 for( i = 0; i < 4; i++ ) {
2115 sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(h);
2116 sub_partition_count[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2117 sl->sub_mb_type[i] = p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2121 for( list = 0; list < h->list_count; list++ ) {
2122 for( i = 0; i < 4; i++ ) {
2123 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2124 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2125 if (local_ref_count[list] > 1) {
2126 ref[list][i] = decode_cabac_mb_ref(h, sl, list, 4 * i);
2127 if (ref[list][i] >= (unsigned)local_ref_count[list]) {
2128 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]);
2136 sl->ref_cache[list][scan8[4 * i] + 1] =
2137 sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2142 dct8x8_allowed = get_dct8x8_allowed(h, sl);
2144 for(list=0; list<h->list_count; list++){
2146 sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2147 if(IS_DIRECT(sl->sub_mb_type[i])){
2148 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2152 if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2153 const int sub_mb_type= sl->sub_mb_type[i];
2154 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2155 for(j=0; j<sub_partition_count[i]; j++){
2158 const int index= 4*i + block_width*j;
2159 int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2160 uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2161 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2162 DECODE_CABAC_MB_MVD( h, list, index)
2163 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2165 if(IS_SUB_8X8(sub_mb_type)){
2167 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2169 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2172 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2174 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2175 }else if(IS_SUB_8X4(sub_mb_type)){
2176 mv_cache[ 1 ][0]= mx;
2177 mv_cache[ 1 ][1]= my;
2179 mvd_cache[ 1 ][0]= mpx;
2180 mvd_cache[ 1 ][1]= mpy;
2181 }else if(IS_SUB_4X8(sub_mb_type)){
2182 mv_cache[ 8 ][0]= mx;
2183 mv_cache[ 8 ][1]= my;
2185 mvd_cache[ 8 ][0]= mpx;
2186 mvd_cache[ 8 ][1]= mpy;
2188 mv_cache[ 0 ][0]= mx;
2189 mv_cache[ 0 ][1]= my;
2191 mvd_cache[ 0 ][0]= mpx;
2192 mvd_cache[ 0 ][1]= mpy;
2195 fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2196 fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2200 } else if( IS_DIRECT(mb_type) ) {
2201 ff_h264_pred_direct_motion(h, sl, &mb_type);
2202 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2203 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2204 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2207 if(IS_16X16(mb_type)){
2208 for(list=0; list<h->list_count; list++){
2209 if(IS_DIR(mb_type, 0, list)){
2211 if (local_ref_count[list] > 1) {
2212 ref= decode_cabac_mb_ref(h, sl, list, 0);
2213 if (ref >= (unsigned)local_ref_count[list]) {
2214 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2219 fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2222 for(list=0; list<h->list_count; list++){
2223 if(IS_DIR(mb_type, 0, list)){
2225 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2226 DECODE_CABAC_MB_MVD( h, list, 0)
2227 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2229 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2230 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2234 else if(IS_16X8(mb_type)){
2235 for(list=0; list<h->list_count; list++){
2237 if(IS_DIR(mb_type, i, list)){
2239 if (local_ref_count[list] > 1) {
2240 ref= decode_cabac_mb_ref(h, sl, list, 8 * i);
2241 if (ref >= (unsigned)local_ref_count[list]) {
2242 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2247 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2249 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2252 for(list=0; list<h->list_count; list++){
2254 if(IS_DIR(mb_type, i, list)){
2256 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2257 DECODE_CABAC_MB_MVD( h, list, 8*i)
2258 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2260 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2261 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2263 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2264 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2269 av_assert2(IS_8X16(mb_type));
2270 for(list=0; list<h->list_count; list++){
2272 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2274 if (local_ref_count[list] > 1) {
2275 ref= decode_cabac_mb_ref(h, sl, list, 4 * i);
2276 if (ref >= (unsigned)local_ref_count[list]) {
2277 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2282 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2284 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2287 for(list=0; list<h->list_count; list++){
2289 if(IS_DIR(mb_type, i, list)){
2291 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2292 DECODE_CABAC_MB_MVD( h, list, 4*i)
2294 tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2295 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2296 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2298 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2299 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2306 if( IS_INTER( mb_type ) ) {
2307 h->chroma_pred_mode_table[mb_xy] = 0;
2308 write_back_motion(h, sl, mb_type);
2311 if( !IS_INTRA16x16( mb_type ) ) {
2312 cbp = decode_cabac_mb_cbp_luma( h );
2314 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2316 if (!decode_chroma && cbp>15) {
2317 av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2318 return AVERROR_INVALIDDATA;
2322 h->cbp_table[mb_xy] = h->cbp = cbp;
2324 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2325 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&h->cabac, &h->cabac_state[399 + sl->neighbor_transform_size]);
2328 /* It would be better to do this in fill_decode_caches, but we don't know
2329 * the transform mode of the current macroblock there. */
2330 if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2332 uint8_t *nnz_cache = sl->non_zero_count_cache;
2333 for (i = 0; i < 2; i++){
2334 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2335 nnz_cache[3+8* 1 + 2*8*i]=
2336 nnz_cache[3+8* 2 + 2*8*i]=
2337 nnz_cache[3+8* 6 + 2*8*i]=
2338 nnz_cache[3+8* 7 + 2*8*i]=
2339 nnz_cache[3+8*11 + 2*8*i]=
2340 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2343 if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2344 uint32_t top_empty = CABAC(h) && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2345 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2346 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2347 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2350 h->cur_pic.mb_type[mb_xy] = mb_type;
2352 if( cbp || IS_INTRA16x16( mb_type ) ) {
2353 const uint8_t *scan, *scan8x8;
2354 const uint32_t *qmul;
2356 if(IS_INTERLACED(mb_type)){
2357 scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2358 scan = sl->qscale ? h->field_scan : h->field_scan_q0;
2360 scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2361 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2364 // decode_cabac_mb_dqp
2365 if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2368 const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2370 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2373 if(val > 2*max_qp){ //prevent infinite loop
2374 av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", h->mb_x, h->mb_y);
2382 val= -((val + 1)>>1);
2383 h->last_qscale_diff = val;
2385 if (((unsigned)sl->qscale) > max_qp){
2386 if (sl->qscale < 0) sl->qscale += max_qp + 1;
2387 else sl->qscale -= max_qp + 1;
2389 sl->chroma_qp[0] = get_chroma_qp(h, 0, sl->qscale);
2390 sl->chroma_qp[1] = get_chroma_qp(h, 1, sl->qscale);
2392 h->last_qscale_diff=0;
2394 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2396 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2397 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2398 } else if (CHROMA422(h)) {
2401 for (c = 0; c < 2; c++)
2402 decode_cabac_residual_dc_422(h, sl, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2403 CHROMA_DC_BLOCK_INDEX + c,
2404 chroma422_dc_scan, 8);
2409 for( c = 0; c < 2; c++ ) {
2410 int16_t *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2411 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2412 for (i8x8 = 0; i8x8 < 2; i8x8++) {
2413 for (i = 0; i < 4; i++) {
2414 const int index = 16 + 16 * c + 8*i8x8 + i;
2415 decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2416 mb += 16<<pixel_shift;
2421 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2422 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2424 } else /* yuv420 */ {
2427 for (c = 0; c < 2; c++)
2428 decode_cabac_residual_dc(h, sl, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2433 for( c = 0; c < 2; c++ ) {
2434 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2435 for( i = 0; i < 4; i++ ) {
2436 const int index = 16 + 16 * c + i;
2437 decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2441 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2442 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2446 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2447 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2448 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2449 h->last_qscale_diff = 0;
2452 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2453 write_back_non_zero_count(h, sl);