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