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