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