Libav 0.7.1
|
00001 /* 00002 * common functions for Indeo Video Interactive codecs (Indeo4 and Indeo5) 00003 * 00004 * Copyright (c) 2009 Maxim Poliakovski 00005 * 00006 * This file is part of Libav. 00007 * 00008 * Libav is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * Libav is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with Libav; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 */ 00022 00029 #define ALT_BITSTREAM_READER_LE 00030 #include "avcodec.h" 00031 #include "get_bits.h" 00032 #include "ivi_common.h" 00033 #include "libavutil/common.h" 00034 #include "ivi_dsp.h" 00035 00036 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8]; 00037 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8]; 00038 00039 VLC ff_ivi_mb_vlc_tabs [8]; 00040 VLC ff_ivi_blk_vlc_tabs[8]; 00041 00046 static uint16_t inv_bits(uint16_t val, int nbits) 00047 { 00048 uint16_t res; 00049 00050 if (nbits <= 8) { 00051 res = av_reverse[val] >> (8-nbits); 00052 } else 00053 res = ((av_reverse[val & 0xFF] << 8) + (av_reverse[val >> 8])) >> (16-nbits); 00054 00055 return res; 00056 } 00057 00058 int ff_ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag) 00059 { 00060 int pos, i, j, codes_per_row, prefix, not_last_row; 00061 uint16_t codewords[256]; /* FIXME: move this temporal storage out? */ 00062 uint8_t bits[256]; 00063 00064 pos = 0; /* current position = 0 */ 00065 00066 for (i = 0; i < cb->num_rows; i++) { 00067 codes_per_row = 1 << cb->xbits[i]; 00068 not_last_row = (i != cb->num_rows - 1); 00069 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row); 00070 00071 for (j = 0; j < codes_per_row; j++) { 00072 if (pos >= 256) /* Some Indeo5 codebooks can have more than 256 */ 00073 break; /* elements, but only 256 codes are allowed! */ 00074 00075 bits[pos] = i + cb->xbits[i] + not_last_row; 00076 if (bits[pos] > IVI_VLC_BITS) 00077 return -1; /* invalid descriptor */ 00078 00079 codewords[pos] = inv_bits((prefix | j), bits[pos]); 00080 if (!bits[pos]) 00081 bits[pos] = 1; 00082 00083 pos++; 00084 }//for j 00085 }//for i 00086 00087 /* number of codewords = pos */ 00088 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2, 00089 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE); 00090 } 00091 00092 void ff_ivi_init_static_vlc(void) 00093 { 00094 int i; 00095 static VLC_TYPE table_data[8192 * 16][2]; 00096 static int initialized_vlcs = 0; 00097 00098 if (initialized_vlcs) 00099 return; 00100 for (i = 0; i < 8; i++) { 00101 ff_ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192; 00102 ff_ivi_mb_vlc_tabs[i].table_allocated = 8192; 00103 ff_ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ff_ivi_mb_vlc_tabs[i], 1); 00104 ff_ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192; 00105 ff_ivi_blk_vlc_tabs[i].table_allocated = 8192; 00106 ff_ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ff_ivi_blk_vlc_tabs[i], 1); 00107 } 00108 initialized_vlcs = 1; 00109 } 00110 00111 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, 00112 IVIHuffTab *huff_tab, AVCodecContext *avctx) 00113 { 00114 int i, result; 00115 IVIHuffDesc new_huff; 00116 00117 if (!desc_coded) { 00118 /* select default table */ 00119 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[7] 00120 : &ff_ivi_mb_vlc_tabs [7]; 00121 } else { 00122 huff_tab->tab_sel = get_bits(gb, 3); 00123 if (huff_tab->tab_sel == 7) { 00124 /* custom huffman table (explicitly encoded) */ 00125 new_huff.num_rows = get_bits(gb, 4); 00126 00127 for (i = 0; i < new_huff.num_rows; i++) 00128 new_huff.xbits[i] = get_bits(gb, 4); 00129 00130 /* Have we got the same custom table? Rebuild if not. */ 00131 if (ff_ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) { 00132 ff_ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff); 00133 00134 if (huff_tab->cust_tab.table) 00135 free_vlc(&huff_tab->cust_tab); 00136 result = ff_ivi_create_huff_from_desc(&huff_tab->cust_desc, 00137 &huff_tab->cust_tab, 0); 00138 if (result) { 00139 av_log(avctx, AV_LOG_ERROR, 00140 "Error while initializing custom vlc table!\n"); 00141 return -1; 00142 } 00143 } 00144 huff_tab->tab = &huff_tab->cust_tab; 00145 } else { 00146 /* select one of predefined tables */ 00147 huff_tab->tab = (which_tab) ? &ff_ivi_blk_vlc_tabs[huff_tab->tab_sel] 00148 : &ff_ivi_mb_vlc_tabs [huff_tab->tab_sel]; 00149 } 00150 } 00151 00152 return 0; 00153 } 00154 00155 int ff_ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2) 00156 { 00157 return desc1->num_rows != desc2->num_rows 00158 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows); 00159 } 00160 00161 void ff_ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src) 00162 { 00163 dst->num_rows = src->num_rows; 00164 memcpy(dst->xbits, src->xbits, src->num_rows); 00165 } 00166 00167 int av_cold ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg) 00168 { 00169 int p, b; 00170 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size; 00171 IVIBandDesc *band; 00172 00173 ff_ivi_free_buffers(planes); 00174 00175 /* fill in the descriptor of the luminance plane */ 00176 planes[0].width = cfg->pic_width; 00177 planes[0].height = cfg->pic_height; 00178 planes[0].num_bands = cfg->luma_bands; 00179 00180 /* fill in the descriptors of the chrominance planes */ 00181 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2; 00182 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2; 00183 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands; 00184 00185 for (p = 0; p < 3; p++) { 00186 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc)); 00187 if (!planes[p].bands) 00188 return AVERROR(ENOMEM); 00189 00190 /* select band dimensions: if there is only one band then it 00191 * has the full size, if there are several bands each of them 00192 * has only half size */ 00193 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1; 00194 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1; 00195 00196 /* luma band buffers will be aligned on 16x16 (max macroblock size) */ 00197 /* chroma band buffers will be aligned on 8x8 (max macroblock size) */ 00198 align_fac = p ? 8 : 16; 00199 width_aligned = FFALIGN(b_width , align_fac); 00200 height_aligned = FFALIGN(b_height, align_fac); 00201 buf_size = width_aligned * height_aligned * sizeof(int16_t); 00202 00203 for (b = 0; b < planes[p].num_bands; b++) { 00204 band = &planes[p].bands[b]; /* select appropriate plane/band */ 00205 band->plane = p; 00206 band->band_num = b; 00207 band->width = b_width; 00208 band->height = b_height; 00209 band->pitch = width_aligned; 00210 band->bufs[0] = av_malloc(buf_size); 00211 band->bufs[1] = av_malloc(buf_size); 00212 if (!band->bufs[0] || !band->bufs[1]) 00213 return AVERROR(ENOMEM); 00214 00215 /* allocate the 3rd band buffer for scalability mode */ 00216 if (cfg->luma_bands > 1) { 00217 band->bufs[2] = av_malloc(buf_size); 00218 if (!band->bufs[2]) 00219 return AVERROR(ENOMEM); 00220 } 00221 00222 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0; /* reset custom vlc */ 00223 } 00224 } 00225 00226 return 0; 00227 } 00228 00229 void av_cold ff_ivi_free_buffers(IVIPlaneDesc *planes) 00230 { 00231 int p, b, t; 00232 00233 for (p = 0; p < 3; p++) { 00234 for (b = 0; b < planes[p].num_bands; b++) { 00235 av_freep(&planes[p].bands[b].bufs[0]); 00236 av_freep(&planes[p].bands[b].bufs[1]); 00237 av_freep(&planes[p].bands[b].bufs[2]); 00238 00239 if (planes[p].bands[b].blk_vlc.cust_tab.table) 00240 free_vlc(&planes[p].bands[b].blk_vlc.cust_tab); 00241 for (t = 0; t < planes[p].bands[b].num_tiles; t++) 00242 av_freep(&planes[p].bands[b].tiles[t].mbs); 00243 av_freep(&planes[p].bands[b].tiles); 00244 } 00245 av_freep(&planes[p].bands); 00246 } 00247 } 00248 00249 int av_cold ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height) 00250 { 00251 int p, b, x, y, x_tiles, y_tiles, t_width, t_height; 00252 IVIBandDesc *band; 00253 IVITile *tile, *ref_tile; 00254 00255 for (p = 0; p < 3; p++) { 00256 t_width = !p ? tile_width : (tile_width + 3) >> 2; 00257 t_height = !p ? tile_height : (tile_height + 3) >> 2; 00258 00259 if (!p && planes[0].num_bands == 4) { 00260 t_width >>= 1; 00261 t_height >>= 1; 00262 } 00263 00264 for (b = 0; b < planes[p].num_bands; b++) { 00265 band = &planes[p].bands[b]; 00266 x_tiles = IVI_NUM_TILES(band->width, t_width); 00267 y_tiles = IVI_NUM_TILES(band->height, t_height); 00268 band->num_tiles = x_tiles * y_tiles; 00269 00270 av_freep(&band->tiles); 00271 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile)); 00272 if (!band->tiles) 00273 return AVERROR(ENOMEM); 00274 00275 tile = band->tiles; 00276 00277 /* use the first luma band as reference for motion vectors 00278 * and quant */ 00279 ref_tile = planes[0].bands[0].tiles; 00280 00281 for (y = 0; y < band->height; y += t_height) { 00282 for (x = 0; x < band->width; x += t_width) { 00283 tile->xpos = x; 00284 tile->ypos = y; 00285 tile->width = FFMIN(band->width - x, t_width); 00286 tile->height = FFMIN(band->height - y, t_height); 00287 tile->is_empty = tile->data_size = 0; 00288 /* calculate number of macroblocks */ 00289 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height, 00290 band->mb_size); 00291 00292 av_freep(&tile->mbs); 00293 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo)); 00294 if (!tile->mbs) 00295 return AVERROR(ENOMEM); 00296 00297 tile->ref_mbs = 0; 00298 if (p || b) { 00299 tile->ref_mbs = ref_tile->mbs; 00300 ref_tile++; 00301 } 00302 00303 tile++; 00304 } 00305 } 00306 00307 }// for b 00308 }// for p 00309 00310 return 0; 00311 } 00312 00313 int ff_ivi_dec_tile_data_size(GetBitContext *gb) 00314 { 00315 int len; 00316 00317 len = 0; 00318 if (get_bits1(gb)) { 00319 len = get_bits(gb, 8); 00320 if (len == 255) 00321 len = get_bits_long(gb, 24); 00322 } 00323 00324 /* align the bitstream reader on the byte boundary */ 00325 align_get_bits(gb); 00326 00327 return len; 00328 } 00329 00330 int ff_ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile) 00331 { 00332 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val, 00333 pos, is_intra, mc_type, mv_x, mv_y, col_mask; 00334 uint8_t col_flags[8]; 00335 int32_t prev_dc, trvec[64]; 00336 uint32_t cbp, sym, lo, hi, quant, buf_offs, q; 00337 IVIMbInfo *mb; 00338 RVMapDesc *rvmap = band->rv_map; 00339 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); 00340 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type); 00341 const uint16_t *base_tab; 00342 const uint8_t *scale_tab; 00343 00344 prev_dc = 0; /* init intra prediction for the DC coefficient */ 00345 00346 blk_size = band->blk_size; 00347 col_mask = blk_size - 1; /* column mask for tracking non-zero coeffs */ 00348 num_blocks = (band->mb_size != blk_size) ? 4 : 1; /* number of blocks per mb */ 00349 num_coeffs = blk_size * blk_size; 00350 if (blk_size == 8) { 00351 mc_with_delta_func = ff_ivi_mc_8x8_delta; 00352 mc_no_delta_func = ff_ivi_mc_8x8_no_delta; 00353 } else { 00354 mc_with_delta_func = ff_ivi_mc_4x4_delta; 00355 mc_no_delta_func = ff_ivi_mc_4x4_no_delta; 00356 } 00357 00358 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 00359 is_intra = !mb->type; 00360 cbp = mb->cbp; 00361 buf_offs = mb->buf_offs; 00362 00363 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23); 00364 00365 base_tab = is_intra ? band->intra_base : band->inter_base; 00366 scale_tab = is_intra ? band->intra_scale : band->inter_scale; 00367 if (scale_tab) 00368 quant = scale_tab[quant]; 00369 00370 if (!is_intra) { 00371 mv_x = mb->mv_x; 00372 mv_y = mb->mv_y; 00373 if (!band->is_halfpel) { 00374 mc_type = 0; /* we have only fullpel vectors */ 00375 } else { 00376 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 00377 mv_x >>= 1; 00378 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 00379 } 00380 } 00381 00382 for (blk = 0; blk < num_blocks; blk++) { 00383 /* adjust block position in the buffer according to its number */ 00384 if (blk & 1) { 00385 buf_offs += blk_size; 00386 } else if (blk == 2) { 00387 buf_offs -= blk_size; 00388 buf_offs += blk_size * band->pitch; 00389 } 00390 00391 if (cbp & 1) { /* block coded ? */ 00392 if (!band->scan) { 00393 av_log(NULL, AV_LOG_ERROR, "Scan pattern is not set.\n"); 00394 return AVERROR_INVALIDDATA; 00395 } 00396 00397 scan_pos = -1; 00398 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */ 00399 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */ 00400 00401 while (scan_pos <= num_coeffs) { 00402 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00403 if (sym == rvmap->eob_sym) 00404 break; /* End of block */ 00405 00406 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */ 00407 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1; 00408 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00409 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00410 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */ 00411 } else { 00412 if (sym >= 256U) { 00413 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym); 00414 return -1; 00415 } 00416 run = rvmap->runtab[sym]; 00417 val = rvmap->valtab[sym]; 00418 } 00419 00420 /* de-zigzag and dequantize */ 00421 scan_pos += run; 00422 if (scan_pos >= num_coeffs) 00423 break; 00424 pos = band->scan[scan_pos]; 00425 00426 if (!val) 00427 av_dlog(NULL, "Val = 0 encountered!\n"); 00428 00429 q = (base_tab[pos] * quant) >> 9; 00430 if (q > 1) 00431 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1); 00432 trvec[pos] = val; 00433 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */ 00434 }// while 00435 00436 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym) 00437 return -1; /* corrupt block data */ 00438 00439 /* undoing DC coeff prediction for intra-blocks */ 00440 if (is_intra && band->is_2d_trans) { 00441 prev_dc += trvec[0]; 00442 trvec[0] = prev_dc; 00443 col_flags[0] |= !!prev_dc; 00444 } 00445 00446 /* apply inverse transform */ 00447 band->inv_transform(trvec, band->buf + buf_offs, 00448 band->pitch, col_flags); 00449 00450 /* apply motion compensation */ 00451 if (!is_intra) 00452 mc_with_delta_func(band->buf + buf_offs, 00453 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 00454 band->pitch, mc_type); 00455 } else { 00456 /* block not coded */ 00457 /* for intra blocks apply the dc slant transform */ 00458 /* for inter - perform the motion compensation without delta */ 00459 if (is_intra && band->dc_transform) { 00460 band->dc_transform(&prev_dc, band->buf + buf_offs, 00461 band->pitch, blk_size); 00462 } else 00463 mc_no_delta_func(band->buf + buf_offs, 00464 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 00465 band->pitch, mc_type); 00466 } 00467 00468 cbp >>= 1; 00469 }// for blk 00470 }// for mbn 00471 00472 align_get_bits(gb); 00473 00474 return 0; 00475 } 00476 00477 int ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, 00478 IVITile *tile, int32_t mv_scale) 00479 { 00480 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; 00481 int offs, mb_offset, row_offset; 00482 IVIMbInfo *mb, *ref_mb; 00483 const int16_t *src; 00484 int16_t *dst; 00485 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, 00486 int mc_type); 00487 00488 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { 00489 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches " 00490 "parameters %d in ivi_process_empty_tile()\n", 00491 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); 00492 return AVERROR_INVALIDDATA; 00493 } 00494 00495 offs = tile->ypos * band->pitch + tile->xpos; 00496 mb = tile->mbs; 00497 ref_mb = tile->ref_mbs; 00498 row_offset = band->mb_size * band->pitch; 00499 need_mc = 0; /* reset the mc tracking flag */ 00500 00501 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) { 00502 mb_offset = offs; 00503 00504 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) { 00505 mb->xpos = x; 00506 mb->ypos = y; 00507 mb->buf_offs = mb_offset; 00508 00509 mb->type = 1; /* set the macroblocks type = INTER */ 00510 mb->cbp = 0; /* all blocks are empty */ 00511 00512 if (!band->qdelta_present && !band->plane && !band->band_num) { 00513 mb->q_delta = band->glob_quant; 00514 mb->mv_x = 0; 00515 mb->mv_y = 0; 00516 } 00517 00518 if (band->inherit_qdelta && ref_mb) 00519 mb->q_delta = ref_mb->q_delta; 00520 00521 if (band->inherit_mv) { 00522 /* motion vector inheritance */ 00523 if (mv_scale) { 00524 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); 00525 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); 00526 } else { 00527 mb->mv_x = ref_mb->mv_x; 00528 mb->mv_y = ref_mb->mv_y; 00529 } 00530 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */ 00531 } 00532 00533 mb++; 00534 if (ref_mb) 00535 ref_mb++; 00536 mb_offset += band->mb_size; 00537 } // for x 00538 offs += row_offset; 00539 } // for y 00540 00541 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */ 00542 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */ 00543 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta 00544 : ff_ivi_mc_4x4_no_delta; 00545 00546 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 00547 mv_x = mb->mv_x; 00548 mv_y = mb->mv_y; 00549 if (!band->is_halfpel) { 00550 mc_type = 0; /* we have only fullpel vectors */ 00551 } else { 00552 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 00553 mv_x >>= 1; 00554 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 00555 } 00556 00557 for (blk = 0; blk < num_blocks; blk++) { 00558 /* adjust block position in the buffer according with its number */ 00559 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch); 00560 mc_no_delta_func(band->buf + offs, 00561 band->ref_buf + offs + mv_y * band->pitch + mv_x, 00562 band->pitch, mc_type); 00563 } 00564 } 00565 } else { 00566 /* copy data from the reference tile into the current one */ 00567 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos; 00568 dst = band->buf + tile->ypos * band->pitch + tile->xpos; 00569 for (y = 0; y < tile->height; y++) { 00570 memcpy(dst, src, tile->width*sizeof(band->buf[0])); 00571 src += band->pitch; 00572 dst += band->pitch; 00573 } 00574 } 00575 00576 return 0; 00577 } 00578 00579 00580 #ifdef DEBUG 00581 uint16_t ivi_calc_band_checksum (IVIBandDesc *band) 00582 { 00583 int x, y; 00584 int16_t *src, checksum; 00585 00586 src = band->buf; 00587 checksum = 0; 00588 00589 for (y = 0; y < band->height; src += band->pitch, y++) 00590 for (x = 0; x < band->width; x++) 00591 checksum += src[x]; 00592 00593 return checksum; 00594 } 00595 00596 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) 00597 { 00598 int x, y, result; 00599 uint8_t t1, t2; 00600 int16_t *src; 00601 00602 src = band->buf; 00603 result = 0; 00604 00605 for (y = 0; y < band->height; src += band->pitch, y++) { 00606 for (x = 0; x < band->width; x++) { 00607 t1 = av_clip(src[x] + 128, 0, 255); 00608 t2 = ref[x]; 00609 if (t1 != t2) { 00610 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", 00611 y / band->blk_size, x / band->blk_size); 00612 result = -1; 00613 } 00614 } 00615 ref += pitch; 00616 } 00617 00618 return result; 00619 } 00620 #endif 00621 00622 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) 00623 { 00624 int x, y; 00625 const int16_t *src = plane->bands[0].buf; 00626 uint32_t pitch = plane->bands[0].pitch; 00627 00628 for (y = 0; y < plane->height; y++) { 00629 for (x = 0; x < plane->width; x++) 00630 dst[x] = av_clip_uint8(src[x] + 128); 00631 src += pitch; 00632 dst += dst_pitch; 00633 } 00634 } 00635 00636 00643 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = { 00644 {8, {0, 4, 5, 4, 4, 4, 6, 6}}, 00645 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}}, 00646 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}}, 00647 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}}, 00648 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}}, 00649 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}}, 00650 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}}, 00651 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}} 00652 }; 00653 00654 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = { 00655 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}}, 00656 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}}, 00657 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}}, 00658 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}}, 00659 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}}, 00660 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}}, 00661 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}}, 00662 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}} 00663 }; 00664 00665 00669 const uint8_t ff_ivi_vertical_scan_8x8[64] = { 00670 0, 8, 16, 24, 32, 40, 48, 56, 00671 1, 9, 17, 25, 33, 41, 49, 57, 00672 2, 10, 18, 26, 34, 42, 50, 58, 00673 3, 11, 19, 27, 35, 43, 51, 59, 00674 4, 12, 20, 28, 36, 44, 52, 60, 00675 5, 13, 21, 29, 37, 45, 53, 61, 00676 6, 14, 22, 30, 38, 46, 54, 62, 00677 7, 15, 23, 31, 39, 47, 55, 63 00678 }; 00679 00680 const uint8_t ff_ivi_horizontal_scan_8x8[64] = { 00681 0, 1, 2, 3, 4, 5, 6, 7, 00682 8, 9, 10, 11, 12, 13, 14, 15, 00683 16, 17, 18, 19, 20, 21, 22, 23, 00684 24, 25, 26, 27, 28, 29, 30, 31, 00685 32, 33, 34, 35, 36, 37, 38, 39, 00686 40, 41, 42, 43, 44, 45, 46, 47, 00687 48, 49, 50, 51, 52, 53, 54, 55, 00688 56, 57, 58, 59, 60, 61, 62, 63 00689 }; 00690 00691 const uint8_t ff_ivi_direct_scan_4x4[16] = { 00692 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 00693 }; 00694 00695 00699 const RVMapDesc ff_ivi_rvmap_tabs[9] = { 00700 { /* MapTab0 */ 00701 5, /* eob_sym */ 00702 2, /* esc_sym */ 00703 /* run table */ 00704 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, 00705 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, 00706 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, 00707 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, 00708 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, 00709 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, 00710 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, 00711 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, 00712 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, 00713 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, 00714 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, 00715 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, 00716 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, 00717 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, 00718 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, 00719 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38}, 00720 00721 /* value table */ 00722 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, 00723 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, 00724 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, 00725 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, 00726 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, 00727 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, 00728 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, 00729 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, 00730 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, 00731 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, 00732 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, 00733 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, 00734 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, 00735 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, 00736 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, 00737 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1} 00738 },{ 00739 /* MapTab1 */ 00740 0, /* eob_sym */ 00741 38, /* esc_sym */ 00742 /* run table */ 00743 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, 00744 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, 00745 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, 00746 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, 00747 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, 00748 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, 00749 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, 00750 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, 00751 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, 00752 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, 00753 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, 00754 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, 00755 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, 00756 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, 00757 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, 00758 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5}, 00759 00760 /* value table */ 00761 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 00762 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, 00763 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, 00764 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, 00765 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, 00766 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, 00767 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, 00768 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, 00769 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, 00770 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, 00771 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, 00772 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, 00773 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, 00774 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, 00775 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, 00776 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4} 00777 },{ 00778 /* MapTab2 */ 00779 2, /* eob_sym */ 00780 11, /* esc_sym */ 00781 /* run table */ 00782 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, 00783 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, 00784 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, 00785 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, 00786 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, 00787 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, 00788 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, 00789 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, 00790 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, 00791 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, 00792 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, 00793 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, 00794 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, 00795 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, 00796 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, 00797 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62}, 00798 00799 /* value table */ 00800 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, 00801 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, 00802 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, 00803 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, 00804 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, 00805 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, 00806 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, 00807 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, 00808 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, 00809 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, 00810 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, 00811 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, 00812 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, 00813 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, 00814 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, 00815 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1} 00816 },{ 00817 /* MapTab3 */ 00818 0, /* eob_sym */ 00819 35, /* esc_sym */ 00820 /* run table */ 00821 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, 00822 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, 00823 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, 00824 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, 00825 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, 00826 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, 00827 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, 00828 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, 00829 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, 00830 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, 00831 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, 00832 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, 00833 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, 00834 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, 00835 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, 00836 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16}, 00837 00838 /* value table */ 00839 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, 00840 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, 00841 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, 00842 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, 00843 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, 00844 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, 00845 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, 00846 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, 00847 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, 00848 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, 00849 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, 00850 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, 00851 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, 00852 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, 00853 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, 00854 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3} 00855 },{ 00856 /* MapTab4 */ 00857 0, /* eob_sym */ 00858 34, /* esc_sym */ 00859 /* run table */ 00860 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, 00861 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, 00862 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, 00863 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, 00864 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, 00865 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00866 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, 00867 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 00868 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 00869 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 00870 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, 00871 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 00872 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, 00873 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, 00874 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, 00875 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1}, 00876 00877 /* value table */ 00878 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, 00879 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, 00880 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, 00881 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, 00882 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, 00883 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, 00884 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, 00885 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, 00886 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, 00887 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, 00888 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, 00889 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, 00890 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, 00891 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, 00892 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, 00893 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89} 00894 },{ 00895 /* MapTab5 */ 00896 2, /* eob_sym */ 00897 33, /* esc_sym */ 00898 /* run table */ 00899 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, 00900 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, 00901 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, 00902 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, 00903 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, 00904 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, 00905 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, 00906 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, 00907 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, 00908 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, 00909 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, 00910 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, 00911 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, 00912 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, 00913 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, 00914 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7}, 00915 00916 /* value table */ 00917 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, 00918 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, 00919 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, 00920 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, 00921 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, 00922 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, 00923 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, 00924 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, 00925 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, 00926 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, 00927 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, 00928 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, 00929 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, 00930 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, 00931 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, 00932 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5} 00933 },{ 00934 /* MapTab6 */ 00935 2, /* eob_sym */ 00936 13, /* esc_sym */ 00937 /* run table */ 00938 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, 00939 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, 00940 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, 00941 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, 00942 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, 00943 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, 00944 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, 00945 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, 00946 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, 00947 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, 00948 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, 00949 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, 00950 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, 00951 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, 00952 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, 00953 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2}, 00954 00955 /* value table */ 00956 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, 00957 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, 00958 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, 00959 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, 00960 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, 00961 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, 00962 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, 00963 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, 00964 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, 00965 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, 00966 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, 00967 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, 00968 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, 00969 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, 00970 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, 00971 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14} 00972 },{ 00973 /* MapTab7 */ 00974 2, /* eob_sym */ 00975 38, /* esc_sym */ 00976 /* run table */ 00977 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, 00978 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, 00979 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, 00980 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, 00981 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, 00982 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, 00983 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, 00984 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, 00985 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, 00986 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, 00987 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, 00988 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, 00989 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, 00990 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, 00991 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, 00992 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49}, 00993 00994 /* value table */ 00995 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, 00996 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, 00997 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, 00998 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, 00999 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, 01000 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, 01001 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, 01002 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, 01003 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, 01004 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, 01005 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, 01006 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, 01007 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, 01008 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, 01009 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, 01010 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1} 01011 },{ 01012 /* MapTab8 */ 01013 4, /* eob_sym */ 01014 11, /* esc_sym */ 01015 /* run table */ 01016 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, 01017 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, 01018 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, 01019 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, 01020 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, 01021 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, 01022 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, 01023 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, 01024 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, 01025 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, 01026 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, 01027 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, 01028 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, 01029 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, 01030 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, 01031 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1}, 01032 01033 /* value table */ 01034 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, 01035 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, 01036 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, 01037 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, 01038 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, 01039 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, 01040 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, 01041 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, 01042 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, 01043 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, 01044 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, 01045 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, 01046 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, 01047 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, 01048 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, 01049 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26} 01050 } 01051 };