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