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 Libav. 7 * 8 * Libav 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 * Libav 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 Libav; 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 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 42typedef void (*ivi_mc_func) (int16_t *buf, const int16_t *ref_buf, 43 uint32_t pitch, int mc_type); 44 45/** 46 * Reverse "nbits" bits of the value "val" and return the result 47 * in the least significant bits. 48 */ 49static uint16_t inv_bits(uint16_t val, int nbits) 50{ 51 uint16_t res; 52 53 if (nbits <= 8) { 54 res = av_reverse[val] >> (8-nbits); 55 } else 56 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits); 57 58 return res; 59} 60 61int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag) 62{ 63 int pos, i, j, codes_per_row, prefix, not_last_row; 64 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */ 65 uint8_t bits[256]; 66 67 pos = 0; /* current position = 0 */ 68 69 for (i = 0; i < cb->num_rows; i++) { 70 codes_per_row = 1 << cb->xbits[i]; 71 not_last_row = (i != cb->num_rows - 1); 72 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row); 73 74 for (j = 0; j < codes_per_row; j++) { 75 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */ 76 break; /* elements, but only 256 codes are allowed! */ 77 78 bits[pos] = i + cb->xbits[i] + not_last_row; 79 if (bits[pos] > IVI_VLC_BITS) 80 return AVERROR_INVALIDDATA; /* invalid descriptor */ 81 82 codewords[pos] = inv_bits((prefix | j), bits[pos]); 83 if (!bits[pos]) 84 bits[pos] = 1; 85 86 pos++; 87 }//for j 88 }//for i 89 90 /* number of codewords = pos */ 91 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2, 92 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE); 93} 94 95void ff_ivi_init_static_vlc(void) 96{ 97 int i; 98 static VLC_TYPE table_data[8192 * 16][2]; 99 static int initialized_vlcs = 0; 100 101 if (initialized_vlcs) 102 return; 103 for (i = 0; i < 8; i++) { 104 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192; 105 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192; 106 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1); 107 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192; 108 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192; 109 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1); 110 } 111 initialized_vlcs = 1; 112} 113 114int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, 115 IVIHuffTab *huff_tab, AVCodecContext *avctx) 116{ 117 int i, result; 118 IVIHuffDesc new_huff; 119 120 if (!desc_coded) { 121 /* select default table */ 122 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7] 123 : &ff_ivi_mb_vlc_tabs [7]; 124 } else { 125 huff_tab->tab_sel = get_bits(gb, 3); 126 if (huff_tab->tab_sel == 7) { 127 /* custom huffman table (explicitly encoded) */ 128 new_huff.num_rows = get_bits(gb, 4); 129 if (!new_huff.num_rows) { 130 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n"); 131 return AVERROR_INVALIDDATA; 132 } 133 134 for (i = 0; i < new_huff.num_rows; i++) 135 new_huff.xbits[i] = get_bits(gb, 4); 136 137 /* Have we got the same custom table? Rebuild if not. */ 138 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) { 139 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff); 140 141 if (huff_tab->cust_tab.table) 142 ff_free_vlc(&huff_tab->cust_tab); 143 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc, 144 &huff_tab->cust_tab, 0); 145 if (result) { 146 huff_tab->cust_desc.num_rows = 0; // reset faulty description 147 av_log(avctx, AV_LOG_ERROR, 148 "Error while initializing custom vlc table!\n"); 149 return result; 150 } 151 } 152 huff_tab->tab = &huff_tab->cust_tab; 153 } else { 154 /* select one of predefined tables */ 155 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel] 156 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel]; 157 } 158 } 159 160 return 0; 161} 162 163int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2) 164{ 165 return desc1->num_rows != desc2->num_rows 166 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows); 167} 168 169void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src) 170{ 171 dst->num_rows = src->num_rows; 172 memcpy(dst->xbits, src->xbits, src->num_rows); 173} 174 175int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg) 176{ 177 int p, b; 178 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size; 179 IVIBandDesc *band; 180 181 ff_ivi_free_buffers(planes); 182 183 /* fill in the descriptor of the luminance plane */ 184 planes[0].width = cfg->pic_width; 185 planes[0].height = cfg->pic_height; 186 planes[0].num_bands = cfg->luma_bands; 187 188 /* fill in the descriptors of the chrominance planes */ 189 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2; 190 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2; 191 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands; 192 193 for (p = 0; p < 3; p++) { 194 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc)); 195 if (!planes[p].bands) 196 return AVERROR(ENOMEM); 197 198 /* select band dimensions: if there is only one band then it 199 * has the full size, if there are several bands each of them 200 * has only half size */ 201 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1; 202 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1; 203 204 /* luma band buffers will be aligned on 16x16 (max macroblock size) */ 205 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */ 206 align_fac = p ? 8 : 16; 207 width_aligned = FFALIGN(b_width , align_fac); 208 height_aligned = FFALIGN(b_height, align_fac); 209 buf_size = width_aligned * height_aligned * sizeof(int16_t); 210 211 for (b = 0; b < planes[p].num_bands; b++) { 212 band = &planes[p].bands[b]; /* select appropriate plane/band */ 213 band->plane = p; 214 band->band_num = b; 215 band->width = b_width; 216 band->height = b_height; 217 band->pitch = width_aligned; 218 band->aheight = height_aligned; 219 band->bufs[0] = av_mallocz(buf_size); 220 band->bufs[1] = av_mallocz(buf_size); 221 if (!band->bufs[0] || !band->bufs[1]) 222 return AVERROR(ENOMEM); 223 224 /* allocate the 3rd band buffer for scalability mode */ 225 if (cfg->luma_bands > 1) { 226 band->bufs[2] = av_mallocz(buf_size); 227 if (!band->bufs[2]) 228 return AVERROR(ENOMEM); 229 } 230 231 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */ 232 } 233 } 234 235 return 0; 236} 237 238void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes) 239{ 240 int p, b, t; 241 242 for (p = 0; p < 3; p++) { 243 for (b = 0; b < planes[p].num_bands; b++) { 244 av_freep(&planes[p].bands[b].bufs[0]); 245 av_freep(&planes[p].bands[b].bufs[1]); 246 av_freep(&planes[p].bands[b].bufs[2]); 247 248 if (planes[p].bands[b].blk_vlc.cust_tab.table) 249 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab); 250 for (t = 0; t < planes[p].bands[b].num_tiles; t++) 251 av_freep(&planes[p].bands[b].tiles[t].mbs); 252 av_freep(&planes[p].bands[b].tiles); 253 } 254 av_freep(&planes[p].bands); 255 } 256} 257 258int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height) 259{ 260 int p, b, x, y, x_tiles, y_tiles, t_width, t_height; 261 IVIBandDesc *band; 262 IVITile *tile, *ref_tile; 263 264 for (p = 0; p < 3; p++) { 265 t_width = !p ? tile_width : (tile_width + 3) >> 2; 266 t_height = !p ? tile_height : (tile_height + 3) >> 2; 267 268 if (!p && planes[0].num_bands == 4) { 269 t_width >>= 1; 270 t_height >>= 1; 271 } 272 273 for (b = 0; b < planes[p].num_bands; b++) { 274 band = &planes[p].bands[b]; 275 x_tiles = IVI_NUM_TILES(band->width, t_width); 276 y_tiles = IVI_NUM_TILES(band->height, t_height); 277 band->num_tiles = x_tiles * y_tiles; 278 279 av_freep(&band->tiles); 280 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile)); 281 if (!band->tiles) 282 return AVERROR(ENOMEM); 283 284 tile = band->tiles; 285 286 /* use the first luma band as reference for motion vectors 287 * and quant */ 288 ref_tile = planes[0].bands[0].tiles; 289 290 for (y = 0; y < band->height; y += t_height) { 291 for (x = 0; x < band->width; x += t_width) { 292 tile->xpos = x; 293 tile->ypos = y; 294 tile->mb_size = band->mb_size; 295 tile->width = FFMIN(band->width - x, t_width); 296 tile->height = FFMIN(band->height - y, t_height); 297 tile->is_empty = tile->data_size = 0; 298 /* calculate number of macroblocks */ 299 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height, 300 band->mb_size); 301 302 av_freep(&tile->mbs); 303 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo)); 304 if (!tile->mbs) 305 return AVERROR(ENOMEM); 306 307 tile->ref_mbs = 0; 308 if (p || b) { 309 tile->ref_mbs = ref_tile->mbs; 310 ref_tile++; 311 } 312 313 tile++; 314 } 315 } 316 317 }// for b 318 }// for p 319 320 return 0; 321} 322 323int ff_ivi_dec_tile_data_size(GetBitContext *gb) 324{ 325 int len; 326 327 len = 0; 328 if (get_bits1(gb)) { 329 len = get_bits(gb, 8); 330 if (len == 255) 331 len = get_bits_long(gb, 24); 332 } 333 334 /* align the bitstream reader on the byte boundary */ 335 align_get_bits(gb); 336 337 return len; 338} 339 340int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile) 341{ 342 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val, 343 pos, is_intra, mc_type, mv_x, mv_y, col_mask; 344 uint8_t col_flags[8]; 345 int32_t prev_dc, trvec[64]; 346 uint32_t cbp, sym, lo, hi, quant, buf_offs, q; 347 IVIMbInfo *mb; 348 RVMapDesc *rvmap = band->rv_map; 349 ivi_mc_func mc_with_delta_func, mc_no_delta_func; 350 const uint16_t *base_tab; 351 const uint8_t *scale_tab; 352 353 prev_dc = 0; /* init intra prediction for the DC coefficient */ 354 355 blk_size = band->blk_size; 356 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */ 357 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */ 358 num_coeffs = blk_size * blk_size; 359 if (blk_size == 8) { 360 mc_with_delta_func = ff_ivi_mc_8x8_delta; 361 mc_no_delta_func = ff_ivi_mc_8x8_no_delta; 362 } else { 363 mc_with_delta_func = ff_ivi_mc_4x4_delta; 364 mc_no_delta_func = ff_ivi_mc_4x4_no_delta; 365 } 366 367 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 368 is_intra = !mb->type; 369 cbp = mb->cbp; 370 buf_offs = mb->buf_offs; 371 372 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23); 373 374 base_tab = is_intra ? band->intra_base : band->inter_base; 375 scale_tab = is_intra ? band->intra_scale : band->inter_scale; 376 if (scale_tab) 377 quant = scale_tab[quant]; 378 379 if (!is_intra) { 380 mv_x = mb->mv_x; 381 mv_y = mb->mv_y; 382 if (!band->is_halfpel) { 383 mc_type = 0; /* we have only fullpel vectors */ 384 } else { 385 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 386 mv_x >>= 1; 387 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 388 } 389 if (mb->type) { 390 int dmv_x, dmv_y, cx, cy; 391 392 dmv_x = mb->mv_x >> band->is_halfpel; 393 dmv_y = mb->mv_y >> band->is_halfpel; 394 cx = mb->mv_x & band->is_halfpel; 395 cy = mb->mv_y & band->is_halfpel; 396 397 if ( mb->xpos + dmv_x < 0 398 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch 399 || mb->ypos + dmv_y < 0 400 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) { 401 return AVERROR_INVALIDDATA; 402 } 403 } 404 } 405 406 for (blk = 0; blk < num_blocks; blk++) { 407 /* adjust block position in the buffer according to its number */ 408 if (blk & 1) { 409 buf_offs += blk_size; 410 } else if (blk == 2) { 411 buf_offs -= blk_size; 412 buf_offs += blk_size * band->pitch; 413 } 414 415 if (cbp & 1) { /* block coded ? */ 416 if (!band->scan) { 417 av_log(NULL, AV_LOG_ERROR, "Scan pattern is not set.\n"); 418 return AVERROR_INVALIDDATA; 419 } 420 421 scan_pos = -1; 422 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */ 423 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */ 424 425 while (scan_pos <= num_coeffs) { 426 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 427 if (sym == rvmap->eob_sym) 428 break; /* End of block */ 429 430 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */ 431 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1; 432 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 433 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 434 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */ 435 } else { 436 if (sym >= 256U) { 437 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym); 438 return AVERROR_INVALIDDATA; 439 } 440 run = rvmap->runtab[sym]; 441 val = rvmap->valtab[sym]; 442 } 443 444 /* de-zigzag and dequantize */ 445 scan_pos += run; 446 if (scan_pos >= num_coeffs) 447 break; 448 pos = band->scan[scan_pos]; 449 450 if (!val) 451 av_dlog(NULL, "Val = 0 encountered!\n"); 452 453 q = (base_tab[pos] * quant) >> 9; 454 if (q > 1) 455 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1); 456 trvec[pos] = val; 457 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */ 458 }// while 459 460 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym) 461 return AVERROR_INVALIDDATA; /* corrupt block data */ 462 463 /* undoing DC coeff prediction for intra-blocks */ 464 if (is_intra && band->is_2d_trans) { 465 prev_dc += trvec[0]; 466 trvec[0] = prev_dc; 467 col_flags[0] |= !!prev_dc; 468 } 469 470 /* apply inverse transform */ 471 band->inv_transform(trvec, band->buf + buf_offs, 472 band->pitch, col_flags); 473 474 /* apply motion compensation */ 475 if (!is_intra) 476 mc_with_delta_func(band->buf + buf_offs, 477 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 478 band->pitch, mc_type); 479 } else { 480 /* block not coded */ 481 /* for intra blocks apply the dc slant transform */ 482 /* for inter - perform the motion compensation without delta */ 483 if (is_intra) { 484 if (band->dc_transform) 485 band->dc_transform(&prev_dc, band->buf + buf_offs, 486 band->pitch, blk_size); 487 } else 488 mc_no_delta_func(band->buf + buf_offs, 489 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 490 band->pitch, mc_type); 491 } 492 493 cbp >>= 1; 494 }// for blk 495 }// for mbn 496 497 align_get_bits(gb); 498 499 return 0; 500} 501 502/** 503 * Handle empty tiles by performing data copying and motion 504 * compensation respectively. 505 * 506 * @param[in] avctx ptr to the AVCodecContext 507 * @param[in] band pointer to the band descriptor 508 * @param[in] tile pointer to the tile descriptor 509 * @param[in] mv_scale scaling factor for motion vectors 510 */ 511static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, 512 IVITile *tile, int32_t mv_scale) 513{ 514 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; 515 int offs, mb_offset, row_offset; 516 IVIMbInfo *mb, *ref_mb; 517 const int16_t *src; 518 int16_t *dst; 519 ivi_mc_func mc_no_delta_func; 520 521 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { 522 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches " 523 "parameters %d in ivi_process_empty_tile()\n", 524 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); 525 return AVERROR_INVALIDDATA; 526 } 527 528 offs = tile->ypos * band->pitch + tile->xpos; 529 mb = tile->mbs; 530 ref_mb = tile->ref_mbs; 531 row_offset = band->mb_size * band->pitch; 532 need_mc = 0; /* reset the mc tracking flag */ 533 534 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) { 535 mb_offset = offs; 536 537 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) { 538 mb->xpos = x; 539 mb->ypos = y; 540 mb->buf_offs = mb_offset; 541 542 mb->type = 1; /* set the macroblocks type = INTER */ 543 mb->cbp = 0; /* all blocks are empty */ 544 545 if (!band->qdelta_present && !band->plane && !band->band_num) { 546 mb->q_delta = band->glob_quant; 547 mb->mv_x = 0; 548 mb->mv_y = 0; 549 } 550 551 if (band->inherit_qdelta && ref_mb) 552 mb->q_delta = ref_mb->q_delta; 553 554 if (band->inherit_mv && ref_mb) { 555 /* motion vector inheritance */ 556 if (mv_scale) { 557 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); 558 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); 559 } else { 560 mb->mv_x = ref_mb->mv_x; 561 mb->mv_y = ref_mb->mv_y; 562 } 563 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */ 564 } 565 566 mb++; 567 if (ref_mb) 568 ref_mb++; 569 mb_offset += band->mb_size; 570 } // for x 571 offs += row_offset; 572 } // for y 573 574 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */ 575 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */ 576 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta 577 : ff_ivi_mc_4x4_no_delta; 578 579 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 580 mv_x = mb->mv_x; 581 mv_y = mb->mv_y; 582 if (!band->is_halfpel) { 583 mc_type = 0; /* we have only fullpel vectors */ 584 } else { 585 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 586 mv_x >>= 1; 587 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 588 } 589 590 for (blk = 0; blk < num_blocks; blk++) { 591 /* adjust block position in the buffer according with its number */ 592 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch); 593 mc_no_delta_func(band->buf + offs, 594 band->ref_buf + offs + mv_y * band->pitch + mv_x, 595 band->pitch, mc_type); 596 } 597 } 598 } else { 599 /* copy data from the reference tile into the current one */ 600 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos; 601 dst = band->buf + tile->ypos * band->pitch + tile->xpos; 602 for (y = 0; y < tile->height; y++) { 603 memcpy(dst, src, tile->width*sizeof(band->buf[0])); 604 src += band->pitch; 605 dst += band->pitch; 606 } 607 } 608 609 return 0; 610} 611 612 613#ifdef DEBUG 614uint16_t ivi_calc_band_checksum (IVIBandDesc *band) 615{ 616 int x, y; 617 int16_t *src, checksum; 618 619 src = band->buf; 620 checksum = 0; 621 622 for (y = 0; y < band->height; src += band->pitch, y++) 623 for (x = 0; x < band->width; x++) 624 checksum += src[x]; 625 626 return checksum; 627} 628 629int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) 630{ 631 int x, y, result; 632 uint8_t t1, t2; 633 int16_t *src; 634 635 src = band->buf; 636 result = 0; 637 638 for (y = 0; y < band->height; src += band->pitch, y++) { 639 for (x = 0; x < band->width; x++) { 640 t1 = av_clip(src[x] + 128, 0, 255); 641 t2 = ref[x]; 642 if (t1 != t2) { 643 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", 644 y / band->blk_size, x / band->blk_size); 645 result = -1; 646 } 647 } 648 ref += pitch; 649 } 650 651 return result; 652} 653#endif 654 655void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) 656{ 657 int x, y; 658 const int16_t *src = plane->bands[0].buf; 659 uint32_t pitch = plane->bands[0].pitch; 660 661 if (!src) 662 return; 663 664 for (y = 0; y < plane->height; y++) { 665 for (x = 0; x < plane->width; x++) 666 dst[x] = av_clip_uint8(src[x] + 128); 667 src += pitch; 668 dst += dst_pitch; 669 } 670} 671 672/** 673 * Decode an Indeo 4 or 5 band. 674 * 675 * @param[in,out] ctx ptr to the decoder context 676 * @param[in,out] band ptr to the band descriptor 677 * @param[in] avctx ptr to the AVCodecContext 678 * @return result code: 0 = OK, -1 = error 679 */ 680static int decode_band(IVI45DecContext *ctx, int plane_num, 681 IVIBandDesc *band, AVCodecContext *avctx) 682{ 683 int result, i, t, idx1, idx2, pos; 684 IVITile *tile; 685 686 band->buf = band->bufs[ctx->dst_buf]; 687 band->ref_buf = band->bufs[ctx->ref_buf]; 688 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3); 689 690 result = ctx->decode_band_hdr(ctx, band, avctx); 691 if (result) { 692 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n", 693 result); 694 return result; 695 } 696 697 if (band->is_empty) { 698 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n"); 699 return AVERROR_INVALIDDATA; 700 } 701 702 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel]; 703 704 /* apply corrections to the selected rvmap table if present */ 705 for (i = 0; i < band->num_corr; i++) { 706 idx1 = band->corr[i * 2]; 707 idx2 = band->corr[i * 2 + 1]; 708 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); 709 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); 710 } 711 712 pos = get_bits_count(&ctx->gb); 713 714 for (t = 0; t < band->num_tiles; t++) { 715 tile = &band->tiles[t]; 716 717 if (tile->mb_size != band->mb_size) { 718 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n", 719 band->mb_size, tile->mb_size); 720 return AVERROR_INVALIDDATA; 721 } 722 tile->is_empty = get_bits1(&ctx->gb); 723 if (tile->is_empty) { 724 result = ivi_process_empty_tile(avctx, band, tile, 725 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3)); 726 if (result < 0) 727 break; 728 av_dlog(avctx, "Empty tile encountered!\n"); 729 } else { 730 tile->data_size = ff_ivi_dec_tile_data_size(&ctx->gb); 731 if (!tile->data_size) { 732 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n"); 733 return AVERROR_INVALIDDATA; 734 } 735 736 result = ctx->decode_mb_info(ctx, band, tile, avctx); 737 if (result < 0) 738 break; 739 740 result = ff_ivi_decode_blocks(&ctx->gb, band, tile); 741 if (result < 0) { 742 av_log(avctx, AV_LOG_ERROR, 743 "Corrupted tile data encountered!\n"); 744 break; 745 } 746 747 if (((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) { 748 av_log(avctx, AV_LOG_ERROR, 749 "Tile data_size mismatch!\n"); 750 result = AVERROR_INVALIDDATA; 751 break; 752 } 753 754 pos += tile->data_size << 3; // skip to next tile 755 } 756 } 757 758 /* restore the selected rvmap table by applying its corrections in reverse order */ 759 for (i = band->num_corr-1; i >= 0; i--) { 760 idx1 = band->corr[i*2]; 761 idx2 = band->corr[i*2+1]; 762 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]); 763 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]); 764 } 765 766#ifdef DEBUG 767 if (band->checksum_present) { 768 uint16_t chksum = ivi_calc_band_checksum(band); 769 if (chksum != band->checksum) { 770 av_log(avctx, AV_LOG_ERROR, 771 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n", 772 band->plane, band->band_num, band->checksum, chksum); 773 } 774 } 775#endif 776 777 align_get_bits(&ctx->gb); 778 779 return result; 780} 781 782int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *data_size, 783 AVPacket *avpkt) 784{ 785 IVI45DecContext *ctx = avctx->priv_data; 786 const uint8_t *buf = avpkt->data; 787 int buf_size = avpkt->size; 788 int result, p, b; 789 790 init_get_bits(&ctx->gb, buf, buf_size * 8); 791 ctx->frame_data = buf; 792 ctx->frame_size = buf_size; 793 794 result = ctx->decode_pic_hdr(ctx, avctx); 795 if (result) { 796 av_log(avctx, AV_LOG_ERROR, 797 "Error while decoding picture header: %d\n", result); 798 return result; 799 } 800 if (ctx->gop_invalid) 801 return AVERROR_INVALIDDATA; 802 803 if (ctx->gop_flags & IVI5_IS_PROTECTED) { 804 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n"); 805 return AVERROR_PATCHWELCOME; 806 } 807 808 ctx->switch_buffers(ctx); 809 810 //{ START_TIMER; 811 812 if (ctx->is_nonnull_frame(ctx)) { 813 for (p = 0; p < 3; p++) { 814 for (b = 0; b < ctx->planes[p].num_bands; b++) { 815 result = decode_band(ctx, p, &ctx->planes[p].bands[b], avctx); 816 if (result < 0) { 817 av_log(avctx, AV_LOG_ERROR, 818 "Error while decoding band: %d, plane: %d\n", b, p); 819 return result; 820 } 821 } 822 } 823 } 824 825 //STOP_TIMER("decode_planes"); } 826 827 /* If the bidirectional mode is enabled, next I and the following P frame will */ 828 /* be sent together. Unfortunately the approach below seems to be the only way */ 829 /* to handle the B-frames mode. That's exactly the same Intel decoders do. */ 830 if (avctx->codec_id == CODEC_ID_INDEO4 && ctx->frame_type == 0/*FRAMETYPE_INTRA*/) { 831 while (get_bits(&ctx->gb, 8)); // skip version string 832 skip_bits_long(&ctx->gb, 64); // skip padding, TODO: implement correct 8-bytes alignment 833 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8) 834 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n"); 835 } 836 837 if (ctx->frame.data[0]) 838 avctx->release_buffer(avctx, &ctx->frame); 839 840 ctx->frame.reference = 0; 841 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height); 842 if ((result = avctx->get_buffer(avctx, &ctx->frame)) < 0) { 843 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); 844 return result; 845 } 846 847 if (ctx->is_scalable) { 848 if (avctx->codec_id == CODEC_ID_INDEO4) 849 ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); 850 else 851 ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0], 4); 852 } else { 853 ff_ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]); 854 } 855 856 ff_ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]); 857 ff_ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]); 858 859 *data_size = sizeof(AVFrame); 860 *(AVFrame*)data = ctx->frame; 861 862 return buf_size; 863} 864 865/** 866 * Close Indeo5 decoder and clean up its context. 867 */ 868av_cold int ff_ivi_decode_close(AVCodecContext *avctx) 869{ 870 IVI45DecContext *ctx = avctx->priv_data; 871 872 ff_ivi_free_buffers(&ctx->planes[0]); 873 874 if (ctx->mb_vlc.cust_tab.table) 875 ff_free_vlc(&ctx->mb_vlc.cust_tab); 876 877 if (ctx->frame.data[0]) 878 avctx->release_buffer(avctx, &ctx->frame); 879 880#if IVI4_STREAM_ANALYSER 881 if (avctx->codec_id == CODEC_ID_INDEO4) { 882 if (ctx->is_scalable) 883 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n"); 884 if (ctx->uses_tiling) 885 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n"); 886 if (ctx->has_b_frames) 887 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n"); 888 if (ctx->has_transp) 889 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n"); 890 if (ctx->uses_haar) 891 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n"); 892 if (ctx->uses_fullpel) 893 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n"); 894 } 895#endif 896 897 return 0; 898} 899 900 901/** 902 * These are 2x8 predefined Huffman codebooks for coding macroblock/block 903 * signals. They are specified using "huffman descriptors" in order to 904 * avoid huge static tables. The decoding tables will be generated at 905 * startup from these descriptors. 906 */ 907const IVIHuffDesc ff_ivi_mb_huff_desc[8] = { 908 {8, {0, 4, 5, 4, 4, 4, 6, 6}}, 909 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}}, 910 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}}, 911 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}}, 912 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}}, 913 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}}, 914 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}}, 915 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}} 916}; 917 918const IVIHuffDesc ff_ivi_blk_huff_desc[8] = { 919 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}}, 920 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}}, 921 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}}, 922 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}}, 923 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}}, 924 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}}, 925 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}}, 926 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}} 927}; 928 929 930/** 931 * Scan patterns shared between indeo4 and indeo5 932 */ 933const uint8_t ff_ivi_vertical_scan_8x8[64] = { 934 0, 8, 16, 24, 32, 40, 48, 56, 935 1, 9, 17, 25, 33, 41, 49, 57, 936 2, 10, 18, 26, 34, 42, 50, 58, 937 3, 11, 19, 27, 35, 43, 51, 59, 938 4, 12, 20, 28, 36, 44, 52, 60, 939 5, 13, 21, 29, 37, 45, 53, 61, 940 6, 14, 22, 30, 38, 46, 54, 62, 941 7, 15, 23, 31, 39, 47, 55, 63 942}; 943 944const uint8_t ff_ivi_horizontal_scan_8x8[64] = { 945 0, 1, 2, 3, 4, 5, 6, 7, 946 8, 9, 10, 11, 12, 13, 14, 15, 947 16, 17, 18, 19, 20, 21, 22, 23, 948 24, 25, 26, 27, 28, 29, 30, 31, 949 32, 33, 34, 35, 36, 37, 38, 39, 950 40, 41, 42, 43, 44, 45, 46, 47, 951 48, 49, 50, 51, 52, 53, 54, 55, 952 56, 57, 58, 59, 60, 61, 62, 63 953}; 954 955const uint8_t ff_ivi_direct_scan_4x4[16] = { 956 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 957}; 958 959 960/** 961 * Run-value (RLE) tables. 962 */ 963const RVMapDesc ff_ivi_rvmap_tabs[9] = { 964{ /* MapTab0 */ 965 5, /* eob_sym */ 966 2, /* esc_sym */ 967 /* run table */ 968 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, 969 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, 970 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, 971 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, 972 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, 973 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, 974 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, 975 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, 976 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, 977 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, 978 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, 979 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, 980 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, 981 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, 982 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, 983 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38}, 984 985 /* value table */ 986 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, 987 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, 988 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, 989 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, 990 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, 991 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, 992 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, 993 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, 994 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, 995 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, 996 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, 997 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, 998 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, 999 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, 1000 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, 1001 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1} 1002},{ 1003 /* MapTab1 */ 1004 0, /* eob_sym */ 1005 38, /* esc_sym */ 1006 /* run table */ 1007 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, 1008 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, 1009 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, 1010 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, 1011 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, 1012 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, 1013 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, 1014 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, 1015 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, 1016 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, 1017 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, 1018 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, 1019 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, 1020 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, 1021 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, 1022 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5}, 1023 1024 /* value table */ 1025 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1026 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, 1027 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, 1028 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, 1029 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, 1030 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, 1031 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, 1032 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, 1033 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, 1034 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, 1035 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, 1036 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, 1037 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, 1038 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, 1039 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, 1040 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4} 1041},{ 1042 /* MapTab2 */ 1043 2, /* eob_sym */ 1044 11, /* esc_sym */ 1045 /* run table */ 1046 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, 1047 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, 1048 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, 1049 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, 1050 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, 1051 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, 1052 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, 1053 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, 1054 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, 1055 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, 1056 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, 1057 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, 1058 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, 1059 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, 1060 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, 1061 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62}, 1062 1063 /* value table */ 1064 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, 1065 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, 1066 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, 1067 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, 1068 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, 1069 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, 1070 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, 1071 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, 1072 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, 1073 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, 1074 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, 1075 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, 1076 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, 1077 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, 1078 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, 1079 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1} 1080},{ 1081 /* MapTab3 */ 1082 0, /* eob_sym */ 1083 35, /* esc_sym */ 1084 /* run table */ 1085 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, 1086 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, 1087 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, 1088 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, 1089 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, 1090 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, 1091 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, 1092 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, 1093 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, 1094 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, 1095 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, 1096 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, 1097 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, 1098 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, 1099 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, 1100 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16}, 1101 1102 /* value table */ 1103 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, 1104 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, 1105 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, 1106 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, 1107 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, 1108 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, 1109 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, 1110 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, 1111 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, 1112 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, 1113 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, 1114 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, 1115 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, 1116 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, 1117 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, 1118 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3} 1119},{ 1120 /* MapTab4 */ 1121 0, /* eob_sym */ 1122 34, /* esc_sym */ 1123 /* run table */ 1124 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, 1125 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, 1126 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, 1127 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, 1128 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, 1129 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1130 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, 1131 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1132 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 1133 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 1134 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, 1135 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 1136 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, 1137 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, 1138 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, 1139 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1}, 1140 1141 /* value table */ 1142 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, 1143 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, 1144 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, 1145 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, 1146 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, 1147 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, 1148 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, 1149 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, 1150 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, 1151 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, 1152 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, 1153 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, 1154 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, 1155 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, 1156 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, 1157 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89} 1158},{ 1159 /* MapTab5 */ 1160 2, /* eob_sym */ 1161 33, /* esc_sym */ 1162 /* run table */ 1163 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, 1164 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, 1165 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, 1166 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, 1167 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, 1168 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, 1169 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, 1170 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, 1171 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, 1172 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, 1173 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, 1174 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, 1175 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, 1176 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, 1177 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, 1178 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7}, 1179 1180 /* value table */ 1181 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, 1182 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, 1183 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, 1184 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, 1185 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, 1186 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, 1187 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, 1188 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, 1189 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, 1190 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, 1191 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, 1192 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, 1193 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, 1194 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, 1195 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, 1196 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5} 1197},{ 1198 /* MapTab6 */ 1199 2, /* eob_sym */ 1200 13, /* esc_sym */ 1201 /* run table */ 1202 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, 1203 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, 1204 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, 1205 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, 1206 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, 1207 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, 1208 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, 1209 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, 1210 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, 1211 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, 1212 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, 1213 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, 1214 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, 1215 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, 1216 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, 1217 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2}, 1218 1219 /* value table */ 1220 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, 1221 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, 1222 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, 1223 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, 1224 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, 1225 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, 1226 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, 1227 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, 1228 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, 1229 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, 1230 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, 1231 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, 1232 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, 1233 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, 1234 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, 1235 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14} 1236},{ 1237 /* MapTab7 */ 1238 2, /* eob_sym */ 1239 38, /* esc_sym */ 1240 /* run table */ 1241 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, 1242 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, 1243 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, 1244 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, 1245 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, 1246 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, 1247 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, 1248 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, 1249 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, 1250 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, 1251 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, 1252 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, 1253 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, 1254 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, 1255 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, 1256 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49}, 1257 1258 /* value table */ 1259 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, 1260 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, 1261 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, 1262 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, 1263 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, 1264 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, 1265 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, 1266 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, 1267 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, 1268 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, 1269 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, 1270 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, 1271 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, 1272 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, 1273 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, 1274 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1} 1275},{ 1276 /* MapTab8 */ 1277 4, /* eob_sym */ 1278 11, /* esc_sym */ 1279 /* run table */ 1280 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, 1281 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, 1282 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, 1283 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, 1284 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, 1285 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, 1286 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, 1287 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, 1288 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, 1289 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, 1290 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, 1291 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, 1292 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, 1293 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, 1294 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, 1295 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1}, 1296 1297 /* value table */ 1298 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, 1299 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, 1300 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, 1301 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, 1302 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, 1303 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, 1304 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, 1305 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, 1306 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, 1307 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, 1308 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, 1309 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, 1310 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, 1311 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, 1312 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, 1313 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26} 1314} 1315}; 1316