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