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 scan_pos = -1; 00393 memset(trvec, 0, num_coeffs*sizeof(trvec[0])); /* zero transform vector */ 00394 memset(col_flags, 0, sizeof(col_flags)); /* zero column flags */ 00395 00396 while (scan_pos <= num_coeffs) { 00397 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00398 if (sym == rvmap->eob_sym) 00399 break; /* End of block */ 00400 00401 if (sym == rvmap->esc_sym) { /* Escape - run/val explicitly coded using 3 vlc codes */ 00402 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1; 00403 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00404 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1); 00405 val = IVI_TOSIGNED((hi << 6) | lo); /* merge them and convert into signed val */ 00406 } else { 00407 if (sym >= 256U) { 00408 av_log(NULL, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym); 00409 return -1; 00410 } 00411 run = rvmap->runtab[sym]; 00412 val = rvmap->valtab[sym]; 00413 } 00414 00415 /* de-zigzag and dequantize */ 00416 scan_pos += run; 00417 if (scan_pos >= num_coeffs) 00418 break; 00419 pos = band->scan[scan_pos]; 00420 00421 if (!val) 00422 av_dlog(NULL, "Val = 0 encountered!\n"); 00423 00424 q = (base_tab[pos] * quant) >> 9; 00425 if (q > 1) 00426 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1); 00427 trvec[pos] = val; 00428 col_flags[pos & col_mask] |= !!val; /* track columns containing non-zero coeffs */ 00429 }// while 00430 00431 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym) 00432 return -1; /* corrupt block data */ 00433 00434 /* undoing DC coeff prediction for intra-blocks */ 00435 if (is_intra && band->is_2d_trans) { 00436 prev_dc += trvec[0]; 00437 trvec[0] = prev_dc; 00438 col_flags[0] |= !!prev_dc; 00439 } 00440 00441 /* apply inverse transform */ 00442 band->inv_transform(trvec, band->buf + buf_offs, 00443 band->pitch, col_flags); 00444 00445 /* apply motion compensation */ 00446 if (!is_intra) 00447 mc_with_delta_func(band->buf + buf_offs, 00448 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 00449 band->pitch, mc_type); 00450 } else { 00451 /* block not coded */ 00452 /* for intra blocks apply the dc slant transform */ 00453 /* for inter - perform the motion compensation without delta */ 00454 if (is_intra && band->dc_transform) { 00455 band->dc_transform(&prev_dc, band->buf + buf_offs, 00456 band->pitch, blk_size); 00457 } else 00458 mc_no_delta_func(band->buf + buf_offs, 00459 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x, 00460 band->pitch, mc_type); 00461 } 00462 00463 cbp >>= 1; 00464 }// for blk 00465 }// for mbn 00466 00467 align_get_bits(gb); 00468 00469 return 0; 00470 } 00471 00472 int ff_ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band, 00473 IVITile *tile, int32_t mv_scale) 00474 { 00475 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type; 00476 int offs, mb_offset, row_offset; 00477 IVIMbInfo *mb, *ref_mb; 00478 const int16_t *src; 00479 int16_t *dst; 00480 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, 00481 int mc_type); 00482 00483 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) { 00484 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches " 00485 "parameters %d in ivi_process_empty_tile()\n", 00486 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)); 00487 return AVERROR_INVALIDDATA; 00488 } 00489 00490 offs = tile->ypos * band->pitch + tile->xpos; 00491 mb = tile->mbs; 00492 ref_mb = tile->ref_mbs; 00493 row_offset = band->mb_size * band->pitch; 00494 need_mc = 0; /* reset the mc tracking flag */ 00495 00496 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) { 00497 mb_offset = offs; 00498 00499 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) { 00500 mb->xpos = x; 00501 mb->ypos = y; 00502 mb->buf_offs = mb_offset; 00503 00504 mb->type = 1; /* set the macroblocks type = INTER */ 00505 mb->cbp = 0; /* all blocks are empty */ 00506 00507 if (!band->qdelta_present && !band->plane && !band->band_num) { 00508 mb->q_delta = band->glob_quant; 00509 mb->mv_x = 0; 00510 mb->mv_y = 0; 00511 } 00512 00513 if (band->inherit_qdelta && ref_mb) 00514 mb->q_delta = ref_mb->q_delta; 00515 00516 if (band->inherit_mv) { 00517 /* motion vector inheritance */ 00518 if (mv_scale) { 00519 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); 00520 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); 00521 } else { 00522 mb->mv_x = ref_mb->mv_x; 00523 mb->mv_y = ref_mb->mv_y; 00524 } 00525 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */ 00526 } 00527 00528 mb++; 00529 if (ref_mb) 00530 ref_mb++; 00531 mb_offset += band->mb_size; 00532 } // for x 00533 offs += row_offset; 00534 } // for y 00535 00536 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */ 00537 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */ 00538 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta 00539 : ff_ivi_mc_4x4_no_delta; 00540 00541 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 00542 mv_x = mb->mv_x; 00543 mv_y = mb->mv_y; 00544 if (!band->is_halfpel) { 00545 mc_type = 0; /* we have only fullpel vectors */ 00546 } else { 00547 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 00548 mv_x >>= 1; 00549 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 00550 } 00551 00552 for (blk = 0; blk < num_blocks; blk++) { 00553 /* adjust block position in the buffer according with its number */ 00554 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch); 00555 mc_no_delta_func(band->buf + offs, 00556 band->ref_buf + offs + mv_y * band->pitch + mv_x, 00557 band->pitch, mc_type); 00558 } 00559 } 00560 } else { 00561 /* copy data from the reference tile into the current one */ 00562 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos; 00563 dst = band->buf + tile->ypos * band->pitch + tile->xpos; 00564 for (y = 0; y < tile->height; y++) { 00565 memcpy(dst, src, tile->width*sizeof(band->buf[0])); 00566 src += band->pitch; 00567 dst += band->pitch; 00568 } 00569 } 00570 00571 return 0; 00572 } 00573 00574 00575 #ifdef DEBUG 00576 uint16_t ivi_calc_band_checksum (IVIBandDesc *band) 00577 { 00578 int x, y; 00579 int16_t *src, checksum; 00580 00581 src = band->buf; 00582 checksum = 0; 00583 00584 for (y = 0; y < band->height; src += band->pitch, y++) 00585 for (x = 0; x < band->width; x++) 00586 checksum += src[x]; 00587 00588 return checksum; 00589 } 00590 00591 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) 00592 { 00593 int x, y, result; 00594 uint8_t t1, t2; 00595 int16_t *src; 00596 00597 src = band->buf; 00598 result = 0; 00599 00600 for (y = 0; y < band->height; src += band->pitch, y++) { 00601 for (x = 0; x < band->width; x++) { 00602 t1 = av_clip(src[x] + 128, 0, 255); 00603 t2 = ref[x]; 00604 if (t1 != t2) { 00605 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", 00606 y / band->blk_size, x / band->blk_size); 00607 result = -1; 00608 } 00609 } 00610 ref += pitch; 00611 } 00612 00613 return result; 00614 } 00615 #endif 00616 00617 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) 00618 { 00619 int x, y; 00620 const int16_t *src = plane->bands[0].buf; 00621 uint32_t pitch = plane->bands[0].pitch; 00622 00623 for (y = 0; y < plane->height; y++) { 00624 for (x = 0; x < plane->width; x++) 00625 dst[x] = av_clip_uint8(src[x] + 128); 00626 src += pitch; 00627 dst += dst_pitch; 00628 } 00629 } 00630 00631 00638 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = { 00639 {8, {0, 4, 5, 4, 4, 4, 6, 6}}, 00640 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}}, 00641 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}}, 00642 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}}, 00643 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}}, 00644 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}}, 00645 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}}, 00646 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}} 00647 }; 00648 00649 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = { 00650 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}}, 00651 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}}, 00652 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}}, 00653 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}}, 00654 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}}, 00655 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}}, 00656 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}}, 00657 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}} 00658 }; 00659 00660 00664 const uint8_t ff_ivi_vertical_scan_8x8[64] = { 00665 0, 8, 16, 24, 32, 40, 48, 56, 00666 1, 9, 17, 25, 33, 41, 49, 57, 00667 2, 10, 18, 26, 34, 42, 50, 58, 00668 3, 11, 19, 27, 35, 43, 51, 59, 00669 4, 12, 20, 28, 36, 44, 52, 60, 00670 5, 13, 21, 29, 37, 45, 53, 61, 00671 6, 14, 22, 30, 38, 46, 54, 62, 00672 7, 15, 23, 31, 39, 47, 55, 63 00673 }; 00674 00675 const uint8_t ff_ivi_horizontal_scan_8x8[64] = { 00676 0, 1, 2, 3, 4, 5, 6, 7, 00677 8, 9, 10, 11, 12, 13, 14, 15, 00678 16, 17, 18, 19, 20, 21, 22, 23, 00679 24, 25, 26, 27, 28, 29, 30, 31, 00680 32, 33, 34, 35, 36, 37, 38, 39, 00681 40, 41, 42, 43, 44, 45, 46, 47, 00682 48, 49, 50, 51, 52, 53, 54, 55, 00683 56, 57, 58, 59, 60, 61, 62, 63 00684 }; 00685 00686 const uint8_t ff_ivi_direct_scan_4x4[16] = { 00687 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 00688 }; 00689 00690 00694 const RVMapDesc ff_ivi_rvmap_tabs[9] = { 00695 { /* MapTab0 */ 00696 5, /* eob_sym */ 00697 2, /* esc_sym */ 00698 /* run table */ 00699 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, 00700 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, 00701 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, 00702 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, 00703 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, 00704 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, 00705 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, 00706 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, 00707 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, 00708 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, 00709 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, 00710 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, 00711 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, 00712 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, 00713 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, 00714 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38}, 00715 00716 /* value table */ 00717 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, 00718 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, 00719 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, 00720 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, 00721 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, 00722 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, 00723 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, 00724 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, 00725 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, 00726 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, 00727 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, 00728 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, 00729 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, 00730 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, 00731 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, 00732 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1} 00733 },{ 00734 /* MapTab1 */ 00735 0, /* eob_sym */ 00736 38, /* esc_sym */ 00737 /* run table */ 00738 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, 00739 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, 00740 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, 00741 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, 00742 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, 00743 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, 00744 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, 00745 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, 00746 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, 00747 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, 00748 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, 00749 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, 00750 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, 00751 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, 00752 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, 00753 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5}, 00754 00755 /* value table */ 00756 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 00757 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, 00758 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, 00759 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, 00760 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, 00761 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, 00762 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, 00763 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, 00764 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, 00765 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, 00766 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, 00767 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, 00768 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, 00769 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, 00770 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, 00771 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4} 00772 },{ 00773 /* MapTab2 */ 00774 2, /* eob_sym */ 00775 11, /* esc_sym */ 00776 /* run table */ 00777 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, 00778 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, 00779 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, 00780 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, 00781 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, 00782 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, 00783 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, 00784 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, 00785 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, 00786 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, 00787 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, 00788 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, 00789 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, 00790 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, 00791 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, 00792 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62}, 00793 00794 /* value table */ 00795 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, 00796 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, 00797 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, 00798 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, 00799 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, 00800 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, 00801 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, 00802 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, 00803 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, 00804 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, 00805 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, 00806 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, 00807 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, 00808 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, 00809 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, 00810 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1} 00811 },{ 00812 /* MapTab3 */ 00813 0, /* eob_sym */ 00814 35, /* esc_sym */ 00815 /* run table */ 00816 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, 00817 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, 00818 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, 00819 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, 00820 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, 00821 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, 00822 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, 00823 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, 00824 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, 00825 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, 00826 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, 00827 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, 00828 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, 00829 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, 00830 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, 00831 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16}, 00832 00833 /* value table */ 00834 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, 00835 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, 00836 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, 00837 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, 00838 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, 00839 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, 00840 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, 00841 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, 00842 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, 00843 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, 00844 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, 00845 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, 00846 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, 00847 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, 00848 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, 00849 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3} 00850 },{ 00851 /* MapTab4 */ 00852 0, /* eob_sym */ 00853 34, /* esc_sym */ 00854 /* run table */ 00855 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, 00856 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, 00857 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, 00858 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, 00859 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, 00860 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00861 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, 00862 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 00863 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 00864 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 00865 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, 00866 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 00867 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, 00868 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, 00869 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, 00870 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1}, 00871 00872 /* value table */ 00873 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, 00874 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, 00875 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, 00876 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, 00877 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, 00878 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, 00879 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, 00880 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, 00881 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, 00882 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, 00883 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, 00884 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, 00885 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, 00886 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, 00887 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, 00888 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89} 00889 },{ 00890 /* MapTab5 */ 00891 2, /* eob_sym */ 00892 33, /* esc_sym */ 00893 /* run table */ 00894 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, 00895 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, 00896 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, 00897 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, 00898 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, 00899 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, 00900 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, 00901 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, 00902 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, 00903 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, 00904 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, 00905 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, 00906 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, 00907 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, 00908 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, 00909 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7}, 00910 00911 /* value table */ 00912 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, 00913 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, 00914 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, 00915 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, 00916 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, 00917 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, 00918 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, 00919 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, 00920 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, 00921 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, 00922 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, 00923 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, 00924 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, 00925 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, 00926 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, 00927 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5} 00928 },{ 00929 /* MapTab6 */ 00930 2, /* eob_sym */ 00931 13, /* esc_sym */ 00932 /* run table */ 00933 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, 00934 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, 00935 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, 00936 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, 00937 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, 00938 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, 00939 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, 00940 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, 00941 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, 00942 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, 00943 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, 00944 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, 00945 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, 00946 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, 00947 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, 00948 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2}, 00949 00950 /* value table */ 00951 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, 00952 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, 00953 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, 00954 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, 00955 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, 00956 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, 00957 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, 00958 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, 00959 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, 00960 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, 00961 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, 00962 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, 00963 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, 00964 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, 00965 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, 00966 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14} 00967 },{ 00968 /* MapTab7 */ 00969 2, /* eob_sym */ 00970 38, /* esc_sym */ 00971 /* run table */ 00972 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, 00973 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, 00974 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, 00975 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, 00976 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, 00977 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, 00978 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, 00979 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, 00980 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, 00981 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, 00982 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, 00983 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, 00984 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, 00985 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, 00986 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, 00987 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49}, 00988 00989 /* value table */ 00990 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, 00991 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, 00992 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, 00993 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, 00994 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, 00995 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, 00996 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, 00997 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, 00998 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, 00999 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, 01000 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, 01001 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, 01002 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, 01003 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, 01004 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, 01005 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1} 01006 },{ 01007 /* MapTab8 */ 01008 4, /* eob_sym */ 01009 11, /* esc_sym */ 01010 /* run table */ 01011 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, 01012 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, 01013 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, 01014 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, 01015 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, 01016 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, 01017 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, 01018 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, 01019 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, 01020 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, 01021 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, 01022 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, 01023 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, 01024 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, 01025 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, 01026 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1}, 01027 01028 /* value table */ 01029 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, 01030 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, 01031 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, 01032 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, 01033 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, 01034 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, 01035 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, 01036 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, 01037 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, 01038 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, 01039 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, 01040 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, 01041 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, 01042 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, 01043 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, 01044 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26} 01045 } 01046 };