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