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