Add 8088flex TMV video decoder.
[ffmpeg.git] / libavcodec / vc1data.c
1 /*
2  * VC-1 and WMV3 decoder
3  * copyright (c) 2006 Konstantin Shishkov
4  * (c) 2005 anonymous, Alex Beregszaszi, Michael Niedermayer
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file libavcodec/vc1data.c
25  * VC-1 tables.
26  */
27
28 #include "avcodec.h"
29 #include "vc1.h"
30 #include "vc1data.h"
31
32 /** Table for conversion between TTBLK and TTMB */
33 const int ff_vc1_ttblk_to_tt[3][8] = {
34   { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
35   { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
36   { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
37 };
38
39 const int ff_vc1_ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
40
41 /** MV P mode - the 5th element is only used for mode 1 */
42 const uint8_t ff_vc1_mv_pmode_table[2][5] = {
43   { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
44   { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
45 };
46 const uint8_t ff_vc1_mv_pmode_table2[2][4] = {
47   { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
48   { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
49 };
50
51 const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 },
52   ff_vc1_fps_dr[2] = { 1000, 1001 };
53 const uint8_t ff_vc1_pquant_table[3][32] = {
54   {  /* Implicit quantizer */
55      0,  1,  2,  3,  4,  5,  6,  7,  8,  6,  7,  8,  9, 10, 11, 12,
56     13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
57   },
58   {  /* Explicit quantizer, pquantizer uniform */
59      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
60     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
61   },
62   {  /* Explicit quantizer, pquantizer non-uniform */
63      0,  1,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
64     14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
65   }
66 };
67
68 /** @name VC-1 VLC tables and defines
69  *  @todo TODO move this into the context
70  */
71 //@{
72 #define VC1_BFRACTION_VLC_BITS 7
73 VLC ff_vc1_bfraction_vlc;
74 #define VC1_IMODE_VLC_BITS 4
75 VLC ff_vc1_imode_vlc;
76 #define VC1_NORM2_VLC_BITS 3
77 VLC ff_vc1_norm2_vlc;
78 #define VC1_NORM6_VLC_BITS 9
79 VLC ff_vc1_norm6_vlc;
80 /* Could be optimized, one table only needs 8 bits */
81 #define VC1_TTMB_VLC_BITS 9 //12
82 VLC ff_vc1_ttmb_vlc[3];
83 #define VC1_MV_DIFF_VLC_BITS 9 //15
84 VLC ff_vc1_mv_diff_vlc[4];
85 #define VC1_CBPCY_P_VLC_BITS 9 //14
86 VLC ff_vc1_cbpcy_p_vlc[4];
87 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
88 VLC ff_vc1_4mv_block_pattern_vlc[4];
89 #define VC1_TTBLK_VLC_BITS 5
90 VLC ff_vc1_ttblk_vlc[3];
91 #define VC1_SUBBLKPAT_VLC_BITS 6
92 VLC ff_vc1_subblkpat_vlc[3];
93
94 VLC ff_vc1_ac_coeff_table[8];
95 //@}
96
97
98 #if B_FRACTION_DEN==840 //original bfraction from vc9data.h, not conforming to standard
99 /* bfraction is fractional, we scale to the GCD 3*5*7*8 = 840 */
100 const int16_t ff_vc1_bfraction_lut[23] = {
101   420 /*1/2*/, 280 /*1/3*/, 560 /*2/3*/, 210 /*1/4*/,
102   630 /*3/4*/, 168 /*1/5*/, 336 /*2/5*/,
103   504 /*3/5*/, 672 /*4/5*/, 140 /*1/6*/, 700 /*5/6*/,
104   120 /*1/7*/, 240 /*2/7*/, 360 /*3/7*/, 480 /*4/7*/,
105   600 /*5/7*/, 720 /*6/7*/, 105 /*1/8*/, 315 /*3/8*/,
106   525 /*5/8*/, 735 /*7/8*/,
107   -1 /*inv.*/, 0 /*BI fm*/
108 };
109 #else
110 /* pre-computed scales for all bfractions and base=256 */
111 const int16_t ff_vc1_bfraction_lut[23] = {
112   128 /*1/2*/,  85 /*1/3*/, 170 /*2/3*/,  64 /*1/4*/,
113   192 /*3/4*/,  51 /*1/5*/, 102 /*2/5*/,
114   153 /*3/5*/, 204 /*4/5*/,  43 /*1/6*/, 215 /*5/6*/,
115    37 /*1/7*/,  74 /*2/7*/, 111 /*3/7*/, 148 /*4/7*/,
116   185 /*5/7*/, 222 /*6/7*/,  32 /*1/8*/,  96 /*3/8*/,
117   160 /*5/8*/, 224 /*7/8*/,
118   -1 /*inv.*/, 0 /*BI fm*/
119 };
120 #endif
121
122 const uint8_t ff_vc1_bfraction_bits[23] = {
123     3, 3, 3, 3,
124     3, 3, 3,
125     7, 7, 7, 7,
126     7, 7, 7, 7,
127     7, 7, 7, 7,
128     7, 7,
129     7, 7
130 };
131 const uint8_t ff_vc1_bfraction_codes[23] = {
132      0,   1,   2,   3,
133      4,   5,   6,
134    112, 113, 114, 115,
135    116, 117, 118, 119,
136    120, 121, 122, 123,
137    124, 125,
138    126, 127
139 };
140
141 //Same as H.264
142 const AVRational ff_vc1_pixel_aspect[16]={
143  {0, 1},
144  {1, 1},
145  {12, 11},
146  {10, 11},
147  {16, 11},
148  {40, 33},
149  {24, 11},
150  {20, 11},
151  {32, 11},
152  {80, 33},
153  {18, 11},
154  {15, 11},
155  {64, 33},
156  {160, 99},
157  {0, 1},
158  {0, 1}
159 };
160
161 /* BitPlane IMODE - such a small table... */
162 const uint8_t ff_vc1_imode_codes[7] = {
163   0, 2, 1, 3, 1, 2, 3
164 };
165 const uint8_t ff_vc1_imode_bits[7] = {
166   4, 2, 3, 2, 4, 3, 3
167 };
168
169 /* Normal-2 imode */
170 const uint8_t ff_vc1_norm2_codes[4] = {
171   0, 4, 5, 3
172 };
173 const uint8_t ff_vc1_norm2_bits[4] = {
174   1, 3, 3, 2
175 };
176
177 const uint16_t ff_vc1_norm6_codes[64] = {
178 0x001, 0x002, 0x003, 0x000, 0x004, 0x001, 0x002, 0x047, 0x005, 0x003, 0x004, 0x04B, 0x005, 0x04D, 0x04E, 0x30E,
179 0x006, 0x006, 0x007, 0x053, 0x008, 0x055, 0x056, 0x30D, 0x009, 0x059, 0x05A, 0x30C, 0x05C, 0x30B, 0x30A, 0x037,
180 0x007, 0x00A, 0x00B, 0x043, 0x00C, 0x045, 0x046, 0x309, 0x00D, 0x049, 0x04A, 0x308, 0x04C, 0x307, 0x306, 0x036,
181 0x00E, 0x051, 0x052, 0x305, 0x054, 0x304, 0x303, 0x035, 0x058, 0x302, 0x301, 0x034, 0x300, 0x033, 0x032, 0x007,
182 };
183
184 const uint8_t ff_vc1_norm6_bits[64] = {
185  1,  4,  4,  8,  4,  8,  8, 10,  4,  8,  8, 10,  8, 10, 10, 13,
186  4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
187  4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
188  8, 10, 10, 13, 10, 13, 13,  9, 10, 13, 13,  9, 13,  9,  9,  6,
189 };
190 #if 0
191 /* Normal-6 imode */
192 const uint8_t ff_vc1_norm6_spec[64][5] = {
193 { 0,  1, 1        },
194 { 1,  2, 4        },
195 { 2,  3, 4        },
196 { 3,  0, 8        },
197 { 4,  4, 4        },
198 { 5,  1, 8        },
199 { 6,  2, 8        },
200 { 7,  2, 5,  7, 5 },
201 { 8,  5, 4        },
202 { 9,  3, 8        },
203 {10,  4, 8        },
204 {11,  2, 5, 11, 5 },
205 {12,  5, 8        },
206 {13,  2, 5, 13, 5 },
207 {14,  2, 5, 14, 5 },
208 {15,  3, 5, 14, 8 },
209 {16,  6, 4        },
210 {17,  6, 8        },
211 {18,  7, 8        },
212 {19,  2, 5, 19, 5 },
213 {20,  8, 8        },
214 {21,  2, 5, 21, 5 },
215 {22,  2, 5, 22, 5 },
216 {23,  3, 5, 13, 8 },
217 {24,  9, 8        },
218 {25,  2, 5, 25, 5 },
219 {26,  2, 5, 26, 5 },
220 {27,  3, 5, 12, 8 },
221 {28,  2, 5, 28, 5 },
222 {29,  3, 5, 11, 8 },
223 {30,  3, 5, 10, 8 },
224 {31,  3, 5,  7, 4 },
225 {32,  7, 4        },
226 {33, 10, 8        },
227 {34, 11, 8        },
228 {35,  2, 5,  3, 5 },
229 {36, 12, 8        },
230 {37,  2, 5,  5, 5 },
231 {38,  2, 5,  6, 5 },
232 {39,  3, 5,  9, 8 },
233 {40, 13, 8        },
234 {41,  2, 5,  9, 5 },
235 {42,  2, 5, 10, 5 },
236 {43,  3, 5,  8, 8 },
237 {44,  2, 5, 12, 5 },
238 {45,  3, 5,  7, 8 },
239 {46,  3, 5,  6, 8 },
240 {47,  3, 5,  6, 4 },
241 {48, 14, 8        },
242 {49,  2, 5, 17, 5 },
243 {50,  2, 5, 18, 5 },
244 {51,  3, 5,  5, 8 },
245 {52,  2, 5, 20, 5 },
246 {53,  3, 5,  4, 8 },
247 {54,  3, 5,  3, 8 },
248 {55,  3, 5,  5, 4 },
249 {56,  2, 5, 24, 5 },
250 {57,  3, 5,  2, 8 },
251 {58,  3, 5,  1, 8 },
252 {59,  3, 5,  4, 4 },
253 {60,  3, 5,  0, 8 },
254 {61,  3, 5,  3, 4 },
255 {62,  3, 5,  2, 4 },
256 {63,  3, 5,  1, 1 },
257 };
258 #endif
259
260 /* 4MV Block pattern VLC tables */
261 const uint8_t ff_vc1_4mv_block_pattern_codes[4][16] = {
262   { 14, 58, 59, 25, 12, 26, 15, 15, 13, 24, 27,  0, 28,  1,  2,  2},
263   {  8, 18, 19,  4, 20,  5, 30, 11, 21, 31,  6, 12,  7, 13, 14,  0},
264   { 15,  6,  7,  2,  8,  3, 28,  9, 10, 29,  4, 11,  5, 12, 13,  0},
265   {  0, 11, 12,  4, 13,  5, 30, 16, 14, 31,  6, 17,  7, 18, 19, 10}
266 };
267 const uint8_t ff_vc1_4mv_block_pattern_bits[4][16] = {
268   { 5, 6, 6, 5, 5, 5, 5, 4, 5, 5, 5, 3, 5, 3, 3, 2},
269   { 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2},
270   { 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3},
271   { 2, 4, 4, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4}
272 };
273
274 const uint8_t wmv3_dc_scale_table[32]={
275     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
276 };
277
278 /* P-Picture CBPCY VLC tables */
279 #if 1 // Looks like original tables are not conforming to standard at all. Are they used for old WMV?
280 const uint16_t ff_vc1_cbpcy_p_codes[4][64] = {
281   {
282       0,   6,  15,  13,  13,  11,   3,  13,   5,   8,  49,  10,  12, 114, 102, 119,
283       1,  54,  96,   8,  10, 111,   5,  15,  12,  10,   2,  12,  13, 115,  53,  63,
284       1,   7,   1,   7,  14,  12,   4,  14,   1,   9,  97,  11,   7,  58,  52,  62,
285       4, 103,   1,   9,  11,  56, 101, 118,   4, 110, 100,  30,   2,   5,   4,   3
286   },
287   {
288       0,   9,   1,  18,   5,  14, 237,  26,   3, 121,   3,  22,  13,  16,   6,  30,
289       2,  10,   1,  20,  12, 241,   5,  28,  16,  12,   3,  24,  28, 124, 239, 247,
290       1, 240,   1,  19,  18,  15,   4,  27,   1, 122,   2,  23,   1,  17,   7,  31,
291       1,  11,   2,  21,  19, 246, 238,  29,  17,  13, 236,  25,  58,  63,   8, 125
292   },
293   {
294       0, 201,  25, 231,   5, 221,   1,   3,   2, 414,   2, 241,  16, 225, 195, 492,
295       2, 412,   1, 240,   7, 224,  98, 245,   1, 220,  96,   5,   9, 230, 101, 247,
296       1, 102,   1, 415,  24,   3,   2, 244,   3,  54,   3, 484,  17, 114, 200, 493,
297       3, 413,   1,   4,  13, 113,  99, 485,   4, 111, 194, 243,   5,  29,  26,  31
298   },
299   {
300       0,  28,  12,  44,   3,  36,  20,  52,   2,  32,  16,  48,   8,  40,  24,  28,
301       1,  30,  14,  46,   6,  38,  22,  54,   3,  34,  18,  50,  10,  42,  26,  30,
302       1,  29,  13,  45,   5,  37,  21,  53,   2,  33,  17,  49,   9,  41,  25,  29,
303       1,  31,  15,  47,   7,  39,  23,  55,   4,  35,  19,  51,  11,  43,  27,  31
304    }
305 };
306
307 const uint8_t ff_vc1_cbpcy_p_bits[4][64] = {
308   {
309     13,  13,   7,  13,   7,  13,  13,  12,   6,  13,   7,  12,   6,   8,   8,   8,
310      5,   7,   8,  12,   6,   8,  13,  12,   7,  13,  13,  12,   6,   8,   7,   7,
311      6,  13,   8,  12,   7,  13,  13,  12,   7,  13,   8,  12,   5,   7,   7,   7,
312      6,   8,  13,  12,   6,   7,   8,   8,   5,   8,   8,   6,   3,   3,   3,   2
313   },
314   {
315     14,  13,   8,  13,   3,  13,   8,  13,   3,   7,   8,  13,   4,  13,  13,  13,
316      3,  13,  13,  13,   4,   8,  13,  13,   5,  13,  13,  13,   5,   7,   8,   8,
317      3,   8,  14,  13,   5,  13,  13,  13,   4,   7,  13,  13,   6,  13,  13,  13,
318      5,  13,   8,  13,   5,   8,   8,  13,   5,  13,   8,  13,   6,   6,  13,   7
319   },
320   {
321     13,   8,   6,   8,   4,   8,  13,  12,   4,   9,   8,   8,   5,   8,   8,   9,
322      5,   9,  10,   8,   4,   8,   7,   8,   6,   8,   7,  13,   4,   8,   7,   8,
323      5,   7,   8,   9,   6,  13,  13,   8,   4,   6,   8,   9,   5,   7,   8,   9,
324      5,   9,   9,  13,   5,   7,   7,   9,   4,   7,   8,   8,   3,   5,   5,   5
325   },
326   {
327      9,   9,   9,   9,   2,   9,   9,   9,   2,   9,   9,   9,   9,   9,   9,   8,
328      3,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
329      2,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
330      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8
331   }
332 };
333 #else
334 const uint16_t ff_vc1_cbpcy_p_codes[4][64] = {
335   {
336       0,   1,   1,   4,   5,   1,  12,   4,  13,  14,  10,  11,  12,   7,  13,   2,
337      15,   1,  96,   1,  49,  97,   2, 100,   3,   4,   5, 101, 102,  52,  53,   4,
338       6,   7,  54, 103,   8,   9,  10, 110,  11,  12, 111,  56, 114,  58, 115,   5,
339      13,   7,   8,   9,  10,  11,  12,  30,  13,  14,  15, 118, 119,  62,  63,   3
340   },
341   {
342       0,   1,   2,   1,   3,   1,  16,  17,   5,  18,  12,  19,  13,   1,  28,  58,
343       1,   1,   1,   2,   3,   2,   3, 236, 237,   4,   5, 238,   6,   7, 239,   8,
344       9, 240,  10,  11, 121, 122,  12,  13,  14,  15, 241, 246,  16,  17, 124,  63,
345      18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31, 247, 125
346   },
347   {
348       0,   1,   2,   3,   2,   3,   1,   4,   5,  24,   7,  13,  16,  17,   9,   5,
349      25,   1,   1,   1,   2,   3,  96, 194,   1,   2,  98,  99, 195, 200, 101,  26,
350     201, 102, 412, 413, 414,  54, 220, 111, 221,   3, 224, 113, 225, 114, 230,  29,
351     231, 415, 240,   4, 241, 484,   5, 243,   3, 244, 245, 485, 492, 493, 247,  31
352   },
353   {
354       0,   1,   1,   1,   2,   2,   3,   4,   3,   5,   6,   7,   8,   9,  10,  11,
355      12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
356      28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,
357      44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  28,  29,  30,  31
358    }
359 };
360 const uint8_t ff_vc1_cbpcy_p_bits[4][64] = {
361   {
362     13,  6,  5,  6,  6,  7,  7,  5,  7,  7,  6,  6,  6,  5,  6,  3,
363      7,  8,  8, 13,  7,  8, 13,  8, 13, 13, 13,  8,  8,  7,  7,  3,
364     13, 13,  7,  8, 13, 13, 13,  8, 13, 13,  8,  7,  8,  7,  8,  3,
365     13, 12, 12, 12, 12, 12, 12,  6, 12, 12, 12,  8,  8,  7,  7,  2
366   },
367   {
368     14,  3,  3,  5,  3,  4,  5,  5,  3,  5,  4,  5,  4,  6,  5,  6,
369      8, 14, 13,  8,  8, 13, 13,  8,  8, 13, 13,  8, 13, 13,  8, 13,
370     13,  8, 13, 13,  7,  7, 13, 13, 13, 13,  8,  8, 13, 13,  7,  6,
371     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,  8,  7
372   },
373   {
374     13,  5,  5,  5,  4,  4,  6,  4,  4,  6,  4,  5,  5,  5,  4,  3,
375      6,  8, 10,  9,  8,  8,  7,  8, 13, 13,  7,  7,  8,  8,  7,  5,
376      8,  7,  9,  9,  9,  6,  8,  7,  8, 13,  8,  7,  8,  7,  8,  5,
377      8,  9,  8, 13,  8,  9, 13,  8, 12,  8,  8,  9,  9,  9,  8,  5
378   },
379   {
380      9,  2,  3,  9,  2,  9,  9,  9,  2,  9,  9,  9,  9,  9,  9,  9,
381      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
382      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
383      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,  8
384   }
385 };
386 #endif
387
388 /* MacroBlock Transform Type: 7.1.3.11, p89
389  * 8x8:B
390  * 8x4:B:btm  8x4:B:top  8x4:B:both,
391  * 4x8:B:right  4x8:B:left  4x8:B:both
392  * 4x4:B  8x8:MB
393  * 8x4:MB:btm  8x4:MB:top  8x4,MB,both
394  * 4x8,MB,right  4x8,MB,left
395  * 4x4,MB                               */
396 const uint16_t ff_vc1_ttmb_codes[3][16] = {
397   {
398     0x0003,
399     0x002E, 0x005F, 0x0000,
400     0x0016, 0x0015, 0x0001,
401     0x0004, 0x0014,
402     0x02F1, 0x0179, 0x017B,
403     0x0BC0, 0x0BC1, 0x05E1,
404     0x017A
405   },
406   {
407     0x0006,
408     0x0006, 0x0003, 0x0007,
409     0x000F, 0x000E, 0x0000,
410     0x0002, 0x0002,
411     0x0014, 0x0011, 0x000B,
412     0x0009, 0x0021, 0x0015,
413     0x0020
414   },
415   {
416     0x0006,
417     0x0000, 0x000E, 0x0005,
418     0x0002, 0x0003, 0x0003,
419     0x000F, 0x0002,
420     0x0081, 0x0021, 0x0009,
421     0x0101, 0x0041, 0x0011,
422     0x0100
423   }
424 };
425
426 const uint8_t ff_vc1_ttmb_bits[3][16] = {
427   {
428      2,
429      6,  7,  2,
430      5,  5,  2,
431      3,  5,
432     10,  9,  9,
433     12, 12, 11,
434      9
435   },
436   {
437     3,
438     4, 4, 4,
439     4, 4, 3,
440     3, 2,
441     7, 7, 6,
442     6, 8, 7,
443     8
444   },
445   {
446      3,
447      3, 4, 5,
448      3, 3, 4,
449      4, 2,
450     10, 8, 6,
451     11, 9, 7,
452     11
453   }
454 };
455
456 /* TTBLK (Transform Type per Block) tables */
457 const uint8_t ff_vc1_ttblk_codes[3][8] = {
458   {  0,  1,  3,  5, 16, 17, 18, 19},
459   {  3,  0,  1,  2,  3,  5,  8,  9},
460   {  1,  0,  1,  4,  6,  7, 10, 11}
461 };
462 const uint8_t ff_vc1_ttblk_bits[3][8] = {
463   {  2,  2,  2,  3,  5,  5,  5,  5},
464   {  2,  3,  3,  3,  3,  3,  4,  4},
465   {  2,  3,  3,  3,  3,  3,  4,  4}
466 };
467
468 /* SUBBLKPAT tables, p93-94, reordered */
469 const uint8_t ff_vc1_subblkpat_codes[3][15] = {
470   { 14, 12,  7, 11,  9, 26,  2, 10, 27,  8,  0,  6,  1, 15,  1},
471   { 14,  0,  8, 15, 10,  4, 23, 13,  5,  9, 25,  3, 24, 22,  1},
472   {  5,  6,  2,  2,  8,  0, 28,  3,  1,  3, 29,  1, 19, 18, 15}
473 };
474 const uint8_t ff_vc1_subblkpat_bits[3][15] = {
475   {  5,  5,  5,  5,  5,  6,  4,  5,  6,  5,  4,  5,  4,  5,  1},
476   {  4,  3,  4,  4,  4,  5,  5,  4,  5,  4,  5,  4,  5,  5,  2},
477   {  3,  3,  4,  3,  4,  5,  5,  3,  5,  4,  5,  4,  5,  5,  4}
478 };
479
480 /* MV differential tables, p265 */
481 const uint16_t ff_vc1_mv_diff_codes[4][73] = {
482   {
483        0,    2,    3,    8,  576,    3,    2,    6,
484        5,  577,  578,    7,    8,    9,   40,   19,
485       37,   82,   21,   22,   23,  579,  580,  166,
486       96,  167,   49,  194,  195,  581,  582,  583,
487      292,  293,  294,   13,    2,    7,   24,   50,
488      102,  295,   13,    7,    8,   18,   50,  103,
489       38,   20,   21,   22,   39,  204,  103,   23,
490       24,   25,  104,  410,  105,  106,  107,  108,
491      109,  220,  411,  442,  222,  443,  446,  447,
492        7 /* 73 elements */
493   },
494   {
495        0,    4,    5,    3,    4,    3,    4,    5,
496       20,    6,   21,   44,   45,   46, 3008,   95,
497      112,  113,   57, 3009, 3010,  116,  117, 3011,
498      118, 3012, 3013, 3014, 3015, 3016, 3017, 3018,
499     3019, 3020, 3021, 3022,    1,    4,   15,  160,
500      161,   41,    6,   11,   42,  162,   43,  119,
501       56,   57,   58,  163,  236,  237, 3023,  119,
502      120,  242,  122,  486, 1512,  487,  246,  494,
503     1513,  495, 1514, 1515, 1516, 1517, 1518, 1519,
504       31 /* 73 elements */
505   },
506   {
507        0,  512,  513,  514,  515,    2,    3,  258,
508      259,  260,  261,  262,  263,  264,  265,  266,
509      267,  268,  269,  270,  271,  272,  273,  274,
510      275,  276,  277,  278,  279,  280,  281,  282,
511      283,  284,  285,  286,    1,    5,  287,  288,
512      289,  290,    6,    7,  291,  292,  293,  294,
513      295,  296,  297,  298,  299,  300,  301,  302,
514      303,  304,  305,  306,  307,  308,  309,  310,
515      311,  312,  313,  314,  315,  316,  317,  318,
516      319 /* 73 elements */
517   },
518   {
519        0,    1,    1,    2,    3,    4,    1,    5,
520        4,    3,    5,    8,    6,    9,   10,   11,
521       12,    7,  104,   14,  105,    4,   10,   15,
522       11,    6,   14,    8,  106,  107,  108,   15,
523      109,    9,   55,   10,    1,    2,    1,    2,
524        3,   12,    6,    2,    6,    7,   28,    7,
525       15,    8,    5,   18,   29,  152,   77,   24,
526       25,   26,   39,  108,   13,  109,   55,   56,
527       57,  116,   11,  153,  234,  235,  118,  119,
528       15 /* 73 elements */
529   }
530 };
531 const uint8_t ff_vc1_mv_diff_bits[4][73] = {
532   {
533      6,  7,  7,  8, 14,  6,  5,  6,  7, 14, 14,  6,  6,  6,  8,  9,
534     10,  9,  7,  7,  7, 14, 14, 10,  9, 10,  8, 10, 10, 14, 14, 14,
535     13, 13, 13,  6,  3,  5,  6,  8,  9, 13,  5,  4,  4,  5,  7,  9,
536      6,  5,  5,  5,  6,  9,  8,  5,  5,  5,  7, 10,  7,  7,  7,  7,
537      7,  8, 10,  9,  8,  9,  9,  9,  3 /* 73 elements */
538   },
539   {
540      5,  7,  7,  6,  6,  5,  5,  6,  7,  5,  7,  8,  8,  8, 14,  9,
541      9,  9,  8, 14, 14,  9,  9, 14,  9, 14, 14, 14, 14, 14, 14, 14,
542     14, 14, 14, 14,  2,  3,  6,  8,  8,  6,  3,  4,  6,  8,  6,  9,
543      6,  6,  6,  8,  8,  8, 14,  7,  7,  8,  7,  9, 13,  9,  8,  9,
544     13,  9, 13, 13, 13, 13, 13, 13,  5 /* 73 elements */
545
546   },
547   {
548      3, 12, 12, 12, 12,  3,  4, 11, 11, 11, 11, 11, 11, 11, 11, 11,
549     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
550     11, 11, 11, 11,  1,  5, 11, 11, 11, 11,  4,  4, 11, 11, 11, 11,
551     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
552     11, 11, 11, 11, 11, 11, 11, 11, 11 /* 73 elements */
553   },
554   {
555     15, 11, 15, 15, 15, 15, 12, 15, 12, 11, 12, 12, 15, 12, 12, 12,
556     12, 15, 15, 12, 15, 10, 11, 12, 11, 10, 11, 10, 15, 15, 15, 11,
557     15, 10, 14, 10,  4,  4,  5,  7,  8,  9,  5,  3,  4,  5,  6,  8,
558      5,  4,  3,  5,  6,  8,  7,  5,  5,  5,  6,  7,  9,  7,  6,  6,
559      6,  7, 10,  8,  8,  8,  7,  7,  4 /* 73 elements */
560   }
561 };
562
563 /* DC differentials low+hi-mo, p217 are the same as in msmpeg4data .h */
564
565 /* Table 232 */
566 const int8_t ff_vc1_simple_progressive_4x4_zz [16] =
567 {
568        0,     8,    16,     1,
569        9,    24,    17,     2,
570       10,    18,    25,     3,
571       11,    26,    19,    27
572 };
573
574 const int8_t ff_vc1_adv_progressive_8x4_zz [32] = /* Table 233 */
575 {
576        0,     8,     1,    16,     2,     9,    10,     3,
577       24,    17,     4,    11,    18,    12,     5,    19,
578       25,    13,    20,    26,    27,     6,    21,    28,
579       14,    22,    29,     7,    30,    15,    23,    31
580 };
581
582 const int8_t ff_vc1_adv_progressive_4x8_zz [32] = /* Table 234 */
583 {
584        0,     1,     8,     2,
585        9,    16,    17,    24,
586       10,    32,    25,    18,
587       40,     3,    33,    26,
588       48,    11,    56,    41,
589       34,    49,    57,    42,
590       19,    50,    27,    58,
591       35,    43,    51,    59
592 };
593
594 const int8_t ff_vc1_adv_interlaced_8x8_zz [64] = /* Table 235 */
595 {
596        0,     8,     1,    16,    24,     9,     2,    32,
597       40,    48,    56,    17,    10,     3,    25,    18,
598       11,     4,    33,    41,    49,    57,    26,    34,
599       42,    50,    58,    19,    12,     5,    27,    20,
600       13,     6,    35,    28,    21,    14,     7,    15,
601       22,    29,    36,    43,    51,    59,    60,    52,
602       44,    37,    30,    23,    31,    38,    45,    53,
603       61,    62,    54,    46,    39,    47,    55,    63
604 };
605
606 const int8_t ff_vc1_adv_interlaced_8x4_zz [32] = /* Table 236 */
607 {
608        0,     8,    16,    24,     1,     9,     2,    17,
609       25,    10,     3,    18,    26,     4,    11,    19,
610       12,     5,    13,    20,    27,     6,    21,    28,
611       14,    22,    29,     7,    30,    15,    23,    31
612 };
613
614 const int8_t ff_vc1_adv_interlaced_4x8_zz [32] = /* Table 237 */
615 {
616        0,     1,     2,     8,
617       16,     9,    24,    17,
618       10,     3,    32,    40,
619       48,    56,    25,    18,
620       33,    26,    41,    34,
621       49,    57,    11,    42,
622       19,    50,    27,    58,
623       35,    43,    51,    59
624 };
625
626 const int8_t ff_vc1_adv_interlaced_4x4_zz [16] = /* Table 238 */
627 {
628        0,     8,    16,    24,
629        1,     9,    17,     2,
630       25,    10,    18,     3,
631       26,    11,    19,    27
632 };
633
634
635 /* DQScale as specified in 8.1.3.9 - almost identical to 0x40000/i */
636 const int32_t ff_vc1_dqscale[63] = {
637 0x40000, 0x20000, 0x15555, 0x10000, 0xCCCD, 0xAAAB, 0x9249, 0x8000,
638     0x71C7, 0x6666, 0x5D17, 0x5555, 0x4EC5, 0x4925, 0x4444, 0x4000,
639     0x3C3C, 0x38E4, 0x35E5, 0x3333, 0x30C3, 0x2E8C, 0x2C86, 0x2AAB,
640     0x28F6, 0x2762, 0x25ED, 0x2492, 0x234F, 0x2222, 0x2108, 0x2000,
641     0x1F08, 0x1E1E, 0x1D42, 0x1C72, 0x1BAD, 0x1AF3, 0x1A42, 0x199A,
642     0x18FA, 0x1862, 0x17D0, 0x1746, 0x16C1, 0x1643, 0x15CA, 0x1555,
643     0x14E6, 0x147B, 0x1414, 0x13B1, 0x1352, 0x12F7, 0x129E, 0x1249,
644     0x11F7, 0x11A8, 0x115B, 0x1111, 0x10C9, 0x1084, 0x1000
645 };