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