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