Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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