libavcodec/vc1data.c
Go to the documentation of this file.
00001 /*
00002  * VC-1 and WMV3 decoder
00003  * copyright (c) 2011 Mashiat Sarker Shakkhar
00004  * copyright (c) 2006 Konstantin Shishkov
00005  * (c) 2005 anonymous, Alex Beregszaszi, Michael Niedermayer
00006  *
00007  * This file is part of FFmpeg.
00008  *
00009  * FFmpeg is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 2.1 of the License, or (at your option) any later version.
00013  *
00014  * FFmpeg is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with FFmpeg; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00022  */
00023 
00029 #include "avcodec.h"
00030 #include "vc1.h"
00031 #include "vc1data.h"
00032 
00034 const int ff_vc1_ttblk_to_tt[3][8] = {
00035     { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
00036     { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
00037     { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
00038 };
00039 
00040 const int ff_vc1_ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
00041 
00043 const uint8_t ff_vc1_mv_pmode_table[2][5] = {
00044     { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
00045     { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
00046 };
00047 const uint8_t ff_vc1_mv_pmode_table2[2][4] = {
00048     { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
00049     { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
00050 };
00051 
00052 /* MBMODE table for interlaced frame P-picture */
00053 const uint8_t ff_vc1_mbmode_intfrp[2][15][4] = {
00054     { /* 1: 4-MV, 0: non-4-MV */
00055         /* Type, FIELDTX, 1-MV Differential present, Residuals (CBP) present */
00056         /* Table 164 - Table 167 */
00057         { MV_PMODE_INTFR_1MV      , 0, 1, 1 },
00058         { MV_PMODE_INTFR_1MV      , 1, 1, 1 },
00059         { MV_PMODE_INTFR_1MV      , 0, 1, 0 },
00060         { MV_PMODE_INTFR_1MV      , 0, 0, 1 },
00061         { MV_PMODE_INTFR_1MV      , 1, 0, 1 },
00062         { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 },
00063         { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 },
00064         { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 0 },
00065         { MV_PMODE_INTFR_INTRA    , 0, 0, 0 }
00066     },
00067     {
00068         /* Table 160 - Table 163 */
00069         { MV_PMODE_INTFR_1MV      , 0, 1, 1 },
00070         { MV_PMODE_INTFR_1MV      , 1, 1, 1 },
00071         { MV_PMODE_INTFR_1MV      , 0, 1, 0 },
00072         { MV_PMODE_INTFR_1MV      , 0, 0, 1 },
00073         { MV_PMODE_INTFR_1MV      , 1, 0, 1 },
00074         { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 1 },
00075         { MV_PMODE_INTFR_2MV_FIELD, 1, 0, 1 },
00076         { MV_PMODE_INTFR_2MV_FIELD, 0, 0, 0 },
00077         { MV_PMODE_INTFR_4MV      , 0, 0, 1 },
00078         { MV_PMODE_INTFR_4MV      , 1, 0, 1 },
00079         { MV_PMODE_INTFR_4MV      , 0, 0, 0 },
00080         { MV_PMODE_INTFR_4MV_FIELD, 0, 0, 1 },
00081         { MV_PMODE_INTFR_4MV_FIELD, 1, 0, 1 },
00082         { MV_PMODE_INTFR_4MV_FIELD, 0, 0, 0 },
00083         { MV_PMODE_INTFR_INTRA    , 0, 0, 0 }
00084     }
00085 };
00086 
00087 const int ff_vc1_fps_nr[7] = { 24, 25, 30, 50, 60, 48, 72 },
00088           ff_vc1_fps_dr[2] = { 1000, 1001 };
00089 const uint8_t ff_vc1_pquant_table[3][32] = {
00090     /* Implicit quantizer */
00091     {  0,  1,  2,  3,  4,  5,  6,  7,  8,  6,  7,  8,  9, 10, 11, 12,
00092       13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31 },
00093     /* Explicit quantizer, pquantizer uniform */
00094     {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
00095       16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 },
00096     /* Explicit quantizer, pquantizer non-uniform */
00097     {  0,  1,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
00098       14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31 }
00099 };
00100 
00105 #define VC1_BFRACTION_VLC_BITS 7
00106 VLC ff_vc1_bfraction_vlc;
00107 #define VC1_IMODE_VLC_BITS 4
00108 VLC ff_vc1_imode_vlc;
00109 #define VC1_NORM2_VLC_BITS 3
00110 VLC ff_vc1_norm2_vlc;
00111 #define VC1_NORM6_VLC_BITS 9
00112 VLC ff_vc1_norm6_vlc;
00113 /* Could be optimized, one table only needs 8 bits */
00114 #define VC1_TTMB_VLC_BITS 9 //12
00115 VLC ff_vc1_ttmb_vlc[3];
00116 #define VC1_MV_DIFF_VLC_BITS 9 //15
00117 VLC ff_vc1_mv_diff_vlc[4];
00118 #define VC1_CBPCY_P_VLC_BITS 9 //14
00119 VLC ff_vc1_cbpcy_p_vlc[4];
00120 #define VC1_ICBPCY_VLC_BITS 9
00121 VLC ff_vc1_icbpcy_vlc[8];
00122 #define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
00123 VLC ff_vc1_4mv_block_pattern_vlc[4];
00124 #define VC1_2MV_BLOCK_PATTERN_VLC_BITS 3
00125 VLC ff_vc1_2mv_block_pattern_vlc[4];
00126 #define VC1_TTBLK_VLC_BITS 5
00127 VLC ff_vc1_ttblk_vlc[3];
00128 #define VC1_SUBBLKPAT_VLC_BITS 6
00129 VLC ff_vc1_subblkpat_vlc[3];
00130 #define VC1_INTFR_4MV_MBMODE_VLC_BITS 9
00131 VLC ff_vc1_intfr_4mv_mbmode_vlc[4];
00132 #define VC1_INTFR_NON4MV_MBMODE_VLC_BITS 6
00133 VLC ff_vc1_intfr_non4mv_mbmode_vlc[4];
00134 #define VC1_IF_MMV_MBMODE_VLC_BITS 5
00135 VLC ff_vc1_if_mmv_mbmode_vlc[8];
00136 #define VC1_IF_1MV_MBMODE_VLC_BITS 5
00137 VLC ff_vc1_if_1mv_mbmode_vlc[8];
00138 #define VC1_1REF_MVDATA_VLC_BITS 9
00139 VLC ff_vc1_1ref_mvdata_vlc[4];
00140 #define VC1_2REF_MVDATA_VLC_BITS 9
00141 VLC ff_vc1_2ref_mvdata_vlc[8];
00142 
00143 VLC ff_vc1_ac_coeff_table[8];
00144 
00145 #define VC1_IF_MBMODE_VLC_BITS 5    // as a placeholder for VC1_IF_MMV_MBMODE_VLC_BITS
00146                                     // or VC1_IF_1MV_MBMODE_VLC_BITS since they are the same
00148 
00149 
00150 #if B_FRACTION_DEN == 840 // original bfraction from vc9data.h, not conforming to standard
00151 /* bfraction is fractional, we scale to the GCD 3*5*7*8 = 840 */
00152 const int16_t ff_vc1_bfraction_lut[23] = {
00153     420 /*1/2*/, 280 /*1/3*/, 560 /*2/3*/, 210 /*1/4*/,
00154     630 /*3/4*/, 168 /*1/5*/, 336 /*2/5*/,
00155     504 /*3/5*/, 672 /*4/5*/, 140 /*1/6*/, 700 /*5/6*/,
00156     120 /*1/7*/, 240 /*2/7*/, 360 /*3/7*/, 480 /*4/7*/,
00157     600 /*5/7*/, 720 /*6/7*/, 105 /*1/8*/, 315 /*3/8*/,
00158     525 /*5/8*/, 735 /*7/8*/,
00159     -1 /*inv.*/, 0 /*BI fm*/
00160 };
00161 #else
00162 /* pre-computed scales for all bfractions and base=256 */
00163 const int16_t ff_vc1_bfraction_lut[23] = {
00164     128 /*1/2*/,  85 /*1/3*/, 170 /*2/3*/,  64 /*1/4*/,
00165     192 /*3/4*/,  51 /*1/5*/, 102 /*2/5*/,
00166     153 /*3/5*/, 204 /*4/5*/,  43 /*1/6*/, 215 /*5/6*/,
00167      37 /*1/7*/,  74 /*2/7*/, 111 /*3/7*/, 148 /*4/7*/,
00168     185 /*5/7*/, 222 /*6/7*/,  32 /*1/8*/,  96 /*3/8*/,
00169     160 /*5/8*/, 224 /*7/8*/,
00170     -1 /*inv.*/, 0 /*BI fm*/
00171 };
00172 #endif
00173 
00174 const uint8_t ff_vc1_bfraction_bits[23] = {
00175     3, 3, 3, 3,
00176     3, 3, 3,
00177     7, 7, 7, 7,
00178     7, 7, 7, 7,
00179     7, 7, 7, 7,
00180     7, 7,
00181     7, 7
00182 };
00183 const uint8_t ff_vc1_bfraction_codes[23] = {
00184       0,   1,   2,   3,
00185       4,   5,   6,
00186     112, 113, 114, 115,
00187     116, 117, 118, 119,
00188     120, 121, 122, 123,
00189     124, 125,
00190     126, 127
00191 };
00192 
00193 //Same as H.264
00194 const AVRational ff_vc1_pixel_aspect[16] = {
00195     {   0,  1 },
00196     {   1,  1 },
00197     {  12, 11 },
00198     {  10, 11 },
00199     {  16, 11 },
00200     {  40, 33 },
00201     {  24, 11 },
00202     {  20, 11 },
00203     {  32, 11 },
00204     {  80, 33 },
00205     {  18, 11 },
00206     {  15, 11 },
00207     {  64, 33 },
00208     { 160, 99 },
00209     {   0,  1 },
00210     {   0,  1 }
00211 };
00212 
00213 /* BitPlane IMODE - such a small table... */
00214 const uint8_t ff_vc1_imode_codes[7] = {
00215     0, 2, 1, 3, 1, 2, 3
00216 };
00217 const uint8_t ff_vc1_imode_bits[7] = {
00218     4, 2, 3, 2, 4, 3, 3
00219 };
00220 
00221 /* Normal-2 imode */
00222 const uint8_t ff_vc1_norm2_codes[4] = {
00223     0, 4, 5, 3
00224 };
00225 const uint8_t ff_vc1_norm2_bits[4] = {
00226     1, 3, 3, 2
00227 };
00228 
00229 const uint16_t ff_vc1_norm6_codes[64] = {
00230     0x001, 0x002, 0x003, 0x000, 0x004, 0x001, 0x002, 0x047, 0x005, 0x003, 0x004, 0x04B, 0x005, 0x04D, 0x04E, 0x30E,
00231     0x006, 0x006, 0x007, 0x053, 0x008, 0x055, 0x056, 0x30D, 0x009, 0x059, 0x05A, 0x30C, 0x05C, 0x30B, 0x30A, 0x037,
00232     0x007, 0x00A, 0x00B, 0x043, 0x00C, 0x045, 0x046, 0x309, 0x00D, 0x049, 0x04A, 0x308, 0x04C, 0x307, 0x306, 0x036,
00233     0x00E, 0x051, 0x052, 0x305, 0x054, 0x304, 0x303, 0x035, 0x058, 0x302, 0x301, 0x034, 0x300, 0x033, 0x032, 0x007,
00234 };
00235 
00236 const uint8_t ff_vc1_norm6_bits[64] = {
00237     1,  4,  4,  8,  4,  8,  8, 10,  4,  8,  8, 10,  8, 10, 10, 13,
00238     4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
00239     4,  8,  8, 10,  8, 10, 10, 13,  8, 10, 10, 13, 10, 13, 13,  9,
00240     8, 10, 10, 13, 10, 13, 13,  9, 10, 13, 13,  9, 13,  9,  9,  6,
00241 };
00242 
00243 /* 4MV Block pattern VLC tables */
00244 const uint8_t ff_vc1_4mv_block_pattern_codes[4][16] = {
00245     { 14, 58, 59, 25, 12, 26, 15, 15, 13, 24, 27,  0, 28,  1,  2,  2 },
00246     {  8, 18, 19,  4, 20,  5, 30, 11, 21, 31,  6, 12,  7, 13, 14,  0 },
00247     { 15,  6,  7,  2,  8,  3, 28,  9, 10, 29,  4, 11,  5, 12, 13,  0 },
00248     {  0, 11, 12,  4, 13,  5, 30, 16, 14, 31,  6, 17,  7, 18, 19, 10 }
00249 };
00250 const uint8_t ff_vc1_4mv_block_pattern_bits[4][16] = {
00251     { 5, 6, 6, 5, 5, 5, 5, 4, 5, 5, 5, 3, 5, 3, 3, 2 },
00252     { 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4, 4, 4, 4, 4, 2 },
00253     { 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3 },
00254     { 2, 4, 4, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4 }
00255 };
00256 
00257 /* 2MV Block pattern VLC tables */
00258 const uint8_t ff_vc1_2mv_block_pattern_codes[4][4] = {
00259     { 2, 1, 0, 3 }, { 1, 0, 2, 3 }, { 2, 0, 3, 1 }, { 1, 3, 2, 0 }
00260 };
00261 
00262 const uint8_t ff_vc1_2mv_block_pattern_bits[4][4] = {
00263     { 2, 2, 2, 2 }, { 1, 2, 3, 3 }, { 3, 2, 3, 1 }, { 1, 3, 3, 2 }
00264 };
00265 
00266 /* Interlaced frame picture 4MV MBMODE VLC tables (p. 246, p. 360) */
00267 const uint16_t ff_vc1_intfr_4mv_mbmode_codes[4][15] = {
00268     { 22,  17,  0, 47,  32, 10,  1,  3, 67,  133, 132,  92,  19,  93,   18 },
00269     {  3,  45,  0,  7,  23,  6,  1,  2, 10,   39,  44,   8,  18,  77,   76 },
00270     { 15,   6, 28,  9,  41,  6,  2, 15, 14,    8,  40,  29,   0,  21,   11 },
00271     {  7, 198,  1,  2, 193, 13, 25,  0, 97, 1599,  98, 398, 798, 192, 1598 }
00272 };
00273 
00274 const uint8_t ff_vc1_intfr_4mv_mbmode_bits[4][15] = {
00275     { 5, 5, 2, 6, 6, 4, 2, 2, 7,  8, 8,  7,  5, 7,  5 },
00276     { 3, 6, 3, 3, 5, 3, 3, 3, 4,  6, 6,  4,  5, 7,  7 },
00277     { 4, 3, 5, 5, 7, 4, 2, 5, 5,  5, 7,  5,  2, 6,  5 },
00278     { 4, 9, 1, 3, 9, 5, 6, 2, 8, 12, 8, 10, 11, 9, 12 }
00279 };
00280 
00281 /* Interlaced frame picture NON-4MV MBMODE VLC tables (p. 363) */
00282 const uint8_t ff_vc1_intfr_non4mv_mbmode_codes[4][9] = {
00283     {  9, 22,  0, 17, 16, 10,  1,  3, 23 },
00284     {  7,  0,  5,  2,  1,  1,  6,  3,  4 },
00285     {  1,  0, 10, 23, 44,  8,  3,  9, 45 },
00286     {  7, 97,  1,  2, 49, 13, 25,  0, 96 }
00287 };
00288 
00289 const uint8_t ff_vc1_intfr_non4mv_mbmode_bits[4][9] = {
00290     {  4,  5,  2,  5,  5,  4,  2,  2,  5 },
00291     {  3,  4,  6,  2,  3,  2,  3,  5,  6 },
00292     {  2,  2,  4,  5,  6,  4,  2,  4,  6 },
00293     {  4,  8,  1,  3,  7,  5,  6,  2,  8 }
00294 };
00295 
00296 /* Interlaced field picture MBMODE VLC tables (p. 356 - 11.4.1, 11.4.2) */
00297 /* mixed-MV */
00298 const uint8_t ff_vc1_if_mmv_mbmode_codes[8][8] = {
00299     { 16, 17,  3,  3,  0,  5,  9,  2 },
00300     {  8,  9,  3,  6,  7,  0,  5,  2 },
00301     { 16, 17,  5,  3,  0,  3,  9,  2 },
00302     { 56, 57, 15,  4,  5,  6, 29,  0 },
00303     { 52, 53, 27, 14, 15,  2, 12,  0 },
00304     { 56, 57, 29,  5,  6,  0, 15,  4 },
00305     { 16, 17,  6,  7,  0,  1,  9,  5 },
00306     { 56, 57,  0,  5,  6, 29,  4, 15 }
00307 };
00308 const uint8_t ff_vc1_if_mmv_mbmode_bits[8][8] = {
00309     { 6, 6, 2, 3, 2, 4, 5, 2 },
00310     { 5, 5, 3, 3, 3, 2, 4, 2 },
00311     { 6, 6, 4, 3, 2, 2, 5, 2 },
00312     { 6, 6, 4, 3, 3, 3, 5, 1 },
00313     { 6, 6, 5, 4, 4, 2, 4, 1 },
00314     { 6, 6, 5, 3, 3, 1, 4, 3 },
00315     { 5, 5, 3, 3, 2, 2, 4, 3 },
00316     { 6, 6, 1, 3, 3, 5, 3, 4 }
00317 };
00318 /* 1MV */
00319 const uint8_t ff_vc1_if_1mv_mbmode_codes[8][6] = {
00320     {  0,  1,  1,  1,  1,  1 },
00321     {  0,  1,  1,  1,  1,  1 },
00322     { 16, 17,  3,  0,  9,  5 },
00323     { 20, 21,  3, 11,  0,  4 },
00324     {  4,  5,  2,  3,  3,  0 },
00325     {  4,  5,  3,  2,  0,  3 },
00326     {  0,  1,  1,  1,  1,  1 },
00327     { 16, 17,  9,  5,  3,  0 }
00328 };
00329 const uint8_t ff_vc1_if_1mv_mbmode_bits[8][6] = {
00330     { 5, 5, 1, 3, 2, 4 },
00331     { 5, 5, 1, 2, 3, 4 },
00332     { 5, 5, 2, 1, 4, 3 },
00333     { 5, 5, 2, 4, 1, 3 },
00334     { 4, 4, 2, 3, 2, 2 },
00335     { 4, 4, 3, 2, 2, 2 },
00336     { 5, 5, 3, 4, 1, 2 },
00337     { 5, 5, 4, 3, 2, 1 }
00338 };
00339 
00340 /* Interlaced frame/field picture MVDATA VLC tables */
00341 
00342 /* 1-reference tables */
00343 const uint32_t ff_vc1_1ref_mvdata_codes[4][72] = { /* uint32_t may be too big */
00344   {
00345     0x00005, 0x0000C, 0x0001E, 0x00012, 0x0000C, 0x00034, 0x00075, 0x00070,
00346     0x00000, 0x00008, 0x0001B, 0x00008, 0x0001D, 0x0007C, 0x000D6, 0x001DE,
00347     0x001AF, 0x00005, 0x0001B, 0x00026, 0x0001E, 0x00012, 0x00076, 0x0004D,
00348     0x001F6, 0x001F4, 0x00039, 0x0007F, 0x00027, 0x0006A, 0x00071, 0x00035,
00349     0x00071, 0x00068, 0x001DC, 0x00027, 0x00073, 0x000FF, 0x000E8, 0x000E9,
00350     0x0007E, 0x001F9, 0x001F5, 0x001FD, 0x0003E, 0x001CA, 0x003F9, 0x0004C,
00351     0x00069, 0x001FA, 0x001DF, 0x001F7, 0x00070, 0x001DD, 0x00E4D, 0x00727,
00352     0x00392, 0x001C8, 0x001CB, 0x003F8, 0x001AE, 0x001F8, 0x001FB, 0x0E4CE,
00353     0x0E4CF, 0x07260, 0x07261, 0x07262, 0x07263, 0x07264, 0x07265, 0x07266
00354   },
00355   {
00356     0x00007, 0x00001, 0x00007, 0x00016, 0x00001, 0x00045, 0x00018, 0x002B6,
00357     0x00006, 0x00004, 0x00017, 0x00010, 0x00029, 0x0002C, 0x0015A, 0x00066,
00358     0x0019E, 0x00009, 0x00028, 0x00017, 0x00000, 0x0002A, 0x00004, 0x0005B,
00359     0x000B5, 0x000CE, 0x00006, 0x00044, 0x0000F, 0x00046, 0x0000E, 0x000AC,
00360     0x00032, 0x00037, 0x011EB, 0x0000A, 0x0001A, 0x0011F, 0x00016, 0x00014,
00361     0x0002B, 0x00168, 0x00055, 0x023D5, 0x00057, 0x0002F, 0x00036, 0x0002E,
00362     0x00169, 0x00054, 0x0047B, 0x0019F, 0x02B7D, 0x0008E, 0x00ADE, 0x00479,
00363     0x0056E, 0x008F4, 0x015BF, 0x00478, 0x023D4, 0x0ADF1, 0x056F9, 0xADF0E,
00364     0xADF0F, 0x56F80, 0x56F81, 0x56F82, 0x56F83, 0x56F84, 0x56F85, 0x56F86
00365   },
00366   {
00367     0x00002, 0x00006, 0x00007, 0x0000D, 0x00007, 0x00030, 0x000FF, 0x001F0,
00368     0x00002, 0x00000, 0x00005, 0x00019, 0x0001E, 0x00007, 0x00063, 0x000FD,
00369     0x00023, 0x0000E, 0x0001B, 0x0001A, 0x00006, 0x00009, 0x00018, 0x000C5,
00370     0x00033, 0x001F1, 0x00002, 0x003FB, 0x001F3, 0x00022, 0x001FC, 0x00042,
00371     0x00623, 0x00083, 0x00620, 0x0007D, 0x00040, 0x00043, 0x003E4, 0x003E5,
00372     0x00191, 0x00FE9, 0x00105, 0x00208, 0x000FC, 0x00624, 0x00622, 0x00190,
00373     0x00626, 0x007F5, 0x00C4B, 0x01FD0, 0x0104D, 0x00065, 0x00C42, 0x000C9,
00374     0x00627, 0x00C43, 0x00C4A, 0x0104E, 0x01FD1, 0x0104F, 0x00412, 0x104CE,
00375     0x104CF, 0x08260, 0x08261, 0x08262, 0x08263, 0x08264, 0x08265, 0x08266
00376   },
00377   {
00378     0x0000D, 0x00001, 0x00004, 0x00000, 0x00017, 0x00005, 0x0007F, 0x0004D,
00379     0x00003, 0x00011, 0x0003E, 0x0003B, 0x00017, 0x00067, 0x0004A, 0x000C3,
00380     0x000F2, 0x0000A, 0x0002C, 0x00032, 0x0003D, 0x00015, 0x00028, 0x00093,
00381     0x000CC, 0x00096, 0x00003, 0x00075, 0x00020, 0x0002D, 0x00021, 0x00029,
00382     0x00090, 0x001D0, 0x001FB, 0x0001C, 0x0004C, 0x00060, 0x00009, 0x00008,
00383     0x0002D, 0x0009F, 0x001FA, 0x0013D, 0x00031, 0x000FC, 0x00058, 0x00092,
00384     0x000F0, 0x000F1, 0x000CD, 0x00185, 0x00165, 0x0004E, 0x00091, 0x000E9,
00385     0x00184, 0x001D1, 0x001E6, 0x00097, 0x001E7, 0x000B3, 0x0013C, 0x0164E,
00386     0x0164F, 0x00B20, 0x00B21, 0x00B22, 0x00B23, 0x00B24, 0x00B25, 0x00B26
00387   }
00388 };
00389 
00390 const uint8_t ff_vc1_1ref_mvdata_bits[4][72] = {
00391   {
00392      3,  4,  5,  5,  5,  6,  7,  7,  2,  4,  5,  5,  6,  7,  8,  9,  9,  4,
00393      6,  6,  6,  6,  7,  8,  9,  9,  6,  8,  7,  7,  7,  7,  8,  8,  9,  6,
00394      8,  8,  8,  8,  8,  9,  9,  9,  7, 10, 10,  8,  8,  9,  9,  9,  8,  9,
00395     13, 12, 11, 10, 10, 10,  9,  9,  9, 17, 17, 16, 16, 16, 16, 16, 16, 16
00396   },
00397   {
00398      3,  3,  4,  5,  5,  7,  8, 10,  3,  4,  5,  5,  6,  7,  9, 10, 12,  4,
00399      6,  6,  5,  6,  6,  8,  9, 11,  4,  7,  7,  7,  7,  8,  9,  9, 13,  5,
00400      8,  9,  8,  8,  9, 10, 10, 14,  7,  9,  9,  9, 10, 10, 11, 12, 14,  8,
00401     12, 11, 11, 12, 13, 11, 14, 16, 15, 20, 20, 19, 19, 19, 19, 19, 19, 19
00402   },
00403   {
00404      3,  4,  4,  4,  5,  6,  8,  9,  2,  4,  5,  5,  5,  6,  7,  8,  8,  4,
00405      7,  7,  6,  6,  7,  8,  8,  9,  5, 10,  9,  8,  9,  9, 11, 10, 11,  7,
00406      9,  9, 10, 10, 11, 12, 11, 12,  8, 11, 11, 11, 11, 11, 12, 13, 15,  9,
00407     12, 10, 11, 12, 12, 15, 13, 15, 13, 19, 19, 18, 18, 18, 18, 18, 18, 18
00408   },
00409   {
00410      4,  4,  4,  4,  5,  5,  7,  7,  3,  5,  6,  6,  6,  7,  7,  8,  8,  4,
00411      6,  6,  6,  6,  7,  8,  8,  8,  4,  7,  6,  6,  6,  7,  8,  9,  9,  5,
00412      7,  7,  6,  6,  7,  8,  9,  9,  6,  8,  8,  8,  8,  8,  8,  9, 10,  7,
00413      8,  8,  9,  9,  9,  8,  9,  9,  9, 14, 14, 13, 13, 13, 13, 13, 13, 13
00414   }
00415 };
00416 
00417 /* 2-reference tables */
00418 const uint32_t ff_vc1_2ref_mvdata_codes[8][126] = { /* table 132 - table 139 */
00419   {
00420     0x0000C, 0x0001C, 0x0000B, 0x00000, 0x0000E, 0x0002A, 0x00050, 0x00368,
00421     0x00002, 0x0001A, 0x00004, 0x0003A, 0x0001D, 0x0006C, 0x000EF, 0x001BC,
00422     0x0015F, 0x0000F, 0x00003, 0x0001C, 0x0000D, 0x0000B, 0x0003E, 0x000A7,
00423     0x00146, 0x00199, 0x00006, 0x0001F, 0x00004, 0x0003C, 0x00007, 0x001BE,
00424     0x0008B, 0x0002C, 0x007B3, 0x00005, 0x000DB, 0x00056, 0x000EC, 0x00052,
00425     0x001BD, 0x00078, 0x000CF, 0x00573, 0x00009, 0x00023, 0x000ED, 0x00018,
00426     0x00006, 0x00044, 0x000F5, 0x00079, 0x006D2, 0x0006E, 0x0002B, 0x0015D,
00427     0x00017, 0x0037F, 0x00144, 0x000CE, 0x00028, 0x000AB, 0x00010, 0x001B5,
00428     0x000F7, 0x000A6, 0x0007B, 0x00028, 0x001ED, 0x001E9, 0x006FD, 0x00004,
00429     0x000F5, 0x00029, 0x0028A, 0x0028B, 0x0028F, 0x00DF9, 0x00335, 0x01E85,
00430     0x000EE, 0x002BD, 0x0002B, 0x003D8, 0x003D1, 0x00198, 0x001E9, 0x0051D,
00431     0x000B4, 0x0003F, 0x00455, 0x0022B, 0x00229, 0x00451, 0x00578, 0x007B2,
00432     0x00570, 0x00155, 0x00032, 0x003D0, 0x00054, 0x006D3, 0x00571, 0x00454,
00433     0x00334, 0x01BF1, 0x000B7, 0x00029, 0x01E84, 0x0016C, 0x0019B, 0x01BF0,
00434     0x00579, 0x00F43, 0x000B5, 0x008A1, 0x0002A, 0x0016D, 0x008A0, 0x007A0,
00435     0x003D1, 0x00AE5, 0x00154, 0x00AE4, 0x00A39, 0x00A38
00436   },
00437   {
00438     0x00003, 0x00009, 0x00016, 0x00010, 0x000D7, 0x00335, 0x00574, 0x00555,
00439     0x00000, 0x0001D, 0x00009, 0x00017, 0x0002C, 0x000AD, 0x00374, 0x006B3,
00440     0x00577, 0x0000F, 0x00018, 0x0000A, 0x0002E, 0x00022, 0x0017C, 0x00E7B,
00441     0x01B89, 0x015D8, 0x00008, 0x00034, 0x0006D, 0x00023, 0x001C2, 0x00376,
00442     0x002D3, 0x01C4A, 0x0330A, 0x00014, 0x0006A, 0x00072, 0x0006C, 0x000E3,
00443     0x0019B, 0x0073F, 0x01CF0, 0x00B41, 0x00032, 0x000E6, 0x000E0, 0x000CF,
00444     0x000AB, 0x0019C, 0x002AB, 0x00E2B, 0x015D9, 0x0006F, 0x001C3, 0x000AF,
00445     0x000BF, 0x000AC, 0x0017D, 0x006E3, 0x00E29, 0x01984, 0x00054, 0x000B5,
00446     0x0017A, 0x001AD, 0x00199, 0x00178, 0x00358, 0x002D2, 0x01C4B, 0x0005B,
00447     0x002A8, 0x00331, 0x00388, 0x0038B, 0x00370, 0x00713, 0x00CC3, 0x01CF1,
00448     0x001B9, 0x005EF, 0x00738, 0x002F2, 0x0033B, 0x002B9, 0x006EB, 0x00570,
00449     0x00E24, 0x0039D, 0x005A2, 0x005A3, 0x00E7D, 0x005EE, 0x00739, 0x00554,
00450     0x00AA5, 0x00AA4, 0x00377, 0x01CF5, 0x00BCE, 0x00E79, 0x00660, 0x00674,
00451     0x006EA, 0x00E7C, 0x00D65, 0x002F6, 0x015DA, 0x01B88, 0x005A1, 0x01CF4,
00452     0x005E6, 0x00E28, 0x00575, 0x00D64, 0x00334, 0x0330B, 0x015DB, 0x00B40,
00453     0x00BCF, 0x00DC5, 0x00E2A, 0x00675, 0x00571, 0x00553
00454   },
00455   {
00456     0x00004, 0x00002, 0x00010, 0x00003, 0x00017, 0x00045, 0x0003E, 0x0007E,
00457     0x00003, 0x00002, 0x00028, 0x0001E, 0x00015, 0x00047, 0x00002, 0x0014D,
00458     0x00060, 0x0000B, 0x00026, 0x00024, 0x00014, 0x00032, 0x0006F, 0x000C3,
00459     0x00531, 0x006E5, 0x00015, 0x0003F, 0x0002D, 0x00001, 0x0013E, 0x000DD,
00460     0x000F6, 0x00305, 0x00331, 0x0000E, 0x00003, 0x00034, 0x00033, 0x0001A,
00461     0x0014A, 0x000C5, 0x000F4, 0x006E4, 0x00001, 0x0003C, 0x0007D, 0x0008D,
00462     0x0009D, 0x00031, 0x0006E, 0x00296, 0x000CD, 0x00025, 0x00149, 0x00032,
00463     0x00089, 0x00036, 0x00088, 0x0006F, 0x00003, 0x0031D, 0x0000E, 0x001AA,
00464     0x0027E, 0x00061, 0x0014E, 0x0014F, 0x00067, 0x000FF, 0x00183, 0x00036,
00465     0x00357, 0x000F5, 0x000C6, 0x000C2, 0x00299, 0x00119, 0x00231, 0x00350,
00466     0x0002C, 0x0018F, 0x00530, 0x00297, 0x00004, 0x001B8, 0x000C0, 0x0027A,
00467     0x00311, 0x0009C, 0x00621, 0x00199, 0x0031C, 0x000F7, 0x003E3, 0x00356,
00468     0x00189, 0x00005, 0x0006B, 0x008C2, 0x00330, 0x004FF, 0x004F0, 0x00351,
00469     0x004F2, 0x001F2, 0x00373, 0x00000, 0x00C41, 0x008C3, 0x009EC, 0x003E2,
00470     0x00304, 0x004F7, 0x004F1, 0x001F0, 0x00148, 0x00C40, 0x009ED, 0x008C0,
00471     0x008C1, 0x004F3, 0x004FE, 0x000FE, 0x001F3, 0x001A9
00472   },
00473   {
00474     0x00000, 0x00004, 0x0002F, 0x00052, 0x00010, 0x000AD, 0x0050B, 0x00190,
00475     0x00003, 0x00016, 0x00007, 0x0000D, 0x000BB, 0x00173, 0x000C9, 0x0050F,
00476     0x0172C, 0x00003, 0x00011, 0x00005, 0x00043, 0x00023, 0x0004B, 0x0032E,
00477     0x02E5B, 0x00482, 0x00009, 0x0002A, 0x00014, 0x0002A, 0x00108, 0x005CA,
00478     0x0065A, 0x02136, 0x02132, 0x0000B, 0x00013, 0x00041, 0x000B8, 0x00174,
00479     0x00100, 0x014DA, 0x0404E, 0x01437, 0x0002B, 0x00085, 0x000A7, 0x000A0,
00480     0x0014C, 0x0029A, 0x0032C, 0x02133, 0x0142A, 0x00051, 0x00284, 0x000AC,
00481     0x00102, 0x00045, 0x00044, 0x0081B, 0x0065E, 0x00CB7, 0x00018, 0x0050C,
00482     0x00212, 0x002E4, 0x00203, 0x00094, 0x00122, 0x0081A, 0x00655, 0x00033,
00483     0x002BA, 0x00246, 0x00242, 0x00A6E, 0x0040C, 0x00808, 0x02134, 0x0404F,
00484     0x00175, 0x00405, 0x00247, 0x0012A, 0x00A14, 0x002BB, 0x00191, 0x0084F,
00485     0x01438, 0x000AF, 0x00B97, 0x00483, 0x0143B, 0x0032B, 0x00243, 0x0142B,
00486     0x00958, 0x029BF, 0x00049, 0x00A6C, 0x014DB, 0x004AD, 0x014DE, 0x0084E,
00487     0x01434, 0x00257, 0x02E5A, 0x00207, 0x01435, 0x01439, 0x00CB6, 0x0143A,
00488     0x00194, 0x00654, 0x02135, 0x0537C, 0x0015C, 0x00240, 0x01012, 0x0537D,
00489     0x00959, 0x01098, 0x01436, 0x0065F, 0x02026, 0x02137
00490   },
00491   {
00492     0x00005, 0x00019, 0x00016, 0x00011, 0x0003E, 0x0005E, 0x000EF, 0x000E2,
00493     0x00000, 0x00039, 0x0002B, 0x00026, 0x00028, 0x00012, 0x000C2, 0x000ED,
00494     0x0011D, 0x0000D, 0x00031, 0x0002A, 0x00025, 0x00020, 0x0005C, 0x001ED,
00495     0x0024D, 0x00770, 0x00006, 0x0007A, 0x00060, 0x0004F, 0x00048, 0x00039,
00496     0x00186, 0x00213, 0x00EC6, 0x0000F, 0x00026, 0x0005F, 0x00075, 0x00070,
00497     0x00027, 0x001DB, 0x003C6, 0x0078F, 0x0003F, 0x000A6, 0x000F0, 0x0003A,
00498     0x00052, 0x0004E, 0x000E3, 0x001D9, 0x0030F, 0x00010, 0x001DD, 0x000A7,
00499     0x000F7, 0x00022, 0x00092, 0x003C4, 0x002EF, 0x00762, 0x00079, 0x0008F,
00500     0x001DA, 0x00087, 0x000E8, 0x000BA, 0x00176, 0x000EE, 0x003B0, 0x00085,
00501     0x00119, 0x0030E, 0x00108, 0x001D2, 0x0010C, 0x00773, 0x00424, 0x00434,
00502     0x00071, 0x005DD, 0x001C1, 0x003A7, 0x00127, 0x0008D, 0x0021B, 0x007B2,
00503     0x001DF, 0x003D8, 0x00764, 0x00EE4, 0x003B3, 0x0074D, 0x001D8, 0x005DC,
00504     0x0084A, 0x00499, 0x003C5, 0x01D8E, 0x00765, 0x00435, 0x00771, 0x001C2,
00505     0x00118, 0x003BC, 0x00381, 0x00387, 0x07B33, 0x01097, 0x01096, 0x01ECD,
00506     0x00E99, 0x00F1C, 0x00F1D, 0x00EE5, 0x0011C, 0x07B32, 0x03D98, 0x01D8F,
00507     0x00E98, 0x00F67, 0x003BD, 0x00380, 0x00498, 0x00386
00508   },
00509   {
00510     0x0000D, 0x00010, 0x0002E, 0x00039, 0x0000D, 0x00074, 0x000ED, 0x000B6,
00511     0x00001, 0x00002, 0x00000, 0x00030, 0x00029, 0x00070, 0x000F3, 0x0008C,
00512     0x00166, 0x00009, 0x00033, 0x00078, 0x00006, 0x000C4, 0x0000B, 0x00163,
00513     0x000CC, 0x005BE, 0x0001F, 0x0002F, 0x00064, 0x00018, 0x000C6, 0x0000A,
00514     0x00162, 0x002C0, 0x00EF3, 0x00007, 0x0000F, 0x000E3, 0x000CA, 0x000B2,
00515     0x0018F, 0x003AE, 0x0075F, 0x00C51, 0x00015, 0x00047, 0x000EE, 0x000E2,
00516     0x000EA, 0x00009, 0x0016A, 0x002C3, 0x0059D, 0x0003D, 0x00008, 0x001D9,
00517     0x00032, 0x0000E, 0x0016E, 0x0032C, 0x0065B, 0x0196B, 0x00002, 0x0000F,
00518     0x001D8, 0x0008D, 0x000B4, 0x001E4, 0x00067, 0x00317, 0x00794, 0x00022,
00519     0x003BE, 0x00315, 0x00034, 0x00037, 0x002DE, 0x0006C, 0x00EFE, 0x0066C,
00520     0x00028, 0x003CB, 0x003AC, 0x00035, 0x0016B, 0x003BD, 0x002C1, 0x0062C,
00521     0x01DFE, 0x0000E, 0x0059E, 0x005BF, 0x000DA, 0x00629, 0x00584, 0x00EB7,
00522     0x00B0A, 0x0066D, 0x0000C, 0x0077E, 0x0059C, 0x00778, 0x0075E, 0x0075A,
00523     0x0062D, 0x00337, 0x00334, 0x00197, 0x01E57, 0x01DE4, 0x0196A, 0x01E56,
00524     0x00C50, 0x00B3F, 0x01E54, 0x00B0B, 0x0018E, 0x001B6, 0x01E55, 0x00CB4,
00525     0x00B3E, 0x00EB6, 0x01DE5, 0x01DFF, 0x00335, 0x001B7
00526   },
00527   {
00528     0x00001, 0x0000B, 0x00019, 0x0006F, 0x0002A, 0x00075, 0x007EB, 0x00163,
00529     0x00001, 0x0000E, 0x0001A, 0x0003E, 0x0001C, 0x0002D, 0x00164, 0x007EC,
00530     0x00165, 0x00004, 0x00006, 0x00036, 0x0007F, 0x000AE, 0x00158, 0x0015C,
00531     0x0056D, 0xFD510, 0x00000, 0x00004, 0x0007B, 0x000F3, 0x0003B, 0x007ED,
00532     0x002B3, 0x002CC, 0x0056E, 0x00018, 0x0003E, 0x00017, 0x0001E, 0x000AF,
00533     0x003F7, 0x0056F, 0x002CD, 0xFD511, 0x00014, 0x000AD, 0x000AA, 0x00014,
00534     0x000A8, 0x00153, 0x000E8, 0x001FE, 0x00DCF, 0x00078, 0x001B8, 0x00152,
00535     0x000FE, 0x002B1, 0x0015D, 0x00160, 0xFD512, 0xFD513, 0x0007A, 0x002B0,
00536     0x001E5, 0x000E9, 0x000FC, 0x006E6, 0x00DC8, 0x00584, 0xFD514, 0x000AB,
00537     0x00DDE, 0x00159, 0x003F4, 0x00DC9, 0x00DCA, 0x001FA, 0xFD515, 0xFD516,
00538     0x000FC, 0x001FF, 0x001E4, 0x000AF, 0x0015A, 0x00167, 0x00DCB, 0x00585,
00539     0xFD517, 0x003F7, 0x03F55, 0xFD518, 0x00DDC, 0x00586, 0x03F56, 0xFD519,
00540     0x03F57, 0xFD51A, 0x001BA, 0x00587, 0x00588, 0x00DDF, 0x002B2, 0xFD51B,
00541     0x00DCE, 0x003F6, 0xFD51C, 0x00FD4, 0xFD51D, 0xFD51E, 0xFD51F, 0x7EA80,
00542     0x7EA81, 0x0056C, 0x7EA82, 0x7EA83, 0x00376, 0x00589, 0x0058A, 0x7EA84,
00543     0x7EA85, 0x00DDD, 0x7EA86, 0x7EA87, 0x0058B, 0x07EA9
00544   },
00545   {
00546     0x00003, 0x0000E, 0x0000F, 0x0007E, 0x00062, 0x000C6, 0x00CD9, 0x0063E,
00547     0x00002, 0x00002, 0x00000, 0x00018, 0x0000C, 0x00069, 0x00039, 0x00707,
00548     0x00C7E, 0x00002, 0x0000D, 0x0001B, 0x0000F, 0x0019A, 0x00647, 0x01A37,
00549     0x346C4, 0x0346D, 0x00001, 0x0001E, 0x0007F, 0x0000A, 0x000E1, 0x00661,
00550     0x00CE4, 0x346C5, 0x346C6, 0x0001D, 0x00030, 0x0000D, 0x000CB, 0x00199,
00551     0x00320, 0x0008E, 0x0652E, 0x346C7, 0x0003E, 0x00039, 0x00035, 0x00033,
00552     0x0019F, 0x001C0, 0x00CDA, 0x346C8, 0x346C9, 0x0000B, 0x000D0, 0x0019E,
00553     0x00022, 0x00038, 0x0018E, 0x0031E, 0x03294, 0x0023C, 0x00032, 0x00012,
00554     0x00013, 0x00071, 0x0019D, 0x00020, 0x00C87, 0x00CC0, 0x346CA, 0x00338,
00555     0x00653, 0x001A2, 0x0032A, 0x00322, 0x00CE7, 0x00084, 0x0011F, 0x346CB,
00556     0x00325, 0x00649, 0x0032B, 0x00077, 0x00648, 0x00642, 0x00C86, 0x00C8C,
00557     0x346CC, 0x0003A, 0x019B7, 0x00043, 0x00327, 0x0008C, 0x0008D, 0x00C8D,
00558     0x346CD, 0x346CE, 0x00337, 0x00CE5, 0x00085, 0x00326, 0x00347, 0x00CA4,
00559     0x00C7F, 0x00D1A, 0x346CF, 0x00328, 0x1A360, 0x1A361, 0x00CD8, 0x0068C,
00560     0x03295, 0x03296, 0x0652F, 0x066D8, 0x00331, 0x00706, 0x0023D, 0x00076,
00561     0x00CC1, 0x00382, 0x00CE6, 0x066D9, 0x066DA, 0x066DB
00562   }
00563 };
00564 
00565 const uint8_t ff_vc1_2ref_mvdata_bits[8][126] = {
00566   {
00567      4,  5,  5,  5,  6,  7,  8, 10,  2,  5,  5,  6,  6,  7,  8,  9,
00568     10,  4,  5,  6,  6,  7,  8,  9, 10, 11,  4,  6,  6,  7,  7,  9,
00569      9, 10, 12,  5,  8,  8,  8,  8,  9,  9, 10, 12,  5,  7,  8,  7,
00570      7,  8,  9,  9, 11,  7,  9, 10,  9, 10, 10, 10, 10, 12,  6,  9,
00571      9,  9,  9,  9, 10, 10, 11,  7, 10, 10, 11, 11, 11, 12, 12, 14,
00572      8, 11, 10, 11, 11, 11, 11, 12, 12,  8, 12, 11, 11, 12, 12, 12,
00573     12, 13,  8, 12, 11, 11, 12, 12, 12, 13, 12,  9, 14, 13, 11, 13,
00574     12, 13, 12, 13,  9, 13, 13, 12, 12, 13, 13, 13, 13, 13
00575   },
00576   {
00577      3,  4,  5,  6,  8, 10, 11, 11,  2,  5,  5,  6,  7,  8, 10, 11,
00578     11,  4,  5,  5,  6,  7,  9, 12, 13, 13,  4,  6,  7,  7,  9, 10,
00579     11, 13, 14,  5,  7,  7,  7,  8,  9, 11, 13, 13,  6,  8,  8,  8,
00580      8,  9, 10, 12, 13,  7,  9,  8,  8,  8,  9, 11, 12, 13,  7,  9,
00581      9,  9,  9,  9, 10, 11, 13,  8, 10, 10, 10, 10, 10, 11, 12, 13,
00582      9, 11, 11, 10, 10, 10, 11, 11, 12, 10, 12, 12, 12, 11, 11, 11,
00583     12, 12, 10, 13, 12, 12, 11, 11, 11, 12, 12, 10, 13, 13, 12, 13,
00584     11, 12, 11, 12, 10, 14, 13, 13, 12, 12, 12, 11, 11, 11
00585   },
00586   {
00587      4,  4,  5,  5,  6,  7,  8,  9,  2,  5,  6,  6,  6,  7,  7,  9,
00588      9,  4,  6,  6,  6,  7,  8,  9, 11, 12,  5,  7,  7,  7,  9,  9,
00589     10, 11, 12,  5,  7,  7,  7,  7,  9,  9, 10, 12,  5,  8,  8,  8,
00590      8,  8,  9, 10, 10,  6,  9,  8,  8,  8,  8,  9,  9, 11,  6, 10,
00591     10,  9,  9,  9,  9, 10, 10,  7, 11, 10,  9,  9, 10,  9, 10, 11,
00592      7, 10, 11, 10, 10, 10,  9, 10, 11,  8, 12, 11, 11, 10, 11, 11,
00593     10, 10,  8, 12, 12, 11, 11, 11, 11, 10, 11,  8, 13, 12, 12, 11,
00594     11, 11, 11, 10,  9, 13, 12, 12, 12, 11, 11, 10, 10, 10
00595   },
00596   {
00597      3,  4,  6,  7,  7,  9, 11, 11,  2,  5,  5,  6,  8,  9, 10, 11,
00598     13,  3,  5,  5,  7,  8,  9, 12, 14, 13,  4,  6,  6,  7,  9, 11,
00599     13, 14, 14,  5,  7,  7,  8,  9,  9, 13, 15, 13,  6,  8,  8,  8,
00600      9, 10, 12, 14, 13,  7, 10,  9,  9,  9,  9, 12, 13, 14,  7, 11,
00601     10, 10, 10, 10, 11, 12, 13,  8, 11, 12, 12, 12, 11, 12, 14, 15,
00602      9, 11, 12, 11, 12, 11, 11, 12, 13,  9, 12, 13, 13, 12, 12, 13,
00603     14, 14,  9, 12, 13, 13, 13, 12, 13, 12, 14, 10, 13, 13, 14, 13,
00604     11, 13, 14, 15, 10, 12, 13, 15, 14, 13, 13, 13, 14, 14
00605   },
00606   {
00607      4,  5,  5,  5,  6,  7,  8,  8,  2,  6,  6,  6,  6,  6,  8,  9,
00608     10,  4,  6,  6,  6,  6,  7,  9, 10, 11,  4,  7,  7,  7,  7,  7,
00609      9, 10, 12,  5,  7,  7,  7,  7,  7,  9, 10, 11,  6,  8,  8,  7,
00610      7,  7,  8,  9, 10,  6,  9,  8,  8,  7,  8, 10, 10, 11,  7,  9,
00611      9,  8,  8,  8,  9,  9, 10,  8, 10, 10,  9,  9,  9, 11, 11, 11,
00612      8, 11, 10, 10,  9,  9, 10, 11, 10, 10, 12, 12, 11, 11, 10, 11,
00613     12, 11, 10, 13, 12, 11, 11, 10, 10, 11, 11, 11, 15, 13, 13, 13,
00614     12, 12, 12, 12, 10, 15, 14, 13, 12, 12, 11, 11, 11, 11
00615   },
00616   {
00617      4,  5,  6,  6,  6,  7,  8,  8,  2,  4,  5,  6,  6,  7,  8,  8,
00618      9,  4,  6,  7,  7,  8,  8,  9, 10, 11,  5,  6,  7,  7,  8,  8,
00619      9, 10, 12,  5,  7,  8,  8,  8,  9, 10, 11, 12,  5,  7,  8,  8,
00620      8,  8,  9, 10, 11,  6,  8,  9,  8,  8,  9, 10, 11, 13,  5,  8,
00621      9,  8,  8,  9,  9, 10, 11,  6, 10, 10,  9,  9, 10, 10, 12, 13,
00622      6, 10, 10,  9,  9, 10, 10, 11, 13,  7, 11, 11, 11, 11, 11, 12,
00623     12, 13,  7, 11, 11, 11, 11, 11, 11, 12, 12,  9, 13, 13, 13, 13,
00624     12, 12, 13, 12,  9, 12, 13, 12, 12, 12, 13, 13, 12, 12
00625   },
00626   {
00627      3,  5,  6,  8,  9, 10, 12, 12,  1,  5,  6,  7,  8,  9, 12, 12,
00628     12,  4,  6,  7,  8,  9, 12, 12, 14, 21,  4,  6,  8,  9,  9, 12,
00629     13, 13, 14,  6,  9,  8,  8,  9, 13, 14, 13, 21,  6,  9,  9,  8,
00630      9, 10, 11, 12, 13,  8, 10, 10, 11, 11, 12, 12, 21, 21,  8, 11,
00631     10, 11, 11, 12, 13, 14, 21,  9, 13, 10, 11, 13, 13, 12, 21, 21,
00632      9, 12, 10, 11, 12, 12, 13, 14, 21, 11, 15, 21, 13, 14, 15, 21,
00633     15, 21, 10, 14, 14, 13, 13, 21, 13, 13, 21, 13, 21, 21, 21, 20,
00634     20, 14, 20, 20, 11, 14, 14, 20, 20, 13, 20, 20, 14, 16
00635   },
00636   {
00637      2,  5,  6,  8,  9, 10, 13, 13,  2,  4,  5,  6,  8,  9, 10, 13,
00638     14,  3,  5,  7,  8, 10, 12, 15, 20, 16,  4,  6,  8,  8, 10, 12,
00639     13, 20, 20,  7,  8,  8,  9, 10, 11, 12, 16, 20,  7,  8,  8,  8,
00640     10, 11, 13, 20, 20,  8, 10, 10, 10, 10, 11, 12, 15, 14,  8,  9,
00641      9,  9, 10, 10, 13, 13, 20, 11, 12, 11, 11, 11, 13, 12, 13, 20,
00642     11, 12, 11, 11, 12, 12, 13, 13, 20, 10, 14, 11, 11, 12, 12, 13,
00643     20, 20, 11, 13, 12, 11, 12, 13, 14, 14, 20, 11, 19, 19, 13, 13,
00644     15, 15, 16, 16, 11, 13, 14, 11, 13, 12, 13, 16, 16, 16
00645   }
00646 };
00647 
00648 const uint8_t wmv3_dc_scale_table[32] = {
00649      0,  2,  4,  8,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13,
00650     14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21
00651 };
00652 
00653 /* P-Picture CBPCY VLC tables */
00654 // Looks like original tables are not conforming to standard at all. Are they used for old WMV?
00655 const uint16_t ff_vc1_cbpcy_p_codes[4][64] = {
00656   {
00657       0,   6,  15,  13,  13,  11,   3,  13,   5,   8,  49,  10,  12, 114, 102, 119,
00658       1,  54,  96,   8,  10, 111,   5,  15,  12,  10,   2,  12,  13, 115,  53,  63,
00659       1,   7,   1,   7,  14,  12,   4,  14,   1,   9,  97,  11,   7,  58,  52,  62,
00660       4, 103,   1,   9,  11,  56, 101, 118,   4, 110, 100,  30,   2,   5,   4,   3
00661   },
00662   {
00663       0,   9,   1,  18,   5,  14, 237,  26,   3, 121,   3,  22,  13,  16,   6,  30,
00664       2,  10,   1,  20,  12, 241,   5,  28,  16,  12,   3,  24,  28, 124, 239, 247,
00665       1, 240,   1,  19,  18,  15,   4,  27,   1, 122,   2,  23,   1,  17,   7,  31,
00666       1,  11,   2,  21,  19, 246, 238,  29,  17,  13, 236,  25,  58,  63,   8, 125
00667   },
00668   {
00669       0, 201,  25, 231,   5, 221,   1,   3,   2, 414,   2, 241,  16, 225, 195, 492,
00670       2, 412,   1, 240,   7, 224,  98, 245,   1, 220,  96,   5,   9, 230, 101, 247,
00671       1, 102,   1, 415,  24,   3,   2, 244,   3,  54,   3, 484,  17, 114, 200, 493,
00672       3, 413,   1,   4,  13, 113,  99, 485,   4, 111, 194, 243,   5,  29,  26,  31
00673   },
00674   {
00675       0,  28,  12,  44,   3,  36,  20,  52,   2,  32,  16,  48,   8,  40,  24,  28,
00676       1,  30,  14,  46,   6,  38,  22,  54,   3,  34,  18,  50,  10,  42,  26,  30,
00677       1,  29,  13,  45,   5,  37,  21,  53,   2,  33,  17,  49,   9,  41,  25,  29,
00678       1,  31,  15,  47,   7,  39,  23,  55,   4,  35,  19,  51,  11,  43,  27,  31
00679    }
00680 };
00681 
00682 const uint8_t ff_vc1_cbpcy_p_bits[4][64] = {
00683   {
00684     13,  13,   7,  13,   7,  13,  13,  12,   6,  13,   7,  12,   6,   8,   8,   8,
00685      5,   7,   8,  12,   6,   8,  13,  12,   7,  13,  13,  12,   6,   8,   7,   7,
00686      6,  13,   8,  12,   7,  13,  13,  12,   7,  13,   8,  12,   5,   7,   7,   7,
00687      6,   8,  13,  12,   6,   7,   8,   8,   5,   8,   8,   6,   3,   3,   3,   2
00688   },
00689   {
00690     14,  13,   8,  13,   3,  13,   8,  13,   3,   7,   8,  13,   4,  13,  13,  13,
00691      3,  13,  13,  13,   4,   8,  13,  13,   5,  13,  13,  13,   5,   7,   8,   8,
00692      3,   8,  14,  13,   5,  13,  13,  13,   4,   7,  13,  13,   6,  13,  13,  13,
00693      5,  13,   8,  13,   5,   8,   8,  13,   5,  13,   8,  13,   6,   6,  13,   7
00694   },
00695   {
00696     13,   8,   6,   8,   4,   8,  13,  12,   4,   9,   8,   8,   5,   8,   8,   9,
00697      5,   9,  10,   8,   4,   8,   7,   8,   6,   8,   7,  13,   4,   8,   7,   8,
00698      5,   7,   8,   9,   6,  13,  13,   8,   4,   6,   8,   9,   5,   7,   8,   9,
00699      5,   9,   9,  13,   5,   7,   7,   9,   4,   7,   8,   8,   3,   5,   5,   5
00700   },
00701   {
00702      9,   9,   9,   9,   2,   9,   9,   9,   2,   9,   9,   9,   9,   9,   9,   8,
00703      3,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
00704      2,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8,
00705      9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   9,   8
00706   }
00707 };
00708 
00709 /* Interlaced CBPCY VLC tables (Table 124 - Table 131) */
00710 const uint16_t ff_vc1_icbpcy_p_codes[8][63] = {
00711   {
00712     0x2F1A, 0x2F1B, 0x178C, 0x0090, 0x02A8, 0x02A9, 0x0BC7, 0x0091,
00713     0x02AA, 0x02AB, 0x05E0, 0x004A, 0x0096, 0x0097, 0x00BD, 0x0092,
00714     0x02AC, 0x02AD, 0x05E1, 0x0098, 0x0132, 0x0133, 0x0179, 0x0134,
00715     0x026A, 0x026B, 0x02FC, 0x004E, 0x0040, 0x0041, 0x002B, 0x0093,
00716     0x02AE, 0x02AF, 0x05E2, 0x0136, 0x026E, 0x026F, 0x02FD, 0x009E,
00717     0x013E, 0x013F, 0x017F, 0x0050, 0x0042, 0x0043, 0x002C, 0x0051,
00718     0x00A4, 0x00A5, 0x00BE, 0x0053, 0x0044, 0x0045, 0x002D, 0x0054,
00719     0x0046, 0x0047, 0x002E, 0x0003, 0x0000, 0x0001, 0x0001
00720   },
00721   {
00722     0x0041, 0x0042, 0x0100, 0x0043, 0x0088, 0x0089, 0x0101, 0x0045,
00723     0x008C, 0x008D, 0x0102, 0x0010, 0x0022, 0x0023, 0x0024, 0x0047,
00724     0x0010, 0x0011, 0x0103, 0x0025, 0x0058, 0x0059, 0x005A, 0x005B,
00725     0x005A, 0x005B, 0x005C, 0x000C, 0x0030, 0x0031, 0x0019, 0x0009,
00726     0x0014, 0x0015, 0x002C, 0x005C, 0x005D, 0x005E, 0x005F, 0x0026,
00727     0x005D, 0x005E, 0x005F, 0x000D, 0x0034, 0x0035, 0x001B, 0x0014,
00728     0x0027, 0x002A, 0x002B, 0x000E, 0x0038, 0x0039, 0x001D, 0x000F,
00729     0x003C, 0x003D, 0x001F, 0x0005, 0x0009, 0x0000, 0x0003
00730   },
00731   {
00732     0x0032, 0x0033, 0x001A, 0x0026, 0x00E4, 0x00E5, 0x01E6, 0x0027,
00733     0x00E6, 0x00E7, 0x01E7, 0x000E, 0x0063, 0x006C, 0x0077, 0x0028,
00734     0x00E8, 0x00E9, 0x01E8, 0x007B, 0x00DA, 0x00DB, 0x00EC, 0x00F5,
00735     0x01B8, 0x01B9, 0x01DA, 0x0021, 0x004B, 0x0054, 0x002B, 0x0029,
00736     0x00EA, 0x00EB, 0x01E9, 0x004A, 0x01BA, 0x01BB, 0x01DB, 0x0020,
00737     0x00DE, 0x00DF, 0x00F2, 0x0022, 0x0055, 0x0058, 0x002D, 0x000F,
00738     0x0070, 0x0071, 0x0078, 0x0023, 0x0059, 0x005C, 0x002F, 0x0024,
00739     0x005D, 0x0062, 0x0030, 0x0002, 0x001F, 0x0006, 0x0000
00740   },
00741   {
00742     0x0028, 0x0029, 0x009D, 0x0000, 0x01EA, 0x01EB, 0x01EC, 0x0001,
00743     0x01ED, 0x01EE, 0x01EF, 0x0005, 0x00F0, 0x00F1, 0x003B, 0x0002,
00744     0x01F0, 0x01F1, 0x01F2, 0x003F, 0x015C, 0x015D, 0x0099, 0x0010,
00745     0x03D0, 0x03D1, 0x0130, 0x000F, 0x009E, 0x009F, 0x00FB, 0x0003,
00746     0x01F3, 0x01F4, 0x01F5, 0x0011, 0x03D2, 0x03D3, 0x0131, 0x0009,
00747     0x015E, 0x015F, 0x009C, 0x0010, 0x00A8, 0x00A9, 0x0038, 0x0006,
00748     0x00F2, 0x00F3, 0x004D, 0x0011, 0x00AA, 0x00AB, 0x0039, 0x0012,
00749     0x00AC, 0x00AD, 0x003A, 0x0006, 0x0016, 0x0017, 0x000E
00750   },
00751   {
00752     0x003C, 0x003D, 0x001F, 0x000A, 0x0061, 0x0062, 0x0002, 0x000B,
00753     0x0063, 0x0064, 0x0003, 0x0007, 0x0003, 0x0004, 0x000B, 0x000C,
00754     0x0065, 0x0066, 0x0004, 0x0012, 0x000A, 0x000B, 0x0014, 0x001B,
00755     0x0018, 0x0019, 0x0034, 0x002C, 0x0067, 0x0068, 0x0035, 0x000D,
00756     0x0069, 0x006C, 0x0005, 0x0060, 0x001A, 0x001B, 0x0035, 0x0013,
00757     0x000E, 0x000F, 0x0015, 0x002D, 0x006D, 0x006E, 0x0038, 0x0008,
00758     0x0008, 0x0009, 0x000C, 0x002E, 0x006F, 0x0072, 0x003A, 0x002F,
00759     0x0073, 0x0000, 0x003B, 0x0007, 0x0014, 0x0015, 0x0004
00760   },
00761   {
00762     0x0038, 0x0039, 0x009D, 0x000A, 0x0091, 0x0092, 0x0093, 0x000B,
00763     0x0094, 0x0095, 0x0096, 0x0003, 0x00EE, 0x00EF, 0x0036, 0x000C,
00764     0x0097, 0x0098, 0x0099, 0x0008, 0x01E4, 0x01E5, 0x006A, 0x0018,
00765     0x03CC, 0x03CD, 0x00D6, 0x000E, 0x009E, 0x009F, 0x00F5, 0x000D,
00766     0x009A, 0x009B, 0x009C, 0x0019, 0x03CE, 0x03CF, 0x00D7, 0x0009,
00767     0x01E8, 0x01E9, 0x0090, 0x000F, 0x00E8, 0x00E9, 0x00F6, 0x0005,
00768     0x00F0, 0x00F1, 0x0037, 0x0010, 0x00EA, 0x00EB, 0x00F7, 0x0011,
00769     0x00EC, 0x00ED, 0x0034, 0x0000, 0x003E, 0x003F, 0x0002
00770   },
00771   {
00772     0x003C, 0x003D, 0x01CF, 0x0000, 0x00BF, 0x00E0, 0x01FC, 0x0001,
00773     0x00E1, 0x00E2, 0x01FD, 0x0009, 0x01F1, 0x01F2, 0x01F3, 0x0002,
00774     0x00E3, 0x00E4, 0x01FE, 0x0011, 0x03EE, 0x03EF, 0x03F0, 0x0021,
00775     0x07E2, 0x07E3, 0x07E4, 0x0018, 0x03F7, 0x03FE, 0x03FF, 0x0003,
00776     0x00E5, 0x00E6, 0x0080, 0x002E, 0x07E5, 0x07E6, 0x07E7, 0x0016,
00777     0x03F4, 0x03F5, 0x03F6, 0x0019, 0x0102, 0x0103, 0x0104, 0x000A,
00778     0x01F4, 0x01F5, 0x01F6, 0x001A, 0x0105, 0x0106, 0x0107, 0x001B,
00779     0x0178, 0x0179, 0x01CE, 0x001D, 0x00BD, 0x00BE, 0x01F0
00780   },
00781   {
00782     0x0003, 0x0004, 0x01B6, 0x0004, 0x002E, 0x002F, 0x000E, 0x0005,
00783     0x0030, 0x0031, 0x000F, 0x0003, 0x000A, 0x000B, 0x0014, 0x0006,
00784     0x0032, 0x0033, 0x0010, 0x0005, 0x0030, 0x0031, 0x0032, 0x0009,
00785     0x0066, 0x0067, 0x0068, 0x001D, 0x01B7, 0x01B8, 0x01B9, 0x0007,
00786     0x0034, 0x0035, 0x0011, 0x0016, 0x0069, 0x006A, 0x006B, 0x000A,
00787     0x0036, 0x0037, 0x00D8, 0x001E, 0x01BA, 0x01BB, 0x01BC, 0x0004,
00788     0x0015, 0x0016, 0x0017, 0x001F, 0x01BD, 0x01BE, 0x01BF, 0x0000,
00789     0x0010, 0x0011, 0x0012, 0x001C, 0x00D9, 0x00DA, 0x0013
00790   }
00791 };
00792 
00793 const uint8_t ff_vc1_icbpcy_p_bits[8][63] = {
00794   {
00795     15, 15, 14,  9, 11, 11, 13,  9, 11, 11, 12,  8,  9,  9,  9,  9,
00796     11, 11, 12,  9, 10, 10, 10, 10, 11, 11, 11,  8,  8,  8,  7,  9,
00797     11, 11, 12, 10, 11, 11, 11,  9, 10, 10, 10,  8,  8,  8,  7,  8,
00798      9,  9,  9,  8,  8,  8,  7,  8,  8,  8,  7,  3,  3,  3,  1
00799   },
00800   {
00801      7,  7,  9,  7,  8,  8,  9,  7,  8,  8,  9,  6,  7,  7,  7,  7,
00802      7,  7,  9,  7,  8,  8,  8,  8,  9,  9,  9,  6,  7,  7,  6,  6,
00803      7,  7,  8,  8,  9,  9,  9,  7,  8,  8,  8,  6,  7,  7,  6,  6,
00804      7,  7,  7,  6,  7,  7,  6,  6,  7,  7,  6,  3,  4,  3,  2
00805   },
00806   {
00807      6,  6,  5,  6,  8,  8,  9,  6,  8,  8,  9,  5,  7,  7,  7,  6,
00808      8,  8,  9,  7,  8,  8,  8,  8,  9,  9,  9,  6,  7,  7,  6,  6,
00809      8,  8,  9,  7,  9,  9,  9,  6,  8,  8,  8,  6,  7,  7,  6,  5,
00810      7,  7,  7,  6,  7,  7,  6,  6,  7,  7,  6,  3,  5,  4,  2
00811   },
00812   {
00813      6,  6,  8,  4,  9,  9,  9,  4,  9,  9,  9,  4,  8,  8,  7,  4,
00814      9,  9,  9,  6,  9,  9,  8,  6, 10, 10,  9,  5,  8,  8,  8,  4,
00815      9,  9,  9,  6, 10, 10,  9,  5,  9,  9,  8,  5,  8,  8,  7,  4,
00816      8,  8,  7,  5,  8,  8,  7,  5,  8,  8,  7,  3,  5,  5,  4
00817   },
00818   {
00819      6,  6,  5,  5,  7,  7,  7,  5,  7,  7,  7,  5,  6,  6,  6,  5,
00820      7,  7,  7,  6,  7,  7,  7,  7,  8,  8,  8,  6,  7,  7,  6,  5,
00821      7,  7,  7,  7,  8,  8,  8,  6,  7,  7,  7,  6,  7,  7,  6,  5,
00822      6,  6,  6,  6,  7,  7,  6,  6,  7,  6,  6,  4,  5,  5,  3
00823   },
00824   {
00825      6,  6,  8,  4,  8,  8,  8,  4,  8,  8,  8,  4,  8,  8,  7,  4,
00826      8,  8,  8,  5,  9,  9,  8,  6, 10, 10,  9,  5,  8,  8,  8,  4,
00827      8,  8,  8,  6, 10, 10,  9,  5,  9,  9,  8,  5,  8,  8,  8,  4,
00828      8,  8,  7,  5,  8,  8,  8,  5,  8,  8,  7,  3,  6,  6,  4
00829   },
00830   {
00831      6,  6,  9,  3,  8,  8,  9,  3,  8,  8,  9,  4,  9,  9,  9,  3,
00832      8,  8,  9,  5, 10, 10, 10,  6, 11, 11, 11,  5, 10, 10, 10,  3,
00833      8,  8,  8,  6, 11, 11, 11,  5, 10, 10, 10,  5,  9,  9,  9,  4,
00834      9,  9,  9,  5,  9,  9,  9,  5,  9,  9,  9,  5,  8,  8,  9
00835   },
00836   {
00837      6,  6, 10,  3,  7,  7,  7,  3,  7,  7,  7,  4,  8,  8,  8,  3,
00838      7,  7,  7,  5,  9,  9,  9,  6, 10, 10, 10,  6, 10, 10, 10,  3,
00839      7,  7,  7,  6, 10, 10, 10,  5,  9,  9,  9,  6, 10, 10, 10,  4,
00840      8,  8,  8,  6, 10, 10, 10,  5,  9,  9,  9,  6,  9,  9,  9
00841   }
00842 };
00843 
00844 /* MacroBlock Transform Type: 7.1.3.11, p89
00845  * 8x8:B
00846  * 8x4:B:btm  8x4:B:top  8x4:B:both,
00847  * 4x8:B:right  4x8:B:left  4x8:B:both
00848  * 4x4:B  8x8:MB
00849  * 8x4:MB:btm  8x4:MB:top  8x4,MB,both
00850  * 4x8,MB,right  4x8,MB,left
00851  * 4x4,MB                               */
00852 const uint16_t ff_vc1_ttmb_codes[3][16] = {
00853   {
00854     0x0003,
00855     0x002E, 0x005F, 0x0000,
00856     0x0016, 0x0015, 0x0001,
00857     0x0004, 0x0014,
00858     0x02F1, 0x0179, 0x017B,
00859     0x0BC0, 0x0BC1, 0x05E1,
00860     0x017A
00861   },
00862   {
00863     0x0006,
00864     0x0006, 0x0003, 0x0007,
00865     0x000F, 0x000E, 0x0000,
00866     0x0002, 0x0002,
00867     0x0014, 0x0011, 0x000B,
00868     0x0009, 0x0021, 0x0015,
00869     0x0020
00870   },
00871   {
00872     0x0006,
00873     0x0000, 0x000E, 0x0005,
00874     0x0002, 0x0003, 0x0003,
00875     0x000F, 0x0002,
00876     0x0081, 0x0021, 0x0009,
00877     0x0101, 0x0041, 0x0011,
00878     0x0100
00879   }
00880 };
00881 
00882 const uint8_t ff_vc1_ttmb_bits[3][16] = {
00883   {
00884      2,
00885      6,  7,  2,
00886      5,  5,  2,
00887      3,  5,
00888     10,  9,  9,
00889     12, 12, 11,
00890      9
00891   },
00892   {
00893     3,
00894     4, 4, 4,
00895     4, 4, 3,
00896     3, 2,
00897     7, 7, 6,
00898     6, 8, 7,
00899     8
00900   },
00901   {
00902      3,
00903      3, 4, 5,
00904      3, 3, 4,
00905      4, 2,
00906     10, 8, 6,
00907     11, 9, 7,
00908     11
00909   }
00910 };
00911 
00912 /* TTBLK (Transform Type per Block) tables */
00913 const uint8_t ff_vc1_ttblk_codes[3][8] = {
00914     {  0,  1,  3,  5, 16, 17, 18, 19 },
00915     {  3,  0,  1,  2,  3,  5,  8,  9 },
00916     {  1,  0,  1,  4,  6,  7, 10, 11 }
00917 };
00918 const uint8_t ff_vc1_ttblk_bits[3][8] = {
00919     {  2,  2,  2,  3,  5,  5,  5,  5 },
00920     {  2,  3,  3,  3,  3,  3,  4,  4 },
00921     {  2,  3,  3,  3,  3,  3,  4,  4 }
00922 };
00923 
00924 /* SUBBLKPAT tables, p93-94, reordered */
00925 const uint8_t ff_vc1_subblkpat_codes[3][15] = {
00926     { 14, 12,  7, 11,  9, 26,  2, 10, 27,  8,  0,  6,  1, 15,  1 },
00927     { 14,  0,  8, 15, 10,  4, 23, 13,  5,  9, 25,  3, 24, 22,  1 },
00928     {  5,  6,  2,  2,  8,  0, 28,  3,  1,  3, 29,  1, 19, 18, 15 }
00929 };
00930 const uint8_t ff_vc1_subblkpat_bits[3][15] = {
00931     {  5,  5,  5,  5,  5,  6,  4,  5,  6,  5,  4,  5,  4,  5,  1},
00932     {  4,  3,  4,  4,  4,  5,  5,  4,  5,  4,  5,  4,  5,  5,  2},
00933     {  3,  3,  4,  3,  4,  5,  5,  3,  5,  4,  5,  4,  5,  5,  4}
00934 };
00935 
00936 /* MV differential tables, p265 */
00937 const uint16_t ff_vc1_mv_diff_codes[4][73] = {
00938   {
00939        0,    2,    3,    8,  576,    3,    2,    6,
00940        5,  577,  578,    7,    8,    9,   40,   19,
00941       37,   82,   21,   22,   23,  579,  580,  166,
00942       96,  167,   49,  194,  195,  581,  582,  583,
00943      292,  293,  294,   13,    2,    7,   24,   50,
00944      102,  295,   13,    7,    8,   18,   50,  103,
00945       38,   20,   21,   22,   39,  204,  103,   23,
00946       24,   25,  104,  410,  105,  106,  107,  108,
00947      109,  220,  411,  442,  222,  443,  446,  447,
00948        7 /* 73 elements */
00949   },
00950   {
00951        0,    4,    5,    3,    4,    3,    4,    5,
00952       20,    6,   21,   44,   45,   46, 3008,   95,
00953      112,  113,   57, 3009, 3010,  116,  117, 3011,
00954      118, 3012, 3013, 3014, 3015, 3016, 3017, 3018,
00955     3019, 3020, 3021, 3022,    1,    4,   15,  160,
00956      161,   41,    6,   11,   42,  162,   43,  119,
00957       56,   57,   58,  163,  236,  237, 3023,  119,
00958      120,  242,  122,  486, 1512,  487,  246,  494,
00959     1513,  495, 1514, 1515, 1516, 1517, 1518, 1519,
00960       31 /* 73 elements */
00961   },
00962   {
00963        0,  512,  513,  514,  515,    2,    3,  258,
00964      259,  260,  261,  262,  263,  264,  265,  266,
00965      267,  268,  269,  270,  271,  272,  273,  274,
00966      275,  276,  277,  278,  279,  280,  281,  282,
00967      283,  284,  285,  286,    1,    5,  287,  288,
00968      289,  290,    6,    7,  291,  292,  293,  294,
00969      295,  296,  297,  298,  299,  300,  301,  302,
00970      303,  304,  305,  306,  307,  308,  309,  310,
00971      311,  312,  313,  314,  315,  316,  317,  318,
00972      319 /* 73 elements */
00973   },
00974   {
00975        0,    1,    1,    2,    3,    4,    1,    5,
00976        4,    3,    5,    8,    6,    9,   10,   11,
00977       12,    7,  104,   14,  105,    4,   10,   15,
00978       11,    6,   14,    8,  106,  107,  108,   15,
00979      109,    9,   55,   10,    1,    2,    1,    2,
00980        3,   12,    6,    2,    6,    7,   28,    7,
00981       15,    8,    5,   18,   29,  152,   77,   24,
00982       25,   26,   39,  108,   13,  109,   55,   56,
00983       57,  116,   11,  153,  234,  235,  118,  119,
00984       15 /* 73 elements */
00985   }
00986 };
00987 const uint8_t ff_vc1_mv_diff_bits[4][73] = {
00988   {
00989      6,  7,  7,  8, 14,  6,  5,  6,  7, 14, 14,  6,  6,  6,  8,  9,
00990     10,  9,  7,  7,  7, 14, 14, 10,  9, 10,  8, 10, 10, 14, 14, 14,
00991     13, 13, 13,  6,  3,  5,  6,  8,  9, 13,  5,  4,  4,  5,  7,  9,
00992      6,  5,  5,  5,  6,  9,  8,  5,  5,  5,  7, 10,  7,  7,  7,  7,
00993      7,  8, 10,  9,  8,  9,  9,  9,  3 /* 73 elements */
00994   },
00995   {
00996      5,  7,  7,  6,  6,  5,  5,  6,  7,  5,  7,  8,  8,  8, 14,  9,
00997      9,  9,  8, 14, 14,  9,  9, 14,  9, 14, 14, 14, 14, 14, 14, 14,
00998     14, 14, 14, 14,  2,  3,  6,  8,  8,  6,  3,  4,  6,  8,  6,  9,
00999      6,  6,  6,  8,  8,  8, 14,  7,  7,  8,  7,  9, 13,  9,  8,  9,
01000     13,  9, 13, 13, 13, 13, 13, 13,  5 /* 73 elements */
01001 
01002   },
01003   {
01004      3, 12, 12, 12, 12,  3,  4, 11, 11, 11, 11, 11, 11, 11, 11, 11,
01005     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
01006     11, 11, 11, 11,  1,  5, 11, 11, 11, 11,  4,  4, 11, 11, 11, 11,
01007     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
01008     11, 11, 11, 11, 11, 11, 11, 11, 11 /* 73 elements */
01009   },
01010   {
01011     15, 11, 15, 15, 15, 15, 12, 15, 12, 11, 12, 12, 15, 12, 12, 12,
01012     12, 15, 15, 12, 15, 10, 11, 12, 11, 10, 11, 10, 15, 15, 15, 11,
01013     15, 10, 14, 10,  4,  4,  5,  7,  8,  9,  5,  3,  4,  5,  6,  8,
01014      5,  4,  3,  5,  6,  8,  7,  5,  5,  5,  6,  7,  9,  7,  6,  6,
01015      6,  7, 10,  8,  8,  8,  7,  7,  4 /* 73 elements */
01016   }
01017 };
01018 
01019 /* DC differentials low+hi-mo, p217 are the same as in msmpeg4data .h */
01020 
01021 /* Table 232 */
01022 const int8_t ff_vc1_simple_progressive_4x4_zz [16] = {
01023      0,     8,    16,     1,
01024      9,    24,    17,     2,
01025     10,    18,    25,     3,
01026     11,    26,    19,    27
01027 };
01028 
01029 const int8_t ff_vc1_adv_progressive_8x4_zz [32] = { /* Table 233 */
01030      0,     8,     1,    16,     2,     9,    10,     3,
01031     24,    17,     4,    11,    18,    12,     5,    19,
01032     25,    13,    20,    26,    27,     6,    21,    28,
01033     14,    22,    29,     7,    30,    15,    23,    31
01034 };
01035 
01036 const int8_t ff_vc1_adv_progressive_4x8_zz [32] = { /* Table 234 */
01037      0,     1,     8,     2,
01038      9,    16,    17,    24,
01039     10,    32,    25,    18,
01040     40,     3,    33,    26,
01041     48,    11,    56,    41,
01042     34,    49,    57,    42,
01043     19,    50,    27,    58,
01044     35,    43,    51,    59
01045 };
01046 
01047 const int8_t ff_vc1_adv_interlaced_8x8_zz [64] = { /* Table 235 */
01048      0,     8,     1,    16,    24,     9,     2,    32,
01049     40,    48,    56,    17,    10,     3,    25,    18,
01050     11,     4,    33,    41,    49,    57,    26,    34,
01051     42,    50,    58,    19,    12,     5,    27,    20,
01052     13,     6,    35,    28,    21,    14,     7,    15,
01053     22,    29,    36,    43,    51,    59,    60,    52,
01054     44,    37,    30,    23,    31,    38,    45,    53,
01055     61,    62,    54,    46,    39,    47,    55,    63
01056 };
01057 
01058 const int8_t ff_vc1_adv_interlaced_8x4_zz [32] = { /* Table 236 */
01059      0,     8,    16,    24,     1,     9,     2,    17,
01060     25,    10,     3,    18,    26,     4,    11,    19,
01061     12,     5,    13,    20,    27,     6,    21,    28,
01062     14,    22,    29,     7,    30,    15,    23,    31
01063 };
01064 
01065 const int8_t ff_vc1_adv_interlaced_4x8_zz [32] = { /* Table 237 */
01066      0,     1,     2,     8,
01067     16,     9,    24,    17,
01068     10,     3,    32,    40,
01069     48,    56,    25,    18,
01070     33,    26,    41,    34,
01071     49,    57,    11,    42,
01072     19,    50,    27,    58,
01073     35,    43,    51,    59
01074 };
01075 
01076 const int8_t ff_vc1_adv_interlaced_4x4_zz [16] = { /* Table 238 */
01077      0,     8,    16,    24,
01078      1,     9,    17,     2,
01079     25,    10,    18,     3,
01080     26,    11,    19,    27
01081 };
01082 
01083 
01084 /* DQScale as specified in 8.1.3.9 - almost identical to 0x40000/i */
01085 const int32_t ff_vc1_dqscale[63] = {
01086     0x40000, 0x20000, 0x15555, 0x10000, 0xCCCD, 0xAAAB, 0x9249, 0x8000,
01087      0x71C7,  0x6666,  0x5D17,  0x5555, 0x4EC5, 0x4925, 0x4444, 0x4000,
01088      0x3C3C,  0x38E4,  0x35E5,  0x3333, 0x30C3, 0x2E8C, 0x2C86, 0x2AAB,
01089      0x28F6,  0x2762,  0x25ED,  0x2492, 0x234F, 0x2222, 0x2108, 0x2000,
01090      0x1F08,  0x1E1E,  0x1D42,  0x1C72, 0x1BAD, 0x1AF3, 0x1A42, 0x199A,
01091      0x18FA,  0x1862,  0x17D0,  0x1746, 0x16C1, 0x1643, 0x15CA, 0x1555,
01092      0x14E6,  0x147B,  0x1414,  0x13B1, 0x1352, 0x12F7, 0x129E, 0x1249,
01093      0x11F7,  0x11A8,  0x115B,  0x1111, 0x10C9, 0x1084, 0x1000
01094 };
01095 
01096 /* P Interlaced field picture MV predictor scaling values (Table 114) */
01097 const uint16_t vc1_field_mvpred_scales[2][7][4] = {
01098 // Refdist:
01099 //      0       1       2       3 or greater
01100   { // current field is first
01101     { 128,    192,    213,    224 },   // SCALEOPP
01102     { 512,    341,    307,    293 },   // SCALESAME1
01103     { 219,    236,    242,    245 },   // SCALESAME2
01104     {  32,     48,     53,     56 },   // SCALEZONE1_X
01105     {   8,     12,     13,     14 },   // SCALEZONE1_Y
01106     {  37,     20,     14,     11 },   // ZONE1OFFSET_X
01107     {  10,      5,      4,      3 }    // ZONE1OFFSET_Y
01108   },
01109   { // current field is second
01110     { 128,     64,     43,     32 },   // SCALEOPP
01111     { 512,   1024,   1536,   2048 },   // SCALESAME1
01112     { 219,    204,    200,    198 },   // SCALESAME2
01113     {  32,     16,     11,      8 },   // SCALEZONE1_X
01114     {   8,      4,      3,      2 },   // SCALEZONE1_Y
01115     {  37,     52,     56,     58 },   // ZONE1OFFSET_X
01116     {  10,     13,     14,     15 }    // ZONE1OFFSET_Y
01117   }
01118 };
01119 
01120 /* B Interlaced field picture backward MV predictor scaling values for first field (Table 115) */
01121 const uint16_t vc1_b_field_mvpred_scales[7][4] = {
01122     // BRFD:
01123     //  0       1       2       3 or greater
01124     { 171,    205,    219,    228 },   // SCALESAME
01125     { 384,    320,    299,    288 },   // SCALEOPP1
01126     { 230,    239,    244,    246 },   // SCALEOPP2
01127     {  43,     51,     55,     57 },   // SCALEZONE1_X
01128     {  11,     13,     14,     14 },   // SCALEZONE1_Y
01129     {  26,     17,     12,     10 },   // ZONE1OFFSET_X
01130     {   7,      4,      3,      3 }    // ZONE1OFFSET_Y
01131 };