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