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