1/* 2 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) 3 * 4 * Copyright (c) 2009 Maxim Poliakovski 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 * This file contains functions and data shared by both Indeo4 and 26 * Indeo5 decoders. 27 */ 28 29#define ALT_BITSTREAM_READER_LE 30#include "avcodec.h" 31#include "get_bits.h" 32#include "ivi_common.h" 33#include "libavutil/common.h" 34#include "ivi_dsp.h" 35 36extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; ///< static macroblock huffman tables 37extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; ///< static block huffman tables 38 39VLC ff_ivi_mb_vlc_tabs [8]; 40VLC ff_ivi_blk_vlc_tabs[8]; 41 42/** 43 * Reverses "nbits" bits of the value "val" and returns the result 44 * in the least significant bits. 45 */ 46static uint16_t inv_bits(uint16_t val, int nbits) 47{ 48 uint16_t res; 49 50 if (nbits <= 8) { 51 res = av_reverse[val] >> (8-nbits); 52 } else 53 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits); 54 55 return res; 56} 57 58int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag) 59{ 60 int pos, i, j, codes_per_row, prefix, not_last_row; 61 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */ 62 uint8_t bits[256]; 63 64 pos = 0; /* current position = 0 */ 65 66 for (i = 0; i < cb->num_rows; i++) { 67 codes_per_row = 1 << cb->xbits[i]; 68 not_last_row = (i != cb->num_rows - 1); 69 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row); 70 71 for (j = 0; j < codes_per_row; j++) { 72 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */ 73 break; /* elements, but only 256 codes are allowed! */ 74 75 bits[pos] = i + cb->xbits[i] + not_last_row; 76 if (bits[pos] > IVI_VLC_BITS) 77 return -1; /* invalid descriptor */ 78 79 codewords[pos] = inv_bits((prefix | j), bits[pos]); 80 if (!bits[pos]) 81 bits[pos] = 1; 82 83 pos++; 84 }//for j 85 }//for i 86 87 /* number of codewords = pos */ 88 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2, 89 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE); 90} 91 92void ff_ivi_init_static_vlc(void) 93{ 94 int i; 95 static VLC_TYPE table_data[8192 * 16][2]; 96 static int initialized_vlcs = 0; 97 98 if (initialized_vlcs) 99 return; 100 for (i = 0; i < 8; i++) { 101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192; 102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192; 103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1); 104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192; 105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192; 106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1); 107 } 108 initialized_vlcs = 1; 109} 110 111int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, 112 IVIHuffTab *huff_tab, AVCodecContext *avctx) 113{ 114 int i, result; 115 IVIHuffDesc new_huff; 116 117 if (!desc_coded) { 118 /* select default table */ 119 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7] 120 : &ff_ivi_mb_vlc_tabs [7]; 121 } else { 122 huff_tab->tab_sel = get_bits(gb, 3); 123 if (huff_tab->tab_sel == 7) { 124 /* custom huffman table (explicitly encoded) */ 125 new_huff.num_rows = get_bits(gb, 4); 126 127 for (i = 0; i < new_huff.num_rows; i++) 128 new_huff.xbits[i] = get_bits(gb, 4); 129 130 /* Have we got the same custom table? Rebuild if not. */ 131 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) { 132 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff); 133 134 if (huff_tab->cust_tab.table) 135 free_vlc(&huff_tab->cust_tab); 136 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc, 137 &huff_tab->cust_tab, 0); 138 if (result) { 139 av_log(avctx, AV_LOG_ERROR, 140 "Error while initializing custom vlc table!\n"); 141 return -1; 142 } 143 } 144 huff_tab->tab = &huff_tab->cust_tab; 145 } else { 146 /* select one of predefined tables */ 147 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel] 148 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel]; 149 } 150 } 151 152 return 0; 153} 154 155int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2) 156{ 157 return desc1->num_rows != desc2->num_rows 158 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows); 159} 160 161void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src) 162{ 163 dst->num_rows = src->num_rows; 164 memcpy(dst->xbits, src->xbits, src->num_rows); 165} 166 167int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg) 168{ 169 int p, b; 170 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size; 171 IVIBandDesc *band; 172 173 ff_ivi_free_buffers(planes); 174 175 /* fill in the descriptor of the luminance plane */ 176 planes[0].width = cfg->pic_width; 177 planes[0].height = cfg->pic_height; 178 planes[0].num_bands = cfg->luma_bands; 179 180 /* fill in the descriptors of the chrominance planes */ 181 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2; 182 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2; 183 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands; 184 185 for (p = 0; p < 3; p++) { 186 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc)); 187 if (!planes[p].bands) 188 return AVERROR(ENOMEM); 189 190 /* select band dimensions: if there is only one band then it 191 * has the full size, if there are several bands each of them 192 * has only half size */ 193 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1; 194 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1; 195 196 /* luma band buffers will be aligned on 16x16 (max macroblock size) */ 197 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */ 198 align_fac = p ? 8 : 16; 199 width_aligned = FFALIGN(b_width , align_fac); 200 height_aligned = FFALIGN(b_height, align_fac); 201 buf_size = width_aligned * height_aligned * sizeof(int16_t); 202 203 for (b = 0; b < planes[p].num_bands; b++) { 204 band = &planes[p].bands[b]; /* select appropriate plane/band */ 205 band->plane = p; 206 band->band_num = b; 207 band->width = b_width; 208 band->height = b_height; 209 band->pitch = width_aligned; 210 band->bufs[0] = av_malloc(buf_size); 211 band->bufs[1] = av_malloc(buf_size); 212 if (!band->bufs[0] || !band->bufs[1]) 213 return AVERROR(ENOMEM); 214 215 /* allocate the 3rd band buffer for scalability mode */ 216 if (cfg->luma_bands > 1) { 217 band->bufs[2] = av_malloc(buf_size); 218 if (!band->bufs[2]) 219 return AVERROR(ENOMEM); 220 } 221 222 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */ 223 } 224 } 225 226 return 0; 227} 228 229void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes) 230{ 231 int p, b, t; 232 233 for (p = 0; p < 3; p++) { 234 for (b = 0; b < planes[p].num_bands; b++) { 235 av_freep(&planes[p].bands[b].bufs[0]); 236 av_freep(&planes[p].bands[b].bufs[1]); 237 av_freep(&planes[p].bands[b].bufs[2]); 238 239 if (planes[p].bands[b].blk_vlc.cust_tab.table) 240 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab); 241 for (t = 0; t < planes[p].bands[b].num_tiles; t++) 242 av_freep(&planes[p].bands[b].tiles[t].mbs); 243 av_freep(&planes[p].bands[b].tiles); 244 } 245 av_freep(&planes[p].bands); 246 } 247} 248 249int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height) 250{ 251 int p, b, x, y, x_tiles, y_tiles, t_width, t_height; 252 IVIBandDesc *band; 253 IVITile *tile, *ref_tile; 254 255 for (p = 0; p < 3; p++) { 256 t_width = !p ? tile_width : (tile_width + 3) >> 2; 257 t_height = !p ? tile_height : (tile_height + 3) >> 2; 258 259 if (!p && planes[0].num_bands == 4) { 260 t_width >>= 1; 261 t_height >>= 1; 262 } 263 264 for (b = 0; b < planes[p].num_bands; b++) { 265 band = &planes[p].bands[b]; 266 x_tiles = IVI_NUM_TILES(band->width, t_width); 267 y_tiles = IVI_NUM_TILES(band->height, t_height); 268 band->num_tiles = x_tiles * y_tiles; 269 270 av_freep(&band->tiles); 271 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile)); 272 if (!band->tiles) 273 return AVERROR(ENOMEM); 274 275 tile = band->tiles; 276 277 /* use the first luma band as reference for motion vectors 278 * and quant */ 279 ref_tile = planes[0].bands[0].tiles; 280 281 for (y = 0; y < band->height; y += t_height) { 282 for (x = 0; x < band->width; x += t_width) { 283 tile->xpos = x; 284 tile->ypos = y; 285 tile->width = FFMIN(band->width - x, t_width); 286 tile->height = FFMIN(band->height - y, t_height); 287 tile->is_empty = tile->data_size = 0; 288 /* calculate number of macroblocks */ 289 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height, 290 band->mb_size); 291 292 av_freep(&tile->mbs); 293 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo)); 294 if (!tile->mbs) 295 return AVERROR(ENOMEM); 296 297 tile->ref_mbs = 0; 298 if (p || b) { 299 tile->ref_mbs = ref_tile->mbs; 300 ref_tile++; 301 } 302 303 tile++; 304 } 305 } 306 307 }// for b 308 }// for p 309 310 return 0; 311} 312 313int ff_ivi_dec_tile_data_size(GetBitContext *gb) 314{ 315 int len; 316 317 len = 0; 318 if (get_bits1(gb)) { 319 len = get_bits(gb, 8); 320 if (len == 255) 321 len = get_bits_long(gb, 24); 322 } 323 324 /* align the bitstream reader on the byte boundary */ 325 align_get_bits(gb); 326 327 return len; 328} 329 330int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile) 331{ 332 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val, 333 pos, is_intra, mc_type, mv_x, mv_y, col_mask; 334 uint8_t col_flags[8]; 335 int32_t prev_dc, trvec[64]; 336 uint32_t cbp, sym, lo, hi, quant, buf_offs, q; 337 IVIMbInfo *mb; 338 RVMapDesc *rvmap = band->rv_map; 339 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); 340 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); 341 const uint8_t *base_tab, *scale_tab; 342 343 prev_dc = 0; /* init intra prediction for the DC coefficient */ 344 345 blk_size = band->blk_size; 346 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */ 347 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */ 348 num_coeffs = blk_size * blk_size; 349 if (blk_size == 8) { 350 mc_with_delta_func = ff_ivi_mc_8x8_delta; 351 mc_no_delta_func = ff_ivi_mc_8x8_no_delta; 352 } else { 353 mc_with_delta_func = ff_ivi_mc_4x4_delta; 354 mc_no_delta_func = ff_ivi_mc_4x4_no_delta; 355 } 356 357 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 358 is_intra = !mb->type; 359 cbp = mb->cbp; 360 buf_offs = mb->buf_offs; 361 362 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23); 363 364 base_tab = is_intra ? band->intra_base : band->inter_base; 365 scale_tab = is_intra ? band->intra_scale : band->inter_scale; 366 367 if (!is_intra) { 368 mv_x = mb->mv_x; 369 mv_y = mb->mv_y; 370 if (!band->is_halfpel) { 371 mc_type = 0; /* we have only fullpel vectors */ 372 } else { 373 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 374 mv_x >>= 1; 375 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 376 } 377 } 378 379 for (blk = 0; blk < num_blocks; blk++) { 380 /* adjust block position in the buffer according to its number */ 381 if (blk & 1) { 382 buf_offs += blk_size; 383 } else if (blk == 2) { 384 buf_offs -= blk_size; 385 buf_offs += blk_size * band->pitch; 386 } 387 388 if (cbp & 1) { /* block coded ? */ 389 scan_pos = -1; 390 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */ 391 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */ 392 393 while (scan_pos <= num_coeffs) { 394 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 395 if (sym == rvmap->eob_sym) 396 break; /* End of block */ 397 398 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */ 399 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1; 400 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 401 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 402 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */ 403 } else { 404 run = rvmap->runtab[sym]; 405 val = rvmap->valtab[sym]; 406 } 407 408 /* de-zigzag and dequantize */ 409 scan_pos += run; 410 if (scan_pos >= num_coeffs) 411 break; 412 pos = band->scan[scan_pos]; 413 414 if (IVI_DEBUG && !val) 415 av_log(NULL, AV_LOG_ERROR, "Val = 0 encountered!\n"); 416 417 q = (base_tab[pos] * scale_tab[quant]) >> 8; 418 if (q > 1) 419 val = val * q + FFSIGN(val) * ((q >> 1) - (q & 1)); 420 trvec[pos] = val; 421 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */ 422 }// while 423 424 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym) 425 return -1; /* corrupt block data */ 426 427 /* undoing DC coeff prediction for intra-blocks */ 428 if (is_intra && band->is_2d_trans) { 429 prev_dc += trvec[0]; 430 trvec[0] = prev_dc; 431 col_flags[0] |= !!prev_dc; 432 } 433 434 /* apply inverse transform */ 435 band->inv_transform(trvec, band->buf + buf_offs, 436 band->pitch, col_flags); 437 438 /* apply motion compensation */ 439 if (!is_intra) 440 mc_with_delta_func(band->buf + buf_offs, 441 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 442 band->pitch, mc_type); 443 } else { 444 /* block not coded */ 445 /* for intra blocks apply the dc slant transform */ 446 /* for inter - perform the motion compensation without delta */ 447 if (is_intra && band->dc_transform) { 448 band->dc_transform(&prev_dc, band->buf + buf_offs, 449 band->pitch, blk_size); 450 } else 451 mc_no_delta_func(band->buf + buf_offs, 452 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 453 band->pitch, mc_type); 454 } 455 456 cbp >>= 1; 457 }// for blk 458 }// for mbn 459 460 align_get_bits(gb); 461 462 return 0; 463} 464 465void ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, 466 IVITile *tile, int32_t mv_scale) 467{ 468 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; 469 int offs, mb_offset, row_offset; 470 IVIMbInfo *mb, *ref_mb; 471 const int16_t *src; 472 int16_t *dst; 473 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, 474 int mc_type); 475 476 offs = tile->ypos * band->pitch + tile->xpos; 477 mb = tile->mbs; 478 ref_mb = tile->ref_mbs; 479 row_offset = band->mb_size * band->pitch; 480 need_mc = 0; /* reset the mc tracking flag */ 481 482 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) { 483 mb_offset = offs; 484 485 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) { 486 mb->xpos = x; 487 mb->ypos = y; 488 mb->buf_offs = mb_offset; 489 490 mb->type = 1; /* set the macroblocks type = INTER */ 491 mb->cbp = 0; /* all blocks are empty */ 492 493 if (!band->qdelta_present && !band->plane && !band->band_num) { 494 mb->q_delta = band->glob_quant; 495 mb->mv_x = 0; 496 mb->mv_y = 0; 497 } 498 499 if (band->inherit_qdelta && ref_mb) 500 mb->q_delta = ref_mb->q_delta; 501 502 if (band->inherit_mv) { 503 /* motion vector inheritance */ 504 if (mv_scale) { 505 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); 506 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); 507 } else { 508 mb->mv_x = ref_mb->mv_x; 509 mb->mv_y = ref_mb->mv_y; 510 } 511 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */ 512 } 513 514 mb++; 515 if (ref_mb) 516 ref_mb++; 517 mb_offset += band->mb_size; 518 } // for x 519 offs += row_offset; 520 } // for y 521 522 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */ 523 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */ 524 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta 525 : ff_ivi_mc_4x4_no_delta; 526 527 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 528 mv_x = mb->mv_x; 529 mv_y = mb->mv_y; 530 if (!band->is_halfpel) { 531 mc_type = 0; /* we have only fullpel vectors */ 532 } else { 533 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 534 mv_x >>= 1; 535 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 536 } 537 538 for (blk = 0; blk < num_blocks; blk++) { 539 /* adjust block position in the buffer according with its number */ 540 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch); 541 mc_no_delta_func(band->buf + offs, 542 band->ref_buf + offs + mv_y * band->pitch + mv_x, 543 band->pitch, mc_type); 544 } 545 } 546 } else { 547 /* copy data from the reference tile into the current one */ 548 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos; 549 dst = band->buf + tile->ypos * band->pitch + tile->xpos; 550 for (y = 0; y < tile->height; y++) { 551 memcpy(dst, src, tile->width*sizeof(band->buf[0])); 552 src += band->pitch; 553 dst += band->pitch; 554 } 555 } 556} 557 558 559#if IVI_DEBUG 560uint16_t ivi_calc_band_checksum (IVIBandDesc *band) 561{ 562 int x, y; 563 int16_t *src, checksum; 564 565 src = band->buf; 566 checksum = 0; 567 568 for (y = 0; y < band->height; src += band->pitch, y++) 569 for (x = 0; x < band->width; x++) 570 checksum += src[x]; 571 572 return checksum; 573} 574 575int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) 576{ 577 int x, y, result; 578 uint8_t t1, t2; 579 int16_t *src; 580 581 src = band->buf; 582 result = 0; 583 584 for (y = 0; y < band->height; src += band->pitch, y++) { 585 for (x = 0; x < band->width; x++) { 586 t1 = av_clip(src[x] + 128, 0, 255); 587 t2 = ref[x]; 588 if (t1 != t2) { 589 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", 590 y / band->blk_size, x / band->blk_size); 591 result = -1; 592 } 593 } 594 ref += pitch; 595 } 596 597 return result; 598} 599#endif 600 601void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) 602{ 603 int x, y; 604 const int16_t *src = plane->bands[0].buf; 605 uint32_t pitch = plane->bands[0].pitch; 606 607 for (y = 0; y < plane->height; y++) { 608 for (x = 0; x < plane->width; x++) 609 dst[x] = av_clip_uint8(src[x] + 128); 610 src += pitch; 611 dst += dst_pitch; 612 } 613} 614 615 616/** 617 * These are 2x8 predefined Huffman codebooks for coding macroblock/block 618 * signals. They are specified using "huffman descriptors" in order to 619 * avoid huge static tables. The decoding tables will be generated at 620 * startup from these descriptors. 621 */ 622const IVIHuffDesc ff_ivi_mb_huff_desc[8] = { 623 {8, {0, 4, 5, 4, 4, 4, 6, 6}}, 624 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}}, 625 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}}, 626 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}}, 627 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}}, 628 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}}, 629 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}}, 630 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}} 631}; 632 633const IVIHuffDesc ff_ivi_blk_huff_desc[8] = { 634 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}}, 635 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}}, 636 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}}, 637 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}}, 638 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}}, 639 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}}, 640 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}}, 641 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}} 642}; 643 644 645/** 646 * Run-value (RLE) tables. 647 */ 648const RVMapDesc ff_ivi_rvmap_tabs[9] = { 649{ /* MapTab0 */ 650 5, /* eob_sym */ 651 2, /* esc_sym */ 652 /* run table */ 653 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, 654 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, 655 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, 656 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, 657 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, 658 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, 659 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, 660 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, 661 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, 662 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, 663 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, 664 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, 665 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, 666 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, 667 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, 668 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38}, 669 670 /* value table */ 671 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, 672 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, 673 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, 674 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, 675 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, 676 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, 677 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, 678 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, 679 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, 680 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, 681 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, 682 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, 683 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, 684 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, 685 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, 686 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1} 687},{ 688 /* MapTab1 */ 689 0, /* eob_sym */ 690 38, /* esc_sym */ 691 /* run table */ 692 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, 693 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, 694 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, 695 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, 696 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, 697 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, 698 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, 699 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, 700 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, 701 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, 702 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, 703 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, 704 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, 705 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, 706 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, 707 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5}, 708 709 /* value table */ 710 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 711 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, 712 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, 713 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, 714 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, 715 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, 716 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, 717 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, 718 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, 719 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, 720 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, 721 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, 722 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, 723 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, 724 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, 725 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4} 726},{ 727 /* MapTab2 */ 728 2, /* eob_sym */ 729 11, /* esc_sym */ 730 /* run table */ 731 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, 732 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, 733 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, 734 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, 735 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, 736 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, 737 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, 738 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, 739 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, 740 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, 741 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, 742 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, 743 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, 744 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, 745 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, 746 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62}, 747 748 /* value table */ 749 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, 750 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, 751 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, 752 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, 753 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, 754 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, 755 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, 756 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, 757 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, 758 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, 759 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, 760 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, 761 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, 762 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, 763 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, 764 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1} 765},{ 766 /* MapTab3 */ 767 0, /* eob_sym */ 768 35, /* esc_sym */ 769 /* run table */ 770 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, 771 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, 772 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, 773 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, 774 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, 775 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, 776 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, 777 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, 778 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, 779 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, 780 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, 781 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, 782 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, 783 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, 784 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, 785 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16}, 786 787 /* value table */ 788 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, 789 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, 790 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, 791 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, 792 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, 793 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, 794 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, 795 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, 796 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, 797 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, 798 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, 799 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, 800 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, 801 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, 802 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, 803 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3} 804},{ 805 /* MapTab4 */ 806 0, /* eob_sym */ 807 34, /* esc_sym */ 808 /* run table */ 809 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, 810 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, 811 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, 812 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, 813 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, 814 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 815 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, 816 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 817 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 818 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 819 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, 820 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 821 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, 822 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, 823 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, 824 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1}, 825 826 /* value table */ 827 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, 828 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, 829 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, 830 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, 831 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, 832 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, 833 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, 834 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, 835 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, 836 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, 837 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, 838 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, 839 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, 840 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, 841 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, 842 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89} 843},{ 844 /* MapTab5 */ 845 2, /* eob_sym */ 846 33, /* esc_sym */ 847 /* run table */ 848 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, 849 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, 850 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, 851 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, 852 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, 853 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, 854 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, 855 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, 856 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, 857 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, 858 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, 859 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, 860 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, 861 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, 862 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, 863 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7}, 864 865 /* value table */ 866 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, 867 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, 868 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, 869 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, 870 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, 871 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, 872 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, 873 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, 874 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, 875 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, 876 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, 877 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, 878 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, 879 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, 880 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, 881 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5} 882},{ 883 /* MapTab6 */ 884 2, /* eob_sym */ 885 13, /* esc_sym */ 886 /* run table */ 887 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, 888 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, 889 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, 890 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, 891 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, 892 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, 893 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, 894 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, 895 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, 896 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, 897 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, 898 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, 899 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, 900 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, 901 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, 902 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2}, 903 904 /* value table */ 905 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, 906 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, 907 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, 908 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, 909 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, 910 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, 911 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, 912 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, 913 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, 914 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, 915 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, 916 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, 917 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, 918 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, 919 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, 920 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14} 921},{ 922 /* MapTab7 */ 923 2, /* eob_sym */ 924 38, /* esc_sym */ 925 /* run table */ 926 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, 927 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, 928 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, 929 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, 930 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, 931 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, 932 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, 933 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, 934 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, 935 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, 936 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, 937 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, 938 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, 939 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, 940 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, 941 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49}, 942 943 /* value table */ 944 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, 945 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, 946 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, 947 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, 948 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, 949 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, 950 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, 951 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, 952 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, 953 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, 954 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, 955 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, 956 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, 957 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, 958 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, 959 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1} 960},{ 961 /* MapTab8 */ 962 4, /* eob_sym */ 963 11, /* esc_sym */ 964 /* run table */ 965 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, 966 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, 967 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, 968 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, 969 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, 970 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, 971 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, 972 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, 973 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, 974 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, 975 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, 976 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, 977 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, 978 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, 979 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, 980 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1}, 981 982 /* value table */ 983 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, 984 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, 985 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, 986 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, 987 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, 988 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, 989 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, 990 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, 991 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, 992 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, 993 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, 994 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, 995 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, 996 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, 997 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, 998 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26} 999} 1000}; 1001