Coverage Report

Created: 2026-02-14 06:59

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
91.1M
#define CABAC(h) 1
29
#define UNCHECKED_BITSTREAM_READER 1
30
80.9M
#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.30M
{
1264
1.30M
    int i;
1265
1.30M
    const int8_t (*tab)[2];
1266
1.30M
    const int slice_qp = av_clip(sl->qscale - 6*(h->ps.sps->bit_depth_luma-8), 0, 51);
1267
1268
1.30M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_I) tab = cabac_context_init_I;
1269
821k
    else                                 tab = cabac_context_init_PB[sl->cabac_init_idc];
1270
1271
    /* calculate pre-state */
1272
1.33G
    for( i= 0; i < 1024; i++ ) {
1273
1.33G
        int pre = 2*(((tab[i][0] * slice_qp) >>4 ) + tab[i][1]) - 127;
1274
1275
1.33G
        pre^= pre>>31;
1276
1.33G
        if(pre > 124)
1277
45.7M
            pre= 124 + (pre&1);
1278
1279
1.33G
        sl->cabac_state[i] =  pre;
1280
1.33G
    }
1281
1.30M
}
1282
1283
static av_always_inline uint16_t pack8to16(unsigned a, unsigned b)
1284
9.62M
{
1285
#if HAVE_BIGENDIAN
1286
    return (b & 0xFF) + (a << 8);
1287
#else
1288
9.62M
    return (a & 0xFF) + (b << 8);
1289
9.62M
#endif
1290
9.62M
}
1291
1292
static int decode_cabac_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
1293
3.10M
{
1294
3.10M
    const int mbb_xy = sl->mb_xy - 2*h->mb_stride;
1295
1296
3.10M
    unsigned long ctx = 0;
1297
1298
3.10M
    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.10M
    ctx += (h->cur_pic.mb_type[mbb_xy] >> 7) & (h->slice_table[mbb_xy] == sl->slice_num);
1300
1301
3.10M
    return get_cabac_noinline( &sl->cabac, &(sl->cabac_state+70)[ctx] );
1302
3.10M
}
1303
1304
static int decode_cabac_intra_mb_type(H264SliceContext *sl,
1305
                                      int ctx_base, int intra_slice)
1306
3.67M
{
1307
3.67M
    uint8_t *state= &sl->cabac_state[ctx_base];
1308
3.67M
    int mb_type;
1309
1310
3.67M
    if(intra_slice){
1311
2.92M
        int ctx=0;
1312
2.92M
        if (sl->left_type[LTOP] & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1313
936k
            ctx++;
1314
2.92M
        if (sl->top_type        & (MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM))
1315
833k
            ctx++;
1316
2.92M
        if( get_cabac_noinline( &sl->cabac, &state[ctx] ) == 0 )
1317
1.88M
            return 0;   /* I4x4 */
1318
1.03M
        state += 2;
1319
1.03M
    }else{
1320
748k
        if( get_cabac_noinline( &sl->cabac, state ) == 0 )
1321
329k
            return 0;   /* I4x4 */
1322
748k
    }
1323
1324
1.45M
    if( get_cabac_terminate( &sl->cabac ) )
1325
3.35k
        return 25;  /* PCM */
1326
1327
1.45M
    mb_type = 1; /* I16x16 */
1328
1.45M
    mb_type += 12 * get_cabac_noinline( &sl->cabac, &state[1] ); /* cbp_luma != 0 */
1329
1.45M
    if( get_cabac_noinline( &sl->cabac, &state[2] ) ) /* cbp_chroma */
1330
180k
        mb_type += 4 + 4 * get_cabac_noinline( &sl->cabac, &state[2+intra_slice] );
1331
1.45M
    mb_type += 2 * get_cabac_noinline( &sl->cabac, &state[3+intra_slice] );
1332
1.45M
    mb_type += 1 * get_cabac_noinline( &sl->cabac, &state[3+2*intra_slice] );
1333
1.45M
    return mb_type;
1334
1.45M
}
1335
1336
static int decode_cabac_mb_skip(const H264Context *h, H264SliceContext *sl,
1337
                                int mb_x, int mb_y)
1338
25.7M
{
1339
25.7M
    int mba_xy, mbb_xy;
1340
25.7M
    int ctx = 0;
1341
1342
25.7M
    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.13M
            && h->slice_table[mba_xy] == sl->slice_num
1347
5.13M
            && MB_FIELD(sl) == !!IS_INTERLACED( h->cur_pic.mb_type[mba_xy] ) )
1348
4.68M
            mba_xy += h->mb_stride;
1349
12.2M
        if (MB_FIELD(sl)) {
1350
3.13M
            mbb_xy = mb_xy - h->mb_stride;
1351
3.13M
            if( !(mb_y&1)
1352
1.50M
                && h->slice_table[mbb_xy] == sl->slice_num
1353
1.02M
                && IS_INTERLACED( h->cur_pic.mb_type[mbb_xy] ) )
1354
636k
                mbb_xy -= h->mb_stride;
1355
3.13M
        }else
1356
9.16M
            mbb_xy = mb_x + (mb_y-1)*h->mb_stride;
1357
13.4M
    }else{
1358
13.4M
        int mb_xy = sl->mb_xy;
1359
13.4M
        mba_xy = mb_xy - 1;
1360
13.4M
        mbb_xy = mb_xy - (h->mb_stride << FIELD_PICTURE(h));
1361
13.4M
    }
1362
1363
25.7M
    if( h->slice_table[mba_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mba_xy] ))
1364
8.14M
        ctx++;
1365
25.7M
    if( h->slice_table[mbb_xy] == sl->slice_num && !IS_SKIP(h->cur_pic.mb_type[mbb_xy] ))
1366
6.42M
        ctx++;
1367
1368
25.7M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B)
1369
17.6M
        ctx += 13;
1370
25.7M
    return get_cabac_noinline( &sl->cabac, &sl->cabac_state[11+ctx] );
1371
25.7M
}
1372
1373
static int decode_cabac_mb_intra4x4_pred_mode(H264SliceContext *sl, int pred_mode)
1374
15.0M
{
1375
15.0M
    int mode = 0;
1376
1377
15.0M
    if( get_cabac( &sl->cabac, &sl->cabac_state[68] ) )
1378
10.9M
        return pred_mode;
1379
1380
4.10M
    mode += 1 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1381
4.10M
    mode += 2 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1382
4.10M
    mode += 4 * get_cabac( &sl->cabac, &sl->cabac_state[69] );
1383
1384
4.10M
    return mode + ( mode >= pred_mode );
1385
15.0M
}
1386
1387
static int decode_cabac_mb_chroma_pre_mode(const H264Context *h, H264SliceContext *sl)
1388
3.02M
{
1389
3.02M
    const int mba_xy = sl->left_mb_xy[0];
1390
3.02M
    const int mbb_xy = sl->top_mb_xy;
1391
1392
3.02M
    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.02M
    if (sl->left_type[LTOP] && h->chroma_pred_mode_table[mba_xy] != 0)
1396
606k
        ctx++;
1397
1398
3.02M
    if (sl->top_type        && h->chroma_pred_mode_table[mbb_xy] != 0)
1399
550k
        ctx++;
1400
1401
3.02M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+ctx] ) == 0 )
1402
2.00M
        return 0;
1403
1404
1.01M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1405
726k
        return 1;
1406
293k
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[64+3] ) == 0 )
1407
157k
        return 2;
1408
135k
    else
1409
135k
        return 3;
1410
293k
}
1411
1412
static int decode_cabac_mb_cbp_luma(H264SliceContext *sl)
1413
10.7M
{
1414
10.7M
    int cbp_b, cbp_a, ctx, cbp = 0;
1415
1416
10.7M
    cbp_a = sl->left_cbp;
1417
10.7M
    cbp_b = sl->top_cbp;
1418
1419
10.7M
    ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
1420
10.7M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]);
1421
10.7M
    ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
1422
10.7M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 1;
1423
10.7M
    ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
1424
10.7M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 2;
1425
10.7M
    ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
1426
10.7M
    cbp += get_cabac_noinline(&sl->cabac, &sl->cabac_state[73 + ctx]) << 3;
1427
10.7M
    return cbp;
1428
10.7M
}
1429
static int decode_cabac_mb_cbp_chroma(H264SliceContext *sl)
1430
9.56M
{
1431
9.56M
    int ctx;
1432
9.56M
    int cbp_a, cbp_b;
1433
1434
9.56M
    cbp_a = (sl->left_cbp>>4)&0x03;
1435
9.56M
    cbp_b = (sl-> top_cbp>>4)&0x03;
1436
1437
9.56M
    ctx = 0;
1438
9.56M
    if( cbp_a > 0 ) ctx++;
1439
9.56M
    if( cbp_b > 0 ) ctx += 2;
1440
9.56M
    if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] ) == 0 )
1441
7.99M
        return 0;
1442
1443
1.56M
    ctx = 4;
1444
1.56M
    if( cbp_a == 2 ) ctx++;
1445
1.56M
    if( cbp_b == 2 ) ctx += 2;
1446
1.56M
    return 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[77 + ctx] );
1447
9.56M
}
1448
1449
static int decode_cabac_p_mb_sub_type(H264SliceContext *sl)
1450
4.45M
{
1451
4.45M
    if( get_cabac( &sl->cabac, &sl->cabac_state[21] ) )
1452
2.90M
        return 0;   /* 8x8 */
1453
1.55M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[22] ) )
1454
815k
        return 1;   /* 8x4 */
1455
735k
    if( get_cabac( &sl->cabac, &sl->cabac_state[23] ) )
1456
392k
        return 2;   /* 4x8 */
1457
343k
    return 3;       /* 4x4 */
1458
735k
}
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
342k
        return 0;   /* B_Direct_8x8 */
1464
2.20M
    if( !get_cabac( &sl->cabac, &sl->cabac_state[37] ) )
1465
660k
        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
153k
        if( get_cabac( &sl->cabac, &sl->cabac_state[39] ) )
1469
47.5k
            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
10.0M
{
1479
10.0M
    int refa = sl->ref_cache[list][scan8[n] - 1];
1480
10.0M
    int refb = sl->ref_cache[list][scan8[n] - 8];
1481
10.0M
    int ref  = 0;
1482
10.0M
    int ctx  = 0;
1483
1484
10.0M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1485
5.62M
        if( refa > 0 && !(sl->direct_cache[scan8[n] - 1]&(MB_TYPE_DIRECT2>>1)) )
1486
1.00M
            ctx++;
1487
5.62M
        if( refb > 0 && !(sl->direct_cache[scan8[n] - 8]&(MB_TYPE_DIRECT2>>1)) )
1488
713k
            ctx += 2;
1489
5.62M
    } else {
1490
4.44M
        if( refa > 0 )
1491
1.41M
            ctx++;
1492
4.44M
        if( refb > 0 )
1493
1.38M
            ctx += 2;
1494
4.44M
    }
1495
1496
16.0M
    while( get_cabac( &sl->cabac, &sl->cabac_state[54+ctx] ) ) {
1497
5.98M
        ref++;
1498
5.98M
        ctx = (ctx>>2)+4;
1499
5.98M
        if(ref >= 32 /*h->ref_list[list]*/){
1500
508
            return -1;
1501
508
        }
1502
5.98M
    }
1503
10.0M
    return ref;
1504
10.0M
}
1505
1506
static int decode_cabac_mb_mvd(H264SliceContext *sl, int ctxbase, int amvd, int *mvda)
1507
40.4M
{
1508
40.4M
    int mvd;
1509
1510
40.4M
    if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+((amvd-3)>>(INT_BIT-1))+((amvd-33)>>(INT_BIT-1))+2])){
1511
//    if(!get_cabac(&sl->cabac, &sl->cabac_state[ctxbase+(amvd>2)+(amvd>32)])){
1512
19.4M
        *mvda= 0;
1513
19.4M
        return 0;
1514
19.4M
    }
1515
1516
21.0M
    mvd= 1;
1517
21.0M
    ctxbase+= 3;
1518
91.1M
    while( mvd < 9 && get_cabac( &sl->cabac, &sl->cabac_state[ctxbase] ) ) {
1519
70.0M
        if( mvd < 4 )
1520
32.8M
            ctxbase++;
1521
70.0M
        mvd++;
1522
70.0M
    }
1523
1524
21.0M
    if( mvd >= 9 ) {
1525
6.67M
        int k = 3;
1526
11.2M
        while( get_cabac_bypass( &sl->cabac ) ) {
1527
4.53M
            mvd += 1 << k;
1528
4.53M
            k++;
1529
4.53M
            if(k>24){
1530
4.10k
                av_log(sl->h264->avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
1531
4.10k
                return INT_MIN;
1532
4.10k
            }
1533
4.53M
        }
1534
31.1M
        while( k-- ) {
1535
24.4M
            mvd += get_cabac_bypass( &sl->cabac )<<k;
1536
24.4M
        }
1537
6.66M
        *mvda=mvd < 70 ? mvd : 70;
1538
6.66M
    }else
1539
14.4M
        *mvda=mvd;
1540
21.0M
    return get_cabac_bypass_sign( &sl->cabac, -mvd );
1541
21.0M
}
1542
1543
20.2M
#define DECODE_CABAC_MB_MVD(sl, list,  n )\
1544
20.2M
{\
1545
20.2M
    int amvd0 = sl->mvd_cache[list][scan8[n] - 1][0] +\
1546
20.2M
                sl->mvd_cache[list][scan8[n] - 8][0];\
1547
20.2M
    int amvd1 = sl->mvd_cache[list][scan8[n] - 1][1] +\
1548
20.2M
                sl->mvd_cache[list][scan8[n] - 8][1];\
1549
20.2M
\
1550
20.2M
    int mxd = decode_cabac_mb_mvd(sl, 40, amvd0, &mpx);\
1551
20.2M
    int myd = decode_cabac_mb_mvd(sl, 47, amvd1, &mpy);\
1552
20.2M
    if (mxd == INT_MIN || myd == INT_MIN) \
1553
20.2M
        return AVERROR_INVALIDDATA; \
1554
20.2M
    mx += mxd;\
1555
20.2M
    my += myd;\
1556
20.2M
}
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.9M
{
1562
53.9M
    int nza, nzb;
1563
53.9M
    int ctx = 0;
1564
53.9M
    static const uint16_t base_ctx[14] = {85,89,93,97,101,1012,460,464,468,1016,472,476,480,1020};
1565
1566
53.9M
    if( is_dc ) {
1567
4.96M
        if( cat == 3 ) {
1568
3.46M
            idx -= CHROMA_DC_BLOCK_INDEX;
1569
3.46M
            nza = (sl->left_cbp>>(6+idx))&0x01;
1570
3.46M
            nzb = (sl-> top_cbp>>(6+idx))&0x01;
1571
3.46M
        } else {
1572
1.49M
            idx -= LUMA_DC_BLOCK_INDEX;
1573
1.49M
            nza = sl->left_cbp&(0x100<<idx);
1574
1.49M
            nzb = sl-> top_cbp&(0x100<<idx);
1575
1.49M
        }
1576
48.9M
    } else {
1577
48.9M
        nza = sl->non_zero_count_cache[scan8[idx] - 1];
1578
48.9M
        nzb = sl->non_zero_count_cache[scan8[idx] - 8];
1579
48.9M
    }
1580
1581
53.9M
    if( nza > 0 )
1582
27.3M
        ctx++;
1583
1584
53.9M
    if( nzb > 0 )
1585
25.3M
        ctx += 2;
1586
1587
53.9M
    return base_ctx[cat] + ctx;
1588
53.9M
}
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
41.2M
{
1597
41.2M
    static const int significant_coeff_flag_offset[2][14] = {
1598
41.2M
      { 105+0, 105+15, 105+29, 105+44, 105+47, 402, 484+0, 484+15, 484+29, 660, 528+0, 528+15, 528+29, 718 },
1599
41.2M
      { 277+0, 277+15, 277+29, 277+44, 277+47, 436, 776+0, 776+15, 776+29, 675, 820+0, 820+15, 820+29, 733 }
1600
41.2M
    };
1601
41.2M
    static const int last_coeff_flag_offset[2][14] = {
1602
41.2M
      { 166+0, 166+15, 166+29, 166+44, 166+47, 417, 572+0, 572+15, 572+29, 690, 616+0, 616+15, 616+29, 748 },
1603
41.2M
      { 338+0, 338+15, 338+29, 338+44, 338+47, 451, 864+0, 864+15, 864+29, 699, 908+0, 908+15, 908+29, 757 }
1604
41.2M
    };
1605
41.2M
    static const int coeff_abs_level_m1_offset[14] = {
1606
41.2M
        227+0, 227+10, 227+20, 227+30, 227+39, 426, 952+0, 952+10, 952+20, 708, 982+0, 982+10, 982+20, 766
1607
41.2M
    };
1608
41.2M
    static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
1609
41.2M
      { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
1610
41.2M
        4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
1611
41.2M
        7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
1612
41.2M
       12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
1613
41.2M
      { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
1614
41.2M
        6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
1615
41.2M
        9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
1616
41.2M
        9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
1617
41.2M
    };
1618
41.2M
    static const uint8_t sig_coeff_offset_dc[7] = { 0, 0, 1, 1, 2, 2, 2 };
1619
    /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
1620
     * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
1621
     * map node ctx => cabac ctx for level=1 */
1622
41.2M
    static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
1623
    /* map node ctx => cabac ctx for level>1 */
1624
41.2M
    static const uint8_t coeff_abs_levelgt1_ctx[2][8] = {
1625
41.2M
        { 5, 5, 5, 5, 6, 7, 8, 9 },
1626
41.2M
        { 5, 5, 5, 5, 6, 7, 8, 8 }, // 422/dc case
1627
41.2M
    };
1628
41.2M
    static const uint8_t coeff_abs_level_transition[2][8] = {
1629
    /* update node ctx after decoding a level=1 */
1630
41.2M
        { 1, 2, 3, 3, 4, 5, 6, 7 },
1631
    /* update node ctx after decoding a level>1 */
1632
41.2M
        { 4, 4, 4, 4, 5, 6, 7, 7 }
1633
41.2M
    };
1634
1635
41.2M
    int index[64];
1636
1637
41.2M
    int last;
1638
41.2M
    int coeff_count = 0;
1639
41.2M
    int node_ctx = 0;
1640
1641
41.2M
    uint8_t *significant_coeff_ctx_base;
1642
41.2M
    uint8_t *last_coeff_ctx_base;
1643
41.2M
    uint8_t *abs_level_m1_ctx_base;
1644
1645
41.2M
#if !ARCH_X86
1646
41.2M
#define CABAC_ON_STACK
1647
41.2M
#endif
1648
41.2M
#ifdef CABAC_ON_STACK
1649
962M
#define CC &cc
1650
41.2M
    CABACContext cc;
1651
41.2M
    cc.range     = sl->cabac.range;
1652
41.2M
    cc.low       = sl->cabac.low;
1653
41.2M
    cc.bytestream= sl->cabac.bytestream;
1654
#if !UNCHECKED_BITSTREAM_READER || ARCH_AARCH64
1655
    cc.bytestream_end = sl->cabac.bytestream_end;
1656
#endif
1657
#else
1658
#define CC &sl->cabac
1659
#endif
1660
1661
41.2M
    significant_coeff_ctx_base = sl->cabac_state
1662
41.2M
        + significant_coeff_flag_offset[MB_FIELD(sl)][cat];
1663
41.2M
    last_coeff_ctx_base = sl->cabac_state
1664
41.2M
        + last_coeff_flag_offset[MB_FIELD(sl)][cat];
1665
41.2M
    abs_level_m1_ctx_base = sl->cabac_state
1666
41.2M
        + coeff_abs_level_m1_offset[cat];
1667
1668
41.2M
    if( !is_dc && max_coeff == 64 ) {
1669
10.3M
#define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
1670
491M
        for(last= 0; last < coefs; last++) { \
1671
488M
            uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
1672
488M
            if( get_cabac( CC, sig_ctx )) { \
1673
138M
                uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
1674
138M
                index[coeff_count++] = last; \
1675
138M
                if( get_cabac( CC, last_ctx ) ) { \
1676
38.2M
                    last= max_coeff; \
1677
38.2M
                    break; \
1678
38.2M
                } \
1679
138M
            } \
1680
488M
        }\
1681
41.2M
        if( last == max_coeff -1 ) {\
1682
2.95M
            index[coeff_count++] = last;\
1683
2.95M
        }
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.8M
    } else {
1698
30.8M
        if (is_dc && chroma422) { // dc 422
1699
732k
            DECODE_SIGNIFICANCE(7, sig_coeff_offset_dc[last], sig_coeff_offset_dc[last]);
1700
30.0M
        } else {
1701
30.0M
            DECODE_SIGNIFICANCE(max_coeff - 1, last, last);
1702
30.0M
        }
1703
30.8M
#endif
1704
30.8M
    }
1705
41.2M
    av_assert2(coeff_count > 0);
1706
1707
41.2M
    if( is_dc ) {
1708
3.28M
        if( cat == 3 )
1709
2.07M
            h->cbp_table[sl->mb_xy] |= 0x40 << (n - CHROMA_DC_BLOCK_INDEX);
1710
1.21M
        else
1711
1.21M
            h->cbp_table[sl->mb_xy] |= 0x100 << (n - LUMA_DC_BLOCK_INDEX);
1712
3.28M
        sl->non_zero_count_cache[scan8[n]] = coeff_count;
1713
37.9M
    } else {
1714
37.9M
        if( max_coeff == 64 )
1715
10.3M
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
1716
27.5M
        else {
1717
27.5M
            av_assert2( cat == 1 || cat ==  2 || cat ==  4 || cat == 7 || cat == 8 || cat == 11 || cat == 12 );
1718
27.5M
            sl->non_zero_count_cache[scan8[n]] = coeff_count;
1719
27.5M
        }
1720
37.9M
    }
1721
1722
41.2M
#define STORE_BLOCK(type) \
1723
141M
    do { \
1724
141M
        uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
1725
141M
 \
1726
141M
        int j= scantable[index[--coeff_count]]; \
1727
141M
 \
1728
141M
        if( get_cabac( CC, ctx ) == 0 ) { \
1729
119M
            node_ctx = coeff_abs_level_transition[0][node_ctx]; \
1730
119M
            if( is_dc ) { \
1731
4.59M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -1); \
1732
114M
            }else{ \
1733
114M
                ((type*)block)[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6; \
1734
114M
            } \
1735
119M
        } else { \
1736
22.2M
            unsigned coeff_abs = 2; \
1737
22.2M
            ctx = coeff_abs_levelgt1_ctx[is_dc && chroma422][node_ctx] + abs_level_m1_ctx_base; \
1738
22.2M
            node_ctx = coeff_abs_level_transition[1][node_ctx]; \
1739
22.2M
\
1740
50.4M
            while( coeff_abs < 15 && get_cabac( CC, ctx ) ) { \
1741
28.1M
                coeff_abs++; \
1742
28.1M
            } \
1743
22.2M
\
1744
22.2M
            if( coeff_abs >= 15 ) { \
1745
704k
                int j = 0; \
1746
1.40M
                while (get_cabac_bypass(CC) && j < 16+7) { \
1747
701k
                    j++; \
1748
701k
                } \
1749
704k
\
1750
704k
                coeff_abs=1; \
1751
1.40M
                while( j-- ) { \
1752
701k
                    coeff_abs += coeff_abs + get_cabac_bypass( CC ); \
1753
701k
                } \
1754
704k
                coeff_abs+= 14U; \
1755
704k
            } \
1756
22.2M
\
1757
22.2M
            if( is_dc ) { \
1758
1.37M
                ((type*)block)[j] = get_cabac_bypass_sign( CC, -coeff_abs ); \
1759
20.8M
            }else{ \
1760
20.8M
                ((type*)block)[j] = ((int)(get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32)) >> 6; \
1761
20.8M
            } \
1762
22.2M
        } \
1763
141M
    } while ( coeff_count );
1764
1765
41.2M
    if (h->pixel_shift) {
1766
27.7M
        STORE_BLOCK(int32_t)
1767
27.7M
    } else {
1768
13.4M
        STORE_BLOCK(int16_t)
1769
13.4M
    }
1770
41.2M
#ifdef CABAC_ON_STACK
1771
41.2M
            sl->cabac.range     = cc.range     ;
1772
41.2M
            sl->cabac.low       = cc.low       ;
1773
41.2M
            sl->cabac.bytestream= cc.bytestream;
1774
41.2M
#endif
1775
1776
41.2M
}
1777
1778
static av_noinline void decode_cabac_residual_dc_internal(const H264Context *h,
1779
                                                          H264SliceContext *sl,
1780
                                                          int16_t *block,
1781
                                                          int cat, int n,
1782
                                                          const uint8_t *scantable,
1783
                                                          int max_coeff)
1784
2.55M
{
1785
2.55M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 0);
1786
2.55M
}
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
732k
{
1795
732k
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, NULL, max_coeff, 1, 1);
1796
732k
}
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.9M
{
1806
37.9M
    decode_cabac_residual_internal(h, sl, block, cat, n, scantable, qmul, max_coeff, 0, 0);
1807
37.9M
}
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.63M
{
1828
    /* read coded block flag */
1829
3.63M
    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.55M
    decode_cabac_residual_dc_internal(h, sl, block, cat, n, scantable, max_coeff);
1834
2.55M
}
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.32M
{
1842
    /* read coded block flag */
1843
1.32M
    if (get_cabac(&sl->cabac, &sl->cabac_state[get_cabac_cbf_ctx(sl, cat, n, max_coeff, 1)]) == 0) {
1844
595k
        sl->non_zero_count_cache[scan8[n]] = 0;
1845
595k
        return;
1846
595k
    }
1847
732k
    decode_cabac_residual_dc_internal_422(h, sl, block, cat, n, scantable, max_coeff);
1848
732k
}
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
56.1M
{
1858
    /* read coded block flag */
1859
56.1M
    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.2M
        if( max_coeff == 64 ) {
1861
930k
            fill_rectangle(&sl->non_zero_count_cache[scan8[n]], 2, 2, 8, 0, 1);
1862
17.3M
        } else {
1863
17.3M
            sl->non_zero_count_cache[scan8[n]] = 0;
1864
17.3M
        }
1865
18.2M
        return;
1866
18.2M
    }
1867
37.9M
    decode_cabac_residual_nondc_internal(h, sl, block, cat, n, scantable, qmul, max_coeff);
1868
37.9M
}
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.22M
{
1874
9.22M
    static const uint8_t ctx_cat[4][3] = {{0,6,10},{1,7,11},{2,8,12},{5,9,13}};
1875
9.22M
    const uint32_t *qmul;
1876
9.22M
    int i8x8, i4x4;
1877
9.22M
    int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
1878
9.22M
    if( IS_INTRA16x16( mb_type ) ) {
1879
1.49M
        AV_ZERO128(sl->mb_luma_dc[p]+0);
1880
1.49M
        AV_ZERO128(sl->mb_luma_dc[p]+8);
1881
1.49M
        AV_ZERO128(sl->mb_luma_dc[p]+16);
1882
1.49M
        AV_ZERO128(sl->mb_luma_dc[p]+24);
1883
1.49M
        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.49M
        if( cbp&15 ) {
1886
238k
            qmul = h->ps.pps->dequant4_coeff[p][qscale];
1887
4.05M
            for( i4x4 = 0; i4x4 < 16; i4x4++ ) {
1888
3.81M
                const int index = 16*p + i4x4;
1889
3.81M
                decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[1][p], index, scan + 1, qmul, 15);
1890
3.81M
            }
1891
1.26M
        } else {
1892
1.26M
            fill_rectangle(&sl->non_zero_count_cache[scan8[16*p]], 4, 4, 8, 0, 1);
1893
1.26M
        }
1894
7.73M
    } else {
1895
7.73M
        int cqm = (IS_INTRA( mb_type ) ? 0:3) + p;
1896
38.6M
        for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
1897
30.9M
            if( cbp & (1<<i8x8) ) {
1898
19.5M
                if( IS_8x8DCT(mb_type) ) {
1899
11.3M
                    const int index = 16*p + 4*i8x8;
1900
11.3M
                    decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[3][p], index,
1901
11.3M
                                                scan8x8, h->ps.pps->dequant8_coeff[cqm][qscale], 64);
1902
11.3M
                } else {
1903
8.27M
                    qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
1904
41.3M
                    for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
1905
33.0M
                        const int index = 16*p + 4*i8x8 + i4x4;
1906
33.0M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
1907
33.0M
                    }
1908
8.27M
                }
1909
19.5M
            } else {
1910
11.3M
                fill_rectangle(&sl->non_zero_count_cache[scan8[4*i8x8+16*p]], 2, 2, 8, 0, 1);
1911
11.3M
            }
1912
30.9M
        }
1913
7.73M
    }
1914
9.22M
}
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.6M
{
1922
28.6M
    const SPS *sps = h->ps.sps;
1923
28.6M
    int mb_xy;
1924
28.6M
    int mb_type, partition_count, cbp = 0;
1925
28.6M
    int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
1926
28.6M
    const int decode_chroma = sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2;
1927
28.6M
    const int pixel_shift = h->pixel_shift;
1928
1929
28.6M
    mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
1930
1931
28.6M
    ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
1932
28.6M
    if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
1933
25.7M
        int skip;
1934
        /* a skipped mb needs the aff flag from the following mb */
1935
25.7M
        if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 1 && sl->prev_mb_skipped)
1936
4.21M
            skip = sl->next_mb_skipped;
1937
21.5M
        else
1938
21.5M
            skip = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y );
1939
        /* read skip flags */
1940
25.7M
        if( skip ) {
1941
16.0M
            if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
1942
4.21M
                h->cur_pic.mb_type[mb_xy] = MB_TYPE_SKIP;
1943
4.21M
                sl->next_mb_skipped = decode_cabac_mb_skip(h, sl, sl->mb_x, sl->mb_y+1 );
1944
4.21M
                if(!sl->next_mb_skipped)
1945
665k
                    sl->mb_mbaff = sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1946
4.21M
            }
1947
1948
16.0M
            decode_mb_skip(h, sl);
1949
1950
16.0M
            h->cbp_table[mb_xy] = 0;
1951
16.0M
            h->chroma_pred_mode_table[mb_xy] = 0;
1952
16.0M
            sl->last_qscale_diff = 0;
1953
1954
16.0M
            return 0;
1955
1956
16.0M
        }
1957
25.7M
    }
1958
12.6M
    if (FRAME_MBAFF(h)) {
1959
4.75M
        if ((sl->mb_y & 1) == 0)
1960
2.43M
            sl->mb_mbaff =
1961
2.43M
            sl->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h, sl);
1962
4.75M
    }
1963
1964
12.6M
    sl->prev_mb_skipped = 0;
1965
1966
12.6M
    fill_decode_neighbors(h, sl, -(MB_FIELD(sl)));
1967
1968
12.6M
    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
1969
5.29M
        int ctx = 0;
1970
5.29M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_B);
1971
1972
5.29M
        if (!IS_DIRECT(sl->left_type[LTOP] - 1))
1973
2.97M
            ctx++;
1974
5.29M
        if (!IS_DIRECT(sl->top_type - 1))
1975
2.11M
            ctx++;
1976
1977
5.29M
        if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+ctx] ) ){
1978
229k
            mb_type= 0; /* B_Direct_16x16 */
1979
5.06M
        }else if( !get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+3] ) ) {
1980
2.89M
            mb_type= 1 + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ); /* B_L[01]_16x16 */
1981
2.89M
        }else{
1982
2.17M
            int bits;
1983
2.17M
            bits = get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+4] ) << 3;
1984
2.17M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 2;
1985
2.17M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] ) << 1;
1986
2.17M
            bits+= get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1987
2.17M
            if( bits < 8 ){
1988
549k
                mb_type= bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
1989
1.62M
            }else if( bits == 13 ){
1990
218k
                mb_type = decode_cabac_intra_mb_type(sl, 32, 0);
1991
218k
                goto decode_intra_mb;
1992
1.40M
            }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
657k
            }else{
1997
657k
                bits= ( bits<<1 ) + get_cabac_noinline( &sl->cabac, &sl->cabac_state[27+5] );
1998
657k
                mb_type= bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
1999
657k
            }
2000
2.17M
        }
2001
5.07M
            partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
2002
5.07M
            mb_type         = ff_h264_b_mb_type_info[mb_type].type;
2003
7.30M
    } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
2004
4.38M
        if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[14] ) == 0 ) {
2005
            /* P-type */
2006
3.85M
            if( get_cabac_noinline( &sl->cabac, &sl->cabac_state[15] ) == 0 ) {
2007
                /* P_L0_D16x16, P_8x8 */
2008
3.16M
                mb_type= 3 * get_cabac_noinline( &sl->cabac, &sl->cabac_state[16] );
2009
3.16M
            } else {
2010
                /* P_L0_D8x16, P_L0_D16x8 */
2011
691k
                mb_type= 2 - get_cabac_noinline( &sl->cabac, &sl->cabac_state[17] );
2012
691k
            }
2013
3.85M
            partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
2014
3.85M
            mb_type         = ff_h264_p_mb_type_info[mb_type].type;
2015
3.85M
        } else {
2016
529k
            mb_type = decode_cabac_intra_mb_type(sl, 17, 0);
2017
529k
            goto decode_intra_mb;
2018
529k
        }
2019
4.38M
    } else {
2020
2.92M
        mb_type = decode_cabac_intra_mb_type(sl, 3, 1);
2021
2.92M
        if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
2022
956
            mb_type--;
2023
2.92M
        av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
2024
3.67M
decode_intra_mb:
2025
3.67M
        partition_count = 0;
2026
3.67M
        cbp                      = ff_h264_i_mb_type_info[mb_type].cbp;
2027
3.67M
        sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
2028
3.67M
        mb_type                  = ff_h264_i_mb_type_info[mb_type].type;
2029
3.67M
    }
2030
12.6M
    if (MB_FIELD(sl))
2031
3.86M
        mb_type |= MB_TYPE_INTERLACED;
2032
2033
12.6M
    h->slice_table[mb_xy] = sl->slice_num;
2034
2035
12.6M
    if(IS_INTRA_PCM(mb_type)) {
2036
3.35k
        const int mb_size = ff_h264_mb_sizes[sps->chroma_format_idc] *
2037
3.35k
                            sps->bit_depth_luma >> 3;
2038
3.35k
        const uint8_t *ptr;
2039
3.35k
        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.35k
        ptr= sl->cabac.bytestream;
2045
3.35k
        if(sl->cabac.low&0x1) ptr--;
2046
3.35k
        if(CABAC_BITS==16){
2047
3.35k
            if(sl->cabac.low&0x1FF) ptr--;
2048
3.35k
        }
2049
2050
        // The pixels are stored in the same order as levels in h->mb array.
2051
3.35k
        if ((int) (sl->cabac.bytestream_end - ptr) < mb_size)
2052
997
            return -1;
2053
2.35k
        sl->intra_pcm_ptr = ptr;
2054
2.35k
        ptr += mb_size;
2055
2056
2.35k
        ret = ff_init_cabac_decoder(&sl->cabac, ptr, sl->cabac.bytestream_end - ptr);
2057
2.35k
        if (ret < 0)
2058
106
            return ret;
2059
2060
        // All blocks are present
2061
2.24k
        h->cbp_table[mb_xy] = 0xf7ef;
2062
2.24k
        h->chroma_pred_mode_table[mb_xy] = 0;
2063
        // In deblocking, the quantizer is 0
2064
2.24k
        h->cur_pic.qscale_table[mb_xy] = 0;
2065
        // All coeffs are present
2066
2.24k
        memset(h->non_zero_count[mb_xy], 16, 48);
2067
2.24k
        h->cur_pic.mb_type[mb_xy] = mb_type;
2068
2.24k
        sl->last_qscale_diff = 0;
2069
2.24k
        return 0;
2070
2.35k
    }
2071
2072
12.6M
    fill_decode_caches(h, sl, mb_type);
2073
2074
12.6M
    if( IS_INTRA( mb_type ) ) {
2075
3.66M
        int i, pred_mode;
2076
3.66M
        if( IS_INTRA4x4( mb_type ) ) {
2077
2.21M
            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.49M
                for( i = 0; i < 16; i+=4 ) {
2080
6.79M
                    int pred = pred_intra_mode(h, sl, i);
2081
6.79M
                    int mode = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2082
6.79M
                    fill_rectangle(&sl->intra4x4_pred_mode_cache[scan8[i]], 2, 2, 8, mode, 1);
2083
6.79M
                }
2084
1.69M
            } else {
2085
8.76M
                for( i = 0; i < 16; i++ ) {
2086
8.25M
                    int pred = pred_intra_mode(h, sl, i);
2087
8.25M
                    sl->intra4x4_pred_mode_cache[scan8[i]] = decode_cabac_mb_intra4x4_pred_mode(sl, pred);
2088
2089
8.25M
                    ff_tlog(h->avctx, "i4x4 pred=%d mode=%d\n", pred,
2090
8.25M
                            sl->intra4x4_pred_mode_cache[scan8[i]]);
2091
8.25M
                }
2092
515k
            }
2093
2.21M
            write_back_intra_pred_mode(h, sl);
2094
2.21M
            if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
2095
2.21M
                                                 sl->top_samples_available, sl->left_samples_available) < 0 )
2096
268k
                return -1;
2097
2.21M
        } else {
2098
1.45M
            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2099
1.45M
                                                                     sl->left_samples_available, sl->intra16x16_pred_mode, 0);
2100
1.45M
            if (sl->intra16x16_pred_mode < 0) return -1;
2101
1.45M
        }
2102
3.35M
        if(decode_chroma){
2103
3.02M
            h->chroma_pred_mode_table[mb_xy] =
2104
3.02M
            pred_mode                        = decode_cabac_mb_chroma_pre_mode(h, sl);
2105
2106
3.02M
            pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
2107
3.02M
                                                     sl->left_samples_available, pred_mode, 1 );
2108
3.02M
            if( pred_mode < 0 ) return -1;
2109
2.97M
            sl->chroma_pred_mode = pred_mode;
2110
2.97M
        } else {
2111
336k
            sl->chroma_pred_mode = DC_128_PRED8x8;
2112
336k
        }
2113
8.93M
    } else if( partition_count == 4 ) {
2114
1.75M
        int i, j, sub_partition_count[4], list, ref[2][4];
2115
2116
1.75M
        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
863k
                        fill_rectangle(&sl->direct_cache[scan8[4*i]], 2, 2, 8, (sl->sub_mb_type[i] >> 1) & 0xFF, 1);
2131
215k
            }
2132
1.11M
        } else {
2133
5.56M
            for( i = 0; i < 4; i++ ) {
2134
4.45M
                sl->sub_mb_type[i] = decode_cabac_p_mb_sub_type(sl);
2135
4.45M
                sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
2136
4.45M
                sl->sub_mb_type[i]     = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
2137
4.45M
            }
2138
1.11M
        }
2139
2140
4.11M
        for( list = 0; list < sl->list_count; list++ ) {
2141
11.8M
                for( i = 0; i < 4; i++ ) {
2142
9.49M
                    if(IS_DIRECT(sl->sub_mb_type[i])) continue;
2143
8.81M
                    if(IS_DIR(sl->sub_mb_type[i], 0, list)){
2144
7.46M
                        unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2145
7.46M
                        if (rc > 1) {
2146
3.75M
                            ref[list][i] = decode_cabac_mb_ref(sl, list, 4 * i);
2147
3.75M
                            if (ref[list][i] >= rc) {
2148
23.6k
                                av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], rc);
2149
23.6k
                                return -1;
2150
23.6k
                            }
2151
3.75M
                        }else
2152
3.70M
                            ref[list][i] = 0;
2153
7.46M
                    } else {
2154
1.35M
                        ref[list][i] = -1;
2155
1.35M
                    }
2156
8.79M
                    sl->ref_cache[list][scan8[4 * i] + 1] =
2157
8.79M
                    sl->ref_cache[list][scan8[4 * i] + 8] = sl->ref_cache[list][scan8[4 * i] + 9] = ref[list][i];
2158
8.79M
                }
2159
2.38M
        }
2160
2161
1.72M
        if(dct8x8_allowed)
2162
1.53M
            dct8x8_allowed = get_dct8x8_allowed(h, sl);
2163
2164
4.08M
        for (list = 0; list < sl->list_count; list++) {
2165
11.7M
            for(i=0; i<4; i++){
2166
9.42M
                sl->ref_cache[list][scan8[4 * i]] = sl->ref_cache[list][scan8[4 * i] + 1];
2167
9.42M
                if(IS_DIRECT(sl->sub_mb_type[i])){
2168
673k
                    fill_rectangle(sl->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 2);
2169
673k
                    continue;
2170
673k
                }
2171
2172
8.75M
                if(IS_DIR(sl->sub_mb_type[i], 0, list) && !IS_DIRECT(sl->sub_mb_type[i])){
2173
7.40M
                    const int sub_mb_type= sl->sub_mb_type[i];
2174
7.40M
                    const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
2175
18.0M
                    for(j=0; j<sub_partition_count[i]; j++){
2176
10.6M
                        int mpx, mpy;
2177
10.6M
                        int mx, my;
2178
10.6M
                        const int index= 4*i + block_width*j;
2179
10.6M
                        int16_t (* mv_cache)[2] = &sl->mv_cache[list][ scan8[index] ];
2180
10.6M
                        uint8_t (* mvd_cache)[2]= &sl->mvd_cache[list][ scan8[index] ];
2181
10.6M
                        pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
2182
10.6M
                        DECODE_CABAC_MB_MVD(sl, list, index)
2183
10.6M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2184
2185
10.6M
                        if(IS_SUB_8X8(sub_mb_type)){
2186
5.01M
                            mv_cache[ 1 ][0]=
2187
5.01M
                            mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
2188
5.01M
                            mv_cache[ 1 ][1]=
2189
5.01M
                            mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
2190
2191
5.01M
                            mvd_cache[ 1 ][0]=
2192
5.01M
                            mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mpx;
2193
5.01M
                            mvd_cache[ 1 ][1]=
2194
5.01M
                            mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= mpy;
2195
5.60M
                        }else if(IS_SUB_8X4(sub_mb_type)){
2196
2.55M
                            mv_cache[ 1 ][0]= mx;
2197
2.55M
                            mv_cache[ 1 ][1]= my;
2198
2199
2.55M
                            mvd_cache[ 1 ][0]=  mpx;
2200
2.55M
                            mvd_cache[ 1 ][1]= mpy;
2201
3.04M
                        }else if(IS_SUB_4X8(sub_mb_type)){
2202
1.37M
                            mv_cache[ 8 ][0]= mx;
2203
1.37M
                            mv_cache[ 8 ][1]= my;
2204
2205
1.37M
                            mvd_cache[ 8 ][0]= mpx;
2206
1.37M
                            mvd_cache[ 8 ][1]= mpy;
2207
1.37M
                        }
2208
10.6M
                        mv_cache[ 0 ][0]= mx;
2209
10.6M
                        mv_cache[ 0 ][1]= my;
2210
2211
10.6M
                        mvd_cache[ 0 ][0]= mpx;
2212
10.6M
                        mvd_cache[ 0 ][1]= mpy;
2213
10.6M
                    }
2214
7.40M
                }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.75M
            }
2219
2.35M
        }
2220
7.18M
    } else if( IS_DIRECT(mb_type) ) {
2221
229k
        ff_h264_pred_direct_motion(h, sl, &mb_type);
2222
229k
        fill_rectangle(sl->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 2);
2223
229k
        fill_rectangle(sl->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 2);
2224
229k
        dct8x8_allowed &= sps->direct_8x8_inference_flag;
2225
6.95M
    } else {
2226
6.95M
        int list, i;
2227
6.95M
        if(IS_16X16(mb_type)){
2228
13.2M
            for (list = 0; list < sl->list_count; list++) {
2229
8.17M
                if(IS_DIR(mb_type, 0, list)){
2230
5.28M
                    int ref;
2231
5.28M
                    unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2232
5.28M
                    if (rc > 1) {
2233
3.34M
                        ref= decode_cabac_mb_ref(sl, list, 0);
2234
3.34M
                        if (ref >= rc) {
2235
18.9k
                            av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2236
18.9k
                            return -1;
2237
18.9k
                        }
2238
3.34M
                    }else
2239
1.93M
                        ref=0;
2240
5.26M
                    fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
2241
5.26M
                }
2242
8.17M
            }
2243
13.2M
            for (list = 0; list < sl->list_count; list++) {
2244
8.13M
                if(IS_DIR(mb_type, 0, list)){
2245
5.26M
                    int mx,my,mpx,mpy;
2246
5.26M
                    pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
2247
5.26M
                    DECODE_CABAC_MB_MVD(sl, list, 0)
2248
5.25M
                    ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2249
2250
5.25M
                    fill_rectangle(sl->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack8to16(mpx,mpy), 2);
2251
5.25M
                    fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
2252
5.25M
                }
2253
8.13M
            }
2254
5.09M
        }
2255
1.83M
        else if(IS_16X8(mb_type)){
2256
2.58M
            for (list = 0; list < sl->list_count; list++) {
2257
4.77M
                    for(i=0; i<2; i++){
2258
3.20M
                        if(IS_DIR(mb_type, i, list)){
2259
2.39M
                            int ref;
2260
2.39M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2261
2.39M
                            if (rc > 1) {
2262
1.54M
                                ref= decode_cabac_mb_ref(sl, list, 8 * i);
2263
1.54M
                                if (ref >= rc) {
2264
22.8k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2265
22.8k
                                    return -1;
2266
22.8k
                                }
2267
1.54M
                            }else
2268
849k
                                ref=0;
2269
2.37M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
2270
2.37M
                        }else
2271
804k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
2272
3.20M
                    }
2273
1.60M
            }
2274
2.55M
            for (list = 0; list < sl->list_count; list++) {
2275
4.70M
                for(i=0; i<2; i++){
2276
3.13M
                    if(IS_DIR(mb_type, i, list)){
2277
2.34M
                        int mx,my,mpx,mpy;
2278
2.34M
                        pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
2279
2.34M
                        DECODE_CABAC_MB_MVD(sl, list, 8*i)
2280
2.33M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2281
2282
2.33M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack8to16(mpx,mpy), 2);
2283
2.33M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
2284
2.33M
                    }else{
2285
794k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 2);
2286
794k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
2287
794k
                    }
2288
3.13M
                }
2289
1.56M
            }
2290
985k
        }else{
2291
831k
            av_assert2(IS_8X16(mb_type));
2292
2.19M
            for (list = 0; list < sl->list_count; list++) {
2293
4.11M
                    for(i=0; i<2; i++){
2294
2.75M
                        if(IS_DIR(mb_type, i, list)){ //FIXME optimize
2295
2.06M
                            int ref;
2296
2.06M
                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
2297
2.06M
                            if (rc > 1) {
2298
1.42M
                                ref = decode_cabac_mb_ref(sl, list, 4 * i);
2299
1.42M
                                if (ref >= rc) {
2300
14.6k
                                    av_log(h->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, rc);
2301
14.6k
                                    return -1;
2302
14.6k
                                }
2303
1.42M
                            }else
2304
641k
                                ref=0;
2305
2.04M
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
2306
2.04M
                        }else
2307
689k
                            fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
2308
2.75M
                    }
2309
1.37M
            }
2310
2.17M
            for (list = 0; list < sl->list_count; list++) {
2311
4.06M
                for(i=0; i<2; i++){
2312
2.70M
                    if(IS_DIR(mb_type, i, list)){
2313
2.02M
                        int mx,my,mpx,mpy;
2314
2.02M
                        pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
2315
2.02M
                        DECODE_CABAC_MB_MVD(sl, list, 4*i)
2316
2317
2.02M
                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
2318
2.02M
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack8to16(mpx,mpy), 2);
2319
2.02M
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
2320
2.02M
                    }else{
2321
680k
                        fill_rectangle(sl->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 2);
2322
680k
                        fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
2323
680k
                    }
2324
2.70M
                }
2325
1.35M
            }
2326
816k
        }
2327
6.95M
    }
2328
2329
12.1M
   if( IS_INTER( mb_type ) ) {
2330
8.84M
        h->chroma_pred_mode_table[mb_xy] = 0;
2331
8.84M
        write_back_motion(h, sl, mb_type);
2332
8.84M
   }
2333
2334
12.1M
    if( !IS_INTRA16x16( mb_type ) ) {
2335
10.7M
        cbp  = decode_cabac_mb_cbp_luma(sl);
2336
10.7M
        if(decode_chroma)
2337
9.56M
            cbp |= decode_cabac_mb_cbp_chroma(sl) << 4;
2338
10.7M
    } else {
2339
1.40M
        if (!decode_chroma && cbp>15) {
2340
3.21k
            av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
2341
3.21k
            return AVERROR_INVALIDDATA;
2342
3.21k
        }
2343
1.40M
    }
2344
2345
12.1M
    h->cbp_table[mb_xy] = sl->cbp = cbp;
2346
2347
12.1M
    if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
2348
2.78M
        mb_type |= MB_TYPE_8x8DCT * get_cabac_noinline(&sl->cabac, &sl->cabac_state[399 + sl->neighbor_transform_size]);
2349
2.78M
    }
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.1M
    if (CHROMA444(h) && IS_8x8DCT(mb_type)){
2354
414k
        int i;
2355
414k
        uint8_t *nnz_cache = sl->non_zero_count_cache;
2356
414k
        if (h->x264_build < 151U) {
2357
130k
            for (i = 0; i < 2; i++){
2358
87.0k
                if (sl->left_type[LEFT(i)] && !IS_8x8DCT(sl->left_type[LEFT(i)])) {
2359
25.9k
                    nnz_cache[3+8* 1 + 2*8*i]=
2360
25.9k
                    nnz_cache[3+8* 2 + 2*8*i]=
2361
25.9k
                    nnz_cache[3+8* 6 + 2*8*i]=
2362
25.9k
                    nnz_cache[3+8* 7 + 2*8*i]=
2363
25.9k
                    nnz_cache[3+8*11 + 2*8*i]=
2364
25.9k
                    nnz_cache[3+8*12 + 2*8*i]= IS_INTRA(mb_type) ? 64 : 0;
2365
25.9k
                }
2366
87.0k
            }
2367
43.5k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2368
11.3k
                uint32_t top_empty = !IS_INTRA(mb_type) ? 0 : 0x40404040;
2369
11.3k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2370
11.3k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2371
11.3k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2372
11.3k
            }
2373
370k
        } else {
2374
1.11M
            for (i = 0; i < 2; i++){
2375
741k
                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
741k
            }
2384
370k
            if (sl->top_type && !IS_8x8DCT(sl->top_type)){
2385
54.8k
                uint32_t top_empty = !IS_INTRA_PCM(sl->top_type) ? 0 : 0x40404040;
2386
54.8k
                AV_WN32A(&nnz_cache[4+8* 0], top_empty);
2387
54.8k
                AV_WN32A(&nnz_cache[4+8* 5], top_empty);
2388
54.8k
                AV_WN32A(&nnz_cache[4+8*10], top_empty);
2389
54.8k
            }
2390
370k
        }
2391
414k
    }
2392
12.1M
    h->cur_pic.mb_type[mb_xy] = mb_type;
2393
2394
12.1M
    if( cbp || IS_INTRA16x16( mb_type ) ) {
2395
7.74M
        const uint8_t *scan, *scan8x8;
2396
7.74M
        const uint32_t *qmul;
2397
2398
        // decode_cabac_mb_dqp
2399
7.74M
        if(get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + (sl->last_qscale_diff != 0)])){
2400
1.17M
            int val = 1;
2401
1.17M
            int ctx= 2;
2402
1.17M
            const int max_qp = 51 + 6*(sps->bit_depth_luma-8);
2403
2404
2.77M
            while( get_cabac_noinline( &sl->cabac, &sl->cabac_state[60 + ctx] ) ) {
2405
1.60M
                ctx= 3;
2406
1.60M
                val++;
2407
1.60M
                if(val > 2*max_qp){ //prevent infinite loop
2408
3.35k
                    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.35k
                    return -1;
2410
3.35k
                }
2411
1.60M
            }
2412
2413
1.17M
            if( val&0x01 )
2414
868k
                val=   (val + 1)>>1 ;
2415
306k
            else
2416
306k
                val= -((val + 1)>>1);
2417
1.17M
            sl->last_qscale_diff = val;
2418
1.17M
            sl->qscale += val;
2419
1.17M
            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.17M
            sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
2424
1.17M
            sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
2425
1.17M
        }else
2426
6.56M
            sl->last_qscale_diff=0;
2427
2428
7.74M
        if(IS_INTERLACED(mb_type)){
2429
2.04M
            scan8x8 = sl->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
2430
2.04M
            scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
2431
5.69M
        }else{
2432
5.69M
            scan8x8 = sl->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
2433
5.69M
            scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
2434
5.69M
        }
2435
2436
7.74M
        decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 0);
2437
7.74M
        if (CHROMA444(h)) {
2438
743k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 1);
2439
743k
            decode_cabac_luma_residual(h, sl, scan, scan8x8, pixel_shift, mb_type, cbp, 2);
2440
7.00M
        } else if (CHROMA422(h)) {
2441
2.43M
            if( cbp&0x30 ){
2442
663k
                int c;
2443
1.99M
                for (c = 0; c < 2; c++)
2444
1.32M
                    decode_cabac_residual_dc_422(h, sl, sl->mb + ((256 + 16*16*c) << pixel_shift), 3,
2445
1.32M
                                                 CHROMA_DC_BLOCK_INDEX + c,
2446
1.32M
                                                 ff_h264_chroma422_dc_scan, 8);
2447
663k
            }
2448
2449
2.43M
            if( cbp&0x20 ) {
2450
301k
                int c, i, i8x8;
2451
904k
                for( c = 0; c < 2; c++ ) {
2452
602k
                    int16_t *mb = sl->mb + (16*(16 + 16*c) << pixel_shift);
2453
602k
                    qmul = h->ps.pps->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[c]];
2454
1.80M
                    for (i8x8 = 0; i8x8 < 2; i8x8++) {
2455
6.02M
                        for (i = 0; i < 4; i++) {
2456
4.82M
                            const int index = 16 + 16 * c + 8*i8x8 + i;
2457
4.82M
                            decode_cabac_residual_nondc(h, sl, mb, 4, index, scan + 1, qmul, 15);
2458
4.82M
                            mb += 16<<pixel_shift;
2459
4.82M
                        }
2460
1.20M
                    }
2461
602k
                }
2462
2.13M
            } else {
2463
2.13M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2464
2.13M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2465
2.13M
            }
2466
4.56M
        } else /* yuv420 */ {
2467
4.56M
            if( cbp&0x30 ){
2468
1.06M
                int c;
2469
3.20M
                for (c = 0; c < 2; c++)
2470
2.13M
                    decode_cabac_residual_dc(h, sl, sl->mb + ((256 + 16 * 16 * c) << pixel_shift),
2471
2.13M
                                             3, CHROMA_DC_BLOCK_INDEX + c, ff_h264_chroma_dc_scan, 4);
2472
1.06M
            }
2473
2474
4.56M
            if( cbp&0x20 ) {
2475
392k
                int c, i;
2476
1.17M
                for( c = 0; c < 2; c++ ) {
2477
785k
                    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.14M
                        const int index = 16 + 16 * c + i;
2480
3.14M
                        decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), 4, index, scan + 1, qmul, 15);
2481
3.14M
                    }
2482
785k
                }
2483
4.17M
            } else {
2484
4.17M
                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2485
4.17M
                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2486
4.17M
            }
2487
4.56M
        }
2488
7.74M
    } else {
2489
4.40M
        fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
2490
4.40M
        fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
2491
4.40M
        fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
2492
4.40M
        sl->last_qscale_diff = 0;
2493
4.40M
    }
2494
2495
12.1M
    h->cur_pic.qscale_table[mb_xy] = sl->qscale;
2496
12.1M
    write_back_non_zero_count(h, sl);
2497
2498
12.1M
    return 0;
2499
12.1M
}