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