FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
h264_cabac.c
Go to the documentation of this file.
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/timer.h"
33 #include "config.h"
34 #include "cabac.h"
35 #include "cabac_functions.h"
36 #include "internal.h"
37 #include "avcodec.h"
38 #include "h264.h"
39 #include "h264data.h"
40 #include "h264_mvpred.h"
41 #include "golomb.h"
42 #include "libavutil/avassert.h"
43 
44 #if ARCH_X86
45 #include "x86/h264_i386.h"
46 #endif
47 
48 /* Cabac pre state table */
49 
50 static const int8_t cabac_context_init_I[1024][2] =
51 {
52  /* 0 - 10 */
53  { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
54  { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 },
55  { -6, 53 }, { -1, 54 }, { 7, 51 },
56 
57  /* 11 - 23 unsused for I */
58  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
59  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
60  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
61  { 0, 0 },
62 
63  /* 24- 39 */
64  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
65  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
66  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
67  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
68 
69  /* 40 - 53 */
70  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
71  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
72  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
73  { 0, 0 }, { 0, 0 },
74 
75  /* 54 - 59 */
76  { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
77  { 0, 0 }, { 0, 0 },
78 
79  /* 60 - 69 */
80  { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
81  { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
82  { 13, 41 }, { 3, 62 },
83 
84  /* 70 -> 87 */
85  { 0, 11 }, { 1, 55 }, { 0, 69 }, { -17, 127 },
86  { -13, 102 },{ 0, 82 }, { -7, 74 }, { -21, 107 },
87  { -27, 127 },{ -31, 127 },{ -24, 127 }, { -18, 95 },
88  { -27, 127 },{ -21, 114 },{ -30, 127 }, { -17, 123 },
89  { -12, 115 },{ -16, 122 },
90 
91  /* 88 -> 104 */
92  { -11, 115 },{ -12, 63 }, { -2, 68 }, { -15, 84 },
93  { -13, 104 },{ -3, 70 }, { -8, 93 }, { -10, 90 },
94  { -30, 127 },{ -1, 74 }, { -6, 97 }, { -7, 91 },
95  { -20, 127 },{ -4, 56 }, { -5, 82 }, { -7, 76 },
96  { -22, 125 },
97 
98  /* 105 -> 135 */
99  { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
100  { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
101  { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
102  { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
103  { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
104  { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
105  { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
106  { 14, 62 }, { -13, 108 },{ -15, 100 },
107 
108  /* 136 -> 165 */
109  { -13, 101 },{ -13, 91 }, { -12, 94 }, { -10, 88 },
110  { -16, 84 }, { -10, 86 }, { -7, 83 }, { -13, 87 },
111  { -19, 94 }, { 1, 70 }, { 0, 72 }, { -5, 74 },
112  { 18, 59 }, { -8, 102 }, { -15, 100 }, { 0, 95 },
113  { -4, 75 }, { 2, 72 }, { -11, 75 }, { -3, 71 },
114  { 15, 46 }, { -13, 69 }, { 0, 62 }, { 0, 65 },
115  { 21, 37 }, { -15, 72 }, { 9, 57 }, { 16, 54 },
116  { 0, 62 }, { 12, 72 },
117 
118  /* 166 -> 196 */
119  { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
120  { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
121  { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
122  { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
123  { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
124  { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
125  { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
126  { 0, 89 }, { 26, -19 }, { 22, -17 },
127 
128  /* 197 -> 226 */
129  { 26, -17 }, { 30, -25 }, { 28, -20 }, { 33, -23 },
130  { 37, -27 }, { 33, -23 }, { 40, -28 }, { 38, -17 },
131  { 33, -11 }, { 40, -15 }, { 41, -6 }, { 38, 1 },
132  { 41, 17 }, { 30, -6 }, { 27, 3 }, { 26, 22 },
133  { 37, -16 }, { 35, -4 }, { 38, -8 }, { 38, -3 },
134  { 37, 3 }, { 38, 5 }, { 42, 0 }, { 35, 16 },
135  { 39, 22 }, { 14, 48 }, { 27, 37 }, { 21, 60 },
136  { 12, 68 }, { 2, 97 },
137 
138  /* 227 -> 251 */
139  { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
140  { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
141  { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
142  { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
143  { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
144  { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
145  { -4, 65 },
146 
147  /* 252 -> 275 */
148  { -12, 73 }, { -8, 76 }, { -7, 80 }, { -9, 88 },
149  { -17, 110 },{ -11, 97 }, { -20, 84 }, { -11, 79 },
150  { -6, 73 }, { -4, 74 }, { -13, 86 }, { -13, 96 },
151  { -11, 97 }, { -19, 117 },{ -8, 78 }, { -5, 33 },
152  { -4, 48 }, { -2, 53 }, { -3, 62 }, { -13, 71 },
153  { -10, 79 }, { -12, 86 }, { -13, 90 }, { -14, 97 },
154 
155  /* 276 a bit special (not used, bypass is used instead) */
156  { 0, 0 },
157 
158  /* 277 -> 307 */
159  { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
160  { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
161  { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
162  { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
163  { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
164  { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
165  { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
166  { 9, 64 }, { -12, 104 },{ -11, 97 },
167 
168  /* 308 -> 337 */
169  { -16, 96 }, { -7, 88 }, { -8, 85 }, { -7, 85 },
170  { -9, 85 }, { -13, 88 }, { 4, 66 }, { -3, 77 },
171  { -3, 76 }, { -6, 76 }, { 10, 58 }, { -1, 76 },
172  { -1, 83 }, { -7, 99 }, { -14, 95 }, { 2, 95 },
173  { 0, 76 }, { -5, 74 }, { 0, 70 }, { -11, 75 },
174  { 1, 68 }, { 0, 65 }, { -14, 73 }, { 3, 62 },
175  { 4, 62 }, { -1, 68 }, { -13, 75 }, { 11, 55 },
176  { 5, 64 }, { 12, 70 },
177 
178  /* 338 -> 368 */
179  { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
180  { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
181  { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
182  { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
183  { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
184  { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
185  { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
186  { -12, 109 },{ 36, -35 }, { 36, -34 },
187 
188  /* 369 -> 398 */
189  { 32, -26 }, { 37, -30 }, { 44, -32 }, { 34, -18 },
190  { 34, -15 }, { 40, -15 }, { 33, -7 }, { 35, -5 },
191  { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 },
192  { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 },
193  { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 },
194  { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 },
195  { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 },
196  { 29, 39 }, { 19, 66 },
197 
198  /* 399 -> 435 */
199  { 31, 21 }, { 31, 31 }, { 25, 50 },
200  { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
201  { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
202  { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
203  { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 },
204  { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 },
205  { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 },
206  { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
207  { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
208  { 0, 68 }, { -9, 92 },
209 
210  /* 436 -> 459 */
211  { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 },
212  { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 },
213  { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 },
214  { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 },
215  { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
216  { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
217 
218  /* 460 -> 1024 */
219  { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
220  { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
221  { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
222  { -17, 123 }, { -12, 115 }, { -16, 122 }, { -11, 115 },
223  { -12, 63 }, { -2, 68 }, { -15, 84 }, { -13, 104 },
224  { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
225  { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
226  { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
227  { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
228  { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
229  { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
230  { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
231  { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
232  { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
233  { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
234  { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
235  { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
236  { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
237  { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
238  { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
239  { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
240  { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
241  { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
242  { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
243  { 14, 62 }, { -13, 108 }, { -15, 100 }, { -13, 101 },
244  { -13, 91 }, { -12, 94 }, { -10, 88 }, { -16, 84 },
245  { -10, 86 }, { -7, 83 }, { -13, 87 }, { -19, 94 },
246  { 1, 70 }, { 0, 72 }, { -5, 74 }, { 18, 59 },
247  { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
248  { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
249  { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
250  { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
251  { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
252  { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
253  { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
254  { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
255  { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
256  { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
257  { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
258  { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
259  { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
260  { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
261  { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
262  { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
263  { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
264  { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
265  { 0, 89 }, { 26, -19 }, { 22, -17 }, { 26, -17 },
266  { 30, -25 }, { 28, -20 }, { 33, -23 }, { 37, -27 },
267  { 33, -23 }, { 40, -28 }, { 38, -17 }, { 33, -11 },
268  { 40, -15 }, { 41, -6 }, { 38, 1 }, { 41, 17 },
269  { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
270  { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
271  { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
272  { -23, 68 }, { -24, 50 }, { -11, 74 }, { -14, 106 },
273  { -13, 97 }, { -15, 90 }, { -12, 90 }, { -18, 88 },
274  { -10, 73 }, { -9, 79 }, { -14, 86 }, { -10, 73 },
275  { -10, 70 }, { -10, 69 }, { -5, 66 }, { -9, 64 },
276  { -5, 58 }, { 2, 59 }, { 23, -13 }, { 26, -13 },
277  { 40, -15 }, { 49, -14 }, { 44, 3 }, { 45, 6 },
278  { 44, 34 }, { 33, 54 }, { 19, 82 }, { 21, -10 },
279  { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
280  { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 },
281  { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
282  { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
283  { 0, 68 }, { -9, 92 }, { -17, 120 }, { -20, 112 },
284  { -18, 114 }, { -11, 85 }, { -15, 92 }, { -14, 89 },
285  { -26, 71 }, { -15, 81 }, { -14, 80 }, { 0, 68 },
286  { -14, 70 }, { -24, 56 }, { -23, 68 }, { -24, 50 },
287  { -11, 74 }, { -14, 106 }, { -13, 97 }, { -15, 90 },
288  { -12, 90 }, { -18, 88 }, { -10, 73 }, { -9, 79 },
289  { -14, 86 }, { -10, 73 }, { -10, 70 }, { -10, 69 },
290  { -5, 66 }, { -9, 64 }, { -5, 58 }, { 2, 59 },
291  { 23, -13 }, { 26, -13 }, { 40, -15 }, { 49, -14 },
292  { 44, 3 }, { 45, 6 }, { 44, 34 }, { 33, 54 },
293  { 19, 82 }, { 21, -10 }, { 24, -11 }, { 28, -8 },
294  { 28, -1 }, { 29, 3 }, { 29, 9 }, { 35, 20 },
295  { 29, 36 }, { 14, 67 }, { -3, 75 }, { -1, 23 },
296  { 1, 34 }, { 1, 43 }, { 0, 54 }, { -2, 55 },
297  { 0, 61 }, { 1, 64 }, { 0, 68 }, { -9, 92 },
298  { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
299  { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
300  { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
301  { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
302  { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
303  { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
304  { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
305  { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
306  { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
307  { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
308  { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
309  { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
310  { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
311  { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
312  { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
313  { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
314  { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
315  { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
316  { 9, 64 }, { -12, 104 }, { -11, 97 }, { -16, 96 },
317  { -7, 88 }, { -8, 85 }, { -7, 85 }, { -9, 85 },
318  { -13, 88 }, { 4, 66 }, { -3, 77 }, { -3, 76 },
319  { -6, 76 }, { 10, 58 }, { -1, 76 }, { -1, 83 },
320  { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
321  { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
322  { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
323  { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
324  { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
325  { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
326  { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
327  { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
328  { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
329  { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
330  { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
331  { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
332  { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
333  { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
334  { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
335  { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
336  { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
337  { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
338  { -12, 109 }, { 36, -35 }, { 36, -34 }, { 32, -26 },
339  { 37, -30 }, { 44, -32 }, { 34, -18 }, { 34, -15 },
340  { 40, -15 }, { 33, -7 }, { 35, -5 }, { 33, 0 },
341  { 38, 2 }, { 33, 13 }, { 23, 35 }, { 13, 58 },
342  { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
343  { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
344  { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
345  { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
346  { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
347  { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
348  { -4, 65 }, { -12, 73 }, { -8, 76 }, { -7, 80 },
349  { -9, 88 }, { -17, 110 }, { -3, 71 }, { -6, 42 },
350  { -5, 50 }, { -3, 54 }, { -2, 62 }, { 0, 58 },
351  { 1, 63 }, { -2, 72 }, { -1, 74 }, { -9, 91 },
352  { -5, 67 }, { -5, 27 }, { -3, 39 }, { -2, 44 },
353  { 0, 46 }, { -16, 64 }, { -8, 68 }, { -10, 78 },
354  { -6, 77 }, { -10, 86 }, { -12, 92 }, { -15, 55 },
355  { -10, 60 }, { -6, 62 }, { -4, 65 }, { -12, 73 },
356  { -8, 76 }, { -7, 80 }, { -9, 88 }, { -17, 110 },
357  { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
358  { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 },
359  { -3, 70 }, { -8, 93 }, { -10, 90 }, { -30, 127 }
360 };
361 
362 static const int8_t cabac_context_init_PB[3][1024][2] =
363 {
364  /* i_cabac_init_idc == 0 */
365  {
366  /* 0 - 10 */
367  { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
368  { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
369  { -6, 53 }, { -1, 54 }, { 7, 51 },
370 
371  /* 11 - 23 */
372  { 23, 33 }, { 23, 2 }, { 21, 0 }, { 1, 9 },
373  { 0, 49 }, { -37, 118 }, { 5, 57 }, { -13, 78 },
374  { -11, 65 }, { 1, 62 }, { 12, 49 }, { -4, 73 },
375  { 17, 50 },
376 
377  /* 24 - 39 */
378  { 18, 64 }, { 9, 43 }, { 29, 0 }, { 26, 67 },
379  { 16, 90 }, { 9, 104 }, { -46, 127 }, { -20, 104 },
380  { 1, 67 }, { -13, 78 }, { -11, 65 }, { 1, 62 },
381  { -6, 86 }, { -17, 95 }, { -6, 61 }, { 9, 45 },
382 
383  /* 40 - 53 */
384  { -3, 69 }, { -6, 81 }, { -11, 96 }, { 6, 55 },
385  { 7, 67 }, { -5, 86 }, { 2, 88 }, { 0, 58 },
386  { -3, 76 }, { -10, 94 }, { 5, 54 }, { 4, 69 },
387  { -3, 81 }, { 0, 88 },
388 
389  /* 54 - 59 */
390  { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
391  { -7, 72 }, { 1, 58 },
392 
393  /* 60 - 69 */
394  { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
395  { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
396  { 13, 41 }, { 3, 62 },
397 
398  /* 70 - 87 */
399  { 0, 45 }, { -4, 78 }, { -3, 96 }, { -27, 126 },
400  { -28, 98 }, { -25, 101 }, { -23, 67 }, { -28, 82 },
401  { -20, 94 }, { -16, 83 }, { -22, 110 }, { -21, 91 },
402  { -18, 102 }, { -13, 93 }, { -29, 127 }, { -7, 92 },
403  { -5, 89 }, { -7, 96 }, { -13, 108 }, { -3, 46 },
404  { -1, 65 }, { -1, 57 }, { -9, 93 }, { -3, 74 },
405  { -9, 92 }, { -8, 87 }, { -23, 126 }, { 5, 54 },
406  { 6, 60 }, { 6, 59 }, { 6, 69 }, { -1, 48 },
407  { 0, 68 }, { -4, 69 }, { -8, 88 },
408 
409  /* 105 -> 165 */
410  { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
411  { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
412  { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
413  { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
414  { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
415  { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
416  { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
417  { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
418  { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
419  { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
420  { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
421  { 3, 64 }, { 1, 61 }, { 9, 63 }, { 7, 50 },
422  { 16, 39 }, { 5, 44 }, { 4, 52 }, { 11, 48 },
423  { -5, 60 }, { -1, 59 }, { 0, 59 }, { 22, 33 },
424  { 5, 44 }, { 14, 43 }, { -1, 78 }, { 0, 60 },
425  { 9, 69 },
426 
427  /* 166 - 226 */
428  { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
429  { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
430  { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
431  { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
432  { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
433  { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
434  { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
435  { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
436  { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
437  { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
438  { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
439  { 1, 67 }, { 5, 59 }, { 9, 67 }, { 16, 30 },
440  { 18, 32 }, { 18, 35 }, { 22, 29 }, { 24, 31 },
441  { 23, 38 }, { 18, 43 }, { 20, 41 }, { 11, 63 },
442  { 9, 59 }, { 9, 64 }, { -1, 94 }, { -2, 89 },
443  { -9, 108 },
444 
445  /* 227 - 275 */
446  { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
447  { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
448  { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
449  { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
450  { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
451  { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
452  { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
453  { -3, 74 }, { -10, 90 }, { 0, 70 }, { -4, 29 },
454  { 5, 31 }, { 7, 42 }, { 1, 59 }, { -2, 58 },
455  { -3, 72 }, { -3, 81 }, { -11, 97 }, { 0, 58 },
456  { 8, 5 }, { 10, 14 }, { 14, 18 }, { 13, 27 },
457  { 2, 40 }, { 0, 58 }, { -3, 70 }, { -6, 79 },
458  { -8, 85 },
459 
460  /* 276 a bit special (not used, bypass is used instead) */
461  { 0, 0 },
462 
463  /* 277 - 337 */
464  { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
465  { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
466  { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
467  { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
468  { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
469  { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
470  { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
471  { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
472  { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
473  { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
474  { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
475  { -2, 69 }, { -2, 59 }, { 6, 70 }, { 10, 44 },
476  { 9, 31 }, { 12, 43 }, { 3, 53 }, { 14, 34 },
477  { 10, 38 }, { -3, 52 }, { 13, 40 }, { 17, 32 },
478  { 7, 44 }, { 7, 38 }, { 13, 50 }, { 10, 57 },
479  { 26, 43 },
480 
481  /* 338 - 398 */
482  { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
483  { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
484  { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
485  { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
486  { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
487  { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
488  { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
489  { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
490  { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
491  { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
492  { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
493  { 8, 60 }, { 6, 63 }, { 17, 65 }, { 21, 24 },
494  { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 },
495  { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 },
496  { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 },
497  { 11, 86 },
498 
499  /* 399 - 435 */
500  { 12, 40 }, { 11, 51 }, { 14, 59 },
501  { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
502  { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
503  { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
504  { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 },
505  { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 },
506  { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 },
507  { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
508  { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
509  { -8, 66 }, { -8, 76 },
510 
511  /* 436 - 459 */
512  { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
513  { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
514  { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
515  { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 },
516  { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
517  { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
518 
519  /* 460 - 1024 */
520  { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
521  { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
522  { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
523  { -7, 92 }, { -5, 89 }, { -7, 96 }, { -13, 108 },
524  { -3, 46 }, { -1, 65 }, { -1, 57 }, { -9, 93 },
525  { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
526  { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
527  { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
528  { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
529  { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
530  { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
531  { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
532  { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
533  { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
534  { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
535  { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
536  { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
537  { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
538  { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
539  { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
540  { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
541  { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
542  { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
543  { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
544  { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
545  { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
546  { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
547  { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
548  { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
549  { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
550  { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
551  { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
552  { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
553  { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
554  { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
555  { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
556  { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
557  { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
558  { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
559  { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
560  { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
561  { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
562  { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
563  { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
564  { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
565  { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
566  { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
567  { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
568  { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
569  { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
570  { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
571  { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
572  { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
573  { -16, 66 }, { -22, 65 }, { -20, 63 }, { -5, 85 },
574  { -6, 81 }, { -10, 77 }, { -7, 81 }, { -17, 80 },
575  { -18, 73 }, { -4, 74 }, { -10, 83 }, { -9, 71 },
576  { -9, 67 }, { -1, 61 }, { -8, 66 }, { -14, 66 },
577  { 0, 59 }, { 2, 59 }, { 9, -2 }, { 26, -9 },
578  { 33, -9 }, { 39, -7 }, { 41, -2 }, { 45, 3 },
579  { 49, 9 }, { 45, 27 }, { 36, 59 }, { 21, -13 },
580  { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
581  { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
582  { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
583  { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
584  { -8, 66 }, { -8, 76 }, { -4, 79 }, { -7, 71 },
585  { -5, 69 }, { -9, 70 }, { -8, 66 }, { -10, 68 },
586  { -19, 73 }, { -12, 69 }, { -16, 70 }, { -15, 67 },
587  { -20, 62 }, { -19, 70 }, { -16, 66 }, { -22, 65 },
588  { -20, 63 }, { -5, 85 }, { -6, 81 }, { -10, 77 },
589  { -7, 81 }, { -17, 80 }, { -18, 73 }, { -4, 74 },
590  { -10, 83 }, { -9, 71 }, { -9, 67 }, { -1, 61 },
591  { -8, 66 }, { -14, 66 }, { 0, 59 }, { 2, 59 },
592  { 9, -2 }, { 26, -9 }, { 33, -9 }, { 39, -7 },
593  { 41, -2 }, { 45, 3 }, { 49, 9 }, { 45, 27 },
594  { 36, 59 }, { 21, -13 }, { 33, -14 }, { 39, -7 },
595  { 46, -2 }, { 51, 2 }, { 60, 6 }, { 61, 17 },
596  { 55, 34 }, { 42, 62 }, { -6, 66 }, { -7, 35 },
597  { -7, 42 }, { -8, 45 }, { -5, 48 }, { -12, 56 },
598  { -6, 60 }, { -5, 62 }, { -8, 66 }, { -8, 76 },
599  { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
600  { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
601  { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
602  { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
603  { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
604  { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
605  { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
606  { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
607  { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
608  { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
609  { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
610  { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
611  { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
612  { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
613  { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
614  { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
615  { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
616  { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
617  { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
618  { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
619  { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
620  { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
621  { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
622  { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
623  { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
624  { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
625  { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
626  { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
627  { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
628  { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
629  { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
630  { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
631  { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
632  { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
633  { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
634  { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
635  { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
636  { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
637  { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
638  { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
639  { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
640  { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
641  { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
642  { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
643  { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
644  { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
645  { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
646  { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
647  { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
648  { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
649  { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
650  { -3, 74 }, { -10, 90 }, { -6, 76 }, { -2, 44 },
651  { 0, 45 }, { 0, 52 }, { -3, 64 }, { -2, 59 },
652  { -4, 70 }, { -4, 75 }, { -8, 82 }, { -17, 102 },
653  { -9, 77 }, { 3, 24 }, { 0, 42 }, { 0, 48 },
654  { 0, 55 }, { -6, 59 }, { -7, 71 }, { -12, 83 },
655  { -11, 87 }, { -30, 119 }, { 1, 58 }, { -3, 29 },
656  { -1, 36 }, { 1, 38 }, { 2, 43 }, { -6, 55 },
657  { 0, 58 }, { 0, 64 }, { -3, 74 }, { -10, 90 },
658  { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
659  { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 },
660  { -3, 74 }, { -9, 92 }, { -8, 87 }, { -23, 126 }
661  },
662 
663  /* i_cabac_init_idc == 1 */
664  {
665  /* 0 - 10 */
666  { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
667  { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
668  { -6, 53 }, { -1, 54 }, { 7, 51 },
669 
670  /* 11 - 23 */
671  { 22, 25 }, { 34, 0 }, { 16, 0 }, { -2, 9 },
672  { 4, 41 }, { -29, 118 }, { 2, 65 }, { -6, 71 },
673  { -13, 79 }, { 5, 52 }, { 9, 50 }, { -3, 70 },
674  { 10, 54 },
675 
676  /* 24 - 39 */
677  { 26, 34 }, { 19, 22 }, { 40, 0 }, { 57, 2 },
678  { 41, 36 }, { 26, 69 }, { -45, 127 }, { -15, 101 },
679  { -4, 76 }, { -6, 71 }, { -13, 79 }, { 5, 52 },
680  { 6, 69 }, { -13, 90 }, { 0, 52 }, { 8, 43 },
681 
682  /* 40 - 53 */
683  { -2, 69 },{ -5, 82 },{ -10, 96 },{ 2, 59 },
684  { 2, 75 },{ -3, 87 },{ -3, 100 },{ 1, 56 },
685  { -3, 74 },{ -6, 85 },{ 0, 59 },{ -3, 81 },
686  { -7, 86 },{ -5, 95 },
687 
688  /* 54 - 59 */
689  { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
690  { -5, 72 },{ 0, 61 },
691 
692  /* 60 - 69 */
693  { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
694  { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
695  { 13, 41 }, { 3, 62 },
696 
697  /* 70 - 104 */
698  { 13, 15 }, { 7, 51 }, { 2, 80 }, { -39, 127 },
699  { -18, 91 }, { -17, 96 }, { -26, 81 }, { -35, 98 },
700  { -24, 102 }, { -23, 97 }, { -27, 119 }, { -24, 99 },
701  { -21, 110 }, { -18, 102 }, { -36, 127 }, { 0, 80 },
702  { -5, 89 }, { -7, 94 }, { -4, 92 }, { 0, 39 },
703  { 0, 65 }, { -15, 84 }, { -35, 127 }, { -2, 73 },
704  { -12, 104 }, { -9, 91 }, { -31, 127 }, { 3, 55 },
705  { 7, 56 }, { 7, 55 }, { 8, 61 }, { -3, 53 },
706  { 0, 68 }, { -7, 74 }, { -9, 88 },
707 
708  /* 105 -> 165 */
709  { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
710  { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
711  { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
712  { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
713  { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
714  { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
715  { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
716  { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
717  { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
718  { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
719  { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
720  { -4, 71 }, { 0, 58 }, { 7, 61 }, { 9, 41 },
721  { 18, 25 }, { 9, 32 }, { 5, 43 }, { 9, 47 },
722  { 0, 44 }, { 0, 51 }, { 2, 46 }, { 19, 38 },
723  { -4, 66 }, { 15, 38 }, { 12, 42 }, { 9, 34 },
724  { 0, 89 },
725 
726  /* 166 - 226 */
727  { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
728  { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
729  { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
730  { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
731  { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
732  { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
733  { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
734  { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
735  { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
736  { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
737  { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
738  { 0, 75 }, { 2, 72 }, { 8, 77 }, { 14, 35 },
739  { 18, 31 }, { 17, 35 }, { 21, 30 }, { 17, 45 },
740  { 20, 42 }, { 18, 45 }, { 27, 26 }, { 16, 54 },
741  { 7, 66 }, { 16, 56 }, { 11, 73 }, { 10, 67 },
742  { -10, 116 },
743 
744  /* 227 - 275 */
745  { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
746  { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
747  { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
748  { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
749  { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
750  { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
751  { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
752  { -5, 74 }, { -9, 86 }, { 2, 66 }, { -9, 34 },
753  { 1, 32 }, { 11, 31 }, { 5, 52 }, { -2, 55 },
754  { -2, 67 }, { 0, 73 }, { -8, 89 }, { 3, 52 },
755  { 7, 4 }, { 10, 8 }, { 17, 8 }, { 16, 19 },
756  { 3, 37 }, { -1, 61 }, { -5, 73 }, { -1, 70 },
757  { -4, 78 },
758 
759  /* 276 a bit special (not used, bypass is used instead) */
760  { 0, 0 },
761 
762  /* 277 - 337 */
763  { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
764  { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
765  { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
766  { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
767  { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
768  { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
769  { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
770  { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
771  { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
772  { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
773  { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
774  { -1, 70 }, { -9, 72 }, { 14, 60 }, { 16, 37 },
775  { 0, 47 }, { 18, 35 }, { 11, 37 }, { 12, 41 },
776  { 10, 41 }, { 2, 48 }, { 12, 41 }, { 13, 41 },
777  { 0, 59 }, { 3, 50 }, { 19, 40 }, { 3, 66 },
778  { 18, 50 },
779 
780  /* 338 - 398 */
781  { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
782  { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
783  { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
784  { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
785  { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
786  { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
787  { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
788  { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
789  { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
790  { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
791  { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
792  { 12, 48 }, { 11, 49 }, { 26, 45 }, { 22, 22 },
793  { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 },
794  { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 },
795  { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 },
796  { 11, 83 },
797 
798  /* 399 - 435 */
799  { 25, 32 }, { 21, 49 }, { 21, 54 },
800  { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
801  { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
802  { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
803  { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 },
804  { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
805  { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
806  { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
807  { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
808  { -4, 67 }, { -7, 82 },
809 
810  /* 436 - 459 */
811  { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 },
812  { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 },
813  { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 },
814  { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 },
815  { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
816  { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
817 
818  /* 460 - 1024 */
819  { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
820  { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
821  { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
822  { 0, 80 }, { -5, 89 }, { -7, 94 }, { -4, 92 },
823  { 0, 39 }, { 0, 65 }, { -15, 84 }, { -35, 127 },
824  { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
825  { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
826  { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
827  { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
828  { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
829  { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
830  { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
831  { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
832  { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
833  { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
834  { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
835  { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
836  { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
837  { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
838  { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
839  { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
840  { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
841  { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
842  { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
843  { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
844  { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
845  { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
846  { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
847  { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
848  { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
849  { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
850  { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
851  { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
852  { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
853  { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
854  { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
855  { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
856  { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
857  { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
858  { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
859  { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
860  { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
861  { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
862  { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
863  { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
864  { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
865  { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
866  { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
867  { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
868  { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
869  { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
870  { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
871  { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
872  { -14, 66 }, { 0, 59 }, { 2, 59 }, { -3, 81 },
873  { -3, 76 }, { -7, 72 }, { -6, 78 }, { -12, 72 },
874  { -14, 68 }, { -3, 70 }, { -6, 76 }, { -5, 66 },
875  { -5, 62 }, { 0, 57 }, { -4, 61 }, { -9, 60 },
876  { 1, 54 }, { 2, 58 }, { 17, -10 }, { 32, -13 },
877  { 42, -9 }, { 49, -5 }, { 53, 0 }, { 64, 3 },
878  { 68, 10 }, { 66, 27 }, { 47, 57 }, { 17, -10 },
879  { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
880  { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
881  { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
882  { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
883  { -4, 67 }, { -7, 82 }, { -5, 85 }, { -6, 81 },
884  { -10, 77 }, { -7, 81 }, { -17, 80 }, { -18, 73 },
885  { -4, 74 }, { -10, 83 }, { -9, 71 }, { -9, 67 },
886  { -1, 61 }, { -8, 66 }, { -14, 66 }, { 0, 59 },
887  { 2, 59 }, { -3, 81 }, { -3, 76 }, { -7, 72 },
888  { -6, 78 }, { -12, 72 }, { -14, 68 }, { -3, 70 },
889  { -6, 76 }, { -5, 66 }, { -5, 62 }, { 0, 57 },
890  { -4, 61 }, { -9, 60 }, { 1, 54 }, { 2, 58 },
891  { 17, -10 }, { 32, -13 }, { 42, -9 }, { 49, -5 },
892  { 53, 0 }, { 64, 3 }, { 68, 10 }, { 66, 27 },
893  { 47, 57 }, { 17, -10 }, { 32, -13 }, { 42, -9 },
894  { 49, -5 }, { 53, 0 }, { 64, 3 }, { 68, 10 },
895  { 66, 27 }, { 47, 57 }, { -5, 71 }, { 0, 24 },
896  { -1, 36 }, { -2, 42 }, { -2, 52 }, { -9, 57 },
897  { -6, 63 }, { -4, 65 }, { -4, 67 }, { -7, 82 },
898  { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
899  { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
900  { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
901  { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
902  { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
903  { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
904  { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
905  { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
906  { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
907  { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
908  { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
909  { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
910  { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
911  { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
912  { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
913  { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
914  { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
915  { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
916  { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
917  { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
918  { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
919  { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
920  { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
921  { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
922  { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
923  { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
924  { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
925  { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
926  { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
927  { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
928  { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
929  { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
930  { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
931  { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
932  { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
933  { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
934  { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
935  { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
936  { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
937  { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
938  { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
939  { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
940  { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
941  { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
942  { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
943  { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
944  { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
945  { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
946  { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
947  { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
948  { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
949  { -5, 74 }, { -9, 86 }, { -23, 112 }, { -15, 71 },
950  { -7, 61 }, { 0, 53 }, { -5, 66 }, { -11, 77 },
951  { -9, 80 }, { -9, 84 }, { -10, 87 }, { -34, 127 },
952  { -21, 101 }, { -3, 39 }, { -5, 53 }, { -7, 61 },
953  { -11, 75 }, { -15, 77 }, { -17, 91 }, { -25, 107 },
954  { -25, 111 }, { -28, 122 }, { -11, 76 }, { -10, 44 },
955  { -10, 52 }, { -10, 57 }, { -9, 58 }, { -16, 72 },
956  { -7, 69 }, { -4, 69 }, { -5, 74 }, { -9, 86 },
957  { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
958  { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 },
959  { -2, 73 }, { -12, 104 }, { -9, 91 }, { -31, 127 }
960  },
961 
962  /* i_cabac_init_idc == 2 */
963  {
964  /* 0 - 10 */
965  { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
966  { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
967  { -6, 53 }, { -1, 54 }, { 7, 51 },
968 
969  /* 11 - 23 */
970  { 29, 16 }, { 25, 0 }, { 14, 0 }, { -10, 51 },
971  { -3, 62 }, { -27, 99 }, { 26, 16 }, { -4, 85 },
972  { -24, 102 }, { 5, 57 }, { 6, 57 }, { -17, 73 },
973  { 14, 57 },
974 
975  /* 24 - 39 */
976  { 20, 40 }, { 20, 10 }, { 29, 0 }, { 54, 0 },
977  { 37, 42 }, { 12, 97 }, { -32, 127 }, { -22, 117 },
978  { -2, 74 }, { -4, 85 }, { -24, 102 }, { 5, 57 },
979  { -6, 93 }, { -14, 88 }, { -6, 44 }, { 4, 55 },
980 
981  /* 40 - 53 */
982  { -11, 89 },{ -15, 103 },{ -21, 116 },{ 19, 57 },
983  { 20, 58 },{ 4, 84 },{ 6, 96 },{ 1, 63 },
984  { -5, 85 },{ -13, 106 },{ 5, 63 },{ 6, 75 },
985  { -3, 90 },{ -1, 101 },
986 
987  /* 54 - 59 */
988  { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
989  { -7, 50 },{ 1, 60 },
990 
991  /* 60 - 69 */
992  { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
993  { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
994  { 13, 41 }, { 3, 62 },
995 
996  /* 70 - 104 */
997  { 7, 34 }, { -9, 88 }, { -20, 127 }, { -36, 127 },
998  { -17, 91 }, { -14, 95 }, { -25, 84 }, { -25, 86 },
999  { -12, 89 }, { -17, 91 }, { -31, 127 }, { -14, 76 },
1000  { -18, 103 }, { -13, 90 }, { -37, 127 }, { 11, 80 },
1001  { 5, 76 }, { 2, 84 }, { 5, 78 }, { -6, 55 },
1002  { 4, 61 }, { -14, 83 }, { -37, 127 }, { -5, 79 },
1003  { -11, 104 }, { -11, 91 }, { -30, 127 }, { 0, 65 },
1004  { -2, 79 }, { 0, 72 }, { -4, 92 }, { -6, 56 },
1005  { 3, 68 }, { -8, 71 }, { -13, 98 },
1006 
1007  /* 105 -> 165 */
1008  { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1009  { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1010  { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1011  { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1012  { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1013  { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1014  { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1015  { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1016  { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1017  { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1018  { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1019  { 3, 65 }, { -7, 69 }, { 8, 77 }, { -10, 66 },
1020  { 3, 62 }, { -3, 68 }, { -20, 81 }, { 0, 30 },
1021  { 1, 7 }, { -3, 23 }, { -21, 74 }, { 16, 66 },
1022  { -23, 124 }, { 17, 37 }, { 44, -18 }, { 50, -34 },
1023  { -22, 127 },
1024 
1025  /* 166 - 226 */
1026  { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1027  { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1028  { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1029  { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1030  { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1031  { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1032  { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1033  { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1034  { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1035  { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1036  { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1037  { 20, 34 }, { 19, 31 }, { 27, 44 }, { 19, 16 },
1038  { 15, 36 }, { 15, 36 }, { 21, 28 }, { 25, 21 },
1039  { 30, 20 }, { 31, 12 }, { 27, 16 }, { 24, 42 },
1040  { 0, 93 }, { 14, 56 }, { 15, 57 }, { 26, 38 },
1041  { -24, 127 },
1042 
1043  /* 227 - 275 */
1044  { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1045  { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1046  { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1047  { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1048  { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1049  { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1050  { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1051  { -12, 92 }, { -18, 108 }, { -4, 79 }, { -22, 69 },
1052  { -16, 75 }, { -2, 58 }, { 1, 58 }, { -13, 78 },
1053  { -9, 83 }, { -4, 81 }, { -13, 99 }, { -13, 81 },
1054  { -6, 38 }, { -13, 62 }, { -6, 58 }, { -2, 59 },
1055  { -16, 73 }, { -10, 76 }, { -13, 86 }, { -9, 83 },
1056  { -10, 87 },
1057 
1058  /* 276 a bit special (not used, bypass is used instead) */
1059  { 0, 0 },
1060 
1061  /* 277 - 337 */
1062  { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1063  { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1064  { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1065  { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1066  { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1067  { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1068  { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1069  { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1070  { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1071  { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1072  { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1073  { -2, 76 }, { -18, 86 }, { 12, 70 }, { 5, 64 },
1074  { -12, 70 }, { 11, 55 }, { 5, 56 }, { 0, 69 },
1075  { 2, 65 }, { -6, 74 }, { 5, 54 }, { 7, 54 },
1076  { -6, 76 }, { -11, 82 }, { -2, 77 }, { -2, 77 },
1077  { 25, 42 },
1078 
1079  /* 338 - 398 */
1080  { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1081  { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1082  { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1083  { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1084  { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1085  { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1086  { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1087  { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1088  { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1089  { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1090  { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1091  { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 },
1092  { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 },
1093  { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 },
1094  { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 },
1095  { 25, 61 },
1096 
1097  /* 399 - 435 */
1098  { 21, 33 }, { 19, 50 }, { 17, 61 },
1099  { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1100  { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1101  { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1102  { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1103  { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1104  { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1105  { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1106  { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1107  { -6, 68 }, { -10, 79 },
1108 
1109  /* 436 - 459 */
1110  { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1111  { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1112  { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1113  { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
1114  { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1115  { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1116 
1117  /* 460 - 1024 */
1118  { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1119  { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1120  { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1121  { 11, 80 }, { 5, 76 }, { 2, 84 }, { 5, 78 },
1122  { -6, 55 }, { 4, 61 }, { -14, 83 }, { -37, 127 },
1123  { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1124  { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1125  { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1126  { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1127  { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1128  { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1129  { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1130  { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1131  { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1132  { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1133  { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1134  { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1135  { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
1136  { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
1137  { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
1138  { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
1139  { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
1140  { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
1141  { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
1142  { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
1143  { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
1144  { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
1145  { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
1146  { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1147  { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1148  { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1149  { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1150  { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1151  { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1152  { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1153  { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1154  { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1155  { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1156  { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1157  { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
1158  { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
1159  { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
1160  { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
1161  { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
1162  { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
1163  { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
1164  { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
1165  { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
1166  { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
1167  { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
1168  { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
1169  { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
1170  { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
1171  { -14, 59 }, { -9, 52 }, { -11, 68 }, { -3, 78 },
1172  { -8, 74 }, { -9, 72 }, { -10, 72 }, { -18, 75 },
1173  { -12, 71 }, { -11, 63 }, { -5, 70 }, { -17, 75 },
1174  { -14, 72 }, { -16, 67 }, { -8, 53 }, { -14, 59 },
1175  { -9, 52 }, { -11, 68 }, { 9, -2 }, { 30, -10 },
1176  { 31, -4 }, { 33, -1 }, { 33, 7 }, { 31, 12 },
1177  { 37, 23 }, { 31, 38 }, { 20, 64 }, { 9, -2 },
1178  { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
1179  { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
1180  { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
1181  { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
1182  { -6, 68 }, { -10, 79 }, { -3, 78 }, { -8, 74 },
1183  { -9, 72 }, { -10, 72 }, { -18, 75 }, { -12, 71 },
1184  { -11, 63 }, { -5, 70 }, { -17, 75 }, { -14, 72 },
1185  { -16, 67 }, { -8, 53 }, { -14, 59 }, { -9, 52 },
1186  { -11, 68 }, { -3, 78 }, { -8, 74 }, { -9, 72 },
1187  { -10, 72 }, { -18, 75 }, { -12, 71 }, { -11, 63 },
1188  { -5, 70 }, { -17, 75 }, { -14, 72 }, { -16, 67 },
1189  { -8, 53 }, { -14, 59 }, { -9, 52 }, { -11, 68 },
1190  { 9, -2 }, { 30, -10 }, { 31, -4 }, { 33, -1 },
1191  { 33, 7 }, { 31, 12 }, { 37, 23 }, { 31, 38 },
1192  { 20, 64 }, { 9, -2 }, { 30, -10 }, { 31, -4 },
1193  { 33, -1 }, { 33, 7 }, { 31, 12 }, { 37, 23 },
1194  { 31, 38 }, { 20, 64 }, { -9, 71 }, { -7, 37 },
1195  { -8, 44 }, { -11, 49 }, { -10, 56 }, { -12, 59 },
1196  { -8, 63 }, { -9, 67 }, { -6, 68 }, { -10, 79 },
1197  { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1198  { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1199  { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1200  { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1201  { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1202  { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1203  { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1204  { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1205  { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1206  { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1207  { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1208  { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
1209  { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
1210  { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
1211  { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
1212  { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
1213  { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
1214  { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
1215  { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
1216  { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
1217  { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
1218  { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
1219  { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1220  { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1221  { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1222  { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1223  { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1224  { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1225  { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1226  { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1227  { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1228  { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1229  { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1230  { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
1231  { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
1232  { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
1233  { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
1234  { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
1235  { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
1236  { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
1237  { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
1238  { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
1239  { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
1240  { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
1241  { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
1242  { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
1243  { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
1244  { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
1245  { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
1246  { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
1247  { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
1248  { -12, 92 }, { -18, 108 }, { -24, 115 }, { -22, 82 },
1249  { -9, 62 }, { 0, 53 }, { 0, 59 }, { -14, 85 },
1250  { -13, 89 }, { -13, 94 }, { -11, 92 }, { -29, 127 },
1251  { -21, 100 }, { -14, 57 }, { -12, 67 }, { -11, 71 },
1252  { -10, 77 }, { -21, 85 }, { -16, 88 }, { -23, 104 },
1253  { -15, 98 }, { -37, 127 }, { -10, 82 }, { -8, 48 },
1254  { -8, 61 }, { -8, 66 }, { -7, 70 }, { -14, 75 },
1255  { -10, 79 }, { -9, 83 }, { -12, 92 }, { -18, 108 },
1256  { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1257  { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 },
1258  { -5, 79 }, { -11, 104 }, { -11, 91 }, { -30, 127 }
1259  }
1260 };
1261 
1263  int i;
1264  const int8_t (*tab)[2];
1265  const int slice_qp = av_clip(h->qscale - 6*(h->sps.bit_depth_luma-8), 0, 51);
1266 
1269 
1270  /* calculate pre-state */
1271  for( i= 0; i < 1024; i++ ) {
1272  int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1273 
1274  pre^= pre>>31;
1275  if(pre > 124)
1276  pre= 124 + (pre&1);
1277 
1278  h->cabac_state[i] = pre;
1279  }
1280 }
1281 
1283  const long mbb_xy = h->mb_xy - 2L*h->mb_stride;
1284 
1285  unsigned long ctx = 0;
1286 
1287  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);
1288  ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
1289 
1290  return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
1291 }
1292 
1293 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
1294  uint8_t *state= &h->cabac_state[ctx_base];
1295  int mb_type;
1296 
1297  if(intra_slice){
1298  int ctx=0;
1300  ctx++;
1302  ctx++;
1303  if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
1304  return 0; /* I4x4 */
1305  state += 2;
1306  }else{
1307  if( get_cabac_noinline( &h->cabac, state ) == 0 )
1308  return 0; /* I4x4 */
1309  }
1310 
1311  if( get_cabac_terminate( &h->cabac ) )
1312  return 25; /* PCM */
1313 
1314  mb_type = 1; /* I16x16 */
1315  mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
1316  if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
1317  mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
1318  mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
1319  mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
1320  return mb_type;
1321 }
1322 
1323 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
1324  int mba_xy, mbb_xy;
1325  int ctx = 0;
1326 
1327  if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1328  int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1329  mba_xy = mb_xy - 1;
1330  if( (mb_y&1)
1331  && h->slice_table[mba_xy] == h->slice_num
1332  && MB_FIELD(h) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1333  mba_xy += h->mb_stride;
1334  if (MB_FIELD(h)) {
1335  mbb_xy = mb_xy - h->mb_stride;
1336  if( !(mb_y&1)
1337  && h->slice_table[mbb_xy] == h->slice_num
1338  && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1339  mbb_xy -= h->mb_stride;
1340  }else
1341  mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1342  }else{
1343  int mb_xy = h->mb_xy;
1344  mba_xy = mb_xy - 1;
1345  mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1346  }
1347 
1348  if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1349  ctx++;
1350  if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1351  ctx++;
1352 
1353  if( h->slice_type_nos == AV_PICTURE_TYPE_B )
1354  ctx += 13;
1355  return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
1356 }
1357 
1358 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
1359  int mode = 0;
1360 
1361  if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
1362  return pred_mode;
1363 
1364  mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
1365  mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
1366  mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
1367 
1368  return mode + ( mode >= pred_mode );
1369 }
1370 
1372  const int mba_xy = h->left_mb_xy[0];
1373  const int mbb_xy = h->top_mb_xy;
1374 
1375  int ctx = 0;
1376 
1377  /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1378  if( h->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0 )
1379  ctx++;
1380 
1381  if( h->top_type && h->chroma_pred_mode_table[mbb_xy] != 0 )
1382  ctx++;
1383 
1384  if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
1385  return 0;
1386 
1387  if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1388  return 1;
1389  if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1390  return 2;
1391  else
1392  return 3;
1393 }
1394 
1396  int cbp_b, cbp_a, ctx, cbp = 0;
1397 
1398  cbp_a = h->left_cbp;
1399  cbp_b = h->top_cbp;
1400 
1401  ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1402  cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
1403  ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
1404  cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
1405  ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
1406  cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
1407  ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
1408  cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
1409  return cbp;
1410 }
1412  int ctx;
1413  int cbp_a, cbp_b;
1414 
1415  cbp_a = (h->left_cbp>>4)&0x03;
1416  cbp_b = (h-> top_cbp>>4)&0x03;
1417 
1418  ctx = 0;
1419  if( cbp_a > 0 ) ctx++;
1420  if( cbp_b > 0 ) ctx += 2;
1421  if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
1422  return 0;
1423 
1424  ctx = 4;
1425  if( cbp_a == 2 ) ctx++;
1426  if( cbp_b == 2 ) ctx += 2;
1427  return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
1428 }
1429 
1431  if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
1432  return 0; /* 8x8 */
1433  if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
1434  return 1; /* 8x4 */
1435  if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
1436  return 2; /* 4x8 */
1437  return 3; /* 4x4 */
1438 }
1440  int type;
1441  if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
1442  return 0; /* B_Direct_8x8 */
1443  if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
1444  return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1445  type = 3;
1446  if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
1447  if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
1448  return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1449  type += 4;
1450  }
1451  type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
1452  type += get_cabac( &h->cabac, &h->cabac_state[39] );
1453  return type;
1454 }
1455 
1456 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
1457  int refa = h->ref_cache[list][scan8[n] - 1];
1458  int refb = h->ref_cache[list][scan8[n] - 8];
1459  int ref = 0;
1460  int ctx = 0;
1461 
1462  if( h->slice_type_nos == AV_PICTURE_TYPE_B) {
1463  if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1464  ctx++;
1465  if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1466  ctx += 2;
1467  } else {
1468  if( refa > 0 )
1469  ctx++;
1470  if( refb > 0 )
1471  ctx += 2;
1472  }
1473 
1474  while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
1475  ref++;
1476  ctx = (ctx>>2)+4;
1477  if(ref >= 32 /*h->ref_list[list]*/){
1478  return -1;
1479  }
1480  }
1481  return ref;
1482 }
1483 
1484 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
1485  int mvd;
1486 
1487  if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1488 // if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1489  *mvda= 0;
1490  return 0;
1491  }
1492 
1493  mvd= 1;
1494  ctxbase+= 3;
1495  while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
1496  if( mvd < 4 )
1497  ctxbase++;
1498  mvd++;
1499  }
1500 
1501  if( mvd >= 9 ) {
1502  int k = 3;
1503  while( get_cabac_bypass( &h->cabac ) ) {
1504  mvd += 1 << k;
1505  k++;
1506  if(k>24){
1507  av_log(h->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1508  return INT_MIN;
1509  }
1510  }
1511  while( k-- ) {
1512  mvd += get_cabac_bypass( &h->cabac )<<k;
1513  }
1514  *mvda=mvd < 70 ? mvd : 70;
1515  }else
1516  *mvda=mvd;
1517  return get_cabac_bypass_sign( &h->cabac, -mvd );
1518 }
1519 
1520 #define DECODE_CABAC_MB_MVD( h, list, n )\
1521 {\
1522  int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
1523  h->mvd_cache[list][scan8[n] - 8][0];\
1524  int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
1525  h->mvd_cache[list][scan8[n] - 8][1];\
1526 \
1527  mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
1528  my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
1529 }
1530 
1531 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int max_coeff, int is_dc ) {
1532  int nza, nzb;
1533  int ctx = 0;
1534  static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1535 
1536  if( is_dc ) {
1537  if( cat == 3 ) {
1538  idx -= CHROMA_DC_BLOCK_INDEX;
1539  nza = (h->left_cbp>>(6+idx))&0x01;
1540  nzb = (h-> top_cbp>>(6+idx))&0x01;
1541  } else {
1542  idx -= LUMA_DC_BLOCK_INDEX;
1543  nza = h->left_cbp&(0x100<<idx);
1544  nzb = h-> top_cbp&(0x100<<idx);
1545  }
1546  } else {
1547  nza = h->non_zero_count_cache[scan8[idx] - 1];
1548  nzb = h->non_zero_count_cache[scan8[idx] - 8];
1549  }
1550 
1551  if( nza > 0 )
1552  ctx++;
1553 
1554  if( nzb > 0 )
1555  ctx += 2;
1556 
1557  return base_ctx[cat] + ctx;
1558 }
1559 
1560 static av_always_inline void
1562  int cat, int n, const uint8_t *scantable,
1563  const uint32_t *qmul, int max_coeff,
1564  int is_dc, int chroma422)
1565 {
1566  static const int significant_coeff_flag_offset[2][14] = {
1567  { 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 },
1568  { 277+0, 277+15, 277+29, 277+44, 277+47, 436, 776+0, 776+15, 776+29, 675, 820+0, 820+15, 820+29, 733 }
1569  };
1570  static const int last_coeff_flag_offset[2][14] = {
1571  { 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 },
1572  { 338+0, 338+15, 338+29, 338+44, 338+47, 451, 864+0, 864+15, 864+29, 699, 908+0, 908+15, 908+29, 757 }
1573  };
1574  static const int coeff_abs_level_m1_offset[14] = {
1575  227+0, 227+10, 227+20, 227+30, 227+39, 426, 952+0, 952+10, 952+20, 708, 982+0, 982+10, 982+20, 766
1576  };
1577  static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1578  { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1579  4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1580  7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1581  12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1582  { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1583  6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1584  9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1585  9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1586  };
1587  static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1588  /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1589  * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1590  * map node ctx => cabac ctx for level=1 */
1591  static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1592  /* map node ctx => cabac ctx for level>1 */
1593  static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1594  { 5, 5, 5, 5, 6, 7, 8, 9 },
1595  { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1596  };
1597  static const uint8_t coeff_abs_level_transition[2][8] = {
1598  /* update node ctx after decoding a level=1 */
1599  { 1, 2, 3, 3, 4, 5, 6, 7 },
1600  /* update node ctx after decoding a level>1 */
1601  { 4, 4, 4, 4, 5, 6, 7, 7 }
1602  };
1603 
1604  int index[64];
1605 
1606  int av_unused last;
1607  int coeff_count = 0;
1608  int node_ctx = 0;
1609 
1610  uint8_t *significant_coeff_ctx_base;
1611  uint8_t *last_coeff_ctx_base;
1612  uint8_t *abs_level_m1_ctx_base;
1613 
1614 #if !ARCH_X86
1615 #define CABAC_ON_STACK
1616 #endif
1617 #ifdef CABAC_ON_STACK
1618 #define CC &cc
1619  CABACContext cc;
1620  cc.range = h->cabac.range;
1621  cc.low = h->cabac.low;
1622  cc.bytestream= h->cabac.bytestream;
1623 #if !UNCHECKED_BITSTREAM_READER
1625 #endif
1626 #else
1627 #define CC &h->cabac
1628 #endif
1629 
1630  significant_coeff_ctx_base = h->cabac_state
1631  + significant_coeff_flag_offset[MB_FIELD(h)][cat];
1632  last_coeff_ctx_base = h->cabac_state
1633  + last_coeff_flag_offset[MB_FIELD(h)][cat];
1634  abs_level_m1_ctx_base = h->cabac_state
1635  + coeff_abs_level_m1_offset[cat];
1636 
1637  if( !is_dc && max_coeff == 64 ) {
1638 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1639  for(last= 0; last < coefs; last++) { \
1640  uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1641  if( get_cabac( CC, sig_ctx )) { \
1642  uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1643  index[coeff_count++] = last; \
1644  if( get_cabac( CC, last_ctx ) ) { \
1645  last= max_coeff; \
1646  break; \
1647  } \
1648  } \
1649  }\
1650  if( last == max_coeff -1 ) {\
1651  index[coeff_count++] = last;\
1652  }
1653  const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(h)];
1654 #ifdef decode_significance
1655  coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1656  last_coeff_ctx_base, sig_off);
1657  } else {
1658  if (is_dc && chroma422) { // dc 422
1659  DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1660  } else {
1661  coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1662  last_coeff_ctx_base-significant_coeff_ctx_base);
1663  }
1664 #else
1665  DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1666  } else {
1667  if (is_dc && chroma422) { // dc 422
1668  DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1669  } else {
1670  DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1671  }
1672 #endif
1673  }
1674  av_assert2(coeff_count > 0);
1675 
1676  if( is_dc ) {
1677  if( cat == 3 )
1678  h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1679  else
1680  h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1681  h->non_zero_count_cache[scan8[n]] = coeff_count;
1682  } else {
1683  if( max_coeff == 64 )
1684  fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1685  else {
1686  av_assert2( cat == 1 || cat == 2 || cat == 4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1687  h->non_zero_count_cache[scan8[n]] = coeff_count;
1688  }
1689  }
1690 
1691 #define STORE_BLOCK(type) \
1692  do { \
1693  uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1694  \
1695  int j= scantable[index[--coeff_count]]; \
1696  \
1697  if( get_cabac( CC, ctx ) == 0 ) { \
1698  node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1699  if( is_dc ) { \
1700  ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1701  }else{ \
1702  ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1703  } \
1704  } else { \
1705  int coeff_abs = 2; \
1706  ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1707  node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1708 \
1709  while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1710  coeff_abs++; \
1711  } \
1712 \
1713  if( coeff_abs >= 15 ) { \
1714  int j = 0; \
1715  while(get_cabac_bypass( CC ) && j<30) { \
1716  j++; \
1717  } \
1718 \
1719  coeff_abs=1; \
1720  while( j-- ) { \
1721  coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1722  } \
1723  coeff_abs+= 14; \
1724  } \
1725 \
1726  if( is_dc ) { \
1727  ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1728  }else{ \
1729  ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1730  } \
1731  } \
1732  } while ( coeff_count );
1733 
1734  if (h->pixel_shift) {
1736  } else {
1737  STORE_BLOCK(int16_t)
1738  }
1739 #ifdef CABAC_ON_STACK
1740  h->cabac.range = cc.range ;
1741  h->cabac.low = cc.low ;
1742  h->cabac.bytestream= cc.bytestream;
1743 #endif
1744 
1745 }
1746 
1748  int16_t *block,
1749  int cat, int n,
1750  const uint8_t *scantable,
1751  int max_coeff)
1752 {
1753  decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1754 }
1755 
1757  int16_t *block,
1758  int cat, int n,
1759  const uint8_t *scantable,
1760  int max_coeff)
1761 {
1762  decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1763 }
1764 
1766  int16_t *block,
1767  int cat, int n,
1768  const uint8_t *scantable,
1769  const uint32_t *qmul,
1770  int max_coeff)
1771 {
1772  decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1773 }
1774 
1775 /* cat: 0-> DC 16x16 n = 0
1776  * 1-> AC 16x16 n = luma4x4idx
1777  * 2-> Luma4x4 n = luma4x4idx
1778  * 3-> DC Chroma n = iCbCr
1779  * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1780  * 5-> Luma8x8 n = 4 * luma8x8idx */
1781 
1782 /* Partially inline the CABAC residual decode: inline the coded block flag.
1783  * This has very little impact on binary size and improves performance
1784  * because it allows improved constant propagation into get_cabac_cbf_ctx,
1785  * as well as because most blocks have zero CBFs. */
1786 
1788  int16_t *block,
1789  int cat, int n,
1790  const uint8_t *scantable,
1791  int max_coeff)
1792 {
1793  /* read coded block flag */
1794  if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 1 ) ] ) == 0 ) {
1795  h->non_zero_count_cache[scan8[n]] = 0;
1796  return;
1797  }
1798  decode_cabac_residual_dc_internal( h, block, cat, n, scantable, max_coeff );
1799 }
1800 
1801 static av_always_inline void
1803  int cat, int n, const uint8_t *scantable,
1804  int max_coeff)
1805 {
1806  /* read coded block flag */
1807  if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, cat, n, max_coeff, 1)]) == 0) {
1808  h->non_zero_count_cache[scan8[n]] = 0;
1809  return;
1810  }
1811  decode_cabac_residual_dc_internal_422(h, block, cat, n, scantable, max_coeff);
1812 }
1813 
1815  int16_t *block,
1816  int cat, int n,
1817  const uint8_t *scantable,
1818  const uint32_t *qmul,
1819  int max_coeff)
1820 {
1821  /* read coded block flag */
1822  if( (cat != 5 || CHROMA444(h)) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 0 ) ] ) == 0 ) {
1823  if( max_coeff == 64 ) {
1824  fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1825  } else {
1826  h->non_zero_count_cache[scan8[n]] = 0;
1827  }
1828  return;
1829  }
1830  decode_cabac_residual_nondc_internal( h, block, cat, n, scantable, qmul, max_coeff );
1831 }
1832 
1833 static av_always_inline void decode_cabac_luma_residual( H264Context *h, const uint8_t *scan, const uint8_t *scan8x8, int pixel_shift, int mb_type, int cbp, int p )
1834 {
1835  static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1836  const uint32_t *qmul;
1837  int i8x8, i4x4;
1838  int qscale = p == 0 ? h->qscale : h->chroma_qp[p-1];
1839  if( IS_INTRA16x16( mb_type ) ) {
1840  AV_ZERO128(h->mb_luma_dc[p]+0);
1841  AV_ZERO128(h->mb_luma_dc[p]+8);
1842  AV_ZERO128(h->mb_luma_dc[p]+16);
1843  AV_ZERO128(h->mb_luma_dc[p]+24);
1844  decode_cabac_residual_dc(h, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1845 
1846  if( cbp&15 ) {
1847  qmul = h->dequant4_coeff[p][qscale];
1848  for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1849  const int index = 16*p + i4x4;
1850  decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1851  }
1852  } else {
1853  fill_rectangle(&h->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1854  }
1855  } else {
1856  int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1857  for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1858  if( cbp & (1<<i8x8) ) {
1859  if( IS_8x8DCT(mb_type) ) {
1860  const int index = 16*p + 4*i8x8;
1861  decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1862  scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1863  } else {
1864  qmul = h->dequant4_coeff[cqm][qscale];
1865  for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1866  const int index = 16*p + 4*i8x8 + i4x4;
1867 //START_TIMER
1868  decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1869 //STOP_TIMER("decode_residual")
1870  }
1871  }
1872  } else {
1873  fill_rectangle(&h->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1874  }
1875  }
1876  }
1877 }
1878 
1879 /**
1880  * Decode a macroblock.
1881  * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1882  */
1884  int mb_xy;
1885  int mb_type, partition_count, cbp = 0;
1886  int dct8x8_allowed= h->pps.transform_8x8_mode;
1887  int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1888  const int pixel_shift = h->pixel_shift;
1889  unsigned local_ref_count[2];
1890 
1891  mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
1892 
1893  tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
1894  if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
1895  int skip;
1896  /* a skipped mb needs the aff flag from the following mb */
1897  if (FRAME_MBAFF(h) && (h->mb_y & 1) == 1 && h->prev_mb_skipped)
1898  skip = h->next_mb_skipped;
1899  else
1900  skip = decode_cabac_mb_skip( h, h->mb_x, h->mb_y );
1901  /* read skip flags */
1902  if( skip ) {
1903  if (FRAME_MBAFF(h) && (h->mb_y & 1) == 0) {
1905  h->next_mb_skipped = decode_cabac_mb_skip( h, h->mb_x, h->mb_y+1 );
1906  if(!h->next_mb_skipped)
1908  }
1909 
1910  decode_mb_skip(h);
1911 
1912  h->cbp_table[mb_xy] = 0;
1913  h->chroma_pred_mode_table[mb_xy] = 0;
1914  h->last_qscale_diff = 0;
1915 
1916  return 0;
1917 
1918  }
1919  }
1920  if (FRAME_MBAFF(h)) {
1921  if( (h->mb_y&1) == 0 )
1922  h->mb_mbaff =
1924  }
1925 
1926  h->prev_mb_skipped = 0;
1927 
1928  fill_decode_neighbors(h, -(MB_FIELD(h)));
1929 
1930  if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
1931  int ctx = 0;
1933 
1934  if( !IS_DIRECT( h->left_type[LTOP]-1 ) )
1935  ctx++;
1936  if( !IS_DIRECT( h->top_type-1 ) )
1937  ctx++;
1938 
1939  if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1940  mb_type= 0; /* B_Direct_16x16 */
1941  }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1942  mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1943  }else{
1944  int bits;
1945  bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1946  bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1947  bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1948  bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1949  if( bits < 8 ){
1950  mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1951  }else if( bits == 13 ){
1952  mb_type= decode_cabac_intra_mb_type(h, 32, 0);
1953  goto decode_intra_mb;
1954  }else if( bits == 14 ){
1955  mb_type= 11; /* B_L1_L0_8x16 */
1956  }else if( bits == 15 ){
1957  mb_type= 22; /* B_8x8 */
1958  }else{
1959  bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1960  mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1961  }
1962  }
1963  partition_count= b_mb_type_info[mb_type].partition_count;
1964  mb_type= b_mb_type_info[mb_type].type;
1965  } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
1966  if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1967  /* P-type */
1968  if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1969  /* P_L0_D16x16, P_8x8 */
1970  mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1971  } else {
1972  /* P_L0_D8x16, P_L0_D16x8 */
1973  mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1974  }
1975  partition_count= p_mb_type_info[mb_type].partition_count;
1976  mb_type= p_mb_type_info[mb_type].type;
1977  } else {
1978  mb_type= decode_cabac_intra_mb_type(h, 17, 0);
1979  goto decode_intra_mb;
1980  }
1981  } else {
1982  mb_type= decode_cabac_intra_mb_type(h, 3, 1);
1983  if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
1984  mb_type--;
1986 decode_intra_mb:
1987  partition_count = 0;
1988  cbp= i_mb_type_info[mb_type].cbp;
1990  mb_type= i_mb_type_info[mb_type].type;
1991  }
1992  if(MB_FIELD(h))
1993  mb_type |= MB_TYPE_INTERLACED;
1994 
1995  h->slice_table[ mb_xy ]= h->slice_num;
1996 
1997  if(IS_INTRA_PCM(mb_type)) {
1998  const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
1999  h->sps.bit_depth_luma >> 3;
2000  const uint8_t *ptr;
2001 
2002  // We assume these blocks are very rare so we do not optimize it.
2003  // FIXME The two following lines get the bitstream position in the cabac
2004  // decode, I think it should be done by a function in cabac.h (or cabac.c).
2005  ptr= h->cabac.bytestream;
2006  if(h->cabac.low&0x1) ptr--;
2007  if(CABAC_BITS==16){
2008  if(h->cabac.low&0x1FF) ptr--;
2009  }
2010 
2011  // The pixels are stored in the same order as levels in h->mb array.
2012  if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
2013  return -1;
2014  h->intra_pcm_ptr = ptr;
2015  ptr += mb_size;
2016 
2017  ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
2018 
2019  // All blocks are present
2020  h->cbp_table[mb_xy] = 0xf7ef;
2021  h->chroma_pred_mode_table[mb_xy] = 0;
2022  // In deblocking, the quantizer is 0
2023  h->cur_pic.qscale_table[mb_xy] = 0;
2024  // All coeffs are present
2025  memset(h->non_zero_count[mb_xy], 16, 48);
2026  h->cur_pic.mb_type[mb_xy] = mb_type;
2027  h->last_qscale_diff = 0;
2028  return 0;
2029  }
2030 
2031  local_ref_count[0] = h->ref_count[0] << MB_MBAFF(h);
2032  local_ref_count[1] = h->ref_count[1] << MB_MBAFF(h);
2033 
2034  fill_decode_caches(h, mb_type);
2035 
2036  if( IS_INTRA( mb_type ) ) {
2037  int i, pred_mode;
2038  if( IS_INTRA4x4( mb_type ) ) {
2039  if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
2040  mb_type |= MB_TYPE_8x8DCT;
2041  for( i = 0; i < 16; i+=4 ) {
2042  int pred = pred_intra_mode( h, i );
2043  int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2044  fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
2045  }
2046  } else {
2047  for( i = 0; i < 16; i++ ) {
2048  int pred = pred_intra_mode( h, i );
2050 
2051  av_dlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2053  }
2054  }
2056  if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
2057  } else {
2059  if( h->intra16x16_pred_mode < 0 ) return -1;
2060  }
2061  if(decode_chroma){
2063  pred_mode = decode_cabac_mb_chroma_pre_mode( h );
2064 
2065  pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
2066  if( pred_mode < 0 ) return -1;
2067  h->chroma_pred_mode= pred_mode;
2068  } else {
2070  }
2071  } else if( partition_count == 4 ) {
2072  int i, j, sub_partition_count[4], list, ref[2][4];
2073 
2074  if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
2075  for( i = 0; i < 4; i++ ) {
2077  sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2079  }
2080  if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
2081  h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
2082  ff_h264_pred_direct_motion(h, &mb_type);
2083  h->ref_cache[0][scan8[4]] =
2084  h->ref_cache[1][scan8[4]] =
2085  h->ref_cache[0][scan8[12]] =
2086  h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2087  for( i = 0; i < 4; i++ )
2088  fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
2089  }
2090  } else {
2091  for( i = 0; i < 4; i++ ) {
2093  sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2095  }
2096  }
2097 
2098  for( list = 0; list < h->list_count; list++ ) {
2099  for( i = 0; i < 4; i++ ) {
2100  if(IS_DIRECT(h->sub_mb_type[i])) continue;
2101  if(IS_DIR(h->sub_mb_type[i], 0, list)){
2102  if (local_ref_count[list] > 1) {
2103  ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
2104  if (ref[list][i] >= (unsigned)local_ref_count[list]) {
2105  av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], local_ref_count[list]);
2106  return -1;
2107  }
2108  }else
2109  ref[list][i] = 0;
2110  } else {
2111  ref[list][i] = -1;
2112  }
2113  h->ref_cache[list][ scan8[4*i]+1 ]=
2114  h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
2115  }
2116  }
2117 
2118  if(dct8x8_allowed)
2119  dct8x8_allowed = get_dct8x8_allowed(h);
2120 
2121  for(list=0; list<h->list_count; list++){
2122  for(i=0; i<4; i++){
2123  h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ];
2124  if(IS_DIRECT(h->sub_mb_type[i])){
2125  fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2126  continue;
2127  }
2128 
2129  if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
2130  const int sub_mb_type= h->sub_mb_type[i];
2131  const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2132  for(j=0; j<sub_partition_count[i]; j++){
2133  int mpx, mpy;
2134  int mx, my;
2135  const int index= 4*i + block_width*j;
2136  int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
2137  uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2138  pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
2139  DECODE_CABAC_MB_MVD( h, list, index)
2140  tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2141 
2142  if(IS_SUB_8X8(sub_mb_type)){
2143  mv_cache[ 1 ][0]=
2144  mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2145  mv_cache[ 1 ][1]=
2146  mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2147 
2148  mvd_cache[ 1 ][0]=
2149  mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2150  mvd_cache[ 1 ][1]=
2151  mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2152  }else if(IS_SUB_8X4(sub_mb_type)){
2153  mv_cache[ 1 ][0]= mx;
2154  mv_cache[ 1 ][1]= my;
2155 
2156  mvd_cache[ 1 ][0]= mpx;
2157  mvd_cache[ 1 ][1]= mpy;
2158  }else if(IS_SUB_4X8(sub_mb_type)){
2159  mv_cache[ 8 ][0]= mx;
2160  mv_cache[ 8 ][1]= my;
2161 
2162  mvd_cache[ 8 ][0]= mpx;
2163  mvd_cache[ 8 ][1]= mpy;
2164  }
2165  mv_cache[ 0 ][0]= mx;
2166  mv_cache[ 0 ][1]= my;
2167 
2168  mvd_cache[ 0 ][0]= mpx;
2169  mvd_cache[ 0 ][1]= mpy;
2170  }
2171  }else{
2172  fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2173  fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2174  }
2175  }
2176  }
2177  } else if( IS_DIRECT(mb_type) ) {
2178  ff_h264_pred_direct_motion(h, &mb_type);
2179  fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2180  fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2181  dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2182  } else {
2183  int list, i;
2184  if(IS_16X16(mb_type)){
2185  for(list=0; list<h->list_count; list++){
2186  if(IS_DIR(mb_type, 0, list)){
2187  int ref;
2188  if (local_ref_count[list] > 1) {
2189  ref= decode_cabac_mb_ref(h, list, 0);
2190  if (ref >= (unsigned)local_ref_count[list]) {
2191  av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2192  return -1;
2193  }
2194  }else
2195  ref=0;
2196  fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2197  }
2198  }
2199  for(list=0; list<h->list_count; list++){
2200  if(IS_DIR(mb_type, 0, list)){
2201  int mx,my,mpx,mpy;
2202  pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
2203  DECODE_CABAC_MB_MVD( h, list, 0)
2204  tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2205 
2206  fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2207  fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2208  }
2209  }
2210  }
2211  else if(IS_16X8(mb_type)){
2212  for(list=0; list<h->list_count; list++){
2213  for(i=0; i<2; i++){
2214  if(IS_DIR(mb_type, i, list)){
2215  int ref;
2216  if (local_ref_count[list] > 1) {
2217  ref= decode_cabac_mb_ref( h, list, 8*i );
2218  if (ref >= (unsigned)local_ref_count[list]) {
2219  av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2220  return -1;
2221  }
2222  }else
2223  ref=0;
2224  fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2225  }else
2226  fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2227  }
2228  }
2229  for(list=0; list<h->list_count; list++){
2230  for(i=0; i<2; i++){
2231  if(IS_DIR(mb_type, i, list)){
2232  int mx,my,mpx,mpy;
2233  pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2234  DECODE_CABAC_MB_MVD( h, list, 8*i)
2235  tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2236 
2237  fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2238  fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2239  }else{
2240  fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2241  fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2242  }
2243  }
2244  }
2245  }else{
2246  av_assert2(IS_8X16(mb_type));
2247  for(list=0; list<h->list_count; list++){
2248  for(i=0; i<2; i++){
2249  if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2250  int ref;
2251  if (local_ref_count[list] > 1) {
2252  ref= decode_cabac_mb_ref( h, list, 4*i );
2253  if (ref >= (unsigned)local_ref_count[list]) {
2254  av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, local_ref_count[list]);
2255  return -1;
2256  }
2257  }else
2258  ref=0;
2259  fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2260  }else
2261  fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2262  }
2263  }
2264  for(list=0; list<h->list_count; list++){
2265  for(i=0; i<2; i++){
2266  if(IS_DIR(mb_type, i, list)){
2267  int mx,my,mpx,mpy;
2268  pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2269  DECODE_CABAC_MB_MVD( h, list, 4*i)
2270 
2271  tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2272  fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2273  fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2274  }else{
2275  fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2276  fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2277  }
2278  }
2279  }
2280  }
2281  }
2282 
2283  if( IS_INTER( mb_type ) ) {
2284  h->chroma_pred_mode_table[mb_xy] = 0;
2285  write_back_motion( h, mb_type );
2286  }
2287 
2288  if( !IS_INTRA16x16( mb_type ) ) {
2289  cbp = decode_cabac_mb_cbp_luma( h );
2290  if(decode_chroma)
2291  cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2292  } else {
2293  if (!decode_chroma && cbp>15) {
2294  av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2295  return AVERROR_INVALIDDATA;
2296  }
2297  }
2298 
2299  h->cbp_table[mb_xy] = h->cbp = cbp;
2300 
2301  if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2302  mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
2303  }
2304 
2305  /* It would be better to do this in fill_decode_caches, but we don't know
2306  * the transform mode of the current macroblock there. */
2307  if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2308  int i;
2309  uint8_t *nnz_cache = h->non_zero_count_cache;
2310  for (i = 0; i < 2; i++){
2311  if (h->left_type[LEFT(i)] && !IS_8x8DCT(h->left_type[LEFT(i)])){
2312  nnz_cache[3+8* 1 + 2*8*i]=
2313  nnz_cache[3+8* 2 + 2*8*i]=
2314  nnz_cache[3+8* 6 + 2*8*i]=
2315  nnz_cache[3+8* 7 + 2*8*i]=
2316  nnz_cache[3+8*11 + 2*8*i]=
2317  nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2318  }
2319  }
2320  if (h->top_type && !IS_8x8DCT(h->top_type)){
2321  uint32_t top_empty = CABAC(h) && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2322  AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2323  AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2324  AV_WN32A(&nnz_cache[4+8*10], top_empty);
2325  }
2326  }
2327  h->cur_pic.mb_type[mb_xy] = mb_type;
2328 
2329  if( cbp || IS_INTRA16x16( mb_type ) ) {
2330  const uint8_t *scan, *scan8x8;
2331  const uint32_t *qmul;
2332 
2333  if(IS_INTERLACED(mb_type)){
2334  scan8x8= h->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2335  scan= h->qscale ? h->field_scan : h->field_scan_q0;
2336  }else{
2337  scan8x8= h->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2338  scan= h->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2339  }
2340 
2341  // decode_cabac_mb_dqp
2342  if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2343  int val = 1;
2344  int ctx= 2;
2345  const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2346 
2347  while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2348  ctx= 3;
2349  val++;
2350  if(val > 2*max_qp){ //prevent infinite loop
2351  av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", h->mb_x, h->mb_y);
2352  return -1;
2353  }
2354  }
2355 
2356  if( val&0x01 )
2357  val= (val + 1)>>1 ;
2358  else
2359  val= -((val + 1)>>1);
2360  h->last_qscale_diff = val;
2361  h->qscale += val;
2362  if(((unsigned)h->qscale) > max_qp){
2363  if(h->qscale<0) h->qscale+= max_qp+1;
2364  else h->qscale-= max_qp+1;
2365  }
2366  h->chroma_qp[0] = get_chroma_qp(h, 0, h->qscale);
2367  h->chroma_qp[1] = get_chroma_qp(h, 1, h->qscale);
2368  }else
2369  h->last_qscale_diff=0;
2370 
2371  decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2372  if (CHROMA444(h)) {
2373  decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2374  decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2375  } else if (CHROMA422(h)) {
2376  if( cbp&0x30 ){
2377  int c;
2378  for (c = 0; c < 2; c++)
2379  decode_cabac_residual_dc_422(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2381  chroma422_dc_scan, 8);
2382  }
2383 
2384  if( cbp&0x20 ) {
2385  int c, i, i8x8;
2386  for( c = 0; c < 2; c++ ) {
2387  int16_t *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2388  qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2389  for (i8x8 = 0; i8x8 < 2; i8x8++) {
2390  for (i = 0; i < 4; i++) {
2391  const int index = 16 + 16 * c + 8*i8x8 + i;
2392  decode_cabac_residual_nondc(h, mb, 4, index, scan + 1, qmul, 15);
2393  mb += 16<<pixel_shift;
2394  }
2395  }
2396  }
2397  } else {
2398  fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2399  fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2400  }
2401  } else /* yuv420 */ {
2402  if( cbp&0x30 ){
2403  int c;
2404  for (c = 0; c < 2; c++)
2405  decode_cabac_residual_dc(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2406  }
2407 
2408  if( cbp&0x20 ) {
2409  int c, i;
2410  for( c = 0; c < 2; c++ ) {
2411  qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2412  for( i = 0; i < 4; i++ ) {
2413  const int index = 16 + 16 * c + i;
2414  decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2415  }
2416  }
2417  } else {
2418  fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2419  fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2420  }
2421  }
2422  } else {
2423  fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2424  fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2425  fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2426  h->last_qscale_diff = 0;
2427  }
2428 
2429  h->cur_pic.qscale_table[mb_xy] = h->qscale;
2431 
2432  return 0;
2433 }