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