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