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