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