Coverage Report

Created: 2026-01-16 07:48

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
90.0M
#define CABAC(h) 1
29
#define UNCHECKED_BITSTREAM_READER 1
30
79.3M
#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.27M
{
1264
1.27M
    int i;
1265
1.27M
    const int8_t (*tab)[2];
1266
1.27M
    const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);
1267
1268
1.27M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1269
800k
    else                                 tab = cabac_context_init_PB[sl->cabac_init_idc];
1270
1271
    /* calculate pre-state */
1272
1.30G
    for( i= 0; i < 1024; i++ ) {
1273
1.30G
        int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1274
1275
1.30G
        pre^= pre>>31;
1276
1.30G
        if(pre > 124)
1277
45.0M
            pre= 124 + (pre&1);
1278
1279
1.30G
        sl->cabac_state[i] =  pre;
1280
1.30G
    }
1281
1.27M
}
1282
1283
static av_always_inline uint16_t pack8to16(unsigned a, unsigned b)
1284
9.48M
{
1285
#if HAVE_BIGENDIAN
1286
    return (b & 0xFF) + (a << 8);
1287
#else
1288
9.48M
    return (a & 0xFF) + (b << 8);
1289
9.48M
#endif
1290
9.48M
}
1291
1292
static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1293
3.08M
{
1294
3.08M
    const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1295
1296
3.08M
    unsigned long ctx = 0;
1297
1298
3.08M
    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.08M
    ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1300
1301
3.08M
    return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1302
3.08M
}
1303
1304
static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1305
                                      int ctx_base, int intra_slice)
1306
3.65M
{
1307
3.65M
    uint8_t *state= &sl->cabac_state[ctx_base];
1308
3.65M
    int mb_type;
1309
1310
3.65M
    if(intra_slice){
1311
2.90M
        int ctx=0;
1312
2.90M
        if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1313
925k
            ctx++;
1314
2.90M
        if (sl->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1315
826k
            ctx++;
1316
2.90M
        if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1317
1.87M
            return 0;   /* I4x4 */
1318
1.02M
        state += 2;
1319
1.02M
    }else{
1320
749k
        if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1321
328k
            return 0;   /* I4x4 */
1322
749k
    }
1323
1324
1.44M
    if( get_cabac_terminate( &sl->cabac ) )
1325
3.37k
        return 25;  /* PCM */
1326
1327
1.44M
    mb_type = 1; /* I16x16 */
1328
1.44M
    mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1329
1.44M
    if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1330
178k
        mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1331
1.44M
    mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1332
1.44M
    mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1333
1.44M
    return mb_type;
1334
1.44M
}
1335
1336
static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1337
                                int mb_x, int mb_y)
1338
25.4M
{
1339
25.4M
    int mba_xy, mbb_xy;
1340
25.4M
    int ctx = 0;
1341
1342
25.4M
    if (FRAME_MBAFF(h)) { //FIXME merge with the stuff in fill_caches?
1343
12.2M
        int mb_xy = mb_x + (mb_y&~1)*h->mb_stride;
1344
12.2M
        mba_xy = mb_xy - 1;
1345
12.2M
        if( (mb_y&1)
1346
6.10M
            && h->slice_table[mba_xy] == sl->slice_num
1347
5.10M
            && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1348
4.66M
            mba_xy += h->mb_stride;
1349
12.2M
        if (MB_FIELD(sl)) {
1350
3.10M
            mbb_xy = mb_xy - h->mb_stride;
1351
3.10M
            if( !(mb_y&1)
1352
1.49M
                && h->slice_table[mbb_xy] == sl->slice_num
1353
1.02M
                && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1354
632k
                mbb_xy -= h->mb_stride;
1355
3.10M
        }else
1356
9.12M
            mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1357
13.1M
    }else{
1358
13.1M
        int mb_xy = sl->mb_xy;
1359
13.1M
        mba_xy = mb_xy - 1;
1360
13.1M
        mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1361
13.1M
    }
1362
1363
25.4M
    if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1364
8.02M
        ctx++;
1365
25.4M
    if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1366
6.34M
        ctx++;
1367
1368
25.4M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1369
17.5M
        ctx += 13;
1370
25.4M
    return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1371
25.4M
}
1372
1373
static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1374
14.9M
{
1375
14.9M
    int mode = 0;
1376
1377
14.9M
    if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1378
10.8M
        return pred_mode;
1379
1380
4.08M
    mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1381
4.08M
    mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1382
4.08M
    mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1383
1384
4.08M
    return mode + ( mode >= pred_mode );
1385
14.9M
}
1386
1387
static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1388
3.00M
{
1389
3.00M
    const int mba_xy = sl->left_mb_xy[0];
1390
3.00M
    const int mbb_xy = sl->top_mb_xy;
1391
1392
3.00M
    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.00M
    if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1396
606k
        ctx++;
1397
1398
3.00M
    if (sl->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0)
1399
550k
        ctx++;
1400
1401
3.00M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1402
1.98M
        return 0;
1403
1404
1.01M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1405
726k
        return 1;
1406
292k
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1407
157k
        return 2;
1408
135k
    else
1409
135k
        return 3;
1410
292k
}
1411
1412
static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1413
10.6M
{
1414
10.6M
    int cbp_b, cbp_a, ctx, cbp = 0;
1415
1416
10.6M
    cbp_a = sl->left_cbp;
1417
10.6M
    cbp_b = sl->top_cbp;
1418
1419
10.6M
    ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1420
10.6M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1421
10.6M
    ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
1422
10.6M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1423
10.6M
    ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
1424
10.6M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1425
10.6M
    ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
1426
10.6M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1427
10.6M
    return cbp;
1428
10.6M
}
1429
static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1430
9.42M
{
1431
9.42M
    int ctx;
1432
9.42M
    int cbp_a, cbp_b;
1433
1434
9.42M
    cbp_a = (sl->left_cbp>>4)&0x03;
1435
9.42M
    cbp_b = (sl-> top_cbp>>4)&0x03;
1436
1437
9.42M
    ctx = 0;
1438
9.42M
    if( cbp_a > 0 ) ctx++;
1439
9.42M
    if( cbp_b > 0 ) ctx += 2;
1440
9.42M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1441
7.86M
        return 0;
1442
1443
1.55M
    ctx = 4;
1444
1.55M
    if( cbp_a == 2 ) ctx++;
1445
1.55M
    if( cbp_b == 2 ) ctx += 2;
1446
1.55M
    return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1447
9.42M
}
1448
1449
static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1450
4.34M
{
1451
4.34M
    if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1452
2.86M
        return 0;   /* 8x8 */
1453
1.48M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1454
796k
        return 1;   /* 8x4 */
1455
687k
    if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1456
394k
        return 2;   /* 4x8 */
1457
293k
    return 3;       /* 4x4 */
1458
687k
}
1459
static int decode_cabac_b_mb_sub_type(H264SliceContext *sl)
1460
2.54M
{
1461
2.54M
    int type;
1462
2.54M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[36] ) )
1463
340k
        return 0;   /* B_Direct_8x8 */
1464
2.20M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1465
661k
        return 1 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
1466
1.54M
    type = 3;
1467
1.54M
    if( get_cabac( &sl->cabac, &sl->cabac_state[38] ) ) {
1468
152k
        if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1469
47.4k
            return 11 + get_cabac( &sl->cabac, &sl->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
1470
105k
        type += 4;
1471
105k
    }
1472
1.49M
    type += 2*get_cabac( &sl->cabac, &sl->cabac_state[39] );
1473
1.49M
    type +=   get_cabac( &sl->cabac, &sl->cabac_state[39] );
1474
1.49M
    return type;
1475
1.54M
}
1476
1477
static int decode_cabac_mb_ref(H264SliceContext *sl, int list, int n)
1478
9.83M
{
1479
9.83M
    int refa = sl->ref_cache[list][scan8[n] - 1];
1480
9.83M
    int refb = sl->ref_cache[list][scan8[n] - 8];
1481
9.83M
    int ref  = 0;
1482
9.83M
    int ctx  = 0;
1483
1484
9.83M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1485
5.58M
        if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1486
995k
            ctx++;
1487
5.58M
        if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1488
710k
            ctx += 2;
1489
5.58M
    } else {
1490
4.24M
        if( refa > 0 )
1491
1.36M
            ctx++;
1492
4.24M
        if( refb > 0 )
1493
1.31M
            ctx += 2;
1494
4.24M
    }
1495
1496
15.6M
    while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1497
5.83M
        ref++;
1498
5.83M
        ctx = (ctx>>2)+4;
1499
5.83M
        if(ref >= 32 /*h->ref_list[list]*/){
1500
510
            return -1;
1501
510
        }
1502
5.83M
    }
1503
9.83M
    return ref;
1504
9.83M
}
1505
1506
static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1507
39.6M
{
1508
39.6M
    int mvd;
1509
1510
39.6M
    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
19.0M
        *mvda= 0;
1513
19.0M
        return 0;
1514
19.0M
    }
1515
1516
20.6M
    mvd= 1;
1517
20.6M
    ctxbase+= 3;
1518
89.8M
    while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1519
69.1M
        if( mvd < 4 )
1520
32.3M
            ctxbase++;
1521
69.1M
        mvd++;
1522
69.1M
    }
1523
1524
20.6M
    if( mvd >= 9 ) {
1525
6.59M
        int k = 3;
1526
11.0M
        while( get_cabac_bypass( &sl->cabac ) ) {
1527
4.50M
            mvd += 1 << k;
1528
4.50M
            k++;
1529
4.50M
            if(k>24){
1530
3.98k
                av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1531
3.98k
                return INT_MIN;
1532
3.98k
            }
1533
4.50M
        }
1534
30.7M
        while( k-- ) {
1535
24.1M
            mvd += get_cabac_bypass( &sl->cabac )<<k;
1536
24.1M
        }
1537
6.59M
        *mvda=mvd < 70 ? mvd : 70;
1538
6.59M
    }else
1539
14.0M
        *mvda=mvd;
1540
20.6M
    return get_cabac_bypass_sign( &sl->cabac, -mvd );
1541
20.6M
}
1542
1543
19.8M
#define DECODE_CABAC_MB_MVD(sl, list,  n )\
1544
19.8M
{\
1545
19.8M
    int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1546
19.8M
                sl->mvd_cache[list][scan8[n] - 8][0];\
1547
19.8M
    int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1548
19.8M
                sl->mvd_cache[list][scan8[n] - 8][1];\
1549
19.8M
\
1550
19.8M
    int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1551
19.8M
    int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1552
19.8M
    if (mxd == INT_MIN || myd == INT_MIN) \
1553
19.8M
        return AVERROR_INVALIDDATA; \
1554
19.8M
    mx += mxd;\
1555
19.8M
    my += myd;\
1556
19.8M
}
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
53.4M
{
1562
53.4M
    int nza, nzb;
1563
53.4M
    int ctx = 0;
1564
53.4M
    static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1565
1566
53.4M
    if( is_dc ) {
1567
4.92M
        if( cat == 3 ) {
1568
3.43M
            idx -= CHROMA_DC_BLOCK_INDEX;
1569
3.43M
            nza = (sl->left_cbp>>(6+idx))&0x01;
1570
3.43M
            nzb = (sl-> top_cbp>>(6+idx))&0x01;
1571
3.43M
        } else {
1572
1.48M
            idx -= LUMA_DC_BLOCK_INDEX;
1573
1.48M
            nza = sl->left_cbp&(0x100<<idx);
1574
1.48M
            nzb = sl-> top_cbp&(0x100<<idx);
1575
1.48M
        }
1576
48.4M
    } else {
1577
48.4M
        nza = sl->non_zero_count_cache[scan8[idx] - 1];
1578
48.4M
        nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1579
48.4M
    }
1580
1581
53.4M
    if( nza > 0 )
1582
27.0M
        ctx++;
1583
1584
53.4M
    if( nzb > 0 )
1585
25.1M
        ctx += 2;
1586
1587
53.4M
    return base_ctx[cat] + ctx;
1588
53.4M
}
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
40.8M
{
1597
40.8M
    static const int significant_coeff_flag_offset[2][14] = {
1598
40.8M
      { 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
40.8M
      { 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
40.8M
    };
1601
40.8M
    static const int last_coeff_flag_offset[2][14] = {
1602
40.8M
      { 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
40.8M
      { 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
40.8M
    };
1605
40.8M
    static const int coeff_abs_level_m1_offset[14] = {
1606
40.8M
        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
40.8M
    };
1608
40.8M
    static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1609
40.8M
      { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1610
40.8M
        4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1611
40.8M
        7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1612
40.8M
       12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1613
40.8M
      { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1614
40.8M
        6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1615
40.8M
        9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1616
40.8M
        9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1617
40.8M
    };
1618
40.8M
    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
40.8M
    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
40.8M
    static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1625
40.8M
        { 5, 5, 5, 5, 6, 7, 8, 9 },
1626
40.8M
        { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1627
40.8M
    };
1628
40.8M
    static const uint8_t coeff_abs_level_transition[2][8] = {
1629
    /* update node ctx after decoding a level=1 */
1630
40.8M
        { 1, 2, 3, 3, 4, 5, 6, 7 },
1631
    /* update node ctx after decoding a level>1 */
1632
40.8M
        { 4, 4, 4, 4, 5, 6, 7, 7 }
1633
40.8M
    };
1634
1635
40.8M
    int index[64];
1636
1637
40.8M
    int last;
1638
40.8M
    int coeff_count = 0;
1639
40.8M
    int node_ctx = 0;
1640
1641
40.8M
    uint8_t *significant_coeff_ctx_base;
1642
40.8M
    uint8_t *last_coeff_ctx_base;
1643
40.8M
    uint8_t *abs_level_m1_ctx_base;
1644
1645
40.8M
#if !ARCH_X86
1646
40.8M
#define CABAC_ON_STACK
1647
40.8M
#endif
1648
40.8M
#ifdef CABAC_ON_STACK
1649
949M
#define CC &cc
1650
40.8M
    CABACContext cc;
1651
40.8M
    cc.range     = sl->cabac.range;
1652
40.8M
    cc.low       = sl->cabac.low;
1653
40.8M
    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
40.8M
    significant_coeff_ctx_base = sl->cabac_state
1662
40.8M
        + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1663
40.8M
    last_coeff_ctx_base = sl->cabac_state
1664
40.8M
        + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1665
40.8M
    abs_level_m1_ctx_base = sl->cabac_state
1666
40.8M
        + coeff_abs_level_m1_offset[cat];
1667
1668
40.8M
    if( !is_dc && max_coeff == 64 ) {
1669
10.3M
#define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1670
484M
        for(last= 0; last < coefs; last++) { \
1671
481M
            uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1672
481M
            if( get_cabac( CC, sig_ctx )) { \
1673
137M
                uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1674
137M
                index[coeff_count++] = last; \
1675
137M
                if( get_cabac( CC, last_ctx ) ) { \
1676
37.9M
                    last= max_coeff; \
1677
37.9M
                    break; \
1678
37.9M
                } \
1679
137M
            } \
1680
481M
        }\
1681
40.8M
        if( last == max_coeff -1 ) {\
1682
2.88M
            index[coeff_count++] = last;\
1683
2.88M
        }
1684
10.3M
        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.3M
        DECODE_SIGNIFICANCE( 63, sig_off[last], ff_h264_last_coeff_flag_offset_8x8[last] );
1697
30.5M
    } else {
1698
30.5M
        if (is_dc && chroma422) { // dc 422
1699
723k
            DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1700
29.8M
        } else {
1701
29.8M
            DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1702
29.8M
        }
1703
30.5M
#endif
1704
30.5M
    }
1705
40.8M
    av_assert2(coeff_count > 0);
1706
1707
40.8M
    if( is_dc ) {
1708
3.26M
        if( cat == 3 )
1709
2.06M
            h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1710
1.20M
        else
1711
1.20M
            h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1712
3.26M
        sl->non_zero_count_cache[scan8[n]] = coeff_count;
1713
37.5M
    } else {
1714
37.5M
        if( max_coeff == 64 )
1715
10.3M
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1716
27.2M
        else {
1717
27.2M
            av_assert2( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1718
27.2M
            sl->non_zero_count_cache[scan8[n]] = coeff_count;
1719
27.2M
        }
1720
37.5M
    }
1721
1722
40.8M
#define STORE_BLOCK(type) \
1723
139M
    do { \
1724
139M
        uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1725
139M
 \
1726
139M
        int j= scantable[index[--coeff_count]]; \
1727
139M
 \
1728
139M
        if( get_cabac( CC, ctx ) == 0 ) { \
1729
117M
            node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1730
117M
            if( is_dc ) { \
1731
4.57M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1732
113M
            }else{ \
1733
113M
                ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1734
113M
            } \
1735
117M
        } else { \
1736
22.0M
            unsigned coeff_abs = 2; \
1737
22.0M
            ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1738
22.0M
            node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1739
22.0M
\
1740
49.7M
            while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1741
27.7M
                coeff_abs++; \
1742
27.7M
            } \
1743
22.0M
\
1744
22.0M
            if( coeff_abs >= 15 ) { \
1745
692k
                int j = 0; \
1746
1.37M
                while (get_cabac_bypass(CC) && j < 16+7) { \
1747
677k
                    j++; \
1748
677k
                } \
1749
692k
\
1750
692k
                coeff_abs=1; \
1751
1.37M
                while( j-- ) { \
1752
677k
                    coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1753
677k
                } \
1754
692k
                coeff_abs+= 14U; \
1755
692k
            } \
1756
22.0M
\
1757
22.0M
            if( is_dc ) { \
1758
1.37M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1759
20.6M
            }else{ \
1760
20.6M
                ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1761
20.6M
            } \
1762
22.0M
        } \
1763
139M
    } while ( coeff_count );
1764
1765
40.8M
    if (h->pixel_shift) {
1766
27.4M
        STORE_BLOCK(int32_t)
1767
27.4M
    } else {
1768
13.4M
        STORE_BLOCK(int16_t)
1769
13.4M
    }
1770
40.8M
#ifdef CABAC_ON_STACK
1771
40.8M
            sl->cabac.range     = cc.range     ;
1772
40.8M
            sl->cabac.low       = cc.low       ;
1773
40.8M
            sl->cabac.bytestream= cc.bytestream;
1774
40.8M
#endif
1775
1776
40.8M
}
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.54M
{
1785
2.54M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1786
2.54M
}
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
723k
{
1795
723k
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1796
723k
}
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
37.5M
{
1806
37.5M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1807
37.5M
}
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.61M
{
1828
    /* read coded block flag */
1829
3.61M
    if( get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0 ) {
1830
1.07M
        sl->non_zero_count_cache[scan8[n]] = 0;
1831
1.07M
        return;
1832
1.07M
    }
1833
2.54M
    decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1834
2.54M
}
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.30M
{
1842
    /* read coded block flag */
1843
1.30M
    if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1844
586k
        sl->non_zero_count_cache[scan8[n]] = 0;
1845
586k
        return;
1846
586k
    }
1847
723k
    decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1848
723k
}
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
55.6M
{
1858
    /* read coded block flag */
1859
55.6M
    if( (cat != 5 || CHROMA444(h)) && get_cabac( &sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 0)]) == 0) {
1860
18.0M
        if( max_coeff == 64 ) {
1861
929k
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1862
17.1M
        } else {
1863
17.1M
            sl->non_zero_count_cache[scan8[n]] = 0;
1864
17.1M
        }
1865
18.0M
        return;
1866
18.0M
    }
1867
37.5M
    decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1868
37.5M
}
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.13M
{
1874
9.13M
    static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1875
9.13M
    const uint32_t *qmul;
1876
9.13M
    int i8x8, i4x4;
1877
9.13M
    int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1878
9.13M
    if( IS_INTRA16x16( mb_type ) ) {
1879
1.48M
        AV_ZERO128(sl->mb_luma_dc[p]+0);
1880
1.48M
        AV_ZERO128(sl->mb_luma_dc[p]+8);
1881
1.48M
        AV_ZERO128(sl->mb_luma_dc[p]+16);
1882
1.48M
        AV_ZERO128(sl->mb_luma_dc[p]+24);
1883
1.48M
        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.48M
        if( cbp&15 ) {
1886
237k
            qmul = h->ps.pps->dequant4_coeff[p][qscale];
1887
4.03M
            for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1888
3.79M
                const int index = 16*p + i4x4;
1889
3.79M
                decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1890
3.79M
            }
1891
1.25M
        } else {
1892
1.25M
            fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1893
1.25M
        }
1894
7.64M
    } else {
1895
7.64M
        int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1896
38.2M
        for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1897
30.5M
            if( cbp & (1<<i8x8) ) {
1898
19.4M
                if( IS_8x8DCT(mb_type) ) {
1899
11.2M
                    const int index = 16*p + 4*i8x8;
1900
11.2M
                    decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1901
11.2M
                                                scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1902
11.2M
                } else {
1903
8.18M
                    qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1904
40.9M
                    for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1905
32.7M
                        const int index = 16*p + 4*i8x8 + i4x4;
1906
32.7M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1907
32.7M
                    }
1908
8.18M
                }
1909
19.4M
            } else {
1910
11.1M
                fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1911
11.1M
            }
1912
30.5M
        }
1913
7.64M
    }
1914
9.13M
}
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
28.3M
{
1922
28.3M
    const SPS *sps = h->ps.sps;
1923
28.3M
    int mb_xy;
1924
28.3M
    int mb_type, partition_count, cbp = 0;
1925
28.3M
    int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
1926
28.3M
    const int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1927
28.3M
    const int pixel_shift = h->pixel_shift;
1928
1929
28.3M
    mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1930
1931
28.3M
    ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1932
28.3M
    if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1933
25.4M
        int skip;
1934
        /* a skipped mb needs the aff flag from the following mb */
1935
25.4M
        if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1936
4.19M
            skip = sl->next_mb_skipped;
1937
21.2M
        else
1938
21.2M
            skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1939
        /* read skip flags */
1940
25.4M
        if( skip ) {
1941
15.8M
            if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1942
4.19M
                h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1943
4.19M
                sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1944
4.19M
                if(!sl->next_mb_skipped)
1945
663k
                    sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1946
4.19M
            }
1947
1948
15.8M
            decode_mb_skip(h, sl);
1949
1950
15.8M
            h->cbp_table[mb_xy] = 0;
1951
15.8M
            h->chroma_pred_mode_table[mb_xy] = 0;
1952
15.8M
            sl->last_qscale_diff = 0;
1953
1954
15.8M
            return 0;
1955
1956
15.8M
        }
1957
25.4M
    }
1958
12.4M
    if (FRAME_MBAFF(h)) {
1959
4.72M
        if ((sl->mb_y & 1) == 0)
1960
2.41M
            sl->mb_mbaff =
1961
2.41M
            sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1962
4.72M
    }
1963
1964
12.4M
    sl->prev_mb_skipped = 0;
1965
1966
12.4M
    fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1967
1968
12.4M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1969
5.24M
        int ctx = 0;
1970
5.24M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1971
1972
5.24M
        if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1973
2.93M
            ctx++;
1974
5.24M
        if (!IS_DIRECT(sl->top_type - 1))
1975
2.09M
            ctx++;
1976
1977
5.24M
        if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1978
227k
            mb_type= 0; /* B_Direct_16x16 */
1979
5.01M
        }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1980
2.85M
            mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1981
2.85M
        }else{
1982
2.16M
            int bits;
1983
2.16M
            bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1984
2.16M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1985
2.16M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1986
2.16M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1987
2.16M
            if( bits < 8 ){
1988
543k
                mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1989
1.61M
            }else if( bits == 13 ){
1990
217k
                mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1991
217k
                goto decode_intra_mb;
1992
1.39M
            }else if( bits == 14 ){
1993
109k
                mb_type= 11; /* B_L1_L0_8x16 */
1994
1.29M
            }else if( bits == 15 ){
1995
636k
                mb_type= 22; /* B_8x8 */
1996
653k
            }else{
1997
653k
                bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1998
653k
                mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1999
653k
            }
2000
2.16M
        }
2001
5.02M
            partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
2002
5.02M
            mb_type         = ff_h264_b_mb_type_info[mb_type].type;
2003
7.19M
    } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
2004
4.29M
        if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
2005
            /* P-type */
2006
3.75M
            if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
2007
                /* P_L0_D16x16, P_8x8 */
2008
3.08M
                mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2009
3.08M
            } else {
2010
                /* P_L0_D8x16, P_L0_D16x8 */
2011
670k
                mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2012
670k
            }
2013
3.75M
            partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2014
3.75M
            mb_type         = ff_h264_p_mb_type_info[mb_type].type;
2015
3.75M
        } else {
2016
531k
            mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2017
531k
            goto decode_intra_mb;
2018
531k
        }
2019
4.29M
    } else {
2020
2.90M
        mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2021
2.90M
        if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2022
849
            mb_type--;
2023
2.90M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2024
3.65M
decode_intra_mb:
2025
3.65M
        partition_count = 0;
2026
3.65M
        cbp                      = ff_h264_i_mb_type_info[mb_type].cbp;
2027
3.65M
        sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2028
3.65M
        mb_type                  = ff_h264_i_mb_type_info[mb_type].type;
2029
3.65M
    }
2030
12.4M
    if (MB_FIELD(sl))
2031
3.74M
        mb_type |= MB_TYPE_INTERLACED;
2032
2033
12.4M
    h->slice_table[mb_xy] = sl->slice_num;
2034
2035
12.4M
    if(IS_INTRA_PCM(mb_type)) {
2036
3.37k
        const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2037
3.37k
                            sps->bit_depth_luma >> 3;
2038
3.37k
        const uint8_t *ptr;
2039
3.37k
        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
3.37k
        ptr= sl->cabac.bytestream;
2045
3.37k
        if(sl->cabac.low&0x1) ptr--;
2046
3.37k
        if(CABAC_BITS==16){
2047
3.37k
            if(sl->cabac.low&0x1FF) ptr--;
2048
3.37k
        }
2049
2050
        // The pixels are stored in the same order as levels in h->mb array.
2051
3.37k
        if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2052
954
            return -1;
2053
2.41k
        sl->intra_pcm_ptr = ptr;
2054
2.41k
        ptr += mb_size;
2055
2056
2.41k
        ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2057
2.41k
        if (ret < 0)
2058
111
            return ret;
2059
2060
        // All blocks are present
2061
2.30k
        h->cbp_table[mb_xy] = 0xf7ef;
2062
2.30k
        h->chroma_pred_mode_table[mb_xy] = 0;
2063
        // In deblocking, the quantizer is 0
2064
2.30k
        h->cur_pic.qscale_table[mb_xy] = 0;
2065
        // All coeffs are present
2066
2.30k
        memset(h->non_zero_count[mb_xy], 16, 48);
2067
2.30k
        h->cur_pic.mb_type[mb_xy] = mb_type;
2068
2.30k
        sl->last_qscale_diff = 0;
2069
2.30k
        return 0;
2070
2.41k
    }
2071
2072
12.4M
    fill_decode_caches(h, sl, mb_type);
2073
2074
12.4M
    if( IS_INTRA( mb_type ) ) {
2075
3.64M
        int i, pred_mode;
2076
3.64M
        if( IS_INTRA4x4( mb_type ) ) {
2077
2.20M
            if (dct8x8_allowed && get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size])) {
2078
1.69M
                mb_type |= MB_TYPE_8x8DCT;
2079
8.47M
                for( i = 0; i < 16; i+=4 ) {
2080
6.78M
                    int pred = pred_intra_mode(h, sl, i);
2081
6.78M
                    int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2082
6.78M
                    fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2083
6.78M
                }
2084
1.69M
            } else {
2085
8.66M
                for( i = 0; i < 16; i++ ) {
2086
8.15M
                    int pred = pred_intra_mode(h, sl, i);
2087
8.15M
                    sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2088
2089
8.15M
                    ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2090
8.15M
                            sl->intra4x4_pred_mode_cache[scan8[i]]);
2091
8.15M
                }
2092
509k
            }
2093
2.20M
            write_back_intra_pred_mode(h, sl);
2094
2.20M
            if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2095
2.20M
                                                 sl->top_samples_available, sl->left_samples_available) < 0 )
2096
267k
                return -1;
2097
2.20M
        } else {
2098
1.44M
            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2099
1.44M
                                                                     sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2100
1.44M
            if (sl->intra16x16_pred_mode < 0) return -1;
2101
1.44M
        }
2102
3.33M
        if(decode_chroma){
2103
3.00M
            h->chroma_pred_mode_table[mb_xy] =
2104
3.00M
            pred_mode                        = decode_cabac_mb_chroma_pre_mode(h, sl);
2105
2106
3.00M
            pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2107
3.00M
                                                     sl->left_samples_available, pred_mode, 1 );
2108
3.00M
            if( pred_mode < 0 ) return -1;
2109
2.96M
            sl->chroma_pred_mode = pred_mode;
2110
2.96M
        } else {
2111
333k
            sl->chroma_pred_mode = DC_128_PRED8x8;
2112
333k
        }
2113
8.78M
    } else if( partition_count == 4 ) {
2114
1.72M
        int i, j, sub_partition_count[4], list, ref[2][4];
2115
2116
1.72M
        if (sl->slice_type_nos == AV_PICTURE_TYPE_B ) {
2117
3.18M
            for( i = 0; i < 4; i++ ) {
2118
2.54M
                sl->sub_mb_type[i] = decode_cabac_b_mb_sub_type(sl);
2119
2.54M
                sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2120
2.54M
                sl->sub_mb_type[i]     = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
2121
2.54M
            }
2122
636k
            if (IS_DIRECT(sl->sub_mb_type[0] | sl->sub_mb_type[1] |
2123
636k
                          sl->sub_mb_type[2] | sl->sub_mb_type[3])) {
2124
215k
                ff_h264_pred_direct_motion(h, sl, &mb_type);
2125
215k
                sl->ref_cache[0][scan8[4]] =
2126
215k
                sl->ref_cache[1][scan8[4]] =
2127
215k
                sl->ref_cache[0][scan8[12]] =
2128
215k
                sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
2129
1.07M
                    for( i = 0; i < 4; i++ )
2130
861k
                        fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2131
215k
            }
2132
1.08M
        } else {
2133
5.42M
            for( i = 0; i < 4; i++ ) {
2134
4.34M
                sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2135
4.34M
                sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2136
4.34M
                sl->sub_mb_type[i]     = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2137
4.34M
            }
2138
1.08M
        }
2139
2140
4.05M
        for( list = 0; list < sl->list_count; list++ ) {
2141
11.7M
                for( i = 0; i < 4; i++ ) {
2142
9.38M
                    if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2143
8.71M
                    if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2144
7.35M
                        unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2145
7.35M
                        if (rc > 1) {
2146
3.63M
                            ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2147
3.63M
                            if (ref[list][i] >= rc) {
2148
20.5k
                                av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2149
20.5k
                                return -1;
2150
20.5k
                            }
2151
3.63M
                        }else
2152
3.71M
                            ref[list][i] = 0;
2153
7.35M
                    } else {
2154
1.35M
                        ref[list][i] = -1;
2155
1.35M
                    }
2156
8.69M
                    sl->ref_cache[list][scan8[4 * i] + 1] =
2157
8.69M
                    sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2158
8.69M
                }
2159
2.35M
        }
2160
2161
1.70M
        if(dct8x8_allowed)
2162
1.51M
            dct8x8_allowed = get_dct8x8_allowed(h, sl);
2163
2164
4.03M
        for (list = 0; list < sl->list_count; list++) {
2165
11.6M
            for(i=0; i<4; i++){
2166
9.32M
                sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2167
9.32M
                if(IS_DIRECT(sl->sub_mb_type[i])){
2168
671k
                    fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2169
671k
                    continue;
2170
671k
                }
2171
2172
8.64M
                if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2173
7.30M
                    const int sub_mb_type= sl->sub_mb_type[i];
2174
7.30M
                    const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2175
17.6M
                    for(j=0; j<sub_partition_count[i]; j++){
2176
10.3M
                        int mpx, mpy;
2177
10.3M
                        int mx, my;
2178
10.3M
                        const int index= 4*i + block_width*j;
2179
10.3M
                        int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2180
10.3M
                        uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2181
10.3M
                        pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2182
10.3M
                        DECODE_CABAC_MB_MVD(sl, list, index)
2183
10.3M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2184
2185
10.3M
                        if(IS_SUB_8X8(sub_mb_type)){
2186
4.98M
                            mv_cache[ 1 ][0]=
2187
4.98M
                            mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2188
4.98M
                            mv_cache[ 1 ][1]=
2189
4.98M
                            mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2190
2191
4.98M
                            mvd_cache[ 1 ][0]=
2192
4.98M
                            mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2193
4.98M
                            mvd_cache[ 1 ][1]=
2194
4.98M
                            mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2195
5.37M
                        }else if(IS_SUB_8X4(sub_mb_type)){
2196
2.51M
                            mv_cache[ 1 ][0]= mx;
2197
2.51M
                            mv_cache[ 1 ][1]= my;
2198
2199
2.51M
                            mvd_cache[ 1 ][0]=  mpx;
2200
2.51M
                            mvd_cache[ 1 ][1]= mpy;
2201
2.86M
                        }else if(IS_SUB_4X8(sub_mb_type)){
2202
1.38M
                            mv_cache[ 8 ][0]= mx;
2203
1.38M
                            mv_cache[ 8 ][1]= my;
2204
2205
1.38M
                            mvd_cache[ 8 ][0]= mpx;
2206
1.38M
                            mvd_cache[ 8 ][1]= mpy;
2207
1.38M
                        }
2208
10.3M
                        mv_cache[ 0 ][0]= mx;
2209
10.3M
                        mv_cache[ 0 ][1]= my;
2210
2211
10.3M
                        mvd_cache[ 0 ][0]= mpx;
2212
10.3M
                        mvd_cache[ 0 ][1]= mpy;
2213
10.3M
                    }
2214
7.30M
                }else{
2215
1.34M
                    fill_rectangle(sl->mv_cache [list][ scan8[4*i] ], 2, 2, 8, 0, 4);
2216
1.34M
                    fill_rectangle(sl->mvd_cache[list][ scan8[4*i] ], 2, 2, 8, 0, 2);
2217
1.34M
                }
2218
8.64M
            }
2219
2.33M
        }
2220
7.06M
    } else if( IS_DIRECT(mb_type) ) {
2221
227k
        ff_h264_pred_direct_motion(h, sl, &mb_type);
2222
227k
        fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2223
227k
        fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2224
227k
        dct8x8_allowed &= sps->direct_8x8_inference_flag;
2225
6.83M
    } else {
2226
6.83M
        int list, i;
2227
6.83M
        if(IS_16X16(mb_type)){
2228
13.0M
            for (list = 0; list < sl->list_count; list++) {
2229
8.04M
                if(IS_DIR(mb_type, 0, list)){
2230
5.19M
                    int ref;
2231
5.19M
                    unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2232
5.19M
                    if (rc > 1) {
2233
3.28M
                        ref= decode_cabac_mb_ref(sl, list, 0);
2234
3.28M
                        if (ref >= rc) {
2235
18.6k
                            av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2236
18.6k
                            return -1;
2237
18.6k
                        }
2238
3.28M
                    }else
2239
1.90M
                        ref=0;
2240
5.17M
                    fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2241
5.17M
                }
2242
8.04M
            }
2243
13.0M
            for (list = 0; list < sl->list_count; list++) {
2244
8.01M
                if(IS_DIR(mb_type, 0, list)){
2245
5.17M
                    int mx,my,mpx,mpy;
2246
5.17M
                    pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2247
5.17M
                    DECODE_CABAC_MB_MVD(sl, list, 0)
2248
5.16M
                    ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2249
2250
5.16M
                    fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2251
5.16M
                    fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2252
5.16M
                }
2253
8.01M
            }
2254
5.00M
        }
2255
1.81M
        else if(IS_16X8(mb_type)){
2256
2.54M
            for (list = 0; list < sl->list_count; list++) {
2257
4.70M
                    for(i=0; i<2; i++){
2258
3.14M
                        if(IS_DIR(mb_type, i, list)){
2259
2.34M
                            int ref;
2260
2.34M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2261
2.34M
                            if (rc > 1) {
2262
1.50M
                                ref= decode_cabac_mb_ref(sl, list, 8 * i);
2263
1.50M
                                if (ref >= rc) {
2264
19.4k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2265
19.4k
                                    return -1;
2266
19.4k
                                }
2267
1.50M
                            }else
2268
847k
                                ref=0;
2269
2.33M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2270
2.33M
                        }else
2271
798k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2272
3.14M
                    }
2273
1.57M
            }
2274
2.51M
            for (list = 0; list < sl->list_count; list++) {
2275
4.63M
                for(i=0; i<2; i++){
2276
3.09M
                    if(IS_DIR(mb_type, i, list)){
2277
2.30M
                        int mx,my,mpx,mpy;
2278
2.30M
                        pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2279
2.30M
                        DECODE_CABAC_MB_MVD(sl, list, 8*i)
2280
2.30M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2281
2282
2.30M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2283
2.30M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2284
2.30M
                    }else{
2285
789k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2286
789k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2287
789k
                    }
2288
3.09M
                }
2289
1.54M
            }
2290
966k
        }else{
2291
824k
            av_assert2(IS_8X16(mb_type));
2292
2.17M
            for (list = 0; list < sl->list_count; list++) {
2293
4.08M
                    for(i=0; i<2; i++){
2294
2.73M
                        if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2295
2.04M
                            int ref;
2296
2.04M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2297
2.04M
                            if (rc > 1) {
2298
1.40M
                                ref = decode_cabac_mb_ref(sl, list, 4 * i);
2299
1.40M
                                if (ref >= rc) {
2300
14.5k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2301
14.5k
                                    return -1;
2302
14.5k
                                }
2303
1.40M
                            }else
2304
638k
                                ref=0;
2305
2.03M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2306
2.03M
                        }else
2307
684k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2308
2.73M
                    }
2309
1.36M
            }
2310
2.15M
            for (list = 0; list < sl->list_count; list++) {
2311
4.03M
                for(i=0; i<2; i++){
2312
2.68M
                    if(IS_DIR(mb_type, i, list)){
2313
2.01M
                        int mx,my,mpx,mpy;
2314
2.01M
                        pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2315
2.01M
                        DECODE_CABAC_MB_MVD(sl, list, 4*i)
2316
2317
2.01M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2318
2.01M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2319
2.01M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2320
2.01M
                    }else{
2321
675k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2322
675k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2323
675k
                    }
2324
2.68M
                }
2325
1.34M
            }
2326
810k
        }
2327
6.83M
    }
2328
2329
12.0M
   if( IS_INTER( mb_type ) ) {
2330
8.71M
        h->chroma_pred_mode_table[mb_xy] = 0;
2331
8.71M
        write_back_motion(h, sl, mb_type);
2332
8.71M
   }
2333
2334
12.0M
    if( !IS_INTRA16x16( mb_type ) ) {
2335
10.6M
        cbp  = decode_cabac_mb_cbp_luma(sl);
2336
10.6M
        if(decode_chroma)
2337
9.42M
            cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2338
10.6M
    } else {
2339
1.39M
        if (!decode_chroma && cbp>15) {
2340
3.27k
            av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2341
3.27k
            return AVERROR_INVALIDDATA;
2342
3.27k
        }
2343
1.39M
    }
2344
2345
12.0M
    h->cbp_table[mb_xy] = sl->cbp = cbp;
2346
2347
12.0M
    if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2348
2.74M
        mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2349
2.74M
    }
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
12.0M
    if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2354
411k
        int i;
2355
411k
        uint8_t *nnz_cache = sl->non_zero_count_cache;
2356
411k
        if (h->x264_build < 151U) {
2357
132k
            for (i = 0; i < 2; i++){
2358
88.5k
                if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2359
26.9k
                    nnz_cache[3+8* 1 + 2*8*i]=
2360
26.9k
                    nnz_cache[3+8* 2 + 2*8*i]=
2361
26.9k
                    nnz_cache[3+8* 6 + 2*8*i]=
2362
26.9k
                    nnz_cache[3+8* 7 + 2*8*i]=
2363
26.9k
                    nnz_cache[3+8*11 + 2*8*i]=
2364
26.9k
                    nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2365
26.9k
                }
2366
88.5k
            }
2367
44.2k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2368
11.4k
                uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2369
11.4k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2370
11.4k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2371
11.4k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2372
11.4k
            }
2373
367k
        } else {
2374
1.10M
            for (i = 0; i < 2; i++){
2375
735k
                if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2376
104k
                    nnz_cache[3+8* 1 + 2*8*i]=
2377
104k
                    nnz_cache[3+8* 2 + 2*8*i]=
2378
104k
                    nnz_cache[3+8* 6 + 2*8*i]=
2379
104k
                    nnz_cache[3+8* 7 + 2*8*i]=
2380
104k
                    nnz_cache[3+8*11 + 2*8*i]=
2381
104k
                    nnz_cache[3+8*12 + 2*8*i]= !IS_INTRA_PCM(sl->left_type[LEFT(i)]) ? 0 : 64;
2382
104k
                }
2383
735k
            }
2384
367k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2385
54.7k
                uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 0x40404040;
2386
54.7k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2387
54.7k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2388
54.7k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2389
54.7k
            }
2390
367k
        }
2391
411k
    }
2392
12.0M
    h->cur_pic.mb_type[mb_xy] = mb_type;
2393
2394
12.0M
    if( cbp || IS_INTRA16x16( mb_type ) ) {
2395
7.65M
        const uint8_t *scan, *scan8x8;
2396
7.65M
        const uint32_t *qmul;
2397
2398
        // decode_cabac_mb_dqp
2399
7.65M
        if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2400
1.16M
            int val = 1;
2401
1.16M
            int ctx= 2;
2402
1.16M
            const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2403
2404
2.74M
            while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2405
1.57M
                ctx= 3;
2406
1.57M
                val++;
2407
1.57M
                if(val > 2*max_qp){ //prevent infinite loop
2408
3.26k
                    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.26k
                    return -1;
2410
3.26k
                }
2411
1.57M
            }
2412
2413
1.16M
            if( val&0x01 )
2414
860k
                val=   (val + 1)>>1 ;
2415
302k
            else
2416
302k
                val= -((val + 1)>>1);
2417
1.16M
            sl->last_qscale_diff = val;
2418
1.16M
            sl->qscale += val;
2419
1.16M
            if (((unsigned)sl->qscale) > max_qp){
2420
69.6k
                if (sl->qscale < 0) sl->qscale += max_qp + 1;
2421
47.9k
                else                sl->qscale -= max_qp + 1;
2422
69.6k
            }
2423
1.16M
            sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2424
1.16M
            sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2425
1.16M
        }else
2426
6.49M
            sl->last_qscale_diff=0;
2427
2428
7.65M
        if(IS_INTERLACED(mb_type)){
2429
1.98M
            scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2430
1.98M
            scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
2431
5.66M
        }else{
2432
5.66M
            scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2433
5.66M
            scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2434
5.66M
        }
2435
2436
7.65M
        decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2437
7.65M
        if (CHROMA444(h)) {
2438
740k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2439
740k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2440
6.91M
        } else if (CHROMA422(h)) {
2441
2.38M
            if( cbp&0x30 ){
2442
654k
                int c;
2443
1.96M
                for (c = 0; c < 2; c++)
2444
1.30M
                    decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2445
1.30M
                                                 CHROMA_DC_BLOCK_INDEX + c,
2446
1.30M
                                                 ff_h264_chroma422_dc_scan, 8);
2447
654k
            }
2448
2449
2.38M
            if( cbp&0x20 ) {
2450
295k
                int c, i, i8x8;
2451
885k
                for( c = 0; c < 2; c++ ) {
2452
590k
                    int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2453
590k
                    qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2454
1.77M
                    for (i8x8 = 0; i8x8 < 2; i8x8++) {
2455
5.90M
                        for (i = 0; i < 4; i++) {
2456
4.72M
                            const int index = 16 + 16 * c + 8*i8x8 + i;
2457
4.72M
                            decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2458
4.72M
                            mb += 16<<pixel_shift;
2459
4.72M
                        }
2460
1.18M
                    }
2461
590k
                }
2462
2.08M
            } else {
2463
2.08M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2464
2.08M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2465
2.08M
            }
2466
4.53M
        } else /* yuv420 */ {
2467
4.53M
            if( cbp&0x30 ){
2468
1.06M
                int c;
2469
3.19M
                for (c = 0; c < 2; c++)
2470
2.12M
                    decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2471
2.12M
                                             3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2472
1.06M
            }
2473
2474
4.53M
            if( cbp&0x20 ) {
2475
392k
                int c, i;
2476
1.17M
                for( c = 0; c < 2; c++ ) {
2477
784k
                    qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2478
3.92M
                    for( i = 0; i < 4; i++ ) {
2479
3.13M
                        const int index = 16 + 16 * c + i;
2480
3.13M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2481
3.13M
                    }
2482
784k
                }
2483
4.14M
            } else {
2484
4.14M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2485
4.14M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2486
4.14M
            }
2487
4.53M
        }
2488
7.65M
    } else {
2489
4.34M
        fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2490
4.34M
        fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2491
4.34M
        fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2492
4.34M
        sl->last_qscale_diff = 0;
2493
4.34M
    }
2494
2495
11.9M
    h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2496
11.9M
    write_back_non_zero_count(h, sl);
2497
2498
11.9M
    return 0;
2499
12.0M
}