tscc2: Fix an out of array access
[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 static av_always_inline void
1564 decode_cabac_residual_internal(H264Context *h, DCTELEM *block,
1565                                int cat, int n, const uint8_t *scantable,
1566                                const uint32_t *qmul, int max_coeff,
1567                                int is_dc, int chroma422)
1568 {
1569     static const int significant_coeff_flag_offset[2][14] = {
1570       { 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 },
1571       { 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 }
1572     };
1573     static const int last_coeff_flag_offset[2][14] = {
1574       { 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 },
1575       { 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 }
1576     };
1577     static const int coeff_abs_level_m1_offset[14] = {
1578         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
1579     };
1580     static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1581       { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1582         4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1583         7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1584        12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1585       { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1586         6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1587         9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1588         9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1589     };
1590     static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1591     /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1592      * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1593      * map node ctx => cabac ctx for level=1 */
1594     static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1595     /* map node ctx => cabac ctx for level>1 */
1596     static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1597         { 5, 5, 5, 5, 6, 7, 8, 9 },
1598         { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1599     };
1600     static const uint8_t coeff_abs_level_transition[2][8] = {
1601     /* update node ctx after decoding a level=1 */
1602         { 1, 2, 3, 3, 4, 5, 6, 7 },
1603     /* update node ctx after decoding a level>1 */
1604         { 4, 4, 4, 4, 5, 6, 7, 7 }
1605     };
1606
1607     int index[64];
1608
1609     int av_unused last;
1610     int coeff_count = 0;
1611     int node_ctx = 0;
1612
1613     uint8_t *significant_coeff_ctx_base;
1614     uint8_t *last_coeff_ctx_base;
1615     uint8_t *abs_level_m1_ctx_base;
1616
1617 #if !ARCH_X86
1618 #define CABAC_ON_STACK
1619 #endif
1620 #ifdef CABAC_ON_STACK
1621 #define CC &cc
1622     CABACContext cc;
1623     cc.range     = h->cabac.range;
1624     cc.low       = h->cabac.low;
1625     cc.bytestream= h->cabac.bytestream;
1626     cc.bytestream_end = h->cabac.bytestream_end;
1627 #else
1628 #define CC &h->cabac
1629 #endif
1630
1631     significant_coeff_ctx_base = h->cabac_state
1632         + significant_coeff_flag_offset[MB_FIELD][cat];
1633     last_coeff_ctx_base = h->cabac_state
1634         + last_coeff_flag_offset[MB_FIELD][cat];
1635     abs_level_m1_ctx_base = h->cabac_state
1636         + coeff_abs_level_m1_offset[cat];
1637
1638     if( !is_dc && max_coeff == 64 ) {
1639 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1640         for(last= 0; last < coefs; last++) { \
1641             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1642             if( get_cabac( CC, sig_ctx )) { \
1643                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1644                 index[coeff_count++] = last; \
1645                 if( get_cabac( CC, last_ctx ) ) { \
1646                     last= max_coeff; \
1647                     break; \
1648                 } \
1649             } \
1650         }\
1651         if( last == max_coeff -1 ) {\
1652             index[coeff_count++] = last;\
1653         }
1654         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
1655 #ifdef decode_significance
1656         coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1657                                                  last_coeff_ctx_base, sig_off);
1658     } else {
1659         if (is_dc && chroma422) { // dc 422
1660             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1661         } else {
1662             coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1663                                                  last_coeff_ctx_base-significant_coeff_ctx_base);
1664         }
1665 #else
1666         DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1667     } else {
1668         if (is_dc && chroma422) { // dc 422
1669             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1670         } else {
1671             DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1672         }
1673 #endif
1674     }
1675     assert(coeff_count > 0);
1676
1677     if( is_dc ) {
1678         if( cat == 3 )
1679             h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1680         else
1681             h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1682         h->non_zero_count_cache[scan8[n]] = coeff_count;
1683     } else {
1684         if( max_coeff == 64 )
1685             fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1686         else {
1687             assert( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1688             h->non_zero_count_cache[scan8[n]] = coeff_count;
1689         }
1690     }
1691
1692 #define STORE_BLOCK(type) \
1693     do { \
1694         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1695  \
1696         int j= scantable[index[--coeff_count]]; \
1697  \
1698         if( get_cabac( CC, ctx ) == 0 ) { \
1699             node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1700             if( is_dc ) { \
1701                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1702             }else{ \
1703                 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1704             } \
1705         } else { \
1706             int coeff_abs = 2; \
1707             ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1708             node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1709 \
1710             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1711                 coeff_abs++; \
1712             } \
1713 \
1714             if( coeff_abs >= 15 ) { \
1715                 int j = 0; \
1716                 while( get_cabac_bypass( CC ) ) { \
1717                     j++; \
1718                 } \
1719 \
1720                 coeff_abs=1; \
1721                 while( j-- ) { \
1722                     coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1723                 } \
1724                 coeff_abs+= 14; \
1725             } \
1726 \
1727             if( is_dc ) { \
1728                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1729             }else{ \
1730                 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1731             } \
1732         } \
1733     } while ( coeff_count );
1734
1735     if (h->pixel_shift) {
1736         STORE_BLOCK(int32_t)
1737     } else {
1738         STORE_BLOCK(int16_t)
1739     }
1740 #ifdef CABAC_ON_STACK
1741             h->cabac.range     = cc.range     ;
1742             h->cabac.low       = cc.low       ;
1743             h->cabac.bytestream= cc.bytestream;
1744 #endif
1745
1746 }
1747
1748 static void decode_cabac_residual_dc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
1749     decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1750 }
1751
1752 static void decode_cabac_residual_dc_internal_422(H264Context *h, DCTELEM *block,
1753                                                   int cat, int n, const uint8_t *scantable,
1754                                                   int max_coeff)
1755 {
1756     decode_cabac_residual_internal(h, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1757 }
1758
1759 static void decode_cabac_residual_nondc_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
1760     decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1761 }
1762
1763 /* cat: 0-> DC 16x16  n = 0
1764  *      1-> AC 16x16  n = luma4x4idx
1765  *      2-> Luma4x4   n = luma4x4idx
1766  *      3-> DC Chroma n = iCbCr
1767  *      4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1768  *      5-> Luma8x8   n = 4 * luma8x8idx */
1769
1770 /* Partially inline the CABAC residual decode: inline the coded block flag.
1771  * This has very little impact on binary size and improves performance
1772  * because it allows improved constant propagation into get_cabac_cbf_ctx,
1773  * as well as because most blocks have zero CBFs. */
1774
1775 static av_always_inline void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int max_coeff ) {
1776     /* read coded block flag */
1777     if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 1 ) ] ) == 0 ) {
1778         h->non_zero_count_cache[scan8[n]] = 0;
1779         return;
1780     }
1781     decode_cabac_residual_dc_internal( h, block, cat, n, scantable, max_coeff );
1782 }
1783
1784 static av_always_inline void
1785 decode_cabac_residual_dc_422(H264Context *h, DCTELEM *block,
1786                              int cat, int n, const uint8_t *scantable,
1787                              int max_coeff)
1788 {
1789     /* read coded block flag */
1790     if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, cat, n, max_coeff, 1)]) == 0) {
1791         h->non_zero_count_cache[scan8[n]] = 0;
1792         return;
1793     }
1794     decode_cabac_residual_dc_internal_422(h, block, cat, n, scantable, max_coeff);
1795 }
1796
1797 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 ) {
1798     /* read coded block flag */
1799     if( (cat != 5 || CHROMA444) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx( h, cat, n, max_coeff, 0 ) ] ) == 0 ) {
1800         if( max_coeff == 64 ) {
1801             fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1802         } else {
1803             h->non_zero_count_cache[scan8[n]] = 0;
1804         }
1805         return;
1806     }
1807     decode_cabac_residual_nondc_internal( h, block, cat, n, scantable, qmul, max_coeff );
1808 }
1809
1810 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 )
1811 {
1812     static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1813     const uint32_t *qmul;
1814     int i8x8, i4x4;
1815     MpegEncContext * const s = &h->s;
1816     int qscale = p == 0 ? s->qscale : h->chroma_qp[p-1];
1817     if( IS_INTRA16x16( mb_type ) ) {
1818         AV_ZERO128(h->mb_luma_dc[p]+0);
1819         AV_ZERO128(h->mb_luma_dc[p]+8);
1820         AV_ZERO128(h->mb_luma_dc[p]+16);
1821         AV_ZERO128(h->mb_luma_dc[p]+24);
1822         decode_cabac_residual_dc(h, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1823
1824         if( cbp&15 ) {
1825             qmul = h->dequant4_coeff[p][qscale];
1826             for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1827                 const int index = 16*p + i4x4;
1828                 decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1829             }
1830         } else {
1831             fill_rectangle(&h->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1832         }
1833     } else {
1834         int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1835         for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1836             if( cbp & (1<<i8x8) ) {
1837                 if( IS_8x8DCT(mb_type) ) {
1838                     const int index = 16*p + 4*i8x8;
1839                     decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1840                                                 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1841                 } else {
1842                     qmul = h->dequant4_coeff[cqm][qscale];
1843                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1844                         const int index = 16*p + 4*i8x8 + i4x4;
1845 //START_TIMER
1846                         decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1847 //STOP_TIMER("decode_residual")
1848                     }
1849                 }
1850             } else {
1851                 fill_rectangle(&h->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1852             }
1853         }
1854     }
1855 }
1856
1857 /**
1858  * Decode a macroblock.
1859  * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1860  */
1861 int ff_h264_decode_mb_cabac(H264Context *h) {
1862     MpegEncContext * const s = &h->s;
1863     int mb_xy;
1864     int mb_type, partition_count, cbp = 0;
1865     int dct8x8_allowed= h->pps.transform_8x8_mode;
1866     int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1867     const int pixel_shift = h->pixel_shift;
1868
1869     mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1870
1871     tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
1872     if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
1873         int skip;
1874         /* a skipped mb needs the aff flag from the following mb */
1875         if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
1876             skip = h->next_mb_skipped;
1877         else
1878             skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
1879         /* read skip flags */
1880         if( skip ) {
1881             if( FRAME_MBAFF && (s->mb_y&1)==0 ){
1882                 s->current_picture.f.mb_type[mb_xy] = MB_TYPE_SKIP;
1883                 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
1884                 if(!h->next_mb_skipped)
1885                     h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1886             }
1887
1888             decode_mb_skip(h);
1889
1890             h->cbp_table[mb_xy] = 0;
1891             h->chroma_pred_mode_table[mb_xy] = 0;
1892             h->last_qscale_diff = 0;
1893
1894             return 0;
1895
1896         }
1897     }
1898     if(FRAME_MBAFF){
1899         if( (s->mb_y&1) == 0 )
1900             h->mb_mbaff =
1901             h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1902     }
1903
1904     h->prev_mb_skipped = 0;
1905
1906     fill_decode_neighbors(h, -(MB_FIELD));
1907
1908     if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
1909         int ctx = 0;
1910         assert(h->slice_type_nos == AV_PICTURE_TYPE_B);
1911
1912         if( !IS_DIRECT( h->left_type[LTOP]-1 ) )
1913             ctx++;
1914         if( !IS_DIRECT( h->top_type-1 ) )
1915             ctx++;
1916
1917         if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1918             mb_type= 0; /* B_Direct_16x16 */
1919         }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1920             mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1921         }else{
1922             int bits;
1923             bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1924             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1925             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1926             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1927             if( bits < 8 ){
1928                 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1929             }else if( bits == 13 ){
1930                 mb_type= decode_cabac_intra_mb_type(h, 32, 0);
1931                 goto decode_intra_mb;
1932             }else if( bits == 14 ){
1933                 mb_type= 11; /* B_L1_L0_8x16 */
1934             }else if( bits == 15 ){
1935                 mb_type= 22; /* B_8x8 */
1936             }else{
1937                 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1938                 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1939             }
1940         }
1941             partition_count= b_mb_type_info[mb_type].partition_count;
1942             mb_type=         b_mb_type_info[mb_type].type;
1943     } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
1944         if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1945             /* P-type */
1946             if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1947                 /* P_L0_D16x16, P_8x8 */
1948                 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1949             } else {
1950                 /* P_L0_D8x16, P_L0_D16x8 */
1951                 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1952             }
1953             partition_count= p_mb_type_info[mb_type].partition_count;
1954             mb_type=         p_mb_type_info[mb_type].type;
1955         } else {
1956             mb_type= decode_cabac_intra_mb_type(h, 17, 0);
1957             goto decode_intra_mb;
1958         }
1959     } else {
1960         mb_type= decode_cabac_intra_mb_type(h, 3, 1);
1961         if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
1962             mb_type--;
1963         assert(h->slice_type_nos == AV_PICTURE_TYPE_I);
1964 decode_intra_mb:
1965         partition_count = 0;
1966         cbp= i_mb_type_info[mb_type].cbp;
1967         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
1968         mb_type= i_mb_type_info[mb_type].type;
1969     }
1970     if(MB_FIELD)
1971         mb_type |= MB_TYPE_INTERLACED;
1972
1973     h->slice_table[ mb_xy ]= h->slice_num;
1974
1975     if(IS_INTRA_PCM(mb_type)) {
1976         const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
1977                             h->sps.bit_depth_luma >> 3;
1978         const uint8_t *ptr;
1979
1980         // We assume these blocks are very rare so we do not optimize it.
1981         // FIXME The two following lines get the bitstream position in the cabac
1982         // decode, I think it should be done by a function in cabac.h (or cabac.c).
1983         ptr= h->cabac.bytestream;
1984         if(h->cabac.low&0x1) ptr--;
1985         if(CABAC_BITS==16){
1986             if(h->cabac.low&0x1FF) ptr--;
1987         }
1988
1989         // The pixels are stored in the same order as levels in h->mb array.
1990         if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
1991             return -1;
1992         memcpy(h->mb, ptr, mb_size); ptr+=mb_size;
1993
1994         ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
1995
1996         // All blocks are present
1997         h->cbp_table[mb_xy] = 0xf7ef;
1998         h->chroma_pred_mode_table[mb_xy] = 0;
1999         // In deblocking, the quantizer is 0
2000         s->current_picture.f.qscale_table[mb_xy] = 0;
2001         // All coeffs are present
2002         memset(h->non_zero_count[mb_xy], 16, 48);
2003         s->current_picture.f.mb_type[mb_xy] = mb_type;
2004         h->last_qscale_diff = 0;
2005         return 0;
2006     }
2007
2008     fill_decode_caches(h, mb_type);
2009
2010     if( IS_INTRA( mb_type ) ) {
2011         int i, pred_mode;
2012         if( IS_INTRA4x4( mb_type ) ) {
2013             if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
2014                 mb_type |= MB_TYPE_8x8DCT;
2015                 for( i = 0; i < 16; i+=4 ) {
2016                     int pred = pred_intra_mode( h, i );
2017                     int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2018                     fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
2019                 }
2020             } else {
2021                 for( i = 0; i < 16; i++ ) {
2022                     int pred = pred_intra_mode( h, i );
2023                     h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2024
2025                     av_dlog(s->avctx, "i4x4 pred=%d mode=%d\n", pred,
2026                             h->intra4x4_pred_mode_cache[scan8[i]]);
2027                 }
2028             }
2029             write_back_intra_pred_mode(h);
2030             if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
2031         } else {
2032             h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
2033             if( h->intra16x16_pred_mode < 0 ) return -1;
2034         }
2035         if(decode_chroma){
2036             h->chroma_pred_mode_table[mb_xy] =
2037             pred_mode                        = decode_cabac_mb_chroma_pre_mode( h );
2038
2039             pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
2040             if( pred_mode < 0 ) return -1;
2041             h->chroma_pred_mode= pred_mode;
2042         } else {
2043             h->chroma_pred_mode= DC_128_PRED8x8;
2044         }
2045     } else if( partition_count == 4 ) {
2046         int i, j, sub_partition_count[4], list, ref[2][4];
2047
2048         if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
2049             for( i = 0; i < 4; i++ ) {
2050                 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
2051                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2052                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2053             }
2054             if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
2055                           h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
2056                 ff_h264_pred_direct_motion(h, &mb_type);
2057                 h->ref_cache[0][scan8[4]] =
2058                 h->ref_cache[1][scan8[4]] =
2059                 h->ref_cache[0][scan8[12]] =
2060                 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2061                     for( i = 0; i < 4; i++ )
2062                         fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
2063             }
2064         } else {
2065             for( i = 0; i < 4; i++ ) {
2066                 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
2067                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2068                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2069             }
2070         }
2071
2072         for( list = 0; list < h->list_count; list++ ) {
2073                 for( i = 0; i < 4; i++ ) {
2074                     if(IS_DIRECT(h->sub_mb_type[i])) continue;
2075                     if(IS_DIR(h->sub_mb_type[i], 0, list)){
2076                         int rc = h->ref_count[list] << MB_MBAFF;
2077                         if (rc > 1) {
2078                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
2079                             if (ref[list][i] >= (unsigned) rc) {
2080                                 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2081                                 return -1;
2082                             }
2083                         }else
2084                             ref[list][i] = 0;
2085                     } else {
2086                         ref[list][i] = -1;
2087                     }
2088                                                        h->ref_cache[list][ scan8[4*i]+1 ]=
2089                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
2090                 }
2091         }
2092
2093         if(dct8x8_allowed)
2094             dct8x8_allowed = get_dct8x8_allowed(h);
2095
2096         for(list=0; list<h->list_count; list++){
2097             for(i=0; i<4; i++){
2098                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ];
2099                 if(IS_DIRECT(h->sub_mb_type[i])){
2100                     fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2101                     continue;
2102                 }
2103
2104                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
2105                     const int sub_mb_type= h->sub_mb_type[i];
2106                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2107                     for(j=0; j<sub_partition_count[i]; j++){
2108                         int mpx, mpy;
2109                         int mx, my;
2110                         const int index= 4*i + block_width*j;
2111                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
2112                         uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2113                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
2114                         DECODE_CABAC_MB_MVD( h, list, index)
2115                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2116
2117                         if(IS_SUB_8X8(sub_mb_type)){
2118                             mv_cache[ 1 ][0]=
2119                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2120                             mv_cache[ 1 ][1]=
2121                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2122
2123                             mvd_cache[ 1 ][0]=
2124                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2125                             mvd_cache[ 1 ][1]=
2126                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2127                         }else if(IS_SUB_8X4(sub_mb_type)){
2128                             mv_cache[ 1 ][0]= mx;
2129                             mv_cache[ 1 ][1]= my;
2130
2131                             mvd_cache[ 1 ][0]=  mpx;
2132                             mvd_cache[ 1 ][1]= mpy;
2133                         }else if(IS_SUB_4X8(sub_mb_type)){
2134                             mv_cache[ 8 ][0]= mx;
2135                             mv_cache[ 8 ][1]= my;
2136
2137                             mvd_cache[ 8 ][0]= mpx;
2138                             mvd_cache[ 8 ][1]= mpy;
2139                         }
2140                         mv_cache[ 0 ][0]= mx;
2141                         mv_cache[ 0 ][1]= my;
2142
2143                         mvd_cache[ 0 ][0]= mpx;
2144                         mvd_cache[ 0 ][1]= mpy;
2145                     }
2146                 }else{
2147                     fill_rectangle(h->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2148                     fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2149                 }
2150             }
2151         }
2152     } else if( IS_DIRECT(mb_type) ) {
2153         ff_h264_pred_direct_motion(h, &mb_type);
2154         fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2155         fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2156         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2157     } else {
2158         int list, i;
2159         if(IS_16X16(mb_type)){
2160             for(list=0; list<h->list_count; list++){
2161                 if(IS_DIR(mb_type, 0, list)){
2162                     int ref, rc = h->ref_count[list] << MB_MBAFF;
2163                     if (rc > 1) {
2164                         ref= decode_cabac_mb_ref(h, list, 0);
2165                         if (ref >= (unsigned) rc) {
2166                             av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2167                             return -1;
2168                         }
2169                     }else
2170                         ref=0;
2171                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2172                 }
2173             }
2174             for(list=0; list<h->list_count; list++){
2175                 if(IS_DIR(mb_type, 0, list)){
2176                     int mx,my,mpx,mpy;
2177                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
2178                     DECODE_CABAC_MB_MVD( h, list, 0)
2179                     tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2180
2181                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2182                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2183                 }
2184             }
2185         }
2186         else if(IS_16X8(mb_type)){
2187             for(list=0; list<h->list_count; list++){
2188                     for(i=0; i<2; i++){
2189                         if(IS_DIR(mb_type, i, list)){
2190                             int ref, rc = h->ref_count[list] << MB_MBAFF;
2191                             if (rc > 1) {
2192                                 ref= decode_cabac_mb_ref( h, list, 8*i );
2193                                 if (ref >= (unsigned) rc) {
2194                                     av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2195                                     return -1;
2196                                 }
2197                             }else
2198                                 ref=0;
2199                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2200                         }else
2201                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2202                     }
2203             }
2204             for(list=0; list<h->list_count; list++){
2205                 for(i=0; i<2; i++){
2206                     if(IS_DIR(mb_type, i, list)){
2207                         int mx,my,mpx,mpy;
2208                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2209                         DECODE_CABAC_MB_MVD( h, list, 8*i)
2210                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2211
2212                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2213                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2214                     }else{
2215                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2216                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2217                     }
2218                 }
2219             }
2220         }else{
2221             assert(IS_8X16(mb_type));
2222             for(list=0; list<h->list_count; list++){
2223                     for(i=0; i<2; i++){
2224                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2225                             int ref, rc = h->ref_count[list] << MB_MBAFF;
2226                             if (rc > 1) {
2227                                 ref= decode_cabac_mb_ref( h, list, 4*i );
2228                                 if (ref >= (unsigned) rc) {
2229                                     av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2230                                     return -1;
2231                                 }
2232                             }else
2233                                 ref=0;
2234                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2235                         }else
2236                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2237                     }
2238             }
2239             for(list=0; list<h->list_count; list++){
2240                 for(i=0; i<2; i++){
2241                     if(IS_DIR(mb_type, i, list)){
2242                         int mx,my,mpx,mpy;
2243                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2244                         DECODE_CABAC_MB_MVD( h, list, 4*i)
2245
2246                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
2247                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2248                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2249                     }else{
2250                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2251                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2252                     }
2253                 }
2254             }
2255         }
2256     }
2257
2258    if( IS_INTER( mb_type ) ) {
2259         h->chroma_pred_mode_table[mb_xy] = 0;
2260         write_back_motion( h, mb_type );
2261    }
2262
2263     if( !IS_INTRA16x16( mb_type ) ) {
2264         cbp  = decode_cabac_mb_cbp_luma( h );
2265         if(decode_chroma)
2266             cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2267     }
2268
2269     h->cbp_table[mb_xy] = h->cbp = cbp;
2270
2271     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2272         mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
2273     }
2274
2275     /* It would be better to do this in fill_decode_caches, but we don't know
2276      * the transform mode of the current macroblock there. */
2277     if (CHROMA444 && IS_8x8DCT(mb_type)){
2278         int i;
2279         uint8_t *nnz_cache = h->non_zero_count_cache;
2280         for (i = 0; i < 2; i++){
2281             if (h->left_type[LEFT(i)] && !IS_8x8DCT(h->left_type[LEFT(i)])){
2282                 nnz_cache[3+8* 1 + 2*8*i]=
2283                 nnz_cache[3+8* 2 + 2*8*i]=
2284                 nnz_cache[3+8* 6 + 2*8*i]=
2285                 nnz_cache[3+8* 7 + 2*8*i]=
2286                 nnz_cache[3+8*11 + 2*8*i]=
2287                 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2288             }
2289         }
2290         if (h->top_type && !IS_8x8DCT(h->top_type)){
2291             uint32_t top_empty = CABAC && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2292             AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2293             AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2294             AV_WN32A(&nnz_cache[4+8*10], top_empty);
2295         }
2296     }
2297     s->current_picture.f.mb_type[mb_xy] = mb_type;
2298
2299     if( cbp || IS_INTRA16x16( mb_type ) ) {
2300         const uint8_t *scan, *scan8x8;
2301         const uint32_t *qmul;
2302
2303         if(IS_INTERLACED(mb_type)){
2304             scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2305             scan= s->qscale ? h->field_scan : h->field_scan_q0;
2306         }else{
2307             scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2308             scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2309         }
2310
2311         // decode_cabac_mb_dqp
2312         if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2313             int val = 1;
2314             int ctx= 2;
2315             const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2316
2317             while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2318                 ctx= 3;
2319                 val++;
2320                 if(val > 2*max_qp){ //prevent infinite loop
2321                     av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
2322                     return -1;
2323                 }
2324             }
2325
2326             if( val&0x01 )
2327                 val=   (val + 1)>>1 ;
2328             else
2329                 val= -((val + 1)>>1);
2330             h->last_qscale_diff = val;
2331             s->qscale += val;
2332             if(((unsigned)s->qscale) > max_qp){
2333                 if(s->qscale<0) s->qscale+= max_qp+1;
2334                 else            s->qscale-= max_qp+1;
2335             }
2336             h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
2337             h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
2338         }else
2339             h->last_qscale_diff=0;
2340
2341         decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2342         if(CHROMA444){
2343             decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2344             decode_cabac_luma_residual(h, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2345         } else if (CHROMA422) {
2346             if( cbp&0x30 ){
2347                 int c;
2348                 for (c = 0; c < 2; c++)
2349                     decode_cabac_residual_dc_422(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2350                                                  CHROMA_DC_BLOCK_INDEX + c,
2351                                                  chroma422_dc_scan, 8);
2352             }
2353
2354             if( cbp&0x20 ) {
2355                 int c, i, i8x8;
2356                 for( c = 0; c < 2; c++ ) {
2357                     DCTELEM *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2358                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2359                     for (i8x8 = 0; i8x8 < 2; i8x8++) {
2360                         for (i = 0; i < 4; i++) {
2361                             const int index = 16 + 16 * c + 8*i8x8 + i;
2362                             decode_cabac_residual_nondc(h, mb, 4, index, scan + 1, qmul, 15);
2363                             mb += 16<<pixel_shift;
2364                         }
2365                     }
2366                 }
2367             } else {
2368                 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2369                 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2370             }
2371         } else /* yuv420 */ {
2372             if( cbp&0x30 ){
2373                 int c;
2374                 for (c = 0; c < 2; c++)
2375                     decode_cabac_residual_dc(h, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2376             }
2377
2378             if( cbp&0x20 ) {
2379                 int c, i;
2380                 for( c = 0; c < 2; c++ ) {
2381                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
2382                     for( i = 0; i < 4; i++ ) {
2383                         const int index = 16 + 16 * c + i;
2384                         decode_cabac_residual_nondc(h, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2385                     }
2386                 }
2387             } else {
2388                 fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2389                 fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2390             }
2391         }
2392     } else {
2393         fill_rectangle(&h->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2394         fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2395         fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2396         h->last_qscale_diff = 0;
2397     }
2398
2399     s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2400     write_back_non_zero_count(h);
2401
2402     return 0;
2403 }