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
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 */
33const 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
39const 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 */
42const 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};
46const 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
51const int ff_vc1_fps_nr[5] = { 24, 25, 30, 50, 60 },
52  ff_vc1_fps_dr[2] = { 1000, 1001 };
53const 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
73VLC ff_vc1_bfraction_vlc;
74#define VC1_IMODE_VLC_BITS 4
75VLC ff_vc1_imode_vlc;
76#define VC1_NORM2_VLC_BITS 3
77VLC ff_vc1_norm2_vlc;
78#define VC1_NORM6_VLC_BITS 9
79VLC ff_vc1_norm6_vlc;
80/* Could be optimized, one table only needs 8 bits */
81#define VC1_TTMB_VLC_BITS 9 //12
82VLC ff_vc1_ttmb_vlc[3];
83#define VC1_MV_DIFF_VLC_BITS 9 //15
84VLC ff_vc1_mv_diff_vlc[4];
85#define VC1_CBPCY_P_VLC_BITS 9 //14
86VLC ff_vc1_cbpcy_p_vlc[4];
87#define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
88VLC ff_vc1_4mv_block_pattern_vlc[4];
89#define VC1_TTBLK_VLC_BITS 5
90VLC ff_vc1_ttblk_vlc[3];
91#define VC1_SUBBLKPAT_VLC_BITS 6
92VLC ff_vc1_subblkpat_vlc[3];
93
94VLC 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 */
100const 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 */
111const 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
122const 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};
131const 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
142const 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... */
162const uint8_t ff_vc1_imode_codes[7] = {
163  0, 2, 1, 3, 1, 2, 3
164};
165const uint8_t ff_vc1_imode_bits[7] = {
166  4, 2, 3, 2, 4, 3, 3
167};
168
169/* Normal-2 imode */
170const uint8_t ff_vc1_norm2_codes[4] = {
171  0, 4, 5, 3
172};
173const uint8_t ff_vc1_norm2_bits[4] = {
174  1, 3, 3, 2
175};
176
177const uint16_t ff_vc1_norm6_codes[64] = {
1780x001, 0x002, 0x003, 0x000, 0x004, 0x001, 0x002, 0x047, 0x005, 0x003, 0x004, 0x04B, 0x005, 0x04D, 0x04E, 0x30E,
1790x006, 0x006, 0x007, 0x053, 0x008, 0x055, 0x056, 0x30D, 0x009, 0x059, 0x05A, 0x30C, 0x05C, 0x30B, 0x30A, 0x037,
1800x007, 0x00A, 0x00B, 0x043, 0x00C, 0x045, 0x046, 0x309, 0x00D, 0x049, 0x04A, 0x308, 0x04C, 0x307, 0x306, 0x036,
1810x00E, 0x051, 0x052, 0x305, 0x054, 0x304, 0x303, 0x035, 0x058, 0x302, 0x301, 0x034, 0x300, 0x033, 0x032, 0x007,
182};
183
184const 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 */
192const 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 */
261const 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};
267const 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
274const 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?
280const 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
307const 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
334const 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};
360const 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                               */
396const 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
426const 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 */
457const 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};
462const 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 */
469const 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};
474const 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 */
481const 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};
531const 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 */
566const 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
574const 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
582const 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
594const 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
606const 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
614const 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
626const 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 */
636const int32_t ff_vc1_dqscale[63] = {
6370x40000, 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};
646