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 void 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 offs = tile->ypos * band->pitch + tile->xpos; 00484 mb = tile->mbs; 00485 ref_mb = tile->ref_mbs; 00486 row_offset = band->mb_size * band->pitch; 00487 need_mc = 0; /* reset the mc tracking flag */ 00488 00489 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) { 00490 mb_offset = offs; 00491 00492 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) { 00493 mb->xpos = x; 00494 mb->ypos = y; 00495 mb->buf_offs = mb_offset; 00496 00497 mb->type = 1; /* set the macroblocks type = INTER */ 00498 mb->cbp = 0; /* all blocks are empty */ 00499 00500 if (!band->qdelta_present && !band->plane && !band->band_num) { 00501 mb->q_delta = band->glob_quant; 00502 mb->mv_x = 0; 00503 mb->mv_y = 0; 00504 } 00505 00506 if (band->inherit_qdelta && ref_mb) 00507 mb->q_delta = ref_mb->q_delta; 00508 00509 if (band->inherit_mv) { 00510 /* motion vector inheritance */ 00511 if (mv_scale) { 00512 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale); 00513 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale); 00514 } else { 00515 mb->mv_x = ref_mb->mv_x; 00516 mb->mv_y = ref_mb->mv_y; 00517 } 00518 need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */ 00519 } 00520 00521 mb++; 00522 if (ref_mb) 00523 ref_mb++; 00524 mb_offset += band->mb_size; 00525 } // for x 00526 offs += row_offset; 00527 } // for y 00528 00529 if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */ 00530 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */ 00531 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta 00532 : ff_ivi_mc_4x4_no_delta; 00533 00534 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) { 00535 mv_x = mb->mv_x; 00536 mv_y = mb->mv_y; 00537 if (!band->is_halfpel) { 00538 mc_type = 0; /* we have only fullpel vectors */ 00539 } else { 00540 mc_type = ((mv_y & 1) << 1) | (mv_x & 1); 00541 mv_x >>= 1; 00542 mv_y >>= 1; /* convert halfpel vectors into fullpel ones */ 00543 } 00544 00545 for (blk = 0; blk < num_blocks; blk++) { 00546 /* adjust block position in the buffer according with its number */ 00547 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch); 00548 mc_no_delta_func(band->buf + offs, 00549 band->ref_buf + offs + mv_y * band->pitch + mv_x, 00550 band->pitch, mc_type); 00551 } 00552 } 00553 } else { 00554 /* copy data from the reference tile into the current one */ 00555 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos; 00556 dst = band->buf + tile->ypos * band->pitch + tile->xpos; 00557 for (y = 0; y < tile->height; y++) { 00558 memcpy(dst, src, tile->width*sizeof(band->buf[0])); 00559 src += band->pitch; 00560 dst += band->pitch; 00561 } 00562 } 00563 } 00564 00565 00566 #ifdef DEBUG 00567 uint16_t ivi_calc_band_checksum (IVIBandDesc *band) 00568 { 00569 int x, y; 00570 int16_t *src, checksum; 00571 00572 src = band->buf; 00573 checksum = 0; 00574 00575 for (y = 0; y < band->height; src += band->pitch, y++) 00576 for (x = 0; x < band->width; x++) 00577 checksum += src[x]; 00578 00579 return checksum; 00580 } 00581 00582 int ivi_check_band (IVIBandDesc *band, const uint8_t *ref, int pitch) 00583 { 00584 int x, y, result; 00585 uint8_t t1, t2; 00586 int16_t *src; 00587 00588 src = band->buf; 00589 result = 0; 00590 00591 for (y = 0; y < band->height; src += band->pitch, y++) { 00592 for (x = 0; x < band->width; x++) { 00593 t1 = av_clip(src[x] + 128, 0, 255); 00594 t2 = ref[x]; 00595 if (t1 != t2) { 00596 av_log(NULL, AV_LOG_ERROR, "Data mismatch: row %d, column %d\n", 00597 y / band->blk_size, x / band->blk_size); 00598 result = -1; 00599 } 00600 } 00601 ref += pitch; 00602 } 00603 00604 return result; 00605 } 00606 #endif 00607 00608 void ff_ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch) 00609 { 00610 int x, y; 00611 const int16_t *src = plane->bands[0].buf; 00612 uint32_t pitch = plane->bands[0].pitch; 00613 00614 for (y = 0; y < plane->height; y++) { 00615 for (x = 0; x < plane->width; x++) 00616 dst[x] = av_clip_uint8(src[x] + 128); 00617 src += pitch; 00618 dst += dst_pitch; 00619 } 00620 } 00621 00622 00629 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = { 00630 {8, {0, 4, 5, 4, 4, 4, 6, 6}}, 00631 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}}, 00632 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}}, 00633 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}}, 00634 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}}, 00635 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}}, 00636 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}}, 00637 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}} 00638 }; 00639 00640 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = { 00641 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}}, 00642 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}}, 00643 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}}, 00644 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}}, 00645 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}}, 00646 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}}, 00647 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}}, 00648 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}} 00649 }; 00650 00651 00655 const uint8_t ff_ivi_vertical_scan_8x8[64] = { 00656 0, 8, 16, 24, 32, 40, 48, 56, 00657 1, 9, 17, 25, 33, 41, 49, 57, 00658 2, 10, 18, 26, 34, 42, 50, 58, 00659 3, 11, 19, 27, 35, 43, 51, 59, 00660 4, 12, 20, 28, 36, 44, 52, 60, 00661 5, 13, 21, 29, 37, 45, 53, 61, 00662 6, 14, 22, 30, 38, 46, 54, 62, 00663 7, 15, 23, 31, 39, 47, 55, 63 00664 }; 00665 00666 const uint8_t ff_ivi_horizontal_scan_8x8[64] = { 00667 0, 1, 2, 3, 4, 5, 6, 7, 00668 8, 9, 10, 11, 12, 13, 14, 15, 00669 16, 17, 18, 19, 20, 21, 22, 23, 00670 24, 25, 26, 27, 28, 29, 30, 31, 00671 32, 33, 34, 35, 36, 37, 38, 39, 00672 40, 41, 42, 43, 44, 45, 46, 47, 00673 48, 49, 50, 51, 52, 53, 54, 55, 00674 56, 57, 58, 59, 60, 61, 62, 63 00675 }; 00676 00677 const uint8_t ff_ivi_direct_scan_4x4[16] = { 00678 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 00679 }; 00680 00681 00685 const RVMapDesc ff_ivi_rvmap_tabs[9] = { 00686 { /* MapTab0 */ 00687 5, /* eob_sym */ 00688 2, /* esc_sym */ 00689 /* run table */ 00690 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3, 00691 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5, 00692 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1, 00693 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9, 00694 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3, 00695 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12, 00696 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13, 00697 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8, 00698 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8, 00699 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21, 00700 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8, 00701 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6, 00702 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28, 00703 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41, 00704 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1, 00705 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38}, 00706 00707 /* value table */ 00708 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1, 00709 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1, 00710 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13, 00711 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1, 00712 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4, 00713 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1, 00714 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1, 00715 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3, 00716 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4, 00717 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1, 00718 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5, 00719 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4, 00720 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1, 00721 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1, 00722 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40, 00723 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1} 00724 },{ 00725 /* MapTab1 */ 00726 0, /* eob_sym */ 00727 38, /* esc_sym */ 00728 /* run table */ 00729 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7, 00730 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16, 00731 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22, 00732 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27, 00733 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34, 00734 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38, 00735 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44, 00736 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1, 00737 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64, 00738 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13, 00739 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4, 00740 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25, 00741 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33, 00742 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3, 00743 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41, 00744 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5}, 00745 00746 /* value table */ 00747 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 00748 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1, 00749 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1, 00750 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1, 00751 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1, 00752 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1, 00753 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1, 00754 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4, 00755 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1, 00756 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2, 00757 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3, 00758 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2, 00759 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2, 00760 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4, 00761 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2, 00762 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4} 00763 },{ 00764 /* MapTab2 */ 00765 2, /* eob_sym */ 00766 11, /* esc_sym */ 00767 /* run table */ 00768 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5, 00769 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2, 00770 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13, 00771 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7, 00772 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3, 00773 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22, 00774 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32, 00775 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31, 00776 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3, 00777 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57, 00778 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2, 00779 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1, 00780 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17, 00781 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55, 00782 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4, 00783 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62}, 00784 00785 /* value table */ 00786 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1, 00787 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3, 00788 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1, 00789 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2, 00790 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4, 00791 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1, 00792 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1, 00793 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1, 00794 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5, 00795 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1, 00796 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7, 00797 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13, 00798 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2, 00799 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1, 00800 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6, 00801 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1} 00802 },{ 00803 /* MapTab3 */ 00804 0, /* eob_sym */ 00805 35, /* esc_sym */ 00806 /* run table */ 00807 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7, 00808 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3, 00809 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1, 00810 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20, 00811 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26, 00812 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32, 00813 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41, 00814 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40, 00815 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16, 00816 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48, 00817 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51, 00818 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59, 00819 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60, 00820 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4, 00821 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1, 00822 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16}, 00823 00824 /* value table */ 00825 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1, 00826 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2, 00827 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4, 00828 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1, 00829 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1, 00830 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1, 00831 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1, 00832 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1, 00833 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2, 00834 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1, 00835 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1, 00836 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1, 00837 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1, 00838 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5, 00839 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12, 00840 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3} 00841 },{ 00842 /* MapTab4 */ 00843 0, /* eob_sym */ 00844 34, /* esc_sym */ 00845 /* run table */ 00846 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5, 00847 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1, 00848 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1, 00849 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4, 00850 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1, 00851 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00852 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12, 00853 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 00854 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1, 00855 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5, 00856 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1, 00857 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1, 00858 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1, 00859 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1, 00860 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8, 00861 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1}, 00862 00863 /* value table */ 00864 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1, 00865 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9, 00866 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13, 00867 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2, 00868 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23, 00869 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29, 00870 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1, 00871 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39, 00872 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47, 00873 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3, 00874 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63, 00875 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67, 00876 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70, 00877 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79, 00878 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2, 00879 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89} 00880 },{ 00881 /* MapTab5 */ 00882 2, /* eob_sym */ 00883 33, /* esc_sym */ 00884 /* run table */ 00885 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1, 00886 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1, 00887 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1, 00888 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2, 00889 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3, 00890 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2, 00891 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4, 00892 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1, 00893 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2, 00894 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13, 00895 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31, 00896 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2, 00897 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8, 00898 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1, 00899 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4, 00900 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7}, 00901 00902 /* value table */ 00903 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4, 00904 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6, 00905 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8, 00906 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5, 00907 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4, 00908 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7, 00909 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4, 00910 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18, 00911 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9, 00912 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2, 00913 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1, 00914 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11, 00915 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4, 00916 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29, 00917 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7, 00918 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5} 00919 },{ 00920 /* MapTab6 */ 00921 2, /* eob_sym */ 00922 13, /* esc_sym */ 00923 /* run table */ 00924 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2, 00925 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1, 00926 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9, 00927 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2, 00928 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1, 00929 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7, 00930 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1, 00931 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1, 00932 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1, 00933 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1, 00934 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2, 00935 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1, 00936 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1, 00937 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6, 00938 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25, 00939 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2}, 00940 00941 /* value table */ 00942 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2, 00943 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8, 00944 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1, 00945 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5, 00946 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18, 00947 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2, 00948 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25, 00949 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29, 00950 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33, 00951 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37, 00952 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11, 00953 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44, 00954 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48, 00955 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4, 00956 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1, 00957 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14} 00958 },{ 00959 /* MapTab7 */ 00960 2, /* eob_sym */ 00961 38, /* esc_sym */ 00962 /* run table */ 00963 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6, 00964 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1, 00965 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5, 00966 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7, 00967 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20, 00968 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23, 00969 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7, 00970 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2, 00971 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30, 00972 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14, 00973 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9, 00974 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5, 00975 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6, 00976 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1, 00977 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45, 00978 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49}, 00979 00980 /* value table */ 00981 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1, 00982 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5, 00983 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2, 00984 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2, 00985 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1, 00986 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1, 00987 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3, 00988 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7, 00989 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1, 00990 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2, 00991 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3, 00992 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5, 00993 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5, 00994 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21, 00995 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1, 00996 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1} 00997 },{ 00998 /* MapTab8 */ 00999 4, /* eob_sym */ 01000 11, /* esc_sym */ 01001 /* run table */ 01002 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2, 01003 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1, 01004 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9, 01005 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4, 01006 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8, 01007 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4, 01008 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21, 01009 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1, 01010 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2, 01011 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30, 01012 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1, 01013 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41, 01014 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42, 01015 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15, 01016 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7, 01017 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1}, 01018 01019 /* value table */ 01020 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2, 01021 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7, 01022 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1, 01023 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3, 01024 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2, 01025 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4, 01026 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1, 01027 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17, 01028 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9, 01029 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1, 01030 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20, 01031 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1, 01032 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1, 01033 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2, 01034 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5, 01035 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26} 01036 } 01037 };