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