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