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