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