Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/h264_cabac.c
Line
Count
Source
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
102M
#define CABAC(h) 1
29
#define UNCHECKED_BITSTREAM_READER 1
30
94.8M
#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
1262
void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl)
1263
1.55M
{
1264
1.55M
    int i;
1265
1.55M
    const int8_t (*tab)[2];
1266
1.55M
    const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);
1267
1268
1.55M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1269
956k
    else                                 tab = cabac_context_init_PB[sl->cabac_init_idc];
1270
1271
    /* calculate pre-state */
1272
1.59G
    for( i= 0; i < 1024; i++ ) {
1273
1.59G
        int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1274
1275
1.59G
        pre^= pre>>31;
1276
1.59G
        if(pre > 124)
1277
53.5M
            pre= 124 + (pre&1);
1278
1279
1.59G
        sl->cabac_state[i] =  pre;
1280
1.59G
    }
1281
1.55M
}
1282
1283
static av_always_inline uint16_t pack8to16(unsigned a, unsigned b)
1284
11.5M
{
1285
#if HAVE_BIGENDIAN
1286
    return (b & 0xFF) + (a << 8);
1287
#else
1288
11.5M
    return (a & 0xFF) + (b << 8);
1289
11.5M
#endif
1290
11.5M
}
1291
1292
static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1293
3.60M
{
1294
3.60M
    const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1295
1296
3.60M
    unsigned long ctx = 0;
1297
1298
3.60M
    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
3.60M
    ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1300
1301
3.60M
    return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1302
3.60M
}
1303
1304
static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1305
                                      int ctx_base, int intra_slice)
1306
3.88M
{
1307
3.88M
    uint8_t *state= &sl->cabac_state[ctx_base];
1308
3.88M
    int mb_type;
1309
1310
3.88M
    if(intra_slice){
1311
3.12M
        int ctx=0;
1312
3.12M
        if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1313
990k
            ctx++;
1314
3.12M
        if (sl->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1315
856k
            ctx++;
1316
3.12M
        if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1317
2.02M
            return 0;   /* I4x4 */
1318
1.10M
        state += 2;
1319
1.10M
    }else{
1320
761k
        if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1321
312k
            return 0;   /* I4x4 */
1322
761k
    }
1323
1324
1.54M
    if( get_cabac_terminate( &sl->cabac ) )
1325
4.87k
        return 25;  /* PCM */
1326
1327
1.54M
    mb_type = 1; /* I16x16 */
1328
1.54M
    mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1329
1.54M
    if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1330
202k
        mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1331
1.54M
    mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1332
1.54M
    mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1333
1.54M
    return mb_type;
1334
1.54M
}
1335
1336
static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1337
                                int mb_x, int mb_y)
1338
29.5M
{
1339
29.5M
    int mba_xy, mbb_xy;
1340
29.5M
    int ctx = 0;
1341
1342
29.5M
    if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1343
14.0M
        int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1344
14.0M
        mba_xy = mb_xy - 1;
1345
14.0M
        if( (mb_y&1)
1346
7.01M
            && h->slice_table[mba_xy] == sl->slice_num
1347
6.05M
            && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1348
5.54M
            mba_xy += h->mb_stride;
1349
14.0M
        if (MB_FIELD(sl)) {
1350
3.52M
            mbb_xy = mb_xy - h->mb_stride;
1351
3.52M
            if( !(mb_y&1)
1352
1.71M
                && h->slice_table[mbb_xy] == sl->slice_num
1353
1.23M
                && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1354
717k
                mbb_xy -= h->mb_stride;
1355
3.52M
        }else
1356
10.5M
            mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1357
15.5M
    }else{
1358
15.5M
        int mb_xy = sl->mb_xy;
1359
15.5M
        mba_xy = mb_xy - 1;
1360
15.5M
        mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1361
15.5M
    }
1362
1363
29.5M
    if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1364
9.44M
        ctx++;
1365
29.5M
    if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1366
7.27M
        ctx++;
1367
1368
29.5M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1369
18.7M
        ctx += 13;
1370
29.5M
    return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1371
29.5M
}
1372
1373
static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1374
16.3M
{
1375
16.3M
    int mode = 0;
1376
1377
16.3M
    if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1378
11.6M
        return pred_mode;
1379
1380
4.65M
    mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1381
4.65M
    mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1382
4.65M
    mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1383
1384
4.65M
    return mode + ( mode >= pred_mode );
1385
16.3M
}
1386
1387
static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1388
3.13M
{
1389
3.13M
    const int mba_xy = sl->left_mb_xy[0];
1390
3.13M
    const int mbb_xy = sl->top_mb_xy;
1391
1392
3.13M
    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
3.13M
    if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1396
600k
        ctx++;
1397
1398
3.13M
    if (sl->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0)
1399
528k
        ctx++;
1400
1401
3.13M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1402
2.08M
        return 0;
1403
1404
1.05M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1405
734k
        return 1;
1406
315k
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1407
166k
        return 2;
1408
148k
    else
1409
148k
        return 3;
1410
315k
}
1411
1412
static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1413
12.2M
{
1414
12.2M
    int cbp_b, cbp_a, ctx, cbp = 0;
1415
1416
12.2M
    cbp_a = sl->left_cbp;
1417
12.2M
    cbp_b = sl->top_cbp;
1418
1419
12.2M
    ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1420
12.2M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1421
12.2M
    ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
1422
12.2M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1423
12.2M
    ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
1424
12.2M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1425
12.2M
    ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
1426
12.2M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1427
12.2M
    return cbp;
1428
12.2M
}
1429
static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1430
11.0M
{
1431
11.0M
    int ctx;
1432
11.0M
    int cbp_a, cbp_b;
1433
1434
11.0M
    cbp_a = (sl->left_cbp>>4)&0x03;
1435
11.0M
    cbp_b = (sl-> top_cbp>>4)&0x03;
1436
1437
11.0M
    ctx = 0;
1438
11.0M
    if( cbp_a > 0 ) ctx++;
1439
11.0M
    if( cbp_b > 0 ) ctx += 2;
1440
11.0M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1441
9.31M
        return 0;
1442
1443
1.76M
    ctx = 4;
1444
1.76M
    if( cbp_a == 2 ) ctx++;
1445
1.76M
    if( cbp_b == 2 ) ctx += 2;
1446
1.76M
    return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1447
11.0M
}
1448
1449
static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1450
5.12M
{
1451
5.12M
    if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1452
3.30M
        return 0;   /* 8x8 */
1453
1.82M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1454
898k
        return 1;   /* 8x4 */
1455
923k
    if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1456
482k
        return 2;   /* 4x8 */
1457
441k
    return 3;       /* 4x4 */
1458
923k
}
1459
static int decode_cabac_b_mb_sub_type(H264SliceContext *sl)
1460
2.99M
{
1461
2.99M
    int type;
1462
2.99M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[36] ) )
1463
362k
        return 0;   /* B_Direct_8x8 */
1464
2.63M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1465
1.09M
        return 1 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1466
1.53M
    type = 3;
1467
1.53M
    if( get_cabac( &sl->cabac, &sl->cabac_state[38] ) ) {
1468
150k
        if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1469
48.1k
            return 11 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1470
102k
        type += 4;
1471
102k
    }
1472
1.48M
    type += 2*get_cabac( &sl->cabac, &sl->cabac_state[39] );
1473
1.48M
    type +=   get_cabac( &sl->cabac, &sl->cabac_state[39] );
1474
1.48M
    return type;
1475
1.53M
}
1476
1477
static int decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)
1478
12.3M
{
1479
12.3M
    int refa = sl->ref_cache[list][scan8[n] - 1];
1480
12.3M
    int refb = sl->ref_cache[list][scan8[n] - 8];
1481
12.3M
    int ref  = 0;
1482
12.3M
    int ctx  = 0;
1483
1484
12.3M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1485
6.78M
        if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1486
1.32M
            ctx++;
1487
6.78M
        if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1488
1.03M
            ctx += 2;
1489
6.78M
    } else {
1490
5.58M
        if( refa > 0 )
1491
1.85M
            ctx++;
1492
5.58M
        if( refb > 0 )
1493
1.67M
            ctx += 2;
1494
5.58M
    }
1495
1496
19.8M
    while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1497
7.46M
        ref++;
1498
7.46M
        ctx = (ctx>>2)+4;
1499
7.46M
        if(ref >= 32 /*h->ref_list[list]*/){
1500
915
            return -1;
1501
915
        }
1502
7.46M
    }
1503
12.3M
    return ref;
1504
12.3M
}
1505
1506
static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1507
47.4M
{
1508
47.4M
    int mvd;
1509
1510
47.4M
    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
23.0M
        *mvda= 0;
1513
23.0M
        return 0;
1514
23.0M
    }
1515
1516
24.3M
    mvd= 1;
1517
24.3M
    ctxbase+= 3;
1518
106M
    while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1519
81.7M
        if( mvd < 4 )
1520
38.1M
            ctxbase++;
1521
81.7M
        mvd++;
1522
81.7M
    }
1523
1524
24.3M
    if( mvd >= 9 ) {
1525
7.83M
        int k = 3;
1526
13.2M
        while( get_cabac_bypass( &sl->cabac ) ) {
1527
5.42M
            mvd += 1 << k;
1528
5.42M
            k++;
1529
5.42M
            if(k>24){
1530
4.02k
                av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1531
4.02k
                return INT_MIN;
1532
4.02k
            }
1533
5.42M
        }
1534
36.6M
        while( k-- ) {
1535
28.8M
            mvd += get_cabac_bypass( &sl->cabac )<<k;
1536
28.8M
        }
1537
7.83M
        *mvda=mvd < 70 ? mvd : 70;
1538
7.83M
    }else
1539
16.5M
        *mvda=mvd;
1540
24.3M
    return get_cabac_bypass_sign( &sl->cabac, -mvd );
1541
24.3M
}
1542
1543
23.7M
#define DECODE_CABAC_MB_MVD(sl, list,  n )\
1544
23.7M
{\
1545
23.7M
    int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1546
23.7M
                sl->mvd_cache[list][scan8[n] - 8][0];\
1547
23.7M
    int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1548
23.7M
                sl->mvd_cache[list][scan8[n] - 8][1];\
1549
23.7M
\
1550
23.7M
    int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1551
23.7M
    int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1552
23.7M
    if (mxd == INT_MIN || myd == INT_MIN) \
1553
23.7M
        return AVERROR_INVALIDDATA; \
1554
23.7M
    mx += mxd;\
1555
23.7M
    my += myd;\
1556
23.7M
}
1557
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
58.8M
{
1562
58.8M
    int nza, nzb;
1563
58.8M
    int ctx = 0;
1564
58.8M
    static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1565
1566
58.8M
    if( is_dc ) {
1567
5.47M
        if( cat == 3 ) {
1568
3.89M
            idx -= CHROMA_DC_BLOCK_INDEX;
1569
3.89M
            nza = (sl->left_cbp>>(6+idx))&0x01;
1570
3.89M
            nzb = (sl-> top_cbp>>(6+idx))&0x01;
1571
3.89M
        } else {
1572
1.58M
            idx -= LUMA_DC_BLOCK_INDEX;
1573
1.58M
            nza = sl->left_cbp&(0x100<<idx);
1574
1.58M
            nzb = sl-> top_cbp&(0x100<<idx);
1575
1.58M
        }
1576
53.3M
    } else {
1577
53.3M
        nza = sl->non_zero_count_cache[scan8[idx] - 1];
1578
53.3M
        nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1579
53.3M
    }
1580
1581
58.8M
    if( nza > 0 )
1582
29.2M
        ctx++;
1583
1584
58.8M
    if( nzb > 0 )
1585
27.2M
        ctx += 2;
1586
1587
58.8M
    return base_ctx[cat] + ctx;
1588
58.8M
}
1589
1590
static av_always_inline void
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
44.2M
{
1597
44.2M
    static const int significant_coeff_flag_offset[2][14] = {
1598
44.2M
      { 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
44.2M
      { 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
44.2M
    };
1601
44.2M
    static const int last_coeff_flag_offset[2][14] = {
1602
44.2M
      { 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
44.2M
      { 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
44.2M
    };
1605
44.2M
    static const int coeff_abs_level_m1_offset[14] = {
1606
44.2M
        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
44.2M
    };
1608
44.2M
    static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1609
44.2M
      { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1610
44.2M
        4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1611
44.2M
        7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1612
44.2M
       12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1613
44.2M
      { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1614
44.2M
        6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1615
44.2M
        9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1616
44.2M
        9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1617
44.2M
    };
1618
44.2M
    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
44.2M
    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
44.2M
    static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1625
44.2M
        { 5, 5, 5, 5, 6, 7, 8, 9 },
1626
44.2M
        { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1627
44.2M
    };
1628
44.2M
    static const uint8_t coeff_abs_level_transition[2][8] = {
1629
    /* update node ctx after decoding a level=1 */
1630
44.2M
        { 1, 2, 3, 3, 4, 5, 6, 7 },
1631
    /* update node ctx after decoding a level>1 */
1632
44.2M
        { 4, 4, 4, 4, 5, 6, 7, 7 }
1633
44.2M
    };
1634
1635
44.2M
    int index[64];
1636
1637
44.2M
    int last;
1638
44.2M
    int coeff_count = 0;
1639
44.2M
    int node_ctx = 0;
1640
1641
44.2M
    uint8_t *significant_coeff_ctx_base;
1642
44.2M
    uint8_t *last_coeff_ctx_base;
1643
44.2M
    uint8_t *abs_level_m1_ctx_base;
1644
1645
44.2M
#if !ARCH_X86
1646
44.2M
#define CABAC_ON_STACK
1647
44.2M
#endif
1648
44.2M
#ifdef CABAC_ON_STACK
1649
1.02G
#define CC &cc
1650
44.2M
    CABACContext cc;
1651
44.2M
    cc.range     = sl->cabac.range;
1652
44.2M
    cc.low       = sl->cabac.low;
1653
44.2M
    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
44.2M
    significant_coeff_ctx_base = sl->cabac_state
1662
44.2M
        + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1663
44.2M
    last_coeff_ctx_base = sl->cabac_state
1664
44.2M
        + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1665
44.2M
    abs_level_m1_ctx_base = sl->cabac_state
1666
44.2M
        + coeff_abs_level_m1_offset[cat];
1667
1668
44.2M
    if( !is_dc && max_coeff == 64 ) {
1669
10.7M
#define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1670
516M
        for(last= 0; last < coefs; last++) { \
1671
512M
            uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1672
512M
            if( get_cabac( CC, sig_ctx )) { \
1673
149M
                uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1674
149M
                index[coeff_count++] = last; \
1675
149M
                if( get_cabac( CC, last_ctx ) ) { \
1676
41.0M
                    last= max_coeff; \
1677
41.0M
                    break; \
1678
41.0M
                } \
1679
149M
            } \
1680
512M
        }\
1681
44.2M
        if( last == max_coeff -1 ) {\
1682
3.15M
            index[coeff_count++] = last;\
1683
3.15M
        }
1684
10.7M
        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
10.7M
        DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1697
33.4M
    } else {
1698
33.4M
        if (is_dc && chroma422) { // dc 422
1699
966k
            DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1700
32.4M
        } else {
1701
32.4M
            DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1702
32.4M
        }
1703
33.4M
#endif
1704
33.4M
    }
1705
44.2M
    av_assert2(coeff_count > 0);
1706
1707
44.2M
    if( is_dc ) {
1708
3.54M
        if( cat == 3 )
1709
2.31M
            h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1710
1.23M
        else
1711
1.23M
            h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1712
3.54M
        sl->non_zero_count_cache[scan8[n]] = coeff_count;
1713
40.7M
    } else {
1714
40.7M
        if( max_coeff == 64 )
1715
10.7M
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1716
29.9M
        else {
1717
29.9M
            av_assert2( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1718
29.9M
            sl->non_zero_count_cache[scan8[n]] = coeff_count;
1719
29.9M
        }
1720
40.7M
    }
1721
1722
44.2M
#define STORE_BLOCK(type) \
1723
152M
    do { \
1724
152M
        uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1725
152M
 \
1726
152M
        int j= scantable[index[--coeff_count]]; \
1727
152M
 \
1728
152M
        if( get_cabac( CC, ctx ) == 0 ) { \
1729
127M
            node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1730
127M
            if( is_dc ) { \
1731
5.01M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1732
122M
            }else{ \
1733
122M
                ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1734
122M
            } \
1735
127M
        } else { \
1736
25.2M
            unsigned coeff_abs = 2; \
1737
25.2M
            ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1738
25.2M
            node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1739
25.2M
\
1740
59.0M
            while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1741
33.8M
                coeff_abs++; \
1742
33.8M
            } \
1743
25.2M
\
1744
25.2M
            if( coeff_abs >= 15 ) { \
1745
870k
                int j = 0; \
1746
1.86M
                while (get_cabac_bypass(CC) && j < 16+7) { \
1747
994k
                    j++; \
1748
994k
                } \
1749
870k
\
1750
870k
                coeff_abs=1; \
1751
1.86M
                while( j-- ) { \
1752
994k
                    coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1753
994k
                } \
1754
870k
                coeff_abs+= 14U; \
1755
870k
            } \
1756
25.2M
\
1757
25.2M
            if( is_dc ) { \
1758
1.60M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1759
23.6M
            }else{ \
1760
23.6M
                ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1761
23.6M
            } \
1762
25.2M
        } \
1763
152M
    } while ( coeff_count );
1764
1765
44.2M
    if (h->pixel_shift) {
1766
30.4M
        STORE_BLOCK(int32_t)
1767
30.4M
    } else {
1768
13.8M
        STORE_BLOCK(int16_t)
1769
13.8M
    }
1770
44.2M
#ifdef CABAC_ON_STACK
1771
44.2M
            sl->cabac.range     = cc.range     ;
1772
44.2M
            sl->cabac.low       = cc.low       ;
1773
44.2M
            sl->cabac.bytestream= cc.bytestream;
1774
44.2M
#endif
1775
1776
44.2M
}
1777
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
2.58M
{
1785
2.58M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1786
2.58M
}
1787
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
966k
{
1795
966k
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1796
966k
}
1797
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
40.7M
{
1806
40.7M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1807
40.7M
}
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
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
3.76M
{
1828
    /* read coded block flag */
1829
3.76M
    if( get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0 ) {
1830
1.18M
        sl->non_zero_count_cache[scan8[n]] = 0;
1831
1.18M
        return;
1832
1.18M
    }
1833
2.58M
    decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1834
2.58M
}
1835
1836
static av_always_inline void
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
1.70M
{
1842
    /* read coded block flag */
1843
1.70M
    if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1844
740k
        sl->non_zero_count_cache[scan8[n]] = 0;
1845
740k
        return;
1846
740k
    }
1847
966k
    decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1848
966k
}
1849
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
60.9M
{
1858
    /* read coded block flag */
1859
60.9M
    if( (cat != 5 || CHROMA444(h)) && get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 0)]) == 0) {
1860
20.2M
        if( max_coeff == 64 ) {
1861
1.07M
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1862
19.2M
        } else {
1863
19.2M
            sl->non_zero_count_cache[scan8[n]] = 0;
1864
19.2M
        }
1865
20.2M
        return;
1866
20.2M
    }
1867
40.7M
    decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1868
40.7M
}
1869
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
9.94M
{
1874
9.94M
    static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1875
9.94M
    const uint32_t *qmul;
1876
9.94M
    int i8x8, i4x4;
1877
9.94M
    int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1878
9.94M
    if( IS_INTRA16x16( mb_type ) ) {
1879
1.58M
        AV_ZERO128(sl->mb_luma_dc[p]+0);
1880
1.58M
        AV_ZERO128(sl->mb_luma_dc[p]+8);
1881
1.58M
        AV_ZERO128(sl->mb_luma_dc[p]+16);
1882
1.58M
        AV_ZERO128(sl->mb_luma_dc[p]+24);
1883
1.58M
        decode_cabac_residual_dc(h, sl, sl->mb_luma_dc[p], ctx_cat[0][p], LUMA_DC_BLOCK_INDEX+p, scan, 16);
1884
1885
1.58M
        if( cbp&15 ) {
1886
277k
            qmul = h->ps.pps->dequant4_coeff[p][qscale];
1887
4.72M
            for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1888
4.44M
                const int index = 16*p + i4x4;
1889
4.44M
                decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1890
4.44M
            }
1891
1.30M
        } else {
1892
1.30M
            fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1893
1.30M
        }
1894
8.36M
    } else {
1895
8.36M
        int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1896
41.8M
        for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1897
33.4M
            if( cbp & (1<<i8x8) ) {
1898
20.6M
                if( IS_8x8DCT(mb_type) ) {
1899
11.8M
                    const int index = 16*p + 4*i8x8;
1900
11.8M
                    decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1901
11.8M
                                                scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1902
11.8M
                } else {
1903
8.74M
                    qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1904
43.7M
                    for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1905
34.9M
                        const int index = 16*p + 4*i8x8 + i4x4;
1906
34.9M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1907
34.9M
                    }
1908
8.74M
                }
1909
20.6M
            } else {
1910
12.8M
                fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1911
12.8M
            }
1912
33.4M
        }
1913
8.36M
    }
1914
9.94M
}
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
 */
1920
int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
1921
32.6M
{
1922
32.6M
    const SPS *sps = h->ps.sps;
1923
32.6M
    int mb_xy;
1924
32.6M
    int mb_type, partition_count, cbp = 0;
1925
32.6M
    int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
1926
32.6M
    const int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1927
32.6M
    const int pixel_shift = h->pixel_shift;
1928
1929
32.6M
    mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1930
1931
32.6M
    ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1932
32.6M
    if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1933
29.5M
        int skip;
1934
        /* a skipped mb needs the aff flag from the following mb */
1935
29.5M
        if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1936
4.72M
            skip = sl->next_mb_skipped;
1937
24.8M
        else
1938
24.8M
            skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1939
        /* read skip flags */
1940
29.5M
        if( skip ) {
1941
18.3M
            if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1942
4.72M
                h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1943
4.72M
                sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1944
4.72M
                if(!sl->next_mb_skipped)
1945
777k
                    sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1946
4.72M
            }
1947
1948
18.3M
            decode_mb_skip(h, sl);
1949
1950
18.3M
            h->cbp_table[mb_xy] = 0;
1951
18.3M
            h->chroma_pred_mode_table[mb_xy] = 0;
1952
18.3M
            sl->last_qscale_diff = 0;
1953
1954
18.3M
            return 0;
1955
1956
18.3M
        }
1957
29.5M
    }
1958
14.2M
    if (FRAME_MBAFF(h)) {
1959
5.52M
        if ((sl->mb_y & 1) == 0)
1960
2.82M
            sl->mb_mbaff =
1961
2.82M
            sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1962
5.52M
    }
1963
1964
14.2M
    sl->prev_mb_skipped = 0;
1965
1966
14.2M
    fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1967
1968
14.2M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1969
6.05M
        int ctx = 0;
1970
6.05M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1971
1972
6.05M
        if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1973
3.52M
            ctx++;
1974
6.05M
        if (!IS_DIRECT(sl->top_type - 1))
1975
2.60M
            ctx++;
1976
1977
6.05M
        if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1978
252k
            mb_type= 0; /* B_Direct_16x16 */
1979
5.80M
        }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1980
3.20M
            mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1981
3.20M
        }else{
1982
2.60M
            int bits;
1983
2.60M
            bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1984
2.60M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1985
2.60M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1986
2.60M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1987
2.60M
            if( bits < 8 ){
1988
603k
                mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1989
1.99M
            }else if( bits == 13 ){
1990
232k
                mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1991
232k
                goto decode_intra_mb;
1992
1.76M
            }else if( bits == 14 ){
1993
151k
                mb_type= 11; /* B_L1_L0_8x16 */
1994
1.61M
            }else if( bits == 15 ){
1995
748k
                mb_type= 22; /* B_8x8 */
1996
865k
            }else{
1997
865k
                bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1998
865k
                mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1999
865k
            }
2000
2.60M
        }
2001
5.82M
            partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
2002
5.82M
            mb_type         = ff_h264_b_mb_type_info[mb_type].type;
2003
8.23M
    } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
2004
5.10M
        if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
2005
            /* P-type */
2006
4.58M
            if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
2007
                /* P_L0_D16x16, P_8x8 */
2008
3.68M
                mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2009
3.68M
            } else {
2010
                /* P_L0_D8x16, P_L0_D16x8 */
2011
893k
                mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2012
893k
            }
2013
4.58M
            partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2014
4.58M
            mb_type         = ff_h264_p_mb_type_info[mb_type].type;
2015
4.58M
        } else {
2016
529k
            mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2017
529k
            goto decode_intra_mb;
2018
529k
        }
2019
5.10M
    } else {
2020
3.12M
        mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2021
3.12M
        if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2022
923
            mb_type--;
2023
3.12M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2024
3.88M
decode_intra_mb:
2025
3.88M
        partition_count = 0;
2026
3.88M
        cbp                      = ff_h264_i_mb_type_info[mb_type].cbp;
2027
3.88M
        sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2028
3.88M
        mb_type                  = ff_h264_i_mb_type_info[mb_type].type;
2029
3.88M
    }
2030
14.2M
    if (MB_FIELD(sl))
2031
4.90M
        mb_type |= MB_TYPE_INTERLACED;
2032
2033
14.2M
    h->slice_table[mb_xy] = sl->slice_num;
2034
2035
14.2M
    if(IS_INTRA_PCM(mb_type)) {
2036
4.87k
        const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2037
4.87k
                            sps->bit_depth_luma >> 3;
2038
4.87k
        const uint8_t *ptr;
2039
4.87k
        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
4.87k
        ptr= sl->cabac.bytestream;
2045
4.87k
        if(sl->cabac.low&0x1) ptr--;
2046
4.87k
        if(CABAC_BITS==16){
2047
4.87k
            if(sl->cabac.low&0x1FF) ptr--;
2048
4.87k
        }
2049
2050
        // The pixels are stored in the same order as levels in h->mb array.
2051
4.87k
        if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2052
2.25k
            return -1;
2053
2.62k
        sl->intra_pcm_ptr = ptr;
2054
2.62k
        ptr += mb_size;
2055
2056
2.62k
        ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2057
2.62k
        if (ret < 0)
2058
112
            return ret;
2059
2060
        // All blocks are present
2061
2.51k
        h->cbp_table[mb_xy] = 0xf7ef;
2062
2.51k
        h->chroma_pred_mode_table[mb_xy] = 0;
2063
        // In deblocking, the quantizer is 0
2064
2.51k
        h->cur_pic.qscale_table[mb_xy] = 0;
2065
        // All coeffs are present
2066
2.51k
        memset(h->non_zero_count[mb_xy], 16, 48);
2067
2.51k
        h->cur_pic.mb_type[mb_xy] = mb_type;
2068
2.51k
        sl->last_qscale_diff = 0;
2069
2.51k
        return 0;
2070
2.62k
    }
2071
2072
14.2M
    fill_decode_caches(h, sl, mb_type);
2073
2074
14.2M
    if( IS_INTRA( mb_type ) ) {
2075
3.87M
        int i, pred_mode;
2076
3.87M
        if( IS_INTRA4x4( mb_type ) ) {
2077
2.33M
            if (dct8x8_allowed && get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size])) {
2078
1.75M
                mb_type |= MB_TYPE_8x8DCT;
2079
8.76M
                for( i = 0; i < 16; i+=4 ) {
2080
7.00M
                    int pred = pred_intra_mode(h, sl, i);
2081
7.00M
                    int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2082
7.00M
                    fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2083
7.00M
                }
2084
1.75M
            } else {
2085
9.89M
                for( i = 0; i < 16; i++ ) {
2086
9.31M
                    int pred = pred_intra_mode(h, sl, i);
2087
9.31M
                    sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2088
2089
9.31M
                    ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2090
9.31M
                            sl->intra4x4_pred_mode_cache[scan8[i]]);
2091
9.31M
                }
2092
582k
            }
2093
2.33M
            write_back_intra_pred_mode(h, sl);
2094
2.33M
            if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2095
2.33M
                                                 sl->top_samples_available, sl->left_samples_available) < 0 )
2096
346k
                return -1;
2097
2.33M
        } else {
2098
1.54M
            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2099
1.54M
                                                                     sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2100
1.54M
            if (sl->intra16x16_pred_mode < 0) return -1;
2101
1.54M
        }
2102
3.48M
        if(decode_chroma){
2103
3.13M
            h->chroma_pred_mode_table[mb_xy] =
2104
3.13M
            pred_mode                        = decode_cabac_mb_chroma_pre_mode(h, sl);
2105
2106
3.13M
            pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2107
3.13M
                                                     sl->left_samples_available, pred_mode, 1 );
2108
3.13M
            if( pred_mode < 0 ) return -1;
2109
3.07M
            sl->chroma_pred_mode = pred_mode;
2110
3.07M
        } else {
2111
349k
            sl->chroma_pred_mode = DC_128_PRED8x8;
2112
349k
        }
2113
10.4M
    } else if( partition_count == 4 ) {
2114
2.03M
        int i, j, sub_partition_count[4], list, ref[2][4];
2115
2116
2.03M
        if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2117
3.74M
            for( i = 0; i < 4; i++ ) {
2118
2.99M
                sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
2119
2.99M
                sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2120
2.99M
                sl->sub_mb_type[i]     = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2121
2.99M
            }
2122
748k
            if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2123
748k
                          sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2124
230k
                ff_h264_pred_direct_motion(h, sl, &mb_type);
2125
230k
                sl->ref_cache[0][scan8[4]] =
2126
230k
                sl->ref_cache[1][scan8[4]] =
2127
230k
                sl->ref_cache[0][scan8[12]] =
2128
230k
                sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2129
1.15M
                    for( i = 0; i < 4; i++ )
2130
921k
                        fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2131
230k
            }
2132
1.28M
        } else {
2133
6.40M
            for( i = 0; i < 4; i++ ) {
2134
5.12M
                sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2135
5.12M
                sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2136
5.12M
                sl->sub_mb_type[i]     = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2137
5.12M
            }
2138
1.28M
        }
2139
2140
4.78M
        for( list = 0; list < sl->list_count; list++ ) {
2141
13.8M
                for( i = 0; i < 4; i++ ) {
2142
11.0M
                    if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2143
10.3M
                    if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2144
8.57M
                        unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2145
8.57M
                        if (rc > 1) {
2146
4.71M
                            ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2147
4.71M
                            if (ref[list][i] >= rc) {
2148
21.3k
                                av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2149
21.3k
                                return -1;
2150
21.3k
                            }
2151
4.71M
                        }else
2152
3.85M
                            ref[list][i] = 0;
2153
8.57M
                    } else {
2154
1.77M
                        ref[list][i] = -1;
2155
1.77M
                    }
2156
10.3M
                    sl->ref_cache[list][scan8[4 * i] + 1] =
2157
10.3M
                    sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2158
10.3M
                }
2159
2.77M
        }
2160
2161
2.00M
        if(dct8x8_allowed)
2162
1.77M
            dct8x8_allowed = get_dct8x8_allowed(h, sl);
2163
2164
4.75M
        for (list = 0; list < sl->list_count; list++) {
2165
13.7M
            for(i=0; i<4; i++){
2166
11.0M
                sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2167
11.0M
                if(IS_DIRECT(sl->sub_mb_type[i])){
2168
716k
                    fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2169
716k
                    continue;
2170
716k
                }
2171
2172
10.2M
                if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2173
8.52M
                    const int sub_mb_type= sl->sub_mb_type[i];
2174
8.52M
                    const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2175
20.7M
                    for(j=0; j<sub_partition_count[i]; j++){
2176
12.1M
                        int mpx, mpy;
2177
12.1M
                        int mx, my;
2178
12.1M
                        const int index= 4*i + block_width*j;
2179
12.1M
                        int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2180
12.1M
                        uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2181
12.1M
                        pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2182
12.1M
                        DECODE_CABAC_MB_MVD(sl, list, index)
2183
12.1M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2184
2185
12.1M
                        if(IS_SUB_8X8(sub_mb_type)){
2186
5.88M
                            mv_cache[ 1 ][0]=
2187
5.88M
                            mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2188
5.88M
                            mv_cache[ 1 ][1]=
2189
5.88M
                            mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2190
2191
5.88M
                            mvd_cache[ 1 ][0]=
2192
5.88M
                            mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2193
5.88M
                            mvd_cache[ 1 ][1]=
2194
5.88M
                            mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2195
6.29M
                        }else if(IS_SUB_8X4(sub_mb_type)){
2196
2.69M
                            mv_cache[ 1 ][0]= mx;
2197
2.69M
                            mv_cache[ 1 ][1]= my;
2198
2199
2.69M
                            mvd_cache[ 1 ][0]=  mpx;
2200
2.69M
                            mvd_cache[ 1 ][1]= mpy;
2201
3.60M
                        }else if(IS_SUB_4X8(sub_mb_type)){
2202
1.54M
                            mv_cache[ 8 ][0]= mx;
2203
1.54M
                            mv_cache[ 8 ][1]= my;
2204
2205
1.54M
                            mvd_cache[ 8 ][0]= mpx;
2206
1.54M
                            mvd_cache[ 8 ][1]= mpy;
2207
1.54M
                        }
2208
12.1M
                        mv_cache[ 0 ][0]= mx;
2209
12.1M
                        mv_cache[ 0 ][1]= my;
2210
2211
12.1M
                        mvd_cache[ 0 ][0]= mpx;
2212
12.1M
                        mvd_cache[ 0 ][1]= mpy;
2213
12.1M
                    }
2214
8.52M
                }else{
2215
1.76M
                    fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2216
1.76M
                    fill_rectangle(sl->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2217
1.76M
                }
2218
10.2M
            }
2219
2.75M
        }
2220
8.37M
    } else if( IS_DIRECT(mb_type) ) {
2221
252k
        ff_h264_pred_direct_motion(h, sl, &mb_type);
2222
252k
        fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2223
252k
        fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2224
252k
        dct8x8_allowed &= sps->direct_8x8_inference_flag;
2225
8.12M
    } else {
2226
8.12M
        int list, i;
2227
8.12M
        if(IS_16X16(mb_type)){
2228
14.9M
            for (list = 0; list < sl->list_count; list++) {
2229
9.17M
                if(IS_DIR(mb_type, 0, list)){
2230
5.97M
                    int ref;
2231
5.97M
                    unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2232
5.97M
                    if (rc > 1) {
2233
3.83M
                        ref= decode_cabac_mb_ref(sl, list, 0);
2234
3.83M
                        if (ref >= rc) {
2235
22.9k
                            av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2236
22.9k
                            return -1;
2237
22.9k
                        }
2238
3.83M
                    }else
2239
2.14M
                        ref=0;
2240
5.95M
                    fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2241
5.95M
                }
2242
9.17M
            }
2243
14.9M
            for (list = 0; list < sl->list_count; list++) {
2244
9.14M
                if(IS_DIR(mb_type, 0, list)){
2245
5.95M
                    int mx,my,mpx,mpy;
2246
5.95M
                    pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2247
5.95M
                    DECODE_CABAC_MB_MVD(sl, list, 0)
2248
5.95M
                    ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2249
2250
5.95M
                    fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2251
5.95M
                    fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2252
5.95M
                }
2253
9.14M
            }
2254
5.77M
        }
2255
2.32M
        else if(IS_16X8(mb_type)){
2256
3.36M
            for (list = 0; list < sl->list_count; list++) {
2257
6.21M
                    for(i=0; i<2; i++){
2258
4.15M
                        if(IS_DIR(mb_type, i, list)){
2259
3.16M
                            int ref;
2260
3.16M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2261
3.16M
                            if (rc > 1) {
2262
2.09M
                                ref= decode_cabac_mb_ref(sl, list, 8 * i);
2263
2.09M
                                if (ref >= rc) {
2264
21.7k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2265
21.7k
                                    return -1;
2266
21.7k
                                }
2267
2.09M
                            }else
2268
1.07M
                                ref=0;
2269
3.14M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2270
3.14M
                        }else
2271
985k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2272
4.15M
                    }
2273
2.07M
            }
2274
3.33M
            for (list = 0; list < sl->list_count; list++) {
2275
6.14M
                for(i=0; i<2; i++){
2276
4.09M
                    if(IS_DIR(mb_type, i, list)){
2277
3.11M
                        int mx,my,mpx,mpy;
2278
3.11M
                        pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2279
3.11M
                        DECODE_CABAC_MB_MVD(sl, list, 8*i)
2280
3.11M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2281
2282
3.11M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2283
3.11M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2284
3.11M
                    }else{
2285
976k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2286
976k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2287
976k
                    }
2288
4.09M
                }
2289
2.04M
            }
2290
1.28M
        }else{
2291
1.02M
            av_assert2(IS_8X16(mb_type));
2292
2.68M
            for (list = 0; list < sl->list_count; list++) {
2293
5.01M
                    for(i=0; i<2; i++){
2294
3.35M
                        if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2295
2.49M
                            int ref;
2296
2.49M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2297
2.49M
                            if (rc > 1) {
2298
1.72M
                                ref = decode_cabac_mb_ref(sl, list, 4 * i);
2299
1.72M
                                if (ref >= rc) {
2300
16.6k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2301
16.6k
                                    return -1;
2302
16.6k
                                }
2303
1.72M
                            }else
2304
771k
                                ref=0;
2305
2.48M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2306
2.48M
                        }else
2307
856k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2308
3.35M
                    }
2309
1.67M
            }
2310
2.65M
            for (list = 0; list < sl->list_count; list++) {
2311
4.96M
                for(i=0; i<2; i++){
2312
3.30M
                    if(IS_DIR(mb_type, i, list)){
2313
2.46M
                        int mx,my,mpx,mpy;
2314
2.46M
                        pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2315
2.46M
                        DECODE_CABAC_MB_MVD(sl, list, 4*i)
2316
2317
2.45M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2318
2.45M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2319
2.45M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2320
2.45M
                    }else{
2321
847k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2322
847k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2323
847k
                    }
2324
3.30M
                }
2325
1.65M
            }
2326
1.00M
        }
2327
8.12M
    }
2328
2329
13.7M
   if( IS_INTER( mb_type ) ) {
2330
10.3M
        h->chroma_pred_mode_table[mb_xy] = 0;
2331
10.3M
        write_back_motion(h, sl, mb_type);
2332
10.3M
   }
2333
2334
13.7M
    if( !IS_INTRA16x16( mb_type ) ) {
2335
12.2M
        cbp  = decode_cabac_mb_cbp_luma(sl);
2336
12.2M
        if(decode_chroma)
2337
11.0M
            cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2338
12.2M
    } else {
2339
1.48M
        if (!decode_chroma && cbp>15) {
2340
3.11k
            av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2341
3.11k
            return AVERROR_INVALIDDATA;
2342
3.11k
        }
2343
1.48M
    }
2344
2345
13.7M
    h->cbp_table[mb_xy] = sl->cbp = cbp;
2346
2347
13.7M
    if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2348
3.15M
        mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2349
3.15M
    }
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
13.7M
    if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2354
425k
        int i;
2355
425k
        uint8_t *nnz_cache = sl->non_zero_count_cache;
2356
425k
        if (h->x264_build < 151U) {
2357
146k
            for (i = 0; i < 2; i++){
2358
97.7k
                if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2359
28.5k
                    nnz_cache[3+8* 1 + 2*8*i]=
2360
28.5k
                    nnz_cache[3+8* 2 + 2*8*i]=
2361
28.5k
                    nnz_cache[3+8* 6 + 2*8*i]=
2362
28.5k
                    nnz_cache[3+8* 7 + 2*8*i]=
2363
28.5k
                    nnz_cache[3+8*11 + 2*8*i]=
2364
28.5k
                    nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2365
28.5k
                }
2366
97.7k
            }
2367
48.8k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2368
12.7k
                uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2369
12.7k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2370
12.7k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2371
12.7k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2372
12.7k
            }
2373
376k
        } else {
2374
1.12M
            for (i = 0; i < 2; i++){
2375
752k
                if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2376
106k
                    nnz_cache[3+8* 1 + 2*8*i]=
2377
106k
                    nnz_cache[3+8* 2 + 2*8*i]=
2378
106k
                    nnz_cache[3+8* 6 + 2*8*i]=
2379
106k
                    nnz_cache[3+8* 7 + 2*8*i]=
2380
106k
                    nnz_cache[3+8*11 + 2*8*i]=
2381
106k
                    nnz_cache[3+8*12 + 2*8*i]= !IS_INTRA_PCM(sl->left_type[LEFT(i)]) ? 0 : 64;
2382
106k
                }
2383
752k
            }
2384
376k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2385
53.3k
                uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 0x40404040;
2386
53.3k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2387
53.3k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2388
53.3k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2389
53.3k
            }
2390
376k
        }
2391
425k
    }
2392
13.7M
    h->cur_pic.mb_type[mb_xy] = mb_type;
2393
2394
13.7M
    if( cbp || IS_INTRA16x16( mb_type ) ) {
2395
8.48M
        const uint8_t *scan, *scan8x8;
2396
8.48M
        const uint32_t *qmul;
2397
2398
        // decode_cabac_mb_dqp
2399
8.48M
        if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2400
1.27M
            int val = 1;
2401
1.27M
            int ctx= 2;
2402
1.27M
            const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2403
2404
3.02M
            while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2405
1.75M
                ctx= 3;
2406
1.75M
                val++;
2407
1.75M
                if(val > 2*max_qp){ //prevent infinite loop
2408
3.24k
                    av_log(h->avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", sl->mb_x, sl->mb_y);
2409
3.24k
                    return -1;
2410
3.24k
                }
2411
1.75M
            }
2412
2413
1.26M
            if( val&0x01 )
2414
931k
                val=   (val + 1)>>1 ;
2415
337k
            else
2416
337k
                val= -((val + 1)>>1);
2417
1.26M
            sl->last_qscale_diff = val;
2418
1.26M
            sl->qscale += val;
2419
1.26M
            if (((unsigned)sl->qscale) > max_qp){
2420
71.1k
                if (sl->qscale < 0) sl->qscale += max_qp + 1;
2421
48.9k
                else                sl->qscale -= max_qp + 1;
2422
71.1k
            }
2423
1.26M
            sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2424
1.26M
            sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2425
1.26M
        }else
2426
7.21M
            sl->last_qscale_diff=0;
2427
2428
8.47M
        if(IS_INTERLACED(mb_type)){
2429
2.56M
            scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2430
2.56M
            scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
2431
5.91M
        }else{
2432
5.91M
            scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2433
5.91M
            scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2434
5.91M
        }
2435
2436
8.47M
        decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2437
8.47M
        if (CHROMA444(h)) {
2438
734k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2439
734k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2440
7.74M
        } else if (CHROMA422(h)) {
2441
3.07M
            if( cbp&0x30 ){
2442
853k
                int c;
2443
2.56M
                for (c = 0; c < 2; c++)
2444
1.70M
                    decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2445
1.70M
                                                 CHROMA_DC_BLOCK_INDEX + c,
2446
1.70M
                                                 ff_h264_chroma422_dc_scan, 8);
2447
853k
            }
2448
2449
3.07M
            if( cbp&0x20 ) {
2450
392k
                int c, i, i8x8;
2451
1.17M
                for( c = 0; c < 2; c++ ) {
2452
784k
                    int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2453
784k
                    qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2454
2.35M
                    for (i8x8 = 0; i8x8 < 2; i8x8++) {
2455
7.84M
                        for (i = 0; i < 4; i++) {
2456
6.27M
                            const int index = 16 + 16 * c + 8*i8x8 + i;
2457
6.27M
                            decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2458
6.27M
                            mb += 16<<pixel_shift;
2459
6.27M
                        }
2460
1.56M
                    }
2461
784k
                }
2462
2.68M
            } else {
2463
2.68M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2464
2.68M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2465
2.68M
            }
2466
4.66M
        } else /* yuv420 */ {
2467
4.66M
            if( cbp&0x30 ){
2468
1.09M
                int c;
2469
3.27M
                for (c = 0; c < 2; c++)
2470
2.18M
                    decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2471
2.18M
                                             3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2472
1.09M
            }
2473
2474
4.66M
            if( cbp&0x20 ) {
2475
426k
                int c, i;
2476
1.27M
                for( c = 0; c < 2; c++ ) {
2477
852k
                    qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2478
4.26M
                    for( i = 0; i < 4; i++ ) {
2479
3.41M
                        const int index = 16 + 16 * c + i;
2480
3.41M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2481
3.41M
                    }
2482
852k
                }
2483
4.23M
            } else {
2484
4.23M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2485
4.23M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2486
4.23M
            }
2487
4.66M
        }
2488
8.47M
    } else {
2489
5.25M
        fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2490
5.25M
        fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2491
5.25M
        fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2492
5.25M
        sl->last_qscale_diff = 0;
2493
5.25M
    }
2494
2495
13.7M
    h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2496
13.7M
    write_back_non_zero_count(h, sl);
2497
2498
13.7M
    return 0;
2499
13.7M
}