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