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