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 UNCHECKED_BITSTREAM_READER 1
30 #define INT_BIT (CHAR_BIT * sizeof(int))
31 
32 #include "libavutil/attributes.h"
33 #include "libavutil/avassert.h"
34 #include "config.h"
35 #include "cabac.h"
36 #include "cabac_functions.h"
37 #include "h264dec.h"
38 #include "h264data.h"
39 #include "h264_mvpred.h"
40 #include "mpegutils.h"
41 
42 #if ARCH_X86
43 #include "x86/h264_cabac.c"
44 #elif ARCH_LOONGARCH64
45 #include "loongarch/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 
pack8to16(unsigned a, unsigned b)1283 static av_always_inline uint16_t pack8to16(unsigned a, unsigned b)
1284 {
1285 #if HAVE_BIGENDIAN
1286     return (b & 0xFF) + (a << 8);
1287 #else
1288     return (a & 0xFF) + (b << 8);
1289 #endif
1290 }
1291 
decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)1292 static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1293 {
1294     const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1295 
1296     unsigned long ctx = 0;
1297 
1298     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);
1299     ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1300 
1301     return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1302 }
1303 
decode_cabac_intra_mb_type(H264SliceContext *sl, int ctx_base, int intra_slice)1304 static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1305                                       int ctx_base, int intra_slice)
1306 {
1307     uint8_t *state= &sl->cabac_state[ctx_base];
1308     int mb_type;
1309 
1310     if(intra_slice){
1311         int ctx=0;
1312         if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1313             ctx++;
1314         if (sl->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1315             ctx++;
1316         if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1317             return 0;   /* I4x4 */
1318         state += 2;
1319     }else{
1320         if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1321             return 0;   /* I4x4 */
1322     }
1323 
1324     if( get_cabac_terminate( &sl->cabac ) )
1325         return 25;  /* PCM */
1326 
1327     mb_type = 1; /* I16x16 */
1328     mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1329     if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1330         mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1331     mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1332     mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1333     return mb_type;
1334 }
1335 
decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl, int mb_x, int mb_y)1336 static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1337                                 int mb_x, int mb_y)
1338 {
1339     int mba_xy, mbb_xy;
1340     int ctx = 0;
1341 
1342     if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1343         int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1344         mba_xy = mb_xy - 1;
1345         if( (mb_y&1)
1346             && h->slice_table[mba_xy] == sl->slice_num
1347             && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1348             mba_xy += h->mb_stride;
1349         if (MB_FIELD(sl)) {
1350             mbb_xy = mb_xy - h->mb_stride;
1351             if( !(mb_y&1)
1352                 && h->slice_table[mbb_xy] == sl->slice_num
1353                 && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1354                 mbb_xy -= h->mb_stride;
1355         }else
1356             mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1357     }else{
1358         int mb_xy = sl->mb_xy;
1359         mba_xy = mb_xy - 1;
1360         mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1361     }
1362 
1363     if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1364         ctx++;
1365     if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1366         ctx++;
1367 
1368     if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1369         ctx += 13;
1370     return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1371 }
1372 
decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)1373 static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1374 {
1375     int mode = 0;
1376 
1377     if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1378         return pred_mode;
1379 
1380     mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1381     mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1382     mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1383 
1384     return mode + ( mode >= pred_mode );
1385 }
1386 
decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)1387 static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1388 {
1389     const int mba_xy = sl->left_mb_xy[0];
1390     const int mbb_xy = sl->top_mb_xy;
1391 
1392     int ctx = 0;
1393 
1394     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
1395     if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1396         ctx++;
1397 
1398     if (sl->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0)
1399         ctx++;
1400 
1401     if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1402         return 0;
1403 
1404     if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1405         return 1;
1406     if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1407         return 2;
1408     else
1409         return 3;
1410 }
1411 
decode_cabac_mb_cbp_luma(H264SliceContext *sl)1412 static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1413 {
1414     int cbp_b, cbp_a, ctx, cbp = 0;
1415 
1416     cbp_a = sl->left_cbp;
1417     cbp_b = sl->top_cbp;
1418 
1419     ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1420     cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1421     ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
1422     cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1423     ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
1424     cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1425     ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
1426     cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1427     return cbp;
1428 }
decode_cabac_mb_cbp_chroma(H264SliceContext *sl)1429 static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1430 {
1431     int ctx;
1432     int cbp_a, cbp_b;
1433 
1434     cbp_a = (sl->left_cbp>>4)&0x03;
1435     cbp_b = (sl-> top_cbp>>4)&0x03;
1436 
1437     ctx = 0;
1438     if( cbp_a > 0 ) ctx++;
1439     if( cbp_b > 0 ) ctx += 2;
1440     if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1441         return 0;
1442 
1443     ctx = 4;
1444     if( cbp_a == 2 ) ctx++;
1445     if( cbp_b == 2 ) ctx += 2;
1446     return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1447 }
1448 
decode_cabac_p_mb_sub_type(H264SliceContext *sl)1449 static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1450 {
1451     if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1452         return 0;   /* 8x8 */
1453     if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1454         return 1;   /* 8x4 */
1455     if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1456         return 2;   /* 4x8 */
1457     return 3;       /* 4x4 */
1458 }
decode_cabac_b_mb_sub_type(H264SliceContext *sl)1459 static int decode_cabac_b_mb_sub_type(H264SliceContext *sl)
1460 {
1461     int type;
1462     if( !get_cabac( &sl->cabac, &sl->cabac_state[36] ) )
1463         return 0;   /* B_Direct_8x8 */
1464     if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1465         return 1 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1466     type = 3;
1467     if( get_cabac( &sl->cabac, &sl->cabac_state[38] ) ) {
1468         if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1469             return 11 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1470         type += 4;
1471     }
1472     type += 2*get_cabac( &sl->cabac, &sl->cabac_state[39] );
1473     type +=   get_cabac( &sl->cabac, &sl->cabac_state[39] );
1474     return type;
1475 }
1476 
decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)1477 static int decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)
1478 {
1479     int refa = sl->ref_cache[list][scan8[n] - 1];
1480     int refb = sl->ref_cache[list][scan8[n] - 8];
1481     int ref  = 0;
1482     int ctx  = 0;
1483 
1484     if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1485         if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1486             ctx++;
1487         if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1488             ctx += 2;
1489     } else {
1490         if( refa > 0 )
1491             ctx++;
1492         if( refb > 0 )
1493             ctx += 2;
1494     }
1495 
1496     while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1497         ref++;
1498         ctx = (ctx>>2)+4;
1499         if(ref >= 32 /*h->ref_list[list]*/){
1500             return -1;
1501         }
1502     }
1503     return ref;
1504 }
1505 
decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)1506 static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1507 {
1508     int mvd;
1509 
1510     if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1511 //    if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1512         *mvda= 0;
1513         return 0;
1514     }
1515 
1516     mvd= 1;
1517     ctxbase+= 3;
1518     while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1519         if( mvd < 4 )
1520             ctxbase++;
1521         mvd++;
1522     }
1523 
1524     if( mvd >= 9 ) {
1525         int k = 3;
1526         while( get_cabac_bypass( &sl->cabac ) ) {
1527             mvd += 1 << k;
1528             k++;
1529             if(k>24){
1530                 av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1531                 return INT_MIN;
1532             }
1533         }
1534         while( k-- ) {
1535             mvd += get_cabac_bypass( &sl->cabac )<<k;
1536         }
1537         *mvda=mvd < 70 ? mvd : 70;
1538     }else
1539         *mvda=mvd;
1540     return get_cabac_bypass_sign( &sl->cabac, -mvd );
1541 }
1542 
1543 #define DECODE_CABAC_MB_MVD(sl, list,  n )\
1544 {\
1545     int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1546                 sl->mvd_cache[list][scan8[n] - 8][0];\
1547     int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1548                 sl->mvd_cache[list][scan8[n] - 8][1];\
1549 \
1550     int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1551     int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1552     if (mxd == INT_MIN || myd == INT_MIN) \
1553         return AVERROR_INVALIDDATA; \
1554     mx += mxd;\
1555     my += myd;\
1556 }
1557 
get_cabac_cbf_ctx(H264SliceContext *sl, int cat, int idx, int max_coeff, int is_dc)1558 static av_always_inline int get_cabac_cbf_ctx(H264SliceContext *sl,
1559                                               int cat, int idx, int max_coeff,
1560                                               int is_dc)
1561 {
1562     int nza, nzb;
1563     int ctx = 0;
1564     static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1565 
1566     if( is_dc ) {
1567         if( cat == 3 ) {
1568             idx -= CHROMA_DC_BLOCK_INDEX;
1569             nza = (sl->left_cbp>>(6+idx))&0x01;
1570             nzb = (sl-> top_cbp>>(6+idx))&0x01;
1571         } else {
1572             idx -= LUMA_DC_BLOCK_INDEX;
1573             nza = sl->left_cbp&(0x100<<idx);
1574             nzb = sl-> top_cbp&(0x100<<idx);
1575         }
1576     } else {
1577         nza = sl->non_zero_count_cache[scan8[idx] - 1];
1578         nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1579     }
1580 
1581     if( nza > 0 )
1582         ctx++;
1583 
1584     if( nzb > 0 )
1585         ctx += 2;
1586 
1587     return base_ctx[cat] + ctx;
1588 }
1589 
1590 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)1591 decode_cabac_residual_internal(const H264Context *h, H264SliceContext *sl,
1592                                int16_t *block,
1593                                int cat, int n, const uint8_t *scantable,
1594                                const uint32_t *qmul, int max_coeff,
1595                                int is_dc, int chroma422)
1596 {
1597     static const int significant_coeff_flag_offset[2][14] = {
1598       { 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 },
1599       { 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 }
1600     };
1601     static const int last_coeff_flag_offset[2][14] = {
1602       { 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 },
1603       { 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 }
1604     };
1605     static const int coeff_abs_level_m1_offset[14] = {
1606         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
1607     };
1608     static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1609       { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1610         4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1611         7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1612        12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1613       { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1614         6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1615         9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1616         9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1617     };
1618     static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1619     /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1620      * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1621      * map node ctx => cabac ctx for level=1 */
1622     static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1623     /* map node ctx => cabac ctx for level>1 */
1624     static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1625         { 5, 5, 5, 5, 6, 7, 8, 9 },
1626         { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1627     };
1628     static const uint8_t coeff_abs_level_transition[2][8] = {
1629     /* update node ctx after decoding a level=1 */
1630         { 1, 2, 3, 3, 4, 5, 6, 7 },
1631     /* update node ctx after decoding a level>1 */
1632         { 4, 4, 4, 4, 5, 6, 7, 7 }
1633     };
1634 
1635     int index[64];
1636 
1637     int last;
1638     int coeff_count = 0;
1639     int node_ctx = 0;
1640 
1641     uint8_t *significant_coeff_ctx_base;
1642     uint8_t *last_coeff_ctx_base;
1643     uint8_t *abs_level_m1_ctx_base;
1644 
1645 #if !ARCH_X86
1646 #define CABAC_ON_STACK
1647 #endif
1648 #ifdef CABAC_ON_STACK
1649 #define CC &cc
1650     CABACContext cc;
1651     cc.range     = sl->cabac.range;
1652     cc.low       = sl->cabac.low;
1653     cc.bytestream= sl->cabac.bytestream;
1654 #if !UNCHECKED_BITSTREAM_READER || ARCH_AARCH64
1655     cc.bytestream_end = sl->cabac.bytestream_end;
1656 #endif
1657 #else
1658 #define CC &sl->cabac
1659 #endif
1660 
1661     significant_coeff_ctx_base = sl->cabac_state
1662         + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1663     last_coeff_ctx_base = sl->cabac_state
1664         + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1665     abs_level_m1_ctx_base = sl->cabac_state
1666         + coeff_abs_level_m1_offset[cat];
1667 
1668     if( !is_dc && max_coeff == 64 ) {
1669 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1670         for(last= 0; last < coefs; last++) { \
1671             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1672             if( get_cabac( CC, sig_ctx )) { \
1673                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1674                 index[coeff_count++] = last; \
1675                 if( get_cabac( CC, last_ctx ) ) { \
1676                     last= max_coeff; \
1677                     break; \
1678                 } \
1679             } \
1680         }\
1681         if( last == max_coeff -1 ) {\
1682             index[coeff_count++] = last;\
1683         }
1684         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD(sl)];
1685 #ifdef decode_significance
1686         coeff_count = decode_significance_8x8(CC, significant_coeff_ctx_base, index,
1687                                                  last_coeff_ctx_base, sig_off);
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             coeff_count = decode_significance(CC, max_coeff, significant_coeff_ctx_base, index,
1693                                                  last_coeff_ctx_base-significant_coeff_ctx_base);
1694         }
1695 #else
1696         DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1697     } else {
1698         if (is_dc && chroma422) { // dc 422
1699             DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1700         } else {
1701             DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1702         }
1703 #endif
1704     }
1705     av_assert2(coeff_count > 0);
1706 
1707     if( is_dc ) {
1708         if( cat == 3 )
1709             h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1710         else
1711             h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1712         sl->non_zero_count_cache[scan8[n]] = coeff_count;
1713     } else {
1714         if( max_coeff == 64 )
1715             fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1716         else {
1717             av_assert2( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1718             sl->non_zero_count_cache[scan8[n]] = coeff_count;
1719         }
1720     }
1721 
1722 #define STORE_BLOCK(type) \
1723     do { \
1724         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1725  \
1726         int j= scantable[index[--coeff_count]]; \
1727  \
1728         if( get_cabac( CC, ctx ) == 0 ) { \
1729             node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1730             if( is_dc ) { \
1731                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1732             }else{ \
1733                 ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1734             } \
1735         } else { \
1736             unsigned coeff_abs = 2; \
1737             ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1738             node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1739 \
1740             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1741                 coeff_abs++; \
1742             } \
1743 \
1744             if( coeff_abs >= 15 ) { \
1745                 int j = 0; \
1746                 while (get_cabac_bypass(CC) && j < 16+7) { \
1747                     j++; \
1748                 } \
1749 \
1750                 coeff_abs=1; \
1751                 while( j-- ) { \
1752                     coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1753                 } \
1754                 coeff_abs+= 14U; \
1755             } \
1756 \
1757             if( is_dc ) { \
1758                 ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1759             }else{ \
1760                 ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1761             } \
1762         } \
1763     } while ( coeff_count );
1764 
1765     if (h->pixel_shift) {
1766         STORE_BLOCK(int32_t)
1767     } else {
1768         STORE_BLOCK(int16_t)
1769     }
1770 #ifdef CABAC_ON_STACK
1771             sl->cabac.range     = cc.range     ;
1772             sl->cabac.low       = cc.low       ;
1773             sl->cabac.bytestream= cc.bytestream;
1774 #endif
1775 
1776 }
1777 
decode_cabac_residual_dc_internal(const H264Context *h, H264SliceContext *sl, int16_t *block, int cat, int n, const uint8_t *scantable, int max_coeff)1778 static av_noinline void decode_cabac_residual_dc_internal(const H264Context *h,
1779                                                           H264SliceContext *sl,
1780                                                           int16_t *block,
1781                                                           int cat, int n,
1782                                                           const uint8_t *scantable,
1783                                                           int max_coeff)
1784 {
1785     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1786 }
1787 
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)1788 static av_noinline void decode_cabac_residual_dc_internal_422(const H264Context *h,
1789                                                               H264SliceContext *sl,
1790                                                               int16_t *block,
1791                                                               int cat, int n,
1792                                                               const uint8_t *scantable,
1793                                                               int max_coeff)
1794 {
1795     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1796 }
1797 
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)1798 static av_noinline void decode_cabac_residual_nondc_internal(const H264Context *h,
1799                                                              H264SliceContext *sl,
1800                                                              int16_t *block,
1801                                                              int cat, int n,
1802                                                              const uint8_t *scantable,
1803                                                              const uint32_t *qmul,
1804                                                              int max_coeff)
1805 {
1806     decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1807 }
1808 
1809 /* cat: 0-> DC 16x16  n = 0
1810  *      1-> AC 16x16  n = luma4x4idx
1811  *      2-> Luma4x4   n = luma4x4idx
1812  *      3-> DC Chroma n = iCbCr
1813  *      4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
1814  *      5-> Luma8x8   n = 4 * luma8x8idx */
1815 
1816 /* Partially inline the CABAC residual decode: inline the coded block flag.
1817  * This has very little impact on binary size and improves performance
1818  * because it allows improved constant propagation into get_cabac_cbf_ctx,
1819  * as well as because most blocks have zero CBFs. */
1820 
decode_cabac_residual_dc(const H264Context *h, H264SliceContext *sl, int16_t *block, int cat, int n, const uint8_t *scantable, int max_coeff)1821 static av_always_inline void decode_cabac_residual_dc(const H264Context *h,
1822                                                       H264SliceContext *sl,
1823                                                       int16_t *block,
1824                                                       int cat, int n,
1825                                                       const uint8_t *scantable,
1826                                                       int max_coeff)
1827 {
1828     /* read coded block flag */
1829     if( get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0 ) {
1830         sl->non_zero_count_cache[scan8[n]] = 0;
1831         return;
1832     }
1833     decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1834 }
1835 
1836 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)1837 decode_cabac_residual_dc_422(const H264Context *h, H264SliceContext *sl,
1838                              int16_t *block,
1839                              int cat, int n, const uint8_t *scantable,
1840                              int max_coeff)
1841 {
1842     /* read coded block flag */
1843     if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1844         sl->non_zero_count_cache[scan8[n]] = 0;
1845         return;
1846     }
1847     decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1848 }
1849 
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)1850 static av_always_inline void decode_cabac_residual_nondc(const H264Context *h,
1851                                                          H264SliceContext *sl,
1852                                                          int16_t *block,
1853                                                          int cat, int n,
1854                                                          const uint8_t *scantable,
1855                                                          const uint32_t *qmul,
1856                                                          int max_coeff)
1857 {
1858     /* read coded block flag */
1859     if( (cat != 5 || CHROMA444(h)) && get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 0)]) == 0) {
1860         if( max_coeff == 64 ) {
1861             fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1862         } else {
1863             sl->non_zero_count_cache[scan8[n]] = 0;
1864         }
1865         return;
1866     }
1867     decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1868 }
1869 
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)1870 static av_always_inline void decode_cabac_luma_residual(const H264Context *h, H264SliceContext *sl,
1871                                                         const uint8_t *scan, const uint8_t *scan8x8,
1872                                                         int pixel_shift, int mb_type, int cbp, int p)
1873 {
1874     static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1875     const uint32_t *qmul;
1876     int i8x8, i4x4;
1877     int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1878     if( IS_INTRA16x16( mb_type ) ) {
1879         AV_ZERO128(sl->mb_luma_dc[p]+0);
1880         AV_ZERO128(sl->mb_luma_dc[p]+8);
1881         AV_ZERO128(sl->mb_luma_dc[p]+16);
1882         AV_ZERO128(sl->mb_luma_dc[p]+24);
1883         decode_cabac_residual_dc(h, sl, sl->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1884 
1885         if( cbp&15 ) {
1886             qmul = h->ps.pps->dequant4_coeff[p][qscale];
1887             for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1888                 const int index = 16*p + i4x4;
1889                 decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1890             }
1891         } else {
1892             fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1893         }
1894     } else {
1895         int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1896         for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1897             if( cbp & (1<<i8x8) ) {
1898                 if( IS_8x8DCT(mb_type) ) {
1899                     const int index = 16*p + 4*i8x8;
1900                     decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1901                                                 scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1902                 } else {
1903                     qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1904                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1905                         const int index = 16*p + 4*i8x8 + i4x4;
1906                         decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1907                     }
1908                 }
1909             } else {
1910                 fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1911             }
1912         }
1913     }
1914 }
1915 
1916 /**
1917  * Decode a macroblock.
1918  * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
1919  */
ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)1920 int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
1921 {
1922     const SPS *sps = h->ps.sps;
1923     int mb_xy;
1924     int mb_type, partition_count, cbp = 0;
1925     int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
1926     const int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1927     const int pixel_shift = h->pixel_shift;
1928 
1929     mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1930 
1931     ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1932     if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1933         int skip;
1934         /* a skipped mb needs the aff flag from the following mb */
1935         if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1936             skip = sl->next_mb_skipped;
1937         else
1938             skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1939         /* read skip flags */
1940         if( skip ) {
1941             if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1942                 h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1943                 sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1944                 if(!sl->next_mb_skipped)
1945                     sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1946             }
1947 
1948             decode_mb_skip(h, sl);
1949 
1950             h->cbp_table[mb_xy] = 0;
1951             h->chroma_pred_mode_table[mb_xy] = 0;
1952             sl->last_qscale_diff = 0;
1953 
1954             return 0;
1955 
1956         }
1957     }
1958     if (FRAME_MBAFF(h)) {
1959         if ((sl->mb_y & 1) == 0)
1960             sl->mb_mbaff =
1961             sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1962     }
1963 
1964     sl->prev_mb_skipped = 0;
1965 
1966     fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1967 
1968     if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1969         int ctx = 0;
1970         av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1971 
1972         if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1973             ctx++;
1974         if (!IS_DIRECT(sl->top_type - 1))
1975             ctx++;
1976 
1977         if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1978             mb_type= 0; /* B_Direct_16x16 */
1979         }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1980             mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1981         }else{
1982             int bits;
1983             bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1984             bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1985             bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1986             bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1987             if( bits < 8 ){
1988                 mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1989             }else if( bits == 13 ){
1990                 mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1991                 goto decode_intra_mb;
1992             }else if( bits == 14 ){
1993                 mb_type= 11; /* B_L1_L0_8x16 */
1994             }else if( bits == 15 ){
1995                 mb_type= 22; /* B_8x8 */
1996             }else{
1997                 bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1998                 mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1999             }
2000         }
2001             partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
2002             mb_type         = ff_h264_b_mb_type_info[mb_type].type;
2003     } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
2004         if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
2005             /* P-type */
2006             if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
2007                 /* P_L0_D16x16, P_8x8 */
2008                 mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2009             } else {
2010                 /* P_L0_D8x16, P_L0_D16x8 */
2011                 mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2012             }
2013             partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2014             mb_type         = ff_h264_p_mb_type_info[mb_type].type;
2015         } else {
2016             mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2017             goto decode_intra_mb;
2018         }
2019     } else {
2020         mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2021         if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2022             mb_type--;
2023         av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2024 decode_intra_mb:
2025         partition_count = 0;
2026         cbp                      = ff_h264_i_mb_type_info[mb_type].cbp;
2027         sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2028         mb_type                  = ff_h264_i_mb_type_info[mb_type].type;
2029     }
2030     if (MB_FIELD(sl))
2031         mb_type |= MB_TYPE_INTERLACED;
2032 
2033     h->slice_table[mb_xy] = sl->slice_num;
2034 
2035     if(IS_INTRA_PCM(mb_type)) {
2036         const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2037                             sps->bit_depth_luma >> 3;
2038         const uint8_t *ptr;
2039         int ret;
2040 
2041         // We assume these blocks are very rare so we do not optimize it.
2042         // FIXME The two following lines get the bitstream position in the cabac
2043         // decode, I think it should be done by a function in cabac.h (or cabac.c).
2044         ptr= sl->cabac.bytestream;
2045         if(sl->cabac.low&0x1) ptr--;
2046         if(CABAC_BITS==16){
2047             if(sl->cabac.low&0x1FF) ptr--;
2048         }
2049 
2050         // The pixels are stored in the same order as levels in h->mb array.
2051         if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2052             return -1;
2053         sl->intra_pcm_ptr = ptr;
2054         ptr += mb_size;
2055 
2056         ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2057         if (ret < 0)
2058             return ret;
2059 
2060         // All blocks are present
2061         h->cbp_table[mb_xy] = 0xf7ef;
2062         h->chroma_pred_mode_table[mb_xy] = 0;
2063         // In deblocking, the quantizer is 0
2064         h->cur_pic.qscale_table[mb_xy] = 0;
2065         // All coeffs are present
2066         memset(h->non_zero_count[mb_xy], 16, 48);
2067         h->cur_pic.mb_type[mb_xy] = mb_type;
2068         sl->last_qscale_diff = 0;
2069         return 0;
2070     }
2071 
2072     fill_decode_caches(h, sl, mb_type);
2073 
2074     if( IS_INTRA( mb_type ) ) {
2075         int i, pred_mode;
2076         if( IS_INTRA4x4( mb_type ) ) {
2077             if (dct8x8_allowed && get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size])) {
2078                 mb_type |= MB_TYPE_8x8DCT;
2079                 for( i = 0; i < 16; i+=4 ) {
2080                     int pred = pred_intra_mode(h, sl, i);
2081                     int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2082                     fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2083                 }
2084             } else {
2085                 for( i = 0; i < 16; i++ ) {
2086                     int pred = pred_intra_mode(h, sl, i);
2087                     sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2088 
2089                     ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2090                             sl->intra4x4_pred_mode_cache[scan8[i]]);
2091                 }
2092             }
2093             write_back_intra_pred_mode(h, sl);
2094             if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2095                                                  sl->top_samples_available, sl->left_samples_available) < 0 )
2096                 return -1;
2097         } else {
2098             sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2099                                                                      sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2100             if (sl->intra16x16_pred_mode < 0) return -1;
2101         }
2102         if(decode_chroma){
2103             h->chroma_pred_mode_table[mb_xy] =
2104             pred_mode                        = decode_cabac_mb_chroma_pre_mode(h, sl);
2105 
2106             pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2107                                                      sl->left_samples_available, pred_mode, 1 );
2108             if( pred_mode < 0 ) return -1;
2109             sl->chroma_pred_mode = pred_mode;
2110         } else {
2111             sl->chroma_pred_mode = DC_128_PRED8x8;
2112         }
2113     } else if( partition_count == 4 ) {
2114         int i, j, sub_partition_count[4], list, ref[2][4];
2115 
2116         if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2117             for( i = 0; i < 4; i++ ) {
2118                 sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
2119                 sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2120                 sl->sub_mb_type[i]     = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2121             }
2122             if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2123                           sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2124                 ff_h264_pred_direct_motion(h, sl, &mb_type);
2125                 sl->ref_cache[0][scan8[4]] =
2126                 sl->ref_cache[1][scan8[4]] =
2127                 sl->ref_cache[0][scan8[12]] =
2128                 sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2129                     for( i = 0; i < 4; i++ )
2130                         fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2131             }
2132         } else {
2133             for( i = 0; i < 4; i++ ) {
2134                 sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2135                 sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2136                 sl->sub_mb_type[i]     = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2137             }
2138         }
2139 
2140         for( list = 0; list < sl->list_count; list++ ) {
2141                 for( i = 0; i < 4; i++ ) {
2142                     if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2143                     if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2144                         unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2145                         if (rc > 1) {
2146                             ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2147                             if (ref[list][i] >= rc) {
2148                                 av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2149                                 return -1;
2150                             }
2151                         }else
2152                             ref[list][i] = 0;
2153                     } else {
2154                         ref[list][i] = -1;
2155                     }
2156                     sl->ref_cache[list][scan8[4 * i] + 1] =
2157                     sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2158                 }
2159         }
2160 
2161         if(dct8x8_allowed)
2162             dct8x8_allowed = get_dct8x8_allowed(h, sl);
2163 
2164         for (list = 0; list < sl->list_count; list++) {
2165             for(i=0; i<4; i++){
2166                 sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2167                 if(IS_DIRECT(sl->sub_mb_type[i])){
2168                     fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2169                     continue;
2170                 }
2171 
2172                 if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2173                     const int sub_mb_type= sl->sub_mb_type[i];
2174                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2175                     for(j=0; j<sub_partition_count[i]; j++){
2176                         int mpx, mpy;
2177                         int mx, my;
2178                         const int index= 4*i + block_width*j;
2179                         int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2180                         uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2181                         pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2182                         DECODE_CABAC_MB_MVD(sl, list, index)
2183                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2184 
2185                         if(IS_SUB_8X8(sub_mb_type)){
2186                             mv_cache[ 1 ][0]=
2187                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2188                             mv_cache[ 1 ][1]=
2189                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2190 
2191                             mvd_cache[ 1 ][0]=
2192                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2193                             mvd_cache[ 1 ][1]=
2194                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2195                         }else if(IS_SUB_8X4(sub_mb_type)){
2196                             mv_cache[ 1 ][0]= mx;
2197                             mv_cache[ 1 ][1]= my;
2198 
2199                             mvd_cache[ 1 ][0]=  mpx;
2200                             mvd_cache[ 1 ][1]= mpy;
2201                         }else if(IS_SUB_4X8(sub_mb_type)){
2202                             mv_cache[ 8 ][0]= mx;
2203                             mv_cache[ 8 ][1]= my;
2204 
2205                             mvd_cache[ 8 ][0]= mpx;
2206                             mvd_cache[ 8 ][1]= mpy;
2207                         }
2208                         mv_cache[ 0 ][0]= mx;
2209                         mv_cache[ 0 ][1]= my;
2210 
2211                         mvd_cache[ 0 ][0]= mpx;
2212                         mvd_cache[ 0 ][1]= mpy;
2213                     }
2214                 }else{
2215                     fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2216                     fill_rectangle(sl->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2217                 }
2218             }
2219         }
2220     } else if( IS_DIRECT(mb_type) ) {
2221         ff_h264_pred_direct_motion(h, sl, &mb_type);
2222         fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2223         fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2224         dct8x8_allowed &= sps->direct_8x8_inference_flag;
2225     } else {
2226         int list, i;
2227         if(IS_16X16(mb_type)){
2228             for (list = 0; list < sl->list_count; list++) {
2229                 if(IS_DIR(mb_type, 0, list)){
2230                     int ref;
2231                     unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2232                     if (rc > 1) {
2233                         ref= decode_cabac_mb_ref(sl, list, 0);
2234                         if (ref >= rc) {
2235                             av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2236                             return -1;
2237                         }
2238                     }else
2239                         ref=0;
2240                     fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2241                 }
2242             }
2243             for (list = 0; list < sl->list_count; list++) {
2244                 if(IS_DIR(mb_type, 0, list)){
2245                     int mx,my,mpx,mpy;
2246                     pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2247                     DECODE_CABAC_MB_MVD(sl, list, 0)
2248                     ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2249 
2250                     fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2251                     fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2252                 }
2253             }
2254         }
2255         else if(IS_16X8(mb_type)){
2256             for (list = 0; list < sl->list_count; list++) {
2257                     for(i=0; i<2; i++){
2258                         if(IS_DIR(mb_type, i, list)){
2259                             int ref;
2260                             unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2261                             if (rc > 1) {
2262                                 ref= decode_cabac_mb_ref(sl, list, 8 * i);
2263                                 if (ref >= rc) {
2264                                     av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2265                                     return -1;
2266                                 }
2267                             }else
2268                                 ref=0;
2269                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2270                         }else
2271                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2272                     }
2273             }
2274             for (list = 0; list < sl->list_count; list++) {
2275                 for(i=0; i<2; i++){
2276                     if(IS_DIR(mb_type, i, list)){
2277                         int mx,my,mpx,mpy;
2278                         pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2279                         DECODE_CABAC_MB_MVD(sl, list, 8*i)
2280                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2281 
2282                         fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2283                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2284                     }else{
2285                         fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2286                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2287                     }
2288                 }
2289             }
2290         }else{
2291             av_assert2(IS_8X16(mb_type));
2292             for (list = 0; list < sl->list_count; list++) {
2293                     for(i=0; i<2; i++){
2294                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2295                             int ref;
2296                             unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2297                             if (rc > 1) {
2298                                 ref = decode_cabac_mb_ref(sl, list, 4 * i);
2299                                 if (ref >= rc) {
2300                                     av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2301                                     return -1;
2302                                 }
2303                             }else
2304                                 ref=0;
2305                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2306                         }else
2307                             fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2308                     }
2309             }
2310             for (list = 0; list < sl->list_count; list++) {
2311                 for(i=0; i<2; i++){
2312                     if(IS_DIR(mb_type, i, list)){
2313                         int mx,my,mpx,mpy;
2314                         pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2315                         DECODE_CABAC_MB_MVD(sl, list, 4*i)
2316 
2317                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2318                         fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2319                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2320                     }else{
2321                         fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2322                         fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2323                     }
2324                 }
2325             }
2326         }
2327     }
2328 
2329    if( IS_INTER( mb_type ) ) {
2330         h->chroma_pred_mode_table[mb_xy] = 0;
2331         write_back_motion(h, sl, mb_type);
2332    }
2333 
2334     if( !IS_INTRA16x16( mb_type ) ) {
2335         cbp  = decode_cabac_mb_cbp_luma(sl);
2336         if(decode_chroma)
2337             cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2338     } else {
2339         if (!decode_chroma && cbp>15) {
2340             av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2341             return AVERROR_INVALIDDATA;
2342         }
2343     }
2344 
2345     h->cbp_table[mb_xy] = sl->cbp = cbp;
2346 
2347     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2348         mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2349     }
2350 
2351     /* It would be better to do this in fill_decode_caches, but we don't know
2352      * the transform mode of the current macroblock there. */
2353     if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2354         int i;
2355         uint8_t *nnz_cache = sl->non_zero_count_cache;
2356         if (h->x264_build < 151U) {
2357             for (i = 0; i < 2; i++){
2358                 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2359                     nnz_cache[3+8* 1 + 2*8*i]=
2360                     nnz_cache[3+8* 2 + 2*8*i]=
2361                     nnz_cache[3+8* 6 + 2*8*i]=
2362                     nnz_cache[3+8* 7 + 2*8*i]=
2363                     nnz_cache[3+8*11 + 2*8*i]=
2364                     nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2365                 }
2366             }
2367             if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2368                 uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2369                 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2370                 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2371                 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2372             }
2373         } else {
2374             for (i = 0; i < 2; i++){
2375                 if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2376                     nnz_cache[3+8* 1 + 2*8*i]=
2377                     nnz_cache[3+8* 2 + 2*8*i]=
2378                     nnz_cache[3+8* 6 + 2*8*i]=
2379                     nnz_cache[3+8* 7 + 2*8*i]=
2380                     nnz_cache[3+8*11 + 2*8*i]=
2381                     nnz_cache[3+8*12 + 2*8*i]= !IS_INTRA_PCM(sl->left_type[LEFT(i)]) ? 0 : 64;
2382                 }
2383             }
2384             if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2385                 uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 0x40404040;
2386                 AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2387                 AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2388                 AV_WN32A(&nnz_cache[4+8*10], top_empty);
2389             }
2390         }
2391     }
2392     h->cur_pic.mb_type[mb_xy] = mb_type;
2393 
2394     if( cbp || IS_INTRA16x16( mb_type ) ) {
2395         const uint8_t *scan, *scan8x8;
2396         const uint32_t *qmul;
2397 
2398         // decode_cabac_mb_dqp
2399         if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2400             int val = 1;
2401             int ctx= 2;
2402             const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2403 
2404             while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2405                 ctx= 3;
2406                 val++;
2407                 if(val > 2*max_qp){ //prevent infinite loop
2408                     av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", sl->mb_x, sl->mb_y);
2409                     return -1;
2410                 }
2411             }
2412 
2413             if( val&0x01 )
2414                 val=   (val + 1)>>1 ;
2415             else
2416                 val= -((val + 1)>>1);
2417             sl->last_qscale_diff = val;
2418             sl->qscale += val;
2419             if (((unsigned)sl->qscale) > max_qp){
2420                 if (sl->qscale < 0) sl->qscale += max_qp + 1;
2421                 else                sl->qscale -= max_qp + 1;
2422             }
2423             sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2424             sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2425         }else
2426             sl->last_qscale_diff=0;
2427 
2428         if(IS_INTERLACED(mb_type)){
2429             scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2430             scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
2431         }else{
2432             scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2433             scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2434         }
2435 
2436         decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2437         if (CHROMA444(h)) {
2438             decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2439             decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2440         } else if (CHROMA422(h)) {
2441             if( cbp&0x30 ){
2442                 int c;
2443                 for (c = 0; c < 2; c++)
2444                     decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2445                                                  CHROMA_DC_BLOCK_INDEX + c,
2446                                                  ff_h264_chroma422_dc_scan, 8);
2447             }
2448 
2449             if( cbp&0x20 ) {
2450                 int c, i, i8x8;
2451                 for( c = 0; c < 2; c++ ) {
2452                     int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2453                     qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2454                     for (i8x8 = 0; i8x8 < 2; i8x8++) {
2455                         for (i = 0; i < 4; i++) {
2456                             const int index = 16 + 16 * c + 8*i8x8 + i;
2457                             decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2458                             mb += 16<<pixel_shift;
2459                         }
2460                     }
2461                 }
2462             } else {
2463                 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2464                 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2465             }
2466         } else /* yuv420 */ {
2467             if( cbp&0x30 ){
2468                 int c;
2469                 for (c = 0; c < 2; c++)
2470                     decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2471                                              3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2472             }
2473 
2474             if( cbp&0x20 ) {
2475                 int c, i;
2476                 for( c = 0; c < 2; c++ ) {
2477                     qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2478                     for( i = 0; i < 4; i++ ) {
2479                         const int index = 16 + 16 * c + i;
2480                         decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2481                     }
2482                 }
2483             } else {
2484                 fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2485                 fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2486             }
2487         }
2488     } else {
2489         fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2490         fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2491         fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2492         sl->last_qscale_diff = 0;
2493     }
2494 
2495     h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2496     write_back_non_zero_count(h, sl);
2497 
2498     return 0;
2499 }
2500