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