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