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