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