summaryrefslogtreecommitdiff
path: root/libavcodec/h264_cabac.c (plain)
blob: a1a16daafa90dc7f4c841c7d75bed3ec27ddcb18
1/*
2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * H.264 / AVC / MPEG-4 part10 cabac decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28#define CABAC(h) 1
29#define UNCHECKED_BITSTREAM_READER 1
30#define INT_BIT (CHAR_BIT * sizeof(int))
31
32#include "libavutil/attributes.h"
33#include "libavutil/avassert.h"
34#include "libavutil/timer.h"
35#include "config.h"
36#include "cabac.h"
37#include "cabac_functions.h"
38#include "internal.h"
39#include "avcodec.h"
40#include "h264dec.h"
41#include "h264data.h"
42#include "h264_mvpred.h"
43#include "mpegutils.h"
44
45#if ARCH_X86
46#include "x86/h264_i386.h"
47#endif
48
49/* Cabac pre state table */
50
51static const int8_t cabac_context_init_I[1024][2] =
52{
53 /* 0 - 10 */
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 },
57
58 /* 11 - 23 unused 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 },
62 { 0, 0 },
63
64 /* 24- 39 */
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 },
69
70 /* 40 - 53 */
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 },
74 { 0, 0 }, { 0, 0 },
75
76 /* 54 - 59 */
77 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
78 { 0, 0 }, { 0, 0 },
79
80 /* 60 - 69 */
81 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
82 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
83 { 13, 41 }, { 3, 62 },
84
85 /* 70 -> 87 */
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 },
91
92 /* 88 -> 104 */
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 },
97 { -22, 125 },
98
99 /* 105 -> 135 */
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 },
108
109 /* 136 -> 165 */
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 },
118
119 /* 166 -> 196 */
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 },
128
129 /* 197 -> 226 */
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 },
138
139 /* 227 -> 251 */
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 },
146 { -4, 65 },
147
148 /* 252 -> 275 */
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 },
155
156 /* 276 a bit special (not used, bypass is used instead) */
157 { 0, 0 },
158
159 /* 277 -> 307 */
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 },
168
169 /* 308 -> 337 */
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 },
178
179 /* 338 -> 368 */
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 },
188
189 /* 369 -> 398 */
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 },
198
199 /* 399 -> 435 */
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 },
210
211 /* 436 -> 459 */
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 },
218
219 /* 460 -> 1024 */
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 }
361};
362
363static const int8_t cabac_context_init_PB[3][1024][2] =
364{
365 /* i_cabac_init_idc == 0 */
366 {
367 /* 0 - 10 */
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 },
371
372 /* 11 - 23 */
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 },
376 { 17, 50 },
377
378 /* 24 - 39 */
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 },
383
384 /* 40 - 53 */
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 },
389
390 /* 54 - 59 */
391 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
392 { -7, 72 }, { 1, 58 },
393
394 /* 60 - 69 */
395 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
396 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
397 { 13, 41 }, { 3, 62 },
398
399 /* 70 - 87 */
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 },
409
410 /* 105 -> 165 */
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 },
426 { 9, 69 },
427
428 /* 166 - 226 */
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 },
444 { -9, 108 },
445
446 /* 227 - 275 */
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 },
459 { -8, 85 },
460
461 /* 276 a bit special (not used, bypass is used instead) */
462 { 0, 0 },
463
464 /* 277 - 337 */
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 },
480 { 26, 43 },
481
482 /* 338 - 398 */
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 },
498 { 11, 86 },
499
500 /* 399 - 435 */
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 },
511
512 /* 436 - 459 */
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 },
519
520 /* 460 - 1024 */
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 }
662 },
663
664 /* i_cabac_init_idc == 1 */
665 {
666 /* 0 - 10 */
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 },
670
671 /* 11 - 23 */
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 },
675 { 10, 54 },
676
677 /* 24 - 39 */
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 },
682
683 /* 40 - 53 */
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 },
688
689 /* 54 - 59 */
690 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
691 { -5, 72 },{ 0, 61 },
692
693 /* 60 - 69 */
694 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
695 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
696 { 13, 41 }, { 3, 62 },
697
698 /* 70 - 104 */
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 },
708
709 /* 105 -> 165 */
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 },
725 { 0, 89 },
726
727 /* 166 - 226 */
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 },
743 { -10, 116 },
744
745 /* 227 - 275 */
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 },
758 { -4, 78 },
759
760 /* 276 a bit special (not used, bypass is used instead) */
761 { 0, 0 },
762
763 /* 277 - 337 */
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 },
779 { 18, 50 },
780
781 /* 338 - 398 */
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 },
797 { 11, 83 },
798
799 /* 399 - 435 */
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 },
810
811 /* 436 - 459 */
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 },
818
819 /* 460 - 1024 */
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 }
961 },
962
963 /* i_cabac_init_idc == 2 */
964 {
965 /* 0 - 10 */
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 },
969
970 /* 11 - 23 */
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 },
974 { 14, 57 },
975
976 /* 24 - 39 */
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 },
981
982 /* 40 - 53 */
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 },
987
988 /* 54 - 59 */
989 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
990 { -7, 50 },{ 1, 60 },
991
992 /* 60 - 69 */
993 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
994 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
995 { 13, 41 }, { 3, 62 },
996
997 /* 70 - 104 */
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 },
1007
1008 /* 105 -> 165 */
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 },
1024 { -22, 127 },
1025
1026 /* 166 - 226 */
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 },
1042 { -24, 127 },
1043
1044 /* 227 - 275 */
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 },
1057 { -10, 87 },
1058
1059 /* 276 a bit special (not used, bypass is used instead) */
1060 { 0, 0 },
1061
1062 /* 277 - 337 */
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 },
1078 { 25, 42 },
1079
1080 /* 338 - 398 */
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 },
1096 { 25, 61 },
1097
1098 /* 399 - 435 */
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 },
1109
1110 /* 436 - 459 */
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 },
1117
1118 /* 460 - 1024 */
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 }
1260 }
1261};
1262
1263void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl)
1264{
1265 int i;
1266 const int8_t (*tab)[2];
1267 const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);
1268
1269 if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1270 else tab = cabac_context_init_PB[sl->cabac_init_idc];
1271
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;
1275
1276 pre^= pre>>31;
1277 if(pre > 124)
1278 pre= 124 + (pre&1);
1279
1280 sl->cabac_state[i] = pre;
1281 }
1282}
1283
1284static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1285{
1286 const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1287
1288 unsigned long ctx = 0;
1289
1290 ctx += sl->mb_field_decoding_flag & !!sl->mb_x; //for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
1291 ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1292
1293 return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1294}
1295
1296static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1297 int ctx_base, int intra_slice)
1298{
1299 uint8_t *state= &sl->cabac_state[ctx_base];
1300 int mb_type;
1301
1302 if(intra_slice){
1303 int ctx=0;
1304 if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1305 ctx++;
1306 if (sl->top_type & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1307 ctx++;
1308 if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1309 return 0; /* I4x4 */
1310 state += 2;
1311 }else{
1312 if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1313 return 0; /* I4x4 */
1314 }
1315
1316 if( get_cabac_terminate( &sl->cabac ) )
1317 return 25; /* PCM */
1318
1319 mb_type = 1; /* I16x16 */
1320 mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1321 if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1322 mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1323 mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1324 mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1325 return mb_type;
1326}
1327
1328static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1329 int mb_x, int mb_y)
1330{
1331 int mba_xy, mbb_xy;
1332 int ctx = 0;
1333
1334 if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1335 int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1336 mba_xy = mb_xy - 1;
1337 if( (mb_y&1)
1338 && h->slice_table[mba_xy] == sl->slice_num
1339 && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1340 mba_xy += h->mb_stride;
1341 if (MB_FIELD(sl)) {
1342 mbb_xy = mb_xy - h->mb_stride;
1343 if( !(mb_y&1)
1344 && h->slice_table[mbb_xy] == sl->slice_num
1345 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1346 mbb_xy -= h->mb_stride;
1347 }else
1348 mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1349 }else{
1350 int mb_xy = sl->mb_xy;
1351 mba_xy = mb_xy - 1;
1352 mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1353 }
1354
1355 if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1356 ctx++;
1357 if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1358 ctx++;
1359
1360 if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1361 ctx += 13;
1362 return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1363}
1364
1365static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1366{
1367 int mode = 0;
1368
1369 if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1370 return pred_mode;
1371
1372 mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1373 mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1374 mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1375
1376 return mode + ( mode >= pred_mode );
1377}
1378
1379static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1380{
1381 const int mba_xy = sl->left_mb_xy[0];
1382 const int mbb_xy = sl->top_mb_xy;
1383
1384 int ctx = 0;
1385
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)
1388 ctx++;
1389
1390 if (sl->top_type && h->chroma_pred_mode_table[mbb_xy] != 0)
1391 ctx++;
1392
1393 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1394 return 0;
1395
1396 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1397 return 1;
1398 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1399 return 2;
1400 else
1401 return 3;
1402}
1403
1404static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1405{
1406 int cbp_b, cbp_a, ctx, cbp = 0;
1407
1408 cbp_a = sl->left_cbp;
1409 cbp_b = sl->top_cbp;
1410
1411 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1412 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1413 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1414 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1415 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1416 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1417 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1418 cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1419 return cbp;
1420}
1421static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1422{
1423 int ctx;
1424 int cbp_a, cbp_b;
1425
1426 cbp_a = (sl->left_cbp>>4)&0x03;
1427 cbp_b = (sl-> top_cbp>>4)&0x03;
1428
1429 ctx = 0;
1430 if( cbp_a > 0 ) ctx++;
1431 if( cbp_b > 0 ) ctx += 2;
1432 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1433 return 0;
1434
1435 ctx = 4;
1436 if( cbp_a == 2 ) ctx++;
1437 if( cbp_b == 2 ) ctx += 2;
1438 return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1439}
1440
1441static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1442{
1443 if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1444 return 0; /* 8x8 */
1445 if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1446 return 1; /* 8x4 */
1447 if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1448 return 2; /* 4x8 */
1449 return 3; /* 4x4 */
1450}
1451static int decode_cabac_b_mb_sub_type(H264SliceContext *sl)
1452{
1453 int type;
1454 if( !get_cabac( &sl->cabac, &sl->cabac_state[36] ) )
1455 return 0; /* B_Direct_8x8 */
1456 if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1457 return 1 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1458 type = 3;
1459 if( get_cabac( &sl->cabac, &sl->cabac_state[38] ) ) {
1460 if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1461 return 11 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1462 type += 4;
1463 }
1464 type += 2*get_cabac( &sl->cabac, &sl->cabac_state[39] );
1465 type += get_cabac( &sl->cabac, &sl->cabac_state[39] );
1466 return type;
1467}
1468
1469static int decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)
1470{
1471 int refa = sl->ref_cache[list][scan8[n] - 1];
1472 int refb = sl->ref_cache[list][scan8[n] - 8];
1473 int ref = 0;
1474 int ctx = 0;
1475
1476 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1477 if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1478 ctx++;
1479 if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1480 ctx += 2;
1481 } else {
1482 if( refa > 0 )
1483 ctx++;
1484 if( refb > 0 )
1485 ctx += 2;
1486 }
1487
1488 while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1489 ref++;
1490 ctx = (ctx>>2)+4;
1491 if(ref >= 32 /*h->ref_list[list]*/){
1492 return -1;
1493 }
1494 }
1495 return ref;
1496}
1497
1498static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1499{
1500 int mvd;
1501
1502 if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1503// if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1504 *mvda= 0;
1505 return 0;
1506 }
1507
1508 mvd= 1;
1509 ctxbase+= 3;
1510 while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1511 if( mvd < 4 )
1512 ctxbase++;
1513 mvd++;
1514 }
1515
1516 if( mvd >= 9 ) {
1517 int k = 3;
1518 while( get_cabac_bypass( &sl->cabac ) ) {
1519 mvd += 1 << k;
1520 k++;
1521 if(k>24){
1522 av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1523 return INT_MIN;
1524 }
1525 }
1526 while( k-- ) {
1527 mvd += get_cabac_bypass( &sl->cabac )<<k;
1528 }
1529 *mvda=mvd < 70 ? mvd : 70;
1530 }else
1531 *mvda=mvd;
1532 return get_cabac_bypass_sign( &sl->cabac, -mvd );
1533}
1534
1535#define DECODE_CABAC_MB_MVD(sl, list, n )\
1536{\
1537 int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1538 sl->mvd_cache[list][scan8[n] - 8][0];\
1539 int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1540 sl->mvd_cache[list][scan8[n] - 8][1];\
1541\
1542 int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1543 int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1544 if (mxd == INT_MIN || myd == INT_MIN) \
1545 return AVERROR_INVALIDDATA; \
1546 mx += mxd;\
1547 my += myd;\
1548}
1549
1550static av_always_inline int get_cabac_cbf_ctx(H264SliceContext *sl,
1551 int cat, int idx, int max_coeff,
1552 int is_dc)
1553{
1554 int nza, nzb;
1555 int ctx = 0;
1556 static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1557
1558 if( is_dc ) {
1559 if( cat == 3 ) {
1560 idx -= CHROMA_DC_BLOCK_INDEX;
1561 nza = (sl->left_cbp>>(6+idx))&0x01;
1562 nzb = (sl-> top_cbp>>(6+idx))&0x01;
1563 } else {
1564 idx -= LUMA_DC_BLOCK_INDEX;
1565 nza = sl->left_cbp&(0x100<<idx);
1566 nzb = sl-> top_cbp&(0x100<<idx);
1567 }
1568 } else {
1569 nza = sl->non_zero_count_cache[scan8[idx] - 1];
1570 nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1571 }
1572
1573 if( nza > 0 )
1574 ctx++;
1575
1576 if( nzb > 0 )
1577 ctx += 2;
1578
1579 return base_ctx[cat] + ctx;
1580}
1581
1582static av_always_inline void
1583decode_cabac_residual_internal(const H264Context *h, H264SliceContext *sl,
1584 int16_t *block,
1585 int cat, int n, const uint8_t *scantable,
1586 const uint32_t *qmul, int max_coeff,
1587 int is_dc, int chroma422)
1588{
1589 static const int significant_coeff_flag_offset[2][14] = {
1590 { 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 },
1591 { 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 }
1592 };
1593 static const int last_coeff_flag_offset[2][14] = {
1594 { 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 },
1595 { 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 }
1596 };
1597 static const int coeff_abs_level_m1_offset[14] = {
1598 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
1599 };
1600 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1601 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1602 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1603 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1604 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1605 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1606 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1607 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1608 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1609 };
1610 static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1611 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1612 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1613 * map node ctx => cabac ctx for level=1 */
1614 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1615 /* map node ctx => cabac ctx for level>1 */
1616 static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1617 { 5, 5, 5, 5, 6, 7, 8, 9 },
1618 { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1619 };
1620 static const uint8_t coeff_abs_level_transition[2][8] = {
1621 /* update node ctx after decoding a level=1 */
1622 { 1, 2, 3, 3, 4, 5, 6, 7 },
1623 /* update node ctx after decoding a level>1 */
1624 { 4, 4, 4, 4, 5, 6, 7, 7 }
1625 };
1626
1627 int index[64];
1628
1629 int last;
1630 int coeff_count = 0;
1631 int node_ctx = 0;
1632
1633 uint8_t *significant_coeff_ctx_base;
1634 uint8_t *last_coeff_ctx_base;
1635 uint8_t *abs_level_m1_ctx_base;
1636
1637#if !ARCH_X86
1638#define CABAC_ON_STACK
1639#endif
1640#ifdef CABAC_ON_STACK
1641#define CC &cc
1642 CABACContext cc;
1643 cc.range = sl->cabac.range;
1644 cc.low = sl->cabac.low;
1645 cc.bytestream= sl->cabac.bytestream;
1646#if !UNCHECKED_BITSTREAM_READER || ARCH_AARCH64
1647 cc.bytestream_end = sl->cabac.bytestream_end;
1648#endif
1649#else
1650#define CC &sl->cabac
1651#endif
1652
1653 significant_coeff_ctx_base = sl->cabac_state
1654 + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1655 last_coeff_ctx_base = sl->cabac_state
1656 + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1657 abs_level_m1_ctx_base = sl->cabac_state
1658 + coeff_abs_level_m1_offset[cat];
1659
1660 if( !is_dc && max_coeff == 64 ) {
1661#define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1662 for(last= 0; last < coefs; last++) { \
1663 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1664 if( get_cabac( CC, sig_ctx )) { \
1665 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1666 index[coeff_count++] = last; \
1667 if( get_cabac( CC, last_ctx ) ) { \
1668 last= max_coeff; \
1669 break; \
1670 } \
1671 } \
1672 }\
1673 if( last == max_coeff -1 ) {\
1674 index[coeff_count++] = last;\
1675 }
1676 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(sl)];
1677#ifdef decode_significance
1678 coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1679 last_coeff_ctx_base, sig_off);
1680 } else {
1681 if (is_dc && chroma422) { // dc 422
1682 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1683 } else {
1684 coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1685 last_coeff_ctx_base-significant_coeff_ctx_base);
1686 }
1687#else
1688 DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1689 } else {
1690 if (is_dc && chroma422) { // dc 422
1691 DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1692 } else {
1693 DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1694 }
1695#endif
1696 }
1697 av_assert2(coeff_count > 0);
1698
1699 if( is_dc ) {
1700 if( cat == 3 )
1701 h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1702 else
1703 h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1704 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1705 } else {
1706 if( max_coeff == 64 )
1707 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1708 else {
1709 av_assert2( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1710 sl->non_zero_count_cache[scan8[n]] = coeff_count;
1711 }
1712 }
1713
1714#define STORE_BLOCK(type) \
1715 do { \
1716 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1717 \
1718 int j= scantable[index[--coeff_count]]; \
1719 \
1720 if( get_cabac( CC, ctx ) == 0 ) { \
1721 node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1722 if( is_dc ) { \
1723 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1724 }else{ \
1725 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1726 } \
1727 } else { \
1728 unsigned coeff_abs = 2; \
1729 ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1730 node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1731\
1732 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1733 coeff_abs++; \
1734 } \
1735\
1736 if( coeff_abs >= 15 ) { \
1737 int j = 0; \
1738 while (get_cabac_bypass(CC) && j < 30) { \
1739 j++; \
1740 } \
1741\
1742 coeff_abs=1; \
1743 while( j-- ) { \
1744 coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1745 } \
1746 coeff_abs+= 14U; \
1747 } \
1748\
1749 if( is_dc ) { \
1750 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1751 }else{ \
1752 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1753 } \
1754 } \
1755 } while ( coeff_count );
1756
1757 if (h->pixel_shift) {
1758 STORE_BLOCK(int32_t)
1759 } else {
1760 STORE_BLOCK(int16_t)
1761 }
1762#ifdef CABAC_ON_STACK
1763 sl->cabac.range = cc.range ;
1764 sl->cabac.low = cc.low ;
1765 sl->cabac.bytestream= cc.bytestream;
1766#endif
1767
1768}
1769
1770static av_noinline void decode_cabac_residual_dc_internal(const H264Context *h,
1771 H264SliceContext *sl,
1772 int16_t *block,
1773 int cat, int n,
1774 const uint8_t *scantable,
1775 int max_coeff)
1776{
1777 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1778}
1779
1780static av_noinline void decode_cabac_residual_dc_internal_422(const H264Context *h,
1781 H264SliceContext *sl,
1782 int16_t *block,
1783 int cat, int n,
1784 const uint8_t *scantable,
1785 int max_coeff)
1786{
1787 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1788}
1789
1790static av_noinline void decode_cabac_residual_nondc_internal(const H264Context *h,
1791 H264SliceContext *sl,
1792 int16_t *block,
1793 int cat, int n,
1794 const uint8_t *scantable,
1795 const uint32_t *qmul,
1796 int max_coeff)
1797{
1798 decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1799}
1800
1801/* cat: 0-> DC 16x16 n = 0
1802 * 1-> AC 16x16 n = luma4x4idx
1803 * 2-> Luma4x4 n = luma4x4idx
1804 * 3-> DC Chroma n = iCbCr
1805 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1806 * 5-> Luma8x8 n = 4 * luma8x8idx */
1807
1808/* Partially inline the CABAC residual decode: inline the coded block flag.
1809 * This has very little impact on binary size and improves performance
1810 * because it allows improved constant propagation into get_cabac_cbf_ctx,
1811 * as well as because most blocks have zero CBFs. */
1812
1813static av_always_inline void decode_cabac_residual_dc(const H264Context *h,
1814 H264SliceContext *sl,
1815 int16_t *block,
1816 int cat, int n,
1817 const uint8_t *scantable,
1818 int max_coeff)
1819{
1820 /* read coded block flag */
1821 if( get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0 ) {
1822 sl->non_zero_count_cache[scan8[n]] = 0;
1823 return;
1824 }
1825 decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1826}
1827
1828static av_always_inline void
1829decode_cabac_residual_dc_422(const H264Context *h, H264SliceContext *sl,
1830 int16_t *block,
1831 int cat, int n, const uint8_t *scantable,
1832 int max_coeff)
1833{
1834 /* read coded block flag */
1835 if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1836 sl->non_zero_count_cache[scan8[n]] = 0;
1837 return;
1838 }
1839 decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1840}
1841
1842static av_always_inline void decode_cabac_residual_nondc(const H264Context *h,
1843 H264SliceContext *sl,
1844 int16_t *block,
1845 int cat, int n,
1846 const uint8_t *scantable,
1847 const uint32_t *qmul,
1848 int max_coeff)
1849{
1850 /* read coded block flag */
1851 if( (cat != 5 || CHROMA444(h)) && get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 0)]) == 0) {
1852 if( max_coeff == 64 ) {
1853 fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1854 } else {
1855 sl->non_zero_count_cache[scan8[n]] = 0;
1856 }
1857 return;
1858 }
1859 decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1860}
1861
1862static av_always_inline void decode_cabac_luma_residual(const H264Context *h, H264SliceContext *sl,
1863 const uint8_t *scan, const uint8_t *scan8x8,
1864 int pixel_shift, int mb_type, int cbp, int p)
1865{
1866 static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1867 const uint32_t *qmul;
1868 int i8x8, i4x4;
1869 int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1870 if( IS_INTRA16x16( mb_type ) ) {
1871 AV_ZERO128(sl->mb_luma_dc[p]+0);
1872 AV_ZERO128(sl->mb_luma_dc[p]+8);
1873 AV_ZERO128(sl->mb_luma_dc[p]+16);
1874 AV_ZERO128(sl->mb_luma_dc[p]+24);
1875 decode_cabac_residual_dc(h, sl, sl->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1876
1877 if( cbp&15 ) {
1878 qmul = h->ps.pps->dequant4_coeff[p][qscale];
1879 for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1880 const int index = 16*p + i4x4;
1881 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1882 }
1883 } else {
1884 fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1885 }
1886 } else {
1887 int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1888 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1889 if( cbp & (1<<i8x8) ) {
1890 if( IS_8x8DCT(mb_type) ) {
1891 const int index = 16*p + 4*i8x8;
1892 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1893 scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1894 } else {
1895 qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1896 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1897 const int index = 16*p + 4*i8x8 + i4x4;
1898//START_TIMER
1899 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1900//STOP_TIMER("decode_residual")
1901 }
1902 }
1903 } else {
1904 fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1905 }
1906 }
1907 }
1908}
1909
1910/**
1911 * Decode a macroblock.
1912 * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1913 */
1914int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
1915{
1916 const SPS *sps = h->ps.sps;
1917 int mb_xy;
1918 int mb_type, partition_count, cbp = 0;
1919 int dct8x8_allowed= h->ps.pps->transform_8x8_mode;
1920 int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1921 const int pixel_shift = h->pixel_shift;
1922
1923 mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1924
1925 ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1926 if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1927 int skip;
1928 /* a skipped mb needs the aff flag from the following mb */
1929 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1930 skip = sl->next_mb_skipped;
1931 else
1932 skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1933 /* read skip flags */
1934 if( skip ) {
1935 if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1936 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1937 sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1938 if(!sl->next_mb_skipped)
1939 sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1940 }
1941
1942 decode_mb_skip(h, sl);
1943
1944 h->cbp_table[mb_xy] = 0;
1945 h->chroma_pred_mode_table[mb_xy] = 0;
1946 sl->last_qscale_diff = 0;
1947
1948 return 0;
1949
1950 }
1951 }
1952 if (FRAME_MBAFF(h)) {
1953 if ((sl->mb_y & 1) == 0)
1954 sl->mb_mbaff =
1955 sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1956 }
1957
1958 sl->prev_mb_skipped = 0;
1959
1960 fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1961
1962 if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1963 int ctx = 0;
1964 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1965
1966 if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1967 ctx++;
1968 if (!IS_DIRECT(sl->top_type - 1))
1969 ctx++;
1970
1971 if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1972 mb_type= 0; /* B_Direct_16x16 */
1973 }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1974 mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1975 }else{
1976 int bits;
1977 bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1978 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1979 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1980 bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1981 if( bits < 8 ){
1982 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1983 }else if( bits == 13 ){
1984 mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1985 goto decode_intra_mb;
1986 }else if( bits == 14 ){
1987 mb_type= 11; /* B_L1_L0_8x16 */
1988 }else if( bits == 15 ){
1989 mb_type= 22; /* B_8x8 */
1990 }else{
1991 bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1992 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1993 }
1994 }
1995 partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
1996 mb_type = ff_h264_b_mb_type_info[mb_type].type;
1997 } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
1998 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
1999 /* P-type */
2000 if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
2001 /* P_L0_D16x16, P_8x8 */
2002 mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2003 } else {
2004 /* P_L0_D8x16, P_L0_D16x8 */
2005 mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2006 }
2007 partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2008 mb_type = ff_h264_p_mb_type_info[mb_type].type;
2009 } else {
2010 mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2011 goto decode_intra_mb;
2012 }
2013 } else {
2014 mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2015 if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2016 mb_type--;
2017 av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2018decode_intra_mb:
2019 partition_count = 0;
2020 cbp = ff_h264_i_mb_type_info[mb_type].cbp;
2021 sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2022 mb_type = ff_h264_i_mb_type_info[mb_type].type;
2023 }
2024 if (MB_FIELD(sl))
2025 mb_type |= MB_TYPE_INTERLACED;
2026
2027 h->slice_table[mb_xy] = sl->slice_num;
2028
2029 if(IS_INTRA_PCM(mb_type)) {
2030 const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2031 sps->bit_depth_luma >> 3;
2032 const uint8_t *ptr;
2033 int ret;
2034
2035 // We assume these blocks are very rare so we do not optimize it.
2036 // FIXME The two following lines get the bitstream position in the cabac
2037 // decode, I think it should be done by a function in cabac.h (or cabac.c).
2038 ptr= sl->cabac.bytestream;
2039 if(sl->cabac.low&0x1) ptr--;
2040 if(CABAC_BITS==16){
2041 if(sl->cabac.low&0x1FF) ptr--;
2042 }
2043
2044 // The pixels are stored in the same order as levels in h->mb array.
2045 if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2046 return -1;
2047 sl->intra_pcm_ptr = ptr;
2048 ptr += mb_size;
2049
2050 ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2051 if (ret < 0)
2052 return ret;
2053
2054 // All blocks are present
2055 h->cbp_table[mb_xy] = 0xf7ef;
2056 h->chroma_pred_mode_table[mb_xy] = 0;
2057 // In deblocking, the quantizer is 0
2058 h->cur_pic.qscale_table[mb_xy] = 0;
2059 // All coeffs are present
2060 memset(h->non_zero_count[mb_xy], 16, 48);
2061 h->cur_pic.mb_type[mb_xy] = mb_type;
2062 sl->last_qscale_diff = 0;
2063 return 0;
2064 }
2065
2066 fill_decode_caches(h, sl, mb_type);
2067
2068 if( IS_INTRA( mb_type ) ) {
2069 int i, pred_mode;
2070 if( IS_INTRA4x4( mb_type ) ) {
2071 if (dct8x8_allowed && get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size])) {
2072 mb_type |= MB_TYPE_8x8DCT;
2073 for( i = 0; i < 16; i+=4 ) {
2074 int pred = pred_intra_mode(h, sl, i);
2075 int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2076 fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2077 }
2078 } else {
2079 for( i = 0; i < 16; i++ ) {
2080 int pred = pred_intra_mode(h, sl, i);
2081 sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2082
2083 ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2084 sl->intra4x4_pred_mode_cache[scan8[i]]);
2085 }
2086 }
2087 write_back_intra_pred_mode(h, sl);
2088 if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2089 sl->top_samples_available, sl->left_samples_available) < 0 )
2090 return -1;
2091 } else {
2092 sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2093 sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2094 if (sl->intra16x16_pred_mode < 0) return -1;
2095 }
2096 if(decode_chroma){
2097 h->chroma_pred_mode_table[mb_xy] =
2098 pred_mode = decode_cabac_mb_chroma_pre_mode(h, sl);
2099
2100 pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2101 sl->left_samples_available, pred_mode, 1 );
2102 if( pred_mode < 0 ) return -1;
2103 sl->chroma_pred_mode = pred_mode;
2104 } else {
2105 sl->chroma_pred_mode = DC_128_PRED8x8;
2106 }
2107 } else if( partition_count == 4 ) {
2108 int i, j, sub_partition_count[4], list, ref[2][4];
2109
2110 if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2111 for( i = 0; i < 4; i++ ) {
2112 sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
2113 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2114 sl->sub_mb_type[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2115 }
2116 if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2117 sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2118 ff_h264_pred_direct_motion(h, sl, &mb_type);
2119 sl->ref_cache[0][scan8[4]] =
2120 sl->ref_cache[1][scan8[4]] =
2121 sl->ref_cache[0][scan8[12]] =
2122 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2123 for( i = 0; i < 4; i++ )
2124 fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2125 }
2126 } else {
2127 for( i = 0; i < 4; i++ ) {
2128 sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2129 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2130 sl->sub_mb_type[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2131 }
2132 }
2133
2134 for( list = 0; list < sl->list_count; list++ ) {
2135 for( i = 0; i < 4; i++ ) {
2136 if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2137 if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2138 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2139 if (rc > 1) {
2140 ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2141 if (ref[list][i] >= rc) {
2142 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2143 return -1;
2144 }
2145 }else
2146 ref[list][i] = 0;
2147 } else {
2148 ref[list][i] = -1;
2149 }
2150 sl->ref_cache[list][scan8[4 * i] + 1] =
2151 sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2152 }
2153 }
2154
2155 if(dct8x8_allowed)
2156 dct8x8_allowed = get_dct8x8_allowed(h, sl);
2157
2158 for (list = 0; list < sl->list_count; list++) {
2159 for(i=0; i<4; i++){
2160 sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2161 if(IS_DIRECT(sl->sub_mb_type[i])){
2162 fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2163 continue;
2164 }
2165
2166 if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2167 const int sub_mb_type= sl->sub_mb_type[i];
2168 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2169 for(j=0; j<sub_partition_count[i]; j++){
2170 int mpx, mpy;
2171 int mx, my;
2172 const int index= 4*i + block_width*j;
2173 int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2174 uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2175 pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2176 DECODE_CABAC_MB_MVD(sl, list, index)
2177 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2178
2179 if(IS_SUB_8X8(sub_mb_type)){
2180 mv_cache[ 1 ][0]=
2181 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2182 mv_cache[ 1 ][1]=
2183 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2184
2185 mvd_cache[ 1 ][0]=
2186 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2187 mvd_cache[ 1 ][1]=
2188 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2189 }else if(IS_SUB_8X4(sub_mb_type)){
2190 mv_cache[ 1 ][0]= mx;
2191 mv_cache[ 1 ][1]= my;
2192
2193 mvd_cache[ 1 ][0]= mpx;
2194 mvd_cache[ 1 ][1]= mpy;
2195 }else if(IS_SUB_4X8(sub_mb_type)){
2196 mv_cache[ 8 ][0]= mx;
2197 mv_cache[ 8 ][1]= my;
2198
2199 mvd_cache[ 8 ][0]= mpx;
2200 mvd_cache[ 8 ][1]= mpy;
2201 }
2202 mv_cache[ 0 ][0]= mx;
2203 mv_cache[ 0 ][1]= my;
2204
2205 mvd_cache[ 0 ][0]= mpx;
2206 mvd_cache[ 0 ][1]= mpy;
2207 }
2208 }else{
2209 fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2210 fill_rectangle(sl->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2211 }
2212 }
2213 }
2214 } else if( IS_DIRECT(mb_type) ) {
2215 ff_h264_pred_direct_motion(h, sl, &mb_type);
2216 fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2217 fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2218 dct8x8_allowed &= sps->direct_8x8_inference_flag;
2219 } else {
2220 int list, i;
2221 if(IS_16X16(mb_type)){
2222 for (list = 0; list < sl->list_count; list++) {
2223 if(IS_DIR(mb_type, 0, list)){
2224 int ref;
2225 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2226 if (rc > 1) {
2227 ref= decode_cabac_mb_ref(sl, list, 0);
2228 if (ref >= rc) {
2229 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2230 return -1;
2231 }
2232 }else
2233 ref=0;
2234 fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2235 }
2236 }
2237 for (list = 0; list < sl->list_count; list++) {
2238 if(IS_DIR(mb_type, 0, list)){
2239 int mx,my,mpx,mpy;
2240 pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2241 DECODE_CABAC_MB_MVD(sl, list, 0)
2242 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2243
2244 fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2245 fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2246 }
2247 }
2248 }
2249 else if(IS_16X8(mb_type)){
2250 for (list = 0; list < sl->list_count; list++) {
2251 for(i=0; i<2; i++){
2252 if(IS_DIR(mb_type, i, list)){
2253 int ref;
2254 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2255 if (rc > 1) {
2256 ref= decode_cabac_mb_ref(sl, list, 8 * i);
2257 if (ref >= rc) {
2258 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2259 return -1;
2260 }
2261 }else
2262 ref=0;
2263 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2264 }else
2265 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2266 }
2267 }
2268 for (list = 0; list < sl->list_count; list++) {
2269 for(i=0; i<2; i++){
2270 if(IS_DIR(mb_type, i, list)){
2271 int mx,my,mpx,mpy;
2272 pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2273 DECODE_CABAC_MB_MVD(sl, list, 8*i)
2274 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2275
2276 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2277 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2278 }else{
2279 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2280 fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2281 }
2282 }
2283 }
2284 }else{
2285 av_assert2(IS_8X16(mb_type));
2286 for (list = 0; list < sl->list_count; list++) {
2287 for(i=0; i<2; i++){
2288 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2289 int ref;
2290 unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2291 if (rc > 1) {
2292 ref = decode_cabac_mb_ref(sl, list, 4 * i);
2293 if (ref >= rc) {
2294 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2295 return -1;
2296 }
2297 }else
2298 ref=0;
2299 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2300 }else
2301 fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2302 }
2303 }
2304 for (list = 0; list < sl->list_count; list++) {
2305 for(i=0; i<2; i++){
2306 if(IS_DIR(mb_type, i, list)){
2307 int mx,my,mpx,mpy;
2308 pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2309 DECODE_CABAC_MB_MVD(sl, list, 4*i)
2310
2311 ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2312 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2313 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2314 }else{
2315 fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2316 fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2317 }
2318 }
2319 }
2320 }
2321 }
2322
2323 if( IS_INTER( mb_type ) ) {
2324 h->chroma_pred_mode_table[mb_xy] = 0;
2325 write_back_motion(h, sl, mb_type);
2326 }
2327
2328 if( !IS_INTRA16x16( mb_type ) ) {
2329 cbp = decode_cabac_mb_cbp_luma(sl);
2330 if(decode_chroma)
2331 cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2332 } else {
2333 if (!decode_chroma && cbp>15) {
2334 av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2335 return AVERROR_INVALIDDATA;
2336 }
2337 }
2338
2339 h->cbp_table[mb_xy] = sl->cbp = cbp;
2340
2341 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2342 mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2343 }
2344
2345 /* It would be better to do this in fill_decode_caches, but we don't know
2346 * the transform mode of the current macroblock there. */
2347 if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2348 int i;
2349 uint8_t *nnz_cache = sl->non_zero_count_cache;
2350 for (i = 0; i < 2; i++){
2351 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2352 nnz_cache[3+8* 1 + 2*8*i]=
2353 nnz_cache[3+8* 2 + 2*8*i]=
2354 nnz_cache[3+8* 6 + 2*8*i]=
2355 nnz_cache[3+8* 7 + 2*8*i]=
2356 nnz_cache[3+8*11 + 2*8*i]=
2357 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2358 }
2359 }
2360 if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2361 uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2362 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2363 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2364 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2365 }
2366 }
2367 h->cur_pic.mb_type[mb_xy] = mb_type;
2368
2369 if( cbp || IS_INTRA16x16( mb_type ) ) {
2370 const uint8_t *scan, *scan8x8;
2371 const uint32_t *qmul;
2372
2373 if(IS_INTERLACED(mb_type)){
2374 scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2375 scan = sl->qscale ? h->field_scan : h->field_scan_q0;
2376 }else{
2377 scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2378 scan = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2379 }
2380
2381 // decode_cabac_mb_dqp
2382 if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2383 int val = 1;
2384 int ctx= 2;
2385 const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2386
2387 while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2388 ctx= 3;
2389 val++;
2390 if(val > 2*max_qp){ //prevent infinite loop
2391 av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", sl->mb_x, sl->mb_y);
2392 return -1;
2393 }
2394 }
2395
2396 if( val&0x01 )
2397 val= (val + 1)>>1 ;
2398 else
2399 val= -((val + 1)>>1);
2400 sl->last_qscale_diff = val;
2401 sl->qscale += val;
2402 if (((unsigned)sl->qscale) > max_qp){
2403 if (sl->qscale < 0) sl->qscale += max_qp + 1;
2404 else sl->qscale -= max_qp + 1;
2405 }
2406 sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2407 sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2408 }else
2409 sl->last_qscale_diff=0;
2410
2411 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2412 if (CHROMA444(h)) {
2413 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2414 decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2415 } else if (CHROMA422(h)) {
2416 if( cbp&0x30 ){
2417 int c;
2418 for (c = 0; c < 2; c++)
2419 decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2420 CHROMA_DC_BLOCK_INDEX + c,
2421 ff_h264_chroma422_dc_scan, 8);
2422 }
2423
2424 if( cbp&0x20 ) {
2425 int c, i, i8x8;
2426 for( c = 0; c < 2; c++ ) {
2427 int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2428 qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2429 for (i8x8 = 0; i8x8 < 2; i8x8++) {
2430 for (i = 0; i < 4; i++) {
2431 const int index = 16 + 16 * c + 8*i8x8 + i;
2432 decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2433 mb += 16<<pixel_shift;
2434 }
2435 }
2436 }
2437 } else {
2438 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2439 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2440 }
2441 } else /* yuv420 */ {
2442 if( cbp&0x30 ){
2443 int c;
2444 for (c = 0; c < 2; c++)
2445 decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2446 3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2447 }
2448
2449 if( cbp&0x20 ) {
2450 int c, i;
2451 for( c = 0; c < 2; c++ ) {
2452 qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2453 for( i = 0; i < 4; i++ ) {
2454 const int index = 16 + 16 * c + i;
2455 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2456 }
2457 }
2458 } else {
2459 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2460 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2461 }
2462 }
2463 } else {
2464 fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2465 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2466 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2467 sl->last_qscale_diff = 0;
2468 }
2469
2470 h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2471 write_back_non_zero_count(h, sl);
2472
2473 return 0;
2474}
2475