]> git.sesse.net Git - ffmpeg/blob - libavcodec/vc1data.c
prores: extract idct into its own dspcontext and merge with put_pixels.
[ffmpeg] / libavcodec / vc1data.c
1 /*
2  * VC-1 and WMV3 decoder
3  * copyright (c) 2011 Mashiat Sarker Shakkhar
4  * copyright (c) 2006 Konstantin Shishkov
5  * (c) 2005 anonymous, Alex Beregszaszi, Michael Niedermayer
6  *
7  * This file is part of Libav.
8  *
9  * Libav is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * Libav is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with Libav; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 /**
25  * @file
26  * VC-1 tables.
27  */
28
29 #include "avcodec.h"
30 #include "vc1.h"
31 #include "vc1data.h"
32
33 /** Table for conversion between TTBLK and TTMB */
34 const int ff_vc1_ttblk_to_tt[3][8] = {
35   { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
36   { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
37   { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
38 };
39
40 const int ff_vc1_ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
41
42 /** MV P mode - the 5th element is only used for mode 1 */
43 const uint8_t ff_vc1_mv_pmode_table[2][5] = {
44   { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
45   { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
46 };
47 const uint8_t ff_vc1_mv_pmode_table2[2][4] = {
48   { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
49   { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
50 };
51
52 /* MBMODE table for interlaced frame P-picture */
53 const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = {
54     { /* 1: 4-MV, 0: non-4-MV */
55         /* Type, FIELDTX, 1-MV Differential present, Residuals (CBP) present */
56         /* Table 164 - Table 167 */
57         { MV_PMODE_INTFR_1MV        , 0, 1, 1},
58         { MV_PMODE_INTFR_1MV        , 1, 1, 1},
59         { MV_PMODE_INTFR_1MV        , 0, 1, 0},
60         { MV_PMODE_INTFR_1MV        , 0, 0, 1},
61         { MV_PMODE_INTFR_1MV        , 1, 0, 1},
62         { MV_PMODE_INTFR_2MV_FIELD  , 0, 0, 1},
63         { MV_PMODE_INTFR_2MV_FIELD  , 1, 0, 1},
64         { MV_PMODE_INTFR_2MV_FIELD  , 0, 0, 0},
65         { MV_PMODE_INTFR_INTRA      , 0, 0, 0} },
66     {
67         /* Table 160 - Table 163 */
68         { MV_PMODE_INTFR_1MV        , 0, 1, 1 },
69         { MV_PMODE_INTFR_1MV        , 1, 1, 1 },
70         { MV_PMODE_INTFR_1MV        , 0, 1, 0 },
71         { MV_PMODE_INTFR_1MV        , 0, 0, 1 },
72         { MV_PMODE_INTFR_1MV        , 1, 0, 1 },
73         { MV_PMODE_INTFR_2MV_FIELD  , 0, 0, 1 },
74         { MV_PMODE_INTFR_2MV_FIELD  , 1, 0, 1 },
75         { MV_PMODE_INTFR_2MV_FIELD  , 0, 0, 0 },
76         { MV_PMODE_INTFR_4MV        , 0, 0, 1 },
77         { MV_PMODE_INTFR_4MV        , 1, 0, 1 },
78         { MV_PMODE_INTFR_4MV        , 0, 0, 0 },
79         { MV_PMODE_INTFR_4MV_FIELD  , 0, 0, 1 },
80         { MV_PMODE_INTFR_4MV_FIELD  , 1, 0, 1 },
81         { MV_PMODE_INTFR_4MV_FIELD  , 0, 0, 0 },
82         { MV_PMODE_INTFR_INTRA      , 0, 0, 0 }
83     }
84 };
85
86 const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 },
87   ff_vc1_fps_dr[2] = { 1000, 1001 };
88 const uint8_t ff_vc1_pquant_table[3][32] = {
89   {  /* Implicit quantizer */
90      0,  1,  2,  3,  4,  5,  6,  7,  8,  6,  7,  8,  9, 10, 11, 12,
91     13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
92   },
93   {  /* Explicit quantizer, pquantizer uniform */
94      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
95     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
96   },
97   {  /* Explicit quantizer, pquantizer non-uniform */
98      0,  1,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
99     14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
100   }
101 };
102
103 /** @name VC-1 VLC tables and defines
104  *  @todo TODO move this into the context
105  */
106 //@{
107 #define VC1_BFRACTION_VLC_BITS 7
108 VLC ff_vc1_bfraction_vlc;
109 #define VC1_IMODE_VLC_BITS 4
110 VLC ff_vc1_imode_vlc;
111 #define VC1_NORM2_VLC_BITS 3
112 VLC ff_vc1_norm2_vlc;
113 #define VC1_NORM6_VLC_BITS 9
114 VLC ff_vc1_norm6_vlc;
115 /* Could be optimized, one table only needs 8 bits */
116 #define VC1_TTMB_VLC_BITS 9 //12
117 VLC ff_vc1_ttmb_vlc[3];
118 #define VC1_MV_DIFF_VLC_BITS 9 //15
119 VLC ff_vc1_mv_diff_vlc[4];
120 #define VC1_CBPCY_P_VLC_BITS 9 //14
121 VLC ff_vc1_cbpcy_p_vlc[4];
122 #define VC1_ICBPCY_VLC_BITS 9
123 VLC ff_vc1_icbpcy_vlc[8];
124 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
125 VLC ff_vc1_4mv_block_pattern_vlc[4];
126 #define VC1_2MV_BLOCK_PATTERN_VLC_BITS 3
127 VLC ff_vc1_2mv_block_pattern_vlc[4];
128 #define VC1_TTBLK_VLC_BITS 5
129 VLC ff_vc1_ttblk_vlc[3];
130 #define VC1_SUBBLKPAT_VLC_BITS 6
131 VLC ff_vc1_subblkpat_vlc[3];
132 #define VC1_INTFR_4MV_MBMODE_VLC_BITS 9
133 VLC ff_vc1_intfr_4mv_mbmode_vlc[4];
134 #define VC1_INTFR_NON4MV_MBMODE_VLC_BITS 6
135 VLC ff_vc1_intfr_non4mv_mbmode_vlc[4];
136 #define VC1_IF_MMV_MBMODE_VLC_BITS 5
137 VLC ff_vc1_if_mmv_mbmode_vlc[8];
138 #define VC1_IF_1MV_MBMODE_VLC_BITS 5
139 VLC ff_vc1_if_1mv_mbmode_vlc[8];
140 #define VC1_1REF_MVDATA_VLC_BITS 9
141 VLC ff_vc1_1ref_mvdata_vlc[4];
142 #define VC1_2REF_MVDATA_VLC_BITS 9
143 VLC ff_vc1_2ref_mvdata_vlc[8];
144
145 VLC ff_vc1_ac_coeff_table[8];
146
147 #define VC1_IF_MBMODE_VLC_BITS 5    // as a placeholder for VC1_IF_MMV_MBMODE_VLC_BITS
148                                     // or VC1_IF_1MV_MBMODE_VLC_BITS since they are the same
149 //@}
150
151
152 #if B_FRACTION_DEN==840 //original bfraction from vc9data.h, not conforming to standard
153 /* bfraction is fractional, we scale to the GCD 3*5*7*8 = 840 */
154 const int16_t ff_vc1_bfraction_lut[23] = {
155   420 /*1/2*/, 280 /*1/3*/, 560 /*2/3*/, 210 /*1/4*/,
156   630 /*3/4*/, 168 /*1/5*/, 336 /*2/5*/,
157   504 /*3/5*/, 672 /*4/5*/, 140 /*1/6*/, 700 /*5/6*/,
158   120 /*1/7*/, 240 /*2/7*/, 360 /*3/7*/, 480 /*4/7*/,
159   600 /*5/7*/, 720 /*6/7*/, 105 /*1/8*/, 315 /*3/8*/,
160   525 /*5/8*/, 735 /*7/8*/,
161   -1 /*inv.*/, 0 /*BI fm*/
162 };
163 #else
164 /* pre-computed scales for all bfractions and base=256 */
165 const int16_t ff_vc1_bfraction_lut[23] = {
166   128 /*1/2*/,  85 /*1/3*/, 170 /*2/3*/,  64 /*1/4*/,
167   192 /*3/4*/,  51 /*1/5*/, 102 /*2/5*/,
168   153 /*3/5*/, 204 /*4/5*/,  43 /*1/6*/, 215 /*5/6*/,
169    37 /*1/7*/,  74 /*2/7*/, 111 /*3/7*/, 148 /*4/7*/,
170   185 /*5/7*/, 222 /*6/7*/,  32 /*1/8*/,  96 /*3/8*/,
171   160 /*5/8*/, 224 /*7/8*/,
172   -1 /*inv.*/, 0 /*BI fm*/
173 };
174 #endif
175
176 const uint8_t ff_vc1_bfraction_bits[23] = {
177     3, 3, 3, 3,
178     3, 3, 3,
179     7, 7, 7, 7,
180     7, 7, 7, 7,
181     7, 7, 7, 7,
182     7, 7,
183     7, 7
184 };
185 const uint8_t ff_vc1_bfraction_codes[23] = {
186      0,   1,   2,   3,
187      4,   5,   6,
188    112, 113, 114, 115,
189    116, 117, 118, 119,
190    120, 121, 122, 123,
191    124, 125,
192    126, 127
193 };
194
195 //Same as H.264
196 const AVRational ff_vc1_pixel_aspect[16]={
197  {0, 1},
198  {1, 1},
199  {12, 11},
200  {10, 11},
201  {16, 11},
202  {40, 33},
203  {24, 11},
204  {20, 11},
205  {32, 11},
206  {80, 33},
207  {18, 11},
208  {15, 11},
209  {64, 33},
210  {160, 99},
211  {0, 1},
212  {0, 1}
213 };
214
215 /* BitPlane IMODE - such a small table... */
216 const uint8_t ff_vc1_imode_codes[7] = {
217   0, 2, 1, 3, 1, 2, 3
218 };
219 const uint8_t ff_vc1_imode_bits[7] = {
220   4, 2, 3, 2, 4, 3, 3
221 };
222
223 /* Normal-2 imode */
224 const uint8_t ff_vc1_norm2_codes[4] = {
225   0, 4, 5, 3
226 };
227 const uint8_t ff_vc1_norm2_bits[4] = {
228   1, 3, 3, 2
229 };
230
231 const uint16_t ff_vc1_norm6_codes[64] = {
232 0x001, 0x002, 0x003, 0x000, 0x004, 0x001, 0x002, 0x047, 0x005, 0x003, 0x004, 0x04B, 0x005, 0x04D, 0x04E, 0x30E,
233 0x006, 0x006, 0x007, 0x053, 0x008, 0x055, 0x056, 0x30D, 0x009, 0x059, 0x05A, 0x30C, 0x05C, 0x30B, 0x30A, 0x037,
234 0x007, 0x00A, 0x00B, 0x043, 0x00C, 0x045, 0x046, 0x309, 0x00D, 0x049, 0x04A, 0x308, 0x04C, 0x307, 0x306, 0x036,
235 0x00E, 0x051, 0x052, 0x305, 0x054, 0x304, 0x303, 0x035, 0x058, 0x302, 0x301, 0x034, 0x300, 0x033, 0x032, 0x007,
236 };
237
238 const uint8_t ff_vc1_norm6_bits[64] = {
239  1,  4,  4,  8,  4,  8,  8, 10,  4,  8,  8, 10,  8, 10, 10, 13,
240  4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
241  4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
242  8, 10, 10, 13, 10, 13, 13,  9, 10, 13, 13,  9, 13,  9,  9,  6,
243 };
244
245 /* 4MV Block pattern VLC tables */
246 const uint8_t ff_vc1_4mv_block_pattern_codes[4][16] = {
247   { 14, 58, 59, 25, 12, 26, 15, 15, 13, 24, 27,  0, 28,  1,  2,  2},
248   {  8, 18, 19,  4, 20,  5, 30, 11, 21, 31,  6, 12,  7, 13, 14,  0},
249   { 15,  6,  7,  2,  8,  3, 28,  9, 10, 29,  4, 11,  5, 12, 13,  0},
250   {  0, 11, 12,  4, 13,  5, 30, 16, 14, 31,  6, 17,  7, 18, 19, 10}
251 };
252 const uint8_t ff_vc1_4mv_block_pattern_bits[4][16] = {
253   { 5, 6, 6, 5, 5, 5, 5, 4, 5, 5, 5, 3, 5, 3, 3, 2},
254   { 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2},
255   { 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3},
256   { 2, 4, 4, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4}
257 };
258
259 /* 2MV Block pattern VLC tables */
260 const uint8_t ff_vc1_2mv_block_pattern_codes[4][4] = {
261   { 2, 1, 0, 3}, { 1, 0, 2, 3}, { 2, 0, 3, 1}, { 1, 3, 2, 0}
262 };
263
264 const uint8_t ff_vc1_2mv_block_pattern_bits[4][4] = {
265   { 2, 2, 2, 2}, { 1, 2, 3, 3}, { 3, 2, 3, 1}, { 1, 3, 3, 2}
266 };
267
268 /* Interlaced frame picture 4MV MBMODE VLC tables (p. 246, p. 360) */
269 const uint16_t ff_vc1_intfr_4mv_mbmode_codes[4][15] = {
270   {   22,   17,    0,   47,   32,   10,    1,    3,   67,  133,  132,   92,   19,   93,   18},
271   {    3,   45,    0,    7,   23,    6,    1,    2,   10,   39,   44,    8,   18,   77,   76},
272   {   15,    6,   28,    9,   41,    6,    2,   15,   14,    8,   40,   29,    0,   21,   11},
273   {    7,  198,    1,    2,  193,   13,   25,    0,   97, 1599,   98,  398,  798,  192, 1598}
274 };
275
276 const uint8_t ff_vc1_intfr_4mv_mbmode_bits[4][15] = {
277   {   5,   5,   2,   6,   6,   4,   2,   2,   7,   8,   8,   7,   5,   7,   5},
278   {   3,   6,   3,   3,   5,   3,   3,   3,   4,   6,   6,   4,   5,   7,   7},
279   {   4,   3,   5,   5,   7,   4,   2,   5,   5,   5,   7,   5,   2,   6,   5},
280   {   4,   9,   1,   3,   9,   5,   6,   2,   8,  12,   8,  10,  11,   9,  12}
281 };
282
283 /* Interlaced frame picture NON-4MV MBMODE VLC tables (p. 363) */
284 const uint8_t ff_vc1_intfr_non4mv_mbmode_codes[4][9] = {
285   {  9, 22,  0, 17, 16, 10,  1,  3, 23},
286   {  7,  0,  5,  2,  1,  1,  6,  3,  4},
287   {  1,  0, 10, 23, 44,  8,  3,  9, 45},
288   {  7, 97,  1,  2, 49, 13, 25,  0, 96}
289 };
290
291 const uint8_t ff_vc1_intfr_non4mv_mbmode_bits[4][9] = {
292   {  4,  5,  2,  5,  5,  4,  2,  2,  5},
293   {  3,  4,  6,  2,  3,  2,  3,  5,  6},
294   {  2,  2,  4,  5,  6,  4,  2,  4,  6},
295   {  4,  8,  1,  3,  7,  5,  6,  2,  8}
296 };
297
298 /* Interlaced field picture MBMODE VLC tables (p. 356 - 11.4.1, 11.4.2) */
299 /* mixed-MV */
300 const uint8_t ff_vc1_if_mmv_mbmode_codes[8][8] = {
301   { 16, 17,  3,  3,  0,  5,  9,  2 },
302   {  8,  9,  3,  6,  7,  0,  5,  2 },
303   { 16, 17,  5,  3,  0,  3,  9,  2 },
304   { 56, 57, 15,  4,  5,  6, 29,  0 },
305   { 52, 53, 27, 14, 15,  2, 12,  0 },
306   { 56, 57, 29,  5,  6,  0, 15,  4 },
307   { 16, 17,  6,  7,  0,  1,  9,  5 },
308   { 56, 57,  0,  5,  6, 29,  4, 15 }
309 };
310 const uint8_t ff_vc1_if_mmv_mbmode_bits[8][8] = {
311   { 6, 6, 2, 3, 2, 4, 5, 2 },
312   { 5, 5, 3, 3, 3, 2, 4, 2 },
313   { 6, 6, 4, 3, 2, 2, 5, 2 },
314   { 6, 6, 4, 3, 3, 3, 5, 1 },
315   { 6, 6, 5, 4, 4, 2, 4, 1 },
316   { 6, 6, 5, 3, 3, 1, 4, 3 },
317   { 5, 5, 3, 3, 2, 2, 4, 3 },
318   { 6, 6, 1, 3, 3, 5, 3, 4 }
319 };
320 /* 1MV */
321 const uint8_t ff_vc1_if_1mv_mbmode_codes[8][6] = {
322   {  0,  1,  1,  1,  1,  1 },
323   {  0,  1,  1,  1,  1,  1 },
324   { 16, 17,  3,  0,  9,  5 },
325   { 20, 21,  3, 11,  0,  4 },
326   {  4,  5,  2,  3,  3,  0 },
327   {  4,  5,  3,  2,  0,  3 },
328   {  0,  1,  1,  1,  1,  1 },
329   { 16, 17,  9,  5,  3,  0 }
330 };
331 const uint8_t ff_vc1_if_1mv_mbmode_bits[8][6] = {
332   { 5, 5, 1, 3, 2, 4 },
333   { 5, 5, 1, 2, 3, 4 },
334   { 5, 5, 2, 1, 4, 3 },
335   { 5, 5, 2, 4, 1, 3 },
336   { 4, 4, 2, 3, 2, 2 },
337   { 4, 4, 3, 2, 2, 2 },
338   { 5, 5, 3, 4, 1, 2 },
339   { 5, 5, 4, 3, 2, 1 }
340 };
341
342 /* Interlaced frame/field picture MVDATA VLC tables */
343
344 /* 1-reference tables */
345 const uint32_t ff_vc1_1ref_mvdata_codes[4][72] = { /* uint32_t may be too big */
346   {5, 12, 30, 18, 12, 52, 117, 112, 0, 8, 27, 8, 29, 124, 214, 478, 431, 5, 27, 38, 30, 18, 118, 77,
347    502, 500, 57, 127, 39, 106, 113, 53, 113, 104, 476, 39, 115, 255, 232, 233, 126, 505, 501, 509, 62, 458, 1017, 76,
348    105, 506, 479, 503, 112, 477, 3661, 1831, 914, 456, 459, 1016, 430, 504, 507, 58574, 58575, 29280, 29281, 29282, 29283, 29284, 29285, 29286},
349   {7, 1, 7, 22, 1, 69, 24, 694, 6, 4, 23, 16, 41, 44, 346, 102, 414, 9, 40, 23, 0, 42, 4, 91,
350    181, 206, 6, 68, 15, 70, 14, 172, 50, 55, 4587, 10, 26, 287, 22, 20, 43, 360, 85, 9173, 87, 47, 54, 46,
351    361, 84, 1147, 415, 11133, 142, 2782, 1145, 1390, 2292, 5567, 1144, 9172, 44529, 22265, 712462, 712463, 356224, 356225, 356226, 356227, 356228, 356229, 356230},
352   {2, 6, 7, 13, 7, 48, 255, 496, 2, 0, 5, 25, 30, 7, 99, 253, 35, 14, 27, 26, 6, 9, 24, 197,
353    51, 497, 2, 1019, 499, 34, 508, 66, 1571, 131, 1568, 125, 64, 67, 996, 997, 401, 4073, 261, 520, 252, 1572, 1570, 400,
354    1574, 2037, 3147, 8144, 4173, 101, 3138, 201, 1575, 3139, 3146, 4174, 8145, 4175, 1042, 66766, 66767, 33376, 33377, 33378, 33379, 33380, 33381, 33382},
355   {13, 1, 4, 0, 23, 5, 127, 77, 3, 17, 62, 59, 23, 103, 74, 195, 242, 10, 44, 50, 61, 21, 40, 147,
356    204, 150, 3, 117, 32, 45, 33, 41, 144, 464, 507, 28, 76, 96, 9, 8, 45, 159, 506, 317, 49, 252, 88, 146,
357    240, 241, 205, 389, 357, 78, 145, 233, 388, 465, 486, 151, 487, 179, 316, 5710, 5711, 2848, 2849, 2850, 2851, 2852, 2853, 2854}
358 };
359
360 const uint8_t ff_vc1_1ref_mvdata_bits[4][72] = {
361   {3, 4, 5, 5, 5, 6, 7, 7, 2, 4, 5, 5, 6, 7, 8, 9, 9, 4, 6, 6, 6, 6, 7, 8,
362    9, 9, 6, 8, 7, 7, 7, 7, 8, 8, 9, 6, 8, 8, 8, 8, 8, 9, 9, 9, 7, 10, 10, 8,
363    8, 9, 9, 9, 8, 9, 13, 12, 11, 10, 10, 10, 9, 9, 9, 17, 17, 16, 16, 16, 16, 16, 16, 16},
364   {3, 3, 4, 5, 5, 7, 8, 10, 3, 4, 5, 5, 6, 7, 9, 10, 12, 4, 6, 6, 5, 6, 6, 8,
365    9, 11, 4, 7, 7, 7, 7, 8, 9, 9, 13, 5, 8, 9, 8, 8, 9, 10, 10, 14, 7, 9, 9, 9,
366    10, 10, 11, 12, 14, 8, 12, 11, 11, 12, 13, 11, 14, 16, 15, 20, 20, 19, 19, 19, 19, 19, 19, 19},
367   {3, 4, 4, 4, 5, 6, 8, 9, 2, 4, 5, 5, 5, 6, 7, 8, 8, 4, 7, 7, 6, 6, 7, 8,
368    8, 9, 5, 10, 9, 8, 9, 9, 11, 10, 11, 7, 9, 9, 10, 10, 11, 12, 11, 12, 8, 11, 11, 11,
369    11, 11, 12, 13, 15, 9, 12, 10, 11, 12, 12, 15, 13, 15, 13, 19, 19, 18, 18, 18, 18, 18, 18, 18},
370   {4, 4, 4, 4, 5, 5, 7, 7, 3, 5, 6, 6, 6, 7, 7, 8, 8, 4, 6, 6, 6, 6, 7, 8,
371    8, 8, 4, 7, 6, 6, 6, 7, 8, 9, 9, 5, 7, 7, 6, 6, 7, 8, 9, 9, 6, 8, 8, 8,
372    8, 8, 8, 9, 10, 7, 8, 8, 9, 9, 9, 8, 9, 9, 9, 14, 14, 13, 13, 13, 13, 13, 13, 13}
373 };
374
375 /* 2-reference tables */
376 const uint32_t ff_vc1_2ref_mvdata_codes[8][126] = { /* table 132 - table 139 */
377   {12, 28, 11, 0, 14, 42, 80, 872, 2, 26, 4, 58, 29, 108,
378    239, 444, 351, 15, 3, 28, 13, 11, 62, 167, 326, 409, 6, 31,
379    4, 60, 7, 446, 139, 44, 1971, 5, 219, 86, 236, 82, 445, 120,
380    207, 1395, 9, 35, 237, 24, 6, 68, 245, 121, 1746, 110, 43, 349,
381    23, 895, 324, 206, 40, 171, 16, 437, 247, 166, 123, 40, 493, 489,
382    1789, 4, 245, 41, 650, 651, 655, 3577, 821, 7813, 238, 701, 43, 984,
383    977, 408, 489, 1309, 180, 63, 1109, 555, 553, 1105, 1400, 1970, 1392, 341,
384    50, 976, 84, 1747, 1393, 1108, 820, 7153, 183, 41, 7812, 364, 411, 7152,
385    1401, 3907, 181, 2209, 42, 365, 2208, 1952, 977, 2789, 340, 2788, 2617, 2616},
386   {3, 9, 22, 16, 215, 821, 1396, 1365, 0, 29, 9, 23, 44, 173,
387    884, 1715, 1399, 15, 24, 10, 46, 34, 380, 3707, 7049, 5592, 8, 52,
388    109, 35, 450, 886, 723, 7242, 13066, 20, 106, 114, 108, 227, 411, 1855,
389    7408, 2881, 50, 230, 224, 207, 171, 412, 683, 3627, 5593, 111, 451, 175,
390    191, 172, 381, 1763, 3625, 6532, 84, 181, 378, 429, 409, 376, 856, 722,
391    7243, 91, 680, 817, 904, 907, 880, 1811, 3267, 7409, 441, 1519, 1848, 754,
392    827, 697, 1771, 1392, 3620, 925, 1442, 1443, 3709, 1518, 1849, 1364, 2725, 2724,
393    887, 7413, 3022, 3705, 1632, 1652, 1770, 3708, 3429, 758, 5594, 7048, 1441, 7412,
394    1510, 3624, 1397, 3428, 820, 13067, 5595, 2880, 3023, 3525, 3626, 1653, 1393, 1363},
395   {4, 2, 16, 3, 23, 69, 62, 126, 3, 2, 40, 30, 21, 71,
396    2, 333, 96, 11, 38, 36, 20, 50, 111, 195, 1329, 1765, 21, 63,
397    45, 1, 318, 221, 246, 773, 817, 14, 3, 52, 51, 26, 330, 197,
398    244, 1764, 1, 60, 125, 141, 157, 49, 110, 662, 205, 37, 329, 50,
399    137, 54, 136, 111, 3, 797, 14, 426, 638, 97, 334, 335, 103, 255,
400    387, 54, 855, 245, 198, 194, 665, 281, 561, 848, 44, 399, 1328, 663,
401    4, 440, 192, 634, 785, 156, 1569, 409, 796, 247, 995, 854, 393, 5,
402    107, 2242, 816, 1279, 1264, 849, 1266, 498, 883, 0, 3137, 2243, 2540, 994,
403    772, 1271, 1265, 496, 328, 3136, 2541, 2240, 2241, 1267, 1278, 254, 499, 425},
404   {0, 4, 47, 82, 16, 173, 1291, 400, 3, 22, 7, 13, 187, 371,
405    201, 1295, 5932, 3, 17, 5, 67, 35, 75, 814, 11867, 1154, 9, 42,
406    20, 42, 264, 1482, 1626, 8502, 8498, 11, 19, 65, 184, 372, 256, 5338,
407    16462, 5175, 43, 133, 167, 160, 332, 666, 812, 8499, 5162, 81, 644, 172,
408    258, 69, 68, 2075, 1630, 3255, 24, 1292, 530, 740, 515, 148, 290, 2074,
409    1621, 51, 698, 582, 578, 2670, 1036, 2056, 8500, 16463, 373, 1029, 583, 298,
410    2580, 699, 401, 2127, 5176, 175, 2967, 1155, 5179, 811, 579, 5163, 2392, 10687,
411    73, 2668, 5339, 1197, 5342, 2126, 5172, 599, 11866, 519, 5173, 5177, 3254, 5178,
412    404, 1620, 8501, 21372, 348, 576, 4114, 21373, 2393, 4248, 5174, 1631, 8230, 8503},
413   {5, 25, 22, 17, 62, 94, 239, 226, 0, 57, 43, 38, 40, 18,
414    194, 237, 285, 13, 49, 42, 37, 32, 92, 493, 589, 1904, 6, 122,
415    96, 79, 72, 57, 390, 531, 3782, 15, 38, 95, 117, 112, 39, 475,
416    966, 1935, 63, 166, 240, 58, 82, 78, 227, 473, 783, 16, 477, 167,
417    247, 34, 146, 964, 751, 1890, 121, 143, 474, 135, 232, 186, 374, 238,
418    944, 133, 281, 782, 264, 466, 268, 1907, 1060, 1076, 113, 1501, 449, 935,
419    295, 141, 539, 1970, 479, 984, 1892, 3812, 947, 1869, 472, 1500, 2122, 1177,
420    965, 7566, 1893, 1077, 1905, 450, 280, 956, 897, 903, 31539, 4247, 4246, 7885,
421    3737, 3868, 3869, 3813, 284, 31538, 15768, 7567, 3736, 3943, 957, 896, 1176, 902},
422   {13, 16, 46, 57, 13, 116, 237, 182, 1, 2, 0, 48, 41, 112,
423    243, 140, 358, 9, 51, 120, 6, 196, 11, 355, 204, 1470, 31, 47,
424    100, 24, 198, 10, 354, 704, 3827, 7, 15, 227, 202, 178, 399, 942,
425    1887, 3153, 21, 71, 238, 226, 234, 9, 362, 707, 1437, 61, 8, 473,
426    50, 14, 366, 812, 1627, 6507, 2, 15, 472, 141, 180, 484, 103, 791,
427    1940, 34, 958, 789, 52, 55, 734, 108, 3838, 1644, 40, 971, 940, 53,
428    363, 957, 705, 1580, 7678, 14, 1438, 1471, 218, 1577, 1412, 3767, 2826, 1645,
429    12, 1918, 1436, 1912, 1886, 1882, 1581, 823, 820, 407, 7767, 7652, 6506, 7766,
430    3152, 2879, 7764, 2827, 398, 438, 7765, 3252, 2878, 3766, 7653, 7679, 821, 439},
431   {1, 11, 25, 111, 42, 117, 2027, 355, 1, 14, 26, 62, 28, 45,
432    356, 2028, 357, 4, 6, 54, 127, 174, 344, 348, 1389, 1037584, 0, 4,
433    123, 243, 59, 2029, 691, 716, 1390, 24, 62, 23, 30, 175, 1015, 1391,
434    717, 1037585, 20, 173, 170, 20, 168, 339, 232, 510, 3535, 120, 440, 338,
435    254, 689, 349, 352, 1037586, 1037587, 122, 688, 485, 233, 252, 1766, 3528, 1412,
436    1037588, 171, 3550, 345, 1012, 3529, 3530, 506, 1037589, 1037590, 252, 511, 484, 175,
437    346, 359, 3531, 1413, 1037591, 1015, 16213, 1037592, 3548, 1414, 16214, 1037593, 16215, 1037594,
438    442, 1415, 1416, 3551, 690, 1037595, 3534, 1014, 1037596, 4052, 1037597, 1037598, 1037599, 518784,
439    518785, 1388, 518786, 518787, 886, 1417, 1418, 518788, 518789, 3549, 518790, 518791, 1419, 32425},
440   {3, 14, 15, 126, 98, 198, 3289, 1598, 2, 2, 0, 24, 12, 105,
441    57, 1799, 3198, 2, 13, 27, 15, 410, 1607, 6711, 214724, 13421, 1, 30,
442    127, 10, 225, 1633, 3300, 214725, 214726, 29, 48, 13, 203, 409, 800, 142,
443    25902, 214727, 62, 57, 53, 51, 415, 448, 3290, 214728, 214729, 11, 208, 414,
444    34, 56, 398, 798, 12948, 572, 50, 18, 19, 113, 413, 32, 3207, 3264,
445    214730, 824, 1619, 418, 810, 802, 3303, 132, 287, 214731, 805, 1609, 811, 119,
446    1608, 1602, 3206, 3212, 214732, 58, 6583, 67, 807, 140, 141, 3213, 214733, 214734,
447    823, 3301, 133, 806, 839, 3236, 3199, 3354, 214735, 808, 107360, 107361, 3288, 1676,
448    12949, 12950, 25903, 26328, 817, 1798, 573, 118, 3265, 898, 3302, 26329, 26330, 26331}
449 };
450
451 const uint8_t ff_vc1_2ref_mvdata_bits[8][126] = {
452   {4, 5, 5, 5, 6, 7, 8, 10, 2, 5, 5, 6, 6, 7,
453    8, 9, 10, 4, 5, 6, 6, 7, 8, 9, 10, 11, 4, 6,
454    6, 7, 7, 9, 9, 10, 12, 5, 8, 8, 8, 8, 9, 9,
455    10, 12, 5, 7, 8, 7, 7, 8, 9, 9, 11, 7, 9, 10,
456    9, 10, 10, 10, 10, 12, 6, 9, 9, 9, 9, 9, 10, 10,
457    11, 7, 10, 10, 11, 11, 11, 12, 12, 14, 8, 11, 10, 11,
458    11, 11, 11, 12, 12, 8, 12, 11, 11, 12, 12, 12, 12, 13,
459    8, 12, 11, 11, 12, 12, 12, 13, 12, 9, 14, 13, 11, 13,
460    12, 13, 12, 13, 9, 13, 13, 12, 12, 13, 13, 13, 13, 13},
461   {3, 4, 5, 6, 8, 10, 11, 11, 2, 5, 5, 6, 7, 8,
462    10, 11, 11, 4, 5, 5, 6, 7, 9, 12, 13, 13, 4, 6,
463    7, 7, 9, 10, 11, 13, 14, 5, 7, 7, 7, 8, 9, 11,
464    13, 13, 6, 8, 8, 8, 8, 9, 10, 12, 13, 7, 9, 8,
465    8, 8, 9, 11, 12, 13, 7, 9, 9, 9, 9, 9, 10, 11,
466    13, 8, 10, 10, 10, 10, 10, 11, 12, 13, 9, 11, 11, 10,
467    10, 10, 11, 11, 12, 10, 12, 12, 12, 11, 11, 11, 12, 12,
468    10, 13, 12, 12, 11, 11, 11, 12, 12, 10, 13, 13, 12, 13,
469    11, 12, 11, 12, 10, 14, 13, 13, 12, 12, 12, 11, 11, 11},
470   {4, 4, 5, 5, 6, 7, 8, 9, 2, 5, 6, 6, 6, 7,
471    7, 9, 9, 4, 6, 6, 6, 7, 8, 9, 11, 12, 5, 7,
472    7, 7, 9, 9, 10, 11, 12, 5, 7, 7, 7, 7, 9, 9,
473    10, 12, 5, 8, 8, 8, 8, 8, 9, 10, 10, 6, 9, 8,
474    8, 8, 8, 9, 9, 11, 6, 10, 10, 9, 9, 9, 9, 10,
475    10, 7, 11, 10, 9, 9, 10, 9, 10, 11, 7, 10, 11, 10,
476    10, 10, 9, 10, 11, 8, 12, 11, 11, 10, 11, 11, 10, 10,
477    8, 12, 12, 11, 11, 11, 11, 10, 11, 8, 13, 12, 12, 11,
478    11, 11, 11, 10, 9, 13, 12, 12, 12, 11, 11, 10, 10, 10},
479   {3, 4, 6, 7, 7, 9, 11, 11, 2, 5, 5, 6, 8, 9,
480    10, 11, 13, 3, 5, 5, 7, 8, 9, 12, 14, 13, 4, 6,
481    6, 7, 9, 11, 13, 14, 14, 5, 7, 7, 8, 9, 9, 13,
482    15, 13, 6, 8, 8, 8, 9, 10, 12, 14, 13, 7, 10, 9,
483    9, 9, 9, 12, 13, 14, 7, 11, 10, 10, 10, 10, 11, 12,
484    13, 8, 11, 12, 12, 12, 11, 12, 14, 15, 9, 11, 12, 11,
485    12, 11, 11, 12, 13, 9, 12, 13, 13, 12, 12, 13, 14, 14,
486    9, 12, 13, 13, 13, 12, 13, 12, 14, 10, 13, 13, 14, 13,
487    11, 13, 14, 15, 10, 12, 13, 15, 14, 13, 13, 13, 14, 14},
488   {4, 5, 5, 5, 6, 7, 8, 8, 2, 6, 6, 6, 6, 6,
489    8, 9, 10, 4, 6, 6, 6, 6, 7, 9, 10, 11, 4, 7,
490    7, 7, 7, 7, 9, 10, 12, 5, 7, 7, 7, 7, 7, 9,
491    10, 11, 6, 8, 8, 7, 7, 7, 8, 9, 10, 6, 9, 8,
492    8, 7, 8, 10, 10, 11, 7, 9, 9, 8, 8, 8, 9, 9,
493    10, 8, 10, 10, 9, 9, 9, 11, 11, 11, 8, 11, 10, 10,
494    9, 9, 10, 11, 10, 10, 12, 12, 11, 11, 10, 11, 12, 11,
495    10, 13, 12, 11, 11, 10, 10, 11, 11, 11, 15, 13, 13, 13,
496    12, 12, 12, 12, 10, 15, 14, 13, 12, 12, 11, 11, 11, 11},
497   {4, 5, 6, 6, 6, 7, 8, 8, 2, 4, 5, 6, 6, 7,
498    8, 8, 9, 4, 6, 7, 7, 8, 8, 9, 10, 11, 5, 6,
499    7, 7, 8, 8, 9, 10, 12, 5, 7, 8, 8, 8, 9, 10,
500    11, 12, 5, 7, 8, 8, 8, 8, 9, 10, 11, 6, 8, 9,
501    8, 8, 9, 10, 11, 13, 5, 8, 9, 8, 8, 9, 9, 10,
502    11, 6, 10, 10, 9, 9, 10, 10, 12, 13, 6, 10, 10, 9,
503    9, 10, 10, 11, 13, 7, 11, 11, 11, 11, 11, 12, 12, 13,
504    7, 11, 11, 11, 11, 11, 11, 12, 12, 9, 13, 13, 13, 13,
505    12, 12, 13, 12, 9, 12, 13, 12, 12, 12, 13, 13, 12, 12},
506   {3, 5, 6, 8, 9, 10, 12, 12, 1, 5, 6, 7, 8, 9,
507    12, 12, 12, 4, 6, 7, 8, 9, 12, 12, 14, 21, 4, 6,
508    8, 9, 9, 12, 13, 13, 14, 6, 9, 8, 8, 9, 13, 14,
509    13, 21, 6, 9, 9, 8, 9, 10, 11, 12, 13, 8, 10, 10,
510    11, 11, 12, 12, 21, 21, 8, 11, 10, 11, 11, 12, 13, 14,
511    21, 9, 13, 10, 11, 13, 13, 12, 21, 21, 9, 12, 10, 11,
512    12, 12, 13, 14, 21, 11, 15, 21, 13, 14, 15, 21, 15, 21,
513    10, 14, 14, 13, 13, 21, 13, 13, 21, 13, 21, 21, 21, 20,
514    20, 14, 20, 20, 11, 14, 14, 20, 20, 13, 20, 20, 14, 16},
515   {2, 5, 6, 8, 9, 10, 13, 13, 2, 4, 5, 6, 8, 9,
516    10, 13, 14, 3, 5, 7, 8, 10, 12, 15, 20, 16, 4, 6,
517    8, 8, 10, 12, 13, 20, 20, 7, 8, 8, 9, 10, 11, 12,
518    16, 20, 7, 8, 8, 8, 10, 11, 13, 20, 20, 8, 10, 10,
519    10, 10, 11, 12, 15, 14, 8, 9, 9, 9, 10, 10, 13, 13,
520    20, 11, 12, 11, 11, 11, 13, 12, 13, 20, 11, 12, 11, 11,
521    12, 12, 13, 13, 20, 10, 14, 11, 11, 12, 12, 13, 20, 20,
522    11, 13, 12, 11, 12, 13, 14, 14, 20, 11, 19, 19, 13, 13,
523    15, 15, 16, 16, 11, 13, 14, 11, 13, 12, 13, 16, 16, 16}
524 };
525
526 const uint8_t wmv3_dc_scale_table[32]={
527     0, 2, 4, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21
528 };
529
530 /* P-Picture CBPCY VLC tables */
531 // Looks like original tables are not conforming to standard at all. Are they used for old WMV?
532 const uint16_t ff_vc1_cbpcy_p_codes[4][64] = {
533   {
534       0,   6,  15,  13,  13,  11,   3,  13,   5,   8,  49,  10,  12, 114, 102, 119,
535       1,  54,  96,   8,  10, 111,   5,  15,  12,  10,   2,  12,  13, 115,  53,  63,
536       1,   7,   1,   7,  14,  12,   4,  14,   1,   9,  97,  11,   7,  58,  52,  62,
537       4, 103,   1,   9,  11,  56, 101, 118,   4, 110, 100,  30,   2,   5,   4,   3
538   },
539   {
540       0,   9,   1,  18,   5,  14, 237,  26,   3, 121,   3,  22,  13,  16,   6,  30,
541       2,  10,   1,  20,  12, 241,   5,  28,  16,  12,   3,  24,  28, 124, 239, 247,
542       1, 240,   1,  19,  18,  15,   4,  27,   1, 122,   2,  23,   1,  17,   7,  31,
543       1,  11,   2,  21,  19, 246, 238,  29,  17,  13, 236,  25,  58,  63,   8, 125
544   },
545   {
546       0, 201,  25, 231,   5, 221,   1,   3,   2, 414,   2, 241,  16, 225, 195, 492,
547       2, 412,   1, 240,   7, 224,  98, 245,   1, 220,  96,   5,   9, 230, 101, 247,
548       1, 102,   1, 415,  24,   3,   2, 244,   3,  54,   3, 484,  17, 114, 200, 493,
549       3, 413,   1,   4,  13, 113,  99, 485,   4, 111, 194, 243,   5,  29,  26,  31
550   },
551   {
552       0,  28,  12,  44,   3,  36,  20,  52,   2,  32,  16,  48,   8,  40,  24,  28,
553       1,  30,  14,  46,   6,  38,  22,  54,   3,  34,  18,  50,  10,  42,  26,  30,
554       1,  29,  13,  45,   5,  37,  21,  53,   2,  33,  17,  49,   9,  41,  25,  29,
555       1,  31,  15,  47,   7,  39,  23,  55,   4,  35,  19,  51,  11,  43,  27,  31
556    }
557 };
558
559 const uint8_t ff_vc1_cbpcy_p_bits[4][64] = {
560   {
561     13,  13,   7,  13,   7,  13,  13,  12,   6,  13,   7,  12,   6,   8,   8,   8,
562      5,   7,   8,  12,   6,   8,  13,  12,   7,  13,  13,  12,   6,   8,   7,   7,
563      6,  13,   8,  12,   7,  13,  13,  12,   7,  13,   8,  12,   5,   7,   7,   7,
564      6,   8,  13,  12,   6,   7,   8,   8,   5,   8,   8,   6,   3,   3,   3,   2
565   },
566   {
567     14,  13,   8,  13,   3,  13,   8,  13,   3,   7,   8,  13,   4,  13,  13,  13,
568      3,  13,  13,  13,   4,   8,  13,  13,   5,  13,  13,  13,   5,   7,   8,   8,
569      3,   8,  14,  13,   5,  13,  13,  13,   4,   7,  13,  13,   6,  13,  13,  13,
570      5,  13,   8,  13,   5,   8,   8,  13,   5,  13,   8,  13,   6,   6,  13,   7
571   },
572   {
573     13,   8,   6,   8,   4,   8,  13,  12,   4,   9,   8,   8,   5,   8,   8,   9,
574      5,   9,  10,   8,   4,   8,   7,   8,   6,   8,   7,  13,   4,   8,   7,   8,
575      5,   7,   8,   9,   6,  13,  13,   8,   4,   6,   8,   9,   5,   7,   8,   9,
576      5,   9,   9,  13,   5,   7,   7,   9,   4,   7,   8,   8,   3,   5,   5,   5
577   },
578   {
579      9,   9,   9,   9,   2,   9,   9,   9,   2,   9,   9,   9,   9,   9,   9,   8,
580      3,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
581      2,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
582      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8
583   }
584 };
585
586 /* Interlaced CBPCY VLC tables (Table 124 - Table 131) */
587
588 const uint16_t ff_vc1_icbpcy_p_codes[8][63] = {
589   {
590     12058, 12059, 6028, 144, 680, 681, 3015, 145, 682, 683, 1504, 74, 150,
591     151, 189, 146, 684, 685, 1505, 152, 306, 307, 377, 308, 618, 619, 764,
592     78, 64, 65, 43, 147, 686, 687, 1506, 310, 622, 623, 765, 158, 318,
593     319, 383, 80, 66, 67, 44, 81, 164, 165, 190, 83, 68, 69, 45,
594     84, 70, 71, 46, 3, 0, 1, 1
595   }, {
596     65, 66, 256, 67, 136, 137, 257, 69, 140, 141, 258, 16, 34,
597     35, 36, 71, 16, 17, 259, 37, 88, 89, 90, 91, 90, 91, 92,
598     12, 48, 49, 25, 9, 20, 21, 44, 92, 93, 94, 95, 38, 93,
599     94, 95, 13, 52, 53, 27, 20, 39, 42, 43, 14, 56, 57, 29,
600     15, 60, 61, 31, 5, 9, 0, 3
601   }, {
602     50, 51, 26, 38, 228, 229, 486, 39, 230, 231, 487, 14, 99,
603     108, 119, 40, 232, 233, 488, 123, 218, 219, 236, 245, 440, 441, 474,
604     33, 75, 84, 43, 41, 234, 235, 489, 74, 442, 443, 475, 32, 222,
605     223, 242, 34, 85, 88, 45, 15, 112, 113, 120, 35, 89, 92, 47,
606     36, 93, 98, 48, 2, 31, 6, 0
607   }, {
608     40, 41, 157, 0, 490, 491, 492, 1, 493, 494, 495, 5, 240,
609     241, 59, 2, 496, 497, 498, 63, 348, 349, 153, 16, 976, 977, 304,
610     15, 158, 159, 251, 3, 499, 500, 501, 17, 978, 979, 305, 9, 350,
611     351, 156, 16, 168, 169, 56, 6, 242, 243, 77, 17, 170, 171, 57,
612     18, 172, 173, 58, 6, 22, 23, 14
613   }, {
614     60, 61, 31, 10, 97, 98, 2, 11, 99, 100, 3, 7, 3,
615     4, 11, 12, 101, 102, 4, 18, 10, 11, 20, 27, 24, 25, 52,
616     44, 103, 104, 53, 13, 105, 108, 5, 96, 26, 27, 53, 19, 14,
617     15, 21, 45, 109, 110, 56, 8, 8, 9, 12, 46, 111, 114, 58,
618     47, 115, 0, 59, 7, 20, 21, 4
619   }, {
620     56, 57, 157, 10, 145, 146, 147, 11, 148, 149, 150, 3, 238,
621     239, 54, 12, 151, 152, 153, 8, 484, 485, 106, 24, 972, 973, 214,
622     14, 158, 159, 245, 13, 154, 155, 156, 25, 974, 975, 215, 9, 488,
623     489, 144, 15, 232, 233, 246, 5, 240, 241, 55, 16, 234, 235, 247,
624     17, 236, 237, 52, 0, 62, 63, 2
625   }, {
626     60, 61, 463, 0, 191, 224, 508, 1, 225, 226, 509, 9, 497,
627     498, 499, 2, 227, 228, 510, 17, 1006, 1007, 1008, 33, 2018, 2019, 2020,
628     24, 1015, 1022, 1023, 3, 229, 230, 128, 46, 2021, 2022, 2023, 22, 1012,
629     1013, 1014, 25, 258, 259, 260, 10, 500, 501, 502, 26, 261, 262, 263,
630     27, 376, 377, 462, 29, 189, 190, 496
631   }, {
632     3, 4, 438, 4, 46, 47, 14, 5, 48, 49, 15, 3, 10,
633     11, 20, 6, 50, 51, 16, 5, 48, 49, 50, 9, 102, 103, 104,
634     29, 439, 440, 441, 7, 52, 53, 17, 22, 105, 106, 107, 10, 54,
635     55, 216, 30, 442, 443, 444, 4, 21, 22, 23, 31, 445, 446, 447,
636     0, 16, 17, 18, 28, 217, 218, 19
637   }
638 };
639
640 const uint8_t ff_vc1_icbpcy_p_bits[8][63] = {
641   {
642     15, 15, 14, 9, 11, 11, 13, 9, 11, 11, 12, 8, 9,
643     9, 9, 9, 11, 11, 12, 9, 10, 10, 10, 10, 11, 11, 11,
644     8, 8, 8, 7, 9, 11, 11, 12, 10, 11, 11, 11, 9, 10,
645     10, 10, 8, 8, 8, 7, 8, 9, 9, 9, 8, 8, 8, 7,
646     8, 8, 8, 7, 3, 3, 3, 1
647   }, {
648     7, 7, 9, 7, 8, 8, 9, 7, 8, 8, 9, 6, 7,
649     7, 7, 7, 7, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9,
650     6, 7, 7, 6, 6, 7, 7, 8, 8, 9, 9, 9, 7, 8,
651     8, 8, 6, 7, 7, 6, 6, 7, 7, 7, 6, 7, 7, 6,
652     6, 7, 7, 6, 3, 4, 3, 2
653   }, {
654     6, 6, 5, 6, 8, 8, 9, 6, 8, 8, 9, 5, 7,
655     7, 7, 6, 8, 8, 9, 7, 8, 8, 8, 8, 9, 9, 9,
656     6, 7, 7, 6, 6, 8, 8, 9, 7, 9, 9, 9, 6, 8,
657     8, 8, 6, 7, 7, 6, 5, 7, 7, 7, 6, 7, 7, 6,
658     6, 7, 7, 6, 3, 5, 4, 2
659   }, {
660     6, 6, 8, 4, 9, 9, 9, 4, 9, 9, 9, 4, 8,
661     8, 7, 4, 9, 9, 9, 6, 9, 9, 8, 6, 10, 10, 9,
662     5, 8, 8, 8, 4, 9, 9, 9, 6, 10, 10, 9, 5, 9,
663     9, 8, 5, 8, 8, 7, 4, 8, 8, 7, 5, 8, 8, 7,
664     5, 8, 8, 7, 3, 5, 5, 4
665   }, {
666     6, 6, 5, 5, 7, 7, 7, 5, 7, 7, 7, 5, 6,
667     6, 6, 5, 7, 7, 7, 6, 7, 7, 7, 7, 8, 8, 8,
668     6, 7, 7, 6, 5, 7, 7, 7, 7, 8, 8, 8, 6, 7,
669     7, 7, 6, 7, 7, 6, 5, 6, 6, 6, 6, 7, 7, 6,
670     6, 7, 6, 6, 4, 5, 5, 3
671   }, {
672     6, 6, 8, 4, 8, 8, 8, 4, 8, 8, 8, 4, 8,
673     8, 7, 4, 8, 8, 8, 5, 9, 9, 8, 6, 10, 10, 9,
674     5, 8, 8, 8, 4, 8, 8, 8, 6, 10, 10, 9, 5, 9,
675     9, 8, 5, 8, 8, 8, 4, 8, 8, 7, 5, 8, 8, 8,
676     5, 8, 8, 7, 3, 6, 6, 4
677   }, {
678     6, 6, 9, 3, 8, 8, 9, 3, 8, 8, 9, 4, 9,
679     9, 9, 3, 8, 8, 9, 5, 10, 10, 10, 6, 11, 11, 11,
680     5, 10, 10, 10, 3, 8, 8, 8, 6, 11, 11, 11, 5, 10,
681     10, 10, 5, 9, 9, 9, 4, 9, 9, 9, 5, 9, 9, 9,
682     5, 9, 9, 9, 5, 8, 8, 9
683   }, {
684     6, 6, 10, 3, 7, 7, 7, 3, 7, 7, 7, 4, 8,
685     8, 8, 3, 7, 7, 7, 5, 9, 9, 9, 6, 10, 10, 10,
686     6, 10, 10, 10, 3, 7, 7, 7, 6, 10, 10, 10, 5, 9,
687     9, 9, 6, 10, 10, 10, 4, 8, 8, 8, 6, 10, 10, 10,
688     5, 9, 9, 9, 6, 9, 9, 9
689   }
690 };
691
692 /* MacroBlock Transform Type: 7.1.3.11, p89
693  * 8x8:B
694  * 8x4:B:btm  8x4:B:top  8x4:B:both,
695  * 4x8:B:right  4x8:B:left  4x8:B:both
696  * 4x4:B  8x8:MB
697  * 8x4:MB:btm  8x4:MB:top  8x4,MB,both
698  * 4x8,MB,right  4x8,MB,left
699  * 4x4,MB                               */
700 const uint16_t ff_vc1_ttmb_codes[3][16] = {
701   {
702     0x0003,
703     0x002E, 0x005F, 0x0000,
704     0x0016, 0x0015, 0x0001,
705     0x0004, 0x0014,
706     0x02F1, 0x0179, 0x017B,
707     0x0BC0, 0x0BC1, 0x05E1,
708     0x017A
709   },
710   {
711     0x0006,
712     0x0006, 0x0003, 0x0007,
713     0x000F, 0x000E, 0x0000,
714     0x0002, 0x0002,
715     0x0014, 0x0011, 0x000B,
716     0x0009, 0x0021, 0x0015,
717     0x0020
718   },
719   {
720     0x0006,
721     0x0000, 0x000E, 0x0005,
722     0x0002, 0x0003, 0x0003,
723     0x000F, 0x0002,
724     0x0081, 0x0021, 0x0009,
725     0x0101, 0x0041, 0x0011,
726     0x0100
727   }
728 };
729
730 const uint8_t ff_vc1_ttmb_bits[3][16] = {
731   {
732      2,
733      6,  7,  2,
734      5,  5,  2,
735      3,  5,
736     10,  9,  9,
737     12, 12, 11,
738      9
739   },
740   {
741     3,
742     4, 4, 4,
743     4, 4, 3,
744     3, 2,
745     7, 7, 6,
746     6, 8, 7,
747     8
748   },
749   {
750      3,
751      3, 4, 5,
752      3, 3, 4,
753      4, 2,
754     10, 8, 6,
755     11, 9, 7,
756     11
757   }
758 };
759
760 /* TTBLK (Transform Type per Block) tables */
761 const uint8_t ff_vc1_ttblk_codes[3][8] = {
762   {  0,  1,  3,  5, 16, 17, 18, 19},
763   {  3,  0,  1,  2,  3,  5,  8,  9},
764   {  1,  0,  1,  4,  6,  7, 10, 11}
765 };
766 const uint8_t ff_vc1_ttblk_bits[3][8] = {
767   {  2,  2,  2,  3,  5,  5,  5,  5},
768   {  2,  3,  3,  3,  3,  3,  4,  4},
769   {  2,  3,  3,  3,  3,  3,  4,  4}
770 };
771
772 /* SUBBLKPAT tables, p93-94, reordered */
773 const uint8_t ff_vc1_subblkpat_codes[3][15] = {
774   { 14, 12,  7, 11,  9, 26,  2, 10, 27,  8,  0,  6,  1, 15,  1},
775   { 14,  0,  8, 15, 10,  4, 23, 13,  5,  9, 25,  3, 24, 22,  1},
776   {  5,  6,  2,  2,  8,  0, 28,  3,  1,  3, 29,  1, 19, 18, 15}
777 };
778 const uint8_t ff_vc1_subblkpat_bits[3][15] = {
779   {  5,  5,  5,  5,  5,  6,  4,  5,  6,  5,  4,  5,  4,  5,  1},
780   {  4,  3,  4,  4,  4,  5,  5,  4,  5,  4,  5,  4,  5,  5,  2},
781   {  3,  3,  4,  3,  4,  5,  5,  3,  5,  4,  5,  4,  5,  5,  4}
782 };
783
784 /* MV differential tables, p265 */
785 const uint16_t ff_vc1_mv_diff_codes[4][73] = {
786   {
787        0,    2,    3,    8,  576,    3,    2,    6,
788        5,  577,  578,    7,    8,    9,   40,   19,
789       37,   82,   21,   22,   23,  579,  580,  166,
790       96,  167,   49,  194,  195,  581,  582,  583,
791      292,  293,  294,   13,    2,    7,   24,   50,
792      102,  295,   13,    7,    8,   18,   50,  103,
793       38,   20,   21,   22,   39,  204,  103,   23,
794       24,   25,  104,  410,  105,  106,  107,  108,
795      109,  220,  411,  442,  222,  443,  446,  447,
796        7 /* 73 elements */
797   },
798   {
799        0,    4,    5,    3,    4,    3,    4,    5,
800       20,    6,   21,   44,   45,   46, 3008,   95,
801      112,  113,   57, 3009, 3010,  116,  117, 3011,
802      118, 3012, 3013, 3014, 3015, 3016, 3017, 3018,
803     3019, 3020, 3021, 3022,    1,    4,   15,  160,
804      161,   41,    6,   11,   42,  162,   43,  119,
805       56,   57,   58,  163,  236,  237, 3023,  119,
806      120,  242,  122,  486, 1512,  487,  246,  494,
807     1513,  495, 1514, 1515, 1516, 1517, 1518, 1519,
808       31 /* 73 elements */
809   },
810   {
811        0,  512,  513,  514,  515,    2,    3,  258,
812      259,  260,  261,  262,  263,  264,  265,  266,
813      267,  268,  269,  270,  271,  272,  273,  274,
814      275,  276,  277,  278,  279,  280,  281,  282,
815      283,  284,  285,  286,    1,    5,  287,  288,
816      289,  290,    6,    7,  291,  292,  293,  294,
817      295,  296,  297,  298,  299,  300,  301,  302,
818      303,  304,  305,  306,  307,  308,  309,  310,
819      311,  312,  313,  314,  315,  316,  317,  318,
820      319 /* 73 elements */
821   },
822   {
823        0,    1,    1,    2,    3,    4,    1,    5,
824        4,    3,    5,    8,    6,    9,   10,   11,
825       12,    7,  104,   14,  105,    4,   10,   15,
826       11,    6,   14,    8,  106,  107,  108,   15,
827      109,    9,   55,   10,    1,    2,    1,    2,
828        3,   12,    6,    2,    6,    7,   28,    7,
829       15,    8,    5,   18,   29,  152,   77,   24,
830       25,   26,   39,  108,   13,  109,   55,   56,
831       57,  116,   11,  153,  234,  235,  118,  119,
832       15 /* 73 elements */
833   }
834 };
835 const uint8_t ff_vc1_mv_diff_bits[4][73] = {
836   {
837      6,  7,  7,  8, 14,  6,  5,  6,  7, 14, 14,  6,  6,  6,  8,  9,
838     10,  9,  7,  7,  7, 14, 14, 10,  9, 10,  8, 10, 10, 14, 14, 14,
839     13, 13, 13,  6,  3,  5,  6,  8,  9, 13,  5,  4,  4,  5,  7,  9,
840      6,  5,  5,  5,  6,  9,  8,  5,  5,  5,  7, 10,  7,  7,  7,  7,
841      7,  8, 10,  9,  8,  9,  9,  9,  3 /* 73 elements */
842   },
843   {
844      5,  7,  7,  6,  6,  5,  5,  6,  7,  5,  7,  8,  8,  8, 14,  9,
845      9,  9,  8, 14, 14,  9,  9, 14,  9, 14, 14, 14, 14, 14, 14, 14,
846     14, 14, 14, 14,  2,  3,  6,  8,  8,  6,  3,  4,  6,  8,  6,  9,
847      6,  6,  6,  8,  8,  8, 14,  7,  7,  8,  7,  9, 13,  9,  8,  9,
848     13,  9, 13, 13, 13, 13, 13, 13,  5 /* 73 elements */
849
850   },
851   {
852      3, 12, 12, 12, 12,  3,  4, 11, 11, 11, 11, 11, 11, 11, 11, 11,
853     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
854     11, 11, 11, 11,  1,  5, 11, 11, 11, 11,  4,  4, 11, 11, 11, 11,
855     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
856     11, 11, 11, 11, 11, 11, 11, 11, 11 /* 73 elements */
857   },
858   {
859     15, 11, 15, 15, 15, 15, 12, 15, 12, 11, 12, 12, 15, 12, 12, 12,
860     12, 15, 15, 12, 15, 10, 11, 12, 11, 10, 11, 10, 15, 15, 15, 11,
861     15, 10, 14, 10,  4,  4,  5,  7,  8,  9,  5,  3,  4,  5,  6,  8,
862      5,  4,  3,  5,  6,  8,  7,  5,  5,  5,  6,  7,  9,  7,  6,  6,
863      6,  7, 10,  8,  8,  8,  7,  7,  4 /* 73 elements */
864   }
865 };
866
867 /* DC differentials low+hi-mo, p217 are the same as in msmpeg4data .h */
868
869 /* Table 232 */
870 const int8_t ff_vc1_simple_progressive_4x4_zz [16] =
871 {
872        0,     8,    16,     1,
873        9,    24,    17,     2,
874       10,    18,    25,     3,
875       11,    26,    19,    27
876 };
877
878 const int8_t ff_vc1_adv_progressive_8x4_zz [32] = /* Table 233 */
879 {
880        0,     8,     1,    16,     2,     9,    10,     3,
881       24,    17,     4,    11,    18,    12,     5,    19,
882       25,    13,    20,    26,    27,     6,    21,    28,
883       14,    22,    29,     7,    30,    15,    23,    31
884 };
885
886 const int8_t ff_vc1_adv_progressive_4x8_zz [32] = /* Table 234 */
887 {
888        0,     1,     8,     2,
889        9,    16,    17,    24,
890       10,    32,    25,    18,
891       40,     3,    33,    26,
892       48,    11,    56,    41,
893       34,    49,    57,    42,
894       19,    50,    27,    58,
895       35,    43,    51,    59
896 };
897
898 const int8_t ff_vc1_adv_interlaced_8x8_zz [64] = /* Table 235 */
899 {
900        0,     8,     1,    16,    24,     9,     2,    32,
901       40,    48,    56,    17,    10,     3,    25,    18,
902       11,     4,    33,    41,    49,    57,    26,    34,
903       42,    50,    58,    19,    12,     5,    27,    20,
904       13,     6,    35,    28,    21,    14,     7,    15,
905       22,    29,    36,    43,    51,    59,    60,    52,
906       44,    37,    30,    23,    31,    38,    45,    53,
907       61,    62,    54,    46,    39,    47,    55,    63
908 };
909
910 const int8_t ff_vc1_adv_interlaced_8x4_zz [32] = /* Table 236 */
911 {
912        0,     8,    16,    24,     1,     9,     2,    17,
913       25,    10,     3,    18,    26,     4,    11,    19,
914       12,     5,    13,    20,    27,     6,    21,    28,
915       14,    22,    29,     7,    30,    15,    23,    31
916 };
917
918 const int8_t ff_vc1_adv_interlaced_4x8_zz [32] = /* Table 237 */
919 {
920        0,     1,     2,     8,
921       16,     9,    24,    17,
922       10,     3,    32,    40,
923       48,    56,    25,    18,
924       33,    26,    41,    34,
925       49,    57,    11,    42,
926       19,    50,    27,    58,
927       35,    43,    51,    59
928 };
929
930 const int8_t ff_vc1_adv_interlaced_4x4_zz [16] = /* Table 238 */
931 {
932        0,     8,    16,    24,
933        1,     9,    17,     2,
934       25,    10,    18,     3,
935       26,    11,    19,    27
936 };
937
938
939 /* DQScale as specified in 8.1.3.9 - almost identical to 0x40000/i */
940 const int32_t ff_vc1_dqscale[63] = {
941 0x40000, 0x20000, 0x15555, 0x10000, 0xCCCD, 0xAAAB, 0x9249, 0x8000,
942     0x71C7, 0x6666, 0x5D17, 0x5555, 0x4EC5, 0x4925, 0x4444, 0x4000,
943     0x3C3C, 0x38E4, 0x35E5, 0x3333, 0x30C3, 0x2E8C, 0x2C86, 0x2AAB,
944     0x28F6, 0x2762, 0x25ED, 0x2492, 0x234F, 0x2222, 0x2108, 0x2000,
945     0x1F08, 0x1E1E, 0x1D42, 0x1C72, 0x1BAD, 0x1AF3, 0x1A42, 0x199A,
946     0x18FA, 0x1862, 0x17D0, 0x1746, 0x16C1, 0x1643, 0x15CA, 0x1555,
947     0x14E6, 0x147B, 0x1414, 0x13B1, 0x1352, 0x12F7, 0x129E, 0x1249,
948     0x11F7, 0x11A8, 0x115B, 0x1111, 0x10C9, 0x1084, 0x1000
949 };
950
951 /* P Interlaced field picture MV predictor scaling values (Table 114) */
952 const uint16_t vc1_field_mvpred_scales[2][7][4] = {
953 // Refdist  0       1       2       3 or greater
954   { // current field is first
955     { 128,    192,    213,    224},   // SCALEOPP
956     { 512,    341,    307,    293},   // SCALESAME1
957     { 219,    236,    242,    245},   // SCALESAME2
958     {  32,     48,     53,     56},   // SCALEZONE1_X
959     {   8,     12,     13,     14},   // SCALEZONE1_Y
960     {  37,     20,     14,     11},   // ZONE1OFFSET_X
961     {  10,      5,      4,      3}    // ZONE1OFFSET_Y
962   },
963   { // current field is second
964     { 128,     64,     43,     32},   // SCALEOPP
965     { 512,   1024,   1536,   2048},   // SCALESAME1
966     { 219,    204,    200,    198},   // SCALESAME2
967     {  32,     16,     11,      8},   // SCALEZONE1_X
968     {   8,      4,      3,      2},   // SCALEZONE1_Y
969     {  37,     52,     56,     58},   // ZONE1OFFSET_X
970     {  10,     13,     14,     15}    // ZONE1OFFSET_Y
971   }
972 };
973
974 /* B Interlaced field picture backward MV predictor scaling values for first field (Table 115) */
975 const uint16_t vc1_b_field_mvpred_scales[7][4] = {
976 // BRFD     0       1       2       3 or greater
977   { 171,    205,    219,    228},   // SCALESAME
978   { 384,    320,    299,    288},   // SCALEOPP1
979   { 230,    239,    244,    246},   // SCALEOPP2
980   {  43,     51,     55,     57},   // SCALEZONE1_X
981   {  11,     13,     14,     14},   // SCALEZONE1_Y
982   {  26,     17,     12,     10},   // ZONE1OFFSET_X
983   {   7,      4,      3,      3}    // ZONE1OFFSET_Y
984 };