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