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