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