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