]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264_cabac.c
7fa1ae6f2427b79ecc8c7a99078a34c595700800
[ffmpeg] / 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(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->sps.bit_depth_luma-8), 0, 51);
1269
1270     if( h->slice_type_nos == AV_PICTURE_TYPE_I ) tab = cabac_context_init_I;
1271     else                                 tab = cabac_context_init_PB[h->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         h->cabac_state[i] =  pre;
1282     }
1283 }
1284
1285 static int decode_cabac_field_decoding_flag(H264Context *h) {
1286     const long mbb_xy = h->mb_xy - 2L*h->mb_stride;
1287
1288     unsigned long ctx = 0;
1289
1290     ctx += h->mb_field_decoding_flag & !!h->mb_x; //for FMO:(s->current_picture.mb_type[mba_xy] >> 7) & (h->slice_table[mba_xy] == h->slice_num);
1291     ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == h->slice_num);
1292
1293     return get_cabac_noinline( &h->cabac, &(h->cabac_state+70)[ctx] );
1294 }
1295
1296 static int decode_cabac_intra_mb_type(H264Context *h, H264SliceContext *sl,
1297                                       int ctx_base, int intra_slice)
1298 {
1299     uint8_t *state= &h->cabac_state[ctx_base];
1300     int mb_type;
1301
1302     if(intra_slice){
1303         int ctx=0;
1304         if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1305             ctx++;
1306         if (sl->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1307             ctx++;
1308         if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
1309             return 0;   /* I4x4 */
1310         state += 2;
1311     }else{
1312         if( get_cabac_noinline( &h->cabac, state ) == 0 )
1313             return 0;   /* I4x4 */
1314     }
1315
1316     if( get_cabac_terminate( &h->cabac ) )
1317         return 25;  /* PCM */
1318
1319     mb_type = 1; /* I16x16 */
1320     mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
1321     if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
1322         mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
1323     mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
1324     mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
1325     return mb_type;
1326 }
1327
1328 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
1329     int mba_xy, mbb_xy;
1330     int ctx = 0;
1331
1332     if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1333         int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1334         mba_xy = mb_xy - 1;
1335         if( (mb_y&1)
1336             && h->slice_table[mba_xy] == h->slice_num
1337             && MB_FIELD(h) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1338             mba_xy += h->mb_stride;
1339         if (MB_FIELD(h)) {
1340             mbb_xy = mb_xy - h->mb_stride;
1341             if( !(mb_y&1)
1342                 && h->slice_table[mbb_xy] == h->slice_num
1343                 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1344                 mbb_xy -= h->mb_stride;
1345         }else
1346             mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1347     }else{
1348         int mb_xy = h->mb_xy;
1349         mba_xy = mb_xy - 1;
1350         mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1351     }
1352
1353     if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1354         ctx++;
1355     if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1356         ctx++;
1357
1358     if( h->slice_type_nos == AV_PICTURE_TYPE_B )
1359         ctx += 13;
1360     return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
1361 }
1362
1363 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
1364     int mode = 0;
1365
1366     if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
1367         return pred_mode;
1368
1369     mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
1370     mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
1371     mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
1372
1373     return mode + ( mode >= pred_mode );
1374 }
1375
1376 static int decode_cabac_mb_chroma_pre_mode(H264Context *h, H264SliceContext *sl)
1377 {
1378     const int mba_xy = sl->left_mb_xy[0];
1379     const int mbb_xy = sl->top_mb_xy;
1380
1381     int ctx = 0;
1382
1383     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1384     if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1385         ctx++;
1386
1387     if (sl->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0)
1388         ctx++;
1389
1390     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
1391         return 0;
1392
1393     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1394         return 1;
1395     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
1396         return 2;
1397     else
1398         return 3;
1399 }
1400
1401 static int decode_cabac_mb_cbp_luma( H264Context *h) {
1402     int cbp_b, cbp_a, ctx, cbp = 0;
1403
1404     cbp_a = h->left_cbp;
1405     cbp_b = h->top_cbp;
1406
1407     ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1408     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
1409     ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
1410     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
1411     ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
1412     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
1413     ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
1414     cbp += get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
1415     return cbp;
1416 }
1417 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
1418     int ctx;
1419     int cbp_a, cbp_b;
1420
1421     cbp_a = (h->left_cbp>>4)&0x03;
1422     cbp_b = (h-> top_cbp>>4)&0x03;
1423
1424     ctx = 0;
1425     if( cbp_a > 0 ) ctx++;
1426     if( cbp_b > 0 ) ctx += 2;
1427     if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
1428         return 0;
1429
1430     ctx = 4;
1431     if( cbp_a == 2 ) ctx++;
1432     if( cbp_b == 2 ) ctx += 2;
1433     return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
1434 }
1435
1436 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
1437     if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
1438         return 0;   /* 8x8 */
1439     if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
1440         return 1;   /* 8x4 */
1441     if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
1442         return 2;   /* 4x8 */
1443     return 3;       /* 4x4 */
1444 }
1445 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
1446     int type;
1447     if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
1448         return 0;   /* B_Direct_8x8 */
1449     if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
1450         return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1451     type = 3;
1452     if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
1453         if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
1454             return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1455         type += 4;
1456     }
1457     type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
1458     type +=   get_cabac( &h->cabac, &h->cabac_state[39] );
1459     return type;
1460 }
1461
1462 static int decode_cabac_mb_ref(H264Context *h, H264SliceContext *sl, int list, int n)
1463 {
1464     int refa = sl->ref_cache[list][scan8[n] - 1];
1465     int refb = sl->ref_cache[list][scan8[n] - 8];
1466     int ref  = 0;
1467     int ctx  = 0;
1468
1469     if( h->slice_type_nos == AV_PICTURE_TYPE_B) {
1470         if( refa > 0 && !(h->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1471             ctx++;
1472         if( refb > 0 && !(h->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1473             ctx += 2;
1474     } else {
1475         if( refa > 0 )
1476             ctx++;
1477         if( refb > 0 )
1478             ctx += 2;
1479     }
1480
1481     while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
1482         ref++;
1483         ctx = (ctx>>2)+4;
1484         if(ref >= 32 /*h->ref_list[list]*/){
1485             return -1;
1486         }
1487     }
1488     return ref;
1489 }
1490
1491 static int decode_cabac_mb_mvd( H264Context *h, int ctxbase, int amvd, int *mvda) {
1492     int mvd;
1493
1494     if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1495 //    if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1496         *mvda= 0;
1497         return 0;
1498     }
1499
1500     mvd= 1;
1501     ctxbase+= 3;
1502     while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase] ) ) {
1503         if( mvd < 4 )
1504             ctxbase++;
1505         mvd++;
1506     }
1507
1508     if( mvd >= 9 ) {
1509         int k = 3;
1510         while( get_cabac_bypass( &h->cabac ) ) {
1511             mvd += 1 << k;
1512             k++;
1513             if(k>24){
1514                 av_log(h->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1515                 return INT_MIN;
1516             }
1517         }
1518         while( k-- ) {
1519             mvd += get_cabac_bypass( &h->cabac )<<k;
1520         }
1521         *mvda=mvd < 70 ? mvd : 70;
1522     }else
1523         *mvda=mvd;
1524     return get_cabac_bypass_sign( &h->cabac, -mvd );
1525 }
1526
1527 #define DECODE_CABAC_MB_MVD( h,  list,  n )\
1528 {\
1529     int amvd0 = h->mvd_cache[list][scan8[n] - 1][0] +\
1530                 h->mvd_cache[list][scan8[n] - 8][0];\
1531     int amvd1 = h->mvd_cache[list][scan8[n] - 1][1] +\
1532                 h->mvd_cache[list][scan8[n] - 8][1];\
1533 \
1534     mx += decode_cabac_mb_mvd( h, 40, amvd0, &mpx );\
1535     my += decode_cabac_mb_mvd( h, 47, amvd1, &mpy );\
1536 }
1537
1538 static av_always_inline int get_cabac_cbf_ctx(H264Context *h, H264SliceContext *sl,
1539                                               int cat, int idx, int max_coeff,
1540                                               int is_dc)
1541 {
1542     int nza, nzb;
1543     int ctx = 0;
1544     static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1545
1546     if( is_dc ) {
1547         if( cat == 3 ) {
1548             idx -= CHROMA_DC_BLOCK_INDEX;
1549             nza = (h->left_cbp>>(6+idx))&0x01;
1550             nzb = (h-> top_cbp>>(6+idx))&0x01;
1551         } else {
1552             idx -= LUMA_DC_BLOCK_INDEX;
1553             nza = h->left_cbp&(0x100<<idx);
1554             nzb = h-> top_cbp&(0x100<<idx);
1555         }
1556     } else {
1557         nza = sl->non_zero_count_cache[scan8[idx] - 1];
1558         nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1559     }
1560
1561     if( nza > 0 )
1562         ctx++;
1563
1564     if( nzb > 0 )
1565         ctx += 2;
1566
1567     return base_ctx[cat] + ctx;
1568 }
1569
1570 static av_always_inline void
1571 decode_cabac_residual_internal(H264Context *h, H264SliceContext *sl,
1572                                int16_t *block,
1573                                int cat, int n, const uint8_t *scantable,
1574                                const uint32_t *qmul, int max_coeff,
1575                                int is_dc, int chroma422)
1576 {
1577     static const int significant_coeff_flag_offset[2][14] = {
1578       { 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 },
1579       { 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 }
1580     };
1581     static const int last_coeff_flag_offset[2][14] = {
1582       { 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 },
1583       { 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 }
1584     };
1585     static const int coeff_abs_level_m1_offset[14] = {
1586         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
1587     };
1588     static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1589       { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1590         4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1591         7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1592        12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1593       { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1594         6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1595         9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1596         9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1597     };
1598     static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1599     /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1600      * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1601      * map node ctx => cabac ctx for level=1 */
1602     static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1603     /* map node ctx => cabac ctx for level>1 */
1604     static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1605         { 5, 5, 5, 5, 6, 7, 8, 9 },
1606         { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1607     };
1608     static const uint8_t coeff_abs_level_transition[2][8] = {
1609     /* update node ctx after decoding a level=1 */
1610         { 1, 2, 3, 3, 4, 5, 6, 7 },
1611     /* update node ctx after decoding a level>1 */
1612         { 4, 4, 4, 4, 5, 6, 7, 7 }
1613     };
1614
1615     int index[64];
1616
1617     int last;
1618     int coeff_count = 0;
1619     int node_ctx = 0;
1620
1621     uint8_t *significant_coeff_ctx_base;
1622     uint8_t *last_coeff_ctx_base;
1623     uint8_t *abs_level_m1_ctx_base;
1624
1625 #if !ARCH_X86
1626 #define CABAC_ON_STACK
1627 #endif
1628 #ifdef CABAC_ON_STACK
1629 #define CC &cc
1630     CABACContext cc;
1631     cc.range     = h->cabac.range;
1632     cc.low       = h->cabac.low;
1633     cc.bytestream= h->cabac.bytestream;
1634     cc.bytestream_end = h->cabac.bytestream_end;
1635 #else
1636 #define CC &h->cabac
1637 #endif
1638
1639     significant_coeff_ctx_base = h->cabac_state
1640         + significant_coeff_flag_offset[MB_FIELD(h)][cat];
1641     last_coeff_ctx_base = h->cabac_state
1642         + last_coeff_flag_offset[MB_FIELD(h)][cat];
1643     abs_level_m1_ctx_base = h->cabac_state
1644         + coeff_abs_level_m1_offset[cat];
1645
1646     if( !is_dc && max_coeff == 64 ) {
1647 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1648         for(last= 0; last < coefs; last++) { \
1649             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1650             if( get_cabac( CC, sig_ctx )) { \
1651                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1652                 index[coeff_count++] = last; \
1653                 if( get_cabac( CC, last_ctx ) ) { \
1654                     last= max_coeff; \
1655                     break; \
1656                 } \
1657             } \
1658         }\
1659         if( last == max_coeff -1 ) {\
1660             index[coeff_count++] = last;\
1661         }
1662         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(h)];
1663 #ifdef decode_significance
1664         coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1665                                                  last_coeff_ctx_base, sig_off);
1666     } else {
1667         if (is_dc && chroma422) { // dc 422
1668             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1669         } else {
1670             coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1671                                                  last_coeff_ctx_base-significant_coeff_ctx_base);
1672         }
1673 #else
1674         DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
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             DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1680         }
1681 #endif
1682     }
1683     assert(coeff_count > 0);
1684
1685     if( is_dc ) {
1686         if( cat == 3 )
1687             h->cbp_table[h->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1688         else
1689             h->cbp_table[h->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1690         sl->non_zero_count_cache[scan8[n]] = coeff_count;
1691     } else {
1692         if( max_coeff == 64 )
1693             fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1694         else {
1695             assert( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1696             sl->non_zero_count_cache[scan8[n]] = coeff_count;
1697         }
1698     }
1699
1700 #define STORE_BLOCK(type) \
1701     do { \
1702         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1703  \
1704         int j= scantable[index[--coeff_count]]; \
1705  \
1706         if( get_cabac( CC, ctx ) == 0 ) { \
1707             node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1708             if( is_dc ) { \
1709                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1710             }else{ \
1711                 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1712             } \
1713         } else { \
1714             int coeff_abs = 2; \
1715             ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1716             node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1717 \
1718             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1719                 coeff_abs++; \
1720             } \
1721 \
1722             if( coeff_abs >= 15 ) { \
1723                 int j = 0; \
1724                 while (get_cabac_bypass(CC) && j < 30) { \
1725                     j++; \
1726                 } \
1727 \
1728                 coeff_abs=1; \
1729                 while( j-- ) { \
1730                     coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1731                 } \
1732                 coeff_abs+= 14; \
1733             } \
1734 \
1735             if( is_dc ) { \
1736                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1737             }else{ \
1738                 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1739             } \
1740         } \
1741     } while ( coeff_count );
1742
1743     if (h->pixel_shift) {
1744         STORE_BLOCK(int32_t)
1745     } else {
1746         STORE_BLOCK(int16_t)
1747     }
1748 #ifdef CABAC_ON_STACK
1749             h->cabac.range     = cc.range     ;
1750             h->cabac.low       = cc.low       ;
1751             h->cabac.bytestream= cc.bytestream;
1752 #endif
1753
1754 }
1755
1756 static av_noinline void decode_cabac_residual_dc_internal(H264Context *h,
1757                                                           H264SliceContext *sl,
1758                                                           int16_t *block,
1759                                                           int cat, int n,
1760                                                           const uint8_t *scantable,
1761                                                           int max_coeff)
1762 {
1763     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1764 }
1765
1766 static av_noinline void decode_cabac_residual_dc_internal_422(H264Context *h,
1767                                                               H264SliceContext *sl,
1768                                                               int16_t *block,
1769                                                               int cat, int n,
1770                                                               const uint8_t *scantable,
1771                                                               int max_coeff)
1772 {
1773     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1774 }
1775
1776 static av_noinline void decode_cabac_residual_nondc_internal(H264Context *h,
1777                                                              H264SliceContext *sl,
1778                                                              int16_t *block,
1779                                                              int cat, int n,
1780                                                              const uint8_t *scantable,
1781                                                              const uint32_t *qmul,
1782                                                              int max_coeff)
1783 {
1784     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1785 }
1786
1787 /* cat: 0-> DC 16x16  n = 0
1788  *      1-> AC 16x16  n = luma4x4idx
1789  *      2-> Luma4x4   n = luma4x4idx
1790  *      3-> DC Chroma n = iCbCr
1791  *      4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1792  *      5-> Luma8x8   n = 4 * luma8x8idx */
1793
1794 /* Partially inline the CABAC residual decode: inline the coded block flag.
1795  * This has very little impact on binary size and improves performance
1796  * because it allows improved constant propagation into get_cabac_cbf_ctx,
1797  * as well as because most blocks have zero CBFs. */
1798
1799 static av_always_inline void decode_cabac_residual_dc(H264Context *h,
1800                                                       H264SliceContext *sl,
1801                                                       int16_t *block,
1802                                                       int cat, int n,
1803                                                       const uint8_t *scantable,
1804                                                       int max_coeff)
1805 {
1806     /* read coded block flag */
1807     if( get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 1)]) == 0 ) {
1808         sl->non_zero_count_cache[scan8[n]] = 0;
1809         return;
1810     }
1811     decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1812 }
1813
1814 static av_always_inline void
1815 decode_cabac_residual_dc_422(H264Context *h, H264SliceContext *sl,
1816                              int16_t *block,
1817                              int cat, int n, const uint8_t *scantable,
1818                              int max_coeff)
1819 {
1820     /* read coded block flag */
1821     if (get_cabac(&h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 1)]) == 0) {
1822         sl->non_zero_count_cache[scan8[n]] = 0;
1823         return;
1824     }
1825     decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1826 }
1827
1828 static av_always_inline void decode_cabac_residual_nondc(H264Context *h,
1829                                                          H264SliceContext *sl,
1830                                                          int16_t *block,
1831                                                          int cat, int n,
1832                                                          const uint8_t *scantable,
1833                                                          const uint32_t *qmul,
1834                                                          int max_coeff)
1835 {
1836     /* read coded block flag */
1837     if( (cat != 5 || CHROMA444(h)) && get_cabac( &h->cabac, &h->cabac_state[get_cabac_cbf_ctx(h, sl, cat, n, max_coeff, 0)]) == 0) {
1838         if( max_coeff == 64 ) {
1839             fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1840         } else {
1841             sl->non_zero_count_cache[scan8[n]] = 0;
1842         }
1843         return;
1844     }
1845     decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1846 }
1847
1848 static av_always_inline void decode_cabac_luma_residual(H264Context *h, H264SliceContext *sl,
1849                                                         const uint8_t *scan, const uint8_t *scan8x8,
1850                                                         int pixel_shift, int mb_type, int cbp, int p)
1851 {
1852     static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1853     const uint32_t *qmul;
1854     int i8x8, i4x4;
1855     int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1856     if( IS_INTRA16x16( mb_type ) ) {
1857         AV_ZERO128(h->mb_luma_dc[p]+0);
1858         AV_ZERO128(h->mb_luma_dc[p]+8);
1859         AV_ZERO128(h->mb_luma_dc[p]+16);
1860         AV_ZERO128(h->mb_luma_dc[p]+24);
1861         decode_cabac_residual_dc(h, sl, h->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1862
1863         if( cbp&15 ) {
1864             qmul = h->dequant4_coeff[p][qscale];
1865             for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1866                 const int index = 16*p + i4x4;
1867                 decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1868             }
1869         } else {
1870             fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1871         }
1872     } else {
1873         int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1874         for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1875             if( cbp & (1<<i8x8) ) {
1876                 if( IS_8x8DCT(mb_type) ) {
1877                     const int index = 16*p + 4*i8x8;
1878                     decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1879                                                 scan8x8, h->dequant8_coeff[cqm][qscale], 64);
1880                 } else {
1881                     qmul = h->dequant4_coeff[cqm][qscale];
1882                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1883                         const int index = 16*p + 4*i8x8 + i4x4;
1884 //START_TIMER
1885                         decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1886 //STOP_TIMER("decode_residual")
1887                     }
1888                 }
1889             } else {
1890                 fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1891             }
1892         }
1893     }
1894 }
1895
1896 /**
1897  * Decode a macroblock.
1898  * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1899  */
1900 int ff_h264_decode_mb_cabac(H264Context *h, H264SliceContext *sl)
1901 {
1902     int mb_xy;
1903     int mb_type, partition_count, cbp = 0;
1904     int dct8x8_allowed= h->pps.transform_8x8_mode;
1905     int decode_chroma = h->sps.chroma_format_idc == 1 || h->sps.chroma_format_idc == 2;
1906     const int pixel_shift = h->pixel_shift;
1907
1908     mb_xy = h->mb_xy = h->mb_x + h->mb_y*h->mb_stride;
1909
1910     tprintf(h->avctx, "pic:%d mb:%d/%d\n", h->frame_num, h->mb_x, h->mb_y);
1911     if( h->slice_type_nos != AV_PICTURE_TYPE_I ) {
1912         int skip;
1913         /* a skipped mb needs the aff flag from the following mb */
1914         if (FRAME_MBAFF(h) && (h->mb_y & 1) == 1 && sl->prev_mb_skipped)
1915             skip = sl->next_mb_skipped;
1916         else
1917             skip = decode_cabac_mb_skip( h, h->mb_x, h->mb_y );
1918         /* read skip flags */
1919         if( skip ) {
1920             if (FRAME_MBAFF(h) && (h->mb_y & 1) == 0) {
1921                 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1922                 sl->next_mb_skipped = decode_cabac_mb_skip( h, h->mb_x, h->mb_y+1 );
1923                 if(!sl->next_mb_skipped)
1924                     h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1925             }
1926
1927             decode_mb_skip(h, sl);
1928
1929             h->cbp_table[mb_xy] = 0;
1930             h->chroma_pred_mode_table[mb_xy] = 0;
1931             h->last_qscale_diff = 0;
1932
1933             return 0;
1934
1935         }
1936     }
1937     if (FRAME_MBAFF(h)) {
1938         if( (h->mb_y&1) == 0 )
1939             h->mb_mbaff =
1940             h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
1941     }
1942
1943     sl->prev_mb_skipped = 0;
1944
1945     fill_decode_neighbors(h, sl, -(MB_FIELD(h)));
1946
1947     if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
1948         int ctx = 0;
1949         assert(h->slice_type_nos == AV_PICTURE_TYPE_B);
1950
1951         if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1952             ctx++;
1953         if (!IS_DIRECT(sl->top_type - 1))
1954             ctx++;
1955
1956         if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) ){
1957             mb_type= 0; /* B_Direct_16x16 */
1958         }else if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
1959             mb_type= 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
1960         }else{
1961             int bits;
1962             bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
1963             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
1964             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
1965             bits+= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1966             if( bits < 8 ){
1967                 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1968             }else if( bits == 13 ){
1969                 mb_type = decode_cabac_intra_mb_type(h, sl, 32, 0);
1970                 goto decode_intra_mb;
1971             }else if( bits == 14 ){
1972                 mb_type= 11; /* B_L1_L0_8x16 */
1973             }else if( bits == 15 ){
1974                 mb_type= 22; /* B_8x8 */
1975             }else{
1976                 bits= ( bits<<1 ) + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
1977                 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1978             }
1979         }
1980             partition_count= b_mb_type_info[mb_type].partition_count;
1981             mb_type=         b_mb_type_info[mb_type].type;
1982     } else if( h->slice_type_nos == AV_PICTURE_TYPE_P ) {
1983         if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
1984             /* P-type */
1985             if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
1986                 /* P_L0_D16x16, P_8x8 */
1987                 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
1988             } else {
1989                 /* P_L0_D8x16, P_L0_D16x8 */
1990                 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
1991             }
1992             partition_count= p_mb_type_info[mb_type].partition_count;
1993             mb_type=         p_mb_type_info[mb_type].type;
1994         } else {
1995             mb_type = decode_cabac_intra_mb_type(h, sl, 17, 0);
1996             goto decode_intra_mb;
1997         }
1998     } else {
1999         mb_type = decode_cabac_intra_mb_type(h, sl, 3, 1);
2000         if(h->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2001             mb_type--;
2002         assert(h->slice_type_nos == AV_PICTURE_TYPE_I);
2003 decode_intra_mb:
2004         partition_count = 0;
2005         cbp= i_mb_type_info[mb_type].cbp;
2006         sl->intra16x16_pred_mode = i_mb_type_info[mb_type].pred_mode;
2007         mb_type= i_mb_type_info[mb_type].type;
2008     }
2009     if(MB_FIELD(h))
2010         mb_type |= MB_TYPE_INTERLACED;
2011
2012     h->slice_table[ mb_xy ]= h->slice_num;
2013
2014     if(IS_INTRA_PCM(mb_type)) {
2015         const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
2016                             h->sps.bit_depth_luma >> 3;
2017         const uint8_t *ptr;
2018
2019         // We assume these blocks are very rare so we do not optimize it.
2020         // FIXME The two following lines get the bitstream position in the cabac
2021         // decode, I think it should be done by a function in cabac.h (or cabac.c).
2022         ptr= h->cabac.bytestream;
2023         if(h->cabac.low&0x1) ptr--;
2024         if(CABAC_BITS==16){
2025             if(h->cabac.low&0x1FF) ptr--;
2026         }
2027
2028         // The pixels are stored in the same order as levels in h->mb array.
2029         if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
2030             return -1;
2031         h->intra_pcm_ptr = ptr;
2032         ptr += mb_size;
2033
2034         ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
2035
2036         // All blocks are present
2037         h->cbp_table[mb_xy] = 0xf7ef;
2038         h->chroma_pred_mode_table[mb_xy] = 0;
2039         // In deblocking, the quantizer is 0
2040         h->cur_pic.qscale_table[mb_xy] = 0;
2041         // All coeffs are present
2042         memset(h->non_zero_count[mb_xy], 16, 48);
2043         h->cur_pic.mb_type[mb_xy] = mb_type;
2044         h->last_qscale_diff = 0;
2045         return 0;
2046     }
2047
2048     fill_decode_caches(h, sl, mb_type);
2049
2050     if( IS_INTRA( mb_type ) ) {
2051         int i, pred_mode;
2052         if( IS_INTRA4x4( mb_type ) ) {
2053             if( dct8x8_allowed && get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] ) ) {
2054                 mb_type |= MB_TYPE_8x8DCT;
2055                 for( i = 0; i < 16; i+=4 ) {
2056                     int pred = pred_intra_mode(h, sl, i);
2057                     int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
2058                     fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2059                 }
2060             } else {
2061                 for( i = 0; i < 16; i++ ) {
2062                     int pred = pred_intra_mode(h, sl, i);
2063                     sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(h, pred);
2064
2065                     av_dlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2066                             h->intra4x4_pred_mode_cache[scan8[i]]);
2067                 }
2068             }
2069             write_back_intra_pred_mode(h, sl);
2070             if (ff_h264_check_intra4x4_pred_mode(h, sl) < 0 ) return -1;
2071         } else {
2072             sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, sl, sl->intra16x16_pred_mode, 0);
2073             if (sl->intra16x16_pred_mode < 0) return -1;
2074         }
2075         if(decode_chroma){
2076             h->chroma_pred_mode_table[mb_xy] =
2077             pred_mode                        = decode_cabac_mb_chroma_pre_mode(h, sl);
2078
2079             pred_mode= ff_h264_check_intra_pred_mode(h, sl, pred_mode, 1 );
2080             if( pred_mode < 0 ) return -1;
2081             sl->chroma_pred_mode = pred_mode;
2082         } else {
2083             sl->chroma_pred_mode = DC_128_PRED8x8;
2084         }
2085     } else if( partition_count == 4 ) {
2086         int i, j, sub_partition_count[4], list, ref[2][4];
2087
2088         if( h->slice_type_nos == AV_PICTURE_TYPE_B ) {
2089             for( i = 0; i < 4; i++ ) {
2090                 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
2091                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2092                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2093             }
2094             if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
2095                           h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
2096                 ff_h264_pred_direct_motion(h, sl, &mb_type);
2097                 sl->ref_cache[0][scan8[4]] =
2098                 sl->ref_cache[1][scan8[4]] =
2099                 sl->ref_cache[0][scan8[12]] =
2100                 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2101                     for( i = 0; i < 4; i++ )
2102                         fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, (h->sub_mb_type[i]>>1)&0xFF, 1 );
2103             }
2104         } else {
2105             for( i = 0; i < 4; i++ ) {
2106                 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
2107                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
2108                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
2109             }
2110         }
2111
2112         for( list = 0; list < h->list_count; list++ ) {
2113                 for( i = 0; i < 4; i++ ) {
2114                     if(IS_DIRECT(h->sub_mb_type[i])) continue;
2115                     if(IS_DIR(h->sub_mb_type[i], 0, list)){
2116                         int rc = h->ref_count[list] << MB_MBAFF(h);
2117                         if (rc > 1) {
2118                             ref[list][i] = decode_cabac_mb_ref(h, sl, list, 4 * i);
2119                             if (ref[list][i] >= (unsigned) rc) {
2120                                 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2121                                 return -1;
2122                             }
2123                         }else
2124                             ref[list][i] = 0;
2125                     } else {
2126                         ref[list][i] = -1;
2127                     }
2128                     sl->ref_cache[list][scan8[4 * i] + 1] =
2129                     sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2130                 }
2131         }
2132
2133         if(dct8x8_allowed)
2134             dct8x8_allowed = get_dct8x8_allowed(h);
2135
2136         for(list=0; list<h->list_count; list++){
2137             for(i=0; i<4; i++){
2138                 sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2139                 if(IS_DIRECT(h->sub_mb_type[i])){
2140                     fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2141                     continue;
2142                 }
2143
2144                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
2145                     const int sub_mb_type= h->sub_mb_type[i];
2146                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2147                     for(j=0; j<sub_partition_count[i]; j++){
2148                         int mpx, mpy;
2149                         int mx, my;
2150                         const int index= 4*i + block_width*j;
2151                         int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2152                         uint8_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
2153                         pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2154                         DECODE_CABAC_MB_MVD( h, list, index)
2155                         tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2156
2157                         if(IS_SUB_8X8(sub_mb_type)){
2158                             mv_cache[ 1 ][0]=
2159                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2160                             mv_cache[ 1 ][1]=
2161                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2162
2163                             mvd_cache[ 1 ][0]=
2164                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2165                             mvd_cache[ 1 ][1]=
2166                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2167                         }else if(IS_SUB_8X4(sub_mb_type)){
2168                             mv_cache[ 1 ][0]= mx;
2169                             mv_cache[ 1 ][1]= my;
2170
2171                             mvd_cache[ 1 ][0]=  mpx;
2172                             mvd_cache[ 1 ][1]= mpy;
2173                         }else if(IS_SUB_4X8(sub_mb_type)){
2174                             mv_cache[ 8 ][0]= mx;
2175                             mv_cache[ 8 ][1]= my;
2176
2177                             mvd_cache[ 8 ][0]= mpx;
2178                             mvd_cache[ 8 ][1]= mpy;
2179                         }
2180                         mv_cache[ 0 ][0]= mx;
2181                         mv_cache[ 0 ][1]= my;
2182
2183                         mvd_cache[ 0 ][0]= mpx;
2184                         mvd_cache[ 0 ][1]= mpy;
2185                     }
2186                 }else{
2187                     fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2188                     fill_rectangle(h->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2189                 }
2190             }
2191         }
2192     } else if( IS_DIRECT(mb_type) ) {
2193         ff_h264_pred_direct_motion(h, sl, &mb_type);
2194         fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2195         fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2196         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
2197     } else {
2198         int list, i;
2199         if(IS_16X16(mb_type)){
2200             for(list=0; list<h->list_count; list++){
2201                 if(IS_DIR(mb_type, 0, list)){
2202                     int ref, rc = h->ref_count[list] << MB_MBAFF(h);
2203                     if (rc > 1) {
2204                         ref= decode_cabac_mb_ref(h, sl, list, 0);
2205                         if (ref >= (unsigned) rc) {
2206                             av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2207                             return -1;
2208                         }
2209                     }else
2210                         ref=0;
2211                     fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2212                 }
2213             }
2214             for(list=0; list<h->list_count; list++){
2215                 if(IS_DIR(mb_type, 0, list)){
2216                     int mx,my,mpx,mpy;
2217                     pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2218                     DECODE_CABAC_MB_MVD( h, list, 0)
2219                     tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2220
2221                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2222                     fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2223                 }
2224             }
2225         }
2226         else if(IS_16X8(mb_type)){
2227             for(list=0; list<h->list_count; list++){
2228                     for(i=0; i<2; i++){
2229                         if(IS_DIR(mb_type, i, list)){
2230                             int ref, rc = h->ref_count[list] << MB_MBAFF(h);
2231                             if (rc > 1) {
2232                                 ref= decode_cabac_mb_ref(h, sl, list, 8 * i);
2233                                 if (ref >= (unsigned) rc) {
2234                                     av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2235                                     return -1;
2236                                 }
2237                             }else
2238                                 ref=0;
2239                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2240                         }else
2241                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2242                     }
2243             }
2244             for(list=0; list<h->list_count; list++){
2245                 for(i=0; i<2; i++){
2246                     if(IS_DIR(mb_type, i, list)){
2247                         int mx,my,mpx,mpy;
2248                         pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2249                         DECODE_CABAC_MB_MVD( h, list, 8*i)
2250                         tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2251
2252                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2253                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2254                     }else{
2255                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2256                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2257                     }
2258                 }
2259             }
2260         }else{
2261             assert(IS_8X16(mb_type));
2262             for(list=0; list<h->list_count; list++){
2263                     for(i=0; i<2; i++){
2264                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2265                             int ref, rc = h->ref_count[list] << MB_MBAFF(h);
2266                             if (rc > 1) {
2267                                 ref= decode_cabac_mb_ref(h, sl, list, 4 * i);
2268                                 if (ref >= (unsigned) rc) {
2269                                     av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2270                                     return -1;
2271                                 }
2272                             }else
2273                                 ref=0;
2274                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2275                         }else
2276                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2277                     }
2278             }
2279             for(list=0; list<h->list_count; list++){
2280                 for(i=0; i<2; i++){
2281                     if(IS_DIR(mb_type, i, list)){
2282                         int mx,my,mpx,mpy;
2283                         pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2284                         DECODE_CABAC_MB_MVD( h, list, 4*i)
2285
2286                         tprintf(h->avctx, "final mv:%d %d\n", mx, my);
2287                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2288                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2289                     }else{
2290                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2291                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2292                     }
2293                 }
2294             }
2295         }
2296     }
2297
2298    if( IS_INTER( mb_type ) ) {
2299         h->chroma_pred_mode_table[mb_xy] = 0;
2300         write_back_motion(h, sl, mb_type);
2301    }
2302
2303     if( !IS_INTRA16x16( mb_type ) ) {
2304         cbp  = decode_cabac_mb_cbp_luma( h );
2305         if(decode_chroma)
2306             cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
2307     }
2308
2309     h->cbp_table[mb_xy] = h->cbp = cbp;
2310
2311     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2312         mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
2313     }
2314
2315     /* It would be better to do this in fill_decode_caches, but we don't know
2316      * the transform mode of the current macroblock there. */
2317     if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2318         int i;
2319         uint8_t *nnz_cache = sl->non_zero_count_cache;
2320         for (i = 0; i < 2; i++){
2321             if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2322                 nnz_cache[3+8* 1 + 2*8*i]=
2323                 nnz_cache[3+8* 2 + 2*8*i]=
2324                 nnz_cache[3+8* 6 + 2*8*i]=
2325                 nnz_cache[3+8* 7 + 2*8*i]=
2326                 nnz_cache[3+8*11 + 2*8*i]=
2327                 nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2328             }
2329         }
2330         if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2331             uint32_t top_empty = CABAC(h) && !IS_INTRA(mb_type) ? 0 : 0x40404040;
2332             AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2333             AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2334             AV_WN32A(&nnz_cache[4+8*10], top_empty);
2335         }
2336     }
2337     h->cur_pic.mb_type[mb_xy] = mb_type;
2338
2339     if( cbp || IS_INTRA16x16( mb_type ) ) {
2340         const uint8_t *scan, *scan8x8;
2341         const uint32_t *qmul;
2342
2343         if(IS_INTERLACED(mb_type)){
2344             scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2345             scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
2346         }else{
2347             scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2348             scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2349         }
2350
2351         // decode_cabac_mb_dqp
2352         if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
2353             int val = 1;
2354             int ctx= 2;
2355             const int max_qp = 51 + 6*(h->sps.bit_depth_luma-8);
2356
2357             while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
2358                 ctx= 3;
2359                 val++;
2360                 if(val > 2*max_qp){ //prevent infinite loop
2361                     av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", h->mb_x, h->mb_y);
2362                     return -1;
2363                 }
2364             }
2365
2366             if( val&0x01 )
2367                 val=   (val + 1)>>1 ;
2368             else
2369                 val= -((val + 1)>>1);
2370             h->last_qscale_diff = val;
2371             sl->qscale += val;
2372             if (((unsigned)sl->qscale) > max_qp){
2373                 if (sl->qscale < 0) sl->qscale += max_qp + 1;
2374                 else                sl->qscale -= max_qp + 1;
2375             }
2376             sl->chroma_qp[0] = get_chroma_qp(h, 0, sl->qscale);
2377             sl->chroma_qp[1] = get_chroma_qp(h, 1, sl->qscale);
2378         }else
2379             h->last_qscale_diff=0;
2380
2381         decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2382         if (CHROMA444(h)) {
2383             decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2384             decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2385         } else if (CHROMA422(h)) {
2386             if( cbp&0x30 ){
2387                 int c;
2388                 for (c = 0; c < 2; c++)
2389                     decode_cabac_residual_dc_422(h, sl, h->mb + ((256 + 16*16*c) << pixel_shift), 3,
2390                                                  CHROMA_DC_BLOCK_INDEX + c,
2391                                                  chroma422_dc_scan, 8);
2392             }
2393
2394             if( cbp&0x20 ) {
2395                 int c, i, i8x8;
2396                 for( c = 0; c < 2; c++ ) {
2397                     int16_t *mb = h->mb + (16*(16 + 16*c) << pixel_shift);
2398                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2399                     for (i8x8 = 0; i8x8 < 2; i8x8++) {
2400                         for (i = 0; i < 4; i++) {
2401                             const int index = 16 + 16 * c + 8*i8x8 + i;
2402                             decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2403                             mb += 16<<pixel_shift;
2404                         }
2405                     }
2406                 }
2407             } else {
2408                 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2409                 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2410             }
2411         } else /* yuv420 */ {
2412             if( cbp&0x30 ){
2413                 int c;
2414                 for (c = 0; c < 2; c++)
2415                     decode_cabac_residual_dc(h, sl, h->mb + ((256 + 16*16*c) << pixel_shift), 3, CHROMA_DC_BLOCK_INDEX+c, chroma_dc_scan, 4);
2416             }
2417
2418             if( cbp&0x20 ) {
2419                 int c, i;
2420                 for( c = 0; c < 2; c++ ) {
2421                     qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2422                     for( i = 0; i < 4; i++ ) {
2423                         const int index = 16 + 16 * c + i;
2424                         decode_cabac_residual_nondc(h, sl, h->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2425                     }
2426                 }
2427             } else {
2428                 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2429                 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2430             }
2431         }
2432     } else {
2433         fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2434         fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2435         fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2436         h->last_qscale_diff = 0;
2437     }
2438
2439     h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2440     write_back_non_zero_count(h, sl);
2441
2442     return 0;
2443 }