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